From c616a96f53ec074cad1c92f65c131883c41edb0e Mon Sep 17 00:00:00 2001 From: miteruzo Date: Mon, 8 Jul 2024 03:32:47 +0900 Subject: [PATCH] =?UTF-8?q?=E3=81=AF=E3=81=98=E3=81=BE=E3=82=8A=E3=81=AE?= =?UTF-8?q?=E5=A4=A7=E5=9C=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 23 + .htaccess | 45 + bin/.htaccess | 7 + bin/dwpage.php | 359 + bin/gittool.php | 346 + bin/indexer.php | 113 + bin/plugin.php | 110 + bin/render.php | 66 + bin/striplangs.php | 116 + bin/wantedpages.php | 188 + conf/.htaccess | 8 + conf/acl.auth.php | 9 + conf/acl.auth.php.dist | 21 + conf/acronyms.conf | 62 + conf/dokuwiki.php | 181 + conf/entities.conf | 22 + conf/interwiki.conf | 43 + conf/license.php | 38 + conf/local.php.bak.php | 21 + conf/local.php.dist | 16 + conf/manifest.json | 3 + conf/mediameta.php | 91 + conf/mime.conf | 75 + conf/mysql.conf.php.example | 253 + conf/plugins.local.php | 12 + conf/plugins.php | 6 + conf/plugins.required.php | 12 + conf/scheme.conf | 11 + conf/smileys.conf | 28 + conf/users.auth.php.dist | 10 + conf/wordblock.conf | 29 + doku.php | 136 + feed.php | 75 + inc/.htaccess | 8 + inc/Action/AbstractAclAction.php | 26 + inc/Action/AbstractAction.php | 93 + inc/Action/AbstractAliasAction.php | 32 + inc/Action/AbstractUserAction.php | 25 + inc/Action/Admin.php | 45 + inc/Action/Authtoken.php | 34 + inc/Action/Backlink.php | 28 + inc/Action/Cancel.php | 28 + inc/Action/Check.php | 27 + inc/Action/Conflict.php | 39 + inc/Action/Denied.php | 52 + inc/Action/Diff.php | 41 + inc/Action/Draft.php | 43 + inc/Action/Draftdel.php | 40 + inc/Action/Edit.php | 96 + inc/Action/Exception/ActionAbort.php | 20 + .../Exception/ActionAclRequiredException.php | 17 + .../Exception/ActionDisabledException.php | 17 + inc/Action/Exception/ActionException.php | 69 + .../Exception/ActionUserRequiredException.php | 17 + inc/Action/Exception/FatalException.php | 28 + inc/Action/Exception/NoActionException.php | 15 + inc/Action/Export.php | 114 + inc/Action/Index.php | 28 + inc/Action/Locked.php | 57 + inc/Action/Login.php | 39 + inc/Action/Logout.php | 55 + inc/Action/Media.php | 25 + inc/Action/Plugin.php | 36 + inc/Action/Preview.php | 49 + inc/Action/Profile.php | 51 + inc/Action/ProfileDelete.php | 45 + inc/Action/Recent.php | 44 + inc/Action/Recover.php | 24 + inc/Action/Redirect.php | 64 + inc/Action/Register.php | 51 + inc/Action/Resendpwd.php | 182 + inc/Action/Revert.php | 61 + inc/Action/Revisions.php | 29 + inc/Action/Save.php | 65 + inc/Action/Search.php | 136 + inc/Action/Show.php | 42 + inc/Action/Sitemap.php | 68 + inc/Action/Source.php | 41 + inc/Action/Subscribe.php | 181 + inc/ActionRouter.php | 235 + inc/Ajax.php | 447 + inc/Cache/Cache.php | 240 + inc/Cache/CacheImageMod.php | 54 + inc/Cache/CacheInstructions.php | 45 + inc/Cache/CacheParser.php | 63 + inc/Cache/CacheRenderer.php | 92 + inc/ChangeLog/ChangeLog.php | 700 + inc/ChangeLog/ChangeLogTrait.php | 262 + inc/ChangeLog/MediaChangeLog.php | 68 + inc/ChangeLog/PageChangeLog.php | 68 + inc/ChangeLog/RevisionInfo.php | 395 + inc/Debug/DebugHelper.php | 178 + inc/Debug/PropertyDeprecationHelper.php | 133 + inc/DifferenceEngine.php | 1568 + inc/Draft.php | 168 + inc/ErrorHandler.php | 205 + inc/Exception/FatalException.php | 10 + inc/Extension/ActionPlugin.php | 21 + inc/Extension/AdminPlugin.php | 121 + inc/Extension/AuthPlugin.php | 459 + inc/Extension/CLIPlugin.php | 15 + inc/Extension/Event.php | 202 + inc/Extension/EventHandler.php | 119 + inc/Extension/Plugin.php | 13 + inc/Extension/PluginController.php | 415 + inc/Extension/PluginInterface.php | 159 + inc/Extension/PluginTrait.php | 280 + inc/Extension/RemotePlugin.php | 79 + inc/Extension/SyntaxPlugin.php | 131 + inc/Feed/FeedCreator.php | 232 + inc/Feed/FeedCreatorOptions.php | 161 + inc/Feed/FeedItemProcessor.php | 172 + inc/Feed/FeedMediaProcessor.php | 189 + inc/Feed/FeedPageProcessor.php | 215 + inc/FeedParser.php | 32 + inc/FeedParserFile.php | 58 + inc/File/MediaFile.php | 174 + inc/File/MediaResolver.php | 15 + inc/File/PageFile.php | 330 + inc/File/PageResolver.php | 97 + inc/File/Resolver.php | 105 + inc/Form/ButtonElement.php | 36 + inc/Form/CheckableElement.php | 82 + inc/Form/DropdownElement.php | 199 + inc/Form/Element.php | 160 + inc/Form/FieldsetCloseElement.php | 33 + inc/Form/FieldsetOpenElement.php | 39 + inc/Form/Form.php | 499 + inc/Form/HTMLElement.php | 31 + inc/Form/InputElement.php | 170 + inc/Form/LabelElement.php | 30 + inc/Form/LegacyForm.php | 182 + inc/Form/OptGroup.php | 122 + inc/Form/TagCloseElement.php | 94 + inc/Form/TagElement.php | 32 + inc/Form/TagOpenElement.php | 33 + inc/Form/TextareaElement.php | 54 + inc/Form/ValueElement.php | 46 + inc/HTTP/DokuHTTPClient.php | 79 + inc/HTTP/HTTPClient.php | 906 + inc/HTTP/HTTPClientException.php | 9 + inc/HTTP/Headers.php | 39 + inc/Info.php | 52 + inc/Input/Get.php | 29 + inc/Input/Input.php | 286 + inc/Input/Post.php | 29 + inc/Input/Server.php | 17 + inc/JWT.php | 184 + inc/JpegMeta.php | 3266 ++ inc/Logger.php | 235 + inc/Mailer.class.php | 797 + inc/Manifest.php | 83 + inc/Menu/AbstractMenu.php | 96 + inc/Menu/DetailMenu.php | 16 + inc/Menu/Item/AbstractItem.php | 264 + inc/Menu/Item/Admin.php | 28 + inc/Menu/Item/Back.php | 29 + inc/Menu/Item/Backlink.php | 18 + inc/Menu/Item/Edit.php | 67 + inc/Menu/Item/ImgBackto.php | 24 + inc/Menu/Item/Index.php | 27 + inc/Menu/Item/Login.php | 29 + inc/Menu/Item/Media.php | 21 + inc/Menu/Item/MediaManager.php | 28 + inc/Menu/Item/Profile.php | 24 + inc/Menu/Item/Recent.php | 20 + inc/Menu/Item/Register.php | 24 + inc/Menu/Item/Resendpwd.php | 24 + inc/Menu/Item/Revert.php | 27 + inc/Menu/Item/Revisions.php | 21 + inc/Menu/Item/Subscribe.php | 24 + inc/Menu/Item/Top.php | 37 + inc/Menu/MenuInterface.php | 20 + inc/Menu/MobileMenu.php | 95 + inc/Menu/PageMenu.php | 15 + inc/Menu/SiteMenu.php | 15 + inc/Menu/UserMenu.php | 15 + inc/Parsing/Handler/AbstractRewriter.php | 39 + inc/Parsing/Handler/Block.php | 201 + inc/Parsing/Handler/CallWriter.php | 39 + inc/Parsing/Handler/CallWriterInterface.php | 30 + inc/Parsing/Handler/Lists.php | 186 + inc/Parsing/Handler/Nest.php | 80 + inc/Parsing/Handler/Preformatted.php | 48 + inc/Parsing/Handler/Quote.php | 86 + inc/Parsing/Handler/ReWriterInterface.php | 37 + inc/Parsing/Handler/Table.php | 320 + inc/Parsing/Lexer/Lexer.php | 349 + inc/Parsing/Lexer/ParallelRegex.php | 201 + inc/Parsing/Lexer/StateStack.php | 61 + inc/Parsing/Parser.php | 131 + inc/Parsing/ParserMode/AbstractMode.php | 42 + inc/Parsing/ParserMode/Acronym.php | 68 + inc/Parsing/ParserMode/Base.php | 30 + inc/Parsing/ParserMode/Camelcaselink.php | 22 + inc/Parsing/ParserMode/Code.php | 24 + inc/Parsing/ParserMode/Emaillink.php | 19 + inc/Parsing/ParserMode/Entity.php | 49 + inc/Parsing/ParserMode/Eol.php | 24 + inc/Parsing/ParserMode/Externallink.php | 54 + inc/Parsing/ParserMode/File.php | 24 + inc/Parsing/ParserMode/Filelink.php | 37 + inc/Parsing/ParserMode/Footnote.php | 49 + inc/Parsing/ParserMode/Formatting.php | 110 + inc/Parsing/ParserMode/Header.php | 23 + inc/Parsing/ParserMode/Hr.php | 18 + inc/Parsing/ParserMode/Internallink.php | 19 + inc/Parsing/ParserMode/Linebreak.php | 18 + inc/Parsing/ParserMode/Listblock.php | 43 + inc/Parsing/ParserMode/Media.php | 19 + inc/Parsing/ParserMode/ModeInterface.php | 46 + inc/Parsing/ParserMode/Multiplyentity.php | 26 + inc/Parsing/ParserMode/Nocache.php | 18 + inc/Parsing/ParserMode/Notoc.php | 18 + inc/Parsing/ParserMode/Plugin.php | 14 + inc/Parsing/ParserMode/Preformatted.php | 30 + inc/Parsing/ParserMode/Quote.php | 40 + inc/Parsing/ParserMode/Quotes.php | 50 + inc/Parsing/ParserMode/Rss.php | 18 + inc/Parsing/ParserMode/Smiley.php | 48 + inc/Parsing/ParserMode/Table.php | 46 + inc/Parsing/ParserMode/Unformatted.php | 27 + inc/Parsing/ParserMode/Windowssharelink.php | 30 + inc/Parsing/ParserMode/Wordblock.php | 52 + inc/PassHash.php | 867 + inc/Remote/AccessDeniedException.php | 10 + inc/Remote/Api.php | 180 + inc/Remote/ApiCall.php | 179 + inc/Remote/ApiCore.php | 1001 + inc/Remote/IXR/Client.php | 86 + inc/Remote/JsonRpcServer.php | 188 + inc/Remote/LegacyApiCore.php | 558 + inc/Remote/OpenApiDoc/ClassResolver.php | 186 + inc/Remote/OpenApiDoc/DocBlock.php | 111 + inc/Remote/OpenApiDoc/DocBlockClass.php | 70 + inc/Remote/OpenApiDoc/DocBlockMethod.php | 112 + inc/Remote/OpenApiDoc/DocBlockProperty.php | 50 + inc/Remote/OpenApiDoc/OpenAPIGenerator.php | 382 + inc/Remote/OpenApiDoc/Type.php | 149 + inc/Remote/RemoteException.php | 10 + inc/Remote/Response/ApiResponse.php | 21 + inc/Remote/Response/Link.php | 31 + inc/Remote/Response/Media.php | 87 + inc/Remote/Response/MediaChange.php | 52 + inc/Remote/Response/Page.php | 107 + inc/Remote/Response/PageChange.php | 52 + inc/Remote/Response/PageHit.php | 37 + inc/Remote/Response/User.php | 71 + inc/Remote/XmlRpcServer.php | 70 + inc/SafeFN.class.php | 169 + inc/Search/Indexer.php | 1247 + inc/Sitemap/Item.php | 70 + inc/Sitemap/Mapper.php | 175 + inc/StyleUtils.php | 193 + inc/Subscriptions/BulkSubscriptionSender.php | 259 + inc/Subscriptions/MediaSubscriptionSender.php | 44 + inc/Subscriptions/PageSubscriptionSender.php | 84 + .../RegistrationSubscriptionSender.php | 39 + inc/Subscriptions/SubscriberManager.php | 299 + inc/Subscriptions/SubscriberRegexBuilder.php | 70 + inc/Subscriptions/SubscriptionSender.php | 86 + inc/TaskRunner.php | 248 + inc/Ui/Admin.php | 178 + inc/Ui/Backlinks.php | 42 + inc/Ui/Diff.php | 129 + inc/Ui/Editor.php | 210 + inc/Ui/Index.php | 130 + inc/Ui/Login.php | 83 + inc/Ui/Media/Display.php | 126 + inc/Ui/Media/DisplayRow.php | 91 + inc/Ui/Media/DisplayTile.php | 54 + inc/Ui/MediaDiff.php | 326 + inc/Ui/MediaRevisions.php | 121 + inc/Ui/PageConflict.php | 62 + inc/Ui/PageDiff.php | 559 + inc/Ui/PageDraft.php | 54 + inc/Ui/PageRevisions.php | 116 + inc/Ui/PageView.php | 84 + inc/Ui/Recent.php | 229 + inc/Ui/Revisions.php | 113 + inc/Ui/Search.php | 625 + inc/Ui/SearchState.php | 141 + inc/Ui/Subscribe.php | 116 + inc/Ui/Ui.php | 20 + inc/Ui/UserProfile.php | 185 + inc/Ui/UserRegister.php | 73 + inc/Ui/UserResendPwd.php | 99 + inc/Utf8/Asian.php | 98 + inc/Utf8/Clean.php | 203 + inc/Utf8/Conversion.php | 158 + inc/Utf8/PhpString.php | 373 + inc/Utf8/Sort.php | 180 + inc/Utf8/Table.php | 92 + inc/Utf8/Unicode.php | 246 + inc/Utf8/tables/case.php | 661 + inc/Utf8/tables/loweraccents.php | 119 + inc/Utf8/tables/romanization.php | 1479 + inc/Utf8/tables/specials.php | 617 + inc/Utf8/tables/upperaccents.php | 116 + inc/actions.php | 72 + inc/auth.php | 1401 + inc/cache.php | 58 + inc/changelog.php | 372 + inc/common.php | 2038 + inc/compatibility.php | 135 + inc/config_cascade.php | 89 + inc/confutils.php | 502 + inc/defines.php | 80 + inc/deprecated.php | 740 + inc/farm.php | 158 + inc/fetch.functions.php | 208 + inc/form.php | 1147 + inc/fulltext.php | 1000 + inc/html.php | 1069 + inc/httputils.php | 349 + inc/indexer.php | 382 + inc/infoutils.php | 592 + inc/init.php | 663 + inc/io.php | 834 + inc/lang/af/jquery.ui.datepicker.js | 40 + inc/lang/af/lang.php | 68 + inc/lang/ar/admin.txt | 3 + inc/lang/ar/adminplugins.txt | 1 + inc/lang/ar/backlinks.txt | 3 + inc/lang/ar/conflict.txt | 5 + inc/lang/ar/denied.txt | 3 + inc/lang/ar/diff.txt | 3 + inc/lang/ar/draft.txt | 5 + inc/lang/ar/edit.txt | 1 + inc/lang/ar/editrev.txt | 2 + inc/lang/ar/index.txt | 3 + inc/lang/ar/install.html | 7 + inc/lang/ar/jquery.ui.datepicker.js | 42 + inc/lang/ar/lang.php | 381 + inc/lang/ar/locked.txt | 3 + inc/lang/ar/login.txt | 3 + inc/lang/ar/mailtext.txt | 12 + inc/lang/ar/mailwrap.html | 13 + inc/lang/ar/newpage.txt | 3 + inc/lang/ar/norev.txt | 3 + inc/lang/ar/onceexisted.txt | 2 + inc/lang/ar/password.txt | 6 + inc/lang/ar/preview.txt | 3 + inc/lang/ar/pwconfirm.txt | 9 + inc/lang/ar/read.txt | 1 + inc/lang/ar/recent.txt | 3 + inc/lang/ar/register.txt | 3 + inc/lang/ar/registermail.txt | 10 + inc/lang/ar/resendpwd.txt | 3 + inc/lang/ar/resetpwd.txt | 3 + inc/lang/ar/revisions.txt | 3 + inc/lang/ar/searchpage.txt | 3 + inc/lang/ar/showrev.txt | 2 + inc/lang/ar/stopwords.txt | 192 + inc/lang/ar/subscr_digest.txt | 16 + inc/lang/ar/subscr_form.txt | 3 + inc/lang/ar/subscr_list.txt | 13 + inc/lang/ar/subscr_single.txt | 19 + inc/lang/ar/updateprofile.txt | 3 + inc/lang/ar/uploadmail.txt | 10 + inc/lang/az/admin.txt | 3 + inc/lang/az/adminplugins.txt | 1 + inc/lang/az/backlinks.txt | 3 + inc/lang/az/conflict.txt | 5 + inc/lang/az/denied.txt | 3 + inc/lang/az/diff.txt | 3 + inc/lang/az/draft.txt | 5 + inc/lang/az/edit.txt | 1 + inc/lang/az/editrev.txt | 2 + inc/lang/az/index.txt | 3 + inc/lang/az/install.html | 7 + inc/lang/az/jquery.ui.datepicker.js | 40 + inc/lang/az/lang.php | 231 + inc/lang/az/locked.txt | 3 + inc/lang/az/login.txt | 3 + inc/lang/az/mailtext.txt | 12 + inc/lang/az/newpage.txt | 3 + inc/lang/az/norev.txt | 3 + inc/lang/az/password.txt | 6 + inc/lang/az/preview.txt | 3 + inc/lang/az/pwconfirm.txt | 9 + inc/lang/az/read.txt | 1 + inc/lang/az/recent.txt | 3 + inc/lang/az/register.txt | 3 + inc/lang/az/registermail.txt | 10 + inc/lang/az/resendpwd.txt | 3 + inc/lang/az/revisions.txt | 3 + inc/lang/az/searchpage.txt | 3 + inc/lang/az/showrev.txt | 2 + inc/lang/az/stopwords.txt | 65 + inc/lang/az/updateprofile.txt | 3 + inc/lang/az/uploadmail.txt | 10 + inc/lang/be/admin.txt | 3 + inc/lang/be/adminplugins.txt | 1 + inc/lang/be/backlinks.txt | 3 + inc/lang/be/conflict.txt | 5 + inc/lang/be/denied.txt | 3 + inc/lang/be/diff.txt | 3 + inc/lang/be/draft.txt | 5 + inc/lang/be/edit.txt | 1 + inc/lang/be/editrev.txt | 2 + inc/lang/be/index.txt | 3 + inc/lang/be/install.html | 7 + inc/lang/be/jquery.ui.datepicker.js | 40 + inc/lang/be/lang.php | 357 + inc/lang/be/locked.txt | 3 + inc/lang/be/login.txt | 3 + inc/lang/be/mailtext.txt | 12 + inc/lang/be/newpage.txt | 3 + inc/lang/be/norev.txt | 3 + inc/lang/be/password.txt | 6 + inc/lang/be/preview.txt | 3 + inc/lang/be/pwconfirm.txt | 9 + inc/lang/be/read.txt | 1 + inc/lang/be/recent.txt | 3 + inc/lang/be/register.txt | 3 + inc/lang/be/registermail.txt | 10 + inc/lang/be/resendpwd.txt | 3 + inc/lang/be/resetpwd.txt | 3 + inc/lang/be/revisions.txt | 3 + inc/lang/be/searchpage.txt | 3 + inc/lang/be/showrev.txt | 2 + inc/lang/be/stopwords.txt | 80 + inc/lang/be/subscr_digest.txt | 12 + inc/lang/be/subscr_form.txt | 3 + inc/lang/be/subscr_list.txt | 9 + inc/lang/be/subscr_single.txt | 16 + inc/lang/be/updateprofile.txt | 3 + inc/lang/be/uploadmail.txt | 11 + inc/lang/bg/admin.txt | 3 + inc/lang/bg/adminplugins.txt | 1 + inc/lang/bg/backlinks.txt | 3 + inc/lang/bg/conflict.txt | 5 + inc/lang/bg/denied.txt | 3 + inc/lang/bg/diff.txt | 3 + inc/lang/bg/draft.txt | 5 + inc/lang/bg/edit.txt | 1 + inc/lang/bg/editrev.txt | 2 + inc/lang/bg/index.txt | 3 + inc/lang/bg/install.html | 7 + inc/lang/bg/jquery.ui.datepicker.js | 41 + inc/lang/bg/lang.php | 349 + inc/lang/bg/locked.txt | 3 + inc/lang/bg/login.txt | 3 + inc/lang/bg/mailtext.txt | 12 + inc/lang/bg/mailwrap.html | 13 + inc/lang/bg/newpage.txt | 3 + inc/lang/bg/norev.txt | 3 + inc/lang/bg/onceexisted.txt | 1 + inc/lang/bg/password.txt | 6 + inc/lang/bg/preview.txt | 3 + inc/lang/bg/pwconfirm.txt | 9 + inc/lang/bg/read.txt | 1 + inc/lang/bg/recent.txt | 3 + inc/lang/bg/register.txt | 3 + inc/lang/bg/registermail.txt | 10 + inc/lang/bg/resendpwd.txt | 3 + inc/lang/bg/resetpwd.txt | 3 + inc/lang/bg/revisions.txt | 3 + inc/lang/bg/searchpage.txt | 3 + inc/lang/bg/showrev.txt | 2 + inc/lang/bg/stopwords.txt | 29 + inc/lang/bg/subscr_digest.txt | 15 + inc/lang/bg/subscr_form.txt | 3 + inc/lang/bg/subscr_list.txt | 12 + inc/lang/bg/subscr_single.txt | 18 + inc/lang/bg/updateprofile.txt | 3 + inc/lang/bg/uploadmail.txt | 10 + inc/lang/bn/admin.txt | 3 + inc/lang/bn/adminplugins.txt | 1 + inc/lang/bn/backlinks.txt | 3 + inc/lang/bn/conflict.txt | 5 + inc/lang/bn/denied.txt | 3 + inc/lang/bn/diff.txt | 3 + inc/lang/bn/draft.txt | 5 + inc/lang/bn/edit.txt | 1 + inc/lang/bn/editrev.txt | 2 + inc/lang/bn/index.txt | 3 + inc/lang/bn/lang.php | 228 + inc/lang/ca-valencia/admin.txt | 3 + inc/lang/ca-valencia/adminplugins.txt | 1 + inc/lang/ca-valencia/backlinks.txt | 3 + inc/lang/ca-valencia/conflict.txt | 5 + inc/lang/ca-valencia/denied.txt | 3 + inc/lang/ca-valencia/diff.txt | 3 + inc/lang/ca-valencia/draft.txt | 5 + inc/lang/ca-valencia/edit.txt | 1 + inc/lang/ca-valencia/editrev.txt | 2 + inc/lang/ca-valencia/index.txt | 3 + inc/lang/ca-valencia/install.html | 7 + inc/lang/ca-valencia/lang.php | 223 + inc/lang/ca-valencia/locked.txt | 3 + inc/lang/ca-valencia/login.txt | 3 + inc/lang/ca-valencia/mailtext.txt | 12 + inc/lang/ca-valencia/newpage.txt | 3 + inc/lang/ca-valencia/norev.txt | 3 + inc/lang/ca-valencia/password.txt | 6 + inc/lang/ca-valencia/preview.txt | 3 + inc/lang/ca-valencia/pwconfirm.txt | 9 + inc/lang/ca-valencia/read.txt | 1 + inc/lang/ca-valencia/recent.txt | 3 + inc/lang/ca-valencia/register.txt | 3 + inc/lang/ca-valencia/registermail.txt | 10 + inc/lang/ca-valencia/resendpwd.txt | 3 + inc/lang/ca-valencia/revisions.txt | 3 + inc/lang/ca-valencia/searchpage.txt | 3 + inc/lang/ca-valencia/showrev.txt | 2 + inc/lang/ca-valencia/stopwords.txt | 74 + inc/lang/ca-valencia/updateprofile.txt | 3 + inc/lang/ca-valencia/uploadmail.txt | 10 + inc/lang/ca/admin.txt | 3 + inc/lang/ca/adminplugins.txt | 1 + inc/lang/ca/backlinks.txt | 3 + inc/lang/ca/conflict.txt | 5 + inc/lang/ca/denied.txt | 3 + inc/lang/ca/diff.txt | 3 + inc/lang/ca/draft.txt | 5 + inc/lang/ca/edit.txt | 1 + inc/lang/ca/editrev.txt | 2 + inc/lang/ca/index.txt | 3 + inc/lang/ca/install.html | 7 + inc/lang/ca/jquery.ui.datepicker.js | 40 + inc/lang/ca/lang.php | 373 + inc/lang/ca/locked.txt | 3 + inc/lang/ca/login.txt | 3 + inc/lang/ca/mailtext.txt | 11 + inc/lang/ca/mailwrap.html | 13 + inc/lang/ca/newpage.txt | 3 + inc/lang/ca/norev.txt | 3 + inc/lang/ca/onceexisted.txt | 3 + inc/lang/ca/password.txt | 6 + inc/lang/ca/preview.txt | 3 + inc/lang/ca/pwconfirm.txt | 9 + inc/lang/ca/read.txt | 1 + inc/lang/ca/recent.txt | 3 + inc/lang/ca/register.txt | 3 + inc/lang/ca/registermail.txt | 10 + inc/lang/ca/resendpwd.txt | 3 + inc/lang/ca/resetpwd.txt | 3 + inc/lang/ca/revisions.txt | 3 + inc/lang/ca/searchpage.txt | 3 + inc/lang/ca/showrev.txt | 2 + inc/lang/ca/stopwords.txt | 107 + inc/lang/ca/subscr_digest.txt | 16 + inc/lang/ca/subscr_form.txt | 3 + inc/lang/ca/subscr_list.txt | 16 + inc/lang/ca/subscr_single.txt | 16 + inc/lang/ca/updateprofile.txt | 3 + inc/lang/ca/uploadmail.txt | 10 + inc/lang/ckb/admin.txt | 3 + inc/lang/ckb/adminplugins.txt | 1 + inc/lang/ckb/backlinks.txt | 3 + inc/lang/ckb/conflict.txt | 4 + inc/lang/ckb/denied.txt | 2 + inc/lang/ckb/diff.txt | 3 + inc/lang/ckb/draft.txt | 4 + inc/lang/ckb/edit.txt | 1 + inc/lang/ckb/editrev.txt | 1 + inc/lang/ckb/index.txt | 3 + inc/lang/ckb/lang.php | 364 + inc/lang/ckb/locked.txt | 2 + inc/lang/ckb/login.txt | 2 + inc/lang/ckb/mailtext.txt | 15 + inc/lang/ckb/newpage.txt | 2 + inc/lang/ckb/norev.txt | 2 + inc/lang/ckb/onceexisted.txt | 2 + inc/lang/ckb/password.txt | 6 + inc/lang/ckb/preview.txt | 3 + inc/lang/ckb/pwconfirm.txt | 9 + inc/lang/ckb/read.txt | 1 + inc/lang/ckb/recent.txt | 3 + inc/lang/ckb/register.txt | 2 + inc/lang/ckb/registermail.txt | 10 + inc/lang/ckb/resendpwd.txt | 2 + inc/lang/ckb/resetpwd.txt | 2 + inc/lang/ckb/revisions.txt | 2 + inc/lang/ckb/searchpage.txt | 2 + inc/lang/ckb/showrev.txt | 2 + inc/lang/ckb/stopwords.txt | 39 + inc/lang/ckb/subscr_digest.txt | 16 + inc/lang/ckb/subscr_form.txt | 2 + inc/lang/ckb/subscr_list.txt | 13 + inc/lang/ckb/subscr_single.txt | 19 + inc/lang/ckb/updateprofile.txt | 2 + inc/lang/ckb/uploadmail.txt | 11 + inc/lang/cs/admin.txt | 3 + inc/lang/cs/adminplugins.txt | 1 + inc/lang/cs/backlinks.txt | 3 + inc/lang/cs/conflict.txt | 5 + inc/lang/cs/denied.txt | 3 + inc/lang/cs/diff.txt | 3 + inc/lang/cs/draft.txt | 5 + inc/lang/cs/edit.txt | 1 + inc/lang/cs/editrev.txt | 2 + inc/lang/cs/index.txt | 3 + inc/lang/cs/install.html | 7 + inc/lang/cs/jquery.ui.datepicker.js | 40 + inc/lang/cs/lang.php | 389 + inc/lang/cs/locked.txt | 3 + inc/lang/cs/login.txt | 3 + inc/lang/cs/mailtext.txt | 12 + inc/lang/cs/mailwrap.html | 13 + inc/lang/cs/newpage.txt | 3 + inc/lang/cs/norev.txt | 3 + inc/lang/cs/onceexisted.txt | 3 + inc/lang/cs/password.txt | 7 + inc/lang/cs/preview.txt | 3 + inc/lang/cs/pwconfirm.txt | 9 + inc/lang/cs/read.txt | 1 + inc/lang/cs/recent.txt | 3 + inc/lang/cs/register.txt | 3 + inc/lang/cs/registermail.txt | 10 + inc/lang/cs/resendpwd.txt | 3 + inc/lang/cs/resetpwd.txt | 3 + inc/lang/cs/revisions.txt | 3 + inc/lang/cs/searchpage.txt | 3 + inc/lang/cs/showrev.txt | 2 + inc/lang/cs/stopwords.txt | 945 + inc/lang/cs/subscr_digest.txt | 18 + inc/lang/cs/subscr_form.txt | 3 + inc/lang/cs/subscr_list.txt | 15 + inc/lang/cs/subscr_single.txt | 21 + inc/lang/cs/updateprofile.txt | 3 + inc/lang/cs/uploadmail.txt | 10 + inc/lang/cy/admin.txt | 3 + inc/lang/cy/adminplugins.txt | 2 + inc/lang/cy/backlinks.txt | 3 + inc/lang/cy/conflict.txt | 5 + inc/lang/cy/denied.txt | 3 + inc/lang/cy/diff.txt | 3 + inc/lang/cy/draft.txt | 5 + inc/lang/cy/edit.txt | 1 + inc/lang/cy/editrev.txt | 2 + inc/lang/cy/index.txt | 3 + inc/lang/cy/install.html | 7 + inc/lang/cy/jquery.ui.datepicker.js | 48 + inc/lang/cy/lang.php | 372 + inc/lang/cy/locked.txt | 3 + inc/lang/cy/login.txt | 3 + inc/lang/cy/mailtext.txt | 17 + inc/lang/cy/mailwrap.html | 13 + inc/lang/cy/newpage.txt | 3 + inc/lang/cy/norev.txt | 3 + inc/lang/cy/password.txt | 10 + inc/lang/cy/preview.txt | 3 + inc/lang/cy/pwconfirm.txt | 9 + inc/lang/cy/read.txt | 1 + inc/lang/cy/recent.txt | 3 + inc/lang/cy/register.txt | 3 + inc/lang/cy/registermail.txt | 14 + inc/lang/cy/resendpwd.txt | 3 + inc/lang/cy/resetpwd.txt | 3 + inc/lang/cy/revisions.txt | 3 + inc/lang/cy/searchpage.txt | 3 + inc/lang/cy/showrev.txt | 2 + inc/lang/cy/stopwords.txt | 31 + inc/lang/cy/subscr_digest.txt | 20 + inc/lang/cy/subscr_form.txt | 3 + inc/lang/cy/subscr_list.txt | 17 + inc/lang/cy/subscr_single.txt | 23 + inc/lang/cy/updateprofile.txt | 3 + inc/lang/cy/uploadmail.txt | 15 + inc/lang/da/admin.txt | 3 + inc/lang/da/adminplugins.txt | 1 + inc/lang/da/backlinks.txt | 3 + inc/lang/da/conflict.txt | 5 + inc/lang/da/denied.txt | 3 + inc/lang/da/diff.txt | 3 + inc/lang/da/draft.txt | 5 + inc/lang/da/edit.txt | 1 + inc/lang/da/editrev.txt | 2 + inc/lang/da/index.txt | 3 + inc/lang/da/install.html | 7 + inc/lang/da/jquery.ui.datepicker.js | 40 + inc/lang/da/lang.php | 377 + inc/lang/da/locked.txt | 3 + inc/lang/da/login.txt | 3 + inc/lang/da/mailtext.txt | 12 + inc/lang/da/mailwrap.html | 13 + inc/lang/da/newpage.txt | 3 + inc/lang/da/norev.txt | 3 + inc/lang/da/onceexisted.txt | 3 + inc/lang/da/password.txt | 6 + inc/lang/da/preview.txt | 3 + inc/lang/da/pwconfirm.txt | 9 + inc/lang/da/read.txt | 1 + inc/lang/da/recent.txt | 3 + inc/lang/da/register.txt | 3 + inc/lang/da/registermail.txt | 10 + inc/lang/da/resendpwd.txt | 3 + inc/lang/da/resetpwd.txt | 3 + inc/lang/da/revisions.txt | 3 + inc/lang/da/searchpage.txt | 3 + inc/lang/da/showrev.txt | 2 + inc/lang/da/stopwords.txt | 87 + inc/lang/da/subscr_digest.txt | 14 + inc/lang/da/subscr_form.txt | 3 + inc/lang/da/subscr_list.txt | 13 + inc/lang/da/subscr_single.txt | 17 + inc/lang/da/updateprofile.txt | 3 + inc/lang/da/uploadmail.txt | 11 + inc/lang/de-informal/admin.txt | 3 + inc/lang/de-informal/adminplugins.txt | 1 + inc/lang/de-informal/backlinks.txt | 3 + inc/lang/de-informal/conflict.txt | 5 + inc/lang/de-informal/denied.txt | 3 + inc/lang/de-informal/diff.txt | 3 + inc/lang/de-informal/draft.txt | 5 + inc/lang/de-informal/edit.txt | 1 + inc/lang/de-informal/editrev.txt | 2 + inc/lang/de-informal/index.txt | 3 + inc/lang/de-informal/install.html | 7 + inc/lang/de-informal/jquery.ui.datepicker.js | 40 + inc/lang/de-informal/lang.php | 382 + inc/lang/de-informal/locked.txt | 3 + inc/lang/de-informal/login.txt | 3 + inc/lang/de-informal/mailtext.txt | 12 + inc/lang/de-informal/mailwrap.html | 13 + inc/lang/de-informal/newpage.txt | 3 + inc/lang/de-informal/norev.txt | 3 + inc/lang/de-informal/onceexisted.txt | 3 + inc/lang/de-informal/password.txt | 6 + inc/lang/de-informal/preview.txt | 3 + inc/lang/de-informal/pwconfirm.txt | 9 + inc/lang/de-informal/read.txt | 1 + inc/lang/de-informal/recent.txt | 3 + inc/lang/de-informal/register.txt | 3 + inc/lang/de-informal/registermail.txt | 10 + inc/lang/de-informal/resendpwd.txt | 3 + inc/lang/de-informal/resetpwd.txt | 3 + inc/lang/de-informal/revisions.txt | 3 + inc/lang/de-informal/searchpage.txt | 3 + inc/lang/de-informal/showrev.txt | 2 + inc/lang/de-informal/stopwords.txt | 126 + inc/lang/de-informal/subscr_digest.txt | 16 + inc/lang/de-informal/subscr_form.txt | 3 + inc/lang/de-informal/subscr_list.txt | 13 + inc/lang/de-informal/subscr_single.txt | 19 + inc/lang/de-informal/updateprofile.txt | 3 + inc/lang/de-informal/uploadmail.txt | 11 + inc/lang/de/admin.txt | 3 + inc/lang/de/adminplugins.txt | 1 + inc/lang/de/backlinks.txt | 3 + inc/lang/de/conflict.txt | 5 + inc/lang/de/denied.txt | 3 + inc/lang/de/diff.txt | 3 + inc/lang/de/draft.txt | 5 + inc/lang/de/edit.txt | 1 + inc/lang/de/editrev.txt | 2 + inc/lang/de/index.txt | 3 + inc/lang/de/install.html | 7 + inc/lang/de/jquery.ui.datepicker.js | 40 + inc/lang/de/lang.php | 406 + inc/lang/de/locked.txt | 3 + inc/lang/de/login.txt | 3 + inc/lang/de/mailtext.txt | 12 + inc/lang/de/mailwrap.html | 13 + inc/lang/de/newpage.txt | 3 + inc/lang/de/norev.txt | 3 + inc/lang/de/onceexisted.txt | 3 + inc/lang/de/password.txt | 6 + inc/lang/de/preview.txt | 3 + inc/lang/de/pwconfirm.txt | 9 + inc/lang/de/read.txt | 1 + inc/lang/de/recent.txt | 3 + inc/lang/de/register.txt | 3 + inc/lang/de/registermail.txt | 10 + inc/lang/de/resendpwd.txt | 3 + inc/lang/de/resetpwd.txt | 3 + inc/lang/de/revisions.txt | 3 + inc/lang/de/searchpage.txt | 3 + inc/lang/de/showrev.txt | 2 + inc/lang/de/stopwords.txt | 126 + inc/lang/de/subscr_digest.txt | 16 + inc/lang/de/subscr_form.txt | 3 + inc/lang/de/subscr_list.txt | 13 + inc/lang/de/subscr_single.txt | 19 + inc/lang/de/updateprofile.txt | 3 + inc/lang/de/uploadmail.txt | 11 + inc/lang/el/admin.txt | 3 + inc/lang/el/adminplugins.txt | 1 + inc/lang/el/backlinks.txt | 3 + inc/lang/el/conflict.txt | 5 + inc/lang/el/denied.txt | 3 + inc/lang/el/diff.txt | 3 + inc/lang/el/draft.txt | 5 + inc/lang/el/edit.txt | 1 + inc/lang/el/editrev.txt | 2 + inc/lang/el/index.txt | 3 + inc/lang/el/install.html | 7 + inc/lang/el/jquery.ui.datepicker.js | 40 + inc/lang/el/lang.php | 367 + inc/lang/el/locked.txt | 4 + inc/lang/el/login.txt | 3 + inc/lang/el/mailtext.txt | 13 + inc/lang/el/mailwrap.html | 13 + inc/lang/el/newpage.txt | 3 + inc/lang/el/norev.txt | 3 + inc/lang/el/onceexisted.txt | 2 + inc/lang/el/password.txt | 6 + inc/lang/el/preview.txt | 3 + inc/lang/el/pwconfirm.txt | 9 + inc/lang/el/read.txt | 2 + inc/lang/el/recent.txt | 3 + inc/lang/el/register.txt | 3 + inc/lang/el/registermail.txt | 10 + inc/lang/el/resendpwd.txt | 3 + inc/lang/el/resetpwd.txt | 3 + inc/lang/el/revisions.txt | 8 + inc/lang/el/searchpage.txt | 3 + inc/lang/el/showrev.txt | 2 + inc/lang/el/stopwords.txt | 104 + inc/lang/el/subscr_digest.txt | 16 + inc/lang/el/subscr_form.txt | 3 + inc/lang/el/subscr_list.txt | 16 + inc/lang/el/subscr_single.txt | 18 + inc/lang/el/updateprofile.txt | 3 + inc/lang/el/uploadmail.txt | 11 + inc/lang/en/admin.txt | 3 + inc/lang/en/adminplugins.txt | 2 + inc/lang/en/backlinks.txt | 3 + inc/lang/en/conflict.txt | 5 + inc/lang/en/denied.txt | 3 + inc/lang/en/diff.txt | 3 + inc/lang/en/draft.txt | 5 + inc/lang/en/edit.txt | 1 + inc/lang/en/editrev.txt | 2 + inc/lang/en/index.txt | 3 + inc/lang/en/install.html | 7 + inc/lang/en/lang.php | 405 + inc/lang/en/locked.txt | 3 + inc/lang/en/login.txt | 3 + inc/lang/en/mailtext.txt | 15 + inc/lang/en/mailwrap.html | 13 + inc/lang/en/newpage.txt | 3 + inc/lang/en/norev.txt | 3 + inc/lang/en/onceexisted.txt | 3 + inc/lang/en/password.txt | 6 + inc/lang/en/preview.txt | 3 + inc/lang/en/pwconfirm.txt | 9 + inc/lang/en/read.txt | 1 + inc/lang/en/recent.txt | 3 + inc/lang/en/register.txt | 3 + inc/lang/en/registermail.txt | 10 + inc/lang/en/resendpwd.txt | 3 + inc/lang/en/resetpwd.txt | 3 + inc/lang/en/revisions.txt | 3 + inc/lang/en/searchpage.txt | 3 + inc/lang/en/showrev.txt | 2 + inc/lang/en/stopwords.txt | 39 + inc/lang/en/subscr_digest.txt | 16 + inc/lang/en/subscr_form.txt | 3 + inc/lang/en/subscr_list.txt | 13 + inc/lang/en/subscr_single.txt | 19 + inc/lang/en/updateprofile.txt | 3 + inc/lang/en/uploadmail.txt | 11 + inc/lang/eo/admin.txt | 3 + inc/lang/eo/adminplugins.txt | 1 + inc/lang/eo/backlinks.txt | 3 + inc/lang/eo/conflict.txt | 5 + inc/lang/eo/denied.txt | 3 + inc/lang/eo/diff.txt | 3 + inc/lang/eo/draft.txt | 5 + inc/lang/eo/edit.txt | 1 + inc/lang/eo/editrev.txt | 2 + inc/lang/eo/index.txt | 3 + inc/lang/eo/install.html | 7 + inc/lang/eo/jquery.ui.datepicker.js | 40 + inc/lang/eo/lang.php | 368 + inc/lang/eo/locked.txt | 3 + inc/lang/eo/login.txt | 3 + inc/lang/eo/mailtext.txt | 12 + inc/lang/eo/mailwrap.html | 13 + inc/lang/eo/newpage.txt | 3 + inc/lang/eo/norev.txt | 3 + inc/lang/eo/onceexisted.txt | 3 + inc/lang/eo/password.txt | 6 + inc/lang/eo/preview.txt | 3 + inc/lang/eo/pwconfirm.txt | 9 + inc/lang/eo/read.txt | 1 + inc/lang/eo/recent.txt | 3 + inc/lang/eo/register.txt | 3 + inc/lang/eo/registermail.txt | 10 + inc/lang/eo/resendpwd.txt | 3 + inc/lang/eo/resetpwd.txt | 3 + inc/lang/eo/revisions.txt | 3 + inc/lang/eo/searchpage.txt | 3 + inc/lang/eo/showrev.txt | 2 + inc/lang/eo/stopwords.txt | 20 + inc/lang/eo/subscr_digest.txt | 16 + inc/lang/eo/subscr_form.txt | 3 + inc/lang/eo/subscr_list.txt | 13 + inc/lang/eo/subscr_single.txt | 19 + inc/lang/eo/updateprofile.txt | 3 + inc/lang/eo/uploadmail.txt | 10 + inc/lang/es/admin.txt | 3 + inc/lang/es/adminplugins.txt | 1 + inc/lang/es/backlinks.txt | 3 + inc/lang/es/conflict.txt | 5 + inc/lang/es/denied.txt | 3 + inc/lang/es/diff.txt | 3 + inc/lang/es/draft.txt | 5 + inc/lang/es/edit.txt | 1 + inc/lang/es/editrev.txt | 2 + inc/lang/es/index.txt | 3 + inc/lang/es/install.html | 7 + inc/lang/es/jquery.ui.datepicker.js | 40 + inc/lang/es/lang.php | 408 + inc/lang/es/locked.txt | 3 + inc/lang/es/login.txt | 3 + inc/lang/es/mailtext.txt | 12 + inc/lang/es/mailwrap.html | 13 + inc/lang/es/newpage.txt | 3 + inc/lang/es/norev.txt | 3 + inc/lang/es/onceexisted.txt | 3 + inc/lang/es/password.txt | 6 + inc/lang/es/preview.txt | 3 + inc/lang/es/pwconfirm.txt | 9 + inc/lang/es/read.txt | 1 + inc/lang/es/recent.txt | 3 + inc/lang/es/register.txt | 3 + inc/lang/es/registermail.txt | 10 + inc/lang/es/resendpwd.txt | 3 + inc/lang/es/resetpwd.txt | 3 + inc/lang/es/revisions.txt | 3 + inc/lang/es/searchpage.txt | 3 + inc/lang/es/showrev.txt | 2 + inc/lang/es/stopwords.txt | 172 + inc/lang/es/subscr_digest.txt | 16 + inc/lang/es/subscr_form.txt | 3 + inc/lang/es/subscr_list.txt | 13 + inc/lang/es/subscr_single.txt | 19 + inc/lang/es/updateprofile.txt | 3 + inc/lang/es/uploadmail.txt | 11 + inc/lang/et/admin.txt | 3 + inc/lang/et/adminplugins.txt | 1 + inc/lang/et/backlinks.txt | 3 + inc/lang/et/conflict.txt | 5 + inc/lang/et/denied.txt | 3 + inc/lang/et/diff.txt | 3 + inc/lang/et/draft.txt | 5 + inc/lang/et/edit.txt | 1 + inc/lang/et/editrev.txt | 2 + inc/lang/et/index.txt | 3 + inc/lang/et/jquery.ui.datepicker.js | 48 + inc/lang/et/lang.php | 348 + inc/lang/et/locked.txt | 3 + inc/lang/et/login.txt | 3 + inc/lang/et/mailtext.txt | 12 + inc/lang/et/newpage.txt | 3 + inc/lang/et/norev.txt | 3 + inc/lang/et/password.txt | 6 + inc/lang/et/preview.txt | 3 + inc/lang/et/pwconfirm.txt | 9 + inc/lang/et/read.txt | 1 + inc/lang/et/recent.txt | 3 + inc/lang/et/register.txt | 3 + inc/lang/et/registermail.txt | 10 + inc/lang/et/resendpwd.txt | 3 + inc/lang/et/resetpwd.txt | 3 + inc/lang/et/revisions.txt | 3 + inc/lang/et/searchpage.txt | 3 + inc/lang/et/showrev.txt | 2 + inc/lang/et/stopwords.txt | 15 + inc/lang/et/subscr_digest.txt | 17 + inc/lang/et/subscr_form.txt | 3 + inc/lang/et/subscr_list.txt | 15 + inc/lang/et/subscr_single.txt | 19 + inc/lang/et/updateprofile.txt | 3 + inc/lang/et/uploadmail.txt | 12 + inc/lang/eu/admin.txt | 3 + inc/lang/eu/adminplugins.txt | 1 + inc/lang/eu/backlinks.txt | 3 + inc/lang/eu/conflict.txt | 5 + inc/lang/eu/denied.txt | 3 + inc/lang/eu/diff.txt | 3 + inc/lang/eu/draft.txt | 5 + inc/lang/eu/edit.txt | 1 + inc/lang/eu/editrev.txt | 2 + inc/lang/eu/index.txt | 3 + inc/lang/eu/install.html | 7 + inc/lang/eu/jquery.ui.datepicker.js | 39 + inc/lang/eu/lang.php | 339 + inc/lang/eu/locked.txt | 3 + inc/lang/eu/login.txt | 3 + inc/lang/eu/mailtext.txt | 12 + inc/lang/eu/mailwrap.html | 13 + inc/lang/eu/newpage.txt | 3 + inc/lang/eu/norev.txt | 3 + inc/lang/eu/password.txt | 6 + inc/lang/eu/preview.txt | 3 + inc/lang/eu/pwconfirm.txt | 9 + inc/lang/eu/read.txt | 1 + inc/lang/eu/recent.txt | 3 + inc/lang/eu/register.txt | 3 + inc/lang/eu/registermail.txt | 10 + inc/lang/eu/resendpwd.txt | 3 + inc/lang/eu/resetpwd.txt | 3 + inc/lang/eu/revisions.txt | 3 + inc/lang/eu/searchpage.txt | 3 + inc/lang/eu/showrev.txt | 2 + inc/lang/eu/stopwords.txt | 26 + inc/lang/eu/subscr_digest.txt | 16 + inc/lang/eu/subscr_form.txt | 3 + inc/lang/eu/subscr_list.txt | 13 + inc/lang/eu/subscr_single.txt | 19 + inc/lang/eu/updateprofile.txt | 3 + inc/lang/eu/uploadmail.txt | 10 + inc/lang/fa/admin.txt | 3 + inc/lang/fa/adminplugins.txt | 1 + inc/lang/fa/backlinks.txt | 3 + inc/lang/fa/conflict.txt | 5 + inc/lang/fa/denied.txt | 3 + inc/lang/fa/diff.txt | 3 + inc/lang/fa/draft.txt | 5 + inc/lang/fa/edit.txt | 1 + inc/lang/fa/editrev.txt | 2 + inc/lang/fa/index.txt | 3 + inc/lang/fa/install.html | 7 + inc/lang/fa/jquery.ui.datepicker.js | 76 + inc/lang/fa/lang.php | 379 + inc/lang/fa/locked.txt | 3 + inc/lang/fa/login.txt | 3 + inc/lang/fa/mailtext.txt | 12 + inc/lang/fa/mailwrap.html | 13 + inc/lang/fa/newpage.txt | 3 + inc/lang/fa/norev.txt | 3 + inc/lang/fa/onceexisted.txt | 3 + inc/lang/fa/password.txt | 6 + inc/lang/fa/preview.txt | 3 + inc/lang/fa/pwconfirm.txt | 9 + inc/lang/fa/read.txt | 1 + inc/lang/fa/recent.txt | 3 + inc/lang/fa/register.txt | 3 + inc/lang/fa/registermail.txt | 10 + inc/lang/fa/resendpwd.txt | 3 + inc/lang/fa/resetpwd.txt | 3 + inc/lang/fa/revisions.txt | 3 + inc/lang/fa/searchpage.txt | 3 + inc/lang/fa/showrev.txt | 2 + inc/lang/fa/stopwords.txt | 446 + inc/lang/fa/subscr_digest.txt | 13 + inc/lang/fa/subscr_form.txt | 3 + inc/lang/fa/subscr_list.txt | 13 + inc/lang/fa/subscr_single.txt | 16 + inc/lang/fa/updateprofile.txt | 3 + inc/lang/fa/uploadmail.txt | 10 + inc/lang/fi/admin.txt | 3 + inc/lang/fi/adminplugins.txt | 1 + inc/lang/fi/backlinks.txt | 3 + inc/lang/fi/conflict.txt | 5 + inc/lang/fi/denied.txt | 3 + inc/lang/fi/diff.txt | 3 + inc/lang/fi/draft.txt | 5 + inc/lang/fi/edit.txt | 1 + inc/lang/fi/editrev.txt | 2 + inc/lang/fi/index.txt | 3 + inc/lang/fi/install.html | 7 + inc/lang/fi/jquery.ui.datepicker.js | 40 + inc/lang/fi/lang.php | 345 + inc/lang/fi/locked.txt | 3 + inc/lang/fi/login.txt | 3 + inc/lang/fi/mailtext.txt | 12 + inc/lang/fi/mailwrap.html | 13 + inc/lang/fi/newpage.txt | 3 + inc/lang/fi/norev.txt | 3 + inc/lang/fi/password.txt | 6 + inc/lang/fi/preview.txt | 3 + inc/lang/fi/pwconfirm.txt | 9 + inc/lang/fi/read.txt | 1 + inc/lang/fi/recent.txt | 3 + inc/lang/fi/register.txt | 3 + inc/lang/fi/registermail.txt | 10 + inc/lang/fi/resendpwd.txt | 3 + inc/lang/fi/resetpwd.txt | 3 + inc/lang/fi/revisions.txt | 3 + inc/lang/fi/searchpage.txt | 3 + inc/lang/fi/showrev.txt | 2 + inc/lang/fi/stopwords.txt | 11 + inc/lang/fi/subscr_digest.txt | 16 + inc/lang/fi/subscr_form.txt | 3 + inc/lang/fi/subscr_list.txt | 13 + inc/lang/fi/subscr_single.txt | 19 + inc/lang/fi/updateprofile.txt | 3 + inc/lang/fi/uploadmail.txt | 10 + inc/lang/fo/admin.txt | 3 + inc/lang/fo/backlinks.txt | 3 + inc/lang/fo/conflict.txt | 5 + inc/lang/fo/denied.txt | 3 + inc/lang/fo/diff.txt | 3 + inc/lang/fo/edit.txt | 1 + inc/lang/fo/editrev.txt | 2 + inc/lang/fo/index.txt | 3 + inc/lang/fo/jquery.ui.datepicker.js | 48 + inc/lang/fo/lang.php | 170 + inc/lang/fo/locked.txt | 3 + inc/lang/fo/login.txt | 3 + inc/lang/fo/mailtext.txt | 12 + inc/lang/fo/newpage.txt | 3 + inc/lang/fo/norev.txt | 3 + inc/lang/fo/password.txt | 6 + inc/lang/fo/preview.txt | 3 + inc/lang/fo/read.txt | 1 + inc/lang/fo/recent.txt | 3 + inc/lang/fo/register.txt | 3 + inc/lang/fo/resendpwd.txt | 3 + inc/lang/fo/revisions.txt | 3 + inc/lang/fo/searchpage.txt | 3 + inc/lang/fo/showrev.txt | 2 + inc/lang/fo/stopwords.txt | 88 + inc/lang/fo/subscr_digest.txt | 16 + inc/lang/fo/updateprofile.txt | 3 + inc/lang/fr/admin.txt | 3 + inc/lang/fr/adminplugins.txt | 1 + inc/lang/fr/backlinks.txt | 3 + inc/lang/fr/conflict.txt | 5 + inc/lang/fr/denied.txt | 3 + inc/lang/fr/diff.txt | 3 + inc/lang/fr/draft.txt | 5 + inc/lang/fr/edit.txt | 1 + inc/lang/fr/editrev.txt | 2 + inc/lang/fr/index.txt | 3 + inc/lang/fr/install.html | 32 + inc/lang/fr/jquery.ui.datepicker.js | 42 + inc/lang/fr/lang.php | 408 + inc/lang/fr/locked.txt | 3 + inc/lang/fr/login.txt | 3 + inc/lang/fr/mailtext.txt | 13 + inc/lang/fr/mailwrap.html | 13 + inc/lang/fr/newpage.txt | 3 + inc/lang/fr/norev.txt | 3 + inc/lang/fr/onceexisted.txt | 3 + inc/lang/fr/password.txt | 7 + inc/lang/fr/preview.txt | 4 + inc/lang/fr/pwconfirm.txt | 12 + inc/lang/fr/read.txt | 1 + inc/lang/fr/recent.txt | 3 + inc/lang/fr/register.txt | 3 + inc/lang/fr/registermail.txt | 10 + inc/lang/fr/resendpwd.txt | 3 + inc/lang/fr/resetpwd.txt | 3 + inc/lang/fr/revisions.txt | 3 + inc/lang/fr/searchpage.txt | 3 + inc/lang/fr/showrev.txt | 2 + inc/lang/fr/stopwords.txt | 113 + inc/lang/fr/subscr_digest.txt | 16 + inc/lang/fr/subscr_form.txt | 3 + inc/lang/fr/subscr_list.txt | 13 + inc/lang/fr/subscr_single.txt | 19 + inc/lang/fr/updateprofile.txt | 3 + inc/lang/fr/uploadmail.txt | 10 + inc/lang/fy/admin.txt | 3 + inc/lang/gl/admin.txt | 3 + inc/lang/gl/adminplugins.txt | 1 + inc/lang/gl/backlinks.txt | 3 + inc/lang/gl/conflict.txt | 5 + inc/lang/gl/denied.txt | 3 + inc/lang/gl/diff.txt | 3 + inc/lang/gl/draft.txt | 5 + inc/lang/gl/edit.txt | 1 + inc/lang/gl/editrev.txt | 2 + inc/lang/gl/index.txt | 3 + inc/lang/gl/install.html | 7 + inc/lang/gl/jquery.ui.datepicker.js | 40 + inc/lang/gl/lang.php | 318 + inc/lang/gl/locked.txt | 3 + inc/lang/gl/login.txt | 3 + inc/lang/gl/mailtext.txt | 12 + inc/lang/gl/mailwrap.html | 13 + inc/lang/gl/newpage.txt | 3 + inc/lang/gl/norev.txt | 3 + inc/lang/gl/password.txt | 6 + inc/lang/gl/preview.txt | 3 + inc/lang/gl/pwconfirm.txt | 9 + inc/lang/gl/read.txt | 1 + inc/lang/gl/recent.txt | 3 + inc/lang/gl/register.txt | 3 + inc/lang/gl/registermail.txt | 10 + inc/lang/gl/resendpwd.txt | 3 + inc/lang/gl/resetpwd.txt | 3 + inc/lang/gl/revisions.txt | 3 + inc/lang/gl/searchpage.txt | 3 + inc/lang/gl/showrev.txt | 2 + inc/lang/gl/stopwords.txt | 693 + inc/lang/gl/subscr_digest.txt | 16 + inc/lang/gl/subscr_form.txt | 3 + inc/lang/gl/subscr_list.txt | 13 + inc/lang/gl/subscr_single.txt | 19 + inc/lang/gl/updateprofile.txt | 3 + inc/lang/gl/uploadmail.txt | 10 + inc/lang/he/admin.txt | 3 + inc/lang/he/adminplugins.txt | 1 + inc/lang/he/backlinks.txt | 3 + inc/lang/he/conflict.txt | 5 + inc/lang/he/denied.txt | 3 + inc/lang/he/diff.txt | 3 + inc/lang/he/draft.txt | 5 + inc/lang/he/edit.txt | 1 + inc/lang/he/editrev.txt | 2 + inc/lang/he/index.txt | 3 + inc/lang/he/install.html | 7 + inc/lang/he/jquery.ui.datepicker.js | 40 + inc/lang/he/lang.php | 353 + inc/lang/he/locked.txt | 3 + inc/lang/he/login.txt | 3 + inc/lang/he/mailtext.txt | 12 + inc/lang/he/newpage.txt | 3 + inc/lang/he/norev.txt | 3 + inc/lang/he/password.txt | 6 + inc/lang/he/preview.txt | 3 + inc/lang/he/pwconfirm.txt | 9 + inc/lang/he/read.txt | 1 + inc/lang/he/recent.txt | 3 + inc/lang/he/register.txt | 3 + inc/lang/he/registermail.txt | 10 + inc/lang/he/resendpwd.txt | 3 + inc/lang/he/resetpwd.txt | 3 + inc/lang/he/revisions.txt | 3 + inc/lang/he/searchpage.txt | 3 + inc/lang/he/showrev.txt | 2 + inc/lang/he/stopwords.txt | 29 + inc/lang/he/subscr_digest.txt | 16 + inc/lang/he/subscr_single.txt | 18 + inc/lang/he/updateprofile.txt | 3 + inc/lang/he/uploadmail.txt | 10 + inc/lang/hi/diff.txt | 3 + inc/lang/hi/jquery.ui.datepicker.js | 40 + inc/lang/hi/lang.php | 116 + inc/lang/hr/admin.txt | 3 + inc/lang/hr/adminplugins.txt | 1 + inc/lang/hr/backlinks.txt | 3 + inc/lang/hr/conflict.txt | 5 + inc/lang/hr/denied.txt | 3 + inc/lang/hr/diff.txt | 3 + inc/lang/hr/draft.txt | 5 + inc/lang/hr/edit.txt | 1 + inc/lang/hr/editrev.txt | 2 + inc/lang/hr/index.txt | 3 + inc/lang/hr/jquery.ui.datepicker.js | 40 + inc/lang/hr/lang.php | 359 + inc/lang/hr/locked.txt | 3 + inc/lang/hr/login.txt | 3 + inc/lang/hr/mailtext.txt | 12 + inc/lang/hr/newpage.txt | 3 + inc/lang/hr/norev.txt | 3 + inc/lang/hr/password.txt | 6 + inc/lang/hr/preview.txt | 3 + inc/lang/hr/pwconfirm.txt | 9 + inc/lang/hr/read.txt | 1 + inc/lang/hr/recent.txt | 3 + inc/lang/hr/register.txt | 3 + inc/lang/hr/registermail.txt | 10 + inc/lang/hr/resendpwd.txt | 3 + inc/lang/hr/resetpwd.txt | 3 + inc/lang/hr/revisions.txt | 3 + inc/lang/hr/searchpage.txt | 3 + inc/lang/hr/showrev.txt | 2 + inc/lang/hr/stopwords.txt | 29 + inc/lang/hr/subscr_digest.txt | 15 + inc/lang/hr/subscr_form.txt | 3 + inc/lang/hr/subscr_list.txt | 11 + inc/lang/hr/subscr_single.txt | 18 + inc/lang/hr/updateprofile.txt | 3 + inc/lang/hr/uploadmail.txt | 11 + inc/lang/hu-formal/admin.txt | 3 + inc/lang/hu-formal/adminplugins.txt | 1 + inc/lang/hu-formal/backlinks.txt | 3 + inc/lang/hu-formal/conflict.txt | 5 + inc/lang/hu-formal/denied.txt | 3 + inc/lang/hu-formal/diff.txt | 3 + inc/lang/hu-formal/draft.txt | 5 + inc/lang/hu-formal/edit.txt | 1 + inc/lang/hu-formal/editrev.txt | 2 + inc/lang/hu-formal/index.txt | 3 + inc/lang/hu-formal/lang.php | 29 + inc/lang/hu/admin.txt | 3 + inc/lang/hu/adminplugins.txt | 1 + inc/lang/hu/backlinks.txt | 3 + inc/lang/hu/conflict.txt | 5 + inc/lang/hu/denied.txt | 3 + inc/lang/hu/diff.txt | 3 + inc/lang/hu/draft.txt | 5 + inc/lang/hu/edit.txt | 1 + inc/lang/hu/editrev.txt | 2 + inc/lang/hu/index.txt | 3 + inc/lang/hu/install.html | 7 + inc/lang/hu/jquery.ui.datepicker.js | 39 + inc/lang/hu/lang.php | 375 + inc/lang/hu/locked.txt | 3 + inc/lang/hu/login.txt | 3 + inc/lang/hu/mailtext.txt | 12 + inc/lang/hu/mailwrap.html | 13 + inc/lang/hu/newpage.txt | 3 + inc/lang/hu/norev.txt | 3 + inc/lang/hu/onceexisted.txt | 3 + inc/lang/hu/password.txt | 6 + inc/lang/hu/preview.txt | 3 + inc/lang/hu/pwconfirm.txt | 9 + inc/lang/hu/read.txt | 1 + inc/lang/hu/recent.txt | 3 + inc/lang/hu/register.txt | 3 + inc/lang/hu/registermail.txt | 10 + inc/lang/hu/resendpwd.txt | 3 + inc/lang/hu/resetpwd.txt | 3 + inc/lang/hu/revisions.txt | 3 + inc/lang/hu/searchpage.txt | 3 + inc/lang/hu/showrev.txt | 2 + inc/lang/hu/stopwords.txt | 40 + inc/lang/hu/subscr_digest.txt | 13 + inc/lang/hu/subscr_form.txt | 3 + inc/lang/hu/subscr_list.txt | 10 + inc/lang/hu/subscr_single.txt | 16 + inc/lang/hu/updateprofile.txt | 3 + inc/lang/hu/uploadmail.txt | 10 + inc/lang/hy/admin.txt | 3 + inc/lang/hy/adminplugins.txt | 1 + inc/lang/hy/backlinks.txt | 1 + inc/lang/hy/conflict.txt | 5 + inc/lang/hy/denied.txt | 3 + inc/lang/hy/diff.txt | 3 + inc/lang/hy/draft.txt | 5 + inc/lang/hy/edit.txt | 1 + inc/lang/hy/editrev.txt | 2 + inc/lang/hy/index.txt | 3 + inc/lang/hy/jquery.ui.datepicker.js | 40 + inc/lang/hy/lang.php | 133 + inc/lang/ia/admin.txt | 3 + inc/lang/ia/adminplugins.txt | 1 + inc/lang/ia/backlinks.txt | 3 + inc/lang/ia/conflict.txt | 5 + inc/lang/ia/denied.txt | 3 + inc/lang/ia/diff.txt | 3 + inc/lang/ia/draft.txt | 5 + inc/lang/ia/edit.txt | 1 + inc/lang/ia/editrev.txt | 2 + inc/lang/ia/index.txt | 3 + inc/lang/ia/install.html | 7 + inc/lang/ia/lang.php | 261 + inc/lang/ia/locked.txt | 3 + inc/lang/ia/login.txt | 3 + inc/lang/ia/mailtext.txt | 12 + inc/lang/ia/newpage.txt | 3 + inc/lang/ia/norev.txt | 3 + inc/lang/ia/password.txt | 6 + inc/lang/ia/preview.txt | 3 + inc/lang/ia/pwconfirm.txt | 9 + inc/lang/ia/read.txt | 1 + inc/lang/ia/recent.txt | 3 + inc/lang/ia/register.txt | 3 + inc/lang/ia/registermail.txt | 10 + inc/lang/ia/resendpwd.txt | 3 + inc/lang/ia/revisions.txt | 3 + inc/lang/ia/searchpage.txt | 3 + inc/lang/ia/showrev.txt | 2 + inc/lang/ia/stopwords.txt | 38 + inc/lang/ia/subscr_digest.txt | 16 + inc/lang/ia/subscr_form.txt | 4 + inc/lang/ia/subscr_list.txt | 13 + inc/lang/ia/subscr_single.txt | 19 + inc/lang/ia/updateprofile.txt | 3 + inc/lang/ia/uploadmail.txt | 10 + inc/lang/id-ni/lang.php | 76 + inc/lang/id/admin.txt | 3 + inc/lang/id/adminplugins.txt | 1 + inc/lang/id/backlinks.txt | 3 + inc/lang/id/conflict.txt | 5 + inc/lang/id/denied.txt | 3 + inc/lang/id/diff.txt | 3 + inc/lang/id/draft.txt | 5 + inc/lang/id/edit.txt | 1 + inc/lang/id/editrev.txt | 2 + inc/lang/id/index.txt | 3 + inc/lang/id/install.html | 7 + inc/lang/id/jquery.ui.datepicker.js | 41 + inc/lang/id/lang.php | 344 + inc/lang/id/locked.txt | 3 + inc/lang/id/login.txt | 3 + inc/lang/id/mailtext.txt | 12 + inc/lang/id/newpage.txt | 3 + inc/lang/id/norev.txt | 3 + inc/lang/id/password.txt | 6 + inc/lang/id/preview.txt | 3 + inc/lang/id/pwconfirm.txt | 9 + inc/lang/id/read.txt | 1 + inc/lang/id/recent.txt | 3 + inc/lang/id/register.txt | 3 + inc/lang/id/registermail.txt | 10 + inc/lang/id/resendpwd.txt | 3 + inc/lang/id/resetpwd.txt | 3 + inc/lang/id/revisions.txt | 3 + inc/lang/id/searchpage.txt | 3 + inc/lang/id/showrev.txt | 2 + inc/lang/id/stopwords.txt | 36 + inc/lang/id/subscr_digest.txt | 14 + inc/lang/id/updateprofile.txt | 3 + inc/lang/id/uploadmail.txt | 10 + inc/lang/is/adminplugins.txt | 1 + inc/lang/is/diff.txt | 3 + inc/lang/is/jquery.ui.datepicker.js | 48 + inc/lang/is/lang.php | 185 + inc/lang/is/login.txt | 3 + inc/lang/is/recent.txt | 3 + inc/lang/is/resendpwd.txt | 3 + inc/lang/it/admin.txt | 3 + inc/lang/it/adminplugins.txt | 1 + inc/lang/it/backlinks.txt | 3 + inc/lang/it/conflict.txt | 5 + inc/lang/it/denied.txt | 3 + inc/lang/it/diff.txt | 3 + inc/lang/it/draft.txt | 5 + inc/lang/it/edit.txt | 1 + inc/lang/it/editrev.txt | 2 + inc/lang/it/index.txt | 3 + inc/lang/it/install.html | 7 + inc/lang/it/jquery.ui.datepicker.js | 40 + inc/lang/it/lang.php | 388 + inc/lang/it/locked.txt | 3 + inc/lang/it/login.txt | 3 + inc/lang/it/mailtext.txt | 12 + inc/lang/it/mailwrap.html | 13 + inc/lang/it/newpage.txt | 3 + inc/lang/it/norev.txt | 3 + inc/lang/it/onceexisted.txt | 3 + inc/lang/it/password.txt | 6 + inc/lang/it/preview.txt | 3 + inc/lang/it/pwconfirm.txt | 9 + inc/lang/it/read.txt | 1 + inc/lang/it/recent.txt | 3 + inc/lang/it/register.txt | 3 + inc/lang/it/registermail.txt | 10 + inc/lang/it/resendpwd.txt | 3 + inc/lang/it/resetpwd.txt | 3 + inc/lang/it/revisions.txt | 3 + inc/lang/it/searchpage.txt | 3 + inc/lang/it/showrev.txt | 2 + inc/lang/it/stopwords.txt | 120 + inc/lang/it/subscr_digest.txt | 16 + inc/lang/it/subscr_form.txt | 3 + inc/lang/it/subscr_list.txt | 14 + inc/lang/it/subscr_single.txt | 20 + inc/lang/it/updateprofile.txt | 3 + inc/lang/it/uploadmail.txt | 10 + inc/lang/ja/admin.txt | 3 + inc/lang/ja/adminplugins.txt | 1 + inc/lang/ja/backlinks.txt | 3 + inc/lang/ja/conflict.txt | 5 + inc/lang/ja/denied.txt | 3 + inc/lang/ja/diff.txt | 3 + inc/lang/ja/draft.txt | 5 + inc/lang/ja/edit.txt | 1 + inc/lang/ja/editrev.txt | 2 + inc/lang/ja/index.txt | 3 + inc/lang/ja/install.html | 7 + inc/lang/ja/jquery.ui.datepicker.js | 40 + inc/lang/ja/lang.php | 373 + inc/lang/ja/locked.txt | 3 + inc/lang/ja/login.txt | 3 + inc/lang/ja/mailtext.txt | 14 + inc/lang/ja/mailwrap.html | 13 + inc/lang/ja/newpage.txt | 3 + inc/lang/ja/norev.txt | 3 + inc/lang/ja/onceexisted.txt | 3 + inc/lang/ja/password.txt | 6 + inc/lang/ja/preview.txt | 3 + inc/lang/ja/pwconfirm.txt | 9 + inc/lang/ja/read.txt | 1 + inc/lang/ja/recent.txt | 3 + inc/lang/ja/register.txt | 3 + inc/lang/ja/registermail.txt | 10 + inc/lang/ja/resendpwd.txt | 3 + inc/lang/ja/resetpwd.txt | 3 + inc/lang/ja/revisions.txt | 3 + inc/lang/ja/searchpage.txt | 3 + inc/lang/ja/showrev.txt | 2 + inc/lang/ja/stopwords.txt | 39 + inc/lang/ja/subscr_digest.txt | 16 + inc/lang/ja/subscr_form.txt | 3 + inc/lang/ja/subscr_list.txt | 13 + inc/lang/ja/subscr_single.txt | 19 + inc/lang/ja/updateprofile.txt | 3 + inc/lang/ja/uploadmail.txt | 11 + inc/lang/ka/admin.txt | 3 + inc/lang/ka/adminplugins.txt | 1 + inc/lang/ka/backlinks.txt | 3 + inc/lang/ka/conflict.txt | 5 + inc/lang/ka/denied.txt | 3 + inc/lang/ka/diff.txt | 3 + inc/lang/ka/draft.txt | 3 + inc/lang/ka/edit.txt | 1 + inc/lang/ka/editrev.txt | 2 + inc/lang/ka/index.txt | 3 + inc/lang/ka/jquery.ui.datepicker.js | 51 + inc/lang/ka/lang.php | 280 + inc/lang/kk/jquery.ui.datepicker.js | 40 + inc/lang/kk/lang.php | 129 + inc/lang/km/admin.txt | 3 + inc/lang/km/backlinks.txt | 3 + inc/lang/km/conflict.txt | 3 + inc/lang/km/denied.txt | 3 + inc/lang/km/edit.txt | 1 + inc/lang/km/editrev.txt | 2 + inc/lang/km/index.txt | 3 + inc/lang/km/jquery.ui.datepicker.js | 40 + inc/lang/km/lang.php | 201 + inc/lang/km/login.txt | 3 + inc/lang/km/newpage.txt | 3 + inc/lang/km/norev.txt | 3 + inc/lang/km/password.txt | 6 + inc/lang/km/pwconfirm.txt | 9 + inc/lang/km/recent.txt | 3 + inc/lang/km/register.txt | 3 + inc/lang/km/revisions.txt | 3 + inc/lang/kn/admin.txt | 3 + inc/lang/kn/adminplugins.txt | 1 + inc/lang/kn/backlinks.txt | 3 + inc/lang/kn/conflict.txt | 5 + inc/lang/ko/admin.txt | 3 + inc/lang/ko/adminplugins.txt | 1 + inc/lang/ko/backlinks.txt | 3 + inc/lang/ko/conflict.txt | 5 + inc/lang/ko/denied.txt | 3 + inc/lang/ko/diff.txt | 3 + inc/lang/ko/draft.txt | 5 + inc/lang/ko/edit.txt | 1 + inc/lang/ko/editrev.txt | 2 + inc/lang/ko/index.txt | 3 + inc/lang/ko/install.html | 7 + inc/lang/ko/jquery.ui.datepicker.js | 40 + inc/lang/ko/lang.php | 372 + inc/lang/ko/locked.txt | 3 + inc/lang/ko/login.txt | 3 + inc/lang/ko/mailtext.txt | 12 + inc/lang/ko/mailwrap.html | 13 + inc/lang/ko/newpage.txt | 3 + inc/lang/ko/norev.txt | 3 + inc/lang/ko/onceexisted.txt | 3 + inc/lang/ko/password.txt | 6 + inc/lang/ko/preview.txt | 3 + inc/lang/ko/pwconfirm.txt | 9 + inc/lang/ko/read.txt | 1 + inc/lang/ko/recent.txt | 3 + inc/lang/ko/register.txt | 3 + inc/lang/ko/registermail.txt | 10 + inc/lang/ko/resendpwd.txt | 3 + inc/lang/ko/resetpwd.txt | 3 + inc/lang/ko/revisions.txt | 3 + inc/lang/ko/searchpage.txt | 3 + inc/lang/ko/showrev.txt | 2 + inc/lang/ko/stopwords.txt | 39 + inc/lang/ko/subscr_digest.txt | 15 + inc/lang/ko/subscr_form.txt | 3 + inc/lang/ko/subscr_list.txt | 11 + inc/lang/ko/subscr_single.txt | 17 + inc/lang/ko/updateprofile.txt | 3 + inc/lang/ko/uploadmail.txt | 11 + inc/lang/ku/backlinks.txt | 3 + inc/lang/ku/conflict.txt | 5 + inc/lang/ku/diff.txt | 3 + inc/lang/ku/edit.txt | 1 + inc/lang/ku/index.txt | 3 + inc/lang/ku/lang.php | 72 + inc/lang/ku/newpage.txt | 3 + inc/lang/ku/preview.txt | 3 + inc/lang/ku/recent.txt | 3 + inc/lang/ku/searchpage.txt | 3 + inc/lang/la/admin.txt | 3 + inc/lang/la/adminplugins.txt | 1 + inc/lang/la/backlinks.txt | 3 + inc/lang/la/conflict.txt | 5 + inc/lang/la/denied.txt | 3 + inc/lang/la/diff.txt | 3 + inc/lang/la/draft.txt | 5 + inc/lang/la/edit.txt | 1 + inc/lang/la/editrev.txt | 2 + inc/lang/la/index.txt | 3 + inc/lang/la/install.html | 8 + inc/lang/la/lang.php | 261 + inc/lang/la/locked.txt | 3 + inc/lang/la/login.txt | 3 + inc/lang/la/mailtext.txt | 11 + inc/lang/la/newpage.txt | 3 + inc/lang/la/norev.txt | 3 + inc/lang/la/password.txt | 6 + inc/lang/la/preview.txt | 3 + inc/lang/la/pwconfirm.txt | 9 + inc/lang/la/read.txt | 1 + inc/lang/la/recent.txt | 3 + inc/lang/la/register.txt | 3 + inc/lang/la/registermail.txt | 10 + inc/lang/la/resendpwd.txt | 3 + inc/lang/la/revisions.txt | 3 + inc/lang/la/searchpage.txt | 3 + inc/lang/la/showrev.txt | 2 + inc/lang/la/stopwords.txt | 37 + inc/lang/la/subscr_digest.txt | 16 + inc/lang/la/subscr_form.txt | 3 + inc/lang/la/subscr_list.txt | 13 + inc/lang/la/subscr_single.txt | 19 + inc/lang/la/updateprofile.txt | 3 + inc/lang/la/uploadmail.txt | 10 + inc/lang/lb/admin.txt | 3 + inc/lang/lb/adminplugins.txt | 1 + inc/lang/lb/backlinks.txt | 3 + inc/lang/lb/conflict.txt | 5 + inc/lang/lb/denied.txt | 3 + inc/lang/lb/diff.txt | 3 + inc/lang/lb/draft.txt | 5 + inc/lang/lb/edit.txt | 1 + inc/lang/lb/editrev.txt | 2 + inc/lang/lb/index.txt | 3 + inc/lang/lb/jquery.ui.datepicker.js | 48 + inc/lang/lb/lang.php | 195 + inc/lang/lb/locked.txt | 3 + inc/lang/lb/login.txt | 3 + inc/lang/lb/mailtext.txt | 12 + inc/lang/lb/newpage.txt | 3 + inc/lang/lb/norev.txt | 3 + inc/lang/lb/password.txt | 6 + inc/lang/lb/preview.txt | 3 + inc/lang/lb/pwconfirm.txt | 9 + inc/lang/lb/read.txt | 1 + inc/lang/lb/recent.txt | 3 + inc/lang/lb/register.txt | 3 + inc/lang/lb/registermail.txt | 10 + inc/lang/lb/resendpwd.txt | 3 + inc/lang/lb/revisions.txt | 3 + inc/lang/lb/searchpage.txt | 3 + inc/lang/lb/showrev.txt | 2 + inc/lang/lb/updateprofile.txt | 3 + inc/lang/lb/uploadmail.txt | 10 + inc/lang/lt/admin.txt | 3 + inc/lang/lt/adminplugins.txt | 1 + inc/lang/lt/backlinks.txt | 3 + inc/lang/lt/conflict.txt | 5 + inc/lang/lt/denied.txt | 3 + inc/lang/lt/diff.txt | 3 + inc/lang/lt/draft.txt | 5 + inc/lang/lt/edit.txt | 1 + inc/lang/lt/editrev.txt | 2 + inc/lang/lt/index.txt | 3 + inc/lang/lt/jquery.ui.datepicker.js | 48 + inc/lang/lt/lang.php | 189 + inc/lang/lt/locked.txt | 3 + inc/lang/lt/login.txt | 3 + inc/lang/lt/mailtext.txt | 14 + inc/lang/lt/newpage.txt | 3 + inc/lang/lt/norev.txt | 3 + inc/lang/lt/password.txt | 6 + inc/lang/lt/preview.txt | 3 + inc/lang/lt/read.txt | 1 + inc/lang/lt/recent.txt | 3 + inc/lang/lt/register.txt | 3 + inc/lang/lt/resendpwd.txt | 3 + inc/lang/lt/revisions.txt | 3 + inc/lang/lt/searchpage.txt | 3 + inc/lang/lt/showrev.txt | 2 + inc/lang/lt/updateprofile.txt | 3 + inc/lang/lv/admin.txt | 3 + inc/lang/lv/adminplugins.txt | 1 + inc/lang/lv/backlinks.txt | 3 + inc/lang/lv/conflict.txt | 5 + inc/lang/lv/denied.txt | 3 + inc/lang/lv/diff.txt | 3 + inc/lang/lv/draft.txt | 5 + inc/lang/lv/edit.txt | 1 + inc/lang/lv/editrev.txt | 2 + inc/lang/lv/index.txt | 3 + inc/lang/lv/install.html | 7 + inc/lang/lv/jquery.ui.datepicker.js | 48 + inc/lang/lv/lang.php | 339 + inc/lang/lv/locked.txt | 3 + inc/lang/lv/login.txt | 3 + inc/lang/lv/mailtext.txt | 12 + inc/lang/lv/mailwrap.html | 13 + inc/lang/lv/newpage.txt | 3 + inc/lang/lv/norev.txt | 3 + inc/lang/lv/password.txt | 6 + inc/lang/lv/preview.txt | 3 + inc/lang/lv/pwconfirm.txt | 9 + inc/lang/lv/read.txt | 1 + inc/lang/lv/recent.txt | 3 + inc/lang/lv/register.txt | 3 + inc/lang/lv/registermail.txt | 10 + inc/lang/lv/resendpwd.txt | 3 + inc/lang/lv/resetpwd.txt | 3 + inc/lang/lv/revisions.txt | 3 + inc/lang/lv/searchpage.txt | 3 + inc/lang/lv/showrev.txt | 2 + inc/lang/lv/stopwords.txt | 46 + inc/lang/lv/subscr_digest.txt | 15 + inc/lang/lv/subscr_form.txt | 3 + inc/lang/lv/subscr_list.txt | 12 + inc/lang/lv/subscr_single.txt | 19 + inc/lang/lv/updateprofile.txt | 3 + inc/lang/lv/uploadmail.txt | 10 + inc/lang/mg/admin.txt | 3 + inc/lang/mg/backlinks.txt | 3 + inc/lang/mg/conflict.txt | 5 + inc/lang/mg/denied.txt | 3 + inc/lang/mg/diff.txt | 3 + inc/lang/mg/edit.txt | 1 + inc/lang/mg/editrev.txt | 2 + inc/lang/mg/index.txt | 3 + inc/lang/mg/lang.php | 119 + inc/lang/mg/locked.txt | 3 + inc/lang/mg/login.txt | 3 + inc/lang/mg/mailtext.txt | 12 + inc/lang/mg/newpage.txt | 3 + inc/lang/mg/norev.txt | 3 + inc/lang/mg/password.txt | 6 + inc/lang/mg/preview.txt | 3 + inc/lang/mg/read.txt | 1 + inc/lang/mg/recent.txt | 3 + inc/lang/mg/register.txt | 3 + inc/lang/mg/revisions.txt | 3 + inc/lang/mg/searchpage.txt | 3 + inc/lang/mg/showrev.txt | 2 + inc/lang/mk/adminplugins.txt | 1 + inc/lang/mk/jquery.ui.datepicker.js | 40 + inc/lang/mk/lang.php | 226 + inc/lang/mk/read.txt | 1 + inc/lang/mk/recent.txt | 3 + inc/lang/mk/showrev.txt | 2 + inc/lang/ml/admin.txt | 3 + inc/lang/ml/jquery.ui.datepicker.js | 40 + inc/lang/mr/admin.txt | 3 + inc/lang/mr/backlinks.txt | 3 + inc/lang/mr/conflict.txt | 5 + inc/lang/mr/denied.txt | 3 + inc/lang/mr/diff.txt | 3 + inc/lang/mr/draft.txt | 5 + inc/lang/mr/edit.txt | 1 + inc/lang/mr/editrev.txt | 2 + inc/lang/mr/index.txt | 3 + inc/lang/mr/install.html | 7 + inc/lang/mr/lang.php | 265 + inc/lang/mr/locked.txt | 3 + inc/lang/mr/login.txt | 3 + inc/lang/mr/mailtext.txt | 12 + inc/lang/mr/newpage.txt | 3 + inc/lang/mr/norev.txt | 3 + inc/lang/mr/password.txt | 6 + inc/lang/mr/preview.txt | 3 + inc/lang/mr/pwconfirm.txt | 9 + inc/lang/mr/read.txt | 1 + inc/lang/mr/recent.txt | 3 + inc/lang/mr/register.txt | 3 + inc/lang/mr/registermail.txt | 10 + inc/lang/mr/resendpwd.txt | 3 + inc/lang/mr/revisions.txt | 3 + inc/lang/mr/searchpage.txt | 3 + inc/lang/mr/showrev.txt | 2 + inc/lang/mr/stopwords.txt | 39 + inc/lang/mr/updateprofile.txt | 3 + inc/lang/mr/uploadmail.txt | 10 + inc/lang/ms/jquery.ui.datepicker.js | 40 + inc/lang/ms/lang.php | 95 + inc/lang/nan/lang.php | 57 + inc/lang/ne/admin.txt | 3 + inc/lang/ne/adminplugins.txt | 1 + inc/lang/ne/backlinks.txt | 3 + inc/lang/ne/conflict.txt | 5 + inc/lang/ne/denied.txt | 3 + inc/lang/ne/diff.txt | 3 + inc/lang/ne/draft.txt | 5 + inc/lang/ne/edit.txt | 1 + inc/lang/ne/editrev.txt | 2 + inc/lang/ne/index.txt | 3 + inc/lang/ne/lang.php | 204 + inc/lang/ne/locked.txt | 3 + inc/lang/ne/norev.txt | 3 + inc/lang/ne/pwconfirm.txt | 9 + inc/lang/ne/read.txt | 1 + inc/lang/ne/recent.txt | 3 + inc/lang/ne/resendpwd.txt | 3 + inc/lang/ne/searchpage.txt | 3 + inc/lang/ne/showrev.txt | 2 + inc/lang/ne/updateprofile.txt | 3 + inc/lang/ne/uploadmail.txt | 9 + inc/lang/nl/admin.txt | 3 + inc/lang/nl/adminplugins.txt | 1 + inc/lang/nl/backlinks.txt | 3 + inc/lang/nl/conflict.txt | 5 + inc/lang/nl/denied.txt | 3 + inc/lang/nl/diff.txt | 3 + inc/lang/nl/draft.txt | 5 + inc/lang/nl/edit.txt | 1 + inc/lang/nl/editrev.txt | 2 + inc/lang/nl/index.txt | 3 + inc/lang/nl/install.html | 7 + inc/lang/nl/jquery.ui.datepicker.js | 40 + inc/lang/nl/lang.php | 387 + inc/lang/nl/locked.txt | 3 + inc/lang/nl/login.txt | 3 + inc/lang/nl/mailtext.txt | 12 + inc/lang/nl/mailwrap.html | 13 + inc/lang/nl/newpage.txt | 3 + inc/lang/nl/norev.txt | 3 + inc/lang/nl/onceexisted.txt | 3 + inc/lang/nl/password.txt | 6 + inc/lang/nl/preview.txt | 3 + inc/lang/nl/pwconfirm.txt | 9 + inc/lang/nl/read.txt | 1 + inc/lang/nl/recent.txt | 3 + inc/lang/nl/register.txt | 3 + inc/lang/nl/registermail.txt | 10 + inc/lang/nl/resendpwd.txt | 3 + inc/lang/nl/resetpwd.txt | 3 + inc/lang/nl/revisions.txt | 3 + inc/lang/nl/searchpage.txt | 3 + inc/lang/nl/showrev.txt | 2 + inc/lang/nl/stopwords.txt | 38 + inc/lang/nl/subscr_digest.txt | 12 + inc/lang/nl/subscr_form.txt | 3 + inc/lang/nl/subscr_list.txt | 9 + inc/lang/nl/subscr_single.txt | 16 + inc/lang/nl/updateprofile.txt | 3 + inc/lang/nl/uploadmail.txt | 11 + inc/lang/no/admin.txt | 3 + inc/lang/no/adminplugins.txt | 1 + inc/lang/no/backlinks.txt | 3 + inc/lang/no/conflict.txt | 5 + inc/lang/no/denied.txt | 3 + inc/lang/no/diff.txt | 3 + inc/lang/no/draft.txt | 5 + inc/lang/no/edit.txt | 1 + inc/lang/no/editrev.txt | 2 + inc/lang/no/index.txt | 3 + inc/lang/no/install.html | 7 + inc/lang/no/jquery.ui.datepicker.js | 53 + inc/lang/no/lang.php | 376 + inc/lang/no/locked.txt | 3 + inc/lang/no/login.txt | 3 + inc/lang/no/mailtext.txt | 12 + inc/lang/no/newpage.txt | 3 + inc/lang/no/norev.txt | 3 + inc/lang/no/password.txt | 6 + inc/lang/no/preview.txt | 3 + inc/lang/no/pwconfirm.txt | 9 + inc/lang/no/read.txt | 1 + inc/lang/no/recent.txt | 3 + inc/lang/no/register.txt | 3 + inc/lang/no/registermail.txt | 10 + inc/lang/no/resendpwd.txt | 3 + inc/lang/no/resetpwd.txt | 3 + inc/lang/no/revisions.txt | 3 + inc/lang/no/searchpage.txt | 3 + inc/lang/no/showrev.txt | 2 + inc/lang/no/stopwords.txt | 68 + inc/lang/no/subscr_digest.txt | 16 + inc/lang/no/subscr_form.txt | 3 + inc/lang/no/subscr_list.txt | 13 + inc/lang/no/subscr_single.txt | 19 + inc/lang/no/updateprofile.txt | 3 + inc/lang/no/uploadmail.txt | 11 + inc/lang/oc/admin.txt | 2 + inc/lang/oc/adminplugins.txt | 1 + inc/lang/oc/backlinks.txt | 2 + inc/lang/oc/conflict.txt | 4 + inc/lang/oc/denied.txt | 2 + inc/lang/oc/diff.txt | 2 + inc/lang/oc/index.txt | 2 + inc/lang/oc/lang.php | 226 + inc/lang/pl/admin.txt | 3 + inc/lang/pl/adminplugins.txt | 1 + inc/lang/pl/backlinks.txt | 3 + inc/lang/pl/conflict.txt | 5 + inc/lang/pl/denied.txt | 3 + inc/lang/pl/diff.txt | 3 + inc/lang/pl/draft.txt | 5 + inc/lang/pl/edit.txt | 1 + inc/lang/pl/editrev.txt | 2 + inc/lang/pl/index.txt | 3 + inc/lang/pl/install.html | 7 + inc/lang/pl/jquery.ui.datepicker.js | 40 + inc/lang/pl/lang.php | 391 + inc/lang/pl/locked.txt | 3 + inc/lang/pl/login.txt | 3 + inc/lang/pl/mailtext.txt | 13 + inc/lang/pl/mailwrap.html | 13 + inc/lang/pl/newpage.txt | 3 + inc/lang/pl/norev.txt | 3 + inc/lang/pl/onceexisted.txt | 3 + inc/lang/pl/password.txt | 6 + inc/lang/pl/preview.txt | 3 + inc/lang/pl/pwconfirm.txt | 9 + inc/lang/pl/read.txt | 1 + inc/lang/pl/recent.txt | 3 + inc/lang/pl/register.txt | 3 + inc/lang/pl/registermail.txt | 11 + inc/lang/pl/resendpwd.txt | 3 + inc/lang/pl/resetpwd.txt | 3 + inc/lang/pl/revisions.txt | 3 + inc/lang/pl/searchpage.txt | 3 + inc/lang/pl/showrev.txt | 2 + inc/lang/pl/stopwords.txt | 90 + inc/lang/pl/subscr_digest.txt | 17 + inc/lang/pl/subscr_form.txt | 3 + inc/lang/pl/subscr_list.txt | 14 + inc/lang/pl/subscr_single.txt | 20 + inc/lang/pl/updateprofile.txt | 3 + inc/lang/pl/uploadmail.txt | 12 + inc/lang/pt-br/admin.txt | 3 + inc/lang/pt-br/adminplugins.txt | 1 + inc/lang/pt-br/backlinks.txt | 3 + inc/lang/pt-br/conflict.txt | 5 + inc/lang/pt-br/denied.txt | 3 + inc/lang/pt-br/diff.txt | 3 + inc/lang/pt-br/draft.txt | 5 + inc/lang/pt-br/edit.txt | 1 + inc/lang/pt-br/editrev.txt | 2 + inc/lang/pt-br/index.txt | 3 + inc/lang/pt-br/install.html | 7 + inc/lang/pt-br/jquery.ui.datepicker.js | 48 + inc/lang/pt-br/lang.php | 398 + inc/lang/pt-br/locked.txt | 3 + inc/lang/pt-br/login.txt | 3 + inc/lang/pt-br/mailtext.txt | 12 + inc/lang/pt-br/mailwrap.html | 13 + inc/lang/pt-br/newpage.txt | 3 + inc/lang/pt-br/norev.txt | 3 + inc/lang/pt-br/onceexisted.txt | 3 + inc/lang/pt-br/password.txt | 6 + inc/lang/pt-br/preview.txt | 3 + inc/lang/pt-br/pwconfirm.txt | 9 + inc/lang/pt-br/read.txt | 1 + inc/lang/pt-br/recent.txt | 3 + inc/lang/pt-br/register.txt | 3 + inc/lang/pt-br/registermail.txt | 10 + inc/lang/pt-br/resendpwd.txt | 3 + inc/lang/pt-br/resetpwd.txt | 3 + inc/lang/pt-br/revisions.txt | 3 + inc/lang/pt-br/searchpage.txt | 3 + inc/lang/pt-br/showrev.txt | 2 + inc/lang/pt-br/stopwords.txt | 55 + inc/lang/pt-br/subscr_digest.txt | 16 + inc/lang/pt-br/subscr_form.txt | 3 + inc/lang/pt-br/subscr_list.txt | 26 + inc/lang/pt-br/subscr_single.txt | 19 + inc/lang/pt-br/updateprofile.txt | 3 + inc/lang/pt-br/uploadmail.txt | 10 + inc/lang/pt/admin.txt | 3 + inc/lang/pt/adminplugins.txt | 1 + inc/lang/pt/backlinks.txt | 3 + inc/lang/pt/conflict.txt | 5 + inc/lang/pt/denied.txt | 3 + inc/lang/pt/diff.txt | 3 + inc/lang/pt/draft.txt | 5 + inc/lang/pt/edit.txt | 1 + inc/lang/pt/editrev.txt | 2 + inc/lang/pt/index.txt | 3 + inc/lang/pt/install.html | 7 + inc/lang/pt/jquery.ui.datepicker.js | 47 + inc/lang/pt/lang.php | 385 + inc/lang/pt/locked.txt | 3 + inc/lang/pt/login.txt | 3 + inc/lang/pt/mailtext.txt | 16 + inc/lang/pt/newpage.txt | 3 + inc/lang/pt/norev.txt | 3 + inc/lang/pt/onceexisted.txt | 3 + inc/lang/pt/password.txt | 6 + inc/lang/pt/preview.txt | 3 + inc/lang/pt/pwconfirm.txt | 9 + inc/lang/pt/read.txt | 1 + inc/lang/pt/recent.txt | 3 + inc/lang/pt/register.txt | 3 + inc/lang/pt/registermail.txt | 10 + inc/lang/pt/resendpwd.txt | 3 + inc/lang/pt/resetpwd.txt | 3 + inc/lang/pt/revisions.txt | 3 + inc/lang/pt/searchpage.txt | 3 + inc/lang/pt/showrev.txt | 2 + inc/lang/pt/stopwords.txt | 142 + inc/lang/pt/subscr_digest.txt | 16 + inc/lang/pt/subscr_form.txt | 3 + inc/lang/pt/subscr_list.txt | 13 + inc/lang/pt/subscr_single.txt | 20 + inc/lang/pt/updateprofile.txt | 3 + inc/lang/pt/uploadmail.txt | 11 + inc/lang/ro/admin.txt | 3 + inc/lang/ro/adminplugins.txt | 1 + inc/lang/ro/backlinks.txt | 3 + inc/lang/ro/conflict.txt | 7 + inc/lang/ro/denied.txt | 3 + inc/lang/ro/diff.txt | 3 + inc/lang/ro/draft.txt | 5 + inc/lang/ro/edit.txt | 1 + inc/lang/ro/editrev.txt | 3 + inc/lang/ro/index.txt | 3 + inc/lang/ro/install.html | 7 + inc/lang/ro/jquery.ui.datepicker.js | 43 + inc/lang/ro/lang.php | 368 + inc/lang/ro/locked.txt | 3 + inc/lang/ro/login.txt | 3 + inc/lang/ro/mailtext.txt | 13 + inc/lang/ro/newpage.txt | 3 + inc/lang/ro/norev.txt | 3 + inc/lang/ro/onceexisted.txt | 3 + inc/lang/ro/password.txt | 6 + inc/lang/ro/preview.txt | 3 + inc/lang/ro/pwconfirm.txt | 9 + inc/lang/ro/read.txt | 2 + inc/lang/ro/recent.txt | 3 + inc/lang/ro/register.txt | 4 + inc/lang/ro/registermail.txt | 11 + inc/lang/ro/resendpwd.txt | 3 + inc/lang/ro/resetpwd.txt | 3 + inc/lang/ro/revisions.txt | 3 + inc/lang/ro/searchpage.txt | 3 + inc/lang/ro/showrev.txt | 2 + inc/lang/ro/stopwords.txt | 31 + inc/lang/ro/subscr_digest.txt | 16 + inc/lang/ro/subscr_form.txt | 4 + inc/lang/ro/subscr_list.txt | 13 + inc/lang/ro/subscr_single.txt | 19 + inc/lang/ro/updateprofile.txt | 3 + inc/lang/ro/uploadmail.txt | 12 + inc/lang/ru/admin.txt | 3 + inc/lang/ru/adminplugins.txt | 1 + inc/lang/ru/backlinks.txt | 3 + inc/lang/ru/conflict.txt | 5 + inc/lang/ru/denied.txt | 3 + inc/lang/ru/diff.txt | 3 + inc/lang/ru/draft.txt | 5 + inc/lang/ru/edit.txt | 1 + inc/lang/ru/editrev.txt | 2 + inc/lang/ru/index.txt | 3 + inc/lang/ru/install.html | 7 + inc/lang/ru/jquery.ui.datepicker.js | 40 + inc/lang/ru/lang.php | 409 + inc/lang/ru/locked.txt | 3 + inc/lang/ru/login.txt | 3 + inc/lang/ru/mailtext.txt | 12 + inc/lang/ru/newpage.txt | 3 + inc/lang/ru/norev.txt | 3 + inc/lang/ru/onceexisted.txt | 3 + inc/lang/ru/password.txt | 6 + inc/lang/ru/preview.txt | 3 + inc/lang/ru/pwconfirm.txt | 9 + inc/lang/ru/read.txt | 1 + inc/lang/ru/recent.txt | 3 + inc/lang/ru/register.txt | 3 + inc/lang/ru/registermail.txt | 10 + inc/lang/ru/resendpwd.txt | 3 + inc/lang/ru/resetpwd.txt | 3 + inc/lang/ru/revisions.txt | 3 + inc/lang/ru/searchpage.txt | 3 + inc/lang/ru/showrev.txt | 2 + inc/lang/ru/stopwords.txt | 94 + inc/lang/ru/subscr_digest.txt | 15 + inc/lang/ru/subscr_form.txt | 3 + inc/lang/ru/subscr_list.txt | 13 + inc/lang/ru/subscr_single.txt | 19 + inc/lang/ru/updateprofile.txt | 3 + inc/lang/ru/uploadmail.txt | 11 + inc/lang/si/admin.txt | 3 + inc/lang/si/adminplugins.txt | 1 + inc/lang/si/backlinks.txt | 3 + inc/lang/si/conflict.txt | 2 + inc/lang/si/denied.txt | 1 + inc/lang/si/diff.txt | 1 + inc/lang/si/draft.txt | 1 + inc/lang/si/index.txt | 1 + inc/lang/si/lang.php | 27 + inc/lang/sk/admin.txt | 3 + inc/lang/sk/adminplugins.txt | 1 + inc/lang/sk/backlinks.txt | 3 + inc/lang/sk/conflict.txt | 5 + inc/lang/sk/denied.txt | 3 + inc/lang/sk/diff.txt | 3 + inc/lang/sk/draft.txt | 5 + inc/lang/sk/edit.txt | 1 + inc/lang/sk/editrev.txt | 2 + inc/lang/sk/index.txt | 3 + inc/lang/sk/install.html | 7 + inc/lang/sk/jquery.ui.datepicker.js | 40 + inc/lang/sk/lang.php | 367 + inc/lang/sk/locked.txt | 3 + inc/lang/sk/login.txt | 3 + inc/lang/sk/mailtext.txt | 12 + inc/lang/sk/mailwrap.html | 13 + inc/lang/sk/newpage.txt | 3 + inc/lang/sk/norev.txt | 3 + inc/lang/sk/onceexisted.txt | 3 + inc/lang/sk/password.txt | 7 + inc/lang/sk/preview.txt | 3 + inc/lang/sk/pwconfirm.txt | 9 + inc/lang/sk/read.txt | 1 + inc/lang/sk/recent.txt | 3 + inc/lang/sk/register.txt | 3 + inc/lang/sk/registermail.txt | 10 + inc/lang/sk/resendpwd.txt | 3 + inc/lang/sk/resetpwd.txt | 3 + inc/lang/sk/revisions.txt | 3 + inc/lang/sk/searchpage.txt | 3 + inc/lang/sk/showrev.txt | 2 + inc/lang/sk/stopwords.txt | 26 + inc/lang/sk/subscr_digest.txt | 16 + inc/lang/sk/subscr_form.txt | 3 + inc/lang/sk/subscr_list.txt | 13 + inc/lang/sk/subscr_single.txt | 19 + inc/lang/sk/updateprofile.txt | 3 + inc/lang/sk/uploadmail.txt | 10 + inc/lang/sl/admin.txt | 3 + inc/lang/sl/adminplugins.txt | 1 + inc/lang/sl/backlinks.txt | 3 + inc/lang/sl/conflict.txt | 5 + inc/lang/sl/denied.txt | 3 + inc/lang/sl/diff.txt | 3 + inc/lang/sl/draft.txt | 5 + inc/lang/sl/edit.txt | 1 + inc/lang/sl/editrev.txt | 2 + inc/lang/sl/index.txt | 3 + inc/lang/sl/install.html | 7 + inc/lang/sl/jquery.ui.datepicker.js | 41 + inc/lang/sl/lang.php | 336 + inc/lang/sl/locked.txt | 3 + inc/lang/sl/login.txt | 3 + inc/lang/sl/mailtext.txt | 12 + inc/lang/sl/newpage.txt | 3 + inc/lang/sl/norev.txt | 3 + inc/lang/sl/password.txt | 6 + inc/lang/sl/preview.txt | 3 + inc/lang/sl/pwconfirm.txt | 9 + inc/lang/sl/read.txt | 1 + inc/lang/sl/recent.txt | 3 + inc/lang/sl/register.txt | 3 + inc/lang/sl/registermail.txt | 11 + inc/lang/sl/resendpwd.txt | 3 + inc/lang/sl/resetpwd.txt | 3 + inc/lang/sl/revisions.txt | 3 + inc/lang/sl/searchpage.txt | 3 + inc/lang/sl/showrev.txt | 2 + inc/lang/sl/stopwords.txt | 19 + inc/lang/sl/subscr_digest.txt | 16 + inc/lang/sl/subscr_form.txt | 3 + inc/lang/sl/subscr_list.txt | 13 + inc/lang/sl/subscr_single.txt | 19 + inc/lang/sl/updateprofile.txt | 3 + inc/lang/sl/uploadmail.txt | 11 + inc/lang/sq/admin.txt | 3 + inc/lang/sq/adminplugins.txt | 1 + inc/lang/sq/backlinks.txt | 3 + inc/lang/sq/conflict.txt | 5 + inc/lang/sq/denied.txt | 3 + inc/lang/sq/diff.txt | 3 + inc/lang/sq/draft.txt | 5 + inc/lang/sq/edit.txt | 1 + inc/lang/sq/editrev.txt | 2 + inc/lang/sq/index.txt | 3 + inc/lang/sq/install.html | 7 + inc/lang/sq/jquery.ui.datepicker.js | 40 + inc/lang/sq/lang.php | 259 + inc/lang/sq/locked.txt | 3 + inc/lang/sq/login.txt | 3 + inc/lang/sq/mailtext.txt | 16 + inc/lang/sq/newpage.txt | 3 + inc/lang/sq/norev.txt | 3 + inc/lang/sq/password.txt | 10 + inc/lang/sq/preview.txt | 3 + inc/lang/sq/pwconfirm.txt | 9 + inc/lang/sq/read.txt | 1 + inc/lang/sq/recent.txt | 3 + inc/lang/sq/register.txt | 3 + inc/lang/sq/registermail.txt | 10 + inc/lang/sq/resendpwd.txt | 3 + inc/lang/sq/revisions.txt | 3 + inc/lang/sq/searchpage.txt | 3 + inc/lang/sq/showrev.txt | 2 + inc/lang/sq/stopwords.txt | 39 + inc/lang/sq/subscr_digest.txt | 16 + inc/lang/sq/subscr_form.txt | 3 + inc/lang/sq/subscr_list.txt | 9 + inc/lang/sq/subscr_single.txt | 19 + inc/lang/sq/updateprofile.txt | 3 + inc/lang/sq/uploadmail.txt | 10 + inc/lang/sr/admin.txt | 3 + inc/lang/sr/adminplugins.txt | 1 + inc/lang/sr/backlinks.txt | 3 + inc/lang/sr/conflict.txt | 5 + inc/lang/sr/denied.txt | 3 + inc/lang/sr/diff.txt | 3 + inc/lang/sr/draft.txt | 5 + inc/lang/sr/edit.txt | 1 + inc/lang/sr/editrev.txt | 2 + inc/lang/sr/index.txt | 3 + inc/lang/sr/install.html | 7 + inc/lang/sr/jquery.ui.datepicker.js | 40 + inc/lang/sr/lang.php | 360 + inc/lang/sr/locked.txt | 3 + inc/lang/sr/login.txt | 3 + inc/lang/sr/mailtext.txt | 12 + inc/lang/sr/newpage.txt | 3 + inc/lang/sr/norev.txt | 3 + inc/lang/sr/onceexisted.txt | 3 + inc/lang/sr/password.txt | 6 + inc/lang/sr/preview.txt | 3 + inc/lang/sr/pwconfirm.txt | 9 + inc/lang/sr/read.txt | 1 + inc/lang/sr/recent.txt | 3 + inc/lang/sr/register.txt | 3 + inc/lang/sr/registermail.txt | 10 + inc/lang/sr/resendpwd.txt | 3 + inc/lang/sr/resetpwd.txt | 3 + inc/lang/sr/revisions.txt | 3 + inc/lang/sr/searchpage.txt | 3 + inc/lang/sr/showrev.txt | 2 + inc/lang/sr/stopwords.txt | 12 + inc/lang/sr/subscr_digest.txt | 16 + inc/lang/sr/subscr_form.txt | 3 + inc/lang/sr/subscr_list.txt | 13 + inc/lang/sr/subscr_single.txt | 19 + inc/lang/sr/updateprofile.txt | 3 + inc/lang/sr/uploadmail.txt | 10 + inc/lang/sv/admin.txt | 3 + inc/lang/sv/adminplugins.txt | 1 + inc/lang/sv/backlinks.txt | 3 + inc/lang/sv/conflict.txt | 5 + inc/lang/sv/denied.txt | 3 + inc/lang/sv/diff.txt | 3 + inc/lang/sv/draft.txt | 5 + inc/lang/sv/edit.txt | 1 + inc/lang/sv/editrev.txt | 2 + inc/lang/sv/index.txt | 3 + inc/lang/sv/install.html | 7 + inc/lang/sv/jquery.ui.datepicker.js | 40 + inc/lang/sv/lang.php | 382 + inc/lang/sv/locked.txt | 3 + inc/lang/sv/login.txt | 3 + inc/lang/sv/mailtext.txt | 12 + inc/lang/sv/mailwrap.html | 13 + inc/lang/sv/newpage.txt | 3 + inc/lang/sv/norev.txt | 3 + inc/lang/sv/onceexisted.txt | 3 + inc/lang/sv/password.txt | 6 + inc/lang/sv/preview.txt | 3 + inc/lang/sv/pwconfirm.txt | 9 + inc/lang/sv/read.txt | 1 + inc/lang/sv/recent.txt | 3 + inc/lang/sv/register.txt | 3 + inc/lang/sv/registermail.txt | 10 + inc/lang/sv/resendpwd.txt | 3 + inc/lang/sv/resetpwd.txt | 3 + inc/lang/sv/revisions.txt | 3 + inc/lang/sv/searchpage.txt | 3 + inc/lang/sv/showrev.txt | 2 + inc/lang/sv/stopwords.txt | 100 + inc/lang/sv/subscr_digest.txt | 15 + inc/lang/sv/subscr_form.txt | 3 + inc/lang/sv/subscr_list.txt | 9 + inc/lang/sv/subscr_single.txt | 19 + inc/lang/sv/updateprofile.txt | 3 + inc/lang/sv/uploadmail.txt | 10 + inc/lang/ta/admin.txt | 3 + inc/lang/ta/adminplugins.txt | 1 + inc/lang/ta/backlinks.txt | 3 + inc/lang/ta/conflict.txt | 3 + inc/lang/ta/denied.txt | 3 + inc/lang/ta/diff.txt | 3 + inc/lang/ta/draft.txt | 5 + inc/lang/ta/edit.txt | 1 + inc/lang/ta/jquery.ui.datepicker.js | 56 + inc/lang/ta/lang.php | 55 + inc/lang/th/admin.txt | 3 + inc/lang/th/adminplugins.txt | 1 + inc/lang/th/backlinks.txt | 3 + inc/lang/th/conflict.txt | 5 + inc/lang/th/denied.txt | 3 + inc/lang/th/diff.txt | 3 + inc/lang/th/draft.txt | 5 + inc/lang/th/edit.txt | 1 + inc/lang/th/editrev.txt | 2 + inc/lang/th/index.txt | 3 + inc/lang/th/jquery.ui.datepicker.js | 40 + inc/lang/th/lang.php | 306 + inc/lang/th/locked.txt | 3 + inc/lang/th/login.txt | 3 + inc/lang/th/mailtext.txt | 12 + inc/lang/th/newpage.txt | 3 + inc/lang/th/norev.txt | 3 + inc/lang/th/password.txt | 6 + inc/lang/th/preview.txt | 3 + inc/lang/th/pwconfirm.txt | 9 + inc/lang/th/read.txt | 1 + inc/lang/th/recent.txt | 3 + inc/lang/th/register.txt | 3 + inc/lang/th/registermail.txt | 10 + inc/lang/th/resendpwd.txt | 3 + inc/lang/th/revisions.txt | 3 + inc/lang/th/searchpage.txt | 3 + inc/lang/th/showrev.txt | 2 + inc/lang/th/updateprofile.txt | 3 + inc/lang/th/uploadmail.txt | 10 + inc/lang/tr/admin.txt | 3 + inc/lang/tr/adminplugins.txt | 1 + inc/lang/tr/backlinks.txt | 3 + inc/lang/tr/conflict.txt | 5 + inc/lang/tr/denied.txt | 3 + inc/lang/tr/diff.txt | 3 + inc/lang/tr/draft.txt | 5 + inc/lang/tr/edit.txt | 1 + inc/lang/tr/editrev.txt | 2 + inc/lang/tr/index.txt | 3 + inc/lang/tr/install.html | 7 + inc/lang/tr/jquery.ui.datepicker.js | 40 + inc/lang/tr/lang.php | 364 + inc/lang/tr/locked.txt | 3 + inc/lang/tr/login.txt | 3 + inc/lang/tr/mailtext.txt | 12 + inc/lang/tr/newpage.txt | 3 + inc/lang/tr/norev.txt | 3 + inc/lang/tr/password.txt | 7 + inc/lang/tr/preview.txt | 3 + inc/lang/tr/pwconfirm.txt | 9 + inc/lang/tr/read.txt | 1 + inc/lang/tr/recent.txt | 3 + inc/lang/tr/register.txt | 3 + inc/lang/tr/registermail.txt | 10 + inc/lang/tr/resendpwd.txt | 3 + inc/lang/tr/resetpwd.txt | 3 + inc/lang/tr/revisions.txt | 3 + inc/lang/tr/searchpage.txt | 3 + inc/lang/tr/showrev.txt | 2 + inc/lang/tr/stopwords.txt | 29 + inc/lang/tr/subscr_form.txt | 3 + inc/lang/tr/updateprofile.txt | 3 + inc/lang/tr/uploadmail.txt | 10 + inc/lang/uk/admin.txt | 3 + inc/lang/uk/adminplugins.txt | 1 + inc/lang/uk/backlinks.txt | 3 + inc/lang/uk/conflict.txt | 7 + inc/lang/uk/denied.txt | 3 + inc/lang/uk/diff.txt | 3 + inc/lang/uk/draft.txt | 5 + inc/lang/uk/edit.txt | 1 + inc/lang/uk/editrev.txt | 2 + inc/lang/uk/index.txt | 3 + inc/lang/uk/install.html | 7 + inc/lang/uk/jquery.ui.datepicker.js | 41 + inc/lang/uk/lang.php | 378 + inc/lang/uk/locked.txt | 3 + inc/lang/uk/login.txt | 3 + inc/lang/uk/mailtext.txt | 12 + inc/lang/uk/newpage.txt | 3 + inc/lang/uk/norev.txt | 3 + inc/lang/uk/password.txt | 6 + inc/lang/uk/preview.txt | 3 + inc/lang/uk/pwconfirm.txt | 9 + inc/lang/uk/read.txt | 1 + inc/lang/uk/recent.txt | 3 + inc/lang/uk/register.txt | 3 + inc/lang/uk/registermail.txt | 10 + inc/lang/uk/resendpwd.txt | 3 + inc/lang/uk/resetpwd.txt | 3 + inc/lang/uk/revisions.txt | 3 + inc/lang/uk/searchpage.txt | 3 + inc/lang/uk/showrev.txt | 2 + inc/lang/uk/stopwords.txt | 4 + inc/lang/uk/subscr_digest.txt | 14 + inc/lang/uk/subscr_form.txt | 3 + inc/lang/uk/subscr_list.txt | 11 + inc/lang/uk/subscr_single.txt | 17 + inc/lang/uk/updateprofile.txt | 3 + inc/lang/uk/uploadmail.txt | 10 + inc/lang/uz/admin.txt | 1 + inc/lang/uz/adminplugins.txt | 1 + inc/lang/uz/conflict.txt | 1 + inc/lang/uz/denied.txt | 1 + inc/lang/uz/diff.txt | 1 + inc/lang/uz/index.txt | 1 + inc/lang/uz/lang.php | 25 + inc/lang/vi/admin.txt | 3 + inc/lang/vi/adminplugins.txt | 1 + inc/lang/vi/backlinks.txt | 3 + inc/lang/vi/conflict.txt | 5 + inc/lang/vi/denied.txt | 3 + inc/lang/vi/diff.txt | 3 + inc/lang/vi/draft.txt | 5 + inc/lang/vi/edit.txt | 1 + inc/lang/vi/editrev.txt | 2 + inc/lang/vi/index.txt | 3 + inc/lang/vi/jquery.ui.datepicker.js | 40 + inc/lang/vi/lang.php | 373 + inc/lang/vi/locked.txt | 3 + inc/lang/vi/login.txt | 3 + inc/lang/vi/mailtext.txt | 14 + inc/lang/vi/newpage.txt | 3 + inc/lang/vi/norev.txt | 3 + inc/lang/vi/onceexisted.txt | 3 + inc/lang/vi/password.txt | 6 + inc/lang/vi/preview.txt | 3 + inc/lang/vi/pwconfirm.txt | 9 + inc/lang/vi/read.txt | 1 + inc/lang/vi/recent.txt | 3 + inc/lang/vi/register.txt | 3 + inc/lang/vi/registermail.txt | 10 + inc/lang/vi/resendpwd.txt | 3 + inc/lang/vi/resetpwd.txt | 3 + inc/lang/vi/revisions.txt | 3 + inc/lang/vi/searchpage.txt | 3 + inc/lang/vi/showrev.txt | 2 + inc/lang/vi/stopwords.txt | 39 + inc/lang/vi/subscr_digest.txt | 16 + inc/lang/vi/subscr_form.txt | 3 + inc/lang/vi/subscr_list.txt | 13 + inc/lang/vi/subscr_single.txt | 19 + inc/lang/vi/updateprofile.txt | 3 + inc/lang/vi/uploadmail.txt | 11 + inc/lang/zh-tw/admin.txt | 3 + inc/lang/zh-tw/adminplugins.txt | 1 + inc/lang/zh-tw/backlinks.txt | 3 + inc/lang/zh-tw/conflict.txt | 5 + inc/lang/zh-tw/denied.txt | 3 + inc/lang/zh-tw/diff.txt | 3 + inc/lang/zh-tw/draft.txt | 5 + inc/lang/zh-tw/edit.txt | 1 + inc/lang/zh-tw/editrev.txt | 2 + inc/lang/zh-tw/index.txt | 3 + inc/lang/zh-tw/install.html | 7 + inc/lang/zh-tw/jquery.ui.datepicker.js | 40 + inc/lang/zh-tw/lang.php | 369 + inc/lang/zh-tw/locked.txt | 3 + inc/lang/zh-tw/login.txt | 3 + inc/lang/zh-tw/mailtext.txt | 12 + inc/lang/zh-tw/mailwrap.html | 13 + inc/lang/zh-tw/newpage.txt | 3 + inc/lang/zh-tw/norev.txt | 3 + inc/lang/zh-tw/onceexisted.txt | 3 + inc/lang/zh-tw/password.txt | 6 + inc/lang/zh-tw/preview.txt | 3 + inc/lang/zh-tw/pwconfirm.txt | 9 + inc/lang/zh-tw/read.txt | 1 + inc/lang/zh-tw/recent.txt | 3 + inc/lang/zh-tw/register.txt | 3 + inc/lang/zh-tw/registermail.txt | 10 + inc/lang/zh-tw/resendpwd.txt | 3 + inc/lang/zh-tw/resetpwd.txt | 3 + inc/lang/zh-tw/revisions.txt | 3 + inc/lang/zh-tw/searchpage.txt | 3 + inc/lang/zh-tw/showrev.txt | 2 + inc/lang/zh-tw/stopwords.txt | 31 + inc/lang/zh-tw/subscr_digest.txt | 15 + inc/lang/zh-tw/subscr_form.txt | 3 + inc/lang/zh-tw/subscr_list.txt | 12 + inc/lang/zh-tw/subscr_single.txt | 18 + inc/lang/zh-tw/updateprofile.txt | 3 + inc/lang/zh-tw/uploadmail.txt | 10 + inc/lang/zh/admin.txt | 3 + inc/lang/zh/adminplugins.txt | 1 + inc/lang/zh/backlinks.txt | 3 + inc/lang/zh/conflict.txt | 5 + inc/lang/zh/denied.txt | 3 + inc/lang/zh/diff.txt | 3 + inc/lang/zh/draft.txt | 5 + inc/lang/zh/edit.txt | 1 + inc/lang/zh/editrev.txt | 2 + inc/lang/zh/index.txt | 3 + inc/lang/zh/install.html | 7 + inc/lang/zh/jquery.ui.datepicker.js | 40 + inc/lang/zh/lang.php | 411 + inc/lang/zh/locked.txt | 3 + inc/lang/zh/login.txt | 3 + inc/lang/zh/mailtext.txt | 12 + inc/lang/zh/mailwrap.html | 13 + inc/lang/zh/newpage.txt | 3 + inc/lang/zh/norev.txt | 3 + inc/lang/zh/onceexisted.txt | 3 + inc/lang/zh/password.txt | 5 + inc/lang/zh/preview.txt | 3 + inc/lang/zh/pwconfirm.txt | 9 + inc/lang/zh/read.txt | 1 + inc/lang/zh/recent.txt | 3 + inc/lang/zh/register.txt | 3 + inc/lang/zh/registermail.txt | 10 + inc/lang/zh/resendpwd.txt | 3 + inc/lang/zh/resetpwd.txt | 3 + inc/lang/zh/revisions.txt | 3 + inc/lang/zh/searchpage.txt | 3 + inc/lang/zh/showrev.txt | 2 + inc/lang/zh/stopwords.txt | 29 + inc/lang/zh/subscr_digest.txt | 15 + inc/lang/zh/subscr_form.txt | 3 + inc/lang/zh/subscr_list.txt | 12 + inc/lang/zh/subscr_single.txt | 18 + inc/lang/zh/updateprofile.txt | 3 + inc/lang/zh/uploadmail.txt | 12 + inc/legacy.php | 21 + inc/load.php | 283 + inc/mail.php | 168 + inc/media.php | 2239 + inc/pageutils.php | 771 + inc/parser/code.php | 80 + inc/parser/handler.php | 1157 + inc/parser/metadata.php | 770 + inc/parser/parser.php | 92 + inc/parser/renderer.php | 987 + inc/parser/xhtml.php | 2064 + inc/parser/xhtmlsummary.php | 96 + inc/parserutils.php | 829 + inc/pluginutils.php | 152 + inc/preload.php.dist | 17 + inc/search.php | 588 + inc/template.php | 1912 + inc/toolbar.php | 282 + inc/utf8.php | 285 + index.php | 77 + lib/exe/ajax.php | 29 + lib/exe/css.php | 703 + lib/exe/detail.php | 46 + lib/exe/fetch.php | 127 + lib/exe/index.html | 11 + lib/exe/indexer.php | 7 + lib/exe/jquery.php | 45 + lib/exe/js.php | 340 + lib/exe/jsonrpc.php | 19 + lib/exe/manifest.php | 17 + lib/exe/mediamanager.php | 131 + lib/exe/openapi.php | 87 + lib/exe/opensearch.php | 37 + lib/exe/taskrunner.php | 20 + lib/exe/xmlrpc.php | 19 + lib/images/_deprecated.txt | 2 + lib/images/admin/acl.png | Bin 0 -> 1065 bytes lib/images/admin/config.png | Bin 0 -> 1484 bytes lib/images/admin/plugin.png | Bin 0 -> 1115 bytes lib/images/admin/popularity.png | Bin 0 -> 1172 bytes lib/images/admin/revert.png | Bin 0 -> 1295 bytes lib/images/admin/styling.png | Bin 0 -> 970 bytes lib/images/admin/usermanager.png | Bin 0 -> 1460 bytes lib/images/blank.gif | Bin 0 -> 42 bytes lib/images/bullet.png | Bin 0 -> 101 bytes lib/images/closed-rtl.png | Bin 0 -> 111 bytes lib/images/closed.png | Bin 0 -> 110 bytes lib/images/diff.png | Bin 0 -> 190 bytes lib/images/email.png | Bin 0 -> 370 bytes lib/images/email.svg | 1 + lib/images/error.png | Bin 0 -> 637 bytes lib/images/external-link.png | Bin 0 -> 431 bytes lib/images/external-link.svg | 1 + lib/images/fileicons/32x32/7z.png | Bin 0 -> 911 bytes lib/images/fileicons/32x32/asm.png | Bin 0 -> 955 bytes lib/images/fileicons/32x32/bash.png | Bin 0 -> 966 bytes lib/images/fileicons/32x32/bz2.png | Bin 0 -> 920 bytes lib/images/fileicons/32x32/c.png | Bin 0 -> 929 bytes lib/images/fileicons/32x32/cc.png | Bin 0 -> 933 bytes lib/images/fileicons/32x32/conf.png | Bin 0 -> 666 bytes lib/images/fileicons/32x32/cpp.png | Bin 0 -> 943 bytes lib/images/fileicons/32x32/cs.png | Bin 0 -> 944 bytes lib/images/fileicons/32x32/csh.png | Bin 0 -> 952 bytes lib/images/fileicons/32x32/css.png | Bin 0 -> 952 bytes lib/images/fileicons/32x32/csv.png | Bin 0 -> 663 bytes lib/images/fileicons/32x32/deb.png | Bin 0 -> 914 bytes lib/images/fileicons/32x32/diff.png | Bin 0 -> 942 bytes lib/images/fileicons/32x32/doc.png | Bin 0 -> 956 bytes lib/images/fileicons/32x32/docx.png | Bin 0 -> 970 bytes lib/images/fileicons/32x32/file.png | Bin 0 -> 543 bytes lib/images/fileicons/32x32/gif.png | Bin 0 -> 873 bytes lib/images/fileicons/32x32/gz.png | Bin 0 -> 914 bytes lib/images/fileicons/32x32/h.png | Bin 0 -> 884 bytes lib/images/fileicons/32x32/hpp.png | Bin 0 -> 942 bytes lib/images/fileicons/32x32/htm.png | Bin 0 -> 945 bytes lib/images/fileicons/32x32/html.png | Bin 0 -> 945 bytes lib/images/fileicons/32x32/ico.png | Bin 0 -> 865 bytes lib/images/fileicons/32x32/java.png | Bin 0 -> 961 bytes lib/images/fileicons/32x32/jpeg.png | Bin 0 -> 877 bytes lib/images/fileicons/32x32/jpg.png | Bin 0 -> 877 bytes lib/images/fileicons/32x32/js.png | Bin 0 -> 937 bytes lib/images/fileicons/32x32/json.png | Bin 0 -> 966 bytes lib/images/fileicons/32x32/lua.png | Bin 0 -> 941 bytes lib/images/fileicons/32x32/mp3.png | Bin 0 -> 896 bytes lib/images/fileicons/32x32/mp4.png | Bin 0 -> 1116 bytes lib/images/fileicons/32x32/odc.png | Bin 0 -> 946 bytes lib/images/fileicons/32x32/odf.png | Bin 0 -> 951 bytes lib/images/fileicons/32x32/odg.png | Bin 0 -> 949 bytes lib/images/fileicons/32x32/odi.png | Bin 0 -> 944 bytes lib/images/fileicons/32x32/odp.png | Bin 0 -> 949 bytes lib/images/fileicons/32x32/ods.png | Bin 0 -> 955 bytes lib/images/fileicons/32x32/odt.png | Bin 0 -> 949 bytes lib/images/fileicons/32x32/ogg.png | Bin 0 -> 885 bytes lib/images/fileicons/32x32/ogv.png | Bin 0 -> 1106 bytes lib/images/fileicons/32x32/pas.png | Bin 0 -> 945 bytes lib/images/fileicons/32x32/pdf.png | Bin 0 -> 1003 bytes lib/images/fileicons/32x32/php.png | Bin 0 -> 952 bytes lib/images/fileicons/32x32/pl.png | Bin 0 -> 936 bytes lib/images/fileicons/32x32/png.png | Bin 0 -> 877 bytes lib/images/fileicons/32x32/ppt.png | Bin 0 -> 850 bytes lib/images/fileicons/32x32/pptx.png | Bin 0 -> 866 bytes lib/images/fileicons/32x32/ps.png | Bin 0 -> 996 bytes lib/images/fileicons/32x32/py.png | Bin 0 -> 942 bytes lib/images/fileicons/32x32/rar.png | Bin 0 -> 914 bytes lib/images/fileicons/32x32/rb.png | Bin 0 -> 936 bytes lib/images/fileicons/32x32/rpm.png | Bin 0 -> 920 bytes lib/images/fileicons/32x32/rtf.png | Bin 0 -> 738 bytes lib/images/fileicons/32x32/sh.png | Bin 0 -> 941 bytes lib/images/fileicons/32x32/sql.png | Bin 0 -> 664 bytes lib/images/fileicons/32x32/svg.png | Bin 0 -> 980 bytes lib/images/fileicons/32x32/swf.png | Bin 0 -> 1173 bytes lib/images/fileicons/32x32/sxc.png | Bin 0 -> 964 bytes lib/images/fileicons/32x32/sxd.png | Bin 0 -> 965 bytes lib/images/fileicons/32x32/sxi.png | Bin 0 -> 962 bytes lib/images/fileicons/32x32/sxw.png | Bin 0 -> 968 bytes lib/images/fileicons/32x32/tar.png | Bin 0 -> 914 bytes lib/images/fileicons/32x32/tgz.png | Bin 0 -> 919 bytes lib/images/fileicons/32x32/txt.png | Bin 0 -> 661 bytes lib/images/fileicons/32x32/wav.png | Bin 0 -> 888 bytes lib/images/fileicons/32x32/webm.png | Bin 0 -> 1210 bytes lib/images/fileicons/32x32/xls.png | Bin 0 -> 1124 bytes lib/images/fileicons/32x32/xlsx.png | Bin 0 -> 1131 bytes lib/images/fileicons/32x32/xml.png | Bin 0 -> 560 bytes lib/images/fileicons/32x32/zip.png | Bin 0 -> 914 bytes lib/images/fileicons/7z.png | Bin 0 -> 375 bytes lib/images/fileicons/asm.png | Bin 0 -> 379 bytes lib/images/fileicons/bash.png | Bin 0 -> 378 bytes lib/images/fileicons/bz2.png | Bin 0 -> 378 bytes lib/images/fileicons/c.png | Bin 0 -> 369 bytes lib/images/fileicons/cc.png | Bin 0 -> 369 bytes lib/images/fileicons/conf.png | Bin 0 -> 370 bytes lib/images/fileicons/cpp.png | Bin 0 -> 377 bytes lib/images/fileicons/cs.png | Bin 0 -> 374 bytes lib/images/fileicons/csh.png | Bin 0 -> 378 bytes lib/images/fileicons/css.png | Bin 0 -> 374 bytes lib/images/fileicons/csv.png | Bin 0 -> 371 bytes lib/images/fileicons/deb.png | Bin 0 -> 376 bytes lib/images/fileicons/diff.png | Bin 0 -> 376 bytes lib/images/fileicons/doc.png | Bin 0 -> 372 bytes lib/images/fileicons/docx.png | Bin 0 -> 375 bytes lib/images/fileicons/file.png | Bin 0 -> 249 bytes lib/images/fileicons/gif.png | Bin 0 -> 374 bytes lib/images/fileicons/gz.png | Bin 0 -> 374 bytes lib/images/fileicons/h.png | Bin 0 -> 368 bytes lib/images/fileicons/hpp.png | Bin 0 -> 376 bytes lib/images/fileicons/htm.png | Bin 0 -> 375 bytes lib/images/fileicons/html.png | Bin 0 -> 375 bytes lib/images/fileicons/ico.png | Bin 0 -> 372 bytes lib/images/fileicons/index.php | 60 + lib/images/fileicons/java.png | Bin 0 -> 376 bytes lib/images/fileicons/jpeg.png | Bin 0 -> 376 bytes lib/images/fileicons/jpg.png | Bin 0 -> 376 bytes lib/images/fileicons/js.png | Bin 0 -> 374 bytes lib/images/fileicons/json.png | Bin 0 -> 379 bytes lib/images/fileicons/lua.png | Bin 0 -> 374 bytes lib/images/fileicons/mp3.png | Bin 0 -> 378 bytes lib/images/fileicons/mp4.png | Bin 0 -> 377 bytes lib/images/fileicons/odc.png | Bin 0 -> 369 bytes lib/images/fileicons/odf.png | Bin 0 -> 373 bytes lib/images/fileicons/odg.png | Bin 0 -> 370 bytes lib/images/fileicons/odi.png | Bin 0 -> 371 bytes lib/images/fileicons/odp.png | Bin 0 -> 374 bytes lib/images/fileicons/ods.png | Bin 0 -> 373 bytes lib/images/fileicons/odt.png | Bin 0 -> 372 bytes lib/images/fileicons/ogg.png | Bin 0 -> 373 bytes lib/images/fileicons/ogv.png | Bin 0 -> 376 bytes lib/images/fileicons/pas.png | Bin 0 -> 380 bytes lib/images/fileicons/pdf.png | Bin 0 -> 377 bytes lib/images/fileicons/php.png | Bin 0 -> 376 bytes lib/images/fileicons/pl.png | Bin 0 -> 372 bytes lib/images/fileicons/png.png | Bin 0 -> 375 bytes lib/images/fileicons/ppt.png | Bin 0 -> 375 bytes lib/images/fileicons/pptx.png | Bin 0 -> 375 bytes lib/images/fileicons/ps.png | Bin 0 -> 377 bytes lib/images/fileicons/py.png | Bin 0 -> 374 bytes lib/images/fileicons/rar.png | Bin 0 -> 377 bytes lib/images/fileicons/rb.png | Bin 0 -> 375 bytes lib/images/fileicons/rpm.png | Bin 0 -> 374 bytes lib/images/fileicons/rtf.png | Bin 0 -> 376 bytes lib/images/fileicons/sh.png | Bin 0 -> 375 bytes lib/images/fileicons/sql.png | Bin 0 -> 373 bytes lib/images/fileicons/svg.png | Bin 0 -> 437 bytes lib/images/fileicons/svg/7z.svg | 1 + lib/images/fileicons/svg/asm.svg | 1 + lib/images/fileicons/svg/bash.svg | 1 + lib/images/fileicons/svg/bz2.svg | 1 + lib/images/fileicons/svg/c.svg | 1 + lib/images/fileicons/svg/conf.svg | 1 + lib/images/fileicons/svg/cpp.svg | 1 + lib/images/fileicons/svg/cs.svg | 1 + lib/images/fileicons/svg/csh.svg | 1 + lib/images/fileicons/svg/css.svg | 1 + lib/images/fileicons/svg/csv.svg | 1 + lib/images/fileicons/svg/deb.svg | 1 + lib/images/fileicons/svg/doc.svg | 1 + lib/images/fileicons/svg/docx.svg | 1 + lib/images/fileicons/svg/file.svg | 1 + lib/images/fileicons/svg/gif.svg | 1 + lib/images/fileicons/svg/gz.svg | 1 + lib/images/fileicons/svg/h.svg | 1 + lib/images/fileicons/svg/htm.svg | 1 + lib/images/fileicons/svg/html.svg | 1 + lib/images/fileicons/svg/ico.svg | 1 + lib/images/fileicons/svg/index.php | 22 + lib/images/fileicons/svg/java.svg | 1 + lib/images/fileicons/svg/jpeg.svg | 1 + lib/images/fileicons/svg/jpg.svg | 1 + lib/images/fileicons/svg/js.svg | 1 + lib/images/fileicons/svg/json.svg | 1 + lib/images/fileicons/svg/lua.svg | 1 + lib/images/fileicons/svg/mp3.svg | 1 + lib/images/fileicons/svg/mp4.svg | 1 + lib/images/fileicons/svg/ods.svg | 1 + lib/images/fileicons/svg/odt.svg | 1 + lib/images/fileicons/svg/ogg.svg | 1 + lib/images/fileicons/svg/ogv.svg | 1 + lib/images/fileicons/svg/pdf.svg | 1 + lib/images/fileicons/svg/php.svg | 1 + lib/images/fileicons/svg/pl.svg | 1 + lib/images/fileicons/svg/png.svg | 1 + lib/images/fileicons/svg/ppt.svg | 1 + lib/images/fileicons/svg/pptx.svg | 1 + lib/images/fileicons/svg/ps.svg | 1 + lib/images/fileicons/svg/py.svg | 1 + lib/images/fileicons/svg/rar.svg | 1 + lib/images/fileicons/svg/rb.svg | 1 + lib/images/fileicons/svg/rpm.svg | 1 + lib/images/fileicons/svg/rtf.svg | 1 + lib/images/fileicons/svg/sh.svg | 1 + lib/images/fileicons/svg/sql.svg | 1 + lib/images/fileicons/svg/svg.svg | 1 + lib/images/fileicons/svg/swf.svg | 1 + lib/images/fileicons/svg/tar.svg | 1 + lib/images/fileicons/svg/tgz.svg | 1 + lib/images/fileicons/svg/txt.svg | 1 + lib/images/fileicons/svg/wav.svg | 1 + lib/images/fileicons/svg/webm.svg | 1 + lib/images/fileicons/svg/xls.svg | 1 + lib/images/fileicons/svg/xlsx.svg | 1 + lib/images/fileicons/svg/xml.svg | 1 + lib/images/fileicons/svg/zip.svg | 1 + lib/images/fileicons/swf.png | Bin 0 -> 379 bytes lib/images/fileicons/sxc.png | Bin 0 -> 377 bytes lib/images/fileicons/sxd.png | Bin 0 -> 377 bytes lib/images/fileicons/sxi.png | Bin 0 -> 377 bytes lib/images/fileicons/sxw.png | Bin 0 -> 376 bytes lib/images/fileicons/tar.png | Bin 0 -> 377 bytes lib/images/fileicons/tgz.png | Bin 0 -> 377 bytes lib/images/fileicons/txt.png | Bin 0 -> 371 bytes lib/images/fileicons/wav.png | Bin 0 -> 375 bytes lib/images/fileicons/webm.png | Bin 0 -> 378 bytes lib/images/fileicons/xls.png | Bin 0 -> 378 bytes lib/images/fileicons/xlsx.png | Bin 0 -> 379 bytes lib/images/fileicons/xml.png | Bin 0 -> 376 bytes lib/images/fileicons/zip.png | Bin 0 -> 377 bytes lib/images/history.png | Bin 0 -> 149 bytes lib/images/icon-list.png | Bin 0 -> 584 bytes lib/images/icon-sort.png | Bin 0 -> 211 bytes lib/images/index.html | 11 + lib/images/info.png | Bin 0 -> 721 bytes lib/images/interwiki.png | Bin 0 -> 442 bytes lib/images/interwiki.svg | 1 + lib/images/interwiki/amazon.de.svg | 1 + lib/images/interwiki/amazon.svg | 1 + lib/images/interwiki/amazon.uk.svg | 1 + lib/images/interwiki/callto.svg | 1 + lib/images/interwiki/doku.svg | 1 + lib/images/interwiki/google.svg | 1 + lib/images/interwiki/paypal.svg | 1 + lib/images/interwiki/phpfn.svg | 1 + lib/images/interwiki/skype.svg | 1 + lib/images/interwiki/tel.svg | 1 + lib/images/interwiki/user.svg | 1 + lib/images/interwiki/wp.svg | 1 + lib/images/interwiki/wpde.svg | 1 + lib/images/interwiki/wpes.svg | 1 + lib/images/interwiki/wpfr.svg | 1 + lib/images/interwiki/wpjp.svg | 1 + lib/images/interwiki/wpmeta.svg | 1 + lib/images/interwiki/wppl.svg | 1 + lib/images/larger.gif | Bin 0 -> 87 bytes lib/images/license/badge/cc-by-nc-nd.png | Bin 0 -> 1456 bytes lib/images/license/badge/cc-by-nc-sa.png | Bin 0 -> 1567 bytes lib/images/license/badge/cc-by-nc.png | Bin 0 -> 1401 bytes lib/images/license/badge/cc-by-nd.png | Bin 0 -> 1261 bytes lib/images/license/badge/cc-by-sa.png | Bin 0 -> 1407 bytes lib/images/license/badge/cc-by.png | Bin 0 -> 1186 bytes lib/images/license/badge/cc-zero.png | Bin 0 -> 1182 bytes lib/images/license/badge/cc.png | Bin 0 -> 846 bytes lib/images/license/badge/gnufdl.png | Bin 0 -> 1649 bytes lib/images/license/badge/publicdomain.png | Bin 0 -> 1326 bytes lib/images/license/button/cc-by-nc-nd.png | Bin 0 -> 391 bytes lib/images/license/button/cc-by-nc-sa.png | Bin 0 -> 396 bytes lib/images/license/button/cc-by-nc.png | Bin 0 -> 381 bytes lib/images/license/button/cc-by-nd.png | Bin 0 -> 382 bytes lib/images/license/button/cc-by-sa.png | Bin 0 -> 379 bytes lib/images/license/button/cc-by.png | Bin 0 -> 364 bytes lib/images/license/button/cc-zero.png | Bin 0 -> 381 bytes lib/images/license/button/cc.png | Bin 0 -> 391 bytes lib/images/license/button/gnufdl.png | Bin 0 -> 497 bytes lib/images/license/button/publicdomain.png | Bin 0 -> 364 bytes lib/images/magnifier.png | Bin 0 -> 565 bytes lib/images/media_align_center.png | Bin 0 -> 249 bytes lib/images/media_align_left.png | Bin 0 -> 247 bytes lib/images/media_align_noalign.png | Bin 0 -> 218 bytes lib/images/media_align_right.png | Bin 0 -> 250 bytes lib/images/media_link_direct.png | Bin 0 -> 714 bytes lib/images/media_link_displaylnk.png | Bin 0 -> 304 bytes lib/images/media_link_lnk.png | Bin 0 -> 578 bytes lib/images/media_link_nolnk.png | Bin 0 -> 452 bytes lib/images/media_size_large.png | Bin 0 -> 100 bytes lib/images/media_size_medium.png | Bin 0 -> 226 bytes lib/images/media_size_original.png | Bin 0 -> 210 bytes lib/images/media_size_small.png | Bin 0 -> 206 bytes lib/images/mediamanager.png | Bin 0 -> 455 bytes ...-default_checkbox-blank-circle-outline.svg | 1 + lib/images/menu/01-edit_pencil.svg | 1 + lib/images/menu/02-create_pencil.svg | 1 + lib/images/menu/03-draft_android-studio.svg | 1 + lib/images/menu/04-show_file-document.svg | 1 + lib/images/menu/05-source_file-xml.svg | 1 + lib/images/menu/06-revert_replay.svg | 1 + lib/images/menu/07-revisions_history.svg | 1 + lib/images/menu/08-backlink_link-variant.svg | 1 + .../menu/09-subscribe_email-outline.svg | 1 + lib/images/menu/10-top_arrow-up.svg | 1 + .../menu/11-mediamanager_folder-image.svg | 1 + lib/images/menu/12-back_arrow-left.svg | 1 + lib/images/menu/account-card-details.svg | 1 + lib/images/menu/account-plus.svg | 1 + lib/images/menu/calendar-clock.svg | 1 + lib/images/menu/file-tree.svg | 1 + lib/images/menu/folder-multiple-image.svg | 1 + lib/images/menu/lock-reset.svg | 1 + lib/images/menu/login.svg | 1 + lib/images/menu/logout.svg | 1 + lib/images/menu/settings.svg | 1 + lib/images/minus.gif | Bin 0 -> 85 bytes lib/images/notify.png | Bin 0 -> 735 bytes lib/images/ns.png | Bin 0 -> 799 bytes lib/images/open.png | Bin 0 -> 107 bytes lib/images/page.png | Bin 0 -> 582 bytes lib/images/plus.gif | Bin 0 -> 88 bytes lib/images/resizecol.png | Bin 0 -> 148 bytes lib/images/smaller.gif | Bin 0 -> 86 bytes lib/images/smileys/biggrin.svg | 1 + lib/images/smileys/confused.svg | 1 + lib/images/smileys/cool.svg | 1 + lib/images/smileys/deleteme.svg | 6 + lib/images/smileys/doubt.svg | 1 + lib/images/smileys/doubt2.svg | 1 + lib/images/smileys/eek.svg | 1 + lib/images/smileys/exclaim.svg | 4 + lib/images/smileys/facepalm.svg | 1 + lib/images/smileys/fixme.svg | 5 + lib/images/smileys/fun.svg | 1 + lib/images/smileys/index.php | 53 + lib/images/smileys/lol.svg | 1 + lib/images/smileys/neutral.svg | 1 + lib/images/smileys/question.svg | 4 + lib/images/smileys/razz.svg | 1 + lib/images/smileys/sad.svg | 1 + lib/images/smileys/silenced.svg | 1 + lib/images/smileys/smile.svg | 1 + lib/images/smileys/smile2.svg | 1 + lib/images/smileys/surprised.svg | 1 + lib/images/smileys/wink.svg | 1 + lib/images/success.png | Bin 0 -> 725 bytes lib/images/throbber.gif | Bin 0 -> 746 bytes lib/images/toolbar/bold.png | Bin 0 -> 249 bytes lib/images/toolbar/chars.png | Bin 0 -> 493 bytes lib/images/toolbar/h.png | Bin 0 -> 257 bytes lib/images/toolbar/h1.png | Bin 0 -> 287 bytes lib/images/toolbar/h2.png | Bin 0 -> 319 bytes lib/images/toolbar/h3.png | Bin 0 -> 320 bytes lib/images/toolbar/h4.png | Bin 0 -> 310 bytes lib/images/toolbar/h5.png | Bin 0 -> 318 bytes lib/images/toolbar/hequal.png | Bin 0 -> 306 bytes lib/images/toolbar/hminus.png | Bin 0 -> 403 bytes lib/images/toolbar/hplus.png | Bin 0 -> 391 bytes lib/images/toolbar/hr.png | Bin 0 -> 251 bytes lib/images/toolbar/image.png | Bin 0 -> 539 bytes lib/images/toolbar/italic.png | Bin 0 -> 239 bytes lib/images/toolbar/link.png | Bin 0 -> 402 bytes lib/images/toolbar/linkextern.png | Bin 0 -> 902 bytes lib/images/toolbar/mono.png | Bin 0 -> 293 bytes lib/images/toolbar/ol.png | Bin 0 -> 302 bytes lib/images/toolbar/sig.png | Bin 0 -> 471 bytes lib/images/toolbar/smiley.png | Bin 0 -> 680 bytes lib/images/toolbar/strike.png | Bin 0 -> 316 bytes lib/images/toolbar/ul.png | Bin 0 -> 288 bytes lib/images/toolbar/underline.png | Bin 0 -> 297 bytes lib/images/trash.png | Bin 0 -> 423 bytes lib/images/unc.png | Bin 0 -> 290 bytes lib/images/unc.svg | 1 + lib/images/up.png | Bin 0 -> 248 bytes lib/images/wrap.gif | Bin 0 -> 86 bytes lib/index.html | 11 + lib/plugins/acl/action.php | 89 + lib/plugins/acl/admin.php | 874 + lib/plugins/acl/admin.svg | 1 + lib/plugins/acl/lang/af/lang.php | 10 + lib/plugins/acl/lang/ar/help.txt | 11 + lib/plugins/acl/lang/ar/lang.php | 37 + lib/plugins/acl/lang/bg/help.txt | 9 + lib/plugins/acl/lang/bg/lang.php | 37 + lib/plugins/acl/lang/ca-valencia/help.txt | 15 + lib/plugins/acl/lang/ca-valencia/lang.php | 37 + lib/plugins/acl/lang/ca/help.txt | 11 + lib/plugins/acl/lang/ca/lang.php | 37 + lib/plugins/acl/lang/ckb/help.txt | 8 + lib/plugins/acl/lang/ckb/lang.php | 35 + lib/plugins/acl/lang/cs/help.txt | 8 + lib/plugins/acl/lang/cs/lang.php | 43 + lib/plugins/acl/lang/cy/help.txt | 10 + lib/plugins/acl/lang/cy/lang.php | 47 + lib/plugins/acl/lang/da/help.txt | 11 + lib/plugins/acl/lang/da/lang.php | 45 + lib/plugins/acl/lang/de-informal/help.txt | 11 + lib/plugins/acl/lang/de-informal/lang.php | 43 + lib/plugins/acl/lang/de/help.txt | 11 + lib/plugins/acl/lang/de/lang.php | 53 + lib/plugins/acl/lang/el/help.txt | 10 + lib/plugins/acl/lang/el/lang.php | 43 + lib/plugins/acl/lang/en/help.txt | 9 + lib/plugins/acl/lang/en/lang.php | 46 + lib/plugins/acl/lang/eo/help.txt | 11 + lib/plugins/acl/lang/eo/lang.php | 38 + lib/plugins/acl/lang/es/help.txt | 11 + lib/plugins/acl/lang/es/lang.php | 54 + lib/plugins/acl/lang/et/help.txt | 9 + lib/plugins/acl/lang/et/lang.php | 37 + lib/plugins/acl/lang/eu/help.txt | 11 + lib/plugins/acl/lang/eu/lang.php | 36 + lib/plugins/acl/lang/fa/help.txt | 11 + lib/plugins/acl/lang/fa/lang.php | 40 + lib/plugins/acl/lang/fi/help.txt | 11 + lib/plugins/acl/lang/fi/lang.php | 37 + lib/plugins/acl/lang/fr/help.txt | 9 + lib/plugins/acl/lang/fr/lang.php | 56 + lib/plugins/acl/lang/gl/help.txt | 11 + lib/plugins/acl/lang/gl/lang.php | 36 + lib/plugins/acl/lang/he/help.txt | 11 + lib/plugins/acl/lang/he/lang.php | 36 + lib/plugins/acl/lang/hr/help.txt | 11 + lib/plugins/acl/lang/hr/lang.php | 37 + lib/plugins/acl/lang/hu/help.txt | 12 + lib/plugins/acl/lang/hu/lang.php | 39 + lib/plugins/acl/lang/ia/help.txt | 11 + lib/plugins/acl/lang/ia/lang.php | 35 + lib/plugins/acl/lang/id/lang.php | 21 + lib/plugins/acl/lang/is/lang.php | 18 + lib/plugins/acl/lang/it/help.txt | 11 + lib/plugins/acl/lang/it/lang.php | 41 + lib/plugins/acl/lang/ja/help.txt | 8 + lib/plugins/acl/lang/ja/lang.php | 41 + lib/plugins/acl/lang/kk/lang.php | 10 + lib/plugins/acl/lang/km/lang.php | 8 + lib/plugins/acl/lang/ko/help.txt | 8 + lib/plugins/acl/lang/ko/lang.php | 44 + lib/plugins/acl/lang/la/help.txt | 11 + lib/plugins/acl/lang/la/lang.php | 34 + lib/plugins/acl/lang/lb/help.txt | 11 + lib/plugins/acl/lang/lt/lang.php | 22 + lib/plugins/acl/lang/lv/help.txt | 11 + lib/plugins/acl/lang/lv/lang.php | 35 + lib/plugins/acl/lang/mk/lang.php | 22 + lib/plugins/acl/lang/mr/help.txt | 12 + lib/plugins/acl/lang/mr/lang.php | 37 + lib/plugins/acl/lang/ne/lang.php | 28 + lib/plugins/acl/lang/nl/help.txt | 8 + lib/plugins/acl/lang/nl/lang.php | 48 + lib/plugins/acl/lang/no/help.txt | 11 + lib/plugins/acl/lang/no/lang.php | 48 + lib/plugins/acl/lang/pl/help.txt | 11 + lib/plugins/acl/lang/pl/lang.php | 45 + lib/plugins/acl/lang/pt-br/help.txt | 11 + lib/plugins/acl/lang/pt-br/lang.php | 49 + lib/plugins/acl/lang/pt/help.txt | 8 + lib/plugins/acl/lang/pt/lang.php | 41 + lib/plugins/acl/lang/ro/help.txt | 11 + lib/plugins/acl/lang/ro/lang.php | 38 + lib/plugins/acl/lang/ru/help.txt | 8 + lib/plugins/acl/lang/ru/lang.php | 46 + lib/plugins/acl/lang/sk/help.txt | 11 + lib/plugins/acl/lang/sk/lang.php | 38 + lib/plugins/acl/lang/sl/help.txt | 11 + lib/plugins/acl/lang/sl/lang.php | 38 + lib/plugins/acl/lang/sq/help.txt | 11 + lib/plugins/acl/lang/sq/lang.php | 37 + lib/plugins/acl/lang/sr/help.txt | 11 + lib/plugins/acl/lang/sr/lang.php | 37 + lib/plugins/acl/lang/sv/help.txt | 8 + lib/plugins/acl/lang/sv/lang.php | 43 + lib/plugins/acl/lang/th/help.txt | 11 + lib/plugins/acl/lang/th/lang.php | 27 + lib/plugins/acl/lang/tr/help.txt | 11 + lib/plugins/acl/lang/tr/lang.php | 40 + lib/plugins/acl/lang/uk/help.txt | 11 + lib/plugins/acl/lang/uk/lang.php | 37 + lib/plugins/acl/lang/vi/help.txt | 8 + lib/plugins/acl/lang/vi/lang.php | 36 + lib/plugins/acl/lang/zh-tw/help.txt | 11 + lib/plugins/acl/lang/zh-tw/lang.php | 42 + lib/plugins/acl/lang/zh/help.txt | 11 + lib/plugins/acl/lang/zh/lang.php | 42 + lib/plugins/acl/pix/group.png | Bin 0 -> 699 bytes lib/plugins/acl/pix/ns.png | Bin 0 -> 799 bytes lib/plugins/acl/pix/page.png | Bin 0 -> 582 bytes lib/plugins/acl/pix/user.png | Bin 0 -> 650 bytes lib/plugins/acl/plugin.info.txt | 7 + lib/plugins/acl/remote.php | 75 + lib/plugins/acl/script.js | 121 + lib/plugins/acl/style.css | 135 + lib/plugins/action.php | 9 + lib/plugins/admin.php | 9 + lib/plugins/auth.php | 9 + lib/plugins/authad/action.php | 94 + lib/plugins/authad/adLDAP/adLDAP.php | 949 + .../authad/adLDAP/classes/adLDAPComputers.php | 153 + .../authad/adLDAP/classes/adLDAPContacts.php | 296 + .../authad/adLDAP/classes/adLDAPExchange.php | 390 + .../authad/adLDAP/classes/adLDAPFolders.php | 179 + .../authad/adLDAP/classes/adLDAPGroups.php | 633 + .../authad/adLDAP/classes/adLDAPUsers.php | 684 + .../authad/adLDAP/classes/adLDAPUtils.php | 268 + .../adLDAP/collections/adLDAPCollection.php | 137 + .../collections/adLDAPComputerCollection.php | 46 + .../collections/adLDAPContactCollection.php | 46 + .../collections/adLDAPGroupCollection.php | 46 + .../collections/adLDAPUserCollection.php | 46 + lib/plugins/authad/auth.php | 804 + lib/plugins/authad/conf/default.php | 19 + lib/plugins/authad/conf/metadata.php | 19 + lib/plugins/authad/lang/ar/lang.php | 15 + lib/plugins/authad/lang/ar/settings.php | 26 + lib/plugins/authad/lang/bg/lang.php | 8 + lib/plugins/authad/lang/bg/settings.php | 21 + lib/plugins/authad/lang/ca/lang.php | 14 + lib/plugins/authad/lang/ca/settings.php | 31 + lib/plugins/authad/lang/ckb/lang.php | 14 + lib/plugins/authad/lang/ckb/settings.php | 23 + lib/plugins/authad/lang/cs/lang.php | 13 + lib/plugins/authad/lang/cs/settings.php | 29 + lib/plugins/authad/lang/cy/lang.php | 16 + lib/plugins/authad/lang/cy/settings.php | 15 + lib/plugins/authad/lang/da/lang.php | 13 + lib/plugins/authad/lang/da/settings.php | 25 + lib/plugins/authad/lang/de-informal/lang.php | 13 + .../authad/lang/de-informal/settings.php | 28 + lib/plugins/authad/lang/de/lang.php | 14 + lib/plugins/authad/lang/de/settings.php | 30 + lib/plugins/authad/lang/el/lang.php | 13 + lib/plugins/authad/lang/el/settings.php | 24 + lib/plugins/authad/lang/en/lang.php | 15 + lib/plugins/authad/lang/en/settings.php | 19 + lib/plugins/authad/lang/eo/lang.php | 15 + lib/plugins/authad/lang/eo/settings.php | 26 + lib/plugins/authad/lang/es/lang.php | 15 + lib/plugins/authad/lang/es/settings.php | 30 + lib/plugins/authad/lang/et/lang.php | 8 + lib/plugins/authad/lang/eu/lang.php | 10 + lib/plugins/authad/lang/eu/settings.php | 13 + lib/plugins/authad/lang/fa/lang.php | 14 + lib/plugins/authad/lang/fa/settings.php | 24 + lib/plugins/authad/lang/fi/lang.php | 8 + lib/plugins/authad/lang/fi/settings.php | 9 + lib/plugins/authad/lang/fr/lang.php | 15 + lib/plugins/authad/lang/fr/settings.php | 28 + lib/plugins/authad/lang/gl/lang.php | 8 + lib/plugins/authad/lang/he/lang.php | 10 + lib/plugins/authad/lang/he/settings.php | 8 + lib/plugins/authad/lang/hr/lang.php | 12 + lib/plugins/authad/lang/hr/settings.php | 22 + lib/plugins/authad/lang/hu/lang.php | 13 + lib/plugins/authad/lang/hu/settings.php | 26 + lib/plugins/authad/lang/it/lang.php | 13 + lib/plugins/authad/lang/it/settings.php | 27 + lib/plugins/authad/lang/ja/lang.php | 15 + lib/plugins/authad/lang/ja/settings.php | 26 + lib/plugins/authad/lang/ka/lang.php | 8 + lib/plugins/authad/lang/ko/lang.php | 13 + lib/plugins/authad/lang/ko/settings.php | 23 + lib/plugins/authad/lang/lv/lang.php | 13 + lib/plugins/authad/lang/lv/settings.php | 13 + lib/plugins/authad/lang/nl/lang.php | 15 + lib/plugins/authad/lang/nl/settings.php | 25 + lib/plugins/authad/lang/no/lang.php | 16 + lib/plugins/authad/lang/no/settings.php | 26 + lib/plugins/authad/lang/pl/lang.php | 13 + lib/plugins/authad/lang/pl/settings.php | 36 + lib/plugins/authad/lang/pt-br/lang.php | 14 + lib/plugins/authad/lang/pt-br/settings.php | 28 + lib/plugins/authad/lang/pt/lang.php | 16 + lib/plugins/authad/lang/pt/settings.php | 31 + lib/plugins/authad/lang/ro/lang.php | 11 + lib/plugins/authad/lang/ro/settings.php | 8 + lib/plugins/authad/lang/ru/lang.php | 15 + lib/plugins/authad/lang/ru/settings.php | 33 + lib/plugins/authad/lang/sk/lang.php | 12 + lib/plugins/authad/lang/sk/settings.php | 22 + lib/plugins/authad/lang/sl/lang.php | 8 + lib/plugins/authad/lang/sl/settings.php | 11 + lib/plugins/authad/lang/sr/lang.php | 12 + lib/plugins/authad/lang/sr/settings.php | 24 + lib/plugins/authad/lang/sv/lang.php | 13 + lib/plugins/authad/lang/sv/settings.php | 27 + lib/plugins/authad/lang/tr/lang.php | 12 + lib/plugins/authad/lang/tr/settings.php | 15 + lib/plugins/authad/lang/uk/lang.php | 14 + lib/plugins/authad/lang/uk/settings.php | 19 + lib/plugins/authad/lang/vi/lang.php | 12 + lib/plugins/authad/lang/vi/settings.php | 25 + lib/plugins/authad/lang/zh-tw/lang.php | 10 + lib/plugins/authad/lang/zh-tw/settings.php | 21 + lib/plugins/authad/lang/zh/lang.php | 14 + lib/plugins/authad/lang/zh/settings.php | 29 + lib/plugins/authad/plugin.info.txt | 7 + lib/plugins/authldap/auth.php | 703 + lib/plugins/authldap/conf/default.php | 23 + lib/plugins/authldap/conf/metadata.php | 23 + lib/plugins/authldap/lang/ar/lang.php | 9 + lib/plugins/authldap/lang/ar/settings.php | 34 + lib/plugins/authldap/lang/bg/settings.php | 20 + lib/plugins/authldap/lang/ca/lang.php | 9 + lib/plugins/authldap/lang/ca/settings.php | 37 + lib/plugins/authldap/lang/ckb/lang.php | 9 + lib/plugins/authldap/lang/ckb/settings.php | 33 + lib/plugins/authldap/lang/cs/lang.php | 9 + lib/plugins/authldap/lang/cs/settings.php | 36 + lib/plugins/authldap/lang/cy/lang.php | 11 + lib/plugins/authldap/lang/cy/settings.php | 29 + lib/plugins/authldap/lang/da/lang.php | 10 + lib/plugins/authldap/lang/da/settings.php | 36 + .../authldap/lang/de-informal/lang.php | 9 + .../authldap/lang/de-informal/settings.php | 37 + lib/plugins/authldap/lang/de/lang.php | 10 + lib/plugins/authldap/lang/de/settings.php | 38 + lib/plugins/authldap/lang/el/lang.php | 9 + lib/plugins/authldap/lang/el/settings.php | 32 + lib/plugins/authldap/lang/en/lang.php | 11 + lib/plugins/authldap/lang/en/settings.php | 30 + lib/plugins/authldap/lang/eo/lang.php | 9 + lib/plugins/authldap/lang/eo/settings.php | 34 + lib/plugins/authldap/lang/es/lang.php | 10 + lib/plugins/authldap/lang/es/settings.php | 37 + lib/plugins/authldap/lang/et/settings.php | 9 + lib/plugins/authldap/lang/eu/lang.php | 8 + lib/plugins/authldap/lang/eu/settings.php | 11 + lib/plugins/authldap/lang/fa/lang.php | 9 + lib/plugins/authldap/lang/fa/settings.php | 39 + lib/plugins/authldap/lang/fi/settings.php | 11 + lib/plugins/authldap/lang/fr/lang.php | 9 + lib/plugins/authldap/lang/fr/settings.php | 37 + lib/plugins/authldap/lang/he/settings.php | 14 + lib/plugins/authldap/lang/hr/lang.php | 9 + lib/plugins/authldap/lang/hr/settings.php | 32 + lib/plugins/authldap/lang/hu/lang.php | 9 + lib/plugins/authldap/lang/hu/settings.php | 33 + lib/plugins/authldap/lang/it/lang.php | 9 + lib/plugins/authldap/lang/it/settings.php | 37 + lib/plugins/authldap/lang/ja/lang.php | 9 + lib/plugins/authldap/lang/ja/settings.php | 38 + lib/plugins/authldap/lang/ko/lang.php | 9 + lib/plugins/authldap/lang/ko/settings.php | 32 + lib/plugins/authldap/lang/lv/settings.php | 9 + lib/plugins/authldap/lang/nl/lang.php | 9 + lib/plugins/authldap/lang/nl/settings.php | 36 + lib/plugins/authldap/lang/no/lang.php | 9 + lib/plugins/authldap/lang/no/settings.php | 34 + lib/plugins/authldap/lang/pl/lang.php | 9 + lib/plugins/authldap/lang/pl/settings.php | 36 + lib/plugins/authldap/lang/pt-br/lang.php | 9 + lib/plugins/authldap/lang/pt-br/settings.php | 36 + lib/plugins/authldap/lang/pt/lang.php | 9 + lib/plugins/authldap/lang/pt/settings.php | 39 + lib/plugins/authldap/lang/ru/lang.php | 9 + lib/plugins/authldap/lang/ru/settings.php | 38 + lib/plugins/authldap/lang/sk/lang.php | 9 + lib/plugins/authldap/lang/sk/settings.php | 33 + lib/plugins/authldap/lang/sl/settings.php | 10 + lib/plugins/authldap/lang/sr/lang.php | 9 + lib/plugins/authldap/lang/sr/settings.php | 26 + lib/plugins/authldap/lang/sv/lang.php | 9 + lib/plugins/authldap/lang/sv/settings.php | 34 + lib/plugins/authldap/lang/tr/lang.php | 8 + lib/plugins/authldap/lang/tr/settings.php | 8 + lib/plugins/authldap/lang/uk/lang.php | 10 + lib/plugins/authldap/lang/uk/settings.php | 23 + lib/plugins/authldap/lang/vi/lang.php | 9 + lib/plugins/authldap/lang/vi/settings.php | 33 + lib/plugins/authldap/lang/zh-tw/settings.php | 26 + lib/plugins/authldap/lang/zh/lang.php | 9 + lib/plugins/authldap/lang/zh/settings.php | 38 + lib/plugins/authldap/plugin.info.txt | 7 + lib/plugins/authpdo/auth.php | 787 + lib/plugins/authpdo/conf/default.php | 119 + lib/plugins/authpdo/conf/metadata.php | 26 + lib/plugins/authpdo/lang/ar/lang.php | 10 + lib/plugins/authpdo/lang/ar/settings.php | 13 + lib/plugins/authpdo/lang/bg/lang.php | 9 + lib/plugins/authpdo/lang/ca/lang.php | 10 + lib/plugins/authpdo/lang/ca/settings.php | 10 + lib/plugins/authpdo/lang/ckb/lang.php | 10 + lib/plugins/authpdo/lang/ckb/settings.php | 25 + lib/plugins/authpdo/lang/cs/lang.php | 10 + lib/plugins/authpdo/lang/cs/settings.php | 25 + lib/plugins/authpdo/lang/cy/lang.php | 12 + lib/plugins/authpdo/lang/da/lang.php | 10 + lib/plugins/authpdo/lang/da/settings.php | 25 + lib/plugins/authpdo/lang/de-informal/lang.php | 10 + .../authpdo/lang/de-informal/settings.php | 25 + lib/plugins/authpdo/lang/de/lang.php | 12 + lib/plugins/authpdo/lang/de/settings.php | 25 + lib/plugins/authpdo/lang/el/lang.php | 10 + lib/plugins/authpdo/lang/el/settings.php | 25 + lib/plugins/authpdo/lang/en/lang.php | 12 + lib/plugins/authpdo/lang/en/settings.php | 25 + lib/plugins/authpdo/lang/eo/lang.php | 10 + lib/plugins/authpdo/lang/eo/settings.php | 12 + lib/plugins/authpdo/lang/es/lang.php | 10 + lib/plugins/authpdo/lang/es/settings.php | 25 + lib/plugins/authpdo/lang/fa/lang.php | 11 + lib/plugins/authpdo/lang/fa/settings.php | 25 + lib/plugins/authpdo/lang/fr/lang.php | 10 + lib/plugins/authpdo/lang/fr/settings.php | 25 + lib/plugins/authpdo/lang/hr/lang.php | 10 + lib/plugins/authpdo/lang/hu/lang.php | 10 + lib/plugins/authpdo/lang/hu/settings.php | 23 + lib/plugins/authpdo/lang/it/lang.php | 10 + lib/plugins/authpdo/lang/it/settings.php | 26 + lib/plugins/authpdo/lang/ja/lang.php | 11 + lib/plugins/authpdo/lang/ja/settings.php | 25 + lib/plugins/authpdo/lang/ko/lang.php | 11 + lib/plugins/authpdo/lang/ko/settings.php | 31 + lib/plugins/authpdo/lang/nl/lang.php | 10 + lib/plugins/authpdo/lang/nl/settings.php | 26 + lib/plugins/authpdo/lang/pl/lang.php | 10 + lib/plugins/authpdo/lang/pl/settings.php | 28 + lib/plugins/authpdo/lang/pt-br/lang.php | 10 + lib/plugins/authpdo/lang/pt-br/settings.php | 25 + lib/plugins/authpdo/lang/pt/lang.php | 12 + lib/plugins/authpdo/lang/pt/settings.php | 26 + lib/plugins/authpdo/lang/ru/lang.php | 11 + lib/plugins/authpdo/lang/ru/settings.php | 26 + lib/plugins/authpdo/lang/sk/lang.php | 10 + lib/plugins/authpdo/lang/sk/settings.php | 25 + lib/plugins/authpdo/lang/sv/lang.php | 10 + lib/plugins/authpdo/lang/sv/settings.php | 23 + lib/plugins/authpdo/lang/tr/lang.php | 8 + lib/plugins/authpdo/lang/uk/lang.php | 10 + lib/plugins/authpdo/lang/uk/settings.php | 15 + lib/plugins/authpdo/lang/vi/lang.php | 10 + lib/plugins/authpdo/lang/vi/settings.php | 25 + lib/plugins/authpdo/lang/zh/lang.php | 10 + lib/plugins/authpdo/lang/zh/settings.php | 26 + lib/plugins/authpdo/plugin.info.txt | 7 + lib/plugins/authplain/auth.php | 489 + lib/plugins/authplain/lang/af/lang.php | 6 + lib/plugins/authplain/lang/ar/lang.php | 7 + lib/plugins/authplain/lang/az/lang.php | 7 + lib/plugins/authplain/lang/bg/lang.php | 9 + lib/plugins/authplain/lang/bn/lang.php | 7 + .../authplain/lang/ca-valencia/lang.php | 6 + lib/plugins/authplain/lang/ca/lang.php | 7 + lib/plugins/authplain/lang/ckb/lang.php | 11 + lib/plugins/authplain/lang/cs/lang.php | 12 + lib/plugins/authplain/lang/cy/lang.php | 8 + lib/plugins/authplain/lang/da/lang.php | 12 + .../authplain/lang/de-informal/lang.php | 11 + lib/plugins/authplain/lang/de/lang.php | 12 + lib/plugins/authplain/lang/el/lang.php | 11 + lib/plugins/authplain/lang/en/lang.php | 9 + lib/plugins/authplain/lang/eo/lang.php | 9 + lib/plugins/authplain/lang/es/lang.php | 12 + lib/plugins/authplain/lang/et/lang.php | 7 + lib/plugins/authplain/lang/eu/lang.php | 7 + lib/plugins/authplain/lang/fa/lang.php | 12 + lib/plugins/authplain/lang/fi/lang.php | 7 + lib/plugins/authplain/lang/fo/lang.php | 6 + lib/plugins/authplain/lang/fr/lang.php | 13 + lib/plugins/authplain/lang/gl/lang.php | 6 + lib/plugins/authplain/lang/he/lang.php | 7 + lib/plugins/authplain/lang/hr/lang.php | 11 + lib/plugins/authplain/lang/hu/lang.php | 12 + lib/plugins/authplain/lang/ia/lang.php | 6 + lib/plugins/authplain/lang/id-ni/lang.php | 6 + lib/plugins/authplain/lang/id/lang.php | 7 + lib/plugins/authplain/lang/is/lang.php | 7 + lib/plugins/authplain/lang/it/lang.php | 12 + lib/plugins/authplain/lang/ja/lang.php | 12 + lib/plugins/authplain/lang/ka/lang.php | 7 + lib/plugins/authplain/lang/kk/lang.php | 6 + lib/plugins/authplain/lang/km/lang.php | 7 + lib/plugins/authplain/lang/ko/lang.php | 11 + lib/plugins/authplain/lang/ku/lang.php | 7 + lib/plugins/authplain/lang/la/lang.php | 6 + lib/plugins/authplain/lang/lb/lang.php | 6 + lib/plugins/authplain/lang/lt/lang.php | 7 + lib/plugins/authplain/lang/lv/lang.php | 7 + lib/plugins/authplain/lang/mg/lang.php | 6 + lib/plugins/authplain/lang/mk/lang.php | 6 + lib/plugins/authplain/lang/mr/lang.php | 6 + lib/plugins/authplain/lang/ms/lang.php | 6 + lib/plugins/authplain/lang/ne/lang.php | 6 + lib/plugins/authplain/lang/nl/lang.php | 12 + lib/plugins/authplain/lang/no/lang.php | 11 + lib/plugins/authplain/lang/pl/lang.php | 11 + lib/plugins/authplain/lang/pt-br/lang.php | 12 + lib/plugins/authplain/lang/pt/lang.php | 13 + lib/plugins/authplain/lang/ro/lang.php | 7 + lib/plugins/authplain/lang/ru/lang.php | 13 + lib/plugins/authplain/lang/sk/lang.php | 11 + lib/plugins/authplain/lang/sl/lang.php | 7 + lib/plugins/authplain/lang/sq/lang.php | 7 + lib/plugins/authplain/lang/sr/lang.php | 7 + lib/plugins/authplain/lang/sv/lang.php | 12 + lib/plugins/authplain/lang/th/lang.php | 7 + lib/plugins/authplain/lang/tr/lang.php | 7 + lib/plugins/authplain/lang/uk/lang.php | 9 + lib/plugins/authplain/lang/vi/lang.php | 11 + lib/plugins/authplain/lang/zh-tw/lang.php | 7 + lib/plugins/authplain/lang/zh/lang.php | 12 + lib/plugins/authplain/plugin.info.txt | 7 + lib/plugins/bureaucracy/LICENSE | 339 + lib/plugins/bureaucracy/action.php | 60 + lib/plugins/bureaucracy/conf/default.php | 4 + lib/plugins/bureaucracy/conf/metadata.php | 5 + lib/plugins/bureaucracy/helper/action.php | 136 + lib/plugins/bureaucracy/helper/actionmail.php | 212 + .../bureaucracy/helper/actionscript.php | 62 + .../bureaucracy/helper/actiontemplate.php | 464 + lib/plugins/bureaucracy/helper/field.php | 508 + .../bureaucracy/helper/fieldaddpage.php | 63 + lib/plugins/bureaucracy/helper/fielddate.php | 42 + lib/plugins/bureaucracy/helper/fieldemail.php | 30 + .../bureaucracy/helper/fieldfieldset.php | 114 + lib/plugins/bureaucracy/helper/fieldfile.php | 75 + .../bureaucracy/helper/fieldhidden.php | 47 + .../bureaucracy/helper/fieldhiddenautoinc.php | 35 + .../bureaucracy/helper/fieldmultiselect.php | 62 + .../bureaucracy/helper/fieldnumber.php | 119 + lib/plugins/bureaucracy/helper/fieldonoff.php | 16 + .../bureaucracy/helper/fieldpassword.php | 29 + lib/plugins/bureaucracy/helper/fieldradio.php | 82 + .../bureaucracy/helper/fieldselect.php | 61 + .../bureaucracy/helper/fieldstatic.php | 60 + .../bureaucracy/helper/fieldsubject.php | 37 + .../bureaucracy/helper/fieldsubmit.php | 89 + .../bureaucracy/helper/fieldtextarea.php | 29 + .../bureaucracy/helper/fieldtextbox.php | 34 + lib/plugins/bureaucracy/helper/fieldtime.php | 42 + .../helper/fieldusemailtemplate.php | 62 + lib/plugins/bureaucracy/helper/fielduser.php | 99 + lib/plugins/bureaucracy/helper/fieldusers.php | 96 + lib/plugins/bureaucracy/helper/fieldwiki.php | 70 + lib/plugins/bureaucracy/helper/fieldyesno.php | 98 + .../bureaucracy_handler_interface.php | 19 + lib/plugins/bureaucracy/lang/cs/lang.php | 27 + lib/plugins/bureaucracy/lang/cs/settings.php | 4 + lib/plugins/bureaucracy/lang/de/lang.php | 38 + lib/plugins/bureaucracy/lang/de/settings.php | 8 + lib/plugins/bureaucracy/lang/en/lang.php | 40 + lib/plugins/bureaucracy/lang/en/settings.php | 5 + lib/plugins/bureaucracy/lang/es/lang.php | 38 + lib/plugins/bureaucracy/lang/es/settings.php | 9 + lib/plugins/bureaucracy/lang/fa/lang.php | 38 + lib/plugins/bureaucracy/lang/fa/settings.php | 9 + lib/plugins/bureaucracy/lang/fr/lang.php | 38 + lib/plugins/bureaucracy/lang/fr/settings.php | 9 + lib/plugins/bureaucracy/lang/hr/lang.php | 38 + lib/plugins/bureaucracy/lang/hr/settings.php | 9 + lib/plugins/bureaucracy/lang/it/lang.php | 19 + lib/plugins/bureaucracy/lang/ja/lang.php | 38 + lib/plugins/bureaucracy/lang/ja/settings.php | 9 + lib/plugins/bureaucracy/lang/lv/lang.php | 30 + lib/plugins/bureaucracy/lang/nl/lang.php | 38 + lib/plugins/bureaucracy/lang/nl/settings.php | 9 + lib/plugins/bureaucracy/lang/no/lang.php | 39 + lib/plugins/bureaucracy/lang/no/settings.php | 5 + lib/plugins/bureaucracy/lang/pt-br/lang.php | 38 + .../bureaucracy/lang/pt-br/settings.php | 9 + lib/plugins/bureaucracy/lang/pt/lang.php | 39 + lib/plugins/bureaucracy/lang/pt/settings.php | 9 + lib/plugins/bureaucracy/lang/ru/lang.php | 39 + lib/plugins/bureaucracy/lang/ru/settings.php | 10 + lib/plugins/bureaucracy/lang/zh/lang.php | 39 + lib/plugins/bureaucracy/lang/zh/settings.php | 5 + lib/plugins/bureaucracy/manager.dat | 2 + lib/plugins/bureaucracy/plugin.info.txt | 8 + lib/plugins/bureaucracy/script.js | 3 + lib/plugins/bureaucracy/script/datepicker.js | 11 + lib/plugins/bureaucracy/script/fieldsets.js | 84 + lib/plugins/bureaucracy/script/user.js | 90 + lib/plugins/bureaucracy/style.css | 101 + lib/plugins/bureaucracy/syntax.php | 625 + lib/plugins/ckgedit/.gitignore | 1 + lib/plugins/ckgedit/LICENSE | 339 + lib/plugins/ckgedit/README.md | 14 + lib/plugins/ckgedit/action/delete.php | 29 + lib/plugins/ckgedit/action/edit.php | 1349 + lib/plugins/ckgedit/action/ent.ser | 1 + .../ckgedit/action/entities/ENTITIES.HOWTO | 55 + lib/plugins/ckgedit/action/entities/ent.ser | 1 + lib/plugins/ckgedit/action/entities/ents.data | 948 + .../ckgedit/action/entities/ents_seri.php | 61 + .../ckgedit/action/entities/fcked-ents.data | 842 + .../action/entities/utils/entities.conf | 27 + .../action/entities/utils/entities.html | 52 + .../ckgedit/action/entities/utils/entities.pl | 711 + .../action/entities/utils/entities.txt | 718 + .../action/entities/utils/fcked-ents.pl | 231 + .../action/entities/utils/fcked-ents.txt | 209 + .../action/entities/utils/fckeditor_ents.doc | Bin 0 -> 92672 bytes lib/plugins/ckgedit/action/iwiki.php | 45 + lib/plugins/ckgedit/action/mediamanager.php | 50 + lib/plugins/ckgedit/action/meta.php | 1033 + lib/plugins/ckgedit/action/save.php | 491 + lib/plugins/ckgedit/action/tagapi.php | 73 + lib/plugins/ckgedit/admin.php | 124 + lib/plugins/ckgedit/ckeditor/CHANGES.md | 1703 + lib/plugins/ckgedit/ckeditor/LICENSE.md | 1420 + lib/plugins/ckgedit/ckeditor/README.md | 39 + .../ckgedit/ckeditor/adapters/jquery.js | 10 + lib/plugins/ckgedit/ckeditor/additional.css | 8 + lib/plugins/ckgedit/ckeditor/build-config.js | 190 + lib/plugins/ckgedit/ckeditor/ckeditor.js | 1337 + lib/plugins/ckgedit/ckeditor/ckeditor.js.unc | 26722 ++++++++++ lib/plugins/ckgedit/ckeditor/config.js | 1 + lib/plugins/ckgedit/ckeditor/config.js.unc | 475 + .../ckgedit/ckeditor/contents-default.css | 504 + lib/plugins/ckgedit/ckeditor/contents.css | 1 + lib/plugins/ckgedit/ckeditor/contents.css.unc | 573 + .../ckgedit/ckeditor/css/additional.css | 8 + lib/plugins/ckgedit/ckeditor/dwsmileys.php | 10 + lib/plugins/ckgedit/ckeditor/get_headers.php | 84 + lib/plugins/ckgedit/ckeditor/get_version.php | 8 + lib/plugins/ckgedit/ckeditor/images/email.png | Bin 0 -> 659 bytes .../ckgedit/ckeditor/images/external-link.png | Bin 0 -> 816 bytes .../ckgedit/ckeditor/images/fileicons/7z.png | Bin 0 -> 415 bytes .../ckgedit/ckeditor/images/fileicons/asm.png | Bin 0 -> 427 bytes .../ckeditor/images/fileicons/audio.png | Bin 0 -> 727 bytes .../ckeditor/images/fileicons/bash.png | Bin 0 -> 433 bytes .../ckgedit/ckeditor/images/fileicons/bz2.png | Bin 0 -> 419 bytes .../ckgedit/ckeditor/images/fileicons/c.png | Bin 0 -> 412 bytes .../ckgedit/ckeditor/images/fileicons/cc.png | Bin 0 -> 411 bytes .../ckeditor/images/fileicons/conf.png | Bin 0 -> 402 bytes .../ckgedit/ckeditor/images/fileicons/cpp.png | Bin 0 -> 430 bytes .../ckgedit/ckeditor/images/fileicons/cs.png | Bin 0 -> 419 bytes .../ckgedit/ckeditor/images/fileicons/csh.png | Bin 0 -> 427 bytes .../ckgedit/ckeditor/images/fileicons/css.png | Bin 0 -> 427 bytes .../ckgedit/ckeditor/images/fileicons/csv.png | Bin 0 -> 409 bytes .../ckgedit/ckeditor/images/fileicons/deb.png | Bin 0 -> 421 bytes .../ckeditor/images/fileicons/diff.png | Bin 0 -> 425 bytes .../ckgedit/ckeditor/images/fileicons/doc.png | Bin 0 -> 410 bytes .../ckeditor/images/fileicons/docx.png | Bin 0 -> 415 bytes .../ckeditor/images/fileicons/file.png | Bin 0 -> 319 bytes .../ckgedit/ckeditor/images/fileicons/gif.png | Bin 0 -> 407 bytes .../ckgedit/ckeditor/images/fileicons/gz.png | Bin 0 -> 417 bytes .../ckgedit/ckeditor/images/fileicons/h.png | Bin 0 -> 411 bytes .../ckgedit/ckeditor/images/fileicons/hpp.png | Bin 0 -> 417 bytes .../ckgedit/ckeditor/images/fileicons/htm.png | Bin 0 -> 417 bytes .../ckeditor/images/fileicons/html.png | Bin 0 -> 417 bytes .../ckgedit/ckeditor/images/fileicons/ico.png | Bin 0 -> 405 bytes .../ckeditor/images/fileicons/index.php | 67 + .../ckeditor/images/fileicons/java.png | Bin 0 -> 420 bytes .../ckeditor/images/fileicons/jpeg.png | Bin 0 -> 412 bytes .../ckgedit/ckeditor/images/fileicons/jpg.png | Bin 0 -> 412 bytes .../ckgedit/ckeditor/images/fileicons/js.png | Bin 0 -> 420 bytes .../ckeditor/images/fileicons/json.png | Bin 0 -> 435 bytes .../ckgedit/ckeditor/images/fileicons/lua.png | Bin 0 -> 418 bytes .../ckgedit/ckeditor/images/fileicons/mp3.png | Bin 0 -> 415 bytes .../ckgedit/ckeditor/images/fileicons/mp4.png | Bin 0 -> 419 bytes .../ckgedit/ckeditor/images/fileicons/odc.png | Bin 0 -> 407 bytes .../ckgedit/ckeditor/images/fileicons/odf.png | Bin 0 -> 411 bytes .../ckgedit/ckeditor/images/fileicons/odg.png | Bin 0 -> 411 bytes .../ckgedit/ckeditor/images/fileicons/odi.png | Bin 0 -> 398 bytes .../ckgedit/ckeditor/images/fileicons/odp.png | Bin 0 -> 404 bytes .../ckgedit/ckeditor/images/fileicons/ods.png | Bin 0 -> 416 bytes .../ckgedit/ckeditor/images/fileicons/odt.png | Bin 0 -> 403 bytes .../ckgedit/ckeditor/images/fileicons/ogg.png | Bin 0 -> 408 bytes .../ckgedit/ckeditor/images/fileicons/ogv.png | Bin 0 -> 412 bytes .../ckgedit/ckeditor/images/fileicons/pas.png | Bin 0 -> 435 bytes .../ckgedit/ckeditor/images/fileicons/pdf.png | Bin 0 -> 425 bytes .../ckgedit/ckeditor/images/fileicons/php.png | Bin 0 -> 424 bytes .../ckgedit/ckeditor/images/fileicons/pl.png | Bin 0 -> 418 bytes .../ckgedit/ckeditor/images/fileicons/png.png | Bin 0 -> 417 bytes .../ckgedit/ckeditor/images/fileicons/ppt.png | Bin 0 -> 412 bytes .../ckeditor/images/fileicons/pptx.png | Bin 0 -> 414 bytes .../ckgedit/ckeditor/images/fileicons/ps.png | Bin 0 -> 424 bytes .../ckgedit/ckeditor/images/fileicons/py.png | Bin 0 -> 426 bytes .../ckgedit/ckeditor/images/fileicons/rar.png | Bin 0 -> 418 bytes .../ckgedit/ckeditor/images/fileicons/rb.png | Bin 0 -> 421 bytes .../ckgedit/ckeditor/images/fileicons/rpm.png | Bin 0 -> 415 bytes .../ckgedit/ckeditor/images/fileicons/rtf.png | Bin 0 -> 418 bytes .../ckgedit/ckeditor/images/fileicons/sh.png | Bin 0 -> 422 bytes .../ckgedit/ckeditor/images/fileicons/sql.png | Bin 0 -> 410 bytes .../ckgedit/ckeditor/images/fileicons/swf.png | Bin 0 -> 416 bytes .../ckgedit/ckeditor/images/fileicons/sxc.png | Bin 0 -> 420 bytes .../ckgedit/ckeditor/images/fileicons/sxd.png | Bin 0 -> 424 bytes .../ckgedit/ckeditor/images/fileicons/sxi.png | Bin 0 -> 414 bytes .../ckgedit/ckeditor/images/fileicons/sxw.png | Bin 0 -> 417 bytes .../ckgedit/ckeditor/images/fileicons/tar.png | Bin 0 -> 417 bytes .../ckgedit/ckeditor/images/fileicons/tgz.png | Bin 0 -> 417 bytes .../ckgedit/ckeditor/images/fileicons/txt.png | Bin 0 -> 407 bytes .../ckgedit/ckeditor/images/fileicons/wav.png | Bin 0 -> 415 bytes .../ckeditor/images/fileicons/webm.png | Bin 0 -> 412 bytes .../ckgedit/ckeditor/images/fileicons/wp.gif | Bin 0 -> 171 bytes .../ckgedit/ckeditor/images/fileicons/xls.png | Bin 0 -> 415 bytes .../ckeditor/images/fileicons/xlsx.png | Bin 0 -> 425 bytes .../ckgedit/ckeditor/images/fileicons/xml.png | Bin 0 -> 400 bytes .../ckgedit/ckeditor/images/fileicons/zip.png | Bin 0 -> 418 bytes .../ckgedit/ckeditor/images/interwiki.png | Bin 0 -> 443 bytes .../ckgedit/ckeditor/images/link_icon.gif | Bin 0 -> 942 bytes .../ckgedit/ckeditor/images/mail_icon.gif | Bin 0 -> 918 bytes lib/plugins/ckgedit/ckeditor/images/ns.png | Bin 0 -> 800 bytes lib/plugins/ckgedit/ckeditor/images/unc.png | Bin 0 -> 553 bytes lib/plugins/ckgedit/ckeditor/lang/af.js | 5 + lib/plugins/ckgedit/ckeditor/lang/ar.js | 5 + lib/plugins/ckgedit/ckeditor/lang/az.js | 5 + lib/plugins/ckgedit/ckeditor/lang/bg.js | 5 + lib/plugins/ckgedit/ckeditor/lang/bn.js | 5 + lib/plugins/ckgedit/ckeditor/lang/bs.js | 5 + lib/plugins/ckgedit/ckeditor/lang/ca.js | 5 + lib/plugins/ckgedit/ckeditor/lang/cs.js | 5 + lib/plugins/ckgedit/ckeditor/lang/cy.js | 5 + lib/plugins/ckgedit/ckeditor/lang/da.js | 5 + lib/plugins/ckgedit/ckeditor/lang/de-ch.js | 5 + lib/plugins/ckgedit/ckeditor/lang/de.js | 5 + lib/plugins/ckgedit/ckeditor/lang/el.js | 5 + lib/plugins/ckgedit/ckeditor/lang/en-au.js | 5 + lib/plugins/ckgedit/ckeditor/lang/en-ca.js | 5 + lib/plugins/ckgedit/ckeditor/lang/en-gb.js | 5 + .../ckeditor/lang/en.4.9.js.beautified | 876 + lib/plugins/ckgedit/ckeditor/lang/en.js | 159 + .../ckgedit/ckeditor/lang/en.js-4.9.merged | 156 + lib/plugins/ckgedit/ckeditor/lang/en.js.4.9 | 5 + .../ckgedit/ckeditor/lang/en.js.ckgedit | 156 + lib/plugins/ckgedit/ckeditor/lang/en.js.unc | 157 + lib/plugins/ckgedit/ckeditor/lang/eo.js | 5 + lib/plugins/ckgedit/ckeditor/lang/es-mx.js | 5 + lib/plugins/ckgedit/ckeditor/lang/es.js | 5 + lib/plugins/ckgedit/ckeditor/lang/et.js | 5 + lib/plugins/ckgedit/ckeditor/lang/eu.js | 5 + lib/plugins/ckgedit/ckeditor/lang/fa.js | 5 + lib/plugins/ckgedit/ckeditor/lang/fi.js | 5 + lib/plugins/ckgedit/ckeditor/lang/fo.js | 5 + lib/plugins/ckgedit/ckeditor/lang/fr-ca.js | 5 + lib/plugins/ckgedit/ckeditor/lang/fr.js | 139 + lib/plugins/ckgedit/ckeditor/lang/fr.js.unc | 805 + lib/plugins/ckgedit/ckeditor/lang/gl.js | 5 + lib/plugins/ckgedit/ckeditor/lang/gu.js | 5 + lib/plugins/ckgedit/ckeditor/lang/he.js | 5 + lib/plugins/ckgedit/ckeditor/lang/hi.js | 5 + lib/plugins/ckgedit/ckeditor/lang/hr.js | 5 + lib/plugins/ckgedit/ckeditor/lang/hu.js | 5 + lib/plugins/ckgedit/ckeditor/lang/id.js | 5 + lib/plugins/ckgedit/ckeditor/lang/is.js | 5 + lib/plugins/ckgedit/ckeditor/lang/it.js | 5 + lib/plugins/ckgedit/ckeditor/lang/ja.js | 5 + lib/plugins/ckgedit/ckeditor/lang/ka.js | 5 + lib/plugins/ckgedit/ckeditor/lang/km.js | 5 + lib/plugins/ckgedit/ckeditor/lang/ko.js | 5 + lib/plugins/ckgedit/ckeditor/lang/ku.js | 5 + .../ckgedit/ckeditor/lang/lang_array.txt | 769 + lib/plugins/ckgedit/ckeditor/lang/lt.js | 5 + lib/plugins/ckgedit/ckeditor/lang/lv.js | 5 + lib/plugins/ckgedit/ckeditor/lang/mk.js | 5 + lib/plugins/ckgedit/ckeditor/lang/mn.js | 5 + lib/plugins/ckgedit/ckeditor/lang/ms.js | 5 + lib/plugins/ckgedit/ckeditor/lang/nb.js | 5 + lib/plugins/ckgedit/ckeditor/lang/nl.js | 5 + lib/plugins/ckgedit/ckeditor/lang/no.js | 5 + lib/plugins/ckgedit/ckeditor/lang/oc.js | 5 + lib/plugins/ckgedit/ckeditor/lang/pl.js | 5 + lib/plugins/ckgedit/ckeditor/lang/pt-br.js | 5 + lib/plugins/ckgedit/ckeditor/lang/pt.js | 5 + lib/plugins/ckgedit/ckeditor/lang/ro.js | 5 + lib/plugins/ckgedit/ckeditor/lang/ru.js | 5 + lib/plugins/ckgedit/ckeditor/lang/si.js | 5 + lib/plugins/ckgedit/ckeditor/lang/sk.js | 5 + lib/plugins/ckgedit/ckeditor/lang/sl.js | 5 + lib/plugins/ckgedit/ckeditor/lang/sq.js | 5 + lib/plugins/ckgedit/ckeditor/lang/sr-latn.js | 5 + lib/plugins/ckgedit/ckeditor/lang/sr.js | 5 + lib/plugins/ckgedit/ckeditor/lang/sv.js | 5 + lib/plugins/ckgedit/ckeditor/lang/th.js | 5 + lib/plugins/ckgedit/ckeditor/lang/tr.js | 5 + lib/plugins/ckgedit/ckeditor/lang/tt.js | 5 + lib/plugins/ckgedit/ckeditor/lang/ug.js | 5 + lib/plugins/ckgedit/ckeditor/lang/uk.js | 5 + lib/plugins/ckgedit/ckeditor/lang/vi.js | 5 + lib/plugins/ckgedit/ckeditor/lang/zh-cn.js | 5 + lib/plugins/ckgedit/ckeditor/lang/zh.js | 5 + .../plugins/a11yhelp/dialogs/a11yhelp.js | 10 + .../dialogs/lang/_translationstatus.txt | 25 + .../plugins/a11yhelp/dialogs/lang/af.js | 11 + .../plugins/a11yhelp/dialogs/lang/ar.js | 11 + .../plugins/a11yhelp/dialogs/lang/az.js | 11 + .../plugins/a11yhelp/dialogs/lang/bg.js | 11 + .../plugins/a11yhelp/dialogs/lang/ca.js | 13 + .../plugins/a11yhelp/dialogs/lang/cs.js | 12 + .../plugins/a11yhelp/dialogs/lang/cy.js | 11 + .../plugins/a11yhelp/dialogs/lang/da.js | 11 + .../plugins/a11yhelp/dialogs/lang/de-ch.js | 12 + .../plugins/a11yhelp/dialogs/lang/de.js | 13 + .../plugins/a11yhelp/dialogs/lang/el.js | 13 + .../plugins/a11yhelp/dialogs/lang/en-au.js | 11 + .../plugins/a11yhelp/dialogs/lang/en-gb.js | 11 + .../plugins/a11yhelp/dialogs/lang/en.js | 11 + .../plugins/a11yhelp/dialogs/lang/eo.js | 13 + .../plugins/a11yhelp/dialogs/lang/es-mx.js | 13 + .../plugins/a11yhelp/dialogs/lang/es.js | 13 + .../plugins/a11yhelp/dialogs/lang/et.js | 11 + .../plugins/a11yhelp/dialogs/lang/eu.js | 12 + .../plugins/a11yhelp/dialogs/lang/fa.js | 11 + .../plugins/a11yhelp/dialogs/lang/fi.js | 11 + .../plugins/a11yhelp/dialogs/lang/fo.js | 11 + .../plugins/a11yhelp/dialogs/lang/fr-ca.js | 11 + .../plugins/a11yhelp/dialogs/lang/fr.js | 13 + .../plugins/a11yhelp/dialogs/lang/gl.js | 12 + .../plugins/a11yhelp/dialogs/lang/gu.js | 11 + .../plugins/a11yhelp/dialogs/lang/he.js | 11 + .../plugins/a11yhelp/dialogs/lang/hi.js | 11 + .../plugins/a11yhelp/dialogs/lang/hr.js | 11 + .../plugins/a11yhelp/dialogs/lang/hu.js | 12 + .../plugins/a11yhelp/dialogs/lang/id.js | 11 + .../plugins/a11yhelp/dialogs/lang/it.js | 13 + .../plugins/a11yhelp/dialogs/lang/ja.js | 9 + .../plugins/a11yhelp/dialogs/lang/km.js | 11 + .../plugins/a11yhelp/dialogs/lang/ko.js | 10 + .../plugins/a11yhelp/dialogs/lang/ku.js | 11 + .../plugins/a11yhelp/dialogs/lang/lt.js | 11 + .../plugins/a11yhelp/dialogs/lang/lv.js | 12 + .../plugins/a11yhelp/dialogs/lang/mk.js | 11 + .../plugins/a11yhelp/dialogs/lang/mn.js | 11 + .../plugins/a11yhelp/dialogs/lang/nb.js | 12 + .../plugins/a11yhelp/dialogs/lang/nl.js | 12 + .../plugins/a11yhelp/dialogs/lang/no.js | 11 + .../plugins/a11yhelp/dialogs/lang/oc.js | 12 + .../plugins/a11yhelp/dialogs/lang/pl.js | 13 + .../plugins/a11yhelp/dialogs/lang/pt-br.js | 13 + .../plugins/a11yhelp/dialogs/lang/pt.js | 12 + .../plugins/a11yhelp/dialogs/lang/ro.js | 12 + .../plugins/a11yhelp/dialogs/lang/ru.js | 11 + .../plugins/a11yhelp/dialogs/lang/si.js | 10 + .../plugins/a11yhelp/dialogs/lang/sk.js | 11 + .../plugins/a11yhelp/dialogs/lang/sl.js | 11 + .../plugins/a11yhelp/dialogs/lang/sq.js | 11 + .../plugins/a11yhelp/dialogs/lang/sr-latn.js | 11 + .../plugins/a11yhelp/dialogs/lang/sr.js | 11 + .../plugins/a11yhelp/dialogs/lang/sv.js | 11 + .../plugins/a11yhelp/dialogs/lang/th.js | 11 + .../plugins/a11yhelp/dialogs/lang/tr.js | 12 + .../plugins/a11yhelp/dialogs/lang/tt.js | 11 + .../plugins/a11yhelp/dialogs/lang/ug.js | 12 + .../plugins/a11yhelp/dialogs/lang/uk.js | 12 + .../plugins/a11yhelp/dialogs/lang/vi.js | 11 + .../plugins/a11yhelp/dialogs/lang/zh-cn.js | 9 + .../plugins/a11yhelp/dialogs/lang/zh.js | 9 + .../ckeditor/plugins/about/dialogs/about.js | 30 + .../about/dialogs/hidpi/logo_ckeditor.png | Bin 0 -> 12236 bytes .../plugins/about/dialogs/logo_ckeditor.png | Bin 0 -> 5650 bytes .../plugins/clipboard/dialogs/paste.js | 11 + .../colordialog/dialogs/colordialog.css | 20 + .../colordialog/dialogs/colordialog.js | 14 + .../cursors/cursor-disabled.svg | 25 + .../plugins/copyformatting/cursors/cursor.svg | 14 + .../copyformatting/styles/copyformatting.css | 45 + .../plugins/dialog/dialogDefinition.js | 4 + .../ckeditor/plugins/find/dialogs/find.js | 25 + .../ckeditor/plugins/fontAssist/color.js | 35 + .../plugins/fontAssist/color_chart_3.js | 51 + .../plugins/fontAssist/images/fonts.png | Bin 0 -> 396 bytes .../plugins/fontAssist/images/icon.png | Bin 0 -> 427 bytes .../ckeditor/plugins/fontAssist/plugin.js | 1 + .../ckeditor/plugins/fontAssist/plugin.js.unc | 691 + .../plugins/footnote/images/footnote.png | Bin 0 -> 146 bytes .../ckeditor/plugins/footnote/plugin.js | 1 + .../ckeditor/plugins/footnote/plugin.js.unc | 210 + .../ckeditor/plugins/geshi/dialogs/geshi.js | 1 + .../plugins/geshi/dialogs/geshi.js.unc | 245 + .../ckeditor/plugins/geshi/icons/geshi.gif | Bin 0 -> 280 bytes .../ckgedit/ckeditor/plugins/geshi/lang/de.js | 14 + .../ckgedit/ckeditor/plugins/geshi/lang/en.js | 22 + .../ckgedit/ckeditor/plugins/geshi/lang/fr.js | 3 + .../ckgedit/ckeditor/plugins/geshi/plugin.js | 31 + .../plugins/headerbuttons/icons/HH.png | Bin 0 -> 426 bytes .../plugins/headerbuttons/icons/LH.png | Bin 0 -> 419 bytes .../plugins/headerbuttons/icons/P.png | Bin 0 -> 295 bytes .../plugins/headerbuttons/icons/SH.png | Bin 0 -> 289 bytes .../plugins/headerbuttons/icons/hidpi/HH.png | Bin 0 -> 625 bytes .../plugins/headerbuttons/icons/hidpi/LH.png | Bin 0 -> 674 bytes .../plugins/headerbuttons/icons/hidpi/P.png | Bin 0 -> 412 bytes .../plugins/headerbuttons/icons/hidpi/SH.png | Bin 0 -> 319 bytes .../ckeditor/plugins/headerbuttons/lang/de.js | 8 + .../ckeditor/plugins/headerbuttons/lang/en.js | 9 + .../ckeditor/plugins/headerbuttons/plugin.js | 114 + .../ckgedit/ckeditor/plugins/icons.png | Bin 0 -> 12421 bytes .../ckgedit/ckeditor/plugins/icons_hidpi.png | Bin 0 -> 40265 bytes .../ckeditor/plugins/image/dialogs/image.js | 1 + .../plugins/image/dialogs/image.js.unc | 1310 + .../ckeditor/plugins/image/icons/image.png | Bin 0 -> 761 bytes .../ckeditor/plugins/image/images/noimage.png | Bin 0 -> 1610 bytes .../ckgedit/ckeditor/plugins/image/plugin.js | 1 + .../ckeditor/plugins/image/plugin.js.unc | 146 + .../ckeditor/plugins/link/dialogs/anchor.js | 144 + .../plugins/link/dialogs/link-cmpr.js | 1 + .../ckeditor/plugins/link/dialogs/link.js | 1 + .../ckeditor/plugins/link/dialogs/link.js.unc | 1831 + .../ckeditor/plugins/link/images/anchor.gif | Bin 0 -> 184 bytes .../ckeditor/plugins/link/images/anchor.png | Bin 0 -> 763 bytes .../plugins/link/images/hidpi/anchor.png | Bin 0 -> 1597 bytes .../ckgedit/ckeditor/plugins/link/plugin.js | 1 + .../ckeditor/plugins/link/plugin.js.unc | 374 + .../plugins/liststyle/dialogs/liststyle.js | 10 + .../magicline/images/hidpi/icon-rtl.png | Bin 0 -> 176 bytes .../plugins/magicline/images/hidpi/icon.png | Bin 0 -> 199 bytes .../plugins/magicline/images/icon-rtl.png | Bin 0 -> 138 bytes .../plugins/magicline/images/icon.png | Bin 0 -> 133 bytes .../plugins/msword/dialogs/bak/msword.js | 175 + .../plugins/msword/dialogs/bak/msword.js.unc | 175 + .../ckeditor/plugins/msword/dialogs/msword.js | 1 + .../plugins/msword/dialogs/msword.js.unc | 192 + .../ckeditor/plugins/msword/icons/geshi.gif | Bin 0 -> 280 bytes .../ckeditor/plugins/msword/icons/geshi.png | Bin 0 -> 108 bytes .../ckeditor/plugins/msword/icons/msword.png | Bin 0 -> 471 bytes .../plugins/msword/icons/untitled-.png | Bin 0 -> 108 bytes .../ckeditor/plugins/msword/lang/de.js | 12 + .../ckeditor/plugins/msword/lang/en.js | 14 + .../ckgedit/ckeditor/plugins/msword/plugin.js | 32 + .../ckeditor/plugins/note/.gitattributes | 17 + .../ckgedit/ckeditor/plugins/note/README.md | 10 + .../ckeditor/plugins/note/dialogs/note.js | 1 + .../ckeditor/plugins/note/dialogs/note.js.unc | 66 + .../ckeditor/plugins/note/icons/note.png | Bin 0 -> 1209 bytes .../plugins/note/icons/note_basic.png | Bin 0 -> 2520 bytes .../plugins/note/icons/note_important.png | Bin 0 -> 2250 bytes .../ckeditor/plugins/note/icons/note_tip.png | Bin 0 -> 2909 bytes .../plugins/note/icons/note_warning.png | Bin 0 -> 3249 bytes .../ckgedit/ckeditor/plugins/note/lang/de.js | 9 + .../ckgedit/ckeditor/plugins/note/lang/en.js | 9 + .../ckgedit/ckeditor/plugins/note/plugin.js | 17 + .../plugins/pagebreak/images/pagebreak.gif | Bin 0 -> 99 bytes .../ckeditor/plugins/pastebase64/plugin.js | 70 + .../plugins/pastefromword/filter/default.js | 55 + .../ckeditor/plugins/preview/preview.html | 13 + .../ckeditor/plugins/scayt/CHANGELOG.md | 20 + .../ckgedit/ckeditor/plugins/scayt/LICENSE.md | 28 + .../ckgedit/ckeditor/plugins/scayt/README.md | 81 + .../ckeditor/plugins/scayt/dialogs/dialog.css | 23 + .../ckeditor/plugins/scayt/dialogs/options.js | 32 + .../plugins/scayt/dialogs/toolbar.css | 71 + .../plugins/scayt/skins/moono-lisa/scayt.css | 25 + .../plugins/shortcuts/images/timestamp.png | Bin 0 -> 882 bytes .../ckeditor/plugins/shortcuts/plugin.js | 1 + .../ckeditor/plugins/shortcuts/plugin.js.unc | 107 + .../showblocks/images/block_address.png | Bin 0 -> 152 bytes .../showblocks/images/block_blockquote.png | Bin 0 -> 154 bytes .../plugins/showblocks/images/block_div.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h1.png | Bin 0 -> 120 bytes .../plugins/showblocks/images/block_h2.png | Bin 0 -> 127 bytes .../plugins/showblocks/images/block_h3.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_h4.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_h5.png | Bin 0 -> 126 bytes .../plugins/showblocks/images/block_h6.png | Bin 0 -> 123 bytes .../plugins/showblocks/images/block_p.png | Bin 0 -> 115 bytes .../plugins/showblocks/images/block_pre.png | Bin 0 -> 128 bytes .../ckeditor/plugins/signature/images/sig.png | Bin 0 -> 471 bytes .../plugins/signature/images/timestamp.png | Bin 0 -> 882 bytes .../ckeditor/plugins/signature/plugin.js | 1 + .../ckeditor/plugins/signature/plugin.js.unc | 57 + .../ckeditor/plugins/smiley/dialogs/smiley.js | 1 + .../plugins/smiley/dialogs/smiley.js.4.3 | 10 + .../plugins/smiley/dialogs/smiley.js.unc | 243 + .../plugins/smiley/icons/hidpi/smiley.png | Bin 0 -> 3073 bytes .../ckeditor/plugins/smiley/icons/smiley.png | Bin 0 -> 916 bytes .../plugins/smiley/images/angel_smile.gif | Bin 0 -> 1245 bytes .../plugins/smiley/images/angel_smile.png | Bin 0 -> 1172 bytes .../plugins/smiley/images/angry_smile.gif | Bin 0 -> 1219 bytes .../plugins/smiley/images/angry_smile.png | Bin 0 -> 1220 bytes .../plugins/smiley/images/broken_heart.gif | Bin 0 -> 732 bytes .../plugins/smiley/images/broken_heart.png | Bin 0 -> 1139 bytes .../plugins/smiley/images/confused_smile.gif | Bin 0 -> 1202 bytes .../plugins/smiley/images/confused_smile.png | Bin 0 -> 1101 bytes .../plugins/smiley/images/cry_smile.gif | Bin 0 -> 795 bytes .../plugins/smiley/images/cry_smile.png | Bin 0 -> 1214 bytes .../plugins/smiley/images/devil_smile.gif | Bin 0 -> 1239 bytes .../plugins/smiley/images/devil_smile.png | Bin 0 -> 1220 bytes .../smiley/images/embaressed_smile.gif | Bin 0 -> 786 bytes .../smiley/images/embarrassed_smile.gif | Bin 0 -> 786 bytes .../smiley/images/embarrassed_smile.png | Bin 0 -> 1145 bytes .../plugins/smiley/images/envelope.gif | Bin 0 -> 506 bytes .../plugins/smiley/images/envelope.png | Bin 0 -> 760 bytes .../ckeditor/plugins/smiley/images/heart.gif | Bin 0 -> 692 bytes .../ckeditor/plugins/smiley/images/heart.png | Bin 0 -> 999 bytes .../ckeditor/plugins/smiley/images/kiss.gif | Bin 0 -> 683 bytes .../ckeditor/plugins/smiley/images/kiss.png | Bin 0 -> 1003 bytes .../plugins/smiley/images/lightbulb.gif | Bin 0 -> 660 bytes .../plugins/smiley/images/lightbulb.png | Bin 0 -> 919 bytes .../plugins/smiley/images/omg_smile.gif | Bin 0 -> 820 bytes .../plugins/smiley/images/omg_smile.png | Bin 0 -> 1122 bytes .../plugins/smiley/images/regular_smile.gif | Bin 0 -> 1209 bytes .../plugins/smiley/images/regular_smile.png | Bin 0 -> 1084 bytes .../plugins/smiley/images/sad_smile.gif | Bin 0 -> 782 bytes .../plugins/smiley/images/sad_smile.png | Bin 0 -> 1115 bytes .../plugins/smiley/images/shades_smile.gif | Bin 0 -> 1231 bytes .../plugins/smiley/images/shades_smile.png | Bin 0 -> 1204 bytes .../plugins/smiley/images/teeth_smile.gif | Bin 0 -> 1201 bytes .../plugins/smiley/images/teeth_smile.png | Bin 0 -> 1183 bytes .../plugins/smiley/images/thumbs_down.gif | Bin 0 -> 715 bytes .../plugins/smiley/images/thumbs_down.png | Bin 0 -> 985 bytes .../plugins/smiley/images/thumbs_up.gif | Bin 0 -> 714 bytes .../plugins/smiley/images/thumbs_up.png | Bin 0 -> 959 bytes .../plugins/smiley/images/tongue_smile.gif | Bin 0 -> 1210 bytes .../plugins/smiley/images/tongue_smile.png | Bin 0 -> 1132 bytes .../plugins/smiley/images/tounge_smile.gif | Bin 0 -> 1210 bytes .../images/whatchutalkingabout_smile.gif | Bin 0 -> 775 bytes .../images/whatchutalkingabout_smile.png | Bin 0 -> 1039 bytes .../plugins/smiley/images/wink_smile.gif | Bin 0 -> 1202 bytes .../plugins/smiley/images/wink_smile.png | Bin 0 -> 1114 bytes .../ckeditor/plugins/smiley/lang/af.js | 9 + .../ckeditor/plugins/smiley/lang/ar.js | 9 + .../ckeditor/plugins/smiley/lang/bg.js | 9 + .../ckeditor/plugins/smiley/lang/bn.js | 9 + .../ckeditor/plugins/smiley/lang/bs.js | 9 + .../ckeditor/plugins/smiley/lang/ca.js | 9 + .../ckeditor/plugins/smiley/lang/cs.js | 9 + .../ckeditor/plugins/smiley/lang/cy.js | 9 + .../ckeditor/plugins/smiley/lang/da.js | 9 + .../ckeditor/plugins/smiley/lang/de.js | 9 + .../ckeditor/plugins/smiley/lang/el.js | 9 + .../ckeditor/plugins/smiley/lang/en-au.js | 9 + .../ckeditor/plugins/smiley/lang/en-ca.js | 9 + .../ckeditor/plugins/smiley/lang/en-gb.js | 9 + .../ckeditor/plugins/smiley/lang/en.js | 9 + .../ckeditor/plugins/smiley/lang/eo.js | 9 + .../ckeditor/plugins/smiley/lang/es.js | 9 + .../ckeditor/plugins/smiley/lang/et.js | 9 + .../ckeditor/plugins/smiley/lang/eu.js | 9 + .../ckeditor/plugins/smiley/lang/fa.js | 9 + .../ckeditor/plugins/smiley/lang/fi.js | 9 + .../ckeditor/plugins/smiley/lang/fo.js | 9 + .../ckeditor/plugins/smiley/lang/fr-ca.js | 9 + .../ckeditor/plugins/smiley/lang/fr.js | 9 + .../ckeditor/plugins/smiley/lang/gl.js | 9 + .../ckeditor/plugins/smiley/lang/gu.js | 9 + .../ckeditor/plugins/smiley/lang/he.js | 9 + .../ckeditor/plugins/smiley/lang/hi.js | 9 + .../ckeditor/plugins/smiley/lang/hr.js | 9 + .../ckeditor/plugins/smiley/lang/hu.js | 9 + .../ckeditor/plugins/smiley/lang/id.js | 9 + .../ckeditor/plugins/smiley/lang/is.js | 9 + .../ckeditor/plugins/smiley/lang/it.js | 9 + .../ckeditor/plugins/smiley/lang/ja.js | 9 + .../ckeditor/plugins/smiley/lang/ka.js | 9 + .../ckeditor/plugins/smiley/lang/km.js | 9 + .../ckeditor/plugins/smiley/lang/ko.js | 9 + .../ckeditor/plugins/smiley/lang/ku.js | 9 + .../ckeditor/plugins/smiley/lang/lt.js | 9 + .../ckeditor/plugins/smiley/lang/lv.js | 9 + .../ckeditor/plugins/smiley/lang/mk.js | 9 + .../ckeditor/plugins/smiley/lang/mn.js | 9 + .../ckeditor/plugins/smiley/lang/ms.js | 9 + .../ckeditor/plugins/smiley/lang/nb.js | 9 + .../ckeditor/plugins/smiley/lang/nl.js | 9 + .../ckeditor/plugins/smiley/lang/no.js | 9 + .../ckeditor/plugins/smiley/lang/pl.js | 9 + .../ckeditor/plugins/smiley/lang/pt-br.js | 9 + .../ckeditor/plugins/smiley/lang/pt.js | 9 + .../ckeditor/plugins/smiley/lang/ro.js | 9 + .../ckeditor/plugins/smiley/lang/ru.js | 9 + .../ckeditor/plugins/smiley/lang/si.js | 9 + .../ckeditor/plugins/smiley/lang/sk.js | 9 + .../ckeditor/plugins/smiley/lang/sl.js | 9 + .../ckeditor/plugins/smiley/lang/sq.js | 9 + .../ckeditor/plugins/smiley/lang/sr-latn.js | 9 + .../ckeditor/plugins/smiley/lang/sr.js | 9 + .../ckeditor/plugins/smiley/lang/sv.js | 9 + .../ckeditor/plugins/smiley/lang/th.js | 9 + .../ckeditor/plugins/smiley/lang/tr.js | 9 + .../ckeditor/plugins/smiley/lang/tt.js | 9 + .../ckeditor/plugins/smiley/lang/ug.js | 9 + .../ckeditor/plugins/smiley/lang/uk.js | 9 + .../ckeditor/plugins/smiley/lang/vi.js | 9 + .../ckeditor/plugins/smiley/lang/zh-cn.js | 9 + .../ckeditor/plugins/smiley/lang/zh.js | 9 + .../ckgedit/ckeditor/plugins/smiley/plugin.js | 1 + .../ckeditor/plugins/smiley/plugin.js.unc | 95 + .../dialogs/lang/_translationstatus.txt | 20 + .../plugins/specialchar/dialogs/lang/af.js | 13 + .../plugins/specialchar/dialogs/lang/ar.js | 13 + .../plugins/specialchar/dialogs/lang/bg.js | 13 + .../plugins/specialchar/dialogs/lang/ca.js | 14 + .../plugins/specialchar/dialogs/lang/cs.js | 13 + .../plugins/specialchar/dialogs/lang/cy.js | 14 + .../plugins/specialchar/dialogs/lang/da.js | 11 + .../plugins/specialchar/dialogs/lang/de.js | 13 + .../plugins/specialchar/dialogs/lang/el.js | 13 + .../plugins/specialchar/dialogs/lang/en-gb.js | 13 + .../plugins/specialchar/dialogs/lang/en.js | 13 + .../plugins/specialchar/dialogs/lang/eo.js | 12 + .../plugins/specialchar/dialogs/lang/es.js | 13 + .../plugins/specialchar/dialogs/lang/et.js | 13 + .../plugins/specialchar/dialogs/lang/fa.js | 12 + .../plugins/specialchar/dialogs/lang/fi.js | 13 + .../plugins/specialchar/dialogs/lang/fr-ca.js | 10 + .../plugins/specialchar/dialogs/lang/fr.js | 11 + .../plugins/specialchar/dialogs/lang/gl.js | 13 + .../plugins/specialchar/dialogs/lang/he.js | 12 + .../plugins/specialchar/dialogs/lang/hr.js | 13 + .../plugins/specialchar/dialogs/lang/hu.js | 12 + .../plugins/specialchar/dialogs/lang/id.js | 13 + .../plugins/specialchar/dialogs/lang/it.js | 14 + .../plugins/specialchar/dialogs/lang/ja.js | 9 + .../plugins/specialchar/dialogs/lang/km.js | 13 + .../plugins/specialchar/dialogs/lang/ko.js | 10 + .../plugins/specialchar/dialogs/lang/ku.js | 13 + .../plugins/specialchar/dialogs/lang/lt.js | 13 + .../plugins/specialchar/dialogs/lang/lv.js | 13 + .../plugins/specialchar/dialogs/lang/nb.js | 11 + .../plugins/specialchar/dialogs/lang/nl.js | 13 + .../plugins/specialchar/dialogs/lang/no.js | 11 + .../plugins/specialchar/dialogs/lang/pl.js | 12 + .../plugins/specialchar/dialogs/lang/pt-br.js | 11 + .../plugins/specialchar/dialogs/lang/pt.js | 13 + .../plugins/specialchar/dialogs/lang/ru.js | 13 + .../plugins/specialchar/dialogs/lang/si.js | 13 + .../plugins/specialchar/dialogs/lang/sk.js | 13 + .../plugins/specialchar/dialogs/lang/sl.js | 12 + .../plugins/specialchar/dialogs/lang/sq.js | 13 + .../plugins/specialchar/dialogs/lang/sv.js | 11 + .../plugins/specialchar/dialogs/lang/th.js | 13 + .../plugins/specialchar/dialogs/lang/tr.js | 12 + .../plugins/specialchar/dialogs/lang/tt.js | 13 + .../plugins/specialchar/dialogs/lang/ug.js | 13 + .../plugins/specialchar/dialogs/lang/uk.js | 12 + .../plugins/specialchar/dialogs/lang/vi.js | 14 + .../plugins/specialchar/dialogs/lang/zh-cn.js | 9 + .../plugins/specialchar/dialogs/lang/zh.js | 9 + .../specialchar/dialogs/specialchar.js | 1 + .../specialchar/dialogs/specialchar.js.orig | 14 + .../specialchar/dialogs/specialchar.js.unc | 298 + .../ckeditor/plugins/table/dialogs/table.js | 1 + .../plugins/table/dialogs/table.js.unc | 419 + .../tableselection/styles/tableselection.css | 26 + .../plugins/tabletools/dialogs/tableCell.js | 1 + .../tabletools/dialogs/tableCell.js.unc | 227 + .../ckeditor/plugins/tags/dialogs/tags.js | 1 + .../ckeditor/plugins/tags/dialogs/tags.js.unc | 182 + .../ckeditor/plugins/tags/images/icon.png | Bin 0 -> 255 bytes .../ckgedit/ckeditor/plugins/tags/lang/de.js | 10 + .../ckgedit/ckeditor/plugins/tags/lang/en.js | 9 + .../ckgedit/ckeditor/plugins/tags/lang/fr.js | 9 + .../ckgedit/ckeditor/plugins/tags/plugin.js | 44 + .../ckeditor/plugins/timestamp/LICENSE.md | 42 + .../plugins/timestamp/icons/timestamp.png | Bin 0 -> 769 bytes .../ckeditor/plugins/timestamp/lang/de.js | 3 + .../ckeditor/plugins/timestamp/lang/en.js | 3 + .../ckeditor/plugins/timestamp/lang/fr.js | 3 + .../ckeditor/plugins/timestamp/plugin.js | 40 + .../plugins/truetype/images/truetype.gif | Bin 0 -> 181 bytes .../plugins/truetype/images/truetype.png | Bin 0 -> 293 bytes .../ckeditor/plugins/truetype/lang/da.js | 3 + .../ckeditor/plugins/truetype/lang/de.js | 3 + .../ckeditor/plugins/truetype/lang/en.js | 3 + .../ckeditor/plugins/truetype/lang/es.js | 3 + .../ckeditor/plugins/truetype/lang/fi.js | 3 + .../ckeditor/plugins/truetype/lang/it.js | 3 + .../ckeditor/plugins/truetype/lang/ja.js | 3 + .../ckeditor/plugins/truetype/lang/nl.js | 3 + .../ckeditor/plugins/truetype/lang/ru.js | 3 + .../ckeditor/plugins/truetype/lang/sv.js | 3 + .../ckeditor/plugins/truetype/lang/zh-tw.js | 4 + .../ckeditor/plugins/truetype/lang/zh.js | 3 + .../ckeditor/plugins/truetype/plugin.js | 48 + lib/plugins/ckgedit/ckeditor/plugins/version | 2 + .../ckeditor/plugins/wrap/dialogs/wrap.js | 171 + .../ckeditor/plugins/wrap/icons/wrap.png | Bin 0 -> 870 bytes .../ckgedit/ckeditor/plugins/wrap/lang/ar.js | 11 + .../ckgedit/ckeditor/plugins/wrap/lang/bn.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/cs.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/da.js | 16 + .../ckeditor/plugins/wrap/lang/de-informal.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/de.js | 20 + .../ckgedit/ckeditor/plugins/wrap/lang/en.js | 20 + .../ckgedit/ckeditor/plugins/wrap/lang/eo.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/es.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/fa.js | 15 + .../ckgedit/ckeditor/plugins/wrap/lang/fr.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/hr.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/hu.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/it.js | 6 + .../ckgedit/ckeditor/plugins/wrap/lang/ja.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/ko.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/nl.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/no.js | 19 + .../ckeditor/plugins/wrap/lang/pt-br.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/ru.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/sk.js | 7 + .../ckgedit/ckeditor/plugins/wrap/lang/tr.js | 16 + .../ckeditor/plugins/wrap/lang/zh-tw.js | 16 + .../ckgedit/ckeditor/plugins/wrap/lang/zh.js | 16 + .../ckgedit/ckeditor/plugins/wrap/plugin.js | 15 + .../ckgedit/ckeditor/plugins/wsc/LICENSE.md | 28 + .../ckgedit/ckeditor/plugins/wsc/README.md | 25 + .../ckeditor/plugins/wsc/dialogs/ciframe.html | 66 + .../plugins/wsc/dialogs/tmpFrameset.html | 52 + .../ckeditor/plugins/wsc/dialogs/wsc.css | 82 + .../ckeditor/plugins/wsc/dialogs/wsc.js | 91 + .../ckeditor/plugins/wsc/dialogs/wsc_ie.js | 11 + .../plugins/wsc/skins/moono-lisa/wsc.css | 43 + lib/plugins/ckgedit/ckeditor/schemes.php | 7 + .../ckgedit/ckeditor/skins/kama/dialog.css | 5 + .../ckgedit/ckeditor/skins/kama/dialog_ie.css | 5 + .../ckeditor/skins/kama/dialog_ie7.css | 5 + .../ckeditor/skins/kama/dialog_ie8.css | 5 + .../ckeditor/skins/kama/dialog_iequirks.css | 5 + .../ckgedit/ckeditor/skins/kama/editor.css | 5 + .../ckgedit/ckeditor/skins/kama/editor_ie.css | 5 + .../ckeditor/skins/kama/editor_ie7.css | 5 + .../ckeditor/skins/kama/editor_ie8.css | 5 + .../ckeditor/skins/kama/editor_iequirks.css | 5 + .../ckgedit/ckeditor/skins/kama/icons.png | Bin 0 -> 10138 bytes .../ckeditor/skins/kama/icons_hidpi.png | Bin 0 -> 15923 bytes .../skins/kama/images/dialog_sides.gif | Bin 0 -> 47 bytes .../skins/kama/images/dialog_sides.png | Bin 0 -> 125 bytes .../skins/kama/images/dialog_sides_rtl.png | Bin 0 -> 128 bytes .../ckeditor/skins/kama/images/mini.gif | Bin 0 -> 181 bytes .../ckeditor/skins/kama/images/spinner.gif | Bin 0 -> 2984 bytes .../ckeditor/skins/kama/images/sprites.png | Bin 0 -> 6117 bytes .../skins/kama/images/sprites_ie6.png | Bin 0 -> 2658 bytes .../skins/kama/images/toolbar_start.gif | Bin 0 -> 102 bytes .../ckgedit/ckeditor/skins/kama/readme.md | 38 + .../ckgedit/ckeditor/skins/kama/skin.js | 8 + .../ckeditor/skins/moono-lisa/dialog.css | 5 + .../ckeditor/skins/moono-lisa/dialog_ie.css | 5 + .../ckeditor/skins/moono-lisa/dialog_ie8.css | 5 + .../skins/moono-lisa/dialog_iequirks.css | 5 + .../ckeditor/skins/moono-lisa/editor.css | 5 + .../skins/moono-lisa/editor_gecko.css | 5 + .../ckeditor/skins/moono-lisa/editor_ie.css | 5 + .../ckeditor/skins/moono-lisa/editor_ie8.css | 5 + .../skins/moono-lisa/editor_iequirks.css | 5 + .../ckeditor/skins/moono-lisa/icons.png | Bin 0 -> 12421 bytes .../ckeditor/skins/moono-lisa/icons_hidpi.png | Bin 0 -> 40265 bytes .../skins/moono-lisa/images/arrow.png | Bin 0 -> 191 bytes .../skins/moono-lisa/images/close.png | Bin 0 -> 615 bytes .../skins/moono-lisa/images/hidpi/close.png | Bin 0 -> 1238 bytes .../moono-lisa/images/hidpi/lock-open.png | Bin 0 -> 1071 bytes .../skins/moono-lisa/images/hidpi/lock.png | Bin 0 -> 1062 bytes .../skins/moono-lisa/images/hidpi/refresh.png | Bin 0 -> 1623 bytes .../skins/moono-lisa/images/lock-open.png | Bin 0 -> 511 bytes .../ckeditor/skins/moono-lisa/images/lock.png | Bin 0 -> 506 bytes .../skins/moono-lisa/images/refresh.png | Bin 0 -> 757 bytes .../skins/moono-lisa/images/spinner.gif | Bin 0 -> 2984 bytes .../ckeditor/skins/moono-lisa/readme.md | 46 + .../ckgedit/ckeditor/skins/moono/dialog.css | 5 + .../ckeditor/skins/moono/dialog_ie.css | 5 + .../ckeditor/skins/moono/dialog_ie7.css | 5 + .../ckeditor/skins/moono/dialog_ie8.css | 5 + .../ckeditor/skins/moono/dialog_iequirks.css | 5 + .../ckeditor/skins/moono/dialog_opera.css | 5 + .../ckgedit/ckeditor/skins/moono/editor.css | 5 + .../ckeditor/skins/moono/editor_gecko.css | 5 + .../ckeditor/skins/moono/editor_ie.css | 5 + .../ckeditor/skins/moono/editor_ie7.css | 5 + .../ckeditor/skins/moono/editor_ie8.css | 5 + .../ckeditor/skins/moono/editor_iequirks.css | 5 + .../ckgedit/ckeditor/skins/moono/icons.png | Bin 0 -> 20634 bytes .../ckeditor/skins/moono/icons_hidpi.png | Bin 0 -> 67753 bytes .../ckeditor/skins/moono/images/arrow.png | Bin 0 -> 191 bytes .../ckeditor/skins/moono/images/close.png | Bin 0 -> 468 bytes .../skins/moono/images/hidpi/close.png | Bin 0 -> 1271 bytes .../skins/moono/images/hidpi/lock-open.png | Bin 0 -> 1329 bytes .../skins/moono/images/hidpi/lock.png | Bin 0 -> 1299 bytes .../skins/moono/images/hidpi/refresh.png | Bin 0 -> 1842 bytes .../ckeditor/skins/moono/images/lock-open.png | Bin 0 -> 349 bytes .../ckeditor/skins/moono/images/lock.png | Bin 0 -> 475 bytes .../ckeditor/skins/moono/images/mini.png | Bin 0 -> 818 bytes .../ckeditor/skins/moono/images/refresh.png | Bin 0 -> 422 bytes .../ckeditor/skins/moono/images/spinner.gif | Bin 0 -> 2984 bytes .../ckgedit/ckeditor/skins/moono/readme.md | 49 + .../ckgedit/ckeditor/skins/moono/skin.js | 316 + lib/plugins/ckgedit/ckeditor/styles.js | 38 + lib/plugins/ckgedit/ckeditor/useheading.php | 13 + lib/plugins/ckgedit/conf/default.php | 45 + lib/plugins/ckgedit/conf/metadata.php | 41 + .../filemanager/browser/default/browser.css | 214 + .../filemanager/browser/default/browser.html | 378 + .../browser/default/frmactualfolder.html | 99 + .../browser/default/frmcreatefolder.html | 86 + .../browser/default/frmfolders.html | 278 + .../browser/default/frmresourceslist.html | 575 + .../browser/default/frmresourcetype.html | 76 + .../browser/default/frmupload.html | 188 + .../browser/default/images/ButtonArrow.gif | Bin 0 -> 138 bytes .../browser/default/images/Folder.gif | Bin 0 -> 128 bytes .../browser/default/images/Folder32.gif | Bin 0 -> 281 bytes .../browser/default/images/FolderOpened.gif | Bin 0 -> 132 bytes .../browser/default/images/FolderOpened32.gif | Bin 0 -> 264 bytes .../browser/default/images/FolderOpened32.psd | Bin 0 -> 11897 bytes .../default/images/FolderOpened32RO.gif | Bin 0 -> 379 bytes .../browser/default/images/FolderOpenedRO.gif | Bin 0 -> 134 bytes .../browser/default/images/FolderOpenedRO.psd | Bin 0 -> 8864 bytes .../browser/default/images/FolderRO.gif | Bin 0 -> 129 bytes .../browser/default/images/FolderUp.gif | Bin 0 -> 132 bytes .../browser/default/images/icons/32/ai.gif | Bin 0 -> 1140 bytes .../browser/default/images/icons/32/avi.gif | Bin 0 -> 454 bytes .../browser/default/images/icons/32/bmp.gif | Bin 0 -> 709 bytes .../browser/default/images/icons/32/cs.gif | Bin 0 -> 224 bytes .../default/images/icons/32/default.icon.gif | Bin 0 -> 177 bytes .../browser/default/images/icons/32/dll.gif | Bin 0 -> 258 bytes .../browser/default/images/icons/32/doc.gif | Bin 0 -> 260 bytes .../browser/default/images/icons/32/exe.gif | Bin 0 -> 170 bytes .../browser/default/images/icons/32/fla.gif | Bin 0 -> 946 bytes .../browser/default/images/icons/32/gif.gif | Bin 0 -> 704 bytes .../browser/default/images/icons/32/htm.gif | Bin 0 -> 1527 bytes .../browser/default/images/icons/32/html.gif | Bin 0 -> 1527 bytes .../browser/default/images/icons/32/jpg.gif | Bin 0 -> 463 bytes .../browser/default/images/icons/32/js.gif | Bin 0 -> 274 bytes .../browser/default/images/icons/32/mdb.gif | Bin 0 -> 274 bytes .../browser/default/images/icons/32/mp3.gif | Bin 0 -> 454 bytes .../browser/default/images/icons/32/pdf.gif | Bin 0 -> 567 bytes .../browser/default/images/icons/32/png.gif | Bin 0 -> 464 bytes .../browser/default/images/icons/32/ppt.gif | Bin 0 -> 254 bytes .../browser/default/images/icons/32/rdp.gif | Bin 0 -> 1493 bytes .../browser/default/images/icons/32/swf.gif | Bin 0 -> 725 bytes .../browser/default/images/icons/32/swt.gif | Bin 0 -> 724 bytes .../browser/default/images/icons/32/txt.gif | Bin 0 -> 213 bytes .../browser/default/images/icons/32/vsd.gif | Bin 0 -> 277 bytes .../browser/default/images/icons/32/xls.gif | Bin 0 -> 271 bytes .../browser/default/images/icons/32/xml.gif | Bin 0 -> 408 bytes .../browser/default/images/icons/32/zip.gif | Bin 0 -> 368 bytes .../browser/default/images/icons/ai.gif | Bin 0 -> 403 bytes .../browser/default/images/icons/avi.gif | Bin 0 -> 249 bytes .../browser/default/images/icons/bmp.gif | Bin 0 -> 126 bytes .../browser/default/images/icons/cs.gif | Bin 0 -> 128 bytes .../default/images/icons/default.icon.gif | Bin 0 -> 113 bytes .../browser/default/images/icons/dll.gif | Bin 0 -> 132 bytes .../browser/default/images/icons/doc.gif | Bin 0 -> 140 bytes .../browser/default/images/icons/exe.gif | Bin 0 -> 109 bytes .../browser/default/images/icons/fla.gif | Bin 0 -> 382 bytes .../browser/default/images/icons/gif.gif | Bin 0 -> 125 bytes .../browser/default/images/icons/htm.gif | Bin 0 -> 621 bytes .../browser/default/images/icons/html.gif | Bin 0 -> 621 bytes .../browser/default/images/icons/jpg.gif | Bin 0 -> 125 bytes .../browser/default/images/icons/js.gif | Bin 0 -> 139 bytes .../browser/default/images/icons/mdb.gif | Bin 0 -> 146 bytes .../browser/default/images/icons/mp3.gif | Bin 0 -> 249 bytes .../browser/default/images/icons/pdf.gif | Bin 0 -> 230 bytes .../browser/default/images/icons/png.gif | Bin 0 -> 125 bytes .../browser/default/images/icons/ppt.gif | Bin 0 -> 139 bytes .../browser/default/images/icons/rdp.gif | Bin 0 -> 606 bytes .../browser/default/images/icons/swf.gif | Bin 0 -> 388 bytes .../browser/default/images/icons/swt.gif | Bin 0 -> 388 bytes .../browser/default/images/icons/txt.gif | Bin 0 -> 122 bytes .../browser/default/images/icons/vsd.gif | Bin 0 -> 136 bytes .../browser/default/images/icons/xls.gif | Bin 0 -> 138 bytes .../browser/default/images/icons/xml.gif | Bin 0 -> 231 bytes .../browser/default/images/icons/zip.gif | Bin 0 -> 235 bytes .../browser/default/images/spacer.gif | Bin 0 -> 43 bytes .../browser/default/images/trash.png | Bin 0 -> 460 bytes .../filemanager/browser/default/js/browser.js | 272 + .../filemanager/browser/default/js/common.js | 98 + .../filemanager/browser/default/js/fckxml.js | 197 + .../browser/default/js/language.js | 79 + .../browser/default/js/safeFN_class.js | 269 + .../filemanager/browser/default/temp.css | 42 + .../connectors/php/Input.class.php | 335 + .../connectors/php/SafeFN.class.php | 218 + .../filemanager/connectors/php/basexml.php | 99 + .../filemanager/connectors/php/check_acl.php | 337 + .../filemanager/connectors/php/commands.php | 816 + .../filemanager/connectors/php/config.php | 499 + .../filemanager/connectors/php/connector.php | 127 + .../connectors/php/dwfck_sessions.php | 88 + .../connectors/php/input_utils.php | 23 + .../editor/filemanager/connectors/php/io.php | 306 + .../filemanager/connectors/php/phpcompat.php | 7 + .../filemanager/connectors/php/upload.php | 61 + .../filemanager/connectors/php/useheading.php | 20 + .../filemanager/connectors/php/utf8.php | 1771 + .../filemanager/connectors/php/util.php | 286 + .../editor/filemanager/connectors/test.html | 210 + .../filemanager/connectors/uploadtest.html | 192 + .../ckgedit/fckeditor/userfiles/.htaccess | 20 + .../fckeditor/userfiles/.htaccess.closed | 9 + .../fckeditor/userfiles/.htaccess.open | 10 + .../fckeditor/userfiles/.htaccess.security | 20 + .../ckgedit/fckeditor/userfiles/blink.jpg | Bin 0 -> 876 bytes lib/plugins/ckgedit/fckeditor/userfiles/file | 1 + lib/plugins/ckgedit/fckeditor/userfiles/flash | 1 + lib/plugins/ckgedit/fckeditor/userfiles/image | 1 + lib/plugins/ckgedit/fckeditor/userfiles/media | 1 + lib/plugins/ckgedit/helper.php | 365 + lib/plugins/ckgedit/images/keyboard.png | Bin 0 -> 161 bytes lib/plugins/ckgedit/images/larger.gif | Bin 0 -> 87 bytes lib/plugins/ckgedit/images/smaller.gif | Bin 0 -> 86 bytes lib/plugins/ckgedit/lang/ar/lang.php | 26 + lib/plugins/ckgedit/lang/cs/lang.php | 30 + lib/plugins/ckgedit/lang/de-informal/lang.php | 52 + .../ckgedit/lang/de-informal/settings.php | 40 + lib/plugins/ckgedit/lang/de/lang.php | 94 + lib/plugins/ckgedit/lang/de/merger.txt | 6 + lib/plugins/ckgedit/lang/de/scayt.txt | 1 + lib/plugins/ckgedit/lang/de/settings.php | 60 + lib/plugins/ckgedit/lang/de/style.txt | 10 + lib/plugins/ckgedit/lang/en.4.9.js.beautified | 876 + lib/plugins/ckgedit/lang/en/hogfather.txt | 1 + lib/plugins/ckgedit/lang/en/lang.php | 80 + lib/plugins/ckgedit/lang/en/scayt.txt | 3 + lib/plugins/ckgedit/lang/en/settings.php | 58 + lib/plugins/ckgedit/lang/en/style.txt | 11 + lib/plugins/ckgedit/lang/eo/lang.php | 33 + lib/plugins/ckgedit/lang/eo/settings.php | 38 + lib/plugins/ckgedit/lang/es/lang.php | 73 + lib/plugins/ckgedit/lang/es/merger.txt | 4 + lib/plugins/ckgedit/lang/es/scayt.txt | 1 + lib/plugins/ckgedit/lang/es/settings.php | 49 + lib/plugins/ckgedit/lang/fa/lang.php | 74 + lib/plugins/ckgedit/lang/fa/merger.txt | 5 + lib/plugins/ckgedit/lang/fa/scayt.txt | 2 + lib/plugins/ckgedit/lang/fa/settings.php | 32 + lib/plugins/ckgedit/lang/fr/lang.php | 79 + lib/plugins/ckgedit/lang/fr/merger.txt | 4 + lib/plugins/ckgedit/lang/fr/scayt.txt | 3 + lib/plugins/ckgedit/lang/fr/settings.php | 52 + lib/plugins/ckgedit/lang/hr/lang.php | 71 + lib/plugins/ckgedit/lang/hr/merger.txt | 2 + lib/plugins/ckgedit/lang/hr/scayt.txt | 3 + lib/plugins/ckgedit/lang/hr/settings.php | 48 + lib/plugins/ckgedit/lang/it/lang.php | 24 + lib/plugins/ckgedit/lang/it/settings.php | 26 + lib/plugins/ckgedit/lang/ja/lang.php | 65 + lib/plugins/ckgedit/lang/ja/settings.php | 38 + lib/plugins/ckgedit/lang/ko/lang.php | 42 + lib/plugins/ckgedit/lang/ko/settings.php | 40 + lib/plugins/ckgedit/lang/nl/lang.php | 75 + lib/plugins/ckgedit/lang/nl/merger.txt | 5 + lib/plugins/ckgedit/lang/nl/scayt.txt | 3 + lib/plugins/ckgedit/lang/nl/settings.php | 51 + lib/plugins/ckgedit/lang/pl/lang.php | 32 + lib/plugins/ckgedit/lang/pt-br/lang.php | 25 + lib/plugins/ckgedit/lang/ru/lang.php | 76 + lib/plugins/ckgedit/lang/ru/merger.txt | 4 + lib/plugins/ckgedit/lang/ru/scayt.txt | 1 + lib/plugins/ckgedit/lang/ru/settings.php | 52 + lib/plugins/ckgedit/lang/sr/lang.php | 41 + lib/plugins/ckgedit/lang/sv/lang.php | 34 + lib/plugins/ckgedit/lang/sv/settings.php | 16 + lib/plugins/ckgedit/lang/vi/lang.php | 72 + lib/plugins/ckgedit/lang/vi/merger.txt | 2 + lib/plugins/ckgedit/lang/vi/scayt.txt | 1 + lib/plugins/ckgedit/lang/vi/settings.php | 48 + lib/plugins/ckgedit/lang/zh-tw/lang.php | 34 + lib/plugins/ckgedit/lang/zh-tw/settings.php | 22 + lib/plugins/ckgedit/lang/zh/lang.php | 85 + lib/plugins/ckgedit/lang/zh/settings.php | 10 + lib/plugins/ckgedit/locktimer.js | 192 + lib/plugins/ckgedit/manager.dat | 2 + lib/plugins/ckgedit/plugin.info.txt | 8 + lib/plugins/ckgedit/renderer.php | 141 + lib/plugins/ckgedit/script.js | 507 + lib/plugins/ckgedit/scripts/add_v_animal.sh | 54 + lib/plugins/ckgedit/scripts/addanimal.sh | 61 + lib/plugins/ckgedit/scripts/css6.php | 524 + lib/plugins/ckgedit/scripts/draft_delete.php | 24 + lib/plugins/ckgedit/scripts/mediamgr.js | 54 + .../ckgedit/scripts/parse_wiki-cmpr.js | 1 + lib/plugins/ckgedit/scripts/parse_wiki.js.unc | 2002 + .../ckgedit/scripts/safeFN_class-cmpr.js | 1 + lib/plugins/ckgedit/scripts/safeFN_class.js | 273 + lib/plugins/ckgedit/scripts/safeFN_cmpr.js | 1 + lib/plugins/ckgedit/scripts/setsamesite.php | 22 + .../scripts/table_debugging_code.js.unc | 51 + lib/plugins/ckgedit/style.css | 5 + lib/plugins/ckgedit/syntax/font.php | 98 + lib/plugins/ckgedit/syntax/specials.php | 123 + lib/plugins/ckgedit/version | 2 + lib/plugins/cli.php | 9 + lib/plugins/config/admin.php | 292 + lib/plugins/config/admin.svg | 1 + lib/plugins/config/core/ConfigParser.php | 101 + lib/plugins/config/core/Configuration.php | 230 + lib/plugins/config/core/Loader.php | 285 + lib/plugins/config/core/Setting/Setting.php | 326 + .../config/core/Setting/SettingArray.php | 87 + .../config/core/Setting/SettingAuthtype.php | 62 + .../core/Setting/SettingCompression.php | 22 + .../config/core/Setting/SettingDirchoice.php | 34 + .../core/Setting/SettingDisableactions.php | 24 + .../config/core/Setting/SettingEmail.php | 60 + .../config/core/Setting/SettingFieldset.php | 17 + .../config/core/Setting/SettingHidden.php | 11 + .../config/core/Setting/SettingImConvert.php | 29 + .../config/core/Setting/SettingLicense.php | 24 + .../core/Setting/SettingMulticheckbox.php | 162 + .../core/Setting/SettingMultichoice.php | 74 + .../config/core/Setting/SettingNoClass.php | 13 + .../config/core/Setting/SettingNoDefault.php | 14 + .../core/Setting/SettingNoKnownClass.php | 12 + .../config/core/Setting/SettingNumeric.php | 47 + .../config/core/Setting/SettingNumericopt.php | 27 + .../config/core/Setting/SettingOnoff.php | 60 + .../config/core/Setting/SettingPassword.php | 41 + .../config/core/Setting/SettingRegex.php | 35 + .../config/core/Setting/SettingRenderer.php | 60 + .../config/core/Setting/SettingSavedir.php | 27 + .../config/core/Setting/SettingSepchar.php | 19 + .../config/core/Setting/SettingString.php | 32 + .../config/core/Setting/SettingUndefined.php | 43 + lib/plugins/config/core/Writer.php | 134 + lib/plugins/config/images/danger.png | Bin 0 -> 637 bytes lib/plugins/config/images/security.png | Bin 0 -> 682 bytes lib/plugins/config/images/warning.png | Bin 0 -> 606 bytes lib/plugins/config/lang/af/lang.php | 23 + lib/plugins/config/lang/ar/intro.txt | 7 + lib/plugins/config/lang/ar/lang.php | 188 + lib/plugins/config/lang/bg/intro.txt | 7 + lib/plugins/config/lang/bg/lang.php | 189 + lib/plugins/config/lang/ca-valencia/intro.txt | 10 + lib/plugins/config/lang/ca-valencia/lang.php | 169 + lib/plugins/config/lang/ca/intro.txt | 7 + lib/plugins/config/lang/ca/lang.php | 188 + lib/plugins/config/lang/ckb/intro.txt | 6 + lib/plugins/config/lang/ckb/lang.php | 212 + lib/plugins/config/lang/cs/intro.txt | 7 + lib/plugins/config/lang/cs/lang.php | 236 + lib/plugins/config/lang/cy/intro.txt | 7 + lib/plugins/config/lang/cy/lang.php | 252 + lib/plugins/config/lang/da/intro.txt | 7 + lib/plugins/config/lang/da/lang.php | 217 + lib/plugins/config/lang/de-informal/intro.txt | 7 + lib/plugins/config/lang/de-informal/lang.php | 218 + lib/plugins/config/lang/de/intro.txt | 7 + lib/plugins/config/lang/de/lang.php | 234 + lib/plugins/config/lang/el/intro.txt | 7 + lib/plugins/config/lang/el/lang.php | 210 + lib/plugins/config/lang/en/intro.txt | 7 + lib/plugins/config/lang/en/lang.php | 280 + lib/plugins/config/lang/eo/intro.txt | 7 + lib/plugins/config/lang/eo/lang.php | 197 + lib/plugins/config/lang/es/intro.txt | 7 + lib/plugins/config/lang/es/lang.php | 230 + lib/plugins/config/lang/et/lang.php | 36 + lib/plugins/config/lang/eu/intro.txt | 7 + lib/plugins/config/lang/eu/lang.php | 177 + lib/plugins/config/lang/fa/intro.txt | 8 + lib/plugins/config/lang/fa/lang.php | 211 + lib/plugins/config/lang/fi/intro.txt | 7 + lib/plugins/config/lang/fi/lang.php | 191 + lib/plugins/config/lang/fr/intro.txt | 7 + lib/plugins/config/lang/fr/lang.php | 240 + lib/plugins/config/lang/gl/intro.txt | 7 + lib/plugins/config/lang/gl/lang.php | 186 + lib/plugins/config/lang/he/intro.txt | 7 + lib/plugins/config/lang/he/lang.php | 158 + lib/plugins/config/lang/hi/lang.php | 14 + lib/plugins/config/lang/hr/intro.txt | 7 + lib/plugins/config/lang/hr/lang.php | 202 + lib/plugins/config/lang/hu/intro.txt | 9 + lib/plugins/config/lang/hu/lang.php | 205 + lib/plugins/config/lang/ia/intro.txt | 7 + lib/plugins/config/lang/ia/lang.php | 167 + lib/plugins/config/lang/id-ni/intro.txt | 7 + lib/plugins/config/lang/id-ni/lang.php | 62 + lib/plugins/config/lang/id/intro.txt | 7 + lib/plugins/config/lang/is/lang.php | 58 + lib/plugins/config/lang/it/intro.txt | 7 + lib/plugins/config/lang/it/lang.php | 224 + lib/plugins/config/lang/ja/intro.txt | 11 + lib/plugins/config/lang/ja/lang.php | 217 + lib/plugins/config/lang/ko/intro.txt | 7 + lib/plugins/config/lang/ko/lang.php | 209 + lib/plugins/config/lang/la/intro.txt | 7 + lib/plugins/config/lang/la/lang.php | 168 + lib/plugins/config/lang/lb/intro.txt | 7 + lib/plugins/config/lang/lt/intro.txt | 7 + lib/plugins/config/lang/lt/lang.php | 25 + lib/plugins/config/lang/lv/intro.txt | 7 + lib/plugins/config/lang/lv/lang.php | 177 + lib/plugins/config/lang/mr/intro.txt | 10 + lib/plugins/config/lang/mr/lang.php | 169 + lib/plugins/config/lang/ne/lang.php | 66 + lib/plugins/config/lang/nl/intro.txt | 7 + lib/plugins/config/lang/nl/lang.php | 219 + lib/plugins/config/lang/no/intro.txt | 7 + lib/plugins/config/lang/no/lang.php | 208 + lib/plugins/config/lang/pl/intro.txt | 7 + lib/plugins/config/lang/pl/lang.php | 226 + lib/plugins/config/lang/pt-br/intro.txt | 7 + lib/plugins/config/lang/pt-br/lang.php | 231 + lib/plugins/config/lang/pt/intro.txt | 7 + lib/plugins/config/lang/pt/lang.php | 226 + lib/plugins/config/lang/ro/intro.txt | 7 + lib/plugins/config/lang/ro/lang.php | 182 + lib/plugins/config/lang/ru/intro.txt | 7 + lib/plugins/config/lang/ru/lang.php | 230 + lib/plugins/config/lang/sk/intro.txt | 7 + lib/plugins/config/lang/sk/lang.php | 204 + lib/plugins/config/lang/sl/intro.txt | 7 + lib/plugins/config/lang/sl/lang.php | 181 + lib/plugins/config/lang/sq/intro.txt | 7 + lib/plugins/config/lang/sq/lang.php | 172 + lib/plugins/config/lang/sr/intro.txt | 7 + lib/plugins/config/lang/sr/lang.php | 176 + lib/plugins/config/lang/sv/intro.txt | 7 + lib/plugins/config/lang/sv/lang.php | 205 + lib/plugins/config/lang/th/lang.php | 102 + lib/plugins/config/lang/tr/intro.txt | 7 + lib/plugins/config/lang/tr/lang.php | 132 + lib/plugins/config/lang/uk/intro.txt | 7 + lib/plugins/config/lang/uk/lang.php | 193 + lib/plugins/config/lang/vi/intro.txt | 7 + lib/plugins/config/lang/vi/lang.php | 213 + lib/plugins/config/lang/zh-tw/intro.txt | 7 + lib/plugins/config/lang/zh-tw/lang.php | 193 + lib/plugins/config/lang/zh/intro.txt | 7 + lib/plugins/config/lang/zh/lang.php | 243 + lib/plugins/config/plugin.info.txt | 7 + .../config/settings/config.metadata.php | 264 + lib/plugins/config/style.css | 167 + lib/plugins/extension/action.php | 90 + lib/plugins/extension/admin.php | 188 + lib/plugins/extension/admin.svg | 1 + lib/plugins/extension/all.less | 37 + lib/plugins/extension/cli.php | 392 + lib/plugins/extension/helper/extension.php | 1320 + lib/plugins/extension/helper/gui.php | 240 + lib/plugins/extension/helper/list.php | 674 + lib/plugins/extension/helper/repository.php | 223 + lib/plugins/extension/images/bug.gif | Bin 0 -> 194 bytes lib/plugins/extension/images/disabled.png | Bin 0 -> 1163 bytes lib/plugins/extension/images/donate.png | Bin 0 -> 677 bytes lib/plugins/extension/images/down.png | Bin 0 -> 197 bytes lib/plugins/extension/images/enabled.png | Bin 0 -> 1172 bytes lib/plugins/extension/images/icons.xcf | Bin 0 -> 67195 bytes lib/plugins/extension/images/license.txt | 4 + lib/plugins/extension/images/overlay.png | Bin 0 -> 68 bytes lib/plugins/extension/images/plugin.png | Bin 0 -> 4054 bytes lib/plugins/extension/images/tag.png | Bin 0 -> 341 bytes lib/plugins/extension/images/template.png | Bin 0 -> 5206 bytes lib/plugins/extension/images/up.png | Bin 0 -> 197 bytes lib/plugins/extension/images/warning.png | Bin 0 -> 606 bytes .../extension/lang/bg/intro_install.txt | 1 + .../extension/lang/bg/intro_plugins.txt | 1 + .../extension/lang/bg/intro_search.txt | 1 + .../extension/lang/bg/intro_templates.txt | 1 + lib/plugins/extension/lang/bg/lang.php | 84 + lib/plugins/extension/lang/ca/lang.php | 73 + .../extension/lang/ckb/intro_install.txt | 1 + .../extension/lang/ckb/intro_plugins.txt | 1 + .../extension/lang/ckb/intro_search.txt | 1 + .../extension/lang/ckb/intro_templates.txt | 1 + lib/plugins/extension/lang/ckb/lang.php | 96 + .../extension/lang/cs/intro_install.txt | 1 + .../extension/lang/cs/intro_plugins.txt | 1 + .../extension/lang/cs/intro_search.txt | 1 + .../extension/lang/cs/intro_templates.txt | 1 + lib/plugins/extension/lang/cs/lang.php | 100 + .../extension/lang/cy/intro_install.txt | 1 + .../extension/lang/cy/intro_plugins.txt | 1 + .../extension/lang/cy/intro_search.txt | 1 + .../extension/lang/cy/intro_templates.txt | 1 + lib/plugins/extension/lang/cy/lang.php | 111 + .../extension/lang/da/intro_install.txt | 1 + .../extension/lang/da/intro_plugins.txt | 1 + .../extension/lang/da/intro_search.txt | 1 + .../extension/lang/da/intro_templates.txt | 1 + lib/plugins/extension/lang/da/lang.php | 97 + .../lang/de-informal/intro_install.txt | 1 + .../lang/de-informal/intro_plugins.txt | 1 + .../lang/de-informal/intro_search.txt | 1 + .../lang/de-informal/intro_templates.txt | 1 + .../extension/lang/de-informal/lang.php | 97 + .../extension/lang/de/intro_install.txt | 1 + .../extension/lang/de/intro_plugins.txt | 1 + .../extension/lang/de/intro_search.txt | 1 + .../extension/lang/de/intro_templates.txt | 1 + lib/plugins/extension/lang/de/lang.php | 105 + .../extension/lang/el/intro_install.txt | 1 + .../extension/lang/el/intro_plugins.txt | 1 + .../extension/lang/el/intro_search.txt | 1 + .../extension/lang/el/intro_templates.txt | 1 + lib/plugins/extension/lang/el/lang.php | 105 + .../extension/lang/en/intro_install.txt | 1 + .../extension/lang/en/intro_plugins.txt | 1 + .../extension/lang/en/intro_search.txt | 1 + .../extension/lang/en/intro_templates.txt | 1 + lib/plugins/extension/lang/en/lang.php | 112 + .../extension/lang/eo/intro_install.txt | 1 + .../extension/lang/eo/intro_plugins.txt | 1 + .../extension/lang/eo/intro_search.txt | 1 + .../extension/lang/eo/intro_templates.txt | 1 + lib/plugins/extension/lang/eo/lang.php | 89 + .../extension/lang/es/intro_install.txt | 1 + .../extension/lang/es/intro_plugins.txt | 1 + .../extension/lang/es/intro_search.txt | 1 + .../extension/lang/es/intro_templates.txt | 1 + lib/plugins/extension/lang/es/lang.php | 101 + .../extension/lang/fa/intro_install.txt | 1 + .../extension/lang/fa/intro_plugins.txt | 1 + .../extension/lang/fa/intro_search.txt | 1 + .../extension/lang/fa/intro_templates.txt | 1 + lib/plugins/extension/lang/fa/lang.php | 97 + lib/plugins/extension/lang/fi/lang.php | 37 + .../extension/lang/fr/intro_install.txt | 1 + .../extension/lang/fr/intro_plugins.txt | 1 + .../extension/lang/fr/intro_search.txt | 1 + .../extension/lang/fr/intro_templates.txt | 1 + lib/plugins/extension/lang/fr/lang.php | 102 + lib/plugins/extension/lang/he/lang.php | 26 + .../extension/lang/hr/intro_install.txt | 1 + .../extension/lang/hr/intro_plugins.txt | 1 + .../extension/lang/hr/intro_search.txt | 1 + .../extension/lang/hr/intro_templates.txt | 1 + lib/plugins/extension/lang/hr/lang.php | 95 + .../extension/lang/hu/intro_install.txt | 1 + .../extension/lang/hu/intro_plugins.txt | 1 + .../extension/lang/hu/intro_search.txt | 1 + .../extension/lang/hu/intro_templates.txt | 1 + lib/plugins/extension/lang/hu/lang.php | 97 + .../extension/lang/it/intro_install.txt | 1 + .../extension/lang/it/intro_plugins.txt | 1 + .../extension/lang/it/intro_search.txt | 1 + .../extension/lang/it/intro_templates.txt | 1 + lib/plugins/extension/lang/it/lang.php | 100 + .../extension/lang/ja/intro_install.txt | 1 + .../extension/lang/ja/intro_plugins.txt | 1 + .../extension/lang/ja/intro_search.txt | 1 + .../extension/lang/ja/intro_templates.txt | 1 + lib/plugins/extension/lang/ja/lang.php | 100 + .../extension/lang/ko/intro_install.txt | 1 + .../extension/lang/ko/intro_plugins.txt | 1 + .../extension/lang/ko/intro_search.txt | 1 + .../extension/lang/ko/intro_templates.txt | 1 + lib/plugins/extension/lang/ko/lang.php | 97 + .../extension/lang/lv/intro_templates.txt | 1 + lib/plugins/extension/lang/lv/lang.php | 8 + .../extension/lang/nl/intro_install.txt | 1 + .../extension/lang/nl/intro_plugins.txt | 1 + .../extension/lang/nl/intro_search.txt | 1 + .../extension/lang/nl/intro_templates.txt | 1 + lib/plugins/extension/lang/nl/lang.php | 102 + .../extension/lang/no/intro_install.txt | 1 + .../extension/lang/no/intro_plugins.txt | 1 + .../extension/lang/no/intro_search.txt | 1 + .../extension/lang/no/intro_templates.txt | 2 + lib/plugins/extension/lang/no/lang.php | 95 + .../extension/lang/pl/intro_install.txt | 1 + .../extension/lang/pl/intro_plugins.txt | 1 + .../extension/lang/pl/intro_search.txt | 1 + .../extension/lang/pl/intro_templates.txt | 1 + lib/plugins/extension/lang/pl/lang.php | 102 + .../extension/lang/pt-br/intro_install.txt | 1 + .../extension/lang/pt-br/intro_plugins.txt | 1 + .../extension/lang/pt-br/intro_search.txt | 1 + .../extension/lang/pt-br/intro_templates.txt | 1 + lib/plugins/extension/lang/pt-br/lang.php | 100 + .../extension/lang/pt/intro_install.txt | 1 + .../extension/lang/pt/intro_plugins.txt | 1 + .../extension/lang/pt/intro_search.txt | 1 + .../extension/lang/pt/intro_templates.txt | 1 + lib/plugins/extension/lang/pt/lang.php | 149 + .../extension/lang/ru/intro_install.txt | 1 + .../extension/lang/ru/intro_plugins.txt | 1 + .../extension/lang/ru/intro_search.txt | 1 + .../extension/lang/ru/intro_templates.txt | 1 + lib/plugins/extension/lang/ru/lang.php | 106 + .../extension/lang/sk/intro_install.txt | 1 + .../extension/lang/sk/intro_plugins.txt | 1 + .../extension/lang/sk/intro_search.txt | 1 + .../extension/lang/sk/intro_templates.txt | 1 + lib/plugins/extension/lang/sk/lang.php | 99 + .../extension/lang/sr/intro_install.txt | 1 + lib/plugins/extension/lang/sr/lang.php | 66 + lib/plugins/extension/lang/sv/lang.php | 94 + lib/plugins/extension/lang/tr/lang.php | 61 + lib/plugins/extension/lang/uk/lang.php | 51 + .../extension/lang/vi/intro_install.txt | 1 + .../extension/lang/vi/intro_plugins.txt | 1 + .../extension/lang/vi/intro_search.txt | 1 + .../extension/lang/vi/intro_templates.txt | 1 + lib/plugins/extension/lang/vi/lang.php | 96 + .../extension/lang/zh-tw/intro_install.txt | 1 + .../extension/lang/zh-tw/intro_plugins.txt | 1 + lib/plugins/extension/lang/zh-tw/lang.php | 86 + .../extension/lang/zh/intro_install.txt | 1 + .../extension/lang/zh/intro_plugins.txt | 1 + .../extension/lang/zh/intro_search.txt | 1 + .../extension/lang/zh/intro_templates.txt | 1 + lib/plugins/extension/lang/zh/lang.php | 108 + lib/plugins/extension/plugin.info.txt | 7 + lib/plugins/extension/script.js | 149 + lib/plugins/extension/style.less | 386 + lib/plugins/index.html | 11 + .../indexmenu/.github/workflows/dokuwiki.yml | 11 + lib/plugins/indexmenu/CREDITS | 64 + lib/plugins/indexmenu/Search.php | 871 + lib/plugins/indexmenu/_test/ActionTest.php | 35 + .../indexmenu/_test/AjaxRequestsTest.php | 345 + lib/plugins/indexmenu/_test/GeneralTest.php | 86 + .../indexmenu/_test/IndexmenuSyntaxTest.php | 353 + lib/plugins/indexmenu/action.php | 561 + lib/plugins/indexmenu/ajax.php | 85 + lib/plugins/indexmenu/all.less | 44 + lib/plugins/indexmenu/conf/default.php | 21 + lib/plugins/indexmenu/conf/metadata.php | 21 + .../indexmenu/images/bj-tango.png/base.png | Bin 0 -> 606 bytes .../indexmenu/images/bj-tango.png/empty.png | Bin 0 -> 157 bytes .../indexmenu/images/bj-tango.png/folder.png | Bin 0 -> 498 bytes .../indexmenu/images/bj-tango.png/folderh.png | Bin 0 -> 528 bytes .../images/bj-tango.png/folderhopen.png | Bin 0 -> 537 bytes .../images/bj-tango.png/folderopen.png | Bin 0 -> 523 bytes .../indexmenu/images/bj-tango.png/info.txt | 3 + .../indexmenu/images/bj-tango.png/join.png | Bin 0 -> 131 bytes .../images/bj-tango.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/bj-tango.png/line.png | Bin 0 -> 128 bytes .../indexmenu/images/bj-tango.png/minus.png | Bin 0 -> 171 bytes .../images/bj-tango.png/minusbottom.png | Bin 0 -> 167 bytes .../images/bj-tango.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/bj-tango.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/bj-tango.png/page.png | Bin 0 -> 333 bytes .../indexmenu/images/bj-tango.png/plus.png | Bin 0 -> 183 bytes .../images/bj-tango.png/plusbottom.png | Bin 0 -> 183 bytes .../indexmenu/images/bj_ubuntu.png/base.png | Bin 0 -> 525 bytes .../indexmenu/images/bj_ubuntu.png/empty.png | Bin 0 -> 157 bytes .../indexmenu/images/bj_ubuntu.png/folder.png | Bin 0 -> 498 bytes .../images/bj_ubuntu.png/folderh.png | Bin 0 -> 537 bytes .../images/bj_ubuntu.png/folderhopen.png | Bin 0 -> 523 bytes .../images/bj_ubuntu.png/folderopen.png | Bin 0 -> 523 bytes .../indexmenu/images/bj_ubuntu.png/info.txt | 3 + .../indexmenu/images/bj_ubuntu.png/join.png | Bin 0 -> 131 bytes .../images/bj_ubuntu.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/bj_ubuntu.png/line.png | Bin 0 -> 128 bytes .../indexmenu/images/bj_ubuntu.png/minus.png | Bin 0 -> 171 bytes .../images/bj_ubuntu.png/minusbottom.png | Bin 0 -> 167 bytes .../images/bj_ubuntu.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/bj_ubuntu.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/bj_ubuntu.png/page.png | Bin 0 -> 333 bytes .../indexmenu/images/bj_ubuntu.png/plus.png | Bin 0 -> 183 bytes .../images/bj_ubuntu.png/plusbottom.png | Bin 0 -> 183 bytes lib/plugins/indexmenu/images/bw.png/base.png | Bin 0 -> 3241 bytes lib/plugins/indexmenu/images/bw.png/empty.png | Bin 0 -> 183 bytes .../indexmenu/images/bw.png/folder.png | Bin 0 -> 3116 bytes .../indexmenu/images/bw.png/folderh.png | Bin 0 -> 3197 bytes .../indexmenu/images/bw.png/folderhopen.png | Bin 0 -> 399 bytes .../indexmenu/images/bw.png/folderopen.png | Bin 0 -> 3203 bytes lib/plugins/indexmenu/images/bw.png/info.txt | 2 + lib/plugins/indexmenu/images/bw.png/join.png | Bin 0 -> 201 bytes .../indexmenu/images/bw.png/joinbottom.png | Bin 0 -> 204 bytes lib/plugins/indexmenu/images/bw.png/line.png | Bin 0 -> 198 bytes lib/plugins/indexmenu/images/bw.png/minus.png | Bin 0 -> 234 bytes .../indexmenu/images/bw.png/minusbottom.png | Bin 0 -> 235 bytes .../indexmenu/images/bw.png/nolines_minus.png | Bin 0 -> 207 bytes .../indexmenu/images/bw.png/nolines_plus.png | Bin 0 -> 212 bytes lib/plugins/indexmenu/images/bw.png/page.png | Bin 0 -> 3212 bytes lib/plugins/indexmenu/images/bw.png/plus.png | Bin 0 -> 243 bytes .../indexmenu/images/bw.png/plusbottom.png | Bin 0 -> 242 bytes lib/plugins/indexmenu/images/close.gif | Bin 0 -> 64 bytes .../images/contis_tango.png/base.png | Bin 0 -> 440 bytes .../images/contis_tango.png/empty.png | Bin 0 -> 157 bytes .../images/contis_tango.png/folder.png | Bin 0 -> 417 bytes .../images/contis_tango.png/folderh.png | Bin 0 -> 440 bytes .../images/contis_tango.png/folderhopen.png | Bin 0 -> 438 bytes .../images/contis_tango.png/folderopen.png | Bin 0 -> 438 bytes .../images/contis_tango.png/info.txt | 3 + .../images/contis_tango.png/join.png | Bin 0 -> 131 bytes .../images/contis_tango.png/joinbottom.png | Bin 0 -> 132 bytes .../images/contis_tango.png/line.png | Bin 0 -> 128 bytes .../images/contis_tango.png/minus.png | Bin 0 -> 171 bytes .../images/contis_tango.png/minusbottom.png | Bin 0 -> 167 bytes .../images/contis_tango.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/contis_tango.png/nolines_plus.png | Bin 0 -> 160 bytes .../images/contis_tango.png/page.png | Bin 0 -> 333 bytes .../images/contis_tango.png/plus.png | Bin 0 -> 183 bytes .../images/contis_tango.png/plusbottom.png | Bin 0 -> 183 bytes lib/plugins/indexmenu/images/default/base.gif | Bin 0 -> 578 bytes .../indexmenu/images/default/empty.gif | Bin 0 -> 62 bytes .../indexmenu/images/default/folder.gif | Bin 0 -> 352 bytes .../indexmenu/images/default/folderh.gif | Bin 0 -> 572 bytes .../indexmenu/images/default/folderhopen.gif | Bin 0 -> 577 bytes .../indexmenu/images/default/folderopen.gif | Bin 0 -> 354 bytes lib/plugins/indexmenu/images/default/info.txt | 2 + lib/plugins/indexmenu/images/default/join.gif | Bin 0 -> 69 bytes .../indexmenu/images/default/joinbottom.gif | Bin 0 -> 66 bytes lib/plugins/indexmenu/images/default/line.gif | Bin 0 -> 66 bytes .../indexmenu/images/default/minus.gif | Bin 0 -> 86 bytes .../indexmenu/images/default/minusbottom.gif | Bin 0 -> 85 bytes .../images/default/nolines_minus.gif | Bin 0 -> 861 bytes .../indexmenu/images/default/nolines_plus.gif | Bin 0 -> 870 bytes lib/plugins/indexmenu/images/default/page.gif | Bin 0 -> 565 bytes lib/plugins/indexmenu/images/default/plus.gif | Bin 0 -> 89 bytes .../indexmenu/images/default/plusbottom.gif | Bin 0 -> 88 bytes lib/plugins/indexmenu/images/doku/base.gif | Bin 0 -> 54 bytes lib/plugins/indexmenu/images/doku/empty.gif | Bin 0 -> 62 bytes lib/plugins/indexmenu/images/doku/folder.gif | Bin 0 -> 54 bytes lib/plugins/indexmenu/images/doku/folderh.gif | Bin 0 -> 54 bytes .../indexmenu/images/doku/folderhopen.gif | Bin 0 -> 54 bytes .../indexmenu/images/doku/folderopen.gif | Bin 0 -> 54 bytes lib/plugins/indexmenu/images/doku/info.txt | 2 + lib/plugins/indexmenu/images/doku/join.gif | Bin 0 -> 62 bytes .../indexmenu/images/doku/joinbottom.gif | Bin 0 -> 62 bytes lib/plugins/indexmenu/images/doku/line.gif | Bin 0 -> 62 bytes lib/plugins/indexmenu/images/doku/minus.gif | Bin 0 -> 62 bytes .../indexmenu/images/doku/minusbottom.gif | Bin 0 -> 62 bytes .../indexmenu/images/doku/nolines_minus.gif | Bin 0 -> 62 bytes .../indexmenu/images/doku/nolines_plus.gif | Bin 0 -> 62 bytes lib/plugins/indexmenu/images/doku/page.gif | Bin 0 -> 50 bytes lib/plugins/indexmenu/images/doku/plus.gif | Bin 0 -> 62 bytes .../indexmenu/images/doku/plusbottom.gif | Bin 0 -> 62 bytes lib/plugins/indexmenu/images/doku2/Thumbs.db | Bin 0 -> 7168 bytes lib/plugins/indexmenu/images/doku2/base.gif | Bin 0 -> 810 bytes lib/plugins/indexmenu/images/doku2/empty.gif | Bin 0 -> 62 bytes lib/plugins/indexmenu/images/doku2/folder.gif | Bin 0 -> 810 bytes .../indexmenu/images/doku2/folderh.gif | Bin 0 -> 810 bytes .../indexmenu/images/doku2/folderhopen.gif | Bin 0 -> 810 bytes .../indexmenu/images/doku2/folderopen.gif | Bin 0 -> 810 bytes lib/plugins/indexmenu/images/doku2/info.txt | 2 + lib/plugins/indexmenu/images/doku2/join.gif | Bin 0 -> 62 bytes .../indexmenu/images/doku2/joinbottom.gif | Bin 0 -> 62 bytes lib/plugins/indexmenu/images/doku2/line.gif | Bin 0 -> 62 bytes lib/plugins/indexmenu/images/doku2/minus.gif | Bin 0 -> 852 bytes .../indexmenu/images/doku2/minusbottom.gif | Bin 0 -> 852 bytes .../indexmenu/images/doku2/nolines_minus.gif | Bin 0 -> 861 bytes .../indexmenu/images/doku2/nolines_plus.gif | Bin 0 -> 870 bytes lib/plugins/indexmenu/images/doku2/page.gif | Bin 0 -> 810 bytes lib/plugins/indexmenu/images/doku2/plus.gif | Bin 0 -> 855 bytes .../indexmenu/images/doku2/plusbottom.gif | Bin 0 -> 855 bytes lib/plugins/indexmenu/images/doku2/style.css | 19 + .../indexmenu/images/drktheme/base.gif | Bin 0 -> 139 bytes .../indexmenu/images/drktheme/empty.gif | Bin 0 -> 62 bytes .../indexmenu/images/drktheme/folder.gif | Bin 0 -> 190 bytes .../indexmenu/images/drktheme/folderh.gif | Bin 0 -> 190 bytes .../indexmenu/images/drktheme/folderhopen.gif | Bin 0 -> 197 bytes .../indexmenu/images/drktheme/folderopen.gif | Bin 0 -> 197 bytes .../indexmenu/images/drktheme/info.txt | 3 + .../indexmenu/images/drktheme/join.gif | Bin 0 -> 166 bytes .../indexmenu/images/drktheme/joinbottom.gif | Bin 0 -> 158 bytes .../indexmenu/images/drktheme/line.gif | Bin 0 -> 162 bytes .../indexmenu/images/drktheme/minus.gif | Bin 0 -> 91 bytes .../indexmenu/images/drktheme/minusbottom.gif | Bin 0 -> 89 bytes .../images/drktheme/nolines_minus.gif | Bin 0 -> 861 bytes .../images/drktheme/nolines_plus.gif | Bin 0 -> 870 bytes .../indexmenu/images/drktheme/page.gif | Bin 0 -> 565 bytes .../indexmenu/images/drktheme/plus.gif | Bin 0 -> 94 bytes .../indexmenu/images/drktheme/plusbottom.gif | Bin 0 -> 90 bytes .../indexmenu/images/drktheme/style.css | 7 + .../indexmenu/images/dryoo.png/base.png | Bin 0 -> 701 bytes .../indexmenu/images/dryoo.png/empty.png | Bin 0 -> 157 bytes .../indexmenu/images/dryoo.png/folder.png | Bin 0 -> 724 bytes .../indexmenu/images/dryoo.png/folderh.png | Bin 0 -> 731 bytes .../images/dryoo.png/folderhopen.png | Bin 0 -> 735 bytes .../indexmenu/images/dryoo.png/folderopen.png | Bin 0 -> 733 bytes .../indexmenu/images/dryoo.png/info.txt | 2 + .../indexmenu/images/dryoo.png/join.png | Bin 0 -> 131 bytes .../indexmenu/images/dryoo.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/dryoo.png/line.png | Bin 0 -> 128 bytes .../indexmenu/images/dryoo.png/minus.png | Bin 0 -> 171 bytes .../images/dryoo.png/minusbottom.png | Bin 0 -> 167 bytes .../images/dryoo.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/dryoo.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/dryoo.png/page.png | Bin 0 -> 733 bytes .../indexmenu/images/dryoo.png/plus.png | Bin 0 -> 183 bytes .../indexmenu/images/dryoo.png/plusbottom.png | Bin 0 -> 183 bytes lib/plugins/indexmenu/images/empty.gif | Bin 0 -> 275 bytes .../indexmenu/images/gnome.png/base.png | Bin 0 -> 525 bytes .../indexmenu/images/gnome.png/empty.png | Bin 0 -> 157 bytes .../indexmenu/images/gnome.png/folder.png | Bin 0 -> 479 bytes .../indexmenu/images/gnome.png/folderh.png | Bin 0 -> 588 bytes .../images/gnome.png/folderhopen.png | Bin 0 -> 533 bytes .../indexmenu/images/gnome.png/folderopen.png | Bin 0 -> 533 bytes .../indexmenu/images/gnome.png/info.txt | 3 + .../indexmenu/images/gnome.png/join.png | Bin 0 -> 131 bytes .../indexmenu/images/gnome.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/gnome.png/line.png | Bin 0 -> 128 bytes .../indexmenu/images/gnome.png/minus.png | Bin 0 -> 171 bytes .../images/gnome.png/minusbottom.png | Bin 0 -> 167 bytes .../images/gnome.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/gnome.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/gnome.png/page.png | Bin 0 -> 333 bytes .../indexmenu/images/gnome.png/plus.png | Bin 0 -> 183 bytes .../indexmenu/images/gnome.png/plusbottom.png | Bin 0 -> 183 bytes .../indexmenu/images/human.png/base.png | Bin 0 -> 776 bytes .../indexmenu/images/human.png/empty.png | Bin 0 -> 157 bytes .../indexmenu/images/human.png/folder.png | Bin 0 -> 674 bytes .../indexmenu/images/human.png/folderh.png | Bin 0 -> 962 bytes .../images/human.png/folderhopen.png | Bin 0 -> 883 bytes .../indexmenu/images/human.png/folderopen.png | Bin 0 -> 733 bytes .../indexmenu/images/human.png/info.txt | 3 + .../indexmenu/images/human.png/join.png | Bin 0 -> 131 bytes .../indexmenu/images/human.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/human.png/line.png | Bin 0 -> 128 bytes .../indexmenu/images/human.png/minus.png | Bin 0 -> 171 bytes .../images/human.png/minusbottom.png | Bin 0 -> 167 bytes .../images/human.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/human.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/human.png/page.png | Bin 0 -> 333 bytes .../indexmenu/images/human.png/plus.png | Bin 0 -> 183 bytes .../indexmenu/images/human.png/plusbottom.png | Bin 0 -> 183 bytes .../indexmenu/images/human.png/style.css | 35 + .../images/icons8metrobw.png/base.png | Bin 0 -> 394 bytes .../images/icons8metrobw.png/empty.png | Bin 0 -> 183 bytes .../images/icons8metrobw.png/folder.png | Bin 0 -> 319 bytes .../images/icons8metrobw.png/folderh.png | Bin 0 -> 433 bytes .../images/icons8metrobw.png/folderhopen.png | Bin 0 -> 602 bytes .../images/icons8metrobw.png/folderopen.png | Bin 0 -> 439 bytes .../images/icons8metrobw.png/info.txt | 3 + .../images/icons8metrobw.png/join.png | Bin 0 -> 183 bytes .../images/icons8metrobw.png/joinbottom.png | Bin 0 -> 183 bytes .../images/icons8metrobw.png/line.png | Bin 0 -> 183 bytes .../images/icons8metrobw.png/minus.png | Bin 0 -> 290 bytes .../images/icons8metrobw.png/minusbottom.png | Bin 0 -> 290 bytes .../icons8metrobw.png/nolines_minus.png | Bin 0 -> 290 bytes .../images/icons8metrobw.png/nolines_plus.png | Bin 0 -> 327 bytes .../images/icons8metrobw.png/page.png | Bin 0 -> 527 bytes .../images/icons8metrobw.png/plus.png | Bin 0 -> 327 bytes .../images/icons8metrobw.png/plusbottom.png | Bin 0 -> 327 bytes .../indexmenu/images/icons8w10bw.png/base.png | Bin 0 -> 357 bytes .../images/icons8w10bw.png/empty.png | Bin 0 -> 183 bytes .../images/icons8w10bw.png/folder.png | Bin 0 -> 237 bytes .../images/icons8w10bw.png/folderh.png | Bin 0 -> 237 bytes .../images/icons8w10bw.png/folderhopen.png | Bin 0 -> 378 bytes .../images/icons8w10bw.png/folderopen.png | Bin 0 -> 341 bytes .../indexmenu/images/icons8w10bw.png/info.txt | 3 + .../indexmenu/images/icons8w10bw.png/join.png | Bin 0 -> 201 bytes .../images/icons8w10bw.png/joinbottom.png | Bin 0 -> 204 bytes .../indexmenu/images/icons8w10bw.png/line.png | Bin 0 -> 198 bytes .../images/icons8w10bw.png/minus.png | Bin 0 -> 234 bytes .../images/icons8w10bw.png/minusbottom.png | Bin 0 -> 235 bytes .../images/icons8w10bw.png/nolines_minus.png | Bin 0 -> 207 bytes .../images/icons8w10bw.png/nolines_plus.png | Bin 0 -> 212 bytes .../indexmenu/images/icons8w10bw.png/page.png | Bin 0 -> 295 bytes .../indexmenu/images/icons8w10bw.png/plus.png | Bin 0 -> 243 bytes .../images/icons8w10bw.png/plusbottom.png | Bin 0 -> 242 bytes .../indexmenu/images/indexmenu_toolbar.png | Bin 0 -> 726 bytes .../indexmenu/images/indextheme/base.gif | Bin 0 -> 530 bytes .../indexmenu/images/indextheme/empty.gif | Bin 0 -> 62 bytes .../indexmenu/images/indextheme/folder.gif | Bin 0 -> 596 bytes .../indexmenu/images/indextheme/folderh.gif | Bin 0 -> 596 bytes .../images/indextheme/folderhopen.gif | Bin 0 -> 537 bytes .../images/indextheme/folderopen.gif | Bin 0 -> 537 bytes .../indexmenu/images/indextheme/info.txt | 2 + .../indexmenu/images/indextheme/join.gif | Bin 0 -> 75 bytes .../images/indextheme/joinbottom.gif | Bin 0 -> 72 bytes .../indexmenu/images/indextheme/line.gif | Bin 0 -> 72 bytes .../indexmenu/images/indextheme/minus.gif | Bin 0 -> 276 bytes .../images/indextheme/minusbottom.gif | Bin 0 -> 274 bytes .../indexmenu/images/indextheme/page.gif | Bin 0 -> 635 bytes .../indexmenu/images/indextheme/plus.gif | Bin 0 -> 278 bytes .../images/indextheme/plusbottom.gif | Bin 0 -> 275 bytes lib/plugins/indexmenu/images/kde.png/base.png | Bin 0 -> 935 bytes .../indexmenu/images/kde.png/empty.png | Bin 0 -> 157 bytes .../indexmenu/images/kde.png/folder.png | Bin 0 -> 938 bytes .../indexmenu/images/kde.png/folderh.png | Bin 0 -> 938 bytes .../indexmenu/images/kde.png/folderhopen.png | Bin 0 -> 930 bytes .../indexmenu/images/kde.png/folderopen.png | Bin 0 -> 934 bytes lib/plugins/indexmenu/images/kde.png/info.txt | 3 + lib/plugins/indexmenu/images/kde.png/join.png | Bin 0 -> 146 bytes .../indexmenu/images/kde.png/joinbottom.png | Bin 0 -> 146 bytes lib/plugins/indexmenu/images/kde.png/line.png | Bin 0 -> 141 bytes .../indexmenu/images/kde.png/minus.png | Bin 0 -> 3638 bytes .../indexmenu/images/kde.png/minusbottom.png | Bin 0 -> 3638 bytes .../images/kde.png/nolines_minus.png | Bin 0 -> 3623 bytes .../indexmenu/images/kde.png/nolines_plus.png | Bin 0 -> 3627 bytes lib/plugins/indexmenu/images/kde.png/page.png | Bin 0 -> 900 bytes lib/plugins/indexmenu/images/kde.png/plus.png | Bin 0 -> 3641 bytes .../indexmenu/images/kde.png/plusbottom.png | Bin 0 -> 3641 bytes lib/plugins/indexmenu/images/kde/base.gif | Bin 0 -> 1092 bytes lib/plugins/indexmenu/images/kde/empty.gif | Bin 0 -> 56 bytes lib/plugins/indexmenu/images/kde/folder.gif | Bin 0 -> 1089 bytes lib/plugins/indexmenu/images/kde/folderh.gif | Bin 0 -> 1089 bytes .../indexmenu/images/kde/folderhopen.gif | Bin 0 -> 1088 bytes .../indexmenu/images/kde/folderopen.gif | Bin 0 -> 1091 bytes lib/plugins/indexmenu/images/kde/info.txt | 2 + lib/plugins/indexmenu/images/kde/join.gif | Bin 0 -> 75 bytes .../indexmenu/images/kde/joinbottom.gif | Bin 0 -> 72 bytes lib/plugins/indexmenu/images/kde/line.gif | Bin 0 -> 72 bytes lib/plugins/indexmenu/images/kde/minus.gif | Bin 0 -> 108 bytes .../indexmenu/images/kde/minusbottom.gif | Bin 0 -> 106 bytes .../indexmenu/images/kde/nolines_minus.gif | Bin 0 -> 98 bytes .../indexmenu/images/kde/nolines_plus.gif | Bin 0 -> 102 bytes lib/plugins/indexmenu/images/kde/page.gif | Bin 0 -> 662 bytes lib/plugins/indexmenu/images/kde/plus.gif | Bin 0 -> 111 bytes .../indexmenu/images/kde/plusbottom.gif | Bin 0 -> 110 bytes lib/plugins/indexmenu/images/kgs/base.gif | Bin 0 -> 1031 bytes lib/plugins/indexmenu/images/kgs/empty.gif | Bin 0 -> 62 bytes lib/plugins/indexmenu/images/kgs/folder.gif | Bin 0 -> 952 bytes lib/plugins/indexmenu/images/kgs/folderh.gif | Bin 0 -> 952 bytes .../indexmenu/images/kgs/folderhopen.gif | Bin 0 -> 952 bytes .../indexmenu/images/kgs/folderopen.gif | Bin 0 -> 956 bytes lib/plugins/indexmenu/images/kgs/info.txt | 2 + lib/plugins/indexmenu/images/kgs/join.gif | Bin 0 -> 850 bytes .../indexmenu/images/kgs/joinbottom.gif | Bin 0 -> 844 bytes lib/plugins/indexmenu/images/kgs/line.gif | Bin 0 -> 846 bytes lib/plugins/indexmenu/images/kgs/minus.gif | Bin 0 -> 908 bytes .../indexmenu/images/kgs/minusbottom.gif | Bin 0 -> 905 bytes .../indexmenu/images/kgs/nolines_minus.gif | Bin 0 -> 898 bytes .../indexmenu/images/kgs/nolines_plus.gif | Bin 0 -> 900 bytes lib/plugins/indexmenu/images/kgs/page.gif | Bin 0 -> 3775 bytes lib/plugins/indexmenu/images/kgs/plus.gif | Bin 0 -> 910 bytes .../indexmenu/images/kgs/plusbottom.gif | Bin 0 -> 907 bytes lib/plugins/indexmenu/images/larrow.gif | Bin 0 -> 1829 bytes .../indexmenu/images/leopard.png/base.png | Bin 0 -> 886 bytes .../indexmenu/images/leopard.png/base_1.png | Bin 0 -> 3400 bytes .../indexmenu/images/leopard.png/base_2.png | Bin 0 -> 77214 bytes .../indexmenu/images/leopard.png/empty.png | Bin 0 -> 157 bytes .../indexmenu/images/leopard.png/folder.png | Bin 0 -> 3295 bytes .../indexmenu/images/leopard.png/folderh.png | Bin 0 -> 3387 bytes .../images/leopard.png/folderhopen.png | Bin 0 -> 3295 bytes .../images/leopard.png/folderopen.png | Bin 0 -> 3295 bytes .../indexmenu/images/leopard.png/info.txt | 3 + .../indexmenu/images/leopard.png/join.png | Bin 0 -> 131 bytes .../images/leopard.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/leopard.png/line.png | Bin 0 -> 128 bytes .../indexmenu/images/leopard.png/minus.png | Bin 0 -> 171 bytes .../images/leopard.png/minusbottom.png | Bin 0 -> 167 bytes .../images/leopard.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/leopard.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/leopard.png/page.png | Bin 0 -> 333 bytes .../indexmenu/images/leopard.png/plus.png | Bin 0 -> 183 bytes .../images/leopard.png/plusbottom.png | Bin 0 -> 183 bytes lib/plugins/indexmenu/images/msort.gif | Bin 0 -> 420 bytes .../indexmenu/images/pcc_dotted/base.gif | Bin 0 -> 807 bytes .../indexmenu/images/pcc_dotted/empty.gif | Bin 0 -> 62 bytes .../indexmenu/images/pcc_dotted/folder.gif | Bin 0 -> 807 bytes .../indexmenu/images/pcc_dotted/folderh.gif | Bin 0 -> 807 bytes .../images/pcc_dotted/folderhopen.gif | Bin 0 -> 807 bytes .../images/pcc_dotted/folderopen.gif | Bin 0 -> 807 bytes .../indexmenu/images/pcc_dotted/info.txt | 3 + .../indexmenu/images/pcc_dotted/join.gif | Bin 0 -> 69 bytes .../images/pcc_dotted/joinbottom.gif | Bin 0 -> 66 bytes .../indexmenu/images/pcc_dotted/line.gif | Bin 0 -> 66 bytes .../indexmenu/images/pcc_dotted/minus.gif | Bin 0 -> 127 bytes .../images/pcc_dotted/minusbottom.gif | Bin 0 -> 125 bytes .../images/pcc_dotted/nolines_minus.gif | Bin 0 -> 861 bytes .../images/pcc_dotted/nolines_plus.gif | Bin 0 -> 870 bytes .../indexmenu/images/pcc_dotted/page.gif | Bin 0 -> 807 bytes .../indexmenu/images/pcc_dotted/plus.gif | Bin 0 -> 130 bytes .../images/pcc_dotted/plusbottom.gif | Bin 0 -> 129 bytes .../indexmenu/images/phoenity.png/base.png | Bin 0 -> 791 bytes .../indexmenu/images/phoenity.png/empty.png | Bin 0 -> 157 bytes .../indexmenu/images/phoenity.png/favicon.ico | Bin 0 -> 2238 bytes .../indexmenu/images/phoenity.png/folder.png | Bin 0 -> 629 bytes .../images/phoenity.png/folder_open_file.png | Bin 0 -> 817 bytes .../images/phoenity.png/folder_right.png | Bin 0 -> 813 bytes .../indexmenu/images/phoenity.png/folderh.png | Bin 0 -> 783 bytes .../images/phoenity.png/folderhopen.png | Bin 0 -> 653 bytes .../images/phoenity.png/folderopen.png | Bin 0 -> 653 bytes .../images/phoenity.png/home_house.png | Bin 0 -> 1130 bytes .../indexmenu/images/phoenity.png/info.txt | 3 + .../indexmenu/images/phoenity.png/join.png | Bin 0 -> 131 bytes .../images/phoenity.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/phoenity.png/line.png | Bin 0 -> 128 bytes .../indexmenu/images/phoenity.png/minus.png | Bin 0 -> 171 bytes .../images/phoenity.png/minusbottom.png | Bin 0 -> 167 bytes .../images/phoenity.png/new_page.png | Bin 0 -> 551 bytes .../images/phoenity.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/phoenity.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/phoenity.png/page.png | Bin 0 -> 612 bytes .../indexmenu/images/phoenity.png/plus.png | Bin 0 -> 183 bytes .../images/phoenity.png/plusbottom.png | Bin 0 -> 183 bytes .../images/phoenity.png/toc_bullet.gif | Bin 0 -> 528 bytes .../images/phoenity.png/toc_bullet_red.gif | Bin 0 -> 314 bytes .../images/phoenity.png/web_earth.png | Bin 0 -> 1589 bytes .../indexmenu/images/prdsuser-de.png/base.png | Bin 0 -> 523 bytes .../images/prdsuser-de.png/empty.png | Bin 0 -> 157 bytes .../images/prdsuser-de.png/folder.png | Bin 0 -> 611 bytes .../images/prdsuser-de.png/folderh.png | Bin 0 -> 611 bytes .../images/prdsuser-de.png/folderhopen.png | Bin 0 -> 366 bytes .../images/prdsuser-de.png/folderopen.png | Bin 0 -> 366 bytes .../indexmenu/images/prdsuser-de.png/info.txt | 3 + .../indexmenu/images/prdsuser-de.png/join.png | Bin 0 -> 146 bytes .../images/prdsuser-de.png/joinbottom.png | Bin 0 -> 146 bytes .../indexmenu/images/prdsuser-de.png/line.png | Bin 0 -> 141 bytes .../images/prdsuser-de.png/minus.png | Bin 0 -> 3638 bytes .../images/prdsuser-de.png/minusbottom.png | Bin 0 -> 3638 bytes .../images/prdsuser-de.png/nolines_minus.png | Bin 0 -> 3623 bytes .../images/prdsuser-de.png/nolines_plus.png | Bin 0 -> 3627 bytes .../indexmenu/images/prdsuser-de.png/page.png | Bin 0 -> 318 bytes .../indexmenu/images/prdsuser-de.png/plus.png | Bin 0 -> 3641 bytes .../images/prdsuser-de.png/plusbottom.png | Bin 0 -> 3641 bytes lib/plugins/indexmenu/images/rarrow.gif | Bin 0 -> 81 bytes .../indexmenu/images/repository/.htaccess | 3 + .../images/repository/bj-tango.png.zip | Bin 0 -> 6730 bytes .../images/repository/bj_ubuntu.png.zip | Bin 0 -> 6677 bytes .../indexmenu/images/repository/default.zip | Bin 0 -> 5218 bytes .../indexmenu/images/repository/doku.zip | Bin 0 -> 2823 bytes .../indexmenu/images/repository/drktheme.zip | Bin 0 -> 4530 bytes .../indexmenu/images/repository/dryoo.png.zip | Bin 0 -> 7958 bytes .../indexmenu/images/repository/gnome.png.zip | Bin 0 -> 6594 bytes .../indexmenu/images/repository/human.png.zip | Bin 0 -> 8216 bytes .../images/repository/indextheme.zip | Bin 0 -> 6667 bytes .../indexmenu/images/repository/kde.png.zip | Bin 0 -> 29511 bytes .../indexmenu/images/repository/kde.zip | Bin 0 -> 7201 bytes .../indexmenu/images/repository/kgs.zip | Bin 0 -> 8677 bytes .../images/repository/leopard.png.zip | Bin 0 -> 46319 bytes .../images/repository/pcc_dotted.zip | Bin 0 -> 4313 bytes .../images/repository/phoenity.png.zip | Bin 0 -> 14961 bytes .../images/repository/prdsuser-de.png.zip | Bin 0 -> 27421 bytes .../images/repository/shiki_brave.png.zip | Bin 0 -> 6938 bytes .../indexmenu/images/repository/simple.zip | Bin 0 -> 4962 bytes .../indexmenu/images/repository/tango.png.zip | Bin 0 -> 8752 bytes .../indexmenu/images/repository/thread.zip | Bin 0 -> 3101 bytes .../indexmenu/images/repository/thread2.zip | Bin 0 -> 3704 bytes .../indexmenu/images/repository/vista.png.zip | Bin 0 -> 7819 bytes .../indexmenu/images/shiki_brave.png/base.png | Bin 0 -> 604 bytes .../images/shiki_brave.png/empty.png | Bin 0 -> 157 bytes .../images/shiki_brave.png/folder.png | Bin 0 -> 462 bytes .../images/shiki_brave.png/folderh.png | Bin 0 -> 572 bytes .../images/shiki_brave.png/folderhopen.png | Bin 0 -> 573 bytes .../images/shiki_brave.png/folderopen.png | Bin 0 -> 573 bytes .../indexmenu/images/shiki_brave.png/info.txt | 3 + .../indexmenu/images/shiki_brave.png/join.png | Bin 0 -> 131 bytes .../images/shiki_brave.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/shiki_brave.png/line.png | Bin 0 -> 128 bytes .../images/shiki_brave.png/minus.png | Bin 0 -> 171 bytes .../images/shiki_brave.png/minusbottom.png | Bin 0 -> 167 bytes .../images/shiki_brave.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/shiki_brave.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/shiki_brave.png/page.png | Bin 0 -> 333 bytes .../indexmenu/images/shiki_brave.png/plus.png | Bin 0 -> 183 bytes .../images/shiki_brave.png/plusbottom.png | Bin 0 -> 183 bytes lib/plugins/indexmenu/images/simple/base.gif | Bin 0 -> 577 bytes lib/plugins/indexmenu/images/simple/empty.gif | Bin 0 -> 62 bytes .../indexmenu/images/simple/folder.gif | Bin 0 -> 352 bytes .../indexmenu/images/simple/folderh.gif | Bin 0 -> 352 bytes .../indexmenu/images/simple/folderhopen.gif | Bin 0 -> 354 bytes .../indexmenu/images/simple/folderopen.gif | Bin 0 -> 354 bytes lib/plugins/indexmenu/images/simple/info.txt | 2 + lib/plugins/indexmenu/images/simple/join.gif | Bin 0 -> 69 bytes .../indexmenu/images/simple/joinbottom.gif | Bin 0 -> 66 bytes lib/plugins/indexmenu/images/simple/line.gif | Bin 0 -> 66 bytes lib/plugins/indexmenu/images/simple/minus.gif | Bin 0 -> 86 bytes .../indexmenu/images/simple/minusbottom.gif | Bin 0 -> 85 bytes .../indexmenu/images/simple/nolines_minus.gif | Bin 0 -> 861 bytes .../indexmenu/images/simple/nolines_plus.gif | Bin 0 -> 870 bytes lib/plugins/indexmenu/images/simple/page.gif | Bin 0 -> 565 bytes lib/plugins/indexmenu/images/simple/plus.gif | Bin 0 -> 89 bytes .../indexmenu/images/simple/plusbottom.gif | Bin 0 -> 88 bytes .../indexmenu/images/simplefact.png/Thumbs.db | Bin 0 -> 11264 bytes .../indexmenu/images/simplefact.png/base.png | Bin 0 -> 337 bytes .../indexmenu/images/simplefact.png/empty.png | Bin 0 -> 157 bytes .../images/simplefact.png/folder.png | Bin 0 -> 537 bytes .../images/simplefact.png/folderh.png | Bin 0 -> 694 bytes .../images/simplefact.png/folderhopen.png | Bin 0 -> 688 bytes .../images/simplefact.png/folderopen.png | Bin 0 -> 688 bytes .../indexmenu/images/simplefact.png/info.txt | 2 + .../indexmenu/images/simplefact.png/join.png | Bin 0 -> 131 bytes .../images/simplefact.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/simplefact.png/line.png | Bin 0 -> 128 bytes .../indexmenu/images/simplefact.png/minus.png | Bin 0 -> 171 bytes .../images/simplefact.png/minusbottom.png | Bin 0 -> 167 bytes .../images/simplefact.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/simplefact.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/simplefact.png/page.png | Bin 0 -> 635 bytes .../indexmenu/images/simplefact.png/plus.png | Bin 0 -> 183 bytes .../images/simplefact.png/plusbottom.png | Bin 0 -> 183 bytes .../indexmenu/images/tango.png/base.png | Bin 0 -> 528 bytes .../indexmenu/images/tango.png/empty.png | Bin 0 -> 157 bytes .../indexmenu/images/tango.png/favicon.ico | Bin 0 -> 2238 bytes .../indexmenu/images/tango.png/folder.png | Bin 0 -> 498 bytes .../indexmenu/images/tango.png/folderh.png | Bin 0 -> 537 bytes .../images/tango.png/folderhopen.png | Bin 0 -> 523 bytes .../indexmenu/images/tango.png/folderopen.png | Bin 0 -> 523 bytes .../images/tango.png/format-justify-left.png | Bin 0 -> 324 bytes .../indexmenu/images/tango.png/info.txt | 3 + .../images/tango.png/internet-group-chat.png | Bin 0 -> 422 bytes .../indexmenu/images/tango.png/join.png | Bin 0 -> 131 bytes .../indexmenu/images/tango.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/tango.png/line.png | Bin 0 -> 128 bytes .../indexmenu/images/tango.png/minus.png | Bin 0 -> 171 bytes .../images/tango.png/minusbottom.png | Bin 0 -> 167 bytes .../images/tango.png/network-transmit.png | Bin 0 -> 455 bytes .../images/tango.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/tango.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/tango.png/page.png | Bin 0 -> 333 bytes .../indexmenu/images/tango.png/plus.png | Bin 0 -> 183 bytes .../indexmenu/images/tango.png/plusbottom.png | Bin 0 -> 183 bytes lib/plugins/indexmenu/images/thread/base.gif | Bin 0 -> 52 bytes lib/plugins/indexmenu/images/thread/empty.gif | Bin 0 -> 62 bytes .../indexmenu/images/thread/folder.gif | Bin 0 -> 51 bytes .../indexmenu/images/thread/folderh.gif | Bin 0 -> 51 bytes .../indexmenu/images/thread/folderhopen.gif | Bin 0 -> 51 bytes .../indexmenu/images/thread/folderopen.gif | Bin 0 -> 51 bytes lib/plugins/indexmenu/images/thread/info.txt | 2 + lib/plugins/indexmenu/images/thread/join.gif | Bin 0 -> 69 bytes .../indexmenu/images/thread/joinbottom.gif | Bin 0 -> 66 bytes lib/plugins/indexmenu/images/thread/line.gif | Bin 0 -> 66 bytes lib/plugins/indexmenu/images/thread/minus.gif | Bin 0 -> 86 bytes .../indexmenu/images/thread/minusbottom.gif | Bin 0 -> 85 bytes .../indexmenu/images/thread/nolines_minus.gif | Bin 0 -> 861 bytes .../indexmenu/images/thread/nolines_plus.gif | Bin 0 -> 870 bytes lib/plugins/indexmenu/images/thread/page.gif | Bin 0 -> 51 bytes lib/plugins/indexmenu/images/thread/plus.gif | Bin 0 -> 89 bytes .../indexmenu/images/thread/plusbottom.gif | Bin 0 -> 88 bytes lib/plugins/indexmenu/images/thread2/base.gif | Bin 0 -> 52 bytes .../indexmenu/images/thread2/empty.gif | Bin 0 -> 62 bytes .../indexmenu/images/thread2/folder.gif | Bin 0 -> 51 bytes .../indexmenu/images/thread2/folderh.gif | Bin 0 -> 51 bytes .../indexmenu/images/thread2/folderhopen.gif | Bin 0 -> 51 bytes .../indexmenu/images/thread2/folderopen.gif | Bin 0 -> 51 bytes lib/plugins/indexmenu/images/thread2/info.txt | 3 + lib/plugins/indexmenu/images/thread2/join.gif | Bin 0 -> 69 bytes .../indexmenu/images/thread2/joinbottom.gif | Bin 0 -> 66 bytes lib/plugins/indexmenu/images/thread2/line.gif | Bin 0 -> 66 bytes .../indexmenu/images/thread2/minus.gif | Bin 0 -> 86 bytes .../indexmenu/images/thread2/minusbottom.gif | Bin 0 -> 85 bytes .../images/thread2/nolines_minus.gif | Bin 0 -> 861 bytes .../indexmenu/images/thread2/nolines_plus.gif | Bin 0 -> 870 bytes lib/plugins/indexmenu/images/thread2/page.gif | Bin 0 -> 51 bytes lib/plugins/indexmenu/images/thread2/plus.gif | Bin 0 -> 89 bytes .../indexmenu/images/thread2/plusbottom.gif | Bin 0 -> 88 bytes .../indexmenu/images/thread2/style.css | 31 + lib/plugins/indexmenu/images/toc_bullet.gif | Bin 0 -> 74 bytes .../indexmenu/images/vista.png/base.png | Bin 0 -> 880 bytes .../indexmenu/images/vista.png/empty.png | Bin 0 -> 157 bytes .../indexmenu/images/vista.png/folder.png | Bin 0 -> 865 bytes .../indexmenu/images/vista.png/folderh.png | Bin 0 -> 872 bytes .../images/vista.png/folderhopen.png | Bin 0 -> 873 bytes .../indexmenu/images/vista.png/folderopen.png | Bin 0 -> 872 bytes .../indexmenu/images/vista.png/info.txt | 2 + .../indexmenu/images/vista.png/join.png | Bin 0 -> 131 bytes .../indexmenu/images/vista.png/joinbottom.png | Bin 0 -> 132 bytes .../indexmenu/images/vista.png/line.png | Bin 0 -> 128 bytes .../indexmenu/images/vista.png/minus.png | Bin 0 -> 171 bytes .../images/vista.png/minusbottom.png | Bin 0 -> 167 bytes .../images/vista.png/nolines_minus.png | Bin 0 -> 144 bytes .../images/vista.png/nolines_plus.png | Bin 0 -> 160 bytes .../indexmenu/images/vista.png/page.png | Bin 0 -> 352 bytes .../indexmenu/images/vista.png/plus.png | Bin 0 -> 183 bytes .../indexmenu/images/vista.png/plusbottom.png | Bin 0 -> 183 bytes lib/plugins/indexmenu/images/was.png/base.png | Bin 0 -> 119 bytes .../indexmenu/images/was.png/empty.png | Bin 0 -> 87 bytes .../indexmenu/images/was.png/folder.png | Bin 0 -> 329 bytes .../indexmenu/images/was.png/folderh.png | Bin 0 -> 208 bytes .../indexmenu/images/was.png/folderhopen.png | Bin 0 -> 231 bytes .../indexmenu/images/was.png/folderopen.png | Bin 0 -> 3111 bytes lib/plugins/indexmenu/images/was.png/info.txt | 3 + lib/plugins/indexmenu/images/was.png/join.png | Bin 0 -> 125 bytes .../indexmenu/images/was.png/joinbottom.png | Bin 0 -> 115 bytes lib/plugins/indexmenu/images/was.png/line.png | Bin 0 -> 119 bytes .../indexmenu/images/was.png/minus.png | Bin 0 -> 126 bytes .../indexmenu/images/was.png/minusbottom.png | Bin 0 -> 127 bytes .../images/was.png/nolines_minus.png | Bin 0 -> 115 bytes .../indexmenu/images/was.png/nolines_plus.png | Bin 0 -> 121 bytes lib/plugins/indexmenu/images/was.png/page.png | Bin 0 -> 179 bytes lib/plugins/indexmenu/images/was.png/plus.png | Bin 0 -> 133 bytes .../indexmenu/images/was.png/plusbottom.png | Bin 0 -> 134 bytes .../indexmenu/images/was.png/style.css | 7 + lib/plugins/indexmenu/images/wb.png/base.png | Bin 0 -> 615 bytes lib/plugins/indexmenu/images/wb.png/empty.png | Bin 0 -> 327 bytes .../indexmenu/images/wb.png/folder.png | Bin 0 -> 537 bytes .../indexmenu/images/wb.png/folderh.png | Bin 0 -> 571 bytes .../indexmenu/images/wb.png/folderhopen.png | Bin 0 -> 479 bytes .../indexmenu/images/wb.png/folderopen.png | Bin 0 -> 591 bytes lib/plugins/indexmenu/images/wb.png/info.txt | 2 + lib/plugins/indexmenu/images/wb.png/join.png | Bin 0 -> 339 bytes .../indexmenu/images/wb.png/joinbottom.png | Bin 0 -> 337 bytes lib/plugins/indexmenu/images/wb.png/line.png | Bin 0 -> 335 bytes lib/plugins/indexmenu/images/wb.png/minus.png | Bin 0 -> 356 bytes .../indexmenu/images/wb.png/minusbottom.png | Bin 0 -> 352 bytes .../indexmenu/images/wb.png/nolines_minus.png | Bin 0 -> 363 bytes .../indexmenu/images/wb.png/nolines_plus.png | Bin 0 -> 376 bytes lib/plugins/indexmenu/images/wb.png/page.png | Bin 0 -> 584 bytes lib/plugins/indexmenu/images/wb.png/plus.png | Bin 0 -> 360 bytes .../indexmenu/images/wb.png/plusbottom.png | Bin 0 -> 357 bytes lib/plugins/indexmenu/inc/pclzip.lib.php | 5544 ++ lib/plugins/indexmenu/inc/repo.class.php | 56 + lib/plugins/indexmenu/lang/ckb/lang.php | 88 + lib/plugins/indexmenu/lang/ckb/settings.php | 20 + lib/plugins/indexmenu/lang/cs/lang.php | 48 + lib/plugins/indexmenu/lang/cs/settings.php | 8 + lib/plugins/indexmenu/lang/da/lang.php | 42 + lib/plugins/indexmenu/lang/da/settings.php | 8 + .../indexmenu/lang/de-informal/lang.php | 81 + .../indexmenu/lang/de-informal/settings.php | 22 + lib/plugins/indexmenu/lang/de/lang.php | 91 + lib/plugins/indexmenu/lang/de/settings.php | 22 + lib/plugins/indexmenu/lang/el/lang.php | 68 + lib/plugins/indexmenu/lang/en/lang.php | 92 + lib/plugins/indexmenu/lang/en/settings.php | 21 + lib/plugins/indexmenu/lang/eo/lang.php | 89 + lib/plugins/indexmenu/lang/eo/settings.php | 19 + lib/plugins/indexmenu/lang/es/lang.php | 92 + lib/plugins/indexmenu/lang/es/settings.php | 21 + lib/plugins/indexmenu/lang/fr/lang.php | 93 + lib/plugins/indexmenu/lang/fr/settings.php | 22 + lib/plugins/indexmenu/lang/hr/lang.php | 88 + lib/plugins/indexmenu/lang/hr/settings.php | 20 + lib/plugins/indexmenu/lang/hu/lang.php | 89 + lib/plugins/indexmenu/lang/hu/settings.php | 21 + lib/plugins/indexmenu/lang/it/lang.php | 70 + lib/plugins/indexmenu/lang/it/settings.php | 19 + lib/plugins/indexmenu/lang/ja/lang.php | 75 + lib/plugins/indexmenu/lang/ja/settings.php | 20 + lib/plugins/indexmenu/lang/ko/lang.php | 89 + lib/plugins/indexmenu/lang/ko/settings.php | 21 + lib/plugins/indexmenu/lang/nl/lang.php | 89 + lib/plugins/indexmenu/lang/nl/settings.php | 21 + lib/plugins/indexmenu/lang/pl/lang.php | 36 + lib/plugins/indexmenu/lang/pt-br/lang.php | 88 + lib/plugins/indexmenu/lang/pt-br/settings.php | 20 + lib/plugins/indexmenu/lang/ru/lang.php | 95 + lib/plugins/indexmenu/lang/ru/settings.php | 23 + lib/plugins/indexmenu/lang/sv/lang.php | 83 + lib/plugins/indexmenu/lang/sv/settings.php | 18 + lib/plugins/indexmenu/lang/tr/lang.php | 25 + lib/plugins/indexmenu/lang/vi/lang.php | 37 + lib/plugins/indexmenu/lang/zh-tw/lang.php | 40 + lib/plugins/indexmenu/lang/zh/lang.php | 94 + lib/plugins/indexmenu/lang/zh/settings.php | 25 + lib/plugins/indexmenu/manager.dat | 2 + lib/plugins/indexmenu/plugin.info.txt | 7 + lib/plugins/indexmenu/script.js | 512 + lib/plugins/indexmenu/scripts/contextmenu.js | 429 + .../scripts/contextmenu.local.js.example | 70 + .../contextmenu/jquery.ui-contextmenu.js | 634 + .../contextmenu/jquery.ui-contextmenu.min.js | 4 + .../jquery.ui-contextmenu.min.js.map | 1 + .../indexmenu/scripts/fancytree/LICENSE.txt | 21 + .../fancytree/jquery.fancytree-all-deps.js | 13856 +++++ .../jquery.fancytree-all-deps.min.js | 2 + .../jquery.fancytree-all-deps.min.js.map | 1 + .../scripts/fancytree/jquery.fancytree-all.js | 13178 +++++ .../fancytree/jquery.fancytree-all.min.js | 62 + .../scripts/fancytree/jquery.fancytree.min.js | 1 + .../modules/jquery.fancytree.ariagrid.js | 714 + .../modules/jquery.fancytree.childcounter.js | 241 + .../modules/jquery.fancytree.clones.js | 514 + .../modules/jquery.fancytree.columnview.js | 205 + .../fancytree/modules/jquery.fancytree.dnd.js | 798 + .../modules/jquery.fancytree.dnd5.js | 1157 + .../modules/jquery.fancytree.edit.js | 403 + .../modules/jquery.fancytree.filter.js | 549 + .../modules/jquery.fancytree.fixed.js | 674 + .../modules/jquery.fancytree.glyph.js | 354 + .../modules/jquery.fancytree.grid.js | 1014 + .../modules/jquery.fancytree.gridnav.js | 218 + .../fancytree/modules/jquery.fancytree.js | 7374 +++ .../modules/jquery.fancytree.logger.js | 309 + .../modules/jquery.fancytree.menu.js | 185 + .../modules/jquery.fancytree.multi.js | 128 + .../modules/jquery.fancytree.persist.js | 503 + .../modules/jquery.fancytree.table.js | 544 + .../modules/jquery.fancytree.themeroller.js | 125 + .../modules/jquery.fancytree.ui-deps.js | 1449 + .../modules/jquery.fancytree.wide.js | 257 + .../readme/icons_layout__from ods.png | Bin 0 -> 49517 bytes .../fancytree/skin-awesome/skin-common.less | 972 + .../fancytree/skin-awesome/ui.fancytree.css | 588 + .../fancytree/skin-awesome/ui.fancytree.less | 134 + .../skin-awesome/ui.fancytree.min.css | 6 + .../fancytree/skin-awesome/vline-rtl.gif | Bin 0 -> 842 bytes .../scripts/fancytree/skin-awesome/vline.gif | Bin 0 -> 844 bytes .../skin-bootstrap-n/skin-common.less | 972 + .../skin-bootstrap-n/ui.fancytree.css | 620 + .../skin-bootstrap-n/ui.fancytree.less | 185 + .../skin-bootstrap-n/ui.fancytree.min.css | 6 + .../fancytree/skin-bootstrap-n/vline-rtl.gif | Bin 0 -> 842 bytes .../fancytree/skin-bootstrap-n/vline.gif | Bin 0 -> 844 bytes .../scripts/fancytree/skin-bootstrap/boot.css | 1065 + .../fancytree/skin-bootstrap/skin-common.less | 972 + .../fancytree/skin-bootstrap/ui.fancytree.css | 680 + .../skin-bootstrap/ui.fancytree.less | 356 + .../skin-bootstrap/ui.fancytree.min.css | 6 + .../fancytree/skin-bootstrap/vline-rtl.gif | Bin 0 -> 842 bytes .../fancytree/skin-bootstrap/vline.gif | Bin 0 -> 844 bytes .../scripts/fancytree/skin-common.less | 972 + .../scripts/fancytree/skin-custom-1/README.md | 14 + .../scripts/fancytree/skin-lion/icons-rtl.gif | Bin 0 -> 5948 bytes .../scripts/fancytree/skin-lion/icons.gif | Bin 0 -> 5937 bytes .../scripts/fancytree/skin-lion/loading.gif | Bin 0 -> 1849 bytes .../fancytree/skin-lion/skin-common.less | 972 + .../fancytree/skin-lion/ui.fancytree.css | 757 + .../fancytree/skin-lion/ui.fancytree.less | 100 + .../fancytree/skin-lion/ui.fancytree.min.css | 6 + .../scripts/fancytree/skin-lion/vline-rtl.gif | Bin 0 -> 852 bytes .../scripts/fancytree/skin-lion/vline.gif | Bin 0 -> 852 bytes .../fancytree/skin-material/skin-common.less | 972 + .../fancytree/skin-material/ui.fancytree.css | 581 + .../fancytree/skin-material/ui.fancytree.less | 131 + .../skin-material/ui.fancytree.min.css | 6 + .../fancytree/skin-material/vline-rtl.gif | Bin 0 -> 842 bytes .../scripts/fancytree/skin-material/vline.gif | Bin 0 -> 844 bytes .../fancytree/skin-mdi/skin-common.less | 972 + .../fancytree/skin-mdi/ui.fancytree.less | 131 + .../scripts/fancytree/skin-mdi/vline-rtl.gif | Bin 0 -> 842 bytes .../scripts/fancytree/skin-mdi/vline.gif | Bin 0 -> 844 bytes .../fancytree/skin-themeroller/icons-rtl.gif | Bin 0 -> 5513 bytes .../fancytree/skin-themeroller/icons.gif | Bin 0 -> 5510 bytes .../fancytree/skin-themeroller/loading.gif | Bin 0 -> 3234 bytes .../skin-themeroller/ui.fancytree.css | 716 + .../skin-themeroller/ui.fancytree.less | 64 + .../skin-themeroller/ui.fancytree.min.css | 8 + .../fancytree/skin-themeroller/vline-rtl.gif | Bin 0 -> 852 bytes .../fancytree/skin-themeroller/vline.gif | Bin 0 -> 852 bytes .../fancytree/skin-typicons/skin-common.less | 972 + .../fancytree/skin-typicons/ui.fancytree.less | 138 + .../fancytree/skin-typicons/vline-rtl.gif | Bin 0 -> 842 bytes .../scripts/fancytree/skin-typicons/vline.gif | Bin 0 -> 844 bytes .../fancytree/skin-vista/icons-rtl.gif | Bin 0 -> 5513 bytes .../scripts/fancytree/skin-vista/icons.gif | Bin 0 -> 5510 bytes .../scripts/fancytree/skin-vista/loading.gif | Bin 0 -> 3234 bytes .../fancytree/skin-vista/skin-common.less | 972 + .../fancytree/skin-vista/ui.fancytree.css | 763 + .../fancytree/skin-vista/ui.fancytree.less | 117 + .../fancytree/skin-vista/ui.fancytree.min.css | 6 + .../fancytree/skin-vista/vline-rtl.gif | Bin 0 -> 852 bytes .../scripts/fancytree/skin-vista/vline.gif | Bin 0 -> 852 bytes .../scripts/fancytree/skin-win7/icons-rtl.gif | Bin 0 -> 5513 bytes .../scripts/fancytree/skin-win7/icons.gif | Bin 0 -> 5510 bytes .../scripts/fancytree/skin-win7/loading.gif | Bin 0 -> 3234 bytes .../fancytree/skin-win7/skin-common.less | 972 + .../fancytree/skin-win7/ui.fancytree.css | 822 + .../fancytree/skin-win7/ui.fancytree.less | 157 + .../fancytree/skin-win7/ui.fancytree.min.css | 6 + .../scripts/fancytree/skin-win7/vline-rtl.gif | Bin 0 -> 852 bytes .../scripts/fancytree/skin-win7/vline.gif | Bin 0 -> 852 bytes .../fancytree/skin-win8-n/icons-rtl.gif | Bin 0 -> 5513 bytes .../scripts/fancytree/skin-win8-n/icons.gif | Bin 0 -> 5510 bytes .../scripts/fancytree/skin-win8-n/loading.gif | Bin 0 -> 3234 bytes .../fancytree/skin-win8-n/ui.fancytree.css | 767 + .../fancytree/skin-win8-n/ui.fancytree.less | 145 + .../skin-win8-n/ui.fancytree.min.css | 6 + .../fancytree/skin-win8-n/vline-rtl.gif | Bin 0 -> 852 bytes .../scripts/fancytree/skin-win8-n/vline.gif | Bin 0 -> 852 bytes .../fancytree/skin-win8-xxl/icons-rtl.gif | Bin 0 -> 17451 bytes .../scripts/fancytree/skin-win8-xxl/icons.gif | Bin 0 -> 17624 bytes .../fancytree/skin-win8-xxl/loading.gif | Bin 0 -> 6243 bytes .../fancytree/skin-win8-xxl/ui.fancytree.css | 775 + .../fancytree/skin-win8-xxl/ui.fancytree.less | 40 + .../skin-win8-xxl/ui.fancytree.min.css | 11 + .../fancytree/skin-win8-xxl/vline-rtl.gif | Bin 0 -> 905 bytes .../scripts/fancytree/skin-win8-xxl/vline.gif | Bin 0 -> 905 bytes .../scripts/fancytree/skin-win8/icons-rtl.gif | Bin 0 -> 5513 bytes .../scripts/fancytree/skin-win8/icons.gif | Bin 0 -> 5510 bytes .../scripts/fancytree/skin-win8/loading.gif | Bin 0 -> 3234 bytes .../fancytree/skin-win8/skin-common.less | 972 + .../fancytree/skin-win8/ui.fancytree.css | 765 + .../fancytree/skin-win8/ui.fancytree.less | 158 + .../fancytree/skin-win8/ui.fancytree.min.css | 6 + .../scripts/fancytree/skin-win8/vline-rtl.gif | Bin 0 -> 852 bytes .../scripts/fancytree/skin-win8/vline.gif | Bin 0 -> 852 bytes .../scripts/fancytree/skin-xp/icons-rtl.gif | Bin 0 -> 4002 bytes .../icons-rtl__old__blue laxy expanders.gif | Bin 0 -> 4021 bytes .../scripts/fancytree/skin-xp/icons.gif | Bin 0 -> 4000 bytes .../icons__old__blue lazy expanders.gif | Bin 0 -> 4041 bytes .../scripts/fancytree/skin-xp/loading.gif | Bin 0 -> 570 bytes .../fancytree/skin-xp/skin-common.less | 972 + .../fancytree/skin-xp/ui.fancytree.css | 779 + .../fancytree/skin-xp/ui.fancytree.less | 133 + .../fancytree/skin-xp/ui.fancytree.min.css | 6 + .../scripts/fancytree/skin-xp/vline-rtl.gif | Bin 0 -> 842 bytes .../scripts/fancytree/skin-xp/vline.gif | Bin 0 -> 844 bytes lib/plugins/indexmenu/scripts/indexmenu.js | 1009 + lib/plugins/indexmenu/scripts/nojsindex.js | 27 + .../indexmenu/scripts/toolbarindexwizard.js | 349 + lib/plugins/indexmenu/style.css | 311 + lib/plugins/indexmenu/syntax/indexmenu.php | 866 + lib/plugins/indexmenu/syntax/tag.php | 76 + lib/plugins/info/plugin.info.txt | 7 + lib/plugins/info/syntax.php | 341 + lib/plugins/logviewer/action.php | 52 + lib/plugins/logviewer/admin.php | 213 + lib/plugins/logviewer/admin.svg | 1 + lib/plugins/logviewer/lang/cs/intro.txt | 6 + lib/plugins/logviewer/lang/cs/lang.php | 10 + lib/plugins/logviewer/lang/cs/nolog.txt | 1 + lib/plugins/logviewer/lang/de/intro.txt | 6 + lib/plugins/logviewer/lang/de/lang.php | 10 + lib/plugins/logviewer/lang/de/nolog.txt | 1 + lib/plugins/logviewer/lang/en/intro.txt | 8 + lib/plugins/logviewer/lang/en/lang.php | 10 + lib/plugins/logviewer/lang/en/nolog.txt | 1 + lib/plugins/logviewer/lang/es/intro.txt | 8 + lib/plugins/logviewer/lang/es/lang.php | 9 + lib/plugins/logviewer/lang/es/nolog.txt | 1 + lib/plugins/logviewer/lang/fr/intro.txt | 13 + lib/plugins/logviewer/lang/fr/lang.php | 12 + lib/plugins/logviewer/lang/fr/nolog.txt | 1 + lib/plugins/logviewer/lang/hu/lang.php | 9 + lib/plugins/logviewer/lang/it/lang.php | 9 + lib/plugins/logviewer/lang/ja/lang.php | 9 + lib/plugins/logviewer/lang/pl/intro.txt | 6 + lib/plugins/logviewer/lang/pl/lang.php | 10 + lib/plugins/logviewer/lang/pl/nolog.txt | 1 + lib/plugins/logviewer/lang/pt-br/intro.txt | 8 + lib/plugins/logviewer/lang/pt-br/lang.php | 10 + lib/plugins/logviewer/lang/pt-br/nolog.txt | 1 + lib/plugins/logviewer/lang/pt/intro.txt | 7 + lib/plugins/logviewer/lang/pt/lang.php | 10 + lib/plugins/logviewer/lang/pt/nolog.txt | 1 + lib/plugins/logviewer/lang/ru/intro.txt | 6 + lib/plugins/logviewer/lang/ru/lang.php | 11 + lib/plugins/logviewer/lang/ru/nolog.txt | 1 + lib/plugins/logviewer/lang/vi/intro.txt | 8 + lib/plugins/logviewer/lang/vi/lang.php | 10 + lib/plugins/logviewer/lang/vi/nolog.txt | 1 + lib/plugins/logviewer/lang/zh/intro.txt | 5 + lib/plugins/logviewer/lang/zh/lang.php | 10 + lib/plugins/logviewer/lang/zh/nolog.txt | 1 + lib/plugins/logviewer/plugin.info.txt | 7 + lib/plugins/logviewer/script.js | 25 + lib/plugins/logviewer/style.less | 51 + .../move/.github/workflows/dokuwiki.yml | 11 + .../move/.github/workflows/release.yml | 24 + lib/plugins/move/LICENSE | 339 + lib/plugins/move/MenuItem.php | 35 + lib/plugins/move/_test/GeneralTest.php | 84 + .../move/_test/affectedPagesNs.test.php | 58 + .../move/_test/cache_handling.test.php | 47 + .../move/_test/findMissingDocuments.test.php | 113 + lib/plugins/move/_test/handler.test.php | 75 + lib/plugins/move/_test/log.test.php | 46 + lib/plugins/move/_test/mediamove.test.php | 124 + .../move/_test/namespace_move.test.php | 478 + lib/plugins/move/_test/pagemove.test.php | 629 + lib/plugins/move/_test/plan.test.php | 110 + .../move/_test/stepThroughDocuments.test.php | 274 + lib/plugins/move/_test/tpl.test.php | 49 + lib/plugins/move/action/progress.php | 66 + lib/plugins/move/action/rename.php | 221 + lib/plugins/move/action/rewrite.php | 112 + lib/plugins/move/action/tree.php | 63 + lib/plugins/move/admin.svg | 1 + lib/plugins/move/admin/main.php | 270 + lib/plugins/move/admin/tree.php | 189 + lib/plugins/move/conf/default.php | 7 + lib/plugins/move/conf/metadata.php | 7 + lib/plugins/move/deleted.files | 34 + lib/plugins/move/helper/file.php | 156 + lib/plugins/move/helper/handler.php | 387 + lib/plugins/move/helper/op.php | 323 + lib/plugins/move/helper/plan.php | 953 + lib/plugins/move/helper/rewrite.php | 297 + lib/plugins/move/images/disk.png | Bin 0 -> 620 bytes lib/plugins/move/images/folder_add.png | Bin 0 -> 668 bytes lib/plugins/move/images/page.png | Bin 0 -> 635 bytes lib/plugins/move/images/page_link.png | Bin 0 -> 830 bytes lib/plugins/move/images/rename.png | Bin 0 -> 231 bytes lib/plugins/move/images/rename.svg | 1 + lib/plugins/move/images/sprite.png | Bin 0 -> 343 bytes lib/plugins/move/lang/ar/lang.php | 10 + lib/plugins/move/lang/cs/lang.php | 67 + lib/plugins/move/lang/cs/move.txt | 10 + lib/plugins/move/lang/cs/progress.txt | 3 + lib/plugins/move/lang/cs/settings.php | 13 + lib/plugins/move/lang/cs/tree.txt | 3 + lib/plugins/move/lang/da/lang.php | 65 + lib/plugins/move/lang/da/move.txt | 10 + lib/plugins/move/lang/da/progress.txt | 3 + lib/plugins/move/lang/da/settings.php | 12 + lib/plugins/move/lang/da/tree.txt | 7 + lib/plugins/move/lang/de-informal/lang.php | 71 + lib/plugins/move/lang/de-informal/move.txt | 11 + .../move/lang/de-informal/progress.txt | 3 + .../move/lang/de-informal/settings.php | 12 + lib/plugins/move/lang/de-informal/tree.txt | 3 + lib/plugins/move/lang/de/lang.php | 73 + lib/plugins/move/lang/de/move.txt | 11 + lib/plugins/move/lang/de/progress.txt | 3 + lib/plugins/move/lang/de/settings.php | 13 + lib/plugins/move/lang/de/tree.txt | 3 + lib/plugins/move/lang/el/lang.php | 65 + lib/plugins/move/lang/el/move.txt | 9 + lib/plugins/move/lang/el/progress.txt | 2 + lib/plugins/move/lang/el/settings.php | 12 + lib/plugins/move/lang/el/tree.txt | 2 + lib/plugins/move/lang/en/lang.php | 88 + lib/plugins/move/lang/en/move.txt | 10 + lib/plugins/move/lang/en/progress.txt | 3 + lib/plugins/move/lang/en/settings.php | 7 + lib/plugins/move/lang/en/tree.txt | 7 + lib/plugins/move/lang/es/lang.php | 66 + lib/plugins/move/lang/es/move.txt | 10 + lib/plugins/move/lang/es/progress.txt | 3 + lib/plugins/move/lang/es/settings.php | 12 + lib/plugins/move/lang/es/tree.txt | 3 + lib/plugins/move/lang/fr/lang.php | 71 + lib/plugins/move/lang/fr/move.txt | 10 + lib/plugins/move/lang/fr/progress.txt | 3 + lib/plugins/move/lang/fr/settings.php | 12 + lib/plugins/move/lang/fr/tree.txt | 3 + lib/plugins/move/lang/hr/lang.php | 65 + lib/plugins/move/lang/hr/move.txt | 10 + lib/plugins/move/lang/hr/progress.txt | 3 + lib/plugins/move/lang/hr/settings.php | 13 + lib/plugins/move/lang/hr/tree.txt | 4 + lib/plugins/move/lang/id/lang.php | 62 + lib/plugins/move/lang/id/progress.txt | 3 + lib/plugins/move/lang/id/settings.php | 12 + lib/plugins/move/lang/id/tree.txt | 7 + lib/plugins/move/lang/it/lang.php | 38 + lib/plugins/move/lang/it/move.txt | 10 + lib/plugins/move/lang/ja/lang.php | 65 + lib/plugins/move/lang/ja/move.txt | 10 + lib/plugins/move/lang/ja/progress.txt | 3 + lib/plugins/move/lang/ja/settings.php | 12 + lib/plugins/move/lang/ja/tree.txt | 3 + lib/plugins/move/lang/ko/lang.php | 67 + lib/plugins/move/lang/ko/move.txt | 10 + lib/plugins/move/lang/ko/progress.txt | 3 + lib/plugins/move/lang/ko/settings.php | 13 + lib/plugins/move/lang/ko/tree.txt | 3 + lib/plugins/move/lang/lv/lang.php | 31 + lib/plugins/move/lang/lv/move.txt | 11 + lib/plugins/move/lang/nl/lang.php | 68 + lib/plugins/move/lang/nl/move.txt | 10 + lib/plugins/move/lang/nl/progress.txt | 3 + lib/plugins/move/lang/nl/settings.php | 13 + lib/plugins/move/lang/nl/tree.txt | 3 + lib/plugins/move/lang/no/lang.php | 69 + lib/plugins/move/lang/no/move.txt | 10 + lib/plugins/move/lang/no/progress.txt | 3 + lib/plugins/move/lang/no/settings.php | 13 + lib/plugins/move/lang/no/tree.txt | 3 + lib/plugins/move/lang/pl/lang.php | 39 + lib/plugins/move/lang/pl/move.txt | 10 + lib/plugins/move/lang/pt-br/lang.php | 66 + lib/plugins/move/lang/pt-br/move.txt | 9 + lib/plugins/move/lang/pt-br/progress.txt | 2 + lib/plugins/move/lang/pt-br/settings.php | 12 + lib/plugins/move/lang/pt-br/tree.txt | 6 + lib/plugins/move/lang/ru/lang.php | 69 + lib/plugins/move/lang/ru/move.txt | 10 + lib/plugins/move/lang/ru/progress.txt | 3 + lib/plugins/move/lang/ru/settings.php | 12 + lib/plugins/move/lang/ru/tree.txt | 3 + lib/plugins/move/lang/sk/lang.php | 72 + lib/plugins/move/lang/sk/move.txt | 11 + lib/plugins/move/lang/sk/progress.txt | 3 + lib/plugins/move/lang/sk/settings.php | 11 + lib/plugins/move/lang/sk/tree.txt | 8 + lib/plugins/move/lang/sl/lang.php | 31 + lib/plugins/move/lang/sl/move.txt | 10 + lib/plugins/move/lang/sv/lang.php | 51 + lib/plugins/move/lang/sv/move.txt | 10 + lib/plugins/move/lang/sv/progress.txt | 3 + lib/plugins/move/lang/sv/settings.php | 9 + lib/plugins/move/lang/tr/lang.php | 36 + lib/plugins/move/lang/tr/progress.txt | 3 + lib/plugins/move/lang/uk/lang.php | 46 + lib/plugins/move/lang/vi/lang.php | 65 + lib/plugins/move/lang/vi/move.txt | 10 + lib/plugins/move/lang/vi/progress.txt | 3 + lib/plugins/move/lang/vi/settings.php | 12 + lib/plugins/move/lang/vi/tree.txt | 7 + lib/plugins/move/lang/zh-tw/lang.php | 66 + lib/plugins/move/lang/zh-tw/move.txt | 11 + lib/plugins/move/lang/zh-tw/progress.txt | 3 + lib/plugins/move/lang/zh-tw/settings.php | 13 + lib/plugins/move/lang/zh-tw/tree.txt | 3 + lib/plugins/move/lang/zh/lang.php | 68 + lib/plugins/move/lang/zh/move.txt | 8 + lib/plugins/move/lang/zh/progress.txt | 3 + lib/plugins/move/lang/zh/settings.php | 13 + lib/plugins/move/lang/zh/tree.txt | 3 + lib/plugins/move/manager.dat | 2 + lib/plugins/move/plugin.info.txt | 7 + lib/plugins/move/script.js | 15 + lib/plugins/move/script/MoveMediaManager.js | 174 + lib/plugins/move/script/form.js | 14 + lib/plugins/move/script/json2.js | 486 + lib/plugins/move/script/progress.js | 98 + lib/plugins/move/script/rename.js | 129 + lib/plugins/move/script/tree.js | 260 + lib/plugins/move/style.less | 134 + lib/plugins/oembed/LICENCE | 339 + lib/plugins/oembed/conf/default.php | 17 + lib/plugins/oembed/conf/metadata.php | 17 + lib/plugins/oembed/docs/dokuwiki-oembed.org | 69 + lib/plugins/oembed/docs/dokuwiki-oembed.txt | 63 + lib/plugins/oembed/lang/en/settings.php | 18 + lib/plugins/oembed/manager.dat | 3 + lib/plugins/oembed/plugin.info.txt | 8 + lib/plugins/oembed/providers.xml | 55 + lib/plugins/oembed/sample-providers.xml | 122 + lib/plugins/oembed/style.css | 74 + lib/plugins/oembed/syntax.php | 598 + lib/plugins/popularity/action.php | 69 + lib/plugins/popularity/admin.php | 153 + lib/plugins/popularity/admin.svg | 1 + lib/plugins/popularity/helper.php | 312 + lib/plugins/popularity/lang/af/lang.php | 6 + lib/plugins/popularity/lang/ar/intro.txt | 9 + lib/plugins/popularity/lang/ar/lang.php | 15 + lib/plugins/popularity/lang/ar/submitted.txt | 3 + lib/plugins/popularity/lang/bg/intro.txt | 9 + lib/plugins/popularity/lang/bg/lang.php | 15 + lib/plugins/popularity/lang/bg/submitted.txt | 3 + .../popularity/lang/ca-valencia/intro.txt | 9 + .../popularity/lang/ca-valencia/lang.php | 9 + lib/plugins/popularity/lang/ca/intro.txt | 9 + lib/plugins/popularity/lang/ca/lang.php | 12 + lib/plugins/popularity/lang/ckb/intro.txt | 8 + lib/plugins/popularity/lang/ckb/lang.php | 14 + lib/plugins/popularity/lang/ckb/submitted.txt | 2 + lib/plugins/popularity/lang/cs/intro.txt | 9 + lib/plugins/popularity/lang/cs/lang.php | 21 + lib/plugins/popularity/lang/cs/submitted.txt | 3 + lib/plugins/popularity/lang/cy/intro.txt | 11 + lib/plugins/popularity/lang/cy/lang.php | 9 + lib/plugins/popularity/lang/cy/submitted.txt | 3 + lib/plugins/popularity/lang/da/intro.txt | 9 + lib/plugins/popularity/lang/da/lang.php | 21 + lib/plugins/popularity/lang/da/submitted.txt | 3 + .../popularity/lang/de-informal/intro.txt | 9 + .../popularity/lang/de-informal/lang.php | 21 + .../popularity/lang/de-informal/submitted.txt | 3 + lib/plugins/popularity/lang/de/intro.txt | 11 + lib/plugins/popularity/lang/de/lang.php | 26 + lib/plugins/popularity/lang/de/submitted.txt | 3 + lib/plugins/popularity/lang/el/intro.txt | 9 + lib/plugins/popularity/lang/el/lang.php | 17 + lib/plugins/popularity/lang/el/submitted.txt | 3 + lib/plugins/popularity/lang/en/intro.txt | 11 + lib/plugins/popularity/lang/en/lang.php | 9 + lib/plugins/popularity/lang/en/submitted.txt | 3 + lib/plugins/popularity/lang/eo/intro.txt | 9 + lib/plugins/popularity/lang/eo/lang.php | 16 + lib/plugins/popularity/lang/eo/submitted.txt | 3 + lib/plugins/popularity/lang/es/intro.txt | 10 + lib/plugins/popularity/lang/es/lang.php | 31 + lib/plugins/popularity/lang/es/submitted.txt | 3 + lib/plugins/popularity/lang/eu/intro.txt | 9 + lib/plugins/popularity/lang/eu/lang.php | 15 + lib/plugins/popularity/lang/eu/submitted.txt | 3 + lib/plugins/popularity/lang/fa/intro.txt | 9 + lib/plugins/popularity/lang/fa/lang.php | 19 + lib/plugins/popularity/lang/fa/submitted.txt | 2 + lib/plugins/popularity/lang/fi/intro.txt | 9 + lib/plugins/popularity/lang/fi/lang.php | 16 + lib/plugins/popularity/lang/fi/submitted.txt | 3 + lib/plugins/popularity/lang/fr/intro.txt | 9 + lib/plugins/popularity/lang/fr/lang.php | 26 + lib/plugins/popularity/lang/fr/submitted.txt | 3 + lib/plugins/popularity/lang/gl/intro.txt | 10 + lib/plugins/popularity/lang/gl/lang.php | 15 + lib/plugins/popularity/lang/gl/submitted.txt | 3 + lib/plugins/popularity/lang/he/intro.txt | 9 + lib/plugins/popularity/lang/he/lang.php | 12 + lib/plugins/popularity/lang/hi/lang.php | 9 + lib/plugins/popularity/lang/hr/intro.txt | 7 + lib/plugins/popularity/lang/hr/lang.php | 14 + lib/plugins/popularity/lang/hr/submitted.txt | 3 + lib/plugins/popularity/lang/hu/intro.txt | 9 + lib/plugins/popularity/lang/hu/lang.php | 18 + lib/plugins/popularity/lang/hu/submitted.txt | 3 + lib/plugins/popularity/lang/ia/intro.txt | 9 + lib/plugins/popularity/lang/ia/lang.php | 9 + lib/plugins/popularity/lang/id-ni/intro.txt | 7 + lib/plugins/popularity/lang/id-ni/lang.php | 9 + lib/plugins/popularity/lang/is/lang.php | 12 + lib/plugins/popularity/lang/it/intro.txt | 9 + lib/plugins/popularity/lang/it/lang.php | 18 + lib/plugins/popularity/lang/it/submitted.txt | 3 + lib/plugins/popularity/lang/ja/intro.txt | 9 + lib/plugins/popularity/lang/ja/lang.php | 19 + lib/plugins/popularity/lang/ja/submitted.txt | 3 + lib/plugins/popularity/lang/ko/intro.txt | 9 + lib/plugins/popularity/lang/ko/lang.php | 20 + lib/plugins/popularity/lang/ko/submitted.txt | 3 + lib/plugins/popularity/lang/la/intro.txt | 10 + lib/plugins/popularity/lang/la/lang.php | 13 + lib/plugins/popularity/lang/la/submitted.txt | 3 + lib/plugins/popularity/lang/lt/lang.php | 10 + lib/plugins/popularity/lang/lv/intro.txt | 9 + lib/plugins/popularity/lang/lv/lang.php | 14 + lib/plugins/popularity/lang/lv/submitted.txt | 3 + lib/plugins/popularity/lang/mr/intro.txt | 8 + lib/plugins/popularity/lang/mr/lang.php | 11 + lib/plugins/popularity/lang/ne/lang.php | 10 + lib/plugins/popularity/lang/nl/intro.txt | 9 + lib/plugins/popularity/lang/nl/lang.php | 22 + lib/plugins/popularity/lang/nl/submitted.txt | 3 + lib/plugins/popularity/lang/no/intro.txt | 9 + lib/plugins/popularity/lang/no/lang.php | 24 + lib/plugins/popularity/lang/no/submitted.txt | 3 + lib/plugins/popularity/lang/pl/intro.txt | 9 + lib/plugins/popularity/lang/pl/lang.php | 24 + lib/plugins/popularity/lang/pl/submitted.txt | 3 + lib/plugins/popularity/lang/pt-br/intro.txt | 9 + lib/plugins/popularity/lang/pt-br/lang.php | 24 + .../popularity/lang/pt-br/submitted.txt | 3 + lib/plugins/popularity/lang/pt/intro.txt | 9 + lib/plugins/popularity/lang/pt/lang.php | 18 + lib/plugins/popularity/lang/pt/submitted.txt | 3 + lib/plugins/popularity/lang/ro/intro.txt | 9 + lib/plugins/popularity/lang/ro/lang.php | 16 + lib/plugins/popularity/lang/ro/submitted.txt | 3 + lib/plugins/popularity/lang/ru/intro.txt | 10 + lib/plugins/popularity/lang/ru/lang.php | 24 + lib/plugins/popularity/lang/ru/submitted.txt | 3 + lib/plugins/popularity/lang/sk/intro.txt | 9 + lib/plugins/popularity/lang/sk/lang.php | 16 + lib/plugins/popularity/lang/sk/submitted.txt | 3 + lib/plugins/popularity/lang/sl/intro.txt | 9 + lib/plugins/popularity/lang/sl/lang.php | 14 + lib/plugins/popularity/lang/sl/submitted.txt | 3 + lib/plugins/popularity/lang/sq/intro.txt | 9 + lib/plugins/popularity/lang/sq/lang.php | 11 + lib/plugins/popularity/lang/sr/intro.txt | 9 + lib/plugins/popularity/lang/sr/lang.php | 10 + lib/plugins/popularity/lang/sv/intro.txt | 11 + lib/plugins/popularity/lang/sv/lang.php | 20 + lib/plugins/popularity/lang/sv/submitted.txt | 3 + lib/plugins/popularity/lang/th/lang.php | 11 + lib/plugins/popularity/lang/tr/intro.txt | 9 + lib/plugins/popularity/lang/tr/lang.php | 14 + lib/plugins/popularity/lang/uk/intro.txt | 9 + lib/plugins/popularity/lang/uk/lang.php | 15 + lib/plugins/popularity/lang/uk/submitted.txt | 2 + lib/plugins/popularity/lang/vi/intro.txt | 9 + lib/plugins/popularity/lang/vi/lang.php | 14 + lib/plugins/popularity/lang/vi/submitted.txt | 3 + lib/plugins/popularity/lang/zh-tw/intro.txt | 9 + lib/plugins/popularity/lang/zh-tw/lang.php | 20 + .../popularity/lang/zh-tw/submitted.txt | 3 + lib/plugins/popularity/lang/zh/intro.txt | 9 + lib/plugins/popularity/lang/zh/lang.php | 22 + lib/plugins/popularity/lang/zh/submitted.txt | 3 + lib/plugins/popularity/plugin.info.txt | 7 + lib/plugins/remote.php | 9 + lib/plugins/revert/admin.php | 194 + lib/plugins/revert/admin.svg | 1 + lib/plugins/revert/lang/ar/intro.txt | 3 + lib/plugins/revert/lang/ar/lang.php | 23 + lib/plugins/revert/lang/bg/intro.txt | 4 + lib/plugins/revert/lang/bg/lang.php | 18 + lib/plugins/revert/lang/ca-valencia/intro.txt | 4 + lib/plugins/revert/lang/ca-valencia/lang.php | 15 + lib/plugins/revert/lang/ca/intro.txt | 3 + lib/plugins/revert/lang/ca/lang.php | 18 + lib/plugins/revert/lang/ckb/intro.txt | 2 + lib/plugins/revert/lang/ckb/lang.php | 19 + lib/plugins/revert/lang/cs/intro.txt | 3 + lib/plugins/revert/lang/cs/lang.php | 41 + lib/plugins/revert/lang/cy/intro.txt | 3 + lib/plugins/revert/lang/cy/lang.php | 22 + lib/plugins/revert/lang/da/intro.txt | 3 + lib/plugins/revert/lang/da/lang.php | 23 + lib/plugins/revert/lang/de-informal/intro.txt | 3 + lib/plugins/revert/lang/de-informal/lang.php | 23 + lib/plugins/revert/lang/de/intro.txt | 3 + lib/plugins/revert/lang/de/lang.php | 29 + lib/plugins/revert/lang/el/intro.txt | 3 + lib/plugins/revert/lang/el/lang.php | 21 + lib/plugins/revert/lang/en/intro.txt | 3 + lib/plugins/revert/lang/en/lang.php | 23 + lib/plugins/revert/lang/eo/intro.txt | 3 + lib/plugins/revert/lang/eo/lang.php | 19 + lib/plugins/revert/lang/es/intro.txt | 3 + lib/plugins/revert/lang/es/lang.php | 34 + lib/plugins/revert/lang/et/lang.php | 9 + lib/plugins/revert/lang/eu/intro.txt | 3 + lib/plugins/revert/lang/eu/lang.php | 21 + lib/plugins/revert/lang/fa/intro.txt | 3 + lib/plugins/revert/lang/fa/lang.php | 21 + lib/plugins/revert/lang/fi/intro.txt | 3 + lib/plugins/revert/lang/fi/lang.php | 18 + lib/plugins/revert/lang/fr/intro.txt | 3 + lib/plugins/revert/lang/fr/lang.php | 30 + lib/plugins/revert/lang/gl/intro.txt | 3 + lib/plugins/revert/lang/gl/lang.php | 17 + lib/plugins/revert/lang/he/intro.txt | 3 + lib/plugins/revert/lang/he/lang.php | 19 + lib/plugins/revert/lang/hr/intro.txt | 3 + lib/plugins/revert/lang/hr/lang.php | 16 + lib/plugins/revert/lang/hu/intro.txt | 3 + lib/plugins/revert/lang/hu/lang.php | 21 + lib/plugins/revert/lang/ia/intro.txt | 3 + lib/plugins/revert/lang/ia/lang.php | 16 + lib/plugins/revert/lang/is/lang.php | 13 + lib/plugins/revert/lang/it/intro.txt | 3 + lib/plugins/revert/lang/it/lang.php | 20 + lib/plugins/revert/lang/ja/intro.txt | 3 + lib/plugins/revert/lang/ja/lang.php | 22 + lib/plugins/revert/lang/ko/intro.txt | 3 + lib/plugins/revert/lang/ko/lang.php | 29 + lib/plugins/revert/lang/la/intro.txt | 3 + lib/plugins/revert/lang/la/lang.php | 15 + lib/plugins/revert/lang/lb/intro.txt | 3 + lib/plugins/revert/lang/lv/intro.txt | 3 + lib/plugins/revert/lang/lv/lang.php | 16 + lib/plugins/revert/lang/mr/intro.txt | 5 + lib/plugins/revert/lang/mr/lang.php | 18 + lib/plugins/revert/lang/ne/lang.php | 17 + lib/plugins/revert/lang/nl/intro.txt | 3 + lib/plugins/revert/lang/nl/lang.php | 26 + lib/plugins/revert/lang/no/intro.txt | 3 + lib/plugins/revert/lang/no/lang.php | 40 + lib/plugins/revert/lang/pl/intro.txt | 3 + lib/plugins/revert/lang/pl/lang.php | 26 + lib/plugins/revert/lang/pt-br/intro.txt | 3 + lib/plugins/revert/lang/pt-br/lang.php | 27 + lib/plugins/revert/lang/pt/intro.txt | 3 + lib/plugins/revert/lang/pt/lang.php | 21 + lib/plugins/revert/lang/ro/intro.txt | 3 + lib/plugins/revert/lang/ro/lang.php | 19 + lib/plugins/revert/lang/ru/intro.txt | 3 + lib/plugins/revert/lang/ru/lang.php | 28 + lib/plugins/revert/lang/sk/intro.txt | 3 + lib/plugins/revert/lang/sk/lang.php | 18 + lib/plugins/revert/lang/sl/intro.txt | 3 + lib/plugins/revert/lang/sl/lang.php | 16 + lib/plugins/revert/lang/sq/intro.txt | 3 + lib/plugins/revert/lang/sq/lang.php | 18 + lib/plugins/revert/lang/sr/intro.txt | 3 + lib/plugins/revert/lang/sr/lang.php | 17 + lib/plugins/revert/lang/sv/intro.txt | 3 + lib/plugins/revert/lang/sv/lang.php | 32 + lib/plugins/revert/lang/th/intro.txt | 3 + lib/plugins/revert/lang/th/lang.php | 19 + lib/plugins/revert/lang/tr/intro.txt | 3 + lib/plugins/revert/lang/tr/lang.php | 20 + lib/plugins/revert/lang/uk/intro.txt | 3 + lib/plugins/revert/lang/uk/lang.php | 17 + lib/plugins/revert/lang/vi/intro.txt | 3 + lib/plugins/revert/lang/vi/lang.php | 18 + lib/plugins/revert/lang/zh-tw/intro.txt | 3 + lib/plugins/revert/lang/zh-tw/lang.php | 22 + lib/plugins/revert/lang/zh/intro.txt | 3 + lib/plugins/revert/lang/zh/lang.php | 23 + lib/plugins/revert/plugin.info.txt | 7 + lib/plugins/safefnrecode/action.php | 71 + lib/plugins/safefnrecode/plugin.info.txt | 7 + lib/plugins/styling/.travis.yml | 13 + lib/plugins/styling/action.php | 56 + lib/plugins/styling/admin.php | 230 + lib/plugins/styling/admin.svg | 1 + lib/plugins/styling/lang/bg/lang.php | 21 + lib/plugins/styling/lang/ca/lang.php | 18 + lib/plugins/styling/lang/ckb/intro.txt | 2 + lib/plugins/styling/lang/ckb/lang.php | 23 + lib/plugins/styling/lang/cs/intro.txt | 2 + lib/plugins/styling/lang/cs/lang.php | 24 + lib/plugins/styling/lang/cy/intro.txt | 2 + lib/plugins/styling/lang/cy/lang.php | 36 + lib/plugins/styling/lang/da/intro.txt | 2 + lib/plugins/styling/lang/da/lang.php | 23 + .../styling/lang/de-informal/intro.txt | 2 + lib/plugins/styling/lang/de-informal/lang.php | 23 + lib/plugins/styling/lang/de/intro.txt | 2 + lib/plugins/styling/lang/de/lang.php | 24 + lib/plugins/styling/lang/el/lang.php | 30 + lib/plugins/styling/lang/en/intro.txt | 2 + lib/plugins/styling/lang/en/lang.php | 35 + lib/plugins/styling/lang/eo/lang.php | 9 + lib/plugins/styling/lang/es/intro.txt | 2 + lib/plugins/styling/lang/es/lang.php | 23 + lib/plugins/styling/lang/fa/intro.txt | 2 + lib/plugins/styling/lang/fa/lang.php | 24 + lib/plugins/styling/lang/fr/intro.txt | 2 + lib/plugins/styling/lang/fr/lang.php | 25 + lib/plugins/styling/lang/hr/intro.txt | 2 + lib/plugins/styling/lang/hr/lang.php | 23 + lib/plugins/styling/lang/hu/intro.txt | 2 + lib/plugins/styling/lang/hu/lang.php | 23 + lib/plugins/styling/lang/it/intro.txt | 2 + lib/plugins/styling/lang/it/lang.php | 23 + lib/plugins/styling/lang/ja/intro.txt | 2 + lib/plugins/styling/lang/ja/lang.php | 24 + lib/plugins/styling/lang/ko/intro.txt | 2 + lib/plugins/styling/lang/ko/lang.php | 23 + lib/plugins/styling/lang/nl/intro.txt | 2 + lib/plugins/styling/lang/nl/lang.php | 24 + lib/plugins/styling/lang/no/intro.txt | 2 + lib/plugins/styling/lang/no/lang.php | 23 + lib/plugins/styling/lang/oc/lang.php | 11 + lib/plugins/styling/lang/pl/intro.txt | 1 + lib/plugins/styling/lang/pl/lang.php | 24 + lib/plugins/styling/lang/pt-br/intro.txt | 2 + lib/plugins/styling/lang/pt-br/lang.php | 23 + lib/plugins/styling/lang/pt/intro.txt | 2 + lib/plugins/styling/lang/pt/lang.php | 25 + lib/plugins/styling/lang/ru/intro.txt | 1 + lib/plugins/styling/lang/ru/lang.php | 24 + lib/plugins/styling/lang/sk/intro.txt | 2 + lib/plugins/styling/lang/sk/lang.php | 24 + lib/plugins/styling/lang/sv/lang.php | 22 + lib/plugins/styling/lang/uk/lang.php | 13 + lib/plugins/styling/lang/vi/intro.txt | 2 + lib/plugins/styling/lang/vi/lang.php | 23 + lib/plugins/styling/lang/zh-tw/lang.php | 15 + lib/plugins/styling/lang/zh/intro.txt | 1 + lib/plugins/styling/lang/zh/lang.php | 23 + lib/plugins/styling/plugin.info.txt | 7 + lib/plugins/styling/popup.php | 31 + lib/plugins/styling/script.js | 92 + lib/plugins/styling/style.less | 13 + lib/plugins/syntax.php | 9 + lib/plugins/usermanager/admin.php | 1230 + lib/plugins/usermanager/admin.svg | 1 + lib/plugins/usermanager/cli.php | 308 + lib/plugins/usermanager/images/search.png | Bin 0 -> 549 bytes lib/plugins/usermanager/lang/af/lang.php | 14 + lib/plugins/usermanager/lang/ar/add.txt | 1 + lib/plugins/usermanager/lang/ar/delete.txt | 1 + lib/plugins/usermanager/lang/ar/edit.txt | 1 + lib/plugins/usermanager/lang/ar/intro.txt | 1 + lib/plugins/usermanager/lang/ar/lang.php | 49 + lib/plugins/usermanager/lang/ar/list.txt | 1 + lib/plugins/usermanager/lang/bg/add.txt | 1 + lib/plugins/usermanager/lang/bg/delete.txt | 1 + lib/plugins/usermanager/lang/bg/edit.txt | 1 + lib/plugins/usermanager/lang/bg/intro.txt | 1 + lib/plugins/usermanager/lang/bg/lang.php | 59 + lib/plugins/usermanager/lang/bg/list.txt | 1 + .../usermanager/lang/ca-valencia/add.txt | 1 + .../usermanager/lang/ca-valencia/delete.txt | 1 + .../usermanager/lang/ca-valencia/edit.txt | 1 + .../usermanager/lang/ca-valencia/intro.txt | 1 + .../usermanager/lang/ca-valencia/lang.php | 49 + .../usermanager/lang/ca-valencia/list.txt | 1 + lib/plugins/usermanager/lang/ca/add.txt | 1 + lib/plugins/usermanager/lang/ca/delete.txt | 1 + lib/plugins/usermanager/lang/ca/edit.txt | 1 + lib/plugins/usermanager/lang/ca/intro.txt | 1 + lib/plugins/usermanager/lang/ca/lang.php | 62 + lib/plugins/usermanager/lang/ca/list.txt | 1 + lib/plugins/usermanager/lang/ckb/add.txt | 1 + lib/plugins/usermanager/lang/ckb/delete.txt | 1 + lib/plugins/usermanager/lang/ckb/edit.txt | 1 + lib/plugins/usermanager/lang/ckb/import.txt | 8 + lib/plugins/usermanager/lang/ckb/intro.txt | 1 + lib/plugins/usermanager/lang/ckb/lang.php | 75 + lib/plugins/usermanager/lang/ckb/list.txt | 1 + lib/plugins/usermanager/lang/cs/add.txt | 1 + lib/plugins/usermanager/lang/cs/delete.txt | 1 + lib/plugins/usermanager/lang/cs/edit.txt | 1 + lib/plugins/usermanager/lang/cs/import.txt | 9 + lib/plugins/usermanager/lang/cs/intro.txt | 1 + lib/plugins/usermanager/lang/cs/lang.php | 87 + lib/plugins/usermanager/lang/cs/list.txt | 1 + lib/plugins/usermanager/lang/cy/add.txt | 1 + lib/plugins/usermanager/lang/cy/delete.txt | 1 + lib/plugins/usermanager/lang/cy/edit.txt | 1 + lib/plugins/usermanager/lang/cy/import.txt | 9 + lib/plugins/usermanager/lang/cy/intro.txt | 1 + lib/plugins/usermanager/lang/cy/lang.php | 87 + lib/plugins/usermanager/lang/cy/list.txt | 1 + lib/plugins/usermanager/lang/da/add.txt | 1 + lib/plugins/usermanager/lang/da/delete.txt | 1 + lib/plugins/usermanager/lang/da/edit.txt | 1 + lib/plugins/usermanager/lang/da/import.txt | 9 + lib/plugins/usermanager/lang/da/intro.txt | 1 + lib/plugins/usermanager/lang/da/lang.php | 83 + lib/plugins/usermanager/lang/da/list.txt | 1 + .../usermanager/lang/de-informal/add.txt | 1 + .../usermanager/lang/de-informal/delete.txt | 1 + .../usermanager/lang/de-informal/edit.txt | 1 + .../usermanager/lang/de-informal/import.txt | 7 + .../usermanager/lang/de-informal/intro.txt | 1 + .../usermanager/lang/de-informal/lang.php | 83 + .../usermanager/lang/de-informal/list.txt | 1 + lib/plugins/usermanager/lang/de/add.txt | 1 + lib/plugins/usermanager/lang/de/delete.txt | 1 + lib/plugins/usermanager/lang/de/edit.txt | 1 + lib/plugins/usermanager/lang/de/import.txt | 8 + lib/plugins/usermanager/lang/de/intro.txt | 1 + lib/plugins/usermanager/lang/de/lang.php | 95 + lib/plugins/usermanager/lang/de/list.txt | 1 + lib/plugins/usermanager/lang/el/add.txt | 1 + lib/plugins/usermanager/lang/el/delete.txt | 1 + lib/plugins/usermanager/lang/el/edit.txt | 1 + lib/plugins/usermanager/lang/el/intro.txt | 1 + lib/plugins/usermanager/lang/el/lang.php | 81 + lib/plugins/usermanager/lang/el/list.txt | 1 + lib/plugins/usermanager/lang/en/add.txt | 1 + lib/plugins/usermanager/lang/en/delete.txt | 1 + lib/plugins/usermanager/lang/en/edit.txt | 1 + lib/plugins/usermanager/lang/en/import.txt | 9 + lib/plugins/usermanager/lang/en/intro.txt | 1 + lib/plugins/usermanager/lang/en/lang.php | 86 + lib/plugins/usermanager/lang/en/list.txt | 1 + lib/plugins/usermanager/lang/eo/add.txt | 1 + lib/plugins/usermanager/lang/eo/delete.txt | 1 + lib/plugins/usermanager/lang/eo/edit.txt | 1 + lib/plugins/usermanager/lang/eo/import.txt | 9 + lib/plugins/usermanager/lang/eo/intro.txt | 1 + lib/plugins/usermanager/lang/eo/lang.php | 69 + lib/plugins/usermanager/lang/eo/list.txt | 1 + lib/plugins/usermanager/lang/es/add.txt | 1 + lib/plugins/usermanager/lang/es/delete.txt | 1 + lib/plugins/usermanager/lang/es/edit.txt | 1 + lib/plugins/usermanager/lang/es/import.txt | 9 + lib/plugins/usermanager/lang/es/intro.txt | 1 + lib/plugins/usermanager/lang/es/lang.php | 100 + lib/plugins/usermanager/lang/es/list.txt | 1 + lib/plugins/usermanager/lang/et/lang.php | 33 + lib/plugins/usermanager/lang/eu/add.txt | 1 + lib/plugins/usermanager/lang/eu/delete.txt | 1 + lib/plugins/usermanager/lang/eu/edit.txt | 1 + lib/plugins/usermanager/lang/eu/intro.txt | 1 + lib/plugins/usermanager/lang/eu/lang.php | 50 + lib/plugins/usermanager/lang/eu/list.txt | 1 + lib/plugins/usermanager/lang/fa/add.txt | 1 + lib/plugins/usermanager/lang/fa/delete.txt | 1 + lib/plugins/usermanager/lang/fa/edit.txt | 1 + lib/plugins/usermanager/lang/fa/import.txt | 6 + lib/plugins/usermanager/lang/fa/intro.txt | 1 + lib/plugins/usermanager/lang/fa/lang.php | 82 + lib/plugins/usermanager/lang/fa/list.txt | 1 + lib/plugins/usermanager/lang/fi/add.txt | 1 + lib/plugins/usermanager/lang/fi/delete.txt | 1 + lib/plugins/usermanager/lang/fi/edit.txt | 1 + lib/plugins/usermanager/lang/fi/intro.txt | 1 + lib/plugins/usermanager/lang/fi/lang.php | 60 + lib/plugins/usermanager/lang/fi/list.txt | 1 + lib/plugins/usermanager/lang/fr/add.txt | 1 + lib/plugins/usermanager/lang/fr/delete.txt | 1 + lib/plugins/usermanager/lang/fr/edit.txt | 1 + lib/plugins/usermanager/lang/fr/import.txt | 11 + lib/plugins/usermanager/lang/fr/intro.txt | 1 + lib/plugins/usermanager/lang/fr/lang.php | 93 + lib/plugins/usermanager/lang/fr/list.txt | 1 + lib/plugins/usermanager/lang/gl/add.txt | 1 + lib/plugins/usermanager/lang/gl/delete.txt | 1 + lib/plugins/usermanager/lang/gl/edit.txt | 1 + lib/plugins/usermanager/lang/gl/intro.txt | 1 + lib/plugins/usermanager/lang/gl/lang.php | 49 + lib/plugins/usermanager/lang/gl/list.txt | 1 + lib/plugins/usermanager/lang/he/add.txt | 1 + lib/plugins/usermanager/lang/he/delete.txt | 1 + lib/plugins/usermanager/lang/he/edit.txt | 1 + lib/plugins/usermanager/lang/he/intro.txt | 1 + lib/plugins/usermanager/lang/he/lang.php | 50 + lib/plugins/usermanager/lang/he/list.txt | 1 + lib/plugins/usermanager/lang/hr/add.txt | 1 + lib/plugins/usermanager/lang/hr/delete.txt | 1 + lib/plugins/usermanager/lang/hr/edit.txt | 1 + lib/plugins/usermanager/lang/hr/import.txt | 9 + lib/plugins/usermanager/lang/hr/intro.txt | 1 + lib/plugins/usermanager/lang/hr/lang.php | 74 + lib/plugins/usermanager/lang/hr/list.txt | 1 + lib/plugins/usermanager/lang/hu/add.txt | 2 + lib/plugins/usermanager/lang/hu/delete.txt | 2 + lib/plugins/usermanager/lang/hu/edit.txt | 2 + lib/plugins/usermanager/lang/hu/import.txt | 9 + lib/plugins/usermanager/lang/hu/intro.txt | 2 + lib/plugins/usermanager/lang/hu/lang.php | 82 + lib/plugins/usermanager/lang/hu/list.txt | 2 + lib/plugins/usermanager/lang/ia/add.txt | 1 + lib/plugins/usermanager/lang/ia/delete.txt | 1 + lib/plugins/usermanager/lang/ia/edit.txt | 1 + lib/plugins/usermanager/lang/ia/intro.txt | 1 + lib/plugins/usermanager/lang/ia/lang.php | 49 + lib/plugins/usermanager/lang/ia/list.txt | 1 + lib/plugins/usermanager/lang/id/add.txt | 1 + lib/plugins/usermanager/lang/id/delete.txt | 1 + lib/plugins/usermanager/lang/id/edit.txt | 1 + lib/plugins/usermanager/lang/id/intro.txt | 1 + lib/plugins/usermanager/lang/id/lang.php | 48 + lib/plugins/usermanager/lang/id/list.txt | 1 + lib/plugins/usermanager/lang/is/delete.txt | 1 + lib/plugins/usermanager/lang/is/lang.php | 21 + lib/plugins/usermanager/lang/it/add.txt | 1 + lib/plugins/usermanager/lang/it/delete.txt | 1 + lib/plugins/usermanager/lang/it/edit.txt | 1 + lib/plugins/usermanager/lang/it/import.txt | 9 + lib/plugins/usermanager/lang/it/intro.txt | 1 + lib/plugins/usermanager/lang/it/lang.php | 84 + lib/plugins/usermanager/lang/it/list.txt | 1 + lib/plugins/usermanager/lang/ja/add.txt | 1 + lib/plugins/usermanager/lang/ja/delete.txt | 1 + lib/plugins/usermanager/lang/ja/edit.txt | 1 + lib/plugins/usermanager/lang/ja/import.txt | 10 + lib/plugins/usermanager/lang/ja/intro.txt | 1 + lib/plugins/usermanager/lang/ja/lang.php | 82 + lib/plugins/usermanager/lang/ja/list.txt | 1 + lib/plugins/usermanager/lang/kk/lang.php | 9 + lib/plugins/usermanager/lang/ko/add.txt | 1 + lib/plugins/usermanager/lang/ko/delete.txt | 1 + lib/plugins/usermanager/lang/ko/edit.txt | 1 + lib/plugins/usermanager/lang/ko/import.txt | 9 + lib/plugins/usermanager/lang/ko/intro.txt | 1 + lib/plugins/usermanager/lang/ko/lang.php | 81 + lib/plugins/usermanager/lang/ko/list.txt | 1 + lib/plugins/usermanager/lang/la/add.txt | 1 + lib/plugins/usermanager/lang/la/delete.txt | 1 + lib/plugins/usermanager/lang/la/edit.txt | 1 + lib/plugins/usermanager/lang/la/intro.txt | 1 + lib/plugins/usermanager/lang/la/lang.php | 47 + lib/plugins/usermanager/lang/la/list.txt | 1 + lib/plugins/usermanager/lang/lb/list.txt | 1 + lib/plugins/usermanager/lang/lt/add.txt | 2 + lib/plugins/usermanager/lang/lt/delete.txt | 2 + lib/plugins/usermanager/lang/lt/edit.txt | 2 + lib/plugins/usermanager/lang/lt/intro.txt | 2 + lib/plugins/usermanager/lang/lt/lang.php | 49 + lib/plugins/usermanager/lang/lt/list.txt | 2 + lib/plugins/usermanager/lang/lv/add.txt | 1 + lib/plugins/usermanager/lang/lv/delete.txt | 1 + lib/plugins/usermanager/lang/lv/edit.txt | 1 + lib/plugins/usermanager/lang/lv/import.txt | 9 + lib/plugins/usermanager/lang/lv/intro.txt | 1 + lib/plugins/usermanager/lang/lv/lang.php | 48 + lib/plugins/usermanager/lang/lv/list.txt | 1 + lib/plugins/usermanager/lang/mk/add.txt | 1 + lib/plugins/usermanager/lang/mk/delete.txt | 1 + lib/plugins/usermanager/lang/mk/edit.txt | 1 + lib/plugins/usermanager/lang/mk/intro.txt | 1 + lib/plugins/usermanager/lang/mk/lang.php | 38 + lib/plugins/usermanager/lang/mk/list.txt | 1 + lib/plugins/usermanager/lang/mr/add.txt | 1 + lib/plugins/usermanager/lang/mr/delete.txt | 1 + lib/plugins/usermanager/lang/mr/edit.txt | 1 + lib/plugins/usermanager/lang/mr/intro.txt | 1 + lib/plugins/usermanager/lang/mr/lang.php | 50 + lib/plugins/usermanager/lang/mr/list.txt | 1 + lib/plugins/usermanager/lang/ne/add.txt | 1 + lib/plugins/usermanager/lang/ne/delete.txt | 1 + lib/plugins/usermanager/lang/ne/edit.txt | 1 + lib/plugins/usermanager/lang/ne/intro.txt | 1 + lib/plugins/usermanager/lang/ne/lang.php | 50 + lib/plugins/usermanager/lang/ne/list.txt | 1 + lib/plugins/usermanager/lang/nl/add.txt | 1 + lib/plugins/usermanager/lang/nl/delete.txt | 1 + lib/plugins/usermanager/lang/nl/edit.txt | 1 + lib/plugins/usermanager/lang/nl/import.txt | 8 + lib/plugins/usermanager/lang/nl/intro.txt | 1 + lib/plugins/usermanager/lang/nl/lang.php | 84 + lib/plugins/usermanager/lang/nl/list.txt | 1 + lib/plugins/usermanager/lang/no/add.txt | 1 + lib/plugins/usermanager/lang/no/delete.txt | 1 + lib/plugins/usermanager/lang/no/edit.txt | 1 + lib/plugins/usermanager/lang/no/import.txt | 7 + lib/plugins/usermanager/lang/no/intro.txt | 1 + lib/plugins/usermanager/lang/no/lang.php | 86 + lib/plugins/usermanager/lang/no/list.txt | 1 + lib/plugins/usermanager/lang/oc/lang.php | 41 + lib/plugins/usermanager/lang/oc/list.txt | 1 + lib/plugins/usermanager/lang/pl/add.txt | 1 + lib/plugins/usermanager/lang/pl/delete.txt | 1 + lib/plugins/usermanager/lang/pl/edit.txt | 1 + lib/plugins/usermanager/lang/pl/import.txt | 6 + lib/plugins/usermanager/lang/pl/intro.txt | 1 + lib/plugins/usermanager/lang/pl/lang.php | 86 + lib/plugins/usermanager/lang/pl/list.txt | 1 + lib/plugins/usermanager/lang/pt-br/add.txt | 1 + lib/plugins/usermanager/lang/pt-br/delete.txt | 1 + lib/plugins/usermanager/lang/pt-br/edit.txt | 1 + lib/plugins/usermanager/lang/pt-br/import.txt | 9 + lib/plugins/usermanager/lang/pt-br/intro.txt | 1 + lib/plugins/usermanager/lang/pt-br/lang.php | 90 + lib/plugins/usermanager/lang/pt-br/list.txt | 1 + lib/plugins/usermanager/lang/pt/add.txt | 1 + lib/plugins/usermanager/lang/pt/delete.txt | 1 + lib/plugins/usermanager/lang/pt/edit.txt | 1 + lib/plugins/usermanager/lang/pt/import.txt | 11 + lib/plugins/usermanager/lang/pt/intro.txt | 1 + lib/plugins/usermanager/lang/pt/lang.php | 91 + lib/plugins/usermanager/lang/pt/list.txt | 1 + lib/plugins/usermanager/lang/ro/add.txt | 1 + lib/plugins/usermanager/lang/ro/delete.txt | 1 + lib/plugins/usermanager/lang/ro/edit.txt | 1 + lib/plugins/usermanager/lang/ro/intro.txt | 1 + lib/plugins/usermanager/lang/ro/lang.php | 51 + lib/plugins/usermanager/lang/ro/list.txt | 1 + lib/plugins/usermanager/lang/ru/add.txt | 1 + lib/plugins/usermanager/lang/ru/delete.txt | 1 + lib/plugins/usermanager/lang/ru/edit.txt | 1 + lib/plugins/usermanager/lang/ru/import.txt | 9 + lib/plugins/usermanager/lang/ru/intro.txt | 1 + lib/plugins/usermanager/lang/ru/lang.php | 92 + lib/plugins/usermanager/lang/ru/list.txt | 1 + lib/plugins/usermanager/lang/sk/add.txt | 2 + lib/plugins/usermanager/lang/sk/delete.txt | 2 + lib/plugins/usermanager/lang/sk/edit.txt | 2 + lib/plugins/usermanager/lang/sk/import.txt | 9 + lib/plugins/usermanager/lang/sk/intro.txt | 2 + lib/plugins/usermanager/lang/sk/lang.php | 78 + lib/plugins/usermanager/lang/sk/list.txt | 2 + lib/plugins/usermanager/lang/sl/add.txt | 1 + lib/plugins/usermanager/lang/sl/delete.txt | 1 + lib/plugins/usermanager/lang/sl/edit.txt | 1 + lib/plugins/usermanager/lang/sl/intro.txt | 1 + lib/plugins/usermanager/lang/sl/lang.php | 70 + lib/plugins/usermanager/lang/sl/list.txt | 1 + lib/plugins/usermanager/lang/sq/add.txt | 1 + lib/plugins/usermanager/lang/sq/delete.txt | 1 + lib/plugins/usermanager/lang/sq/edit.txt | 1 + lib/plugins/usermanager/lang/sq/intro.txt | 1 + lib/plugins/usermanager/lang/sq/lang.php | 53 + lib/plugins/usermanager/lang/sq/list.txt | 1 + lib/plugins/usermanager/lang/sr/add.txt | 1 + lib/plugins/usermanager/lang/sr/delete.txt | 1 + lib/plugins/usermanager/lang/sr/edit.txt | 1 + lib/plugins/usermanager/lang/sr/intro.txt | 1 + lib/plugins/usermanager/lang/sr/lang.php | 49 + lib/plugins/usermanager/lang/sr/list.txt | 1 + lib/plugins/usermanager/lang/sv/add.txt | 1 + lib/plugins/usermanager/lang/sv/delete.txt | 1 + lib/plugins/usermanager/lang/sv/edit.txt | 1 + lib/plugins/usermanager/lang/sv/intro.txt | 1 + lib/plugins/usermanager/lang/sv/lang.php | 81 + lib/plugins/usermanager/lang/sv/list.txt | 1 + lib/plugins/usermanager/lang/th/add.txt | 1 + lib/plugins/usermanager/lang/th/delete.txt | 1 + lib/plugins/usermanager/lang/th/edit.txt | 1 + lib/plugins/usermanager/lang/th/intro.txt | 1 + lib/plugins/usermanager/lang/th/lang.php | 47 + lib/plugins/usermanager/lang/th/list.txt | 1 + lib/plugins/usermanager/lang/tr/add.txt | 1 + lib/plugins/usermanager/lang/tr/delete.txt | 1 + lib/plugins/usermanager/lang/tr/edit.txt | 1 + lib/plugins/usermanager/lang/tr/intro.txt | 1 + lib/plugins/usermanager/lang/tr/lang.php | 52 + lib/plugins/usermanager/lang/tr/list.txt | 1 + lib/plugins/usermanager/lang/uk/add.txt | 1 + lib/plugins/usermanager/lang/uk/delete.txt | 1 + lib/plugins/usermanager/lang/uk/edit.txt | 1 + lib/plugins/usermanager/lang/uk/intro.txt | 1 + lib/plugins/usermanager/lang/uk/lang.php | 50 + lib/plugins/usermanager/lang/uk/list.txt | 1 + lib/plugins/usermanager/lang/vi/add.txt | 1 + lib/plugins/usermanager/lang/vi/delete.txt | 1 + lib/plugins/usermanager/lang/vi/edit.txt | 1 + lib/plugins/usermanager/lang/vi/import.txt | 8 + lib/plugins/usermanager/lang/vi/intro.txt | 1 + lib/plugins/usermanager/lang/vi/lang.php | 74 + lib/plugins/usermanager/lang/vi/list.txt | 1 + lib/plugins/usermanager/lang/zh-tw/add.txt | 1 + lib/plugins/usermanager/lang/zh-tw/delete.txt | 1 + lib/plugins/usermanager/lang/zh-tw/edit.txt | 1 + lib/plugins/usermanager/lang/zh-tw/import.txt | 9 + lib/plugins/usermanager/lang/zh-tw/intro.txt | 1 + lib/plugins/usermanager/lang/zh-tw/lang.php | 74 + lib/plugins/usermanager/lang/zh-tw/list.txt | 1 + lib/plugins/usermanager/lang/zh/add.txt | 1 + lib/plugins/usermanager/lang/zh/delete.txt | 1 + lib/plugins/usermanager/lang/zh/edit.txt | 1 + lib/plugins/usermanager/lang/zh/import.txt | 7 + lib/plugins/usermanager/lang/zh/intro.txt | 1 + lib/plugins/usermanager/lang/zh/lang.php | 86 + lib/plugins/usermanager/lang/zh/list.txt | 1 + lib/plugins/usermanager/plugin.info.txt | 7 + lib/plugins/usermanager/remote.php | 110 + lib/plugins/usermanager/script.js | 8 + lib/plugins/usermanager/style.css | 33 + .../vshare/.github/workflows/dokuwiki.yml | 11 + lib/plugins/vshare/_test/GeneralTest.php | 86 + lib/plugins/vshare/_test/SitesTest.php | 62 + lib/plugins/vshare/_test/VideoSyntaxTest.php | 100 + lib/plugins/vshare/action.php | 42 + lib/plugins/vshare/all.css | 42 + lib/plugins/vshare/button.png | Bin 0 -> 710 bytes lib/plugins/vshare/conf/default.php | 11 + lib/plugins/vshare/conf/metadata.php | 11 + lib/plugins/vshare/deleted.files | 9 + lib/plugins/vshare/helper.php | 22 + lib/plugins/vshare/lang/ar/lang.php | 11 + lib/plugins/vshare/lang/ckb/lang.php | 11 + lib/plugins/vshare/lang/cs/lang.php | 12 + lib/plugins/vshare/lang/da/lang.php | 11 + lib/plugins/vshare/lang/de-informal/lang.php | 13 + .../vshare/lang/de-informal/settings.php | 9 + lib/plugins/vshare/lang/de/lang.php | 14 + lib/plugins/vshare/lang/de/settings.php | 9 + lib/plugins/vshare/lang/el/lang.php | 10 + lib/plugins/vshare/lang/en/lang.php | 6 + lib/plugins/vshare/lang/en/settings.php | 11 + lib/plugins/vshare/lang/es/lang.php | 11 + lib/plugins/vshare/lang/fa/lang.php | 11 + lib/plugins/vshare/lang/fr/lang.php | 14 + lib/plugins/vshare/lang/fr/settings.php | 10 + lib/plugins/vshare/lang/it/lang.php | 11 + lib/plugins/vshare/lang/ja/lang.php | 10 + lib/plugins/vshare/lang/ko/lang.php | 14 + lib/plugins/vshare/lang/ko/settings.php | 8 + lib/plugins/vshare/lang/nl/lang.php | 15 + lib/plugins/vshare/lang/nl/settings.php | 9 + lib/plugins/vshare/lang/no/lang.php | 11 + lib/plugins/vshare/lang/pl/lang.php | 13 + lib/plugins/vshare/lang/pl/settings.php | 9 + lib/plugins/vshare/lang/pt-br/lang.php | 13 + lib/plugins/vshare/lang/pt-br/settings.php | 9 + lib/plugins/vshare/lang/ru/lang.php | 13 + lib/plugins/vshare/lang/ru/settings.php | 10 + lib/plugins/vshare/lang/tr/lang.php | 11 + lib/plugins/vshare/lang/vi/lang.php | 12 + lib/plugins/vshare/lang/vi/settings.php | 9 + lib/plugins/vshare/lang/zh-tw/lang.php | 8 + lib/plugins/vshare/lang/zh-tw/settings.php | 9 + lib/plugins/vshare/lang/zh/lang.php | 14 + lib/plugins/vshare/lang/zh/settings.php | 10 + lib/plugins/vshare/manager.dat | 2 + lib/plugins/vshare/pdf.css | 16 + lib/plugins/vshare/plugin.info.txt | 8 + lib/plugins/vshare/script.js | 90 + lib/plugins/vshare/sites.ini | 100 + lib/plugins/vshare/syntax/debug.php | 86 + lib/plugins/vshare/syntax/video.php | 303 + lib/plugins/vshare/video.png | Bin 0 -> 6682 bytes lib/plugins/vshare/video.svg | 1 + .../wrap/.github/workflows/phpTestLinux.yml | 52 + lib/plugins/wrap/_test/GeneralTest.php | 86 + lib/plugins/wrap/_test/SyntaxTest.php | 246 + lib/plugins/wrap/action.php | 146 + lib/plugins/wrap/all.less | 352 + lib/plugins/wrap/conf/default.php | 13 + lib/plugins/wrap/conf/lang2dir.conf | 249 + lib/plugins/wrap/conf/metadata.php | 13 + lib/plugins/wrap/example.txt | 455 + lib/plugins/wrap/helper.php | 808 + lib/plugins/wrap/images/note/16/alert.png | Bin 0 -> 883 bytes lib/plugins/wrap/images/note/16/download.png | Bin 0 -> 683 bytes lib/plugins/wrap/images/note/16/help.png | Bin 0 -> 929 bytes lib/plugins/wrap/images/note/16/important.png | Bin 0 -> 574 bytes lib/plugins/wrap/images/note/16/info.png | Bin 0 -> 796 bytes lib/plugins/wrap/images/note/16/tip.png | Bin 0 -> 841 bytes lib/plugins/wrap/images/note/16/todo.png | Bin 0 -> 692 bytes lib/plugins/wrap/images/note/48/alert.png | Bin 0 -> 3654 bytes lib/plugins/wrap/images/note/48/download.png | Bin 0 -> 2801 bytes lib/plugins/wrap/images/note/48/help.png | Bin 0 -> 3283 bytes lib/plugins/wrap/images/note/48/important.png | Bin 0 -> 3029 bytes lib/plugins/wrap/images/note/48/info.png | Bin 0 -> 3315 bytes lib/plugins/wrap/images/note/48/tip.png | Bin 0 -> 4232 bytes lib/plugins/wrap/images/note/48/todo.png | Bin 0 -> 3176 bytes lib/plugins/wrap/images/toolbar/box.png | Bin 0 -> 353 bytes lib/plugins/wrap/images/toolbar/clear.png | Bin 0 -> 797 bytes lib/plugins/wrap/images/toolbar/column.png | Bin 0 -> 246 bytes lib/plugins/wrap/images/toolbar/em.png | Bin 0 -> 235 bytes lib/plugins/wrap/images/toolbar/hi.png | Bin 0 -> 259 bytes lib/plugins/wrap/images/toolbar/lo.png | Bin 0 -> 211 bytes lib/plugins/wrap/images/toolbar/picker.png | Bin 0 -> 870 bytes lib/plugins/wrap/lang/ar/lang.php | 16 + lib/plugins/wrap/lang/ar/settings.php | 11 + lib/plugins/wrap/lang/bg/lang.php | 21 + lib/plugins/wrap/lang/bg/settings.php | 16 + lib/plugins/wrap/lang/bn/lang.php | 21 + lib/plugins/wrap/lang/bn/settings.php | 14 + lib/plugins/wrap/lang/ckb/lang.php | 21 + lib/plugins/wrap/lang/ckb/settings.php | 16 + lib/plugins/wrap/lang/cs/lang.php | 22 + lib/plugins/wrap/lang/cs/settings.php | 17 + lib/plugins/wrap/lang/cy/lang.php | 22 + lib/plugins/wrap/lang/cy/settings.php | 15 + lib/plugins/wrap/lang/da/lang.php | 21 + lib/plugins/wrap/lang/da/settings.php | 17 + lib/plugins/wrap/lang/de-informal/lang.php | 19 + .../wrap/lang/de-informal/settings.php | 15 + lib/plugins/wrap/lang/de/lang.php | 19 + lib/plugins/wrap/lang/de/settings.php | 15 + lib/plugins/wrap/lang/el/lang.php | 21 + lib/plugins/wrap/lang/el/settings.php | 16 + lib/plugins/wrap/lang/en/lang.php | 19 + lib/plugins/wrap/lang/en/settings.php | 15 + lib/plugins/wrap/lang/eo/lang.php | 21 + lib/plugins/wrap/lang/eo/settings.php | 14 + lib/plugins/wrap/lang/es/lang.php | 21 + lib/plugins/wrap/lang/es/settings.php | 18 + lib/plugins/wrap/lang/fa/lang.php | 22 + lib/plugins/wrap/lang/fa/settings.php | 17 + lib/plugins/wrap/lang/fr/lang.php | 22 + lib/plugins/wrap/lang/fr/settings.php | 18 + lib/plugins/wrap/lang/hr/lang.php | 21 + lib/plugins/wrap/lang/hr/settings.php | 16 + lib/plugins/wrap/lang/hu/lang.php | 21 + lib/plugins/wrap/lang/hu/settings.php | 16 + lib/plugins/wrap/lang/it/lang.php | 23 + lib/plugins/wrap/lang/it/settings.php | 16 + lib/plugins/wrap/lang/ja/lang.php | 21 + lib/plugins/wrap/lang/ja/settings.php | 18 + lib/plugins/wrap/lang/ko/lang.php | 21 + lib/plugins/wrap/lang/ko/settings.php | 17 + lib/plugins/wrap/lang/nl/lang.php | 21 + lib/plugins/wrap/lang/nl/settings.php | 17 + lib/plugins/wrap/lang/no/lang.php | 24 + lib/plugins/wrap/lang/no/settings.php | 15 + lib/plugins/wrap/lang/pl/lang.php | 19 + lib/plugins/wrap/lang/pl/settings.php | 8 + lib/plugins/wrap/lang/pt-br/lang.php | 22 + lib/plugins/wrap/lang/pt-br/settings.php | 21 + lib/plugins/wrap/lang/ru/lang.php | 22 + lib/plugins/wrap/lang/ru/settings.php | 18 + lib/plugins/wrap/lang/sk/lang.php | 12 + lib/plugins/wrap/lang/sk/settings.php | 12 + lib/plugins/wrap/lang/sr/lang.php | 21 + lib/plugins/wrap/lang/sr/settings.php | 15 + lib/plugins/wrap/lang/sv/lang.php | 17 + lib/plugins/wrap/lang/sv/settings.php | 10 + lib/plugins/wrap/lang/tr/lang.php | 22 + lib/plugins/wrap/lang/tr/settings.php | 15 + lib/plugins/wrap/lang/uk/lang.php | 20 + lib/plugins/wrap/lang/uk/settings.php | 10 + lib/plugins/wrap/lang/vi/lang.php | 22 + lib/plugins/wrap/lang/vi/settings.php | 16 + lib/plugins/wrap/lang/zh-tw/lang.php | 19 + lib/plugins/wrap/lang/zh-tw/settings.php | 11 + lib/plugins/wrap/lang/zh/lang.php | 20 + lib/plugins/wrap/lang/zh/settings.php | 18 + lib/plugins/wrap/manager.dat | 2 + lib/plugins/wrap/pdf.less | 20 + lib/plugins/wrap/plugin.info.txt | 8 + lib/plugins/wrap/print.less | 45 + lib/plugins/wrap/print_or_pdf.less | 31 + lib/plugins/wrap/style.less | 215 + lib/plugins/wrap/syntax/closesection.php | 35 + lib/plugins/wrap/syntax/div.php | 134 + lib/plugins/wrap/syntax/divblock.php | 19 + lib/plugins/wrap/syntax/divwrap.php | 18 + lib/plugins/wrap/syntax/span.php | 100 + lib/plugins/wrap/syntax/spaninline.php | 18 + lib/plugins/wrap/syntax/spanwrap.php | 19 + lib/scripts/behaviour.js | 241 + lib/scripts/compatibility.js | 42 + lib/scripts/cookie.js | 71 + lib/scripts/delay.js | 70 + lib/scripts/edit.js | 309 + lib/scripts/editor.js | 205 + lib/scripts/fileuploader.js | 1249 + lib/scripts/fileuploaderextended.js | 345 + lib/scripts/helpers.js | 69 + lib/scripts/hotkeys.js | 302 + lib/scripts/index.html | 11 + lib/scripts/index.js | 16 + .../images/ui-bg_glass_55_fbf9ee_1x400.png | Bin 0 -> 445 bytes .../images/ui-bg_glass_65_ffffff_1x400.png | Bin 0 -> 317 bytes .../images/ui-bg_glass_75_dadada_1x400.png | Bin 0 -> 375 bytes .../images/ui-bg_glass_75_e6e6e6_1x400.png | Bin 0 -> 376 bytes .../images/ui-bg_glass_95_fef1ec_1x400.png | Bin 0 -> 442 bytes .../ui-bg_highlight-soft_75_cccccc_1x100.png | Bin 0 -> 377 bytes .../images/ui-icons_222222_256x240.png | Bin 0 -> 7077 bytes .../images/ui-icons_2e83ff_256x240.png | Bin 0 -> 4670 bytes .../images/ui-icons_454545_256x240.png | Bin 0 -> 7142 bytes .../images/ui-icons_888888_256x240.png | Bin 0 -> 7163 bytes .../images/ui-icons_cd0a0a_256x240.png | Bin 0 -> 4670 bytes .../jquery/jquery-ui-theme/smoothness.css | 1314 + lib/scripts/jquery/jquery-ui.min.js | 6 + lib/scripts/jquery/jquery.cookie.js | 117 + lib/scripts/jquery/jquery.min.js | 2 + lib/scripts/jquery/update.sh | 48 + lib/scripts/jquery/versions | 3 + lib/scripts/linkwiz.js | 339 + lib/scripts/locktimer.js | 151 + lib/scripts/media.js | 951 + lib/scripts/page.js | 211 + lib/scripts/qsearch.js | 191 + lib/scripts/script.js | 30 + lib/scripts/search.js | 48 + lib/scripts/textselection.js | 152 + lib/scripts/toolbar.js | 282 + lib/scripts/tree.js | 107 + lib/styles/all.css | 77 + lib/styles/feed.css | 63 + lib/styles/geshi.less | 144 + lib/styles/index.html | 11 + lib/styles/print.css | 15 + lib/styles/screen.css | 96 + lib/tpl/arcadebasic/README.md | 10 + lib/tpl/arcadebasic/conf/default.php | 9 + lib/tpl/arcadebasic/conf/metadata.php | 9 + .../css/arcadebasic-responsive.css | 333 + lib/tpl/arcadebasic/css/arcadebasic.css | 5457 ++ lib/tpl/arcadebasic/css/basic.css | 453 + lib/tpl/arcadebasic/css/content.css | 169 + lib/tpl/arcadebasic/css/design.css | 248 + lib/tpl/arcadebasic/css/includes.css | 4 + lib/tpl/arcadebasic/css/mobile.css | 85 + lib/tpl/arcadebasic/css/print.css | 154 + lib/tpl/arcadebasic/css/structure.css | 81 + lib/tpl/arcadebasic/detail.php | 95 + .../arcadebasic/images/apple-touch-icon.png | Bin 0 -> 17728 bytes ...ade basic dokuwiki template screenshot.png | Bin 0 -> 418801 bytes lib/tpl/arcadebasic/images/color-picker.jpg | Bin 0 -> 25988 bytes lib/tpl/arcadebasic/images/custom-header.jpg | Bin 0 -> 8000 bytes lib/tpl/arcadebasic/images/customizer.jpg | Bin 0 -> 42286 bytes .../arcadebasic/images/extended-footer.jpg | Bin 0 -> 13346 bytes lib/tpl/arcadebasic/images/favicon.ico | Bin 0 -> 7406 bytes lib/tpl/arcadebasic/images/google-fonts.jpg | Bin 0 -> 46213 bytes lib/tpl/arcadebasic/images/grid-template.jpg | Bin 0 -> 36790 bytes .../arcadebasic/images/header01-thumbnail.jpg | Bin 0 -> 9045 bytes lib/tpl/arcadebasic/images/header01.jpg | Bin 0 -> 122513 bytes .../arcadebasic/images/home-page-widgets.jpg | Bin 0 -> 36642 bytes lib/tpl/arcadebasic/images/jetpack.jpg | Bin 0 -> 23055 bytes lib/tpl/arcadebasic/images/jumbo-headline.jpg | Bin 0 -> 29482 bytes lib/tpl/arcadebasic/images/layout.jpg | Bin 0 -> 3441 bytes lib/tpl/arcadebasic/images/post-block.jpg | Bin 0 -> 41512 bytes lib/tpl/arcadebasic/images/pull-quotes.jpg | Bin 0 -> 86848 bytes lib/tpl/arcadebasic/images/screenshot_sml.jpg | Bin 0 -> 31525 bytes lib/tpl/arcadebasic/images/social-menu.jpg | Bin 0 -> 24488 bytes lib/tpl/arcadebasic/images/video-header.jpg | Bin 0 -> 47076 bytes lib/tpl/arcadebasic/lang/af/lang.php | 12 + lib/tpl/arcadebasic/lang/ar/lang.php | 13 + lib/tpl/arcadebasic/lang/az/lang.php | 12 + lib/tpl/arcadebasic/lang/bg/lang.php | 12 + lib/tpl/arcadebasic/lang/ca/lang.php | 13 + lib/tpl/arcadebasic/lang/cs/lang.php | 12 + lib/tpl/arcadebasic/lang/da/lang.php | 13 + lib/tpl/arcadebasic/lang/de/lang.php | 12 + lib/tpl/arcadebasic/lang/de/settings.php | 9 + lib/tpl/arcadebasic/lang/el/lang.php | 12 + lib/tpl/arcadebasic/lang/en/lang.php | 13 + lib/tpl/arcadebasic/lang/en/settings.php | 9 + lib/tpl/arcadebasic/lang/en/style.txt | 1 + lib/tpl/arcadebasic/lang/eo/lang.php | 11 + lib/tpl/arcadebasic/lang/es/lang.php | 12 + lib/tpl/arcadebasic/lang/et/lang.php | 13 + lib/tpl/arcadebasic/lang/eu/lang.php | 12 + lib/tpl/arcadebasic/lang/fa/lang.php | 12 + lib/tpl/arcadebasic/lang/fi/lang.php | 13 + lib/tpl/arcadebasic/lang/fo/lang.php | 11 + lib/tpl/arcadebasic/lang/fr/lang.php | 12 + lib/tpl/arcadebasic/lang/fr/settings.php | 9 + lib/tpl/arcadebasic/lang/gl/lang.php | 12 + lib/tpl/arcadebasic/lang/he/lang.php | 12 + lib/tpl/arcadebasic/lang/hi/lang.php | 12 + lib/tpl/arcadebasic/lang/hr/lang.php | 12 + lib/tpl/arcadebasic/lang/hu/lang.php | 12 + lib/tpl/arcadebasic/lang/ia/lang.php | 11 + lib/tpl/arcadebasic/lang/id/lang.php | 12 + lib/tpl/arcadebasic/lang/is/lang.php | 12 + lib/tpl/arcadebasic/lang/it/lang.php | 12 + lib/tpl/arcadebasic/lang/ja/lang.php | 12 + lib/tpl/arcadebasic/lang/km/lang.php | 11 + lib/tpl/arcadebasic/lang/ko/lang.php | 12 + lib/tpl/arcadebasic/lang/la/lang.php | 11 + lib/tpl/arcadebasic/lang/lb/lang.php | 11 + lib/tpl/arcadebasic/lang/lt/lang.php | 12 + lib/tpl/arcadebasic/lang/lv/lang.php | 12 + lib/tpl/arcadebasic/lang/mg/lang.php | 11 + lib/tpl/arcadebasic/lang/mk/lang.php | 12 + lib/tpl/arcadebasic/lang/mr/lang.php | 11 + lib/tpl/arcadebasic/lang/ne/lang.php | 11 + lib/tpl/arcadebasic/lang/nl/lang.php | 12 + lib/tpl/arcadebasic/lang/no/lang.php | 12 + lib/tpl/arcadebasic/lang/pl/lang.php | 12 + lib/tpl/arcadebasic/lang/pt-br/lang.php | 12 + lib/tpl/arcadebasic/lang/pt/lang.php | 12 + lib/tpl/arcadebasic/lang/ro/lang.php | 12 + lib/tpl/arcadebasic/lang/ru/lang.php | 11 + lib/tpl/arcadebasic/lang/ru/settings.php | 11 + lib/tpl/arcadebasic/lang/sk/lang.php | 12 + lib/tpl/arcadebasic/lang/sl/lang.php | 12 + lib/tpl/arcadebasic/lang/sq/lang.php | 12 + lib/tpl/arcadebasic/lang/sr/lang.php | 8 + lib/tpl/arcadebasic/lang/sv/lang.php | 12 + lib/tpl/arcadebasic/lang/th/lang.php | 12 + lib/tpl/arcadebasic/lang/tr/lang.php | 12 + lib/tpl/arcadebasic/lang/uk/lang.php | 12 + lib/tpl/arcadebasic/lang/vi/lang.php | 12 + lib/tpl/arcadebasic/lang/zh-tw/lang.php | 12 + lib/tpl/arcadebasic/lang/zh/lang.php | 12 + lib/tpl/arcadebasic/main.php | 237 + lib/tpl/arcadebasic/manager.dat | 2 + lib/tpl/arcadebasic/mediamanager.php | 48 + lib/tpl/arcadebasic/style.ini | 81 + lib/tpl/arcadebasic/template.info.txt | 7 + lib/tpl/arcadebasic/tpl_functions.php | 142 + lib/tpl/bootstrap3/.editorconfig | 19 + .../.github/ISSUE_TEMPLATE/bug_report.md | 38 + .../.github/ISSUE_TEMPLATE/feature_request.md | 20 + lib/tpl/bootstrap3/.github/no-response.yml | 13 + lib/tpl/bootstrap3/.travis.yml | 13 + lib/tpl/bootstrap3/AUTHORS.md | 129 + lib/tpl/bootstrap3/EventHandlers.php | 442 + lib/tpl/bootstrap3/LICENSE | 340 + lib/tpl/bootstrap3/README.md | 90 + lib/tpl/bootstrap3/RELEASE.md | 645 + lib/tpl/bootstrap3/SVG.php | 97 + lib/tpl/bootstrap3/Template.php | 2424 + lib/tpl/bootstrap3/_test/general.test.php | 79 + .../bootstrap3/assets/anchorjs/anchor.min.js | 6 + .../bootstrap/cerulean/bootstrap.min.css | 11 + .../assets/bootstrap/cosmo/bootstrap.min.css | 11 + .../assets/bootstrap/cyborg/bootstrap.min.css | 11 + .../assets/bootstrap/darkly/bootstrap.min.css | 11 + .../bootstrap/default/bootstrap-theme.min.css | 5 + .../bootstrap/default/bootstrap.min.css | 5 + .../assets/bootstrap/flatly/bootstrap.min.css | 11 + .../fonts/glyphicons-halflings-regular.eot | Bin 0 -> 20127 bytes .../fonts/glyphicons-halflings-regular.svg | 288 + .../fonts/glyphicons-halflings-regular.ttf | Bin 0 -> 45404 bytes .../fonts/glyphicons-halflings-regular.woff | Bin 0 -> 23424 bytes .../fonts/glyphicons-halflings-regular.woff2 | Bin 0 -> 18028 bytes .../bootstrap/journal/bootstrap.min.css | 11 + .../assets/bootstrap/js/bootstrap.min.js | 6 + .../assets/bootstrap/lumen/bootstrap.min.css | 11 + .../assets/bootstrap/paper/bootstrap.min.css | 11 + .../bootstrap/readable/bootstrap.min.css | 11 + .../bootstrap/sandstone/bootstrap.min.css | 11 + .../bootstrap/simplex/bootstrap.min.css | 11 + .../assets/bootstrap/slate/bootstrap.min.css | 11 + .../assets/bootstrap/solar/bootstrap.min.css | 11 + .../bootstrap/spacelab/bootstrap.min.css | 11 + .../bootstrap/superhero/bootstrap.min.css | 11 + .../assets/bootstrap/united/bootstrap.min.css | 11 + .../assets/bootstrap/yeti/bootstrap.min.css | 11 + lib/tpl/bootstrap3/assets/fonts/Lato_300.eot | Bin 0 -> 24292 bytes lib/tpl/bootstrap3/assets/fonts/Lato_300.svg | 435 + lib/tpl/bootstrap3/assets/fonts/Lato_300.woff | Bin 0 -> 29852 bytes .../bootstrap3/assets/fonts/Lato_300.woff2 | Bin 0 -> 23208 bytes lib/tpl/bootstrap3/assets/fonts/Lato_400.css | 11 + lib/tpl/bootstrap3/assets/fonts/Lato_400.eot | Bin 0 -> 26332 bytes lib/tpl/bootstrap3/assets/fonts/Lato_400.svg | 435 + lib/tpl/bootstrap3/assets/fonts/Lato_400.woff | Bin 0 -> 28412 bytes .../bootstrap3/assets/fonts/Lato_400.woff2 | Bin 0 -> 23316 bytes .../assets/fonts/Lato_400italic.css | 11 + .../assets/fonts/Lato_400italic.eot | Bin 0 -> 27523 bytes .../assets/fonts/Lato_400italic.svg | 450 + .../assets/fonts/Lato_400italic.woff | Bin 0 -> 29600 bytes .../assets/fonts/Lato_400italic.woff2 | Bin 0 -> 24192 bytes lib/tpl/bootstrap3/assets/fonts/Lato_700.css | 11 + lib/tpl/bootstrap3/assets/fonts/Lato_700.eot | Bin 0 -> 25911 bytes lib/tpl/bootstrap3/assets/fonts/Lato_700.svg | 438 + lib/tpl/bootstrap3/assets/fonts/Lato_700.woff | Bin 0 -> 27848 bytes .../bootstrap3/assets/fonts/Lato_700.woff2 | Bin 0 -> 22820 bytes .../assets/fonts/News_Cycle_400.eot | Bin 0 -> 14749 bytes .../assets/fonts/News_Cycle_400.woff | Bin 0 -> 16424 bytes .../assets/fonts/News_Cycle_700.eot | Bin 0 -> 15073 bytes .../assets/fonts/News_Cycle_700.svg | 335 + .../assets/fonts/News_Cycle_700.woff | Bin 0 -> 16692 bytes .../assets/fonts/News_Cycle_700.woff2 | Bin 0 -> 13300 bytes .../bootstrap3/assets/fonts/Open_Sans_300.eot | Bin 0 -> 15545 bytes .../bootstrap3/assets/fonts/Open_Sans_300.svg | 332 + .../assets/fonts/Open_Sans_300.woff | Bin 0 -> 18280 bytes .../assets/fonts/Open_Sans_300.woff2 | Bin 0 -> 14564 bytes .../assets/fonts/Open_Sans_300italic.eot | Bin 0 -> 14650 bytes .../assets/fonts/Open_Sans_300italic.svg | 345 + .../assets/fonts/Open_Sans_300italic.woff | Bin 0 -> 17292 bytes .../assets/fonts/Open_Sans_300italic.woff2 | Bin 0 -> 13532 bytes .../bootstrap3/assets/fonts/Open_Sans_400.eot | Bin 0 -> 15050 bytes .../bootstrap3/assets/fonts/Open_Sans_400.svg | 336 + .../assets/fonts/Open_Sans_400.woff | Bin 0 -> 17704 bytes .../assets/fonts/Open_Sans_400.woff2 | Bin 0 -> 14048 bytes .../assets/fonts/Open_Sans_400italic.eot | Bin 0 -> 14510 bytes .../assets/fonts/Open_Sans_400italic.svg | 349 + .../assets/fonts/Open_Sans_400italic.woff | Bin 0 -> 17068 bytes .../assets/fonts/Open_Sans_400italic.woff2 | Bin 0 -> 13416 bytes .../bootstrap3/assets/fonts/Open_Sans_700.eot | Bin 0 -> 15667 bytes .../bootstrap3/assets/fonts/Open_Sans_700.svg | 334 + .../assets/fonts/Open_Sans_700.woff | Bin 0 -> 18476 bytes .../assets/fonts/Open_Sans_700.woff2 | Bin 0 -> 14720 bytes .../assets/fonts/Open_Sans_700italic.eot | Bin 0 -> 14418 bytes .../assets/fonts/Open_Sans_700italic.svg | 342 + .../assets/fonts/Open_Sans_700italic.woff | Bin 0 -> 17068 bytes .../assets/fonts/Open_Sans_700italic.woff2 | Bin 0 -> 13428 bytes .../bootstrap3/assets/fonts/Raleway_400.eot | Bin 0 -> 23428 bytes .../bootstrap3/assets/fonts/Raleway_400.svg | 347 + .../bootstrap3/assets/fonts/Raleway_400.woff | Bin 0 -> 24928 bytes .../bootstrap3/assets/fonts/Raleway_400.woff2 | Bin 0 -> 20444 bytes .../bootstrap3/assets/fonts/Raleway_700.eot | Bin 0 -> 23794 bytes .../bootstrap3/assets/fonts/Raleway_700.svg | 343 + .../bootstrap3/assets/fonts/Raleway_700.woff | Bin 0 -> 25176 bytes .../bootstrap3/assets/fonts/Raleway_700.woff2 | Bin 0 -> 20612 bytes .../bootstrap3/assets/fonts/Roboto_300.eot | Bin 0 -> 17481 bytes .../bootstrap3/assets/fonts/Roboto_300.svg | 312 + .../bootstrap3/assets/fonts/Roboto_300.woff | Bin 0 -> 19916 bytes .../bootstrap3/assets/fonts/Roboto_300.woff2 | Bin 0 -> 15440 bytes .../bootstrap3/assets/fonts/Roboto_400.eot | Bin 0 -> 17405 bytes .../bootstrap3/assets/fonts/Roboto_400.svg | 308 + .../bootstrap3/assets/fonts/Roboto_400.woff | Bin 0 -> 19824 bytes .../bootstrap3/assets/fonts/Roboto_400.woff2 | Bin 0 -> 15344 bytes .../bootstrap3/assets/fonts/Roboto_500.eot | Bin 0 -> 17596 bytes .../bootstrap3/assets/fonts/Roboto_500.svg | 305 + .../bootstrap3/assets/fonts/Roboto_500.woff | Bin 0 -> 20012 bytes .../bootstrap3/assets/fonts/Roboto_500.woff2 | Bin 0 -> 15552 bytes .../bootstrap3/assets/fonts/Roboto_700.eot | Bin 0 -> 17391 bytes .../bootstrap3/assets/fonts/Roboto_700.svg | 309 + .../bootstrap3/assets/fonts/Roboto_700.woff | Bin 0 -> 19888 bytes .../bootstrap3/assets/fonts/Roboto_700.woff2 | Bin 0 -> 15436 bytes .../assets/fonts/Source_Sans_Pro_300.eot | Bin 0 -> 18448 bytes .../assets/fonts/Source_Sans_Pro_300.svg | 347 + .../assets/fonts/Source_Sans_Pro_300.woff | Bin 0 -> 19628 bytes .../assets/fonts/Source_Sans_Pro_300.woff2 | Bin 0 -> 15764 bytes .../assets/fonts/Source_Sans_Pro_400.eot | Bin 0 -> 18478 bytes .../assets/fonts/Source_Sans_Pro_400.svg | 344 + .../assets/fonts/Source_Sans_Pro_400.woff | Bin 0 -> 19616 bytes .../assets/fonts/Source_Sans_Pro_400.woff2 | Bin 0 -> 15908 bytes .../fonts/Source_Sans_Pro_400italic.eot | Bin 0 -> 17343 bytes .../fonts/Source_Sans_Pro_400italic.svg | 352 + .../fonts/Source_Sans_Pro_400italic.woff | Bin 0 -> 18764 bytes .../fonts/Source_Sans_Pro_400italic.woff2 | Bin 0 -> 14880 bytes .../assets/fonts/Source_Sans_Pro_700.eot | Bin 0 -> 18145 bytes .../assets/fonts/Source_Sans_Pro_700.svg | 339 + .../assets/fonts/Source_Sans_Pro_700.woff | Bin 0 -> 19312 bytes .../assets/fonts/Source_Sans_Pro_700.woff2 | Bin 0 -> 15480 bytes .../bootstrap3/assets/fonts/Ubuntu_400.eot | Bin 0 -> 31600 bytes .../bootstrap3/assets/fonts/Ubuntu_400.svg | 363 + .../bootstrap3/assets/fonts/Ubuntu_400.woff | Bin 0 -> 39164 bytes .../bootstrap3/assets/fonts/Ubuntu_400.woff2 | Bin 0 -> 34260 bytes .../bootstrap3/assets/fonts/Ubuntu_700.eot | Bin 0 -> 27033 bytes .../bootstrap3/assets/fonts/Ubuntu_700.svg | 363 + .../bootstrap3/assets/fonts/Ubuntu_700.woff | Bin 0 -> 33424 bytes .../bootstrap3/assets/fonts/Ubuntu_700.woff2 | Bin 0 -> 28968 bytes .../bootstrap3/assets/fonts/cosmo.fonts.css | 36 + .../bootstrap3/assets/fonts/cyborg.fonts.css | 24 + .../bootstrap3/assets/fonts/darkly.fonts.css | 36 + .../bootstrap3/assets/fonts/flatly.fonts.css | 36 + .../bootstrap3/assets/fonts/journal.fonts.css | 24 + .../bootstrap3/assets/fonts/lumen.fonts.css | 48 + .../bootstrap3/assets/fonts/paper.fonts.css | 48 + .../assets/fonts/readable.fonts.css | 24 + .../assets/fonts/sandstone.fonts.css | 36 + .../bootstrap3/assets/fonts/simplex.fonts.css | 24 + .../bootstrap3/assets/fonts/solar.fonts.css | 36 + .../assets/fonts/spacelab.fonts.css | 48 + .../assets/fonts/superhero.fonts.css | 36 + .../bootstrap3/assets/fonts/united.fonts.css | 24 + .../bootstrap3/assets/fonts/yeti.fonts.css | 72 + .../bootstrap3/assets/iconify/iconify.min.js | 13 + .../bootstrap3/assets/iconify/json/fa.json | 4369 ++ .../bootstrap3/assets/iconify/json/mdi.json | 43107 ++++++++++++++++ .../bootstrap3/assets/iconify/plugins/fa.css | 136 + .../bootstrap3/assets/iconify/plugins/fa.js | 177 + .../typeahead/bootstrap3-typeahead.min.js | 1 + .../compat/inc/Menu/AbstractMenu.php | 95 + .../bootstrap3/compat/inc/Menu/DetailMenu.php | 21 + .../compat/inc/Menu/Item/AbstractItem.php | 253 + .../bootstrap3/compat/inc/Menu/Item/Admin.php | 28 + .../bootstrap3/compat/inc/Menu/Item/Back.php | 29 + .../compat/inc/Menu/Item/Backlink.php | 18 + .../bootstrap3/compat/inc/Menu/Item/Edit.php | 65 + .../compat/inc/Menu/Item/ImgBackto.php | 24 + .../bootstrap3/compat/inc/Menu/Item/Index.php | 27 + .../bootstrap3/compat/inc/Menu/Item/Login.php | 29 + .../bootstrap3/compat/inc/Menu/Item/Media.php | 21 + .../compat/inc/Menu/Item/MediaManager.php | 32 + .../compat/inc/Menu/Item/Profile.php | 24 + .../compat/inc/Menu/Item/Recent.php | 20 + .../compat/inc/Menu/Item/Register.php | 24 + .../compat/inc/Menu/Item/Resendpwd.php | 24 + .../compat/inc/Menu/Item/Revert.php | 26 + .../compat/inc/Menu/Item/Revisions.php | 21 + .../compat/inc/Menu/Item/Subscribe.php | 24 + .../bootstrap3/compat/inc/Menu/Item/Top.php | 36 + .../compat/inc/Menu/MenuInterface.php | 20 + .../bootstrap3/compat/inc/Menu/MobileMenu.php | 93 + .../bootstrap3/compat/inc/Menu/PageMenu.php | 23 + .../bootstrap3/compat/inc/Menu/SiteMenu.php | 20 + .../bootstrap3/compat/inc/Menu/UserMenu.php | 21 + lib/tpl/bootstrap3/compat/inc/functions.php | 184 + ...-default_checkbox-blank-circle-outline.svg | 1 + .../compat/lib/images/menu/01-edit_pencil.svg | 1 + .../lib/images/menu/02-create_pencil.svg | 1 + .../images/menu/03-draft_android-studio.svg | 1 + .../lib/images/menu/04-show_file-document.svg | 1 + .../lib/images/menu/05-source_file-xml.svg | 1 + .../lib/images/menu/06-revert_replay.svg | 1 + .../lib/images/menu/07-revisions_history.svg | 1 + .../images/menu/08-backlink_link-variant.svg | 1 + .../menu/09-subscribe_email-outline.svg | 1 + .../lib/images/menu/10-top_arrow-up.svg | 1 + .../menu/11-mediamanager_folder-image.svg | 1 + .../lib/images/menu/12-back_arrow-left.svg | 1 + .../lib/images/menu/account-card-details.svg | 1 + .../compat/lib/images/menu/account-plus.svg | 1 + .../compat/lib/images/menu/calendar-clock.svg | 1 + .../compat/lib/images/menu/file-tree.svg | 1 + .../lib/images/menu/folder-multiple-image.svg | 1 + .../compat/lib/images/menu/lock-reset.svg | 1 + .../compat/lib/images/menu/login.svg | 1 + .../compat/lib/images/menu/logout.svg | 1 + .../compat/lib/images/menu/settings.svg | 1 + lib/tpl/bootstrap3/conf/default.php | 88 + lib/tpl/bootstrap3/conf/metadata.php | 112 + lib/tpl/bootstrap3/css.php | 183 + lib/tpl/bootstrap3/css/bs4-utilities.less | 2707 + lib/tpl/bootstrap3/css/callouts.less | 147 + lib/tpl/bootstrap3/css/core/_admin.less | 64 + lib/tpl/bootstrap3/css/core/_edit.css | 141 + lib/tpl/bootstrap3/css/core/_fileuploader.css | 107 + lib/tpl/bootstrap3/css/core/_forms.css | 106 + lib/tpl/bootstrap3/css/core/_links.css | 69 + .../bootstrap3/css/core/_media_fullscreen.css | 541 + lib/tpl/bootstrap3/css/core/_media_popup.css | 208 + lib/tpl/bootstrap3/css/core/_modal.css | 94 + lib/tpl/bootstrap3/css/core/_search.less | 204 + lib/tpl/bootstrap3/css/diff.less | 93 + lib/tpl/bootstrap3/css/mobile.less | 73 + .../bootstrap3/css/plugins/addnewpage.less | 24 + .../bootstrap3/css/plugins/bureaucracy.less | 36 + lib/tpl/bootstrap3/css/plugins/data.less | 12 + lib/tpl/bootstrap3/css/plugins/database2.less | 17 + .../bootstrap3/css/plugins/datatables.less | 21 + lib/tpl/bootstrap3/css/plugins/dir.less | 12 + .../bootstrap3/css/plugins/discussion.less | 41 + lib/tpl/bootstrap3/css/plugins/inlinetoc.less | 12 + lib/tpl/bootstrap3/css/plugins/linkback.less | 14 + lib/tpl/bootstrap3/css/plugins/move.less | 18 + lib/tpl/bootstrap3/css/plugins/overlay.less | 30 + lib/tpl/bootstrap3/css/plugins/publish.less | 18 + .../bootstrap3/css/plugins/simplenavi.less | 18 + lib/tpl/bootstrap3/css/plugins/struct.less | 38 + lib/tpl/bootstrap3/css/plugins/tag.less | 20 + lib/tpl/bootstrap3/css/plugins/tagging.less | 12 + .../bootstrap3/css/plugins/translation.less | 12 + lib/tpl/bootstrap3/css/print.less | 36 + lib/tpl/bootstrap3/css/recent.less | 31 + lib/tpl/bootstrap3/css/replacements.less | 99 + lib/tpl/bootstrap3/css/template.less | 901 + lib/tpl/bootstrap3/css/toc.less | 93 + lib/tpl/bootstrap3/detail.php | 553 + lib/tpl/bootstrap3/extra/hooks/navbar.html | 15 + lib/tpl/bootstrap3/extra/hooks/social.html | 34 + lib/tpl/bootstrap3/iconify.php | 198 + .../bootstrap3/images/apple-touch-icon.png | Bin 0 -> 17728 bytes lib/tpl/bootstrap3/images/avatar.png | Bin 0 -> 2077 bytes lib/tpl/bootstrap3/images/bootstrap.png | Bin 0 -> 791 bytes .../bootstrap3/images/button-bootstrap3.png | Bin 0 -> 302 bytes lib/tpl/bootstrap3/images/css3.png | Bin 0 -> 2187 bytes lib/tpl/bootstrap3/images/favicon.ico | Bin 0 -> 7406 bytes lib/tpl/bootstrap3/images/html5.png | Bin 0 -> 2055 bytes lib/tpl/bootstrap3/images/license/by.png | Bin 0 -> 1173 bytes lib/tpl/bootstrap3/images/license/cc.png | Bin 0 -> 1182 bytes lib/tpl/bootstrap3/images/license/gnufdl.png | Bin 0 -> 3457 bytes lib/tpl/bootstrap3/images/license/nc-eu.png | Bin 0 -> 1331 bytes lib/tpl/bootstrap3/images/license/nc-jp.png | Bin 0 -> 1319 bytes lib/tpl/bootstrap3/images/license/nc.png | Bin 0 -> 1376 bytes lib/tpl/bootstrap3/images/license/nd.png | Bin 0 -> 1051 bytes lib/tpl/bootstrap3/images/license/pd.png | Bin 0 -> 1255 bytes lib/tpl/bootstrap3/images/license/remix.png | Bin 0 -> 1317 bytes lib/tpl/bootstrap3/images/license/sa.png | Bin 0 -> 1289 bytes .../images/license/sampling.plus.png | Bin 0 -> 1517 bytes .../bootstrap3/images/license/sampling.png | Bin 0 -> 1511 bytes lib/tpl/bootstrap3/images/license/share.png | Bin 0 -> 1206 bytes lib/tpl/bootstrap3/images/license/zero.png | Bin 0 -> 1230 bytes lib/tpl/bootstrap3/images/logo.png | Bin 0 -> 3820 bytes .../images/menu/comment-text-multiple.svg | 1 + lib/tpl/bootstrap3/images/menu/email-plus.svg | 1 + .../images/menu/file-document-box-outline.svg | 1 + lib/tpl/bootstrap3/images/menu/help.svg | 1 + .../images/menu/image-size-select-large.svg | 1 + lib/tpl/bootstrap3/images/menu/link.svg | 1 + lib/tpl/bootstrap3/images/menu/printer.svg | 1 + lib/tpl/bootstrap3/images/menu/puzzle.svg | 1 + lib/tpl/bootstrap3/images/menu/rss.svg | 1 + .../bootstrap3/images/menu/share-variant.svg | 1 + lib/tpl/bootstrap3/images/php.png | Bin 0 -> 3350 bytes lib/tpl/bootstrap3/inc/Menu/DetailMenu.php | 21 + .../bootstrap3/inc/Menu/Item/Discussion.php | 40 + lib/tpl/bootstrap3/inc/Menu/Item/Feed.php | 35 + lib/tpl/bootstrap3/inc/Menu/Item/Help.php | 46 + .../inc/Menu/Item/ImgOriginalSize.php | 46 + .../bootstrap3/inc/Menu/Item/Permalink.php | 42 + .../bootstrap3/inc/Menu/Item/PrintPage.php | 26 + lib/tpl/bootstrap3/inc/Menu/Item/SendMail.php | 26 + lib/tpl/bootstrap3/inc/Menu/Item/ShareOn.php | 77 + lib/tpl/bootstrap3/inc/Menu/PageIconsMenu.php | 22 + lib/tpl/bootstrap3/inc/Menu/PageMenu.php | 23 + lib/tpl/bootstrap3/inc/simple_html_dom.php | 2355 + lib/tpl/bootstrap3/index.html | 0 lib/tpl/bootstrap3/js/plugins/csv.js | 24 + lib/tpl/bootstrap3/js/plugins/data.js | 39 + lib/tpl/bootstrap3/js/plugins/database2.js | 16 + lib/tpl/bootstrap3/js/plugins/datatables.js | 15 + lib/tpl/bootstrap3/js/plugins/davcal.js | 28 + lib/tpl/bootstrap3/js/plugins/discussion.js | 32 + lib/tpl/bootstrap3/js/plugins/explain.js | 32 + lib/tpl/bootstrap3/js/plugins/folded.js | 15 + lib/tpl/bootstrap3/js/plugins/gallery.js | 15 + lib/tpl/bootstrap3/js/plugins/include.js | 16 + lib/tpl/bootstrap3/js/plugins/inlinetoc.js | 18 + lib/tpl/bootstrap3/js/plugins/monthcal.js | 15 + lib/tpl/bootstrap3/js/plugins/move.js | 67 + lib/tpl/bootstrap3/js/plugins/overlay.js | 29 + lib/tpl/bootstrap3/js/plugins/plantuml.js | 15 + lib/tpl/bootstrap3/js/plugins/publish.js | 32 + lib/tpl/bootstrap3/js/plugins/semantic.js | 113 + lib/tpl/bootstrap3/js/plugins/simplenavi.js | 22 + lib/tpl/bootstrap3/js/plugins/struct.js | 14 + lib/tpl/bootstrap3/js/plugins/tabbox.js | 16 + lib/tpl/bootstrap3/js/plugins/tagalerts.js | 34 + lib/tpl/bootstrap3/js/plugins/tagging.js | 16 + lib/tpl/bootstrap3/js/plugins/translation.js | 31 + lib/tpl/bootstrap3/js/plugins/watchcycle.js | 10 + lib/tpl/bootstrap3/js/plugins/wrap.js | 22 + lib/tpl/bootstrap3/lang/ar/lang.php | 42 + lib/tpl/bootstrap3/lang/ar/settings.php | 122 + lib/tpl/bootstrap3/lang/de/lang.php | 45 + lib/tpl/bootstrap3/lang/de/settings.php | 125 + lib/tpl/bootstrap3/lang/en/lang.php | 40 + lib/tpl/bootstrap3/lang/en/settings.php | 121 + lib/tpl/bootstrap3/lang/eo/lang.php | 41 + lib/tpl/bootstrap3/lang/es/lang.php | 42 + lib/tpl/bootstrap3/lang/es/settings.php | 122 + lib/tpl/bootstrap3/lang/fa/lang.php | 41 + lib/tpl/bootstrap3/lang/fa/settings.php | 121 + lib/tpl/bootstrap3/lang/fr/lang.php | 49 + lib/tpl/bootstrap3/lang/fr/settings.php | 129 + lib/tpl/bootstrap3/lang/hu/lang.php | 41 + lib/tpl/bootstrap3/lang/id/lang.php | 41 + lib/tpl/bootstrap3/lang/id/settings.php | 121 + lib/tpl/bootstrap3/lang/it/lang.php | 40 + lib/tpl/bootstrap3/lang/it/settings.php | 120 + lib/tpl/bootstrap3/lang/ja/lang.php | 43 + lib/tpl/bootstrap3/lang/ja/settings.php | 124 + lib/tpl/bootstrap3/lang/ko/lang.php | 41 + lib/tpl/bootstrap3/lang/ko/settings.php | 121 + lib/tpl/bootstrap3/lang/no/lang.php | 41 + lib/tpl/bootstrap3/lang/no/settings.php | 121 + lib/tpl/bootstrap3/lang/pl/lang.php | 41 + lib/tpl/bootstrap3/lang/pl/settings.php | 121 + lib/tpl/bootstrap3/lang/pt-br/lang.php | 41 + lib/tpl/bootstrap3/lang/pt-br/settings.php | 121 + lib/tpl/bootstrap3/lang/pt/lang.php | 42 + lib/tpl/bootstrap3/lang/pt/settings.php | 122 + lib/tpl/bootstrap3/lang/ru/lang.php | 46 + lib/tpl/bootstrap3/lang/ru/settings.php | 126 + lib/tpl/bootstrap3/lang/zh/lang.php | 45 + lib/tpl/bootstrap3/lang/zh/settings.php | 125 + lib/tpl/bootstrap3/main.php | 213 + lib/tpl/bootstrap3/manager.dat | 3 + lib/tpl/bootstrap3/mediamanager.php | 65 + lib/tpl/bootstrap3/script.js | 1008 + lib/tpl/bootstrap3/style.ini | 94 + lib/tpl/bootstrap3/template.info.txt | 8 + lib/tpl/bootstrap3/tpl/badges.php | 50 + lib/tpl/bootstrap3/tpl/breadcrumbs.php | 36 + lib/tpl/bootstrap3/tpl/cookielaw.php | 42 + lib/tpl/bootstrap3/tpl/footer.php | 87 + lib/tpl/bootstrap3/tpl/functions.php | 69 + lib/tpl/bootstrap3/tpl/global.php | 35 + lib/tpl/bootstrap3/tpl/menu-admin.php | 88 + lib/tpl/bootstrap3/tpl/menu-tools.php | 92 + lib/tpl/bootstrap3/tpl/menu-user.php | 198 + lib/tpl/bootstrap3/tpl/navbar-searchform.php | 29 + lib/tpl/bootstrap3/tpl/navbar.php | 202 + lib/tpl/bootstrap3/tpl/new-page.php | 39 + lib/tpl/bootstrap3/tpl/page-icons.php | 68 + lib/tpl/bootstrap3/tpl/page-tools.php | 33 + lib/tpl/bootstrap3/tpl/sidebar.php | 42 + lib/tpl/bootstrap3/tpl/theme-switcher.php | 42 + lib/tpl/bootstrap3/tpl/translation.php | 103 + lib/tpl/bootstrap3/tpl_functions.php | 7 + lib/tpl/bootstrap3/tpl_global.php | 7 + lib/tpl/dokuwiki/css/_admin.less | 73 + lib/tpl/dokuwiki/css/_diff.css | 140 + lib/tpl/dokuwiki/css/_edit.css | 142 + lib/tpl/dokuwiki/css/_fileuploader.css | 107 + lib/tpl/dokuwiki/css/_footnotes.css | 31 + lib/tpl/dokuwiki/css/_forms.css | 106 + lib/tpl/dokuwiki/css/_imgdetail.css | 38 + lib/tpl/dokuwiki/css/_links.css | 70 + lib/tpl/dokuwiki/css/_media_fullscreen.css | 541 + lib/tpl/dokuwiki/css/_media_popup.css | 208 + lib/tpl/dokuwiki/css/_modal.css | 94 + lib/tpl/dokuwiki/css/_recent.css | 75 + lib/tpl/dokuwiki/css/_search.less | 204 + lib/tpl/dokuwiki/css/_tabs.css | 84 + lib/tpl/dokuwiki/css/_toc.css | 93 + lib/tpl/dokuwiki/css/basic.less | 471 + lib/tpl/dokuwiki/css/content.less | 404 + lib/tpl/dokuwiki/css/design.less | 363 + lib/tpl/dokuwiki/css/mobile.less | 332 + lib/tpl/dokuwiki/css/pagetools.less | 124 + lib/tpl/dokuwiki/css/print.css | 180 + lib/tpl/dokuwiki/css/structure.less | 89 + lib/tpl/dokuwiki/css/usertools.less | 50 + lib/tpl/dokuwiki/detail.php | 105 + lib/tpl/dokuwiki/images/apple-touch-icon.png | Bin 0 -> 6336 bytes lib/tpl/dokuwiki/images/button-css.png | Bin 0 -> 297 bytes lib/tpl/dokuwiki/images/button-donate.gif | Bin 0 -> 187 bytes lib/tpl/dokuwiki/images/button-dw.png | Bin 0 -> 398 bytes lib/tpl/dokuwiki/images/button-html5.png | Bin 0 -> 305 bytes lib/tpl/dokuwiki/images/button-php.gif | Bin 0 -> 207 bytes lib/tpl/dokuwiki/images/button-rss.png | Bin 0 -> 178 bytes lib/tpl/dokuwiki/images/dokuwiki.svg | 84 + lib/tpl/dokuwiki/images/favicon.ico | Bin 0 -> 7406 bytes lib/tpl/dokuwiki/images/license.txt | 5 + lib/tpl/dokuwiki/images/logo.png | Bin 0 -> 3744 bytes lib/tpl/dokuwiki/images/page-background.svg | 8 + lib/tpl/dokuwiki/images/page-gradient.png | Bin 0 -> 209 bytes lib/tpl/dokuwiki/images/pagetools-build.php | 121 + lib/tpl/dokuwiki/images/pagetools-sprite.png | Bin 0 -> 7759 bytes .../dokuwiki/images/pagetools/00_default.png | Bin 0 -> 494 bytes lib/tpl/dokuwiki/images/pagetools/01_edit.png | Bin 0 -> 519 bytes .../dokuwiki/images/pagetools/02_create.png | Bin 0 -> 580 bytes .../dokuwiki/images/pagetools/03_draft.png | Bin 0 -> 592 bytes lib/tpl/dokuwiki/images/pagetools/04_show.png | Bin 0 -> 321 bytes .../dokuwiki/images/pagetools/05_source.png | Bin 0 -> 478 bytes .../dokuwiki/images/pagetools/06_revert.png | Bin 0 -> 462 bytes .../images/pagetools/07_revisions.png | Bin 0 -> 769 bytes .../dokuwiki/images/pagetools/08_backlink.png | Bin 0 -> 527 bytes .../images/pagetools/09_subscribe.png | Bin 0 -> 374 bytes lib/tpl/dokuwiki/images/pagetools/10_top.png | Bin 0 -> 297 bytes .../images/pagetools/11_mediamanager.png | Bin 0 -> 320 bytes lib/tpl/dokuwiki/images/pagetools/12_back.png | Bin 0 -> 288 bytes lib/tpl/dokuwiki/images/pagetools/license.txt | 4 + lib/tpl/dokuwiki/images/search.png | Bin 0 -> 307 bytes lib/tpl/dokuwiki/images/toc-arrows.png | Bin 0 -> 225 bytes lib/tpl/dokuwiki/images/toc-bullet.png | Bin 0 -> 113 bytes lib/tpl/dokuwiki/images/usertools.png | Bin 0 -> 1428 bytes lib/tpl/dokuwiki/lang/bg/lang.php | 13 + lib/tpl/dokuwiki/lang/ckb/lang.php | 16 + lib/tpl/dokuwiki/lang/ckb/style.txt | 4 + lib/tpl/dokuwiki/lang/cs/lang.php | 19 + lib/tpl/dokuwiki/lang/cs/style.txt | 2 + lib/tpl/dokuwiki/lang/cy/lang.php | 12 + lib/tpl/dokuwiki/lang/cy/style.txt | 4 + lib/tpl/dokuwiki/lang/da/lang.php | 16 + lib/tpl/dokuwiki/lang/da/style.txt | 1 + lib/tpl/dokuwiki/lang/de-informal/lang.php | 17 + lib/tpl/dokuwiki/lang/de-informal/style.txt | 1 + lib/tpl/dokuwiki/lang/de/lang.php | 19 + lib/tpl/dokuwiki/lang/de/style.txt | 1 + lib/tpl/dokuwiki/lang/el/lang.php | 16 + lib/tpl/dokuwiki/lang/el/style.txt | 1 + lib/tpl/dokuwiki/lang/en/lang.php | 13 + lib/tpl/dokuwiki/lang/en/style.txt | 4 + lib/tpl/dokuwiki/lang/es/lang.php | 18 + lib/tpl/dokuwiki/lang/es/style.txt | 1 + lib/tpl/dokuwiki/lang/fa/lang.php | 16 + lib/tpl/dokuwiki/lang/fa/style.txt | 1 + lib/tpl/dokuwiki/lang/fr/lang.php | 19 + lib/tpl/dokuwiki/lang/fr/style.txt | 1 + lib/tpl/dokuwiki/lang/hr/lang.php | 16 + lib/tpl/dokuwiki/lang/hr/style.txt | 1 + lib/tpl/dokuwiki/lang/hu/lang.php | 18 + lib/tpl/dokuwiki/lang/hu/style.txt | 1 + lib/tpl/dokuwiki/lang/it/lang.php | 19 + lib/tpl/dokuwiki/lang/it/style.txt | 1 + lib/tpl/dokuwiki/lang/ja/lang.php | 17 + lib/tpl/dokuwiki/lang/ja/style.txt | 5 + lib/tpl/dokuwiki/lang/ko/lang.php | 17 + lib/tpl/dokuwiki/lang/ko/style.txt | 4 + lib/tpl/dokuwiki/lang/nl/lang.php | 17 + lib/tpl/dokuwiki/lang/nl/style.txt | 1 + lib/tpl/dokuwiki/lang/no/lang.php | 15 + lib/tpl/dokuwiki/lang/no/style.txt | 1 + lib/tpl/dokuwiki/lang/oc/lang.php | 10 + lib/tpl/dokuwiki/lang/pl/lang.php | 19 + lib/tpl/dokuwiki/lang/pl/style.txt | 1 + lib/tpl/dokuwiki/lang/pt-br/lang.php | 18 + lib/tpl/dokuwiki/lang/pt-br/style.txt | 1 + lib/tpl/dokuwiki/lang/pt/lang.php | 18 + lib/tpl/dokuwiki/lang/pt/style.txt | 1 + lib/tpl/dokuwiki/lang/ru/lang.php | 19 + lib/tpl/dokuwiki/lang/ru/style.txt | 1 + lib/tpl/dokuwiki/lang/sk/lang.php | 17 + lib/tpl/dokuwiki/lang/sk/style.txt | 1 + lib/tpl/dokuwiki/lang/sv/lang.php | 17 + lib/tpl/dokuwiki/lang/vi/lang.php | 18 + lib/tpl/dokuwiki/lang/vi/style.txt | 4 + lib/tpl/dokuwiki/lang/zh-tw/style.txt | 1 + lib/tpl/dokuwiki/lang/zh/lang.php | 19 + lib/tpl/dokuwiki/lang/zh/style.txt | 1 + lib/tpl/dokuwiki/main.php | 89 + lib/tpl/dokuwiki/mediamanager.php | 45 + lib/tpl/dokuwiki/script.js | 89 + lib/tpl/dokuwiki/style.ini | 89 + lib/tpl/dokuwiki/template.info.txt | 7 + lib/tpl/dokuwiki/tpl_footer.php | 34 + lib/tpl/dokuwiki/tpl_header.php | 88 + lib/tpl/flat/assets/.DS_Store | Bin 0 -> 6148 bytes lib/tpl/flat/assets/css/.DS_Store | Bin 0 -> 6148 bytes lib/tpl/flat/assets/css/admin-style.css | 7 + lib/tpl/flat/assets/css/editor-style.css | 70 + lib/tpl/flat/assets/css/flat.css | 9257 ++++ lib/tpl/flat/assets/css/flat.css.map | 1 + lib/tpl/flat/assets/css/flat.min.css | 1 + lib/tpl/flat/assets/css/style.css | 301 + lib/tpl/flat/assets/fonts/FontAwesome.otf | Bin 0 -> 93888 bytes .../flat/assets/fonts/fontawesome-webfont.eot | Bin 0 -> 60767 bytes .../flat/assets/fonts/fontawesome-webfont.svg | 565 + .../flat/assets/fonts/fontawesome-webfont.ttf | Bin 0 -> 122092 bytes .../assets/fonts/fontawesome-webfont.woff | Bin 0 -> 71508 bytes .../assets/fonts/fontawesome-webfont.woff2 | Bin 0 -> 56780 bytes .../flat/assets/img/default-background.jpg | Bin 0 -> 9116 bytes lib/tpl/flat/assets/js/flat.js | 2305 + lib/tpl/flat/assets/js/flat.min.js | 2 + lib/tpl/flat/assets/js/flat.min2.js | 2 + lib/tpl/flat/assets/js/html5shiv.js | 322 + lib/tpl/flat/assets/js/html5shiv.min.js | 4 + lib/tpl/flat/conf/default.php | 11 + lib/tpl/flat/conf/metadata.php | 14 + lib/tpl/flat/css/.DS_Store | Bin 0 -> 12292 bytes lib/tpl/flat/css/_admin.less | 61 + lib/tpl/flat/css/_diff.css | 137 + lib/tpl/flat/css/_edit.css | 140 + lib/tpl/flat/css/_fileuploader.css | 107 + lib/tpl/flat/css/_footnotes.css | 31 + lib/tpl/flat/css/_forms.css | 106 + lib/tpl/flat/css/_imgdetail.css | 38 + lib/tpl/flat/css/_links.css | 69 + lib/tpl/flat/css/_media_fullscreen.css | 541 + lib/tpl/flat/css/_media_popup.css | 208 + lib/tpl/flat/css/_modal.css | 94 + lib/tpl/flat/css/_recent.css | 75 + lib/tpl/flat/css/_search.css | 109 + lib/tpl/flat/css/_tabs.css | 85 + lib/tpl/flat/css/_toc.css | 94 + lib/tpl/flat/css/accordion.css | 10 + lib/tpl/flat/css/admin-style.css | 7 + lib/tpl/flat/css/basic.less | 460 + lib/tpl/flat/css/content.less | 393 + lib/tpl/flat/css/customFlat.css | 175 + lib/tpl/flat/css/design.less | 428 + lib/tpl/flat/css/editor-style.css | 70 + lib/tpl/flat/css/mobile.less | 332 + lib/tpl/flat/css/pagetools.less | 215 + lib/tpl/flat/css/print.css | 177 + lib/tpl/flat/css/structure.less | 89 + lib/tpl/flat/detail.php | 122 + lib/tpl/flat/flat.min.js | 2 + lib/tpl/flat/footer.html | 15 + lib/tpl/flat/images/apple-touch-icon.png | Bin 0 -> 6336 bytes lib/tpl/flat/images/button-css.png | Bin 0 -> 297 bytes lib/tpl/flat/images/button-donate.gif | Bin 0 -> 187 bytes lib/tpl/flat/images/button-dw.png | Bin 0 -> 398 bytes lib/tpl/flat/images/button-html5.png | Bin 0 -> 305 bytes lib/tpl/flat/images/button-php.gif | Bin 0 -> 207 bytes lib/tpl/flat/images/button-rss.png | Bin 0 -> 178 bytes lib/tpl/flat/images/favicon.ico | Bin 0 -> 7406 bytes lib/tpl/flat/images/license.txt | 5 + lib/tpl/flat/images/logo.png | Bin 0 -> 3744 bytes lib/tpl/flat/images/page-background.svg | 8 + lib/tpl/flat/images/page-gradient.png | Bin 0 -> 209 bytes lib/tpl/flat/images/pagetools-build.php | 123 + lib/tpl/flat/images/pagetools-sprite.png | Bin 0 -> 7759 bytes lib/tpl/flat/images/pagetools/00_default.png | Bin 0 -> 494 bytes lib/tpl/flat/images/pagetools/01_edit.png | Bin 0 -> 519 bytes lib/tpl/flat/images/pagetools/02_create.png | Bin 0 -> 580 bytes lib/tpl/flat/images/pagetools/03_draft.png | Bin 0 -> 592 bytes lib/tpl/flat/images/pagetools/04_show.png | Bin 0 -> 321 bytes lib/tpl/flat/images/pagetools/05_source.png | Bin 0 -> 478 bytes lib/tpl/flat/images/pagetools/06_revert.png | Bin 0 -> 462 bytes .../flat/images/pagetools/07_revisions.png | Bin 0 -> 769 bytes lib/tpl/flat/images/pagetools/08_backlink.png | Bin 0 -> 527 bytes .../flat/images/pagetools/09_subscribe.png | Bin 0 -> 374 bytes lib/tpl/flat/images/pagetools/10_top.png | Bin 0 -> 297 bytes .../flat/images/pagetools/11_mediamanager.png | Bin 0 -> 320 bytes lib/tpl/flat/images/pagetools/12_back.png | Bin 0 -> 288 bytes lib/tpl/flat/images/pagetools/license.txt | 4 + lib/tpl/flat/images/search.png | Bin 0 -> 307 bytes lib/tpl/flat/images/toc-arrows.png | Bin 0 -> 225 bytes lib/tpl/flat/images/toc-bullet.png | Bin 0 -> 113 bytes lib/tpl/flat/images/usertools.png | Bin 0 -> 1428 bytes lib/tpl/flat/lang/en/settings.php | 4 + lib/tpl/flat/lang/fr/settings.php | 4 + lib/tpl/flat/main.php | 68 + lib/tpl/flat/manager.dat | 2 + lib/tpl/flat/mediamanager.php | 44 + lib/tpl/flat/script.js | 79 + lib/tpl/flat/sidebar.php | 25 + lib/tpl/flat/style.ini | 95 + lib/tpl/flat/template.info.txt | 7 + lib/tpl/flat/tpl_content.php | 62 + lib/tpl/flat/tpl_footer.php | 39 + lib/tpl/flat/tpl_header.php | 136 + lib/tpl/index.php | 73 + lib/tpl/material/LICENSE | 197 + lib/tpl/material/README.md | 70 + lib/tpl/material/conf/default.php | 18 + lib/tpl/material/conf/metadata.php | 18 + .../bold.png | Bin 0 -> 236 bytes .../chars.png | Bin 0 -> 244 bytes .../copy these icons to toolbar folder/h.png | Bin 0 -> 102 bytes .../hequal.png | Bin 0 -> 120 bytes .../hminus.png | Bin 0 -> 151 bytes .../hplus.png | Bin 0 -> 149 bytes .../image.png | Bin 0 -> 263 bytes .../italic.png | Bin 0 -> 217 bytes .../link.png | Bin 0 -> 284 bytes .../linkextern.png | Bin 0 -> 284 bytes .../mono.png | Bin 0 -> 120 bytes .../copy these icons to toolbar folder/ol.png | Bin 0 -> 158 bytes .../smiley.png | Bin 0 -> 590 bytes .../strike.png | Bin 0 -> 332 bytes .../copy these icons to toolbar folder/ul.png | Bin 0 -> 96 bytes .../underline.png | Bin 0 -> 212 bytes lib/tpl/material/css/basic.less | 481 + lib/tpl/material/css/comp.less | 56 + lib/tpl/material/css/editor.less | 31 + lib/tpl/material/css/fixes.less | 159 + lib/tpl/material/css/links.less | 65 + lib/tpl/material/css/mobile.less | 45 + lib/tpl/material/images/favicon.ico | Bin 0 -> 99678 bytes lib/tpl/material/images/logo.svg | 1 + lib/tpl/material/lang/en/settings.php | 18 + lib/tpl/material/main.php | 235 + lib/tpl/material/manager.dat | 2 + lib/tpl/material/sidebar.php | 67 + lib/tpl/material/style.ini | 111 + lib/tpl/material/template.info.txt | 7 + lib/tpl/minima/_admin.css | 48 + lib/tpl/minima/_linkwiz.css | 68 + lib/tpl/minima/_mediaoptions.css | 92 + lib/tpl/minima/_subscription.css | 21 + lib/tpl/minima/conf/default.php | 15 + lib/tpl/minima/conf/metadata.php | 27 + lib/tpl/minima/design.css | 852 + lib/tpl/minima/detail.php | 99 + lib/tpl/minima/footer.html | 61 + lib/tpl/minima/functions.php | 207 + lib/tpl/minima/images/bullet_blue.gif | Bin 0 -> 56 bytes lib/tpl/minima/images/bullet_brown.gif | Bin 0 -> 56 bytes lib/tpl/minima/images/bullet_gray.gif | Bin 0 -> 56 bytes lib/tpl/minima/images/bullet_green.gif | Bin 0 -> 56 bytes lib/tpl/minima/images/bullet_pink.gif | Bin 0 -> 56 bytes lib/tpl/minima/images/bullet_purple.gif | Bin 0 -> 56 bytes lib/tpl/minima/images/button-cc.gif | Bin 0 -> 1231 bytes lib/tpl/minima/images/button-donate.gif | Bin 0 -> 200 bytes lib/tpl/minima/images/button-dw.png | Bin 0 -> 427 bytes lib/tpl/minima/images/button-rss.png | Bin 0 -> 280 bytes lib/tpl/minima/images/button-wikidesign.gif | Bin 0 -> 337 bytes lib/tpl/minima/images/buttonshadow.png | Bin 0 -> 2853 bytes lib/tpl/minima/images/closed_blue.gif | Bin 0 -> 57 bytes lib/tpl/minima/images/closed_brown.gif | Bin 0 -> 57 bytes lib/tpl/minima/images/closed_gray.gif | Bin 0 -> 57 bytes lib/tpl/minima/images/closed_green.gif | Bin 0 -> 57 bytes lib/tpl/minima/images/closed_pink.gif | Bin 0 -> 57 bytes lib/tpl/minima/images/closed_purple.gif | Bin 0 -> 57 bytes lib/tpl/minima/images/edgeleft_blue.gif | Bin 0 -> 121 bytes lib/tpl/minima/images/edgeleft_brown.gif | Bin 0 -> 123 bytes lib/tpl/minima/images/edgeleft_gray.gif | Bin 0 -> 122 bytes lib/tpl/minima/images/edgeleft_green.gif | Bin 0 -> 123 bytes lib/tpl/minima/images/edgeleft_pink.gif | Bin 0 -> 121 bytes lib/tpl/minima/images/edgeleft_purple.gif | Bin 0 -> 121 bytes lib/tpl/minima/images/edgeright_blue.gif | Bin 0 -> 123 bytes lib/tpl/minima/images/edgeright_brown.gif | Bin 0 -> 123 bytes lib/tpl/minima/images/edgeright_gray.gif | Bin 0 -> 123 bytes lib/tpl/minima/images/edgeright_green.gif | Bin 0 -> 123 bytes lib/tpl/minima/images/edgeright_pink.gif | Bin 0 -> 123 bytes lib/tpl/minima/images/edgeright_purple.gif | Bin 0 -> 123 bytes lib/tpl/minima/images/favicon.ico | Bin 0 -> 7406 bytes lib/tpl/minima/images/header_medium_blue.jpg | Bin 0 -> 15527 bytes lib/tpl/minima/images/header_medium_brown.jpg | Bin 0 -> 19406 bytes lib/tpl/minima/images/header_medium_gray.jpg | Bin 0 -> 13994 bytes lib/tpl/minima/images/header_medium_green.jpg | Bin 0 -> 19727 bytes lib/tpl/minima/images/header_medium_pink.jpg | Bin 0 -> 15133 bytes .../minima/images/header_medium_purple.jpg | Bin 0 -> 15217 bytes lib/tpl/minima/images/header_narrow_blue.jpg | Bin 0 -> 13309 bytes lib/tpl/minima/images/header_narrow_brown.jpg | Bin 0 -> 16630 bytes lib/tpl/minima/images/header_narrow_gray.jpg | Bin 0 -> 12001 bytes lib/tpl/minima/images/header_narrow_green.jpg | Bin 0 -> 18628 bytes lib/tpl/minima/images/header_narrow_pink.jpg | Bin 0 -> 12971 bytes .../minima/images/header_narrow_purple.jpg | Bin 0 -> 13021 bytes lib/tpl/minima/images/header_wide_blue.jpg | Bin 0 -> 19943 bytes lib/tpl/minima/images/header_wide_brown.jpg | Bin 0 -> 24397 bytes lib/tpl/minima/images/header_wide_gray.jpg | Bin 0 -> 17658 bytes lib/tpl/minima/images/header_wide_green.jpg | Bin 0 -> 24861 bytes lib/tpl/minima/images/header_wide_pink.jpg | Bin 0 -> 19302 bytes lib/tpl/minima/images/header_wide_purple.jpg | Bin 0 -> 19180 bytes lib/tpl/minima/images/inputshadow.png | Bin 0 -> 2822 bytes lib/tpl/minima/images/link_icon.gif | Bin 0 -> 172 bytes lib/tpl/minima/images/mail_icon.gif | Bin 0 -> 187 bytes lib/tpl/minima/images/open_blue.gif | Bin 0 -> 54 bytes lib/tpl/minima/images/open_brown.gif | Bin 0 -> 54 bytes lib/tpl/minima/images/open_gray.gif | Bin 0 -> 54 bytes lib/tpl/minima/images/open_green.gif | Bin 0 -> 54 bytes lib/tpl/minima/images/open_pink.gif | Bin 0 -> 54 bytes lib/tpl/minima/images/open_purple.gif | Bin 0 -> 54 bytes lib/tpl/minima/images/tocdot2_blue.gif | Bin 0 -> 43 bytes lib/tpl/minima/images/tocdot2_brown.gif | Bin 0 -> 43 bytes lib/tpl/minima/images/tocdot2_gray.gif | Bin 0 -> 43 bytes lib/tpl/minima/images/tocdot2_green.gif | Bin 0 -> 43 bytes lib/tpl/minima/images/tocdot2_pink.gif | Bin 0 -> 43 bytes lib/tpl/minima/images/tocdot2_purple.gif | Bin 0 -> 43 bytes lib/tpl/minima/images/windows.gif | Bin 0 -> 223 bytes lib/tpl/minima/lang/de/settings.php | 34 + lib/tpl/minima/lang/en/settings.php | 35 + lib/tpl/minima/lang/es/settings.php | 34 + lib/tpl/minima/layout.css | 328 + lib/tpl/minima/main.php | 155 + lib/tpl/minima/manager.dat | 2 + lib/tpl/minima/media.css | 209 + lib/tpl/minima/mediamanager.php | 50 + lib/tpl/minima/print.css | 248 + lib/tpl/minima/rtl.css | 155 + lib/tpl/minima/style.ini | 72 + lib/tpl/minima/style_blue.ini | 72 + lib/tpl/minima/style_brown.ini | 72 + lib/tpl/minima/style_gray.ini | 72 + lib/tpl/minima/style_green.ini | 72 + lib/tpl/minima/style_pink.ini | 72 + lib/tpl/minima/style_purple.ini | 72 + lib/tpl/sprintdoc/LICENSE | 339 + lib/tpl/sprintdoc/Template.php | 344 + lib/tpl/sprintdoc/conf/default.php | 11 + lib/tpl/sprintdoc/conf/metadata.php | 23 + lib/tpl/sprintdoc/css/area_content.less | 63 + lib/tpl/sprintdoc/css/area_footer.less | 129 + lib/tpl/sprintdoc/css/area_footnotes.less | 55 + lib/tpl/sprintdoc/css/area_forms.less | 302 + lib/tpl/sprintdoc/css/area_header.less | 277 + .../css/area_main-content-anchor.less | 22 + .../css/area_main-content-secedit.less | 54 + lib/tpl/sprintdoc/css/area_main-content.less | 50 + .../sprintdoc/css/area_main-sidebar-nav.less | 393 + .../css/area_main-sidebar-search.less | 241 + .../sprintdoc/css/area_main-sidebar-tabs.less | 33 + lib/tpl/sprintdoc/css/area_msg.less | 46 + .../sprintdoc/css/area_nav-breadcrumb.less | 85 + lib/tpl/sprintdoc/css/area_nav-direct.less | 49 + lib/tpl/sprintdoc/css/area_nav-metabox.less | 419 + .../css/area_nav-page-attributes.less | 54 + lib/tpl/sprintdoc/css/area_nav-pagetools.less | 193 + lib/tpl/sprintdoc/css/area_nav-usertools.less | 358 + lib/tpl/sprintdoc/css/area_recent.less | 159 + lib/tpl/sprintdoc/css/area_search.less | 9 + lib/tpl/sprintdoc/css/area_tabs.less | 37 + lib/tpl/sprintdoc/css/area_togglelink.less | 105 + lib/tpl/sprintdoc/css/base.less | 434 + lib/tpl/sprintdoc/css/base_design.less | 583 + .../sprintdoc/css/base_fontello-icons.less | 141 + lib/tpl/sprintdoc/css/base_mixins.less | 363 + lib/tpl/sprintdoc/css/base_structure.less | 288 + lib/tpl/sprintdoc/css/base_vars.less | 165 + .../sprintdoc/css/plugins/bureaucracy.less | 116 + .../sprintdoc/css/plugins/configmanager.less | 156 + lib/tpl/sprintdoc/css/plugins/data.less | 48 + lib/tpl/sprintdoc/css/plugins/do_tasks.less | 96 + lib/tpl/sprintdoc/css/plugins/edit.less | 69 + lib/tpl/sprintdoc/css/plugins/edittable.less | 44 + .../css/plugins/extension__manager.less | 18 + lib/tpl/sprintdoc/css/plugins/fastwiki.less | 7 + lib/tpl/sprintdoc/css/plugins/folded.less | 33 + .../css/plugins/highlight_parent.less | 22 + .../sprintdoc/css/plugins/magic-matcher.less | 215 + .../sprintdoc/css/plugins/mediamanager.less | 35 + lib/tpl/sprintdoc/css/plugins/move.less | 12 + .../sprintdoc/css/plugins/popupviewer.less | 26 + lib/tpl/sprintdoc/css/plugins/qc.less | 103 + .../sprintdoc/css/plugins/sitemapnavi.less | 25 + lib/tpl/sprintdoc/css/plugins/starred.less | 17 + lib/tpl/sprintdoc/css/plugins/struct.less | 196 + .../sprintdoc/css/plugins/structstatus.less | 12 + lib/tpl/sprintdoc/css/plugins/tabinclude.less | 57 + .../sprintdoc/css/plugins/tablelayout.less | 19 + lib/tpl/sprintdoc/css/plugins/tagging.less | 123 + lib/tpl/sprintdoc/css/plugins/tplinc.less | 6 + .../sprintdoc/css/plugins/translation.less | 32 + lib/tpl/sprintdoc/css/print.less | 517 + lib/tpl/sprintdoc/css/template_admin.less | 122 + lib/tpl/sprintdoc/css/template_detail.less | 165 + lib/tpl/sprintdoc/css/toollist.less | 29 + lib/tpl/sprintdoc/deleted.files | 97 + lib/tpl/sprintdoc/detail.php | 405 + lib/tpl/sprintdoc/fonts/icons/LICENSE.txt | 21 + lib/tpl/sprintdoc/fonts/icons/README.txt | 75 + lib/tpl/sprintdoc/fonts/icons/config.json | 964 + .../sprintdoc/fonts/icons/fontello-codes.css | 78 + .../icons/fontello-no-materialdesign.zip | Bin 0 -> 106074 bytes lib/tpl/sprintdoc/fonts/icons/fontello.eot | Bin 0 -> 22528 bytes lib/tpl/sprintdoc/fonts/icons/fontello.svg | 164 + lib/tpl/sprintdoc/fonts/icons/fontello.ttf | Bin 0 -> 22360 bytes lib/tpl/sprintdoc/fonts/icons/fontello.woff | Bin 0 -> 13176 bytes lib/tpl/sprintdoc/fonts/icons/fontello.woff2 | Bin 0 -> 11276 bytes lib/tpl/sprintdoc/fonts/icons/fontello.zip | Bin 0 -> 112760 bytes .../icons/svg/elusive-clipboard-default.svg | 1 + .../icons/svg/elusive-clipboard-hover.svg | 1 + .../icons/svg/elusive-doc-new-default.svg | 1 + .../fonts/icons/svg/elusive-doc-new-hover.svg | 1 + .../svg/entypo-down-open-big-default.svg | 1 + .../icons/svg/entypo-down-open-big-hover.svg | 1 + .../fonts/icons/svg/entypo-help-default.svg | 1 + .../fonts/icons/svg/entypo-help-hover.svg | 1 + .../fonts/icons/svg/entypo-search-default.svg | 1 + .../fonts/icons/svg/entypo-search-hover.svg | 1 + .../icons/svg/entypo-up-open-big-default.svg | 1 + .../icons/svg/entypo-up-open-big-hover.svg | 1 + .../fonts/icons/svg/entypo-user-default.svg | 1 + .../fonts/icons/svg/entypo-user-hover.svg | 1 + .../icons/svg/fontawesome-bell-default.svg | 1 + .../icons/svg/fontawesome-bell-hover.svg | 1 + .../fontawesome-bookmark-empty-default.svg | 1 + .../svg/fontawesome-bookmark-empty-hover.svg | 1 + .../icons/svg/fontawesome-clock-default.svg | 1 + .../icons/svg/fontawesome-clock-hover.svg | 1 + .../icons/svg/fontawesome-code-default.svg | 1 + .../icons/svg/fontawesome-code-hover.svg | 1 + .../icons/svg/fontawesome-cog-alt-default.svg | 1 + .../icons/svg/fontawesome-cog-alt-hover.svg | 1 + .../icons/svg/fontawesome-cog-default.svg | 1 + .../fonts/icons/svg/fontawesome-cog-hover.svg | 1 + .../icons/svg/fontawesome-doc-default.svg | 1 + .../fonts/icons/svg/fontawesome-doc-hover.svg | 1 + .../svg/fontawesome-doc-text-default.svg | 1 + .../icons/svg/fontawesome-doc-text-hover.svg | 1 + .../icons/svg/fontawesome-docs-default.svg | 1 + .../icons/svg/fontawesome-docs-hover.svg | 1 + .../svg/fontawesome-file-pdf-default.svg | 1 + .../icons/svg/fontawesome-file-pdf-hover.svg | 1 + .../icons/svg/fontawesome-frown-default.svg | 1 + .../icons/svg/fontawesome-frown-hover.svg | 1 + .../icons/svg/fontawesome-home-default.svg | 1 + .../icons/svg/fontawesome-home-hover.svg | 1 + .../icons/svg/fontawesome-link-default.svg | 1 + .../icons/svg/fontawesome-link-hover.svg | 1 + .../icons/svg/fontawesome-login-default.svg | 1 + .../icons/svg/fontawesome-login-hover.svg | 1 + .../icons/svg/fontawesome-logout-default.svg | 1 + .../icons/svg/fontawesome-logout-hover.svg | 1 + .../icons/svg/fontawesome-mail-default.svg | 1 + .../icons/svg/fontawesome-mail-hover.svg | 1 + .../icons/svg/fontawesome-meh-default.svg | 1 + .../fonts/icons/svg/fontawesome-meh-hover.svg | 1 + .../icons/svg/fontawesome-menu-default.svg | 1 + .../icons/svg/fontawesome-menu-hover.svg | 1 + .../icons/svg/fontawesome-plus-default.svg | 1 + .../icons/svg/fontawesome-plus-hover.svg | 1 + .../icons/svg/fontawesome-puzzle-default.svg | 1 + .../icons/svg/fontawesome-puzzle-hover.svg | 1 + .../icons/svg/fontawesome-sitemap-default.svg | 1 + .../icons/svg/fontawesome-sitemap-hover.svg | 1 + .../icons/svg/fontawesome-smile-default.svg | 1 + .../icons/svg/fontawesome-smile-hover.svg | 1 + .../icons/svg/fontelico-emo-angry-default.svg | 1 + .../icons/svg/fontelico-emo-angry-hover.svg | 1 + .../icons/svg/fontelico-emo-cry-default.svg | 1 + .../icons/svg/fontelico-emo-cry-hover.svg | 1 + .../icons/svg/fontelico-emo-grin-default.svg | 1 + .../icons/svg/fontelico-emo-grin-hover.svg | 1 + .../icons/svg/fontelico-emo-happy-default.svg | 1 + .../icons/svg/fontelico-emo-happy-hover.svg | 1 + .../icons/svg/fontelico-emo-laugh-default.svg | 1 + .../icons/svg/fontelico-emo-laugh-hover.svg | 1 + .../icons/svg/fontelico-emo-sleep-default.svg | 1 + .../icons/svg/fontelico-emo-sleep-hover.svg | 1 + .../svg/fontelico-emo-squint-default.svg | 1 + .../icons/svg/fontelico-emo-squint-hover.svg | 1 + .../svg/fontelico-emo-thumbsup-default.svg | 1 + .../svg/fontelico-emo-thumbsup-hover.svg | 1 + .../svg/fontelico-emo-unhappy-default.svg | 1 + .../icons/svg/fontelico-emo-unhappy-hover.svg | 1 + .../icons/svg/fontelico-emo-wink-default.svg | 1 + .../icons/svg/fontelico-emo-wink-hover.svg | 1 + .../icons/svg/fontelico-emo-wink2-default.svg | 1 + .../icons/svg/fontelico-emo-wink2-hover.svg | 1 + .../icons/svg/iconic-book-open-default.svg | 1 + .../icons/svg/iconic-book-open-hover.svg | 1 + .../icons/svg/linecons-cloud-default.svg | 1 + .../fonts/icons/svg/linecons-cloud-hover.svg | 1 + .../icons/svg/linecons-pencil-default.svg | 1 + .../fonts/icons/svg/linecons-pencil-hover.svg | 1 + .../icons/svg/modernpics-pencil-default.svg | 1 + .../icons/svg/modernpics-pencil-hover.svg | 1 + .../icons/svg/typicons-cloud-default.svg | 1 + .../fonts/icons/svg/typicons-cloud-hover.svg | 1 + .../svg/typicons-down-outline-default.svg | 1 + .../icons/svg/typicons-down-outline-hover.svg | 1 + .../icons/svg/typicons-down-small-default.svg | 1 + .../icons/svg/typicons-down-small-hover.svg | 1 + .../svg/typicons-home-outline-default.svg | 1 + .../icons/svg/typicons-home-outline-hover.svg | 1 + .../svg/typicons-left-outline-default.svg | 1 + .../icons/svg/typicons-left-outline-hover.svg | 1 + .../icons/svg/typicons-left-small-default.svg | 1 + .../icons/svg/typicons-left-small-hover.svg | 1 + .../icons/svg/typicons-puzzle-default.svg | 1 + .../fonts/icons/svg/typicons-puzzle-hover.svg | 1 + .../svg/typicons-right-outline-default.svg | 1 + .../svg/typicons-right-outline-hover.svg | 1 + .../svg/typicons-right-small-default.svg | 1 + .../icons/svg/typicons-right-small-hover.svg | 1 + .../icons/svg/typicons-up-outline-default.svg | 1 + .../icons/svg/typicons-up-outline-hover.svg | 1 + .../icons/svg/typicons-up-small-default.svg | 1 + .../icons/svg/typicons-up-small-hover.svg | 1 + .../images/fav/android-chrome-192x192.png | Bin 0 -> 7037 bytes .../images/fav/apple-touch-icon-114x114.png | Bin 0 -> 4816 bytes .../images/fav/apple-touch-icon-120x120.png | Bin 0 -> 4500 bytes .../images/fav/apple-touch-icon-144x144.png | Bin 0 -> 5833 bytes .../images/fav/apple-touch-icon-152x152.png | Bin 0 -> 7142 bytes .../images/fav/apple-touch-icon-180x180.png | Bin 0 -> 8798 bytes .../images/fav/apple-touch-icon-57x57.png | Bin 0 -> 1756 bytes .../images/fav/apple-touch-icon-60x60.png | Bin 0 -> 1804 bytes .../images/fav/apple-touch-icon-72x72.png | Bin 0 -> 2149 bytes .../images/fav/apple-touch-icon-76x76.png | Bin 0 -> 2677 bytes .../sprintdoc/images/fav/favicon-32x32.png | Bin 0 -> 1320 bytes .../sprintdoc/images/fav/favicon-96x96.png | Bin 0 -> 2924 bytes lib/tpl/sprintdoc/images/fav/largetile.png | Bin 0 -> 22688 bytes lib/tpl/sprintdoc/images/fav/mediumtile.png | Bin 0 -> 7157 bytes lib/tpl/sprintdoc/images/fav/smalltile.png | Bin 0 -> 2286 bytes lib/tpl/sprintdoc/images/fav/widetile.png | Bin 0 -> 12976 bytes lib/tpl/sprintdoc/images/favicon.ico | Bin 0 -> 620 bytes lib/tpl/sprintdoc/images/pagetools-sprite.png | Bin 0 -> 7759 bytes ...-default_checkbox-blank-circle-outline.svg | 1 + .../sprintdoc/images/tools/01-edit_pencil.svg | 1 + .../images/tools/02-create_pencil.svg | 1 + .../images/tools/03-draft_android-studio.svg | 1 + .../images/tools/04-show_file-document.svg | 1 + .../images/tools/05-source_file-xml.svg | 1 + .../images/tools/06-revert_replay.svg | 1 + .../images/tools/07-revisions_history.svg | 1 + .../images/tools/08-backlink_link-variant.svg | 1 + .../tools/09-subscribe_email-outline.svg | 1 + .../images/tools/10-top_arrow-up.svg | 1 + .../tools/11-mediamanager_folder-image.svg | 1 + .../images/tools/12-back_arrow-left.svg | 1 + .../sprintdoc/images/tools/40-pdf-file.svg | 3 + .../images/tools/41-format-paint.svg | 3 + .../images/tools/43-file-delimeted.svg | 3 + lib/tpl/sprintdoc/img/account-settings.svg | 1 + lib/tpl/sprintdoc/img/apple-safari.svg | 1 + lib/tpl/sprintdoc/img/down.svg | 1 + lib/tpl/sprintdoc/img/file-export.svg | 1 + lib/tpl/sprintdoc/img/menu.svg | 1 + lib/tpl/sprintdoc/img/pencil.svg | 1 + lib/tpl/sprintdoc/img/sitemap.svg | 1 + lib/tpl/sprintdoc/img/star-circle.svg | 1 + lib/tpl/sprintdoc/img/up.svg | 1 + lib/tpl/sprintdoc/js/anchor.js | 13 + lib/tpl/sprintdoc/js/base/rem.min.js | 7 + lib/tpl/sprintdoc/js/base/spc.js | 259 + lib/tpl/sprintdoc/js/base/velocity.min.js | 4 + lib/tpl/sprintdoc/js/direct.js | 130 + lib/tpl/sprintdoc/js/legacy/html5shiv.js | 8 + lib/tpl/sprintdoc/js/legacy/respond.min.js | 5 + lib/tpl/sprintdoc/js/meta-box.js | 91 + lib/tpl/sprintdoc/js/plugins/bookcreator.js | 26 + lib/tpl/sprintdoc/js/plugins/do_tasks.js | 49 + lib/tpl/sprintdoc/js/plugins/folded.js | 27 + lib/tpl/sprintdoc/js/plugins/qc.js | 40 + lib/tpl/sprintdoc/js/sidebar.js | 335 + lib/tpl/sprintdoc/lang/cs/lang.php | 104 + lib/tpl/sprintdoc/lang/cs/settings.php | 16 + lib/tpl/sprintdoc/lang/cs/style.txt | 1 + lib/tpl/sprintdoc/lang/de/lang.php | 105 + lib/tpl/sprintdoc/lang/de/settings.php | 18 + lib/tpl/sprintdoc/lang/en/lang.php | 104 + lib/tpl/sprintdoc/lang/en/settings.php | 20 + lib/tpl/sprintdoc/lang/en/style.txt | 1 + lib/tpl/sprintdoc/lang/es/lang.php | 104 + lib/tpl/sprintdoc/lang/es/settings.php | 16 + lib/tpl/sprintdoc/lang/es/style.txt | 1 + lib/tpl/sprintdoc/lang/fr/lang.php | 63 + lib/tpl/sprintdoc/lang/fr/settings.php | 17 + lib/tpl/sprintdoc/lang/fr/style.txt | 1 + lib/tpl/sprintdoc/lang/it/lang.php | 104 + lib/tpl/sprintdoc/lang/it/settings.php | 17 + lib/tpl/sprintdoc/lang/it/style.txt | 1 + lib/tpl/sprintdoc/lang/nl/lang.php | 50 + lib/tpl/sprintdoc/lang/nl/settings.php | 8 + lib/tpl/sprintdoc/lang/nl/style.txt | 1 + lib/tpl/sprintdoc/lang/ru/lang.php | 75 + lib/tpl/sprintdoc/lang/ru/settings.php | 17 + lib/tpl/sprintdoc/lang/ru/style.txt | 1 + lib/tpl/sprintdoc/lang/zh-tw/lang.php | 13 + lib/tpl/sprintdoc/lang/zh-tw/settings.php | 10 + lib/tpl/sprintdoc/lang/zh-tw/style.txt | 1 + lib/tpl/sprintdoc/main.php | 444 + lib/tpl/sprintdoc/manager.dat | 2 + lib/tpl/sprintdoc/mediamanager.php | 86 + lib/tpl/sprintdoc/script.js | 14 + lib/tpl/sprintdoc/style.ini | 206 + lib/tpl/sprintdoc/svg.php | 346 + lib/tpl/sprintdoc/template.info.txt | 7 + lib/tpl/sprintdoc/tpl.php | 186 + lib/tpl/sprintdoc/tpl/favicon_tiles.php | 73 + lib/tpl/sprintdoc/tpl/main-footer.php | 25 + lib/tpl/sprintdoc/tpl/main-sidebar-logo.php | 7 + lib/tpl/sprintdoc/tpl/main-sidebar-nav.php | 110 + lib/tpl/sprintdoc/tpl/main-sidebar-search.php | 6 + lib/tpl/sprintdoc/tpl/nav-breadcrumb.php | 13 + lib/tpl/sprintdoc/tpl/nav-direct.php | 26 + lib/tpl/sprintdoc/tpl/nav-magicmatcher.php | 14 + lib/tpl/sprintdoc/tpl/nav-meta-box.php | 43 + lib/tpl/sprintdoc/tpl/nav-page-attributes.php | 65 + lib/tpl/sprintdoc/tpl/nav-page-tools.php | 27 + lib/tpl/sprintdoc/tpl/nav-status.php | 6 + .../sprintdoc/tpl/nav-usertools-buttons.php | 59 + lib/tpl/vector/.htaccess | 14 + lib/tpl/vector/CREDITS | 101 + lib/tpl/vector/conf/.htaccess | 7 + lib/tpl/vector/conf/boxes.php | 263 + lib/tpl/vector/conf/buttons.php | 94 + lib/tpl/vector/conf/default.php | 85 + lib/tpl/vector/conf/index.html | 9 + lib/tpl/vector/conf/metadata.php | 85 + lib/tpl/vector/conf/tabs.php | 176 + lib/tpl/vector/detail.php | 31 + lib/tpl/vector/inc_cite.php | 180 + lib/tpl/vector/inc_detail.php | 98 + lib/tpl/vector/index.html | 9 + lib/tpl/vector/lang/.htaccess | 7 + lib/tpl/vector/lang/ca/.htaccess | 7 + lib/tpl/vector/lang/ca/index.html | 9 + lib/tpl/vector/lang/ca/lang.php | 110 + lib/tpl/vector/lang/ca/settings.php | 84 + lib/tpl/vector/lang/ca/style.css | 0 lib/tpl/vector/lang/cs/.htaccess | 7 + lib/tpl/vector/lang/cs/index.html | 9 + lib/tpl/vector/lang/cs/lang.php | 105 + lib/tpl/vector/lang/cs/settings.php | 79 + lib/tpl/vector/lang/cs/style.css | 0 lib/tpl/vector/lang/de-informal/.htaccess | 7 + lib/tpl/vector/lang/de-informal/index.html | 9 + lib/tpl/vector/lang/de-informal/lang.php | 111 + lib/tpl/vector/lang/de-informal/settings.php | 84 + lib/tpl/vector/lang/de-informal/style.css | 0 lib/tpl/vector/lang/de/.htaccess | 7 + lib/tpl/vector/lang/de/index.html | 9 + lib/tpl/vector/lang/de/lang.php | 111 + lib/tpl/vector/lang/de/settings.php | 84 + lib/tpl/vector/lang/de/style.css | 0 lib/tpl/vector/lang/en/.htaccess | 7 + lib/tpl/vector/lang/en/index.html | 9 + lib/tpl/vector/lang/en/lang.php | 111 + lib/tpl/vector/lang/en/settings.php | 84 + lib/tpl/vector/lang/en/style.css | 0 lib/tpl/vector/lang/es/.htaccess | 7 + lib/tpl/vector/lang/es/index.html | 9 + lib/tpl/vector/lang/es/lang.php | 105 + lib/tpl/vector/lang/es/settings.php | 78 + lib/tpl/vector/lang/es/style.css | 0 lib/tpl/vector/lang/eu/.htaccess | 7 + lib/tpl/vector/lang/eu/index.html | 9 + lib/tpl/vector/lang/eu/lang.php | 104 + lib/tpl/vector/lang/eu/settings.php | 78 + lib/tpl/vector/lang/eu/style.css | 0 lib/tpl/vector/lang/fa/.htaccess | 7 + lib/tpl/vector/lang/fa/index.html | 9 + lib/tpl/vector/lang/fa/lang.php | 104 + lib/tpl/vector/lang/fa/settings.php | 78 + lib/tpl/vector/lang/fa/style.css | 0 lib/tpl/vector/lang/fr/.htaccess | 7 + lib/tpl/vector/lang/fr/index.html | 9 + lib/tpl/vector/lang/fr/lang.php | 105 + lib/tpl/vector/lang/fr/settings.php | 78 + lib/tpl/vector/lang/fr/style.css | 0 lib/tpl/vector/lang/he/.htaccess | 7 + lib/tpl/vector/lang/he/index.html | 9 + lib/tpl/vector/lang/he/lang.php | 110 + lib/tpl/vector/lang/he/style.css | 0 lib/tpl/vector/lang/index.html | 9 + lib/tpl/vector/lang/it/.htaccess | 7 + lib/tpl/vector/lang/it/index.html | 9 + lib/tpl/vector/lang/it/lang.php | 103 + lib/tpl/vector/lang/it/settings.php | 81 + lib/tpl/vector/lang/it/style.css | 0 lib/tpl/vector/lang/ja/.htaccess | 7 + lib/tpl/vector/lang/ja/index.html | 9 + lib/tpl/vector/lang/ja/lang.php | 111 + lib/tpl/vector/lang/ja/settings.php | 84 + lib/tpl/vector/lang/ja/style.css | 0 lib/tpl/vector/lang/ko/.htaccess | 7 + lib/tpl/vector/lang/ko/index.html | 9 + lib/tpl/vector/lang/ko/lang.php | 112 + lib/tpl/vector/lang/ko/settings.php | 84 + lib/tpl/vector/lang/ko/style.css | 0 lib/tpl/vector/lang/nl/.htaccess | 7 + lib/tpl/vector/lang/nl/index.html | 9 + lib/tpl/vector/lang/nl/lang.php | 106 + lib/tpl/vector/lang/nl/settings.php | 73 + lib/tpl/vector/lang/nl/style.css | 0 lib/tpl/vector/lang/pt-br/.htaccess | 7 + lib/tpl/vector/lang/pt-br/index.html | 9 + lib/tpl/vector/lang/pt-br/lang.php | 104 + lib/tpl/vector/lang/pt-br/settings.php | 72 + lib/tpl/vector/lang/pt-br/style.css | 0 lib/tpl/vector/lang/ru/.htaccess | 7 + lib/tpl/vector/lang/ru/index.html | 9 + lib/tpl/vector/lang/ru/lang.php | 106 + lib/tpl/vector/lang/ru/settings.php | 79 + lib/tpl/vector/lang/ru/style.css | 0 lib/tpl/vector/lang/sk/.htaccess | 7 + lib/tpl/vector/lang/sk/index.html | 9 + lib/tpl/vector/lang/sk/lang.php | 105 + lib/tpl/vector/lang/sk/settings.php | 79 + lib/tpl/vector/lang/sk/style.css | 0 lib/tpl/vector/lang/zh/.htaccess | 7 + lib/tpl/vector/lang/zh/index.html | 9 + lib/tpl/vector/lang/zh/lang.php | 105 + lib/tpl/vector/lang/zh/settings.php | 78 + lib/tpl/vector/lang/zh/style.css | 0 lib/tpl/vector/main.php | 864 + lib/tpl/vector/manager.dat | 2 + lib/tpl/vector/mediamanager.php | 97 + .../3rd/dokuwiki/00_starter-tmpl-notes.txt | 19 + lib/tpl/vector/static/3rd/dokuwiki/_admin.css | 59 + lib/tpl/vector/static/3rd/dokuwiki/_diff.css | 65 + lib/tpl/vector/static/3rd/dokuwiki/_edit.css | 153 + .../static/3rd/dokuwiki/_fileuploader.css | 116 + .../vector/static/3rd/dokuwiki/_footnotes.css | 28 + lib/tpl/vector/static/3rd/dokuwiki/_forms.css | 92 + .../vector/static/3rd/dokuwiki/_imgdetail.css | 38 + lib/tpl/vector/static/3rd/dokuwiki/_links.css | 86 + .../static/3rd/dokuwiki/_media_fullscreen.css | 517 + .../static/3rd/dokuwiki/_media_popup.css | 257 + lib/tpl/vector/static/3rd/dokuwiki/_modal.css | 101 + .../vector/static/3rd/dokuwiki/_recent.css | 88 + .../vector/static/3rd/dokuwiki/_search.css | 114 + lib/tpl/vector/static/3rd/dokuwiki/_tabs.css | 82 + lib/tpl/vector/static/3rd/dokuwiki/_toc.css | 132 + .../static/3rd/dokuwiki/apple-touch-icon.png | Bin 0 -> 17728 bytes lib/tpl/vector/static/3rd/dokuwiki/bullet.png | Bin 0 -> 169 bytes .../static/3rd/dokuwiki/buttonshadow.png | Bin 0 -> 257 bytes .../vector/static/3rd/dokuwiki/closed-rtl.png | Bin 0 -> 170 bytes lib/tpl/vector/static/3rd/dokuwiki/closed.gif | Bin 0 -> 54 bytes lib/tpl/vector/static/3rd/dokuwiki/closed.png | Bin 0 -> 178 bytes lib/tpl/vector/static/3rd/dokuwiki/email.png | Bin 0 -> 659 bytes .../static/3rd/dokuwiki/external-link.png | Bin 0 -> 816 bytes .../vector/static/3rd/dokuwiki/favicon.ico | Bin 0 -> 7406 bytes lib/tpl/vector/static/3rd/dokuwiki/index.html | 9 + .../static/3rd/dokuwiki/inputshadow.png | Bin 0 -> 155 bytes lib/tpl/vector/static/3rd/dokuwiki/logo.png | Bin 0 -> 24702 bytes .../static/3rd/dokuwiki/logo.png-readme.txt | 6 + lib/tpl/vector/static/3rd/dokuwiki/open.gif | Bin 0 -> 54 bytes lib/tpl/vector/static/3rd/dokuwiki/open.png | Bin 0 -> 175 bytes lib/tpl/vector/static/3rd/dokuwiki/print.css | 174 + .../vector/static/3rd/dokuwiki/resizecol.png | Bin 0 -> 225 bytes .../vector/static/3rd/dokuwiki/tocdot2.gif | Bin 0 -> 810 bytes lib/tpl/vector/static/3rd/dokuwiki/unc.png | Bin 0 -> 553 bytes lib/tpl/vector/static/3rd/index.html | 9 + .../static/3rd/vector/arrow-down-icon.png | Bin 0 -> 188 bytes .../vector/static/3rd/vector/audio-icon.png | Bin 0 -> 247 bytes lib/tpl/vector/static/3rd/vector/border.png | Bin 0 -> 119 bytes .../vector/static/3rd/vector/bullet-icon.png | Bin 0 -> 152 bytes lib/tpl/vector/static/3rd/vector/csshover.htc | 262 + .../static/3rd/vector/document-icon.png | Bin 0 -> 233 bytes .../vector/static/3rd/vector/edit-icon.png | Bin 0 -> 358 bytes .../3rd/vector/external-link-ltr-icon.png | Bin 0 -> 279 bytes .../3rd/vector/external-link-rtl-icon.png | Bin 0 -> 277 bytes .../vector/static/3rd/vector/file-icon.png | Bin 0 -> 243 bytes lib/tpl/vector/static/3rd/vector/index.html | 9 + .../vector/static/3rd/vector/link-icon.png | Bin 0 -> 488 bytes .../vector/static/3rd/vector/lock-icon.png | Bin 0 -> 248 bytes .../vector/static/3rd/vector/magnify-clip.png | Bin 0 -> 204 bytes .../vector/static/3rd/vector/mail-icon.png | Bin 0 -> 254 bytes lib/tpl/vector/static/3rd/vector/main-ltr.css | 1136 + lib/tpl/vector/static/3rd/vector/main-rtl.css | 1136 + .../vector/static/3rd/vector/news-icon.png | Bin 0 -> 249 bytes .../vector/static/3rd/vector/page-base.png | Bin 0 -> 119 bytes .../vector/static/3rd/vector/page-fade.png | Bin 0 -> 253 bytes .../static/3rd/vector/portal-break-ltr.png | Bin 0 -> 287 bytes .../static/3rd/vector/portal-break-rtl.png | Bin 0 -> 280 bytes .../vector/static/3rd/vector/portal-break.png | Bin 0 -> 242 bytes .../static/3rd/vector/preferences-base.png | Bin 0 -> 119 bytes .../static/3rd/vector/preferences-break.png | Bin 0 -> 286 bytes .../static/3rd/vector/preferences-edge.png | Bin 0 -> 119 bytes .../static/3rd/vector/preferences-fade.png | Bin 0 -> 248 bytes .../vector/static/3rd/vector/search-fade.png | Bin 0 -> 185 bytes .../vector/static/3rd/vector/search-ltr.png | Bin 0 -> 214 bytes .../vector/static/3rd/vector/search-rtl.png | Bin 0 -> 214 bytes .../vector/static/3rd/vector/tab-break.png | Bin 0 -> 263 bytes .../static/3rd/vector/tab-current-fade.png | Bin 0 -> 121 bytes .../static/3rd/vector/tab-normal-fade.png | Bin 0 -> 254 bytes .../vector/static/3rd/vector/talk-icon.png | Bin 0 -> 249 bytes .../vector/static/3rd/vector/user-icon.png | Bin 0 -> 345 bytes .../vector/static/3rd/vector/video-icon.png | Bin 0 -> 264 bytes .../static/3rd/vector/watch-icon-loading.gif | Bin 0 -> 840 bytes .../vector/static/3rd/vector/watch-icons.png | Bin 0 -> 1745 bytes lib/tpl/vector/static/css/index.html | 9 + lib/tpl/vector/static/css/print.css | 138 + lib/tpl/vector/static/css/rtl.css | 15 + lib/tpl/vector/static/css/screen.css | 1336 + lib/tpl/vector/static/css/screen_iehacks.css | 65 + lib/tpl/vector/static/img/button-css.png | Bin 0 -> 299 bytes lib/tpl/vector/static/img/button-donate.gif | Bin 0 -> 187 bytes lib/tpl/vector/static/img/button-dw.png | Bin 0 -> 427 bytes lib/tpl/vector/static/img/button-rss.png | Bin 0 -> 280 bytes lib/tpl/vector/static/img/button-vector.png | Bin 0 -> 248 bytes lib/tpl/vector/static/img/button-xhtml.png | Bin 0 -> 321 bytes lib/tpl/vector/static/img/index.html | 9 + lib/tpl/vector/static/index.html | 9 + lib/tpl/vector/static/js/index.html | 9 + lib/tpl/vector/style.ini | 108 + lib/tpl/vector/template.info.txt | 7 + lib/tpl/vector/user/.htaccess | 10 + lib/tpl/vector/user/boxes.php.dist | 69 + lib/tpl/vector/user/buttons.php.dist | 68 + lib/tpl/vector/user/index.html | 9 + lib/tpl/vector/user/print.css.dist | 9 + lib/tpl/vector/user/rtl.css.dist | 9 + lib/tpl/vector/user/screen.css.dist | 9 + lib/tpl/vector/user/tabs.php.dist | 156 + lib/tpl/vector/user/tracker.php.dist | 38 + lib/tpl/vector/user/user.js.dist | 18 + 7749 files changed, 478270 insertions(+) create mode 100644 .gitignore create mode 100644 .htaccess create mode 100644 bin/.htaccess create mode 100755 bin/dwpage.php create mode 100755 bin/gittool.php create mode 100755 bin/indexer.php create mode 100755 bin/plugin.php create mode 100755 bin/render.php create mode 100755 bin/striplangs.php create mode 100755 bin/wantedpages.php create mode 100644 conf/.htaccess create mode 100644 conf/acl.auth.php create mode 100644 conf/acl.auth.php.dist create mode 100644 conf/acronyms.conf create mode 100644 conf/dokuwiki.php create mode 100644 conf/entities.conf create mode 100644 conf/interwiki.conf create mode 100644 conf/license.php create mode 100644 conf/local.php.bak.php create mode 100644 conf/local.php.dist create mode 100644 conf/manifest.json create mode 100644 conf/mediameta.php create mode 100644 conf/mime.conf create mode 100644 conf/mysql.conf.php.example create mode 100644 conf/plugins.local.php create mode 100644 conf/plugins.php create mode 100644 conf/plugins.required.php create mode 100644 conf/scheme.conf create mode 100644 conf/smileys.conf create mode 100644 conf/users.auth.php.dist create mode 100644 conf/wordblock.conf create mode 100644 doku.php create mode 100644 feed.php create mode 100644 inc/.htaccess create mode 100644 inc/Action/AbstractAclAction.php create mode 100644 inc/Action/AbstractAction.php create mode 100644 inc/Action/AbstractAliasAction.php create mode 100644 inc/Action/AbstractUserAction.php create mode 100644 inc/Action/Admin.php create mode 100644 inc/Action/Authtoken.php create mode 100644 inc/Action/Backlink.php create mode 100644 inc/Action/Cancel.php create mode 100644 inc/Action/Check.php create mode 100644 inc/Action/Conflict.php create mode 100644 inc/Action/Denied.php create mode 100644 inc/Action/Diff.php create mode 100644 inc/Action/Draft.php create mode 100644 inc/Action/Draftdel.php create mode 100644 inc/Action/Edit.php create mode 100644 inc/Action/Exception/ActionAbort.php create mode 100644 inc/Action/Exception/ActionAclRequiredException.php create mode 100644 inc/Action/Exception/ActionDisabledException.php create mode 100644 inc/Action/Exception/ActionException.php create mode 100644 inc/Action/Exception/ActionUserRequiredException.php create mode 100644 inc/Action/Exception/FatalException.php create mode 100644 inc/Action/Exception/NoActionException.php create mode 100644 inc/Action/Export.php create mode 100644 inc/Action/Index.php create mode 100644 inc/Action/Locked.php create mode 100644 inc/Action/Login.php create mode 100644 inc/Action/Logout.php create mode 100644 inc/Action/Media.php create mode 100644 inc/Action/Plugin.php create mode 100644 inc/Action/Preview.php create mode 100644 inc/Action/Profile.php create mode 100644 inc/Action/ProfileDelete.php create mode 100644 inc/Action/Recent.php create mode 100644 inc/Action/Recover.php create mode 100644 inc/Action/Redirect.php create mode 100644 inc/Action/Register.php create mode 100644 inc/Action/Resendpwd.php create mode 100644 inc/Action/Revert.php create mode 100644 inc/Action/Revisions.php create mode 100644 inc/Action/Save.php create mode 100644 inc/Action/Search.php create mode 100644 inc/Action/Show.php create mode 100644 inc/Action/Sitemap.php create mode 100644 inc/Action/Source.php create mode 100644 inc/Action/Subscribe.php create mode 100644 inc/ActionRouter.php create mode 100644 inc/Ajax.php create mode 100644 inc/Cache/Cache.php create mode 100644 inc/Cache/CacheImageMod.php create mode 100644 inc/Cache/CacheInstructions.php create mode 100644 inc/Cache/CacheParser.php create mode 100644 inc/Cache/CacheRenderer.php create mode 100644 inc/ChangeLog/ChangeLog.php create mode 100644 inc/ChangeLog/ChangeLogTrait.php create mode 100644 inc/ChangeLog/MediaChangeLog.php create mode 100644 inc/ChangeLog/PageChangeLog.php create mode 100644 inc/ChangeLog/RevisionInfo.php create mode 100644 inc/Debug/DebugHelper.php create mode 100644 inc/Debug/PropertyDeprecationHelper.php create mode 100644 inc/DifferenceEngine.php create mode 100644 inc/Draft.php create mode 100644 inc/ErrorHandler.php create mode 100644 inc/Exception/FatalException.php create mode 100644 inc/Extension/ActionPlugin.php create mode 100644 inc/Extension/AdminPlugin.php create mode 100644 inc/Extension/AuthPlugin.php create mode 100644 inc/Extension/CLIPlugin.php create mode 100644 inc/Extension/Event.php create mode 100644 inc/Extension/EventHandler.php create mode 100644 inc/Extension/Plugin.php create mode 100644 inc/Extension/PluginController.php create mode 100644 inc/Extension/PluginInterface.php create mode 100644 inc/Extension/PluginTrait.php create mode 100644 inc/Extension/RemotePlugin.php create mode 100644 inc/Extension/SyntaxPlugin.php create mode 100644 inc/Feed/FeedCreator.php create mode 100644 inc/Feed/FeedCreatorOptions.php create mode 100644 inc/Feed/FeedItemProcessor.php create mode 100644 inc/Feed/FeedMediaProcessor.php create mode 100644 inc/Feed/FeedPageProcessor.php create mode 100644 inc/FeedParser.php create mode 100644 inc/FeedParserFile.php create mode 100644 inc/File/MediaFile.php create mode 100644 inc/File/MediaResolver.php create mode 100644 inc/File/PageFile.php create mode 100644 inc/File/PageResolver.php create mode 100644 inc/File/Resolver.php create mode 100644 inc/Form/ButtonElement.php create mode 100644 inc/Form/CheckableElement.php create mode 100644 inc/Form/DropdownElement.php create mode 100644 inc/Form/Element.php create mode 100644 inc/Form/FieldsetCloseElement.php create mode 100644 inc/Form/FieldsetOpenElement.php create mode 100644 inc/Form/Form.php create mode 100644 inc/Form/HTMLElement.php create mode 100644 inc/Form/InputElement.php create mode 100644 inc/Form/LabelElement.php create mode 100644 inc/Form/LegacyForm.php create mode 100644 inc/Form/OptGroup.php create mode 100644 inc/Form/TagCloseElement.php create mode 100644 inc/Form/TagElement.php create mode 100644 inc/Form/TagOpenElement.php create mode 100644 inc/Form/TextareaElement.php create mode 100644 inc/Form/ValueElement.php create mode 100644 inc/HTTP/DokuHTTPClient.php create mode 100644 inc/HTTP/HTTPClient.php create mode 100644 inc/HTTP/HTTPClientException.php create mode 100644 inc/HTTP/Headers.php create mode 100644 inc/Info.php create mode 100644 inc/Input/Get.php create mode 100644 inc/Input/Input.php create mode 100644 inc/Input/Post.php create mode 100644 inc/Input/Server.php create mode 100644 inc/JWT.php create mode 100644 inc/JpegMeta.php create mode 100644 inc/Logger.php create mode 100644 inc/Mailer.class.php create mode 100644 inc/Manifest.php create mode 100644 inc/Menu/AbstractMenu.php create mode 100644 inc/Menu/DetailMenu.php create mode 100644 inc/Menu/Item/AbstractItem.php create mode 100644 inc/Menu/Item/Admin.php create mode 100644 inc/Menu/Item/Back.php create mode 100644 inc/Menu/Item/Backlink.php create mode 100644 inc/Menu/Item/Edit.php create mode 100644 inc/Menu/Item/ImgBackto.php create mode 100644 inc/Menu/Item/Index.php create mode 100644 inc/Menu/Item/Login.php create mode 100644 inc/Menu/Item/Media.php create mode 100644 inc/Menu/Item/MediaManager.php create mode 100644 inc/Menu/Item/Profile.php create mode 100644 inc/Menu/Item/Recent.php create mode 100644 inc/Menu/Item/Register.php create mode 100644 inc/Menu/Item/Resendpwd.php create mode 100644 inc/Menu/Item/Revert.php create mode 100644 inc/Menu/Item/Revisions.php create mode 100644 inc/Menu/Item/Subscribe.php create mode 100644 inc/Menu/Item/Top.php create mode 100644 inc/Menu/MenuInterface.php create mode 100644 inc/Menu/MobileMenu.php create mode 100644 inc/Menu/PageMenu.php create mode 100644 inc/Menu/SiteMenu.php create mode 100644 inc/Menu/UserMenu.php create mode 100644 inc/Parsing/Handler/AbstractRewriter.php create mode 100644 inc/Parsing/Handler/Block.php create mode 100644 inc/Parsing/Handler/CallWriter.php create mode 100644 inc/Parsing/Handler/CallWriterInterface.php create mode 100644 inc/Parsing/Handler/Lists.php create mode 100644 inc/Parsing/Handler/Nest.php create mode 100644 inc/Parsing/Handler/Preformatted.php create mode 100644 inc/Parsing/Handler/Quote.php create mode 100644 inc/Parsing/Handler/ReWriterInterface.php create mode 100644 inc/Parsing/Handler/Table.php create mode 100644 inc/Parsing/Lexer/Lexer.php create mode 100644 inc/Parsing/Lexer/ParallelRegex.php create mode 100644 inc/Parsing/Lexer/StateStack.php create mode 100644 inc/Parsing/Parser.php create mode 100644 inc/Parsing/ParserMode/AbstractMode.php create mode 100644 inc/Parsing/ParserMode/Acronym.php create mode 100644 inc/Parsing/ParserMode/Base.php create mode 100644 inc/Parsing/ParserMode/Camelcaselink.php create mode 100644 inc/Parsing/ParserMode/Code.php create mode 100644 inc/Parsing/ParserMode/Emaillink.php create mode 100644 inc/Parsing/ParserMode/Entity.php create mode 100644 inc/Parsing/ParserMode/Eol.php create mode 100644 inc/Parsing/ParserMode/Externallink.php create mode 100644 inc/Parsing/ParserMode/File.php create mode 100644 inc/Parsing/ParserMode/Filelink.php create mode 100644 inc/Parsing/ParserMode/Footnote.php create mode 100644 inc/Parsing/ParserMode/Formatting.php create mode 100644 inc/Parsing/ParserMode/Header.php create mode 100644 inc/Parsing/ParserMode/Hr.php create mode 100644 inc/Parsing/ParserMode/Internallink.php create mode 100644 inc/Parsing/ParserMode/Linebreak.php create mode 100644 inc/Parsing/ParserMode/Listblock.php create mode 100644 inc/Parsing/ParserMode/Media.php create mode 100644 inc/Parsing/ParserMode/ModeInterface.php create mode 100644 inc/Parsing/ParserMode/Multiplyentity.php create mode 100644 inc/Parsing/ParserMode/Nocache.php create mode 100644 inc/Parsing/ParserMode/Notoc.php create mode 100644 inc/Parsing/ParserMode/Plugin.php create mode 100644 inc/Parsing/ParserMode/Preformatted.php create mode 100644 inc/Parsing/ParserMode/Quote.php create mode 100644 inc/Parsing/ParserMode/Quotes.php create mode 100644 inc/Parsing/ParserMode/Rss.php create mode 100644 inc/Parsing/ParserMode/Smiley.php create mode 100644 inc/Parsing/ParserMode/Table.php create mode 100644 inc/Parsing/ParserMode/Unformatted.php create mode 100644 inc/Parsing/ParserMode/Windowssharelink.php create mode 100644 inc/Parsing/ParserMode/Wordblock.php create mode 100644 inc/PassHash.php create mode 100644 inc/Remote/AccessDeniedException.php create mode 100644 inc/Remote/Api.php create mode 100644 inc/Remote/ApiCall.php create mode 100644 inc/Remote/ApiCore.php create mode 100644 inc/Remote/IXR/Client.php create mode 100644 inc/Remote/JsonRpcServer.php create mode 100644 inc/Remote/LegacyApiCore.php create mode 100644 inc/Remote/OpenApiDoc/ClassResolver.php create mode 100644 inc/Remote/OpenApiDoc/DocBlock.php create mode 100644 inc/Remote/OpenApiDoc/DocBlockClass.php create mode 100644 inc/Remote/OpenApiDoc/DocBlockMethod.php create mode 100644 inc/Remote/OpenApiDoc/DocBlockProperty.php create mode 100644 inc/Remote/OpenApiDoc/OpenAPIGenerator.php create mode 100644 inc/Remote/OpenApiDoc/Type.php create mode 100644 inc/Remote/RemoteException.php create mode 100644 inc/Remote/Response/ApiResponse.php create mode 100644 inc/Remote/Response/Link.php create mode 100644 inc/Remote/Response/Media.php create mode 100644 inc/Remote/Response/MediaChange.php create mode 100644 inc/Remote/Response/Page.php create mode 100644 inc/Remote/Response/PageChange.php create mode 100644 inc/Remote/Response/PageHit.php create mode 100644 inc/Remote/Response/User.php create mode 100644 inc/Remote/XmlRpcServer.php create mode 100644 inc/SafeFN.class.php create mode 100644 inc/Search/Indexer.php create mode 100644 inc/Sitemap/Item.php create mode 100644 inc/Sitemap/Mapper.php create mode 100644 inc/StyleUtils.php create mode 100644 inc/Subscriptions/BulkSubscriptionSender.php create mode 100644 inc/Subscriptions/MediaSubscriptionSender.php create mode 100644 inc/Subscriptions/PageSubscriptionSender.php create mode 100644 inc/Subscriptions/RegistrationSubscriptionSender.php create mode 100644 inc/Subscriptions/SubscriberManager.php create mode 100644 inc/Subscriptions/SubscriberRegexBuilder.php create mode 100644 inc/Subscriptions/SubscriptionSender.php create mode 100644 inc/TaskRunner.php create mode 100644 inc/Ui/Admin.php create mode 100644 inc/Ui/Backlinks.php create mode 100644 inc/Ui/Diff.php create mode 100644 inc/Ui/Editor.php create mode 100644 inc/Ui/Index.php create mode 100644 inc/Ui/Login.php create mode 100644 inc/Ui/Media/Display.php create mode 100644 inc/Ui/Media/DisplayRow.php create mode 100644 inc/Ui/Media/DisplayTile.php create mode 100644 inc/Ui/MediaDiff.php create mode 100644 inc/Ui/MediaRevisions.php create mode 100644 inc/Ui/PageConflict.php create mode 100644 inc/Ui/PageDiff.php create mode 100644 inc/Ui/PageDraft.php create mode 100644 inc/Ui/PageRevisions.php create mode 100644 inc/Ui/PageView.php create mode 100644 inc/Ui/Recent.php create mode 100644 inc/Ui/Revisions.php create mode 100644 inc/Ui/Search.php create mode 100644 inc/Ui/SearchState.php create mode 100644 inc/Ui/Subscribe.php create mode 100644 inc/Ui/Ui.php create mode 100644 inc/Ui/UserProfile.php create mode 100644 inc/Ui/UserRegister.php create mode 100644 inc/Ui/UserResendPwd.php create mode 100644 inc/Utf8/Asian.php create mode 100644 inc/Utf8/Clean.php create mode 100644 inc/Utf8/Conversion.php create mode 100644 inc/Utf8/PhpString.php create mode 100644 inc/Utf8/Sort.php create mode 100644 inc/Utf8/Table.php create mode 100644 inc/Utf8/Unicode.php create mode 100644 inc/Utf8/tables/case.php create mode 100644 inc/Utf8/tables/loweraccents.php create mode 100644 inc/Utf8/tables/romanization.php create mode 100644 inc/Utf8/tables/specials.php create mode 100644 inc/Utf8/tables/upperaccents.php create mode 100644 inc/actions.php create mode 100644 inc/auth.php create mode 100644 inc/cache.php create mode 100644 inc/changelog.php create mode 100644 inc/common.php create mode 100644 inc/compatibility.php create mode 100644 inc/config_cascade.php create mode 100644 inc/confutils.php create mode 100644 inc/defines.php create mode 100644 inc/deprecated.php create mode 100644 inc/farm.php create mode 100644 inc/fetch.functions.php create mode 100644 inc/form.php create mode 100644 inc/fulltext.php create mode 100644 inc/html.php create mode 100644 inc/httputils.php create mode 100644 inc/indexer.php create mode 100644 inc/infoutils.php create mode 100644 inc/init.php create mode 100644 inc/io.php create mode 100644 inc/lang/af/jquery.ui.datepicker.js create mode 100644 inc/lang/af/lang.php create mode 100644 inc/lang/ar/admin.txt create mode 100644 inc/lang/ar/adminplugins.txt create mode 100644 inc/lang/ar/backlinks.txt create mode 100644 inc/lang/ar/conflict.txt create mode 100644 inc/lang/ar/denied.txt create mode 100644 inc/lang/ar/diff.txt create mode 100644 inc/lang/ar/draft.txt create mode 100644 inc/lang/ar/edit.txt create mode 100644 inc/lang/ar/editrev.txt create mode 100644 inc/lang/ar/index.txt create mode 100644 inc/lang/ar/install.html create mode 100644 inc/lang/ar/jquery.ui.datepicker.js create mode 100644 inc/lang/ar/lang.php create mode 100644 inc/lang/ar/locked.txt create mode 100644 inc/lang/ar/login.txt create mode 100644 inc/lang/ar/mailtext.txt create mode 100644 inc/lang/ar/mailwrap.html create mode 100644 inc/lang/ar/newpage.txt create mode 100644 inc/lang/ar/norev.txt create mode 100644 inc/lang/ar/onceexisted.txt create mode 100644 inc/lang/ar/password.txt create mode 100644 inc/lang/ar/preview.txt create mode 100644 inc/lang/ar/pwconfirm.txt create mode 100644 inc/lang/ar/read.txt create mode 100644 inc/lang/ar/recent.txt create mode 100644 inc/lang/ar/register.txt create mode 100644 inc/lang/ar/registermail.txt create mode 100644 inc/lang/ar/resendpwd.txt create mode 100644 inc/lang/ar/resetpwd.txt create mode 100644 inc/lang/ar/revisions.txt create mode 100644 inc/lang/ar/searchpage.txt create mode 100644 inc/lang/ar/showrev.txt create mode 100644 inc/lang/ar/stopwords.txt create mode 100644 inc/lang/ar/subscr_digest.txt create mode 100644 inc/lang/ar/subscr_form.txt create mode 100644 inc/lang/ar/subscr_list.txt create mode 100644 inc/lang/ar/subscr_single.txt create mode 100644 inc/lang/ar/updateprofile.txt create mode 100644 inc/lang/ar/uploadmail.txt create mode 100644 inc/lang/az/admin.txt create mode 100644 inc/lang/az/adminplugins.txt create mode 100644 inc/lang/az/backlinks.txt create mode 100644 inc/lang/az/conflict.txt create mode 100644 inc/lang/az/denied.txt create mode 100644 inc/lang/az/diff.txt create mode 100644 inc/lang/az/draft.txt create mode 100644 inc/lang/az/edit.txt create mode 100644 inc/lang/az/editrev.txt create mode 100644 inc/lang/az/index.txt create mode 100644 inc/lang/az/install.html create mode 100644 inc/lang/az/jquery.ui.datepicker.js create mode 100644 inc/lang/az/lang.php create mode 100644 inc/lang/az/locked.txt create mode 100644 inc/lang/az/login.txt create mode 100644 inc/lang/az/mailtext.txt create mode 100644 inc/lang/az/newpage.txt create mode 100644 inc/lang/az/norev.txt create mode 100644 inc/lang/az/password.txt create mode 100644 inc/lang/az/preview.txt create mode 100644 inc/lang/az/pwconfirm.txt create mode 100644 inc/lang/az/read.txt create mode 100644 inc/lang/az/recent.txt create mode 100644 inc/lang/az/register.txt create mode 100644 inc/lang/az/registermail.txt create mode 100644 inc/lang/az/resendpwd.txt create mode 100644 inc/lang/az/revisions.txt create mode 100644 inc/lang/az/searchpage.txt create mode 100644 inc/lang/az/showrev.txt create mode 100644 inc/lang/az/stopwords.txt create mode 100644 inc/lang/az/updateprofile.txt create mode 100644 inc/lang/az/uploadmail.txt create mode 100644 inc/lang/be/admin.txt create mode 100644 inc/lang/be/adminplugins.txt create mode 100644 inc/lang/be/backlinks.txt create mode 100644 inc/lang/be/conflict.txt create mode 100644 inc/lang/be/denied.txt create mode 100644 inc/lang/be/diff.txt create mode 100644 inc/lang/be/draft.txt create mode 100644 inc/lang/be/edit.txt create mode 100644 inc/lang/be/editrev.txt create mode 100644 inc/lang/be/index.txt create mode 100644 inc/lang/be/install.html create mode 100644 inc/lang/be/jquery.ui.datepicker.js create mode 100644 inc/lang/be/lang.php create mode 100644 inc/lang/be/locked.txt create mode 100644 inc/lang/be/login.txt create mode 100644 inc/lang/be/mailtext.txt create mode 100644 inc/lang/be/newpage.txt create mode 100644 inc/lang/be/norev.txt create mode 100644 inc/lang/be/password.txt create mode 100644 inc/lang/be/preview.txt create mode 100644 inc/lang/be/pwconfirm.txt create mode 100644 inc/lang/be/read.txt create mode 100644 inc/lang/be/recent.txt create mode 100644 inc/lang/be/register.txt create mode 100644 inc/lang/be/registermail.txt create mode 100644 inc/lang/be/resendpwd.txt create mode 100644 inc/lang/be/resetpwd.txt create mode 100644 inc/lang/be/revisions.txt create mode 100644 inc/lang/be/searchpage.txt create mode 100644 inc/lang/be/showrev.txt create mode 100644 inc/lang/be/stopwords.txt create mode 100644 inc/lang/be/subscr_digest.txt create mode 100644 inc/lang/be/subscr_form.txt create mode 100644 inc/lang/be/subscr_list.txt create mode 100644 inc/lang/be/subscr_single.txt create mode 100644 inc/lang/be/updateprofile.txt create mode 100644 inc/lang/be/uploadmail.txt create mode 100644 inc/lang/bg/admin.txt create mode 100644 inc/lang/bg/adminplugins.txt create mode 100644 inc/lang/bg/backlinks.txt create mode 100644 inc/lang/bg/conflict.txt create mode 100644 inc/lang/bg/denied.txt create mode 100644 inc/lang/bg/diff.txt create mode 100644 inc/lang/bg/draft.txt create mode 100644 inc/lang/bg/edit.txt create mode 100644 inc/lang/bg/editrev.txt create mode 100644 inc/lang/bg/index.txt create mode 100644 inc/lang/bg/install.html create mode 100644 inc/lang/bg/jquery.ui.datepicker.js create mode 100644 inc/lang/bg/lang.php create mode 100644 inc/lang/bg/locked.txt create mode 100644 inc/lang/bg/login.txt create mode 100644 inc/lang/bg/mailtext.txt create mode 100644 inc/lang/bg/mailwrap.html create mode 100644 inc/lang/bg/newpage.txt create mode 100644 inc/lang/bg/norev.txt create mode 100644 inc/lang/bg/onceexisted.txt create mode 100644 inc/lang/bg/password.txt create mode 100644 inc/lang/bg/preview.txt create mode 100644 inc/lang/bg/pwconfirm.txt create mode 100644 inc/lang/bg/read.txt create mode 100644 inc/lang/bg/recent.txt create mode 100644 inc/lang/bg/register.txt create mode 100644 inc/lang/bg/registermail.txt create mode 100644 inc/lang/bg/resendpwd.txt create mode 100644 inc/lang/bg/resetpwd.txt create mode 100644 inc/lang/bg/revisions.txt create mode 100644 inc/lang/bg/searchpage.txt create mode 100644 inc/lang/bg/showrev.txt create mode 100644 inc/lang/bg/stopwords.txt create mode 100644 inc/lang/bg/subscr_digest.txt create mode 100644 inc/lang/bg/subscr_form.txt create mode 100644 inc/lang/bg/subscr_list.txt create mode 100644 inc/lang/bg/subscr_single.txt create mode 100644 inc/lang/bg/updateprofile.txt create mode 100644 inc/lang/bg/uploadmail.txt create mode 100644 inc/lang/bn/admin.txt create mode 100644 inc/lang/bn/adminplugins.txt create mode 100644 inc/lang/bn/backlinks.txt create mode 100644 inc/lang/bn/conflict.txt create mode 100644 inc/lang/bn/denied.txt create mode 100644 inc/lang/bn/diff.txt create mode 100644 inc/lang/bn/draft.txt create mode 100644 inc/lang/bn/edit.txt create mode 100644 inc/lang/bn/editrev.txt create mode 100644 inc/lang/bn/index.txt create mode 100644 inc/lang/bn/lang.php create mode 100644 inc/lang/ca-valencia/admin.txt create mode 100644 inc/lang/ca-valencia/adminplugins.txt create mode 100644 inc/lang/ca-valencia/backlinks.txt create mode 100644 inc/lang/ca-valencia/conflict.txt create mode 100644 inc/lang/ca-valencia/denied.txt create mode 100644 inc/lang/ca-valencia/diff.txt create mode 100644 inc/lang/ca-valencia/draft.txt create mode 100644 inc/lang/ca-valencia/edit.txt create mode 100644 inc/lang/ca-valencia/editrev.txt create mode 100644 inc/lang/ca-valencia/index.txt create mode 100644 inc/lang/ca-valencia/install.html create mode 100644 inc/lang/ca-valencia/lang.php create mode 100644 inc/lang/ca-valencia/locked.txt create mode 100644 inc/lang/ca-valencia/login.txt create mode 100644 inc/lang/ca-valencia/mailtext.txt create mode 100644 inc/lang/ca-valencia/newpage.txt create mode 100644 inc/lang/ca-valencia/norev.txt create mode 100644 inc/lang/ca-valencia/password.txt create mode 100644 inc/lang/ca-valencia/preview.txt create mode 100644 inc/lang/ca-valencia/pwconfirm.txt create mode 100644 inc/lang/ca-valencia/read.txt create mode 100644 inc/lang/ca-valencia/recent.txt create mode 100644 inc/lang/ca-valencia/register.txt create mode 100644 inc/lang/ca-valencia/registermail.txt create mode 100644 inc/lang/ca-valencia/resendpwd.txt create mode 100644 inc/lang/ca-valencia/revisions.txt create mode 100644 inc/lang/ca-valencia/searchpage.txt create mode 100644 inc/lang/ca-valencia/showrev.txt create mode 100644 inc/lang/ca-valencia/stopwords.txt create mode 100644 inc/lang/ca-valencia/updateprofile.txt create mode 100644 inc/lang/ca-valencia/uploadmail.txt create mode 100644 inc/lang/ca/admin.txt create mode 100644 inc/lang/ca/adminplugins.txt create mode 100644 inc/lang/ca/backlinks.txt create mode 100644 inc/lang/ca/conflict.txt create mode 100644 inc/lang/ca/denied.txt create mode 100644 inc/lang/ca/diff.txt create mode 100644 inc/lang/ca/draft.txt create mode 100644 inc/lang/ca/edit.txt create mode 100644 inc/lang/ca/editrev.txt create mode 100644 inc/lang/ca/index.txt create mode 100644 inc/lang/ca/install.html create mode 100644 inc/lang/ca/jquery.ui.datepicker.js create mode 100644 inc/lang/ca/lang.php create mode 100644 inc/lang/ca/locked.txt create mode 100644 inc/lang/ca/login.txt create mode 100644 inc/lang/ca/mailtext.txt create mode 100644 inc/lang/ca/mailwrap.html create mode 100644 inc/lang/ca/newpage.txt create mode 100644 inc/lang/ca/norev.txt create mode 100644 inc/lang/ca/onceexisted.txt create mode 100644 inc/lang/ca/password.txt create mode 100644 inc/lang/ca/preview.txt create mode 100644 inc/lang/ca/pwconfirm.txt create mode 100644 inc/lang/ca/read.txt create mode 100644 inc/lang/ca/recent.txt create mode 100644 inc/lang/ca/register.txt create mode 100644 inc/lang/ca/registermail.txt create mode 100644 inc/lang/ca/resendpwd.txt create mode 100644 inc/lang/ca/resetpwd.txt create mode 100644 inc/lang/ca/revisions.txt create mode 100644 inc/lang/ca/searchpage.txt create mode 100644 inc/lang/ca/showrev.txt create mode 100644 inc/lang/ca/stopwords.txt create mode 100644 inc/lang/ca/subscr_digest.txt create mode 100644 inc/lang/ca/subscr_form.txt create mode 100644 inc/lang/ca/subscr_list.txt create mode 100644 inc/lang/ca/subscr_single.txt create mode 100644 inc/lang/ca/updateprofile.txt create mode 100644 inc/lang/ca/uploadmail.txt create mode 100644 inc/lang/ckb/admin.txt create mode 100644 inc/lang/ckb/adminplugins.txt create mode 100644 inc/lang/ckb/backlinks.txt create mode 100644 inc/lang/ckb/conflict.txt create mode 100644 inc/lang/ckb/denied.txt create mode 100644 inc/lang/ckb/diff.txt create mode 100644 inc/lang/ckb/draft.txt create mode 100644 inc/lang/ckb/edit.txt create mode 100644 inc/lang/ckb/editrev.txt create mode 100644 inc/lang/ckb/index.txt create mode 100644 inc/lang/ckb/lang.php create mode 100644 inc/lang/ckb/locked.txt create mode 100644 inc/lang/ckb/login.txt create mode 100644 inc/lang/ckb/mailtext.txt create mode 100644 inc/lang/ckb/newpage.txt create mode 100644 inc/lang/ckb/norev.txt create mode 100644 inc/lang/ckb/onceexisted.txt create mode 100644 inc/lang/ckb/password.txt create mode 100644 inc/lang/ckb/preview.txt create mode 100644 inc/lang/ckb/pwconfirm.txt create mode 100644 inc/lang/ckb/read.txt create mode 100644 inc/lang/ckb/recent.txt create mode 100644 inc/lang/ckb/register.txt create mode 100644 inc/lang/ckb/registermail.txt create mode 100644 inc/lang/ckb/resendpwd.txt create mode 100644 inc/lang/ckb/resetpwd.txt create mode 100644 inc/lang/ckb/revisions.txt create mode 100644 inc/lang/ckb/searchpage.txt create mode 100644 inc/lang/ckb/showrev.txt create mode 100644 inc/lang/ckb/stopwords.txt create mode 100644 inc/lang/ckb/subscr_digest.txt create mode 100644 inc/lang/ckb/subscr_form.txt create mode 100644 inc/lang/ckb/subscr_list.txt create mode 100644 inc/lang/ckb/subscr_single.txt create mode 100644 inc/lang/ckb/updateprofile.txt create mode 100644 inc/lang/ckb/uploadmail.txt create mode 100644 inc/lang/cs/admin.txt create mode 100644 inc/lang/cs/adminplugins.txt create mode 100644 inc/lang/cs/backlinks.txt create mode 100644 inc/lang/cs/conflict.txt create mode 100644 inc/lang/cs/denied.txt create mode 100644 inc/lang/cs/diff.txt create mode 100644 inc/lang/cs/draft.txt create mode 100644 inc/lang/cs/edit.txt create mode 100644 inc/lang/cs/editrev.txt create mode 100644 inc/lang/cs/index.txt create mode 100644 inc/lang/cs/install.html create mode 100644 inc/lang/cs/jquery.ui.datepicker.js create mode 100644 inc/lang/cs/lang.php create mode 100644 inc/lang/cs/locked.txt create mode 100644 inc/lang/cs/login.txt create mode 100644 inc/lang/cs/mailtext.txt create mode 100644 inc/lang/cs/mailwrap.html create mode 100644 inc/lang/cs/newpage.txt create mode 100644 inc/lang/cs/norev.txt create mode 100644 inc/lang/cs/onceexisted.txt create mode 100644 inc/lang/cs/password.txt create mode 100644 inc/lang/cs/preview.txt create mode 100644 inc/lang/cs/pwconfirm.txt create mode 100644 inc/lang/cs/read.txt create mode 100644 inc/lang/cs/recent.txt create mode 100644 inc/lang/cs/register.txt create mode 100644 inc/lang/cs/registermail.txt create mode 100644 inc/lang/cs/resendpwd.txt create mode 100644 inc/lang/cs/resetpwd.txt create mode 100644 inc/lang/cs/revisions.txt create mode 100644 inc/lang/cs/searchpage.txt create mode 100644 inc/lang/cs/showrev.txt create mode 100644 inc/lang/cs/stopwords.txt create mode 100644 inc/lang/cs/subscr_digest.txt create mode 100644 inc/lang/cs/subscr_form.txt create mode 100644 inc/lang/cs/subscr_list.txt create mode 100644 inc/lang/cs/subscr_single.txt create mode 100644 inc/lang/cs/updateprofile.txt create mode 100644 inc/lang/cs/uploadmail.txt create mode 100644 inc/lang/cy/admin.txt create mode 100644 inc/lang/cy/adminplugins.txt create mode 100644 inc/lang/cy/backlinks.txt create mode 100644 inc/lang/cy/conflict.txt create mode 100644 inc/lang/cy/denied.txt create mode 100644 inc/lang/cy/diff.txt create mode 100644 inc/lang/cy/draft.txt create mode 100644 inc/lang/cy/edit.txt create mode 100644 inc/lang/cy/editrev.txt create mode 100644 inc/lang/cy/index.txt create mode 100644 inc/lang/cy/install.html create mode 100644 inc/lang/cy/jquery.ui.datepicker.js create mode 100644 inc/lang/cy/lang.php create mode 100644 inc/lang/cy/locked.txt create mode 100644 inc/lang/cy/login.txt create mode 100644 inc/lang/cy/mailtext.txt create mode 100644 inc/lang/cy/mailwrap.html create mode 100644 inc/lang/cy/newpage.txt create mode 100644 inc/lang/cy/norev.txt create mode 100644 inc/lang/cy/password.txt create mode 100644 inc/lang/cy/preview.txt create mode 100644 inc/lang/cy/pwconfirm.txt create mode 100644 inc/lang/cy/read.txt create mode 100644 inc/lang/cy/recent.txt create mode 100644 inc/lang/cy/register.txt create mode 100644 inc/lang/cy/registermail.txt create mode 100644 inc/lang/cy/resendpwd.txt create mode 100644 inc/lang/cy/resetpwd.txt create mode 100644 inc/lang/cy/revisions.txt create mode 100644 inc/lang/cy/searchpage.txt create mode 100644 inc/lang/cy/showrev.txt create mode 100644 inc/lang/cy/stopwords.txt create mode 100644 inc/lang/cy/subscr_digest.txt create mode 100644 inc/lang/cy/subscr_form.txt create mode 100644 inc/lang/cy/subscr_list.txt create mode 100644 inc/lang/cy/subscr_single.txt create mode 100644 inc/lang/cy/updateprofile.txt create mode 100644 inc/lang/cy/uploadmail.txt create mode 100644 inc/lang/da/admin.txt create mode 100644 inc/lang/da/adminplugins.txt create mode 100644 inc/lang/da/backlinks.txt create mode 100644 inc/lang/da/conflict.txt create mode 100644 inc/lang/da/denied.txt create mode 100644 inc/lang/da/diff.txt create mode 100644 inc/lang/da/draft.txt create mode 100644 inc/lang/da/edit.txt create mode 100644 inc/lang/da/editrev.txt create mode 100644 inc/lang/da/index.txt create mode 100644 inc/lang/da/install.html create mode 100644 inc/lang/da/jquery.ui.datepicker.js create mode 100644 inc/lang/da/lang.php create mode 100644 inc/lang/da/locked.txt create mode 100644 inc/lang/da/login.txt create mode 100644 inc/lang/da/mailtext.txt create mode 100644 inc/lang/da/mailwrap.html create mode 100644 inc/lang/da/newpage.txt create mode 100644 inc/lang/da/norev.txt create mode 100644 inc/lang/da/onceexisted.txt create mode 100644 inc/lang/da/password.txt create mode 100644 inc/lang/da/preview.txt create mode 100644 inc/lang/da/pwconfirm.txt create mode 100644 inc/lang/da/read.txt create mode 100644 inc/lang/da/recent.txt create mode 100644 inc/lang/da/register.txt create mode 100644 inc/lang/da/registermail.txt create mode 100644 inc/lang/da/resendpwd.txt create mode 100644 inc/lang/da/resetpwd.txt create mode 100644 inc/lang/da/revisions.txt create mode 100644 inc/lang/da/searchpage.txt create mode 100644 inc/lang/da/showrev.txt create mode 100644 inc/lang/da/stopwords.txt create mode 100644 inc/lang/da/subscr_digest.txt create mode 100644 inc/lang/da/subscr_form.txt create mode 100644 inc/lang/da/subscr_list.txt create mode 100644 inc/lang/da/subscr_single.txt create mode 100644 inc/lang/da/updateprofile.txt create mode 100644 inc/lang/da/uploadmail.txt create mode 100644 inc/lang/de-informal/admin.txt create mode 100644 inc/lang/de-informal/adminplugins.txt create mode 100644 inc/lang/de-informal/backlinks.txt create mode 100644 inc/lang/de-informal/conflict.txt create mode 100644 inc/lang/de-informal/denied.txt create mode 100644 inc/lang/de-informal/diff.txt create mode 100644 inc/lang/de-informal/draft.txt create mode 100644 inc/lang/de-informal/edit.txt create mode 100644 inc/lang/de-informal/editrev.txt create mode 100644 inc/lang/de-informal/index.txt create mode 100644 inc/lang/de-informal/install.html create mode 100644 inc/lang/de-informal/jquery.ui.datepicker.js create mode 100644 inc/lang/de-informal/lang.php create mode 100644 inc/lang/de-informal/locked.txt create mode 100644 inc/lang/de-informal/login.txt create mode 100644 inc/lang/de-informal/mailtext.txt create mode 100644 inc/lang/de-informal/mailwrap.html create mode 100644 inc/lang/de-informal/newpage.txt create mode 100644 inc/lang/de-informal/norev.txt create mode 100644 inc/lang/de-informal/onceexisted.txt create mode 100644 inc/lang/de-informal/password.txt create mode 100644 inc/lang/de-informal/preview.txt create mode 100644 inc/lang/de-informal/pwconfirm.txt create mode 100644 inc/lang/de-informal/read.txt create mode 100644 inc/lang/de-informal/recent.txt create mode 100644 inc/lang/de-informal/register.txt create mode 100644 inc/lang/de-informal/registermail.txt create mode 100644 inc/lang/de-informal/resendpwd.txt create mode 100644 inc/lang/de-informal/resetpwd.txt create mode 100644 inc/lang/de-informal/revisions.txt create mode 100644 inc/lang/de-informal/searchpage.txt create mode 100644 inc/lang/de-informal/showrev.txt create mode 100644 inc/lang/de-informal/stopwords.txt create mode 100644 inc/lang/de-informal/subscr_digest.txt create mode 100644 inc/lang/de-informal/subscr_form.txt create mode 100644 inc/lang/de-informal/subscr_list.txt create mode 100644 inc/lang/de-informal/subscr_single.txt create mode 100644 inc/lang/de-informal/updateprofile.txt create mode 100644 inc/lang/de-informal/uploadmail.txt create mode 100644 inc/lang/de/admin.txt create mode 100644 inc/lang/de/adminplugins.txt create mode 100644 inc/lang/de/backlinks.txt create mode 100644 inc/lang/de/conflict.txt create mode 100644 inc/lang/de/denied.txt create mode 100644 inc/lang/de/diff.txt create mode 100644 inc/lang/de/draft.txt create mode 100644 inc/lang/de/edit.txt create mode 100644 inc/lang/de/editrev.txt create mode 100644 inc/lang/de/index.txt create mode 100644 inc/lang/de/install.html create mode 100644 inc/lang/de/jquery.ui.datepicker.js create mode 100644 inc/lang/de/lang.php create mode 100644 inc/lang/de/locked.txt create mode 100644 inc/lang/de/login.txt create mode 100644 inc/lang/de/mailtext.txt create mode 100644 inc/lang/de/mailwrap.html create mode 100644 inc/lang/de/newpage.txt create mode 100644 inc/lang/de/norev.txt create mode 100644 inc/lang/de/onceexisted.txt create mode 100644 inc/lang/de/password.txt create mode 100644 inc/lang/de/preview.txt create mode 100644 inc/lang/de/pwconfirm.txt create mode 100644 inc/lang/de/read.txt create mode 100644 inc/lang/de/recent.txt create mode 100644 inc/lang/de/register.txt create mode 100644 inc/lang/de/registermail.txt create mode 100644 inc/lang/de/resendpwd.txt create mode 100644 inc/lang/de/resetpwd.txt create mode 100644 inc/lang/de/revisions.txt create mode 100644 inc/lang/de/searchpage.txt create mode 100644 inc/lang/de/showrev.txt create mode 100644 inc/lang/de/stopwords.txt create mode 100644 inc/lang/de/subscr_digest.txt create mode 100644 inc/lang/de/subscr_form.txt create mode 100644 inc/lang/de/subscr_list.txt create mode 100644 inc/lang/de/subscr_single.txt create mode 100644 inc/lang/de/updateprofile.txt create mode 100644 inc/lang/de/uploadmail.txt create mode 100644 inc/lang/el/admin.txt create mode 100644 inc/lang/el/adminplugins.txt create mode 100644 inc/lang/el/backlinks.txt create mode 100644 inc/lang/el/conflict.txt create mode 100644 inc/lang/el/denied.txt create mode 100644 inc/lang/el/diff.txt create mode 100644 inc/lang/el/draft.txt create mode 100644 inc/lang/el/edit.txt create mode 100644 inc/lang/el/editrev.txt create mode 100644 inc/lang/el/index.txt create mode 100644 inc/lang/el/install.html create mode 100644 inc/lang/el/jquery.ui.datepicker.js create mode 100644 inc/lang/el/lang.php create mode 100644 inc/lang/el/locked.txt create mode 100644 inc/lang/el/login.txt create mode 100644 inc/lang/el/mailtext.txt create mode 100644 inc/lang/el/mailwrap.html create mode 100644 inc/lang/el/newpage.txt create mode 100644 inc/lang/el/norev.txt create mode 100644 inc/lang/el/onceexisted.txt create mode 100644 inc/lang/el/password.txt create mode 100644 inc/lang/el/preview.txt create mode 100644 inc/lang/el/pwconfirm.txt create mode 100644 inc/lang/el/read.txt create mode 100644 inc/lang/el/recent.txt create mode 100644 inc/lang/el/register.txt create mode 100644 inc/lang/el/registermail.txt create mode 100644 inc/lang/el/resendpwd.txt create mode 100644 inc/lang/el/resetpwd.txt create mode 100644 inc/lang/el/revisions.txt create mode 100644 inc/lang/el/searchpage.txt create mode 100644 inc/lang/el/showrev.txt create mode 100644 inc/lang/el/stopwords.txt create mode 100644 inc/lang/el/subscr_digest.txt create mode 100644 inc/lang/el/subscr_form.txt create mode 100644 inc/lang/el/subscr_list.txt create mode 100644 inc/lang/el/subscr_single.txt create mode 100644 inc/lang/el/updateprofile.txt create mode 100644 inc/lang/el/uploadmail.txt create mode 100644 inc/lang/en/admin.txt create mode 100644 inc/lang/en/adminplugins.txt create mode 100644 inc/lang/en/backlinks.txt create mode 100644 inc/lang/en/conflict.txt create mode 100644 inc/lang/en/denied.txt create mode 100644 inc/lang/en/diff.txt create mode 100644 inc/lang/en/draft.txt create mode 100644 inc/lang/en/edit.txt create mode 100644 inc/lang/en/editrev.txt create mode 100644 inc/lang/en/index.txt create mode 100644 inc/lang/en/install.html create mode 100644 inc/lang/en/lang.php create mode 100644 inc/lang/en/locked.txt create mode 100644 inc/lang/en/login.txt create mode 100644 inc/lang/en/mailtext.txt create mode 100644 inc/lang/en/mailwrap.html create mode 100644 inc/lang/en/newpage.txt create mode 100644 inc/lang/en/norev.txt create mode 100644 inc/lang/en/onceexisted.txt create mode 100644 inc/lang/en/password.txt create mode 100644 inc/lang/en/preview.txt create mode 100644 inc/lang/en/pwconfirm.txt create mode 100644 inc/lang/en/read.txt create mode 100644 inc/lang/en/recent.txt create mode 100644 inc/lang/en/register.txt create mode 100644 inc/lang/en/registermail.txt create mode 100644 inc/lang/en/resendpwd.txt create mode 100644 inc/lang/en/resetpwd.txt create mode 100644 inc/lang/en/revisions.txt create mode 100644 inc/lang/en/searchpage.txt create mode 100644 inc/lang/en/showrev.txt create mode 100644 inc/lang/en/stopwords.txt create mode 100644 inc/lang/en/subscr_digest.txt create mode 100644 inc/lang/en/subscr_form.txt create mode 100644 inc/lang/en/subscr_list.txt create mode 100644 inc/lang/en/subscr_single.txt create mode 100644 inc/lang/en/updateprofile.txt create mode 100644 inc/lang/en/uploadmail.txt create mode 100644 inc/lang/eo/admin.txt create mode 100644 inc/lang/eo/adminplugins.txt create mode 100644 inc/lang/eo/backlinks.txt create mode 100644 inc/lang/eo/conflict.txt create mode 100644 inc/lang/eo/denied.txt create mode 100644 inc/lang/eo/diff.txt create mode 100644 inc/lang/eo/draft.txt create mode 100644 inc/lang/eo/edit.txt create mode 100644 inc/lang/eo/editrev.txt create mode 100644 inc/lang/eo/index.txt create mode 100644 inc/lang/eo/install.html create mode 100644 inc/lang/eo/jquery.ui.datepicker.js create mode 100644 inc/lang/eo/lang.php create mode 100644 inc/lang/eo/locked.txt create mode 100644 inc/lang/eo/login.txt create mode 100644 inc/lang/eo/mailtext.txt create mode 100644 inc/lang/eo/mailwrap.html create mode 100644 inc/lang/eo/newpage.txt create mode 100644 inc/lang/eo/norev.txt create mode 100644 inc/lang/eo/onceexisted.txt create mode 100644 inc/lang/eo/password.txt create mode 100644 inc/lang/eo/preview.txt create mode 100644 inc/lang/eo/pwconfirm.txt create mode 100644 inc/lang/eo/read.txt create mode 100644 inc/lang/eo/recent.txt create mode 100644 inc/lang/eo/register.txt create mode 100644 inc/lang/eo/registermail.txt create mode 100644 inc/lang/eo/resendpwd.txt create mode 100644 inc/lang/eo/resetpwd.txt create mode 100644 inc/lang/eo/revisions.txt create mode 100644 inc/lang/eo/searchpage.txt create mode 100644 inc/lang/eo/showrev.txt create mode 100644 inc/lang/eo/stopwords.txt create mode 100644 inc/lang/eo/subscr_digest.txt create mode 100644 inc/lang/eo/subscr_form.txt create mode 100644 inc/lang/eo/subscr_list.txt create mode 100644 inc/lang/eo/subscr_single.txt create mode 100644 inc/lang/eo/updateprofile.txt create mode 100644 inc/lang/eo/uploadmail.txt create mode 100644 inc/lang/es/admin.txt create mode 100644 inc/lang/es/adminplugins.txt create mode 100644 inc/lang/es/backlinks.txt create mode 100644 inc/lang/es/conflict.txt create mode 100644 inc/lang/es/denied.txt create mode 100644 inc/lang/es/diff.txt create mode 100644 inc/lang/es/draft.txt create mode 100644 inc/lang/es/edit.txt create mode 100644 inc/lang/es/editrev.txt create mode 100644 inc/lang/es/index.txt create mode 100644 inc/lang/es/install.html create mode 100644 inc/lang/es/jquery.ui.datepicker.js create mode 100644 inc/lang/es/lang.php create mode 100644 inc/lang/es/locked.txt create mode 100644 inc/lang/es/login.txt create mode 100644 inc/lang/es/mailtext.txt create mode 100644 inc/lang/es/mailwrap.html create mode 100644 inc/lang/es/newpage.txt create mode 100644 inc/lang/es/norev.txt create mode 100644 inc/lang/es/onceexisted.txt create mode 100644 inc/lang/es/password.txt create mode 100644 inc/lang/es/preview.txt create mode 100644 inc/lang/es/pwconfirm.txt create mode 100644 inc/lang/es/read.txt create mode 100644 inc/lang/es/recent.txt create mode 100644 inc/lang/es/register.txt create mode 100644 inc/lang/es/registermail.txt create mode 100644 inc/lang/es/resendpwd.txt create mode 100644 inc/lang/es/resetpwd.txt create mode 100644 inc/lang/es/revisions.txt create mode 100644 inc/lang/es/searchpage.txt create mode 100644 inc/lang/es/showrev.txt create mode 100644 inc/lang/es/stopwords.txt create mode 100644 inc/lang/es/subscr_digest.txt create mode 100644 inc/lang/es/subscr_form.txt create mode 100644 inc/lang/es/subscr_list.txt create mode 100644 inc/lang/es/subscr_single.txt create mode 100644 inc/lang/es/updateprofile.txt create mode 100644 inc/lang/es/uploadmail.txt create mode 100644 inc/lang/et/admin.txt create mode 100644 inc/lang/et/adminplugins.txt create mode 100644 inc/lang/et/backlinks.txt create mode 100644 inc/lang/et/conflict.txt create mode 100644 inc/lang/et/denied.txt create mode 100644 inc/lang/et/diff.txt create mode 100644 inc/lang/et/draft.txt create mode 100644 inc/lang/et/edit.txt create mode 100644 inc/lang/et/editrev.txt create mode 100644 inc/lang/et/index.txt create mode 100644 inc/lang/et/jquery.ui.datepicker.js create mode 100644 inc/lang/et/lang.php create mode 100644 inc/lang/et/locked.txt create mode 100644 inc/lang/et/login.txt create mode 100644 inc/lang/et/mailtext.txt create mode 100644 inc/lang/et/newpage.txt create mode 100644 inc/lang/et/norev.txt create mode 100644 inc/lang/et/password.txt create mode 100644 inc/lang/et/preview.txt create mode 100644 inc/lang/et/pwconfirm.txt create mode 100644 inc/lang/et/read.txt create mode 100644 inc/lang/et/recent.txt create mode 100644 inc/lang/et/register.txt create mode 100644 inc/lang/et/registermail.txt create mode 100644 inc/lang/et/resendpwd.txt create mode 100644 inc/lang/et/resetpwd.txt create mode 100644 inc/lang/et/revisions.txt create mode 100644 inc/lang/et/searchpage.txt create mode 100644 inc/lang/et/showrev.txt create mode 100644 inc/lang/et/stopwords.txt create mode 100644 inc/lang/et/subscr_digest.txt create mode 100644 inc/lang/et/subscr_form.txt create mode 100644 inc/lang/et/subscr_list.txt create mode 100644 inc/lang/et/subscr_single.txt create mode 100644 inc/lang/et/updateprofile.txt create mode 100644 inc/lang/et/uploadmail.txt create mode 100644 inc/lang/eu/admin.txt create mode 100644 inc/lang/eu/adminplugins.txt create mode 100644 inc/lang/eu/backlinks.txt create mode 100644 inc/lang/eu/conflict.txt create mode 100644 inc/lang/eu/denied.txt create mode 100644 inc/lang/eu/diff.txt create mode 100644 inc/lang/eu/draft.txt create mode 100644 inc/lang/eu/edit.txt create mode 100644 inc/lang/eu/editrev.txt create mode 100644 inc/lang/eu/index.txt create mode 100644 inc/lang/eu/install.html create mode 100644 inc/lang/eu/jquery.ui.datepicker.js create mode 100644 inc/lang/eu/lang.php create mode 100644 inc/lang/eu/locked.txt create mode 100644 inc/lang/eu/login.txt create mode 100644 inc/lang/eu/mailtext.txt create mode 100644 inc/lang/eu/mailwrap.html create mode 100644 inc/lang/eu/newpage.txt create mode 100644 inc/lang/eu/norev.txt create mode 100644 inc/lang/eu/password.txt create mode 100644 inc/lang/eu/preview.txt create mode 100644 inc/lang/eu/pwconfirm.txt create mode 100644 inc/lang/eu/read.txt create mode 100644 inc/lang/eu/recent.txt create mode 100644 inc/lang/eu/register.txt create mode 100644 inc/lang/eu/registermail.txt create mode 100644 inc/lang/eu/resendpwd.txt create mode 100644 inc/lang/eu/resetpwd.txt create mode 100644 inc/lang/eu/revisions.txt create mode 100644 inc/lang/eu/searchpage.txt create mode 100644 inc/lang/eu/showrev.txt create mode 100644 inc/lang/eu/stopwords.txt create mode 100644 inc/lang/eu/subscr_digest.txt create mode 100644 inc/lang/eu/subscr_form.txt create mode 100644 inc/lang/eu/subscr_list.txt create mode 100644 inc/lang/eu/subscr_single.txt create mode 100644 inc/lang/eu/updateprofile.txt create mode 100644 inc/lang/eu/uploadmail.txt create mode 100644 inc/lang/fa/admin.txt create mode 100644 inc/lang/fa/adminplugins.txt create mode 100644 inc/lang/fa/backlinks.txt create mode 100644 inc/lang/fa/conflict.txt create mode 100644 inc/lang/fa/denied.txt create mode 100644 inc/lang/fa/diff.txt create mode 100644 inc/lang/fa/draft.txt create mode 100644 inc/lang/fa/edit.txt create mode 100644 inc/lang/fa/editrev.txt create mode 100644 inc/lang/fa/index.txt create mode 100644 inc/lang/fa/install.html create mode 100644 inc/lang/fa/jquery.ui.datepicker.js create mode 100644 inc/lang/fa/lang.php create mode 100644 inc/lang/fa/locked.txt create mode 100644 inc/lang/fa/login.txt create mode 100644 inc/lang/fa/mailtext.txt create mode 100644 inc/lang/fa/mailwrap.html create mode 100644 inc/lang/fa/newpage.txt create mode 100644 inc/lang/fa/norev.txt create mode 100644 inc/lang/fa/onceexisted.txt create mode 100644 inc/lang/fa/password.txt create mode 100644 inc/lang/fa/preview.txt create mode 100644 inc/lang/fa/pwconfirm.txt create mode 100644 inc/lang/fa/read.txt create mode 100644 inc/lang/fa/recent.txt create mode 100644 inc/lang/fa/register.txt create mode 100644 inc/lang/fa/registermail.txt create mode 100644 inc/lang/fa/resendpwd.txt create mode 100644 inc/lang/fa/resetpwd.txt create mode 100644 inc/lang/fa/revisions.txt create mode 100644 inc/lang/fa/searchpage.txt create mode 100644 inc/lang/fa/showrev.txt create mode 100644 inc/lang/fa/stopwords.txt create mode 100644 inc/lang/fa/subscr_digest.txt create mode 100644 inc/lang/fa/subscr_form.txt create mode 100644 inc/lang/fa/subscr_list.txt create mode 100644 inc/lang/fa/subscr_single.txt create mode 100644 inc/lang/fa/updateprofile.txt create mode 100644 inc/lang/fa/uploadmail.txt create mode 100644 inc/lang/fi/admin.txt create mode 100644 inc/lang/fi/adminplugins.txt create mode 100644 inc/lang/fi/backlinks.txt create mode 100644 inc/lang/fi/conflict.txt create mode 100644 inc/lang/fi/denied.txt create mode 100644 inc/lang/fi/diff.txt create mode 100644 inc/lang/fi/draft.txt create mode 100644 inc/lang/fi/edit.txt create mode 100644 inc/lang/fi/editrev.txt create mode 100644 inc/lang/fi/index.txt create mode 100644 inc/lang/fi/install.html create mode 100644 inc/lang/fi/jquery.ui.datepicker.js create mode 100644 inc/lang/fi/lang.php create mode 100644 inc/lang/fi/locked.txt create mode 100644 inc/lang/fi/login.txt create mode 100644 inc/lang/fi/mailtext.txt create mode 100644 inc/lang/fi/mailwrap.html create mode 100644 inc/lang/fi/newpage.txt create mode 100644 inc/lang/fi/norev.txt create mode 100644 inc/lang/fi/password.txt create mode 100644 inc/lang/fi/preview.txt create mode 100644 inc/lang/fi/pwconfirm.txt create mode 100644 inc/lang/fi/read.txt create mode 100644 inc/lang/fi/recent.txt create mode 100644 inc/lang/fi/register.txt create mode 100644 inc/lang/fi/registermail.txt create mode 100644 inc/lang/fi/resendpwd.txt create mode 100644 inc/lang/fi/resetpwd.txt create mode 100644 inc/lang/fi/revisions.txt create mode 100644 inc/lang/fi/searchpage.txt create mode 100644 inc/lang/fi/showrev.txt create mode 100644 inc/lang/fi/stopwords.txt create mode 100644 inc/lang/fi/subscr_digest.txt create mode 100644 inc/lang/fi/subscr_form.txt create mode 100644 inc/lang/fi/subscr_list.txt create mode 100644 inc/lang/fi/subscr_single.txt create mode 100644 inc/lang/fi/updateprofile.txt create mode 100644 inc/lang/fi/uploadmail.txt create mode 100644 inc/lang/fo/admin.txt create mode 100644 inc/lang/fo/backlinks.txt create mode 100644 inc/lang/fo/conflict.txt create mode 100644 inc/lang/fo/denied.txt create mode 100644 inc/lang/fo/diff.txt create mode 100644 inc/lang/fo/edit.txt create mode 100644 inc/lang/fo/editrev.txt create mode 100644 inc/lang/fo/index.txt create mode 100644 inc/lang/fo/jquery.ui.datepicker.js create mode 100644 inc/lang/fo/lang.php create mode 100644 inc/lang/fo/locked.txt create mode 100644 inc/lang/fo/login.txt create mode 100644 inc/lang/fo/mailtext.txt create mode 100644 inc/lang/fo/newpage.txt create mode 100644 inc/lang/fo/norev.txt create mode 100644 inc/lang/fo/password.txt create mode 100644 inc/lang/fo/preview.txt create mode 100644 inc/lang/fo/read.txt create mode 100644 inc/lang/fo/recent.txt create mode 100644 inc/lang/fo/register.txt create mode 100644 inc/lang/fo/resendpwd.txt create mode 100644 inc/lang/fo/revisions.txt create mode 100644 inc/lang/fo/searchpage.txt create mode 100644 inc/lang/fo/showrev.txt create mode 100644 inc/lang/fo/stopwords.txt create mode 100644 inc/lang/fo/subscr_digest.txt create mode 100644 inc/lang/fo/updateprofile.txt create mode 100644 inc/lang/fr/admin.txt create mode 100644 inc/lang/fr/adminplugins.txt create mode 100644 inc/lang/fr/backlinks.txt create mode 100644 inc/lang/fr/conflict.txt create mode 100644 inc/lang/fr/denied.txt create mode 100644 inc/lang/fr/diff.txt create mode 100644 inc/lang/fr/draft.txt create mode 100644 inc/lang/fr/edit.txt create mode 100644 inc/lang/fr/editrev.txt create mode 100644 inc/lang/fr/index.txt create mode 100644 inc/lang/fr/install.html create mode 100644 inc/lang/fr/jquery.ui.datepicker.js create mode 100644 inc/lang/fr/lang.php create mode 100644 inc/lang/fr/locked.txt create mode 100644 inc/lang/fr/login.txt create mode 100644 inc/lang/fr/mailtext.txt create mode 100644 inc/lang/fr/mailwrap.html create mode 100644 inc/lang/fr/newpage.txt create mode 100644 inc/lang/fr/norev.txt create mode 100644 inc/lang/fr/onceexisted.txt create mode 100644 inc/lang/fr/password.txt create mode 100644 inc/lang/fr/preview.txt create mode 100644 inc/lang/fr/pwconfirm.txt create mode 100644 inc/lang/fr/read.txt create mode 100644 inc/lang/fr/recent.txt create mode 100644 inc/lang/fr/register.txt create mode 100644 inc/lang/fr/registermail.txt create mode 100644 inc/lang/fr/resendpwd.txt create mode 100644 inc/lang/fr/resetpwd.txt create mode 100644 inc/lang/fr/revisions.txt create mode 100644 inc/lang/fr/searchpage.txt create mode 100644 inc/lang/fr/showrev.txt create mode 100644 inc/lang/fr/stopwords.txt create mode 100644 inc/lang/fr/subscr_digest.txt create mode 100644 inc/lang/fr/subscr_form.txt create mode 100644 inc/lang/fr/subscr_list.txt create mode 100644 inc/lang/fr/subscr_single.txt create mode 100644 inc/lang/fr/updateprofile.txt create mode 100644 inc/lang/fr/uploadmail.txt create mode 100644 inc/lang/fy/admin.txt create mode 100644 inc/lang/gl/admin.txt create mode 100644 inc/lang/gl/adminplugins.txt create mode 100644 inc/lang/gl/backlinks.txt create mode 100644 inc/lang/gl/conflict.txt create mode 100644 inc/lang/gl/denied.txt create mode 100644 inc/lang/gl/diff.txt create mode 100644 inc/lang/gl/draft.txt create mode 100644 inc/lang/gl/edit.txt create mode 100644 inc/lang/gl/editrev.txt create mode 100644 inc/lang/gl/index.txt create mode 100644 inc/lang/gl/install.html create mode 100644 inc/lang/gl/jquery.ui.datepicker.js create mode 100644 inc/lang/gl/lang.php create mode 100644 inc/lang/gl/locked.txt create mode 100644 inc/lang/gl/login.txt create mode 100644 inc/lang/gl/mailtext.txt create mode 100644 inc/lang/gl/mailwrap.html create mode 100644 inc/lang/gl/newpage.txt create mode 100644 inc/lang/gl/norev.txt create mode 100644 inc/lang/gl/password.txt create mode 100644 inc/lang/gl/preview.txt create mode 100644 inc/lang/gl/pwconfirm.txt create mode 100644 inc/lang/gl/read.txt create mode 100644 inc/lang/gl/recent.txt create mode 100644 inc/lang/gl/register.txt create mode 100644 inc/lang/gl/registermail.txt create mode 100644 inc/lang/gl/resendpwd.txt create mode 100644 inc/lang/gl/resetpwd.txt create mode 100644 inc/lang/gl/revisions.txt create mode 100644 inc/lang/gl/searchpage.txt create mode 100644 inc/lang/gl/showrev.txt create mode 100644 inc/lang/gl/stopwords.txt create mode 100644 inc/lang/gl/subscr_digest.txt create mode 100644 inc/lang/gl/subscr_form.txt create mode 100644 inc/lang/gl/subscr_list.txt create mode 100644 inc/lang/gl/subscr_single.txt create mode 100644 inc/lang/gl/updateprofile.txt create mode 100644 inc/lang/gl/uploadmail.txt create mode 100644 inc/lang/he/admin.txt create mode 100644 inc/lang/he/adminplugins.txt create mode 100644 inc/lang/he/backlinks.txt create mode 100644 inc/lang/he/conflict.txt create mode 100644 inc/lang/he/denied.txt create mode 100644 inc/lang/he/diff.txt create mode 100644 inc/lang/he/draft.txt create mode 100644 inc/lang/he/edit.txt create mode 100644 inc/lang/he/editrev.txt create mode 100644 inc/lang/he/index.txt create mode 100644 inc/lang/he/install.html create mode 100644 inc/lang/he/jquery.ui.datepicker.js create mode 100644 inc/lang/he/lang.php create mode 100644 inc/lang/he/locked.txt create mode 100644 inc/lang/he/login.txt create mode 100644 inc/lang/he/mailtext.txt create mode 100644 inc/lang/he/newpage.txt create mode 100644 inc/lang/he/norev.txt create mode 100644 inc/lang/he/password.txt create mode 100644 inc/lang/he/preview.txt create mode 100644 inc/lang/he/pwconfirm.txt create mode 100644 inc/lang/he/read.txt create mode 100644 inc/lang/he/recent.txt create mode 100644 inc/lang/he/register.txt create mode 100644 inc/lang/he/registermail.txt create mode 100644 inc/lang/he/resendpwd.txt create mode 100644 inc/lang/he/resetpwd.txt create mode 100644 inc/lang/he/revisions.txt create mode 100644 inc/lang/he/searchpage.txt create mode 100644 inc/lang/he/showrev.txt create mode 100644 inc/lang/he/stopwords.txt create mode 100644 inc/lang/he/subscr_digest.txt create mode 100644 inc/lang/he/subscr_single.txt create mode 100644 inc/lang/he/updateprofile.txt create mode 100644 inc/lang/he/uploadmail.txt create mode 100644 inc/lang/hi/diff.txt create mode 100644 inc/lang/hi/jquery.ui.datepicker.js create mode 100644 inc/lang/hi/lang.php create mode 100644 inc/lang/hr/admin.txt create mode 100644 inc/lang/hr/adminplugins.txt create mode 100644 inc/lang/hr/backlinks.txt create mode 100644 inc/lang/hr/conflict.txt create mode 100644 inc/lang/hr/denied.txt create mode 100644 inc/lang/hr/diff.txt create mode 100644 inc/lang/hr/draft.txt create mode 100644 inc/lang/hr/edit.txt create mode 100644 inc/lang/hr/editrev.txt create mode 100644 inc/lang/hr/index.txt create mode 100644 inc/lang/hr/jquery.ui.datepicker.js create mode 100644 inc/lang/hr/lang.php create mode 100644 inc/lang/hr/locked.txt create mode 100644 inc/lang/hr/login.txt create mode 100644 inc/lang/hr/mailtext.txt create mode 100644 inc/lang/hr/newpage.txt create mode 100644 inc/lang/hr/norev.txt create mode 100644 inc/lang/hr/password.txt create mode 100644 inc/lang/hr/preview.txt create mode 100644 inc/lang/hr/pwconfirm.txt create mode 100644 inc/lang/hr/read.txt create mode 100644 inc/lang/hr/recent.txt create mode 100644 inc/lang/hr/register.txt create mode 100644 inc/lang/hr/registermail.txt create mode 100644 inc/lang/hr/resendpwd.txt create mode 100644 inc/lang/hr/resetpwd.txt create mode 100644 inc/lang/hr/revisions.txt create mode 100644 inc/lang/hr/searchpage.txt create mode 100644 inc/lang/hr/showrev.txt create mode 100644 inc/lang/hr/stopwords.txt create mode 100644 inc/lang/hr/subscr_digest.txt create mode 100644 inc/lang/hr/subscr_form.txt create mode 100644 inc/lang/hr/subscr_list.txt create mode 100644 inc/lang/hr/subscr_single.txt create mode 100644 inc/lang/hr/updateprofile.txt create mode 100644 inc/lang/hr/uploadmail.txt create mode 100644 inc/lang/hu-formal/admin.txt create mode 100644 inc/lang/hu-formal/adminplugins.txt create mode 100644 inc/lang/hu-formal/backlinks.txt create mode 100644 inc/lang/hu-formal/conflict.txt create mode 100644 inc/lang/hu-formal/denied.txt create mode 100644 inc/lang/hu-formal/diff.txt create mode 100644 inc/lang/hu-formal/draft.txt create mode 100644 inc/lang/hu-formal/edit.txt create mode 100644 inc/lang/hu-formal/editrev.txt create mode 100644 inc/lang/hu-formal/index.txt create mode 100644 inc/lang/hu-formal/lang.php create mode 100644 inc/lang/hu/admin.txt create mode 100644 inc/lang/hu/adminplugins.txt create mode 100644 inc/lang/hu/backlinks.txt create mode 100644 inc/lang/hu/conflict.txt create mode 100644 inc/lang/hu/denied.txt create mode 100644 inc/lang/hu/diff.txt create mode 100644 inc/lang/hu/draft.txt create mode 100644 inc/lang/hu/edit.txt create mode 100644 inc/lang/hu/editrev.txt create mode 100644 inc/lang/hu/index.txt create mode 100644 inc/lang/hu/install.html create mode 100644 inc/lang/hu/jquery.ui.datepicker.js create mode 100644 inc/lang/hu/lang.php create mode 100644 inc/lang/hu/locked.txt create mode 100644 inc/lang/hu/login.txt create mode 100644 inc/lang/hu/mailtext.txt create mode 100644 inc/lang/hu/mailwrap.html create mode 100644 inc/lang/hu/newpage.txt create mode 100644 inc/lang/hu/norev.txt create mode 100644 inc/lang/hu/onceexisted.txt create mode 100644 inc/lang/hu/password.txt create mode 100644 inc/lang/hu/preview.txt create mode 100644 inc/lang/hu/pwconfirm.txt create mode 100644 inc/lang/hu/read.txt create mode 100644 inc/lang/hu/recent.txt create mode 100644 inc/lang/hu/register.txt create mode 100644 inc/lang/hu/registermail.txt create mode 100644 inc/lang/hu/resendpwd.txt create mode 100644 inc/lang/hu/resetpwd.txt create mode 100644 inc/lang/hu/revisions.txt create mode 100644 inc/lang/hu/searchpage.txt create mode 100644 inc/lang/hu/showrev.txt create mode 100644 inc/lang/hu/stopwords.txt create mode 100644 inc/lang/hu/subscr_digest.txt create mode 100644 inc/lang/hu/subscr_form.txt create mode 100644 inc/lang/hu/subscr_list.txt create mode 100644 inc/lang/hu/subscr_single.txt create mode 100644 inc/lang/hu/updateprofile.txt create mode 100644 inc/lang/hu/uploadmail.txt create mode 100644 inc/lang/hy/admin.txt create mode 100644 inc/lang/hy/adminplugins.txt create mode 100644 inc/lang/hy/backlinks.txt create mode 100644 inc/lang/hy/conflict.txt create mode 100644 inc/lang/hy/denied.txt create mode 100644 inc/lang/hy/diff.txt create mode 100644 inc/lang/hy/draft.txt create mode 100644 inc/lang/hy/edit.txt create mode 100644 inc/lang/hy/editrev.txt create mode 100644 inc/lang/hy/index.txt create mode 100644 inc/lang/hy/jquery.ui.datepicker.js create mode 100644 inc/lang/hy/lang.php create mode 100644 inc/lang/ia/admin.txt create mode 100644 inc/lang/ia/adminplugins.txt create mode 100644 inc/lang/ia/backlinks.txt create mode 100644 inc/lang/ia/conflict.txt create mode 100644 inc/lang/ia/denied.txt create mode 100644 inc/lang/ia/diff.txt create mode 100644 inc/lang/ia/draft.txt create mode 100644 inc/lang/ia/edit.txt create mode 100644 inc/lang/ia/editrev.txt create mode 100644 inc/lang/ia/index.txt create mode 100644 inc/lang/ia/install.html create mode 100644 inc/lang/ia/lang.php create mode 100644 inc/lang/ia/locked.txt create mode 100644 inc/lang/ia/login.txt create mode 100644 inc/lang/ia/mailtext.txt create mode 100644 inc/lang/ia/newpage.txt create mode 100644 inc/lang/ia/norev.txt create mode 100644 inc/lang/ia/password.txt create mode 100644 inc/lang/ia/preview.txt create mode 100644 inc/lang/ia/pwconfirm.txt create mode 100644 inc/lang/ia/read.txt create mode 100644 inc/lang/ia/recent.txt create mode 100644 inc/lang/ia/register.txt create mode 100644 inc/lang/ia/registermail.txt create mode 100644 inc/lang/ia/resendpwd.txt create mode 100644 inc/lang/ia/revisions.txt create mode 100644 inc/lang/ia/searchpage.txt create mode 100644 inc/lang/ia/showrev.txt create mode 100644 inc/lang/ia/stopwords.txt create mode 100644 inc/lang/ia/subscr_digest.txt create mode 100644 inc/lang/ia/subscr_form.txt create mode 100644 inc/lang/ia/subscr_list.txt create mode 100644 inc/lang/ia/subscr_single.txt create mode 100644 inc/lang/ia/updateprofile.txt create mode 100644 inc/lang/ia/uploadmail.txt create mode 100644 inc/lang/id-ni/lang.php create mode 100644 inc/lang/id/admin.txt create mode 100644 inc/lang/id/adminplugins.txt create mode 100644 inc/lang/id/backlinks.txt create mode 100644 inc/lang/id/conflict.txt create mode 100644 inc/lang/id/denied.txt create mode 100644 inc/lang/id/diff.txt create mode 100644 inc/lang/id/draft.txt create mode 100644 inc/lang/id/edit.txt create mode 100644 inc/lang/id/editrev.txt create mode 100644 inc/lang/id/index.txt create mode 100644 inc/lang/id/install.html create mode 100644 inc/lang/id/jquery.ui.datepicker.js create mode 100644 inc/lang/id/lang.php create mode 100644 inc/lang/id/locked.txt create mode 100644 inc/lang/id/login.txt create mode 100644 inc/lang/id/mailtext.txt create mode 100644 inc/lang/id/newpage.txt create mode 100644 inc/lang/id/norev.txt create mode 100644 inc/lang/id/password.txt create mode 100644 inc/lang/id/preview.txt create mode 100644 inc/lang/id/pwconfirm.txt create mode 100644 inc/lang/id/read.txt create mode 100644 inc/lang/id/recent.txt create mode 100644 inc/lang/id/register.txt create mode 100644 inc/lang/id/registermail.txt create mode 100644 inc/lang/id/resendpwd.txt create mode 100644 inc/lang/id/resetpwd.txt create mode 100644 inc/lang/id/revisions.txt create mode 100644 inc/lang/id/searchpage.txt create mode 100644 inc/lang/id/showrev.txt create mode 100644 inc/lang/id/stopwords.txt create mode 100644 inc/lang/id/subscr_digest.txt create mode 100644 inc/lang/id/updateprofile.txt create mode 100644 inc/lang/id/uploadmail.txt create mode 100644 inc/lang/is/adminplugins.txt create mode 100644 inc/lang/is/diff.txt create mode 100644 inc/lang/is/jquery.ui.datepicker.js create mode 100644 inc/lang/is/lang.php create mode 100644 inc/lang/is/login.txt create mode 100644 inc/lang/is/recent.txt create mode 100644 inc/lang/is/resendpwd.txt create mode 100644 inc/lang/it/admin.txt create mode 100644 inc/lang/it/adminplugins.txt create mode 100644 inc/lang/it/backlinks.txt create mode 100644 inc/lang/it/conflict.txt create mode 100644 inc/lang/it/denied.txt create mode 100644 inc/lang/it/diff.txt create mode 100644 inc/lang/it/draft.txt create mode 100644 inc/lang/it/edit.txt create mode 100644 inc/lang/it/editrev.txt create mode 100644 inc/lang/it/index.txt create mode 100644 inc/lang/it/install.html create mode 100644 inc/lang/it/jquery.ui.datepicker.js create mode 100644 inc/lang/it/lang.php create mode 100644 inc/lang/it/locked.txt create mode 100644 inc/lang/it/login.txt create mode 100644 inc/lang/it/mailtext.txt create mode 100644 inc/lang/it/mailwrap.html create mode 100644 inc/lang/it/newpage.txt create mode 100644 inc/lang/it/norev.txt create mode 100644 inc/lang/it/onceexisted.txt create mode 100644 inc/lang/it/password.txt create mode 100644 inc/lang/it/preview.txt create mode 100644 inc/lang/it/pwconfirm.txt create mode 100644 inc/lang/it/read.txt create mode 100644 inc/lang/it/recent.txt create mode 100644 inc/lang/it/register.txt create mode 100644 inc/lang/it/registermail.txt create mode 100644 inc/lang/it/resendpwd.txt create mode 100644 inc/lang/it/resetpwd.txt create mode 100644 inc/lang/it/revisions.txt create mode 100644 inc/lang/it/searchpage.txt create mode 100644 inc/lang/it/showrev.txt create mode 100644 inc/lang/it/stopwords.txt create mode 100644 inc/lang/it/subscr_digest.txt create mode 100644 inc/lang/it/subscr_form.txt create mode 100644 inc/lang/it/subscr_list.txt create mode 100644 inc/lang/it/subscr_single.txt create mode 100644 inc/lang/it/updateprofile.txt create mode 100644 inc/lang/it/uploadmail.txt create mode 100644 inc/lang/ja/admin.txt create mode 100644 inc/lang/ja/adminplugins.txt create mode 100644 inc/lang/ja/backlinks.txt create mode 100644 inc/lang/ja/conflict.txt create mode 100644 inc/lang/ja/denied.txt create mode 100644 inc/lang/ja/diff.txt create mode 100644 inc/lang/ja/draft.txt create mode 100644 inc/lang/ja/edit.txt create mode 100644 inc/lang/ja/editrev.txt create mode 100644 inc/lang/ja/index.txt create mode 100644 inc/lang/ja/install.html create mode 100644 inc/lang/ja/jquery.ui.datepicker.js create mode 100644 inc/lang/ja/lang.php create mode 100644 inc/lang/ja/locked.txt create mode 100644 inc/lang/ja/login.txt create mode 100644 inc/lang/ja/mailtext.txt create mode 100644 inc/lang/ja/mailwrap.html create mode 100644 inc/lang/ja/newpage.txt create mode 100644 inc/lang/ja/norev.txt create mode 100644 inc/lang/ja/onceexisted.txt create mode 100644 inc/lang/ja/password.txt create mode 100644 inc/lang/ja/preview.txt create mode 100644 inc/lang/ja/pwconfirm.txt create mode 100644 inc/lang/ja/read.txt create mode 100644 inc/lang/ja/recent.txt create mode 100644 inc/lang/ja/register.txt create mode 100644 inc/lang/ja/registermail.txt create mode 100644 inc/lang/ja/resendpwd.txt create mode 100644 inc/lang/ja/resetpwd.txt create mode 100644 inc/lang/ja/revisions.txt create mode 100644 inc/lang/ja/searchpage.txt create mode 100644 inc/lang/ja/showrev.txt create mode 100644 inc/lang/ja/stopwords.txt create mode 100644 inc/lang/ja/subscr_digest.txt create mode 100644 inc/lang/ja/subscr_form.txt create mode 100644 inc/lang/ja/subscr_list.txt create mode 100644 inc/lang/ja/subscr_single.txt create mode 100644 inc/lang/ja/updateprofile.txt create mode 100644 inc/lang/ja/uploadmail.txt create mode 100644 inc/lang/ka/admin.txt create mode 100644 inc/lang/ka/adminplugins.txt create mode 100644 inc/lang/ka/backlinks.txt create mode 100644 inc/lang/ka/conflict.txt create mode 100644 inc/lang/ka/denied.txt create mode 100644 inc/lang/ka/diff.txt create mode 100644 inc/lang/ka/draft.txt create mode 100644 inc/lang/ka/edit.txt create mode 100644 inc/lang/ka/editrev.txt create mode 100644 inc/lang/ka/index.txt create mode 100644 inc/lang/ka/jquery.ui.datepicker.js create mode 100644 inc/lang/ka/lang.php create mode 100644 inc/lang/kk/jquery.ui.datepicker.js create mode 100644 inc/lang/kk/lang.php create mode 100644 inc/lang/km/admin.txt create mode 100644 inc/lang/km/backlinks.txt create mode 100644 inc/lang/km/conflict.txt create mode 100644 inc/lang/km/denied.txt create mode 100644 inc/lang/km/edit.txt create mode 100644 inc/lang/km/editrev.txt create mode 100644 inc/lang/km/index.txt create mode 100644 inc/lang/km/jquery.ui.datepicker.js create mode 100644 inc/lang/km/lang.php create mode 100644 inc/lang/km/login.txt create mode 100644 inc/lang/km/newpage.txt create mode 100644 inc/lang/km/norev.txt create mode 100644 inc/lang/km/password.txt create mode 100644 inc/lang/km/pwconfirm.txt create mode 100644 inc/lang/km/recent.txt create mode 100644 inc/lang/km/register.txt create mode 100644 inc/lang/km/revisions.txt create mode 100644 inc/lang/kn/admin.txt create mode 100644 inc/lang/kn/adminplugins.txt create mode 100644 inc/lang/kn/backlinks.txt create mode 100644 inc/lang/kn/conflict.txt create mode 100644 inc/lang/ko/admin.txt create mode 100644 inc/lang/ko/adminplugins.txt create mode 100644 inc/lang/ko/backlinks.txt create mode 100644 inc/lang/ko/conflict.txt create mode 100644 inc/lang/ko/denied.txt create mode 100644 inc/lang/ko/diff.txt create mode 100644 inc/lang/ko/draft.txt create mode 100644 inc/lang/ko/edit.txt create mode 100644 inc/lang/ko/editrev.txt create mode 100644 inc/lang/ko/index.txt create mode 100644 inc/lang/ko/install.html create mode 100644 inc/lang/ko/jquery.ui.datepicker.js create mode 100644 inc/lang/ko/lang.php create mode 100644 inc/lang/ko/locked.txt create mode 100644 inc/lang/ko/login.txt create mode 100644 inc/lang/ko/mailtext.txt create mode 100644 inc/lang/ko/mailwrap.html create mode 100644 inc/lang/ko/newpage.txt create mode 100644 inc/lang/ko/norev.txt create mode 100644 inc/lang/ko/onceexisted.txt create mode 100644 inc/lang/ko/password.txt create mode 100644 inc/lang/ko/preview.txt create mode 100644 inc/lang/ko/pwconfirm.txt create mode 100644 inc/lang/ko/read.txt create mode 100644 inc/lang/ko/recent.txt create mode 100644 inc/lang/ko/register.txt create mode 100644 inc/lang/ko/registermail.txt create mode 100644 inc/lang/ko/resendpwd.txt create mode 100644 inc/lang/ko/resetpwd.txt create mode 100644 inc/lang/ko/revisions.txt create mode 100644 inc/lang/ko/searchpage.txt create mode 100644 inc/lang/ko/showrev.txt create mode 100644 inc/lang/ko/stopwords.txt create mode 100644 inc/lang/ko/subscr_digest.txt create mode 100644 inc/lang/ko/subscr_form.txt create mode 100644 inc/lang/ko/subscr_list.txt create mode 100644 inc/lang/ko/subscr_single.txt create mode 100644 inc/lang/ko/updateprofile.txt create mode 100644 inc/lang/ko/uploadmail.txt create mode 100644 inc/lang/ku/backlinks.txt create mode 100644 inc/lang/ku/conflict.txt create mode 100644 inc/lang/ku/diff.txt create mode 100644 inc/lang/ku/edit.txt create mode 100644 inc/lang/ku/index.txt create mode 100644 inc/lang/ku/lang.php create mode 100644 inc/lang/ku/newpage.txt create mode 100644 inc/lang/ku/preview.txt create mode 100644 inc/lang/ku/recent.txt create mode 100644 inc/lang/ku/searchpage.txt create mode 100644 inc/lang/la/admin.txt create mode 100644 inc/lang/la/adminplugins.txt create mode 100644 inc/lang/la/backlinks.txt create mode 100644 inc/lang/la/conflict.txt create mode 100644 inc/lang/la/denied.txt create mode 100644 inc/lang/la/diff.txt create mode 100644 inc/lang/la/draft.txt create mode 100644 inc/lang/la/edit.txt create mode 100644 inc/lang/la/editrev.txt create mode 100644 inc/lang/la/index.txt create mode 100644 inc/lang/la/install.html create mode 100644 inc/lang/la/lang.php create mode 100644 inc/lang/la/locked.txt create mode 100644 inc/lang/la/login.txt create mode 100644 inc/lang/la/mailtext.txt create mode 100644 inc/lang/la/newpage.txt create mode 100644 inc/lang/la/norev.txt create mode 100644 inc/lang/la/password.txt create mode 100644 inc/lang/la/preview.txt create mode 100644 inc/lang/la/pwconfirm.txt create mode 100644 inc/lang/la/read.txt create mode 100644 inc/lang/la/recent.txt create mode 100644 inc/lang/la/register.txt create mode 100644 inc/lang/la/registermail.txt create mode 100644 inc/lang/la/resendpwd.txt create mode 100644 inc/lang/la/revisions.txt create mode 100644 inc/lang/la/searchpage.txt create mode 100644 inc/lang/la/showrev.txt create mode 100644 inc/lang/la/stopwords.txt create mode 100644 inc/lang/la/subscr_digest.txt create mode 100644 inc/lang/la/subscr_form.txt create mode 100644 inc/lang/la/subscr_list.txt create mode 100644 inc/lang/la/subscr_single.txt create mode 100644 inc/lang/la/updateprofile.txt create mode 100644 inc/lang/la/uploadmail.txt create mode 100644 inc/lang/lb/admin.txt create mode 100644 inc/lang/lb/adminplugins.txt create mode 100644 inc/lang/lb/backlinks.txt create mode 100644 inc/lang/lb/conflict.txt create mode 100644 inc/lang/lb/denied.txt create mode 100644 inc/lang/lb/diff.txt create mode 100644 inc/lang/lb/draft.txt create mode 100644 inc/lang/lb/edit.txt create mode 100644 inc/lang/lb/editrev.txt create mode 100644 inc/lang/lb/index.txt create mode 100644 inc/lang/lb/jquery.ui.datepicker.js create mode 100644 inc/lang/lb/lang.php create mode 100644 inc/lang/lb/locked.txt create mode 100644 inc/lang/lb/login.txt create mode 100644 inc/lang/lb/mailtext.txt create mode 100644 inc/lang/lb/newpage.txt create mode 100644 inc/lang/lb/norev.txt create mode 100644 inc/lang/lb/password.txt create mode 100644 inc/lang/lb/preview.txt create mode 100644 inc/lang/lb/pwconfirm.txt create mode 100644 inc/lang/lb/read.txt create mode 100644 inc/lang/lb/recent.txt create mode 100644 inc/lang/lb/register.txt create mode 100644 inc/lang/lb/registermail.txt create mode 100644 inc/lang/lb/resendpwd.txt create mode 100644 inc/lang/lb/revisions.txt create mode 100644 inc/lang/lb/searchpage.txt create mode 100644 inc/lang/lb/showrev.txt create mode 100644 inc/lang/lb/updateprofile.txt create mode 100644 inc/lang/lb/uploadmail.txt create mode 100644 inc/lang/lt/admin.txt create mode 100644 inc/lang/lt/adminplugins.txt create mode 100644 inc/lang/lt/backlinks.txt create mode 100644 inc/lang/lt/conflict.txt create mode 100644 inc/lang/lt/denied.txt create mode 100644 inc/lang/lt/diff.txt create mode 100644 inc/lang/lt/draft.txt create mode 100644 inc/lang/lt/edit.txt create mode 100644 inc/lang/lt/editrev.txt create mode 100644 inc/lang/lt/index.txt create mode 100644 inc/lang/lt/jquery.ui.datepicker.js create mode 100644 inc/lang/lt/lang.php create mode 100644 inc/lang/lt/locked.txt create mode 100644 inc/lang/lt/login.txt create mode 100644 inc/lang/lt/mailtext.txt create mode 100644 inc/lang/lt/newpage.txt create mode 100644 inc/lang/lt/norev.txt create mode 100644 inc/lang/lt/password.txt create mode 100644 inc/lang/lt/preview.txt create mode 100644 inc/lang/lt/read.txt create mode 100644 inc/lang/lt/recent.txt create mode 100644 inc/lang/lt/register.txt create mode 100644 inc/lang/lt/resendpwd.txt create mode 100644 inc/lang/lt/revisions.txt create mode 100644 inc/lang/lt/searchpage.txt create mode 100644 inc/lang/lt/showrev.txt create mode 100644 inc/lang/lt/updateprofile.txt create mode 100644 inc/lang/lv/admin.txt create mode 100644 inc/lang/lv/adminplugins.txt create mode 100644 inc/lang/lv/backlinks.txt create mode 100644 inc/lang/lv/conflict.txt create mode 100644 inc/lang/lv/denied.txt create mode 100644 inc/lang/lv/diff.txt create mode 100644 inc/lang/lv/draft.txt create mode 100644 inc/lang/lv/edit.txt create mode 100644 inc/lang/lv/editrev.txt create mode 100644 inc/lang/lv/index.txt create mode 100644 inc/lang/lv/install.html create mode 100644 inc/lang/lv/jquery.ui.datepicker.js create mode 100644 inc/lang/lv/lang.php create mode 100644 inc/lang/lv/locked.txt create mode 100644 inc/lang/lv/login.txt create mode 100644 inc/lang/lv/mailtext.txt create mode 100644 inc/lang/lv/mailwrap.html create mode 100644 inc/lang/lv/newpage.txt create mode 100644 inc/lang/lv/norev.txt create mode 100644 inc/lang/lv/password.txt create mode 100644 inc/lang/lv/preview.txt create mode 100644 inc/lang/lv/pwconfirm.txt create mode 100644 inc/lang/lv/read.txt create mode 100644 inc/lang/lv/recent.txt create mode 100644 inc/lang/lv/register.txt create mode 100644 inc/lang/lv/registermail.txt create mode 100644 inc/lang/lv/resendpwd.txt create mode 100644 inc/lang/lv/resetpwd.txt create mode 100644 inc/lang/lv/revisions.txt create mode 100644 inc/lang/lv/searchpage.txt create mode 100644 inc/lang/lv/showrev.txt create mode 100644 inc/lang/lv/stopwords.txt create mode 100644 inc/lang/lv/subscr_digest.txt create mode 100644 inc/lang/lv/subscr_form.txt create mode 100644 inc/lang/lv/subscr_list.txt create mode 100644 inc/lang/lv/subscr_single.txt create mode 100644 inc/lang/lv/updateprofile.txt create mode 100644 inc/lang/lv/uploadmail.txt create mode 100644 inc/lang/mg/admin.txt create mode 100644 inc/lang/mg/backlinks.txt create mode 100644 inc/lang/mg/conflict.txt create mode 100644 inc/lang/mg/denied.txt create mode 100644 inc/lang/mg/diff.txt create mode 100644 inc/lang/mg/edit.txt create mode 100644 inc/lang/mg/editrev.txt create mode 100644 inc/lang/mg/index.txt create mode 100644 inc/lang/mg/lang.php create mode 100644 inc/lang/mg/locked.txt create mode 100644 inc/lang/mg/login.txt create mode 100644 inc/lang/mg/mailtext.txt create mode 100644 inc/lang/mg/newpage.txt create mode 100644 inc/lang/mg/norev.txt create mode 100644 inc/lang/mg/password.txt create mode 100644 inc/lang/mg/preview.txt create mode 100644 inc/lang/mg/read.txt create mode 100644 inc/lang/mg/recent.txt create mode 100644 inc/lang/mg/register.txt create mode 100644 inc/lang/mg/revisions.txt create mode 100644 inc/lang/mg/searchpage.txt create mode 100644 inc/lang/mg/showrev.txt create mode 100644 inc/lang/mk/adminplugins.txt create mode 100644 inc/lang/mk/jquery.ui.datepicker.js create mode 100644 inc/lang/mk/lang.php create mode 100644 inc/lang/mk/read.txt create mode 100644 inc/lang/mk/recent.txt create mode 100644 inc/lang/mk/showrev.txt create mode 100644 inc/lang/ml/admin.txt create mode 100644 inc/lang/ml/jquery.ui.datepicker.js create mode 100644 inc/lang/mr/admin.txt create mode 100644 inc/lang/mr/backlinks.txt create mode 100644 inc/lang/mr/conflict.txt create mode 100644 inc/lang/mr/denied.txt create mode 100644 inc/lang/mr/diff.txt create mode 100644 inc/lang/mr/draft.txt create mode 100644 inc/lang/mr/edit.txt create mode 100644 inc/lang/mr/editrev.txt create mode 100644 inc/lang/mr/index.txt create mode 100644 inc/lang/mr/install.html create mode 100644 inc/lang/mr/lang.php create mode 100644 inc/lang/mr/locked.txt create mode 100644 inc/lang/mr/login.txt create mode 100644 inc/lang/mr/mailtext.txt create mode 100644 inc/lang/mr/newpage.txt create mode 100644 inc/lang/mr/norev.txt create mode 100644 inc/lang/mr/password.txt create mode 100644 inc/lang/mr/preview.txt create mode 100644 inc/lang/mr/pwconfirm.txt create mode 100644 inc/lang/mr/read.txt create mode 100644 inc/lang/mr/recent.txt create mode 100644 inc/lang/mr/register.txt create mode 100644 inc/lang/mr/registermail.txt create mode 100644 inc/lang/mr/resendpwd.txt create mode 100644 inc/lang/mr/revisions.txt create mode 100644 inc/lang/mr/searchpage.txt create mode 100644 inc/lang/mr/showrev.txt create mode 100644 inc/lang/mr/stopwords.txt create mode 100644 inc/lang/mr/updateprofile.txt create mode 100644 inc/lang/mr/uploadmail.txt create mode 100644 inc/lang/ms/jquery.ui.datepicker.js create mode 100644 inc/lang/ms/lang.php create mode 100644 inc/lang/nan/lang.php create mode 100644 inc/lang/ne/admin.txt create mode 100644 inc/lang/ne/adminplugins.txt create mode 100644 inc/lang/ne/backlinks.txt create mode 100644 inc/lang/ne/conflict.txt create mode 100644 inc/lang/ne/denied.txt create mode 100644 inc/lang/ne/diff.txt create mode 100644 inc/lang/ne/draft.txt create mode 100644 inc/lang/ne/edit.txt create mode 100644 inc/lang/ne/editrev.txt create mode 100644 inc/lang/ne/index.txt create mode 100644 inc/lang/ne/lang.php create mode 100644 inc/lang/ne/locked.txt create mode 100644 inc/lang/ne/norev.txt create mode 100644 inc/lang/ne/pwconfirm.txt create mode 100644 inc/lang/ne/read.txt create mode 100644 inc/lang/ne/recent.txt create mode 100644 inc/lang/ne/resendpwd.txt create mode 100644 inc/lang/ne/searchpage.txt create mode 100644 inc/lang/ne/showrev.txt create mode 100644 inc/lang/ne/updateprofile.txt create mode 100644 inc/lang/ne/uploadmail.txt create mode 100644 inc/lang/nl/admin.txt create mode 100644 inc/lang/nl/adminplugins.txt create mode 100644 inc/lang/nl/backlinks.txt create mode 100644 inc/lang/nl/conflict.txt create mode 100644 inc/lang/nl/denied.txt create mode 100644 inc/lang/nl/diff.txt create mode 100644 inc/lang/nl/draft.txt create mode 100644 inc/lang/nl/edit.txt create mode 100644 inc/lang/nl/editrev.txt create mode 100644 inc/lang/nl/index.txt create mode 100644 inc/lang/nl/install.html create mode 100644 inc/lang/nl/jquery.ui.datepicker.js create mode 100644 inc/lang/nl/lang.php create mode 100644 inc/lang/nl/locked.txt create mode 100644 inc/lang/nl/login.txt create mode 100644 inc/lang/nl/mailtext.txt create mode 100644 inc/lang/nl/mailwrap.html create mode 100644 inc/lang/nl/newpage.txt create mode 100644 inc/lang/nl/norev.txt create mode 100644 inc/lang/nl/onceexisted.txt create mode 100644 inc/lang/nl/password.txt create mode 100644 inc/lang/nl/preview.txt create mode 100644 inc/lang/nl/pwconfirm.txt create mode 100644 inc/lang/nl/read.txt create mode 100644 inc/lang/nl/recent.txt create mode 100644 inc/lang/nl/register.txt create mode 100644 inc/lang/nl/registermail.txt create mode 100644 inc/lang/nl/resendpwd.txt create mode 100644 inc/lang/nl/resetpwd.txt create mode 100644 inc/lang/nl/revisions.txt create mode 100644 inc/lang/nl/searchpage.txt create mode 100644 inc/lang/nl/showrev.txt create mode 100644 inc/lang/nl/stopwords.txt create mode 100644 inc/lang/nl/subscr_digest.txt create mode 100644 inc/lang/nl/subscr_form.txt create mode 100644 inc/lang/nl/subscr_list.txt create mode 100644 inc/lang/nl/subscr_single.txt create mode 100644 inc/lang/nl/updateprofile.txt create mode 100644 inc/lang/nl/uploadmail.txt create mode 100644 inc/lang/no/admin.txt create mode 100644 inc/lang/no/adminplugins.txt create mode 100644 inc/lang/no/backlinks.txt create mode 100644 inc/lang/no/conflict.txt create mode 100644 inc/lang/no/denied.txt create mode 100644 inc/lang/no/diff.txt create mode 100644 inc/lang/no/draft.txt create mode 100644 inc/lang/no/edit.txt create mode 100644 inc/lang/no/editrev.txt create mode 100644 inc/lang/no/index.txt create mode 100644 inc/lang/no/install.html create mode 100644 inc/lang/no/jquery.ui.datepicker.js create mode 100644 inc/lang/no/lang.php create mode 100644 inc/lang/no/locked.txt create mode 100644 inc/lang/no/login.txt create mode 100644 inc/lang/no/mailtext.txt create mode 100644 inc/lang/no/newpage.txt create mode 100644 inc/lang/no/norev.txt create mode 100644 inc/lang/no/password.txt create mode 100644 inc/lang/no/preview.txt create mode 100644 inc/lang/no/pwconfirm.txt create mode 100644 inc/lang/no/read.txt create mode 100644 inc/lang/no/recent.txt create mode 100644 inc/lang/no/register.txt create mode 100644 inc/lang/no/registermail.txt create mode 100644 inc/lang/no/resendpwd.txt create mode 100644 inc/lang/no/resetpwd.txt create mode 100644 inc/lang/no/revisions.txt create mode 100644 inc/lang/no/searchpage.txt create mode 100644 inc/lang/no/showrev.txt create mode 100644 inc/lang/no/stopwords.txt create mode 100644 inc/lang/no/subscr_digest.txt create mode 100644 inc/lang/no/subscr_form.txt create mode 100644 inc/lang/no/subscr_list.txt create mode 100644 inc/lang/no/subscr_single.txt create mode 100644 inc/lang/no/updateprofile.txt create mode 100644 inc/lang/no/uploadmail.txt create mode 100644 inc/lang/oc/admin.txt create mode 100644 inc/lang/oc/adminplugins.txt create mode 100644 inc/lang/oc/backlinks.txt create mode 100644 inc/lang/oc/conflict.txt create mode 100644 inc/lang/oc/denied.txt create mode 100644 inc/lang/oc/diff.txt create mode 100644 inc/lang/oc/index.txt create mode 100644 inc/lang/oc/lang.php create mode 100644 inc/lang/pl/admin.txt create mode 100644 inc/lang/pl/adminplugins.txt create mode 100644 inc/lang/pl/backlinks.txt create mode 100644 inc/lang/pl/conflict.txt create mode 100644 inc/lang/pl/denied.txt create mode 100644 inc/lang/pl/diff.txt create mode 100644 inc/lang/pl/draft.txt create mode 100644 inc/lang/pl/edit.txt create mode 100644 inc/lang/pl/editrev.txt create mode 100644 inc/lang/pl/index.txt create mode 100644 inc/lang/pl/install.html create mode 100644 inc/lang/pl/jquery.ui.datepicker.js create mode 100644 inc/lang/pl/lang.php create mode 100644 inc/lang/pl/locked.txt create mode 100644 inc/lang/pl/login.txt create mode 100644 inc/lang/pl/mailtext.txt create mode 100644 inc/lang/pl/mailwrap.html create mode 100644 inc/lang/pl/newpage.txt create mode 100644 inc/lang/pl/norev.txt create mode 100644 inc/lang/pl/onceexisted.txt create mode 100644 inc/lang/pl/password.txt create mode 100644 inc/lang/pl/preview.txt create mode 100644 inc/lang/pl/pwconfirm.txt create mode 100644 inc/lang/pl/read.txt create mode 100644 inc/lang/pl/recent.txt create mode 100644 inc/lang/pl/register.txt create mode 100644 inc/lang/pl/registermail.txt create mode 100644 inc/lang/pl/resendpwd.txt create mode 100644 inc/lang/pl/resetpwd.txt create mode 100644 inc/lang/pl/revisions.txt create mode 100644 inc/lang/pl/searchpage.txt create mode 100644 inc/lang/pl/showrev.txt create mode 100644 inc/lang/pl/stopwords.txt create mode 100644 inc/lang/pl/subscr_digest.txt create mode 100644 inc/lang/pl/subscr_form.txt create mode 100644 inc/lang/pl/subscr_list.txt create mode 100644 inc/lang/pl/subscr_single.txt create mode 100644 inc/lang/pl/updateprofile.txt create mode 100644 inc/lang/pl/uploadmail.txt create mode 100644 inc/lang/pt-br/admin.txt create mode 100644 inc/lang/pt-br/adminplugins.txt create mode 100644 inc/lang/pt-br/backlinks.txt create mode 100644 inc/lang/pt-br/conflict.txt create mode 100644 inc/lang/pt-br/denied.txt create mode 100644 inc/lang/pt-br/diff.txt create mode 100644 inc/lang/pt-br/draft.txt create mode 100644 inc/lang/pt-br/edit.txt create mode 100644 inc/lang/pt-br/editrev.txt create mode 100644 inc/lang/pt-br/index.txt create mode 100644 inc/lang/pt-br/install.html create mode 100644 inc/lang/pt-br/jquery.ui.datepicker.js create mode 100644 inc/lang/pt-br/lang.php create mode 100644 inc/lang/pt-br/locked.txt create mode 100644 inc/lang/pt-br/login.txt create mode 100644 inc/lang/pt-br/mailtext.txt create mode 100644 inc/lang/pt-br/mailwrap.html create mode 100644 inc/lang/pt-br/newpage.txt create mode 100644 inc/lang/pt-br/norev.txt create mode 100644 inc/lang/pt-br/onceexisted.txt create mode 100644 inc/lang/pt-br/password.txt create mode 100644 inc/lang/pt-br/preview.txt create mode 100644 inc/lang/pt-br/pwconfirm.txt create mode 100644 inc/lang/pt-br/read.txt create mode 100644 inc/lang/pt-br/recent.txt create mode 100644 inc/lang/pt-br/register.txt create mode 100644 inc/lang/pt-br/registermail.txt create mode 100644 inc/lang/pt-br/resendpwd.txt create mode 100644 inc/lang/pt-br/resetpwd.txt create mode 100644 inc/lang/pt-br/revisions.txt create mode 100644 inc/lang/pt-br/searchpage.txt create mode 100644 inc/lang/pt-br/showrev.txt create mode 100644 inc/lang/pt-br/stopwords.txt create mode 100644 inc/lang/pt-br/subscr_digest.txt create mode 100644 inc/lang/pt-br/subscr_form.txt create mode 100644 inc/lang/pt-br/subscr_list.txt create mode 100644 inc/lang/pt-br/subscr_single.txt create mode 100644 inc/lang/pt-br/updateprofile.txt create mode 100644 inc/lang/pt-br/uploadmail.txt create mode 100644 inc/lang/pt/admin.txt create mode 100644 inc/lang/pt/adminplugins.txt create mode 100644 inc/lang/pt/backlinks.txt create mode 100644 inc/lang/pt/conflict.txt create mode 100644 inc/lang/pt/denied.txt create mode 100644 inc/lang/pt/diff.txt create mode 100644 inc/lang/pt/draft.txt create mode 100644 inc/lang/pt/edit.txt create mode 100644 inc/lang/pt/editrev.txt create mode 100644 inc/lang/pt/index.txt create mode 100644 inc/lang/pt/install.html create mode 100644 inc/lang/pt/jquery.ui.datepicker.js create mode 100644 inc/lang/pt/lang.php create mode 100644 inc/lang/pt/locked.txt create mode 100644 inc/lang/pt/login.txt create mode 100644 inc/lang/pt/mailtext.txt create mode 100644 inc/lang/pt/newpage.txt create mode 100644 inc/lang/pt/norev.txt create mode 100644 inc/lang/pt/onceexisted.txt create mode 100644 inc/lang/pt/password.txt create mode 100644 inc/lang/pt/preview.txt create mode 100644 inc/lang/pt/pwconfirm.txt create mode 100644 inc/lang/pt/read.txt create mode 100644 inc/lang/pt/recent.txt create mode 100644 inc/lang/pt/register.txt create mode 100644 inc/lang/pt/registermail.txt create mode 100644 inc/lang/pt/resendpwd.txt create mode 100644 inc/lang/pt/resetpwd.txt create mode 100644 inc/lang/pt/revisions.txt create mode 100644 inc/lang/pt/searchpage.txt create mode 100644 inc/lang/pt/showrev.txt create mode 100644 inc/lang/pt/stopwords.txt create mode 100644 inc/lang/pt/subscr_digest.txt create mode 100644 inc/lang/pt/subscr_form.txt create mode 100644 inc/lang/pt/subscr_list.txt create mode 100644 inc/lang/pt/subscr_single.txt create mode 100644 inc/lang/pt/updateprofile.txt create mode 100644 inc/lang/pt/uploadmail.txt create mode 100644 inc/lang/ro/admin.txt create mode 100644 inc/lang/ro/adminplugins.txt create mode 100644 inc/lang/ro/backlinks.txt create mode 100644 inc/lang/ro/conflict.txt create mode 100644 inc/lang/ro/denied.txt create mode 100644 inc/lang/ro/diff.txt create mode 100644 inc/lang/ro/draft.txt create mode 100644 inc/lang/ro/edit.txt create mode 100644 inc/lang/ro/editrev.txt create mode 100644 inc/lang/ro/index.txt create mode 100644 inc/lang/ro/install.html create mode 100644 inc/lang/ro/jquery.ui.datepicker.js create mode 100644 inc/lang/ro/lang.php create mode 100644 inc/lang/ro/locked.txt create mode 100644 inc/lang/ro/login.txt create mode 100644 inc/lang/ro/mailtext.txt create mode 100644 inc/lang/ro/newpage.txt create mode 100644 inc/lang/ro/norev.txt create mode 100644 inc/lang/ro/onceexisted.txt create mode 100644 inc/lang/ro/password.txt create mode 100644 inc/lang/ro/preview.txt create mode 100644 inc/lang/ro/pwconfirm.txt create mode 100644 inc/lang/ro/read.txt create mode 100644 inc/lang/ro/recent.txt create mode 100644 inc/lang/ro/register.txt create mode 100644 inc/lang/ro/registermail.txt create mode 100644 inc/lang/ro/resendpwd.txt create mode 100644 inc/lang/ro/resetpwd.txt create mode 100644 inc/lang/ro/revisions.txt create mode 100644 inc/lang/ro/searchpage.txt create mode 100644 inc/lang/ro/showrev.txt create mode 100644 inc/lang/ro/stopwords.txt create mode 100644 inc/lang/ro/subscr_digest.txt create mode 100644 inc/lang/ro/subscr_form.txt create mode 100644 inc/lang/ro/subscr_list.txt create mode 100644 inc/lang/ro/subscr_single.txt create mode 100644 inc/lang/ro/updateprofile.txt create mode 100644 inc/lang/ro/uploadmail.txt create mode 100644 inc/lang/ru/admin.txt create mode 100644 inc/lang/ru/adminplugins.txt create mode 100644 inc/lang/ru/backlinks.txt create mode 100644 inc/lang/ru/conflict.txt create mode 100644 inc/lang/ru/denied.txt create mode 100644 inc/lang/ru/diff.txt create mode 100644 inc/lang/ru/draft.txt create mode 100644 inc/lang/ru/edit.txt create mode 100644 inc/lang/ru/editrev.txt create mode 100644 inc/lang/ru/index.txt create mode 100644 inc/lang/ru/install.html create mode 100644 inc/lang/ru/jquery.ui.datepicker.js create mode 100644 inc/lang/ru/lang.php create mode 100644 inc/lang/ru/locked.txt create mode 100644 inc/lang/ru/login.txt create mode 100644 inc/lang/ru/mailtext.txt create mode 100644 inc/lang/ru/newpage.txt create mode 100644 inc/lang/ru/norev.txt create mode 100644 inc/lang/ru/onceexisted.txt create mode 100644 inc/lang/ru/password.txt create mode 100644 inc/lang/ru/preview.txt create mode 100644 inc/lang/ru/pwconfirm.txt create mode 100644 inc/lang/ru/read.txt create mode 100644 inc/lang/ru/recent.txt create mode 100644 inc/lang/ru/register.txt create mode 100644 inc/lang/ru/registermail.txt create mode 100644 inc/lang/ru/resendpwd.txt create mode 100644 inc/lang/ru/resetpwd.txt create mode 100644 inc/lang/ru/revisions.txt create mode 100644 inc/lang/ru/searchpage.txt create mode 100644 inc/lang/ru/showrev.txt create mode 100644 inc/lang/ru/stopwords.txt create mode 100644 inc/lang/ru/subscr_digest.txt create mode 100644 inc/lang/ru/subscr_form.txt create mode 100644 inc/lang/ru/subscr_list.txt create mode 100644 inc/lang/ru/subscr_single.txt create mode 100644 inc/lang/ru/updateprofile.txt create mode 100644 inc/lang/ru/uploadmail.txt create mode 100644 inc/lang/si/admin.txt create mode 100644 inc/lang/si/adminplugins.txt create mode 100644 inc/lang/si/backlinks.txt create mode 100644 inc/lang/si/conflict.txt create mode 100644 inc/lang/si/denied.txt create mode 100644 inc/lang/si/diff.txt create mode 100644 inc/lang/si/draft.txt create mode 100644 inc/lang/si/index.txt create mode 100644 inc/lang/si/lang.php create mode 100644 inc/lang/sk/admin.txt create mode 100644 inc/lang/sk/adminplugins.txt create mode 100644 inc/lang/sk/backlinks.txt create mode 100644 inc/lang/sk/conflict.txt create mode 100644 inc/lang/sk/denied.txt create mode 100644 inc/lang/sk/diff.txt create mode 100644 inc/lang/sk/draft.txt create mode 100644 inc/lang/sk/edit.txt create mode 100644 inc/lang/sk/editrev.txt create mode 100644 inc/lang/sk/index.txt create mode 100644 inc/lang/sk/install.html create mode 100644 inc/lang/sk/jquery.ui.datepicker.js create mode 100644 inc/lang/sk/lang.php create mode 100644 inc/lang/sk/locked.txt create mode 100644 inc/lang/sk/login.txt create mode 100644 inc/lang/sk/mailtext.txt create mode 100644 inc/lang/sk/mailwrap.html create mode 100644 inc/lang/sk/newpage.txt create mode 100644 inc/lang/sk/norev.txt create mode 100644 inc/lang/sk/onceexisted.txt create mode 100644 inc/lang/sk/password.txt create mode 100644 inc/lang/sk/preview.txt create mode 100644 inc/lang/sk/pwconfirm.txt create mode 100644 inc/lang/sk/read.txt create mode 100644 inc/lang/sk/recent.txt create mode 100644 inc/lang/sk/register.txt create mode 100644 inc/lang/sk/registermail.txt create mode 100644 inc/lang/sk/resendpwd.txt create mode 100644 inc/lang/sk/resetpwd.txt create mode 100644 inc/lang/sk/revisions.txt create mode 100644 inc/lang/sk/searchpage.txt create mode 100644 inc/lang/sk/showrev.txt create mode 100644 inc/lang/sk/stopwords.txt create mode 100644 inc/lang/sk/subscr_digest.txt create mode 100644 inc/lang/sk/subscr_form.txt create mode 100644 inc/lang/sk/subscr_list.txt create mode 100644 inc/lang/sk/subscr_single.txt create mode 100644 inc/lang/sk/updateprofile.txt create mode 100644 inc/lang/sk/uploadmail.txt create mode 100644 inc/lang/sl/admin.txt create mode 100644 inc/lang/sl/adminplugins.txt create mode 100644 inc/lang/sl/backlinks.txt create mode 100644 inc/lang/sl/conflict.txt create mode 100644 inc/lang/sl/denied.txt create mode 100644 inc/lang/sl/diff.txt create mode 100644 inc/lang/sl/draft.txt create mode 100644 inc/lang/sl/edit.txt create mode 100644 inc/lang/sl/editrev.txt create mode 100644 inc/lang/sl/index.txt create mode 100644 inc/lang/sl/install.html create mode 100644 inc/lang/sl/jquery.ui.datepicker.js create mode 100644 inc/lang/sl/lang.php create mode 100644 inc/lang/sl/locked.txt create mode 100644 inc/lang/sl/login.txt create mode 100644 inc/lang/sl/mailtext.txt create mode 100644 inc/lang/sl/newpage.txt create mode 100644 inc/lang/sl/norev.txt create mode 100644 inc/lang/sl/password.txt create mode 100644 inc/lang/sl/preview.txt create mode 100644 inc/lang/sl/pwconfirm.txt create mode 100644 inc/lang/sl/read.txt create mode 100644 inc/lang/sl/recent.txt create mode 100644 inc/lang/sl/register.txt create mode 100644 inc/lang/sl/registermail.txt create mode 100644 inc/lang/sl/resendpwd.txt create mode 100644 inc/lang/sl/resetpwd.txt create mode 100644 inc/lang/sl/revisions.txt create mode 100644 inc/lang/sl/searchpage.txt create mode 100644 inc/lang/sl/showrev.txt create mode 100644 inc/lang/sl/stopwords.txt create mode 100644 inc/lang/sl/subscr_digest.txt create mode 100644 inc/lang/sl/subscr_form.txt create mode 100644 inc/lang/sl/subscr_list.txt create mode 100644 inc/lang/sl/subscr_single.txt create mode 100644 inc/lang/sl/updateprofile.txt create mode 100644 inc/lang/sl/uploadmail.txt create mode 100644 inc/lang/sq/admin.txt create mode 100644 inc/lang/sq/adminplugins.txt create mode 100644 inc/lang/sq/backlinks.txt create mode 100644 inc/lang/sq/conflict.txt create mode 100644 inc/lang/sq/denied.txt create mode 100644 inc/lang/sq/diff.txt create mode 100644 inc/lang/sq/draft.txt create mode 100644 inc/lang/sq/edit.txt create mode 100644 inc/lang/sq/editrev.txt create mode 100644 inc/lang/sq/index.txt create mode 100644 inc/lang/sq/install.html create mode 100644 inc/lang/sq/jquery.ui.datepicker.js create mode 100644 inc/lang/sq/lang.php create mode 100644 inc/lang/sq/locked.txt create mode 100644 inc/lang/sq/login.txt create mode 100644 inc/lang/sq/mailtext.txt create mode 100644 inc/lang/sq/newpage.txt create mode 100644 inc/lang/sq/norev.txt create mode 100644 inc/lang/sq/password.txt create mode 100644 inc/lang/sq/preview.txt create mode 100644 inc/lang/sq/pwconfirm.txt create mode 100644 inc/lang/sq/read.txt create mode 100644 inc/lang/sq/recent.txt create mode 100644 inc/lang/sq/register.txt create mode 100644 inc/lang/sq/registermail.txt create mode 100644 inc/lang/sq/resendpwd.txt create mode 100644 inc/lang/sq/revisions.txt create mode 100644 inc/lang/sq/searchpage.txt create mode 100644 inc/lang/sq/showrev.txt create mode 100644 inc/lang/sq/stopwords.txt create mode 100644 inc/lang/sq/subscr_digest.txt create mode 100644 inc/lang/sq/subscr_form.txt create mode 100644 inc/lang/sq/subscr_list.txt create mode 100644 inc/lang/sq/subscr_single.txt create mode 100644 inc/lang/sq/updateprofile.txt create mode 100644 inc/lang/sq/uploadmail.txt create mode 100644 inc/lang/sr/admin.txt create mode 100644 inc/lang/sr/adminplugins.txt create mode 100644 inc/lang/sr/backlinks.txt create mode 100644 inc/lang/sr/conflict.txt create mode 100644 inc/lang/sr/denied.txt create mode 100644 inc/lang/sr/diff.txt create mode 100644 inc/lang/sr/draft.txt create mode 100644 inc/lang/sr/edit.txt create mode 100644 inc/lang/sr/editrev.txt create mode 100644 inc/lang/sr/index.txt create mode 100644 inc/lang/sr/install.html create mode 100644 inc/lang/sr/jquery.ui.datepicker.js create mode 100644 inc/lang/sr/lang.php create mode 100644 inc/lang/sr/locked.txt create mode 100644 inc/lang/sr/login.txt create mode 100644 inc/lang/sr/mailtext.txt create mode 100644 inc/lang/sr/newpage.txt create mode 100644 inc/lang/sr/norev.txt create mode 100644 inc/lang/sr/onceexisted.txt create mode 100644 inc/lang/sr/password.txt create mode 100644 inc/lang/sr/preview.txt create mode 100644 inc/lang/sr/pwconfirm.txt create mode 100644 inc/lang/sr/read.txt create mode 100644 inc/lang/sr/recent.txt create mode 100644 inc/lang/sr/register.txt create mode 100644 inc/lang/sr/registermail.txt create mode 100644 inc/lang/sr/resendpwd.txt create mode 100644 inc/lang/sr/resetpwd.txt create mode 100644 inc/lang/sr/revisions.txt create mode 100644 inc/lang/sr/searchpage.txt create mode 100644 inc/lang/sr/showrev.txt create mode 100644 inc/lang/sr/stopwords.txt create mode 100644 inc/lang/sr/subscr_digest.txt create mode 100644 inc/lang/sr/subscr_form.txt create mode 100644 inc/lang/sr/subscr_list.txt create mode 100644 inc/lang/sr/subscr_single.txt create mode 100644 inc/lang/sr/updateprofile.txt create mode 100644 inc/lang/sr/uploadmail.txt create mode 100644 inc/lang/sv/admin.txt create mode 100644 inc/lang/sv/adminplugins.txt create mode 100644 inc/lang/sv/backlinks.txt create mode 100644 inc/lang/sv/conflict.txt create mode 100644 inc/lang/sv/denied.txt create mode 100644 inc/lang/sv/diff.txt create mode 100644 inc/lang/sv/draft.txt create mode 100644 inc/lang/sv/edit.txt create mode 100644 inc/lang/sv/editrev.txt create mode 100644 inc/lang/sv/index.txt create mode 100644 inc/lang/sv/install.html create mode 100644 inc/lang/sv/jquery.ui.datepicker.js create mode 100644 inc/lang/sv/lang.php create mode 100644 inc/lang/sv/locked.txt create mode 100644 inc/lang/sv/login.txt create mode 100644 inc/lang/sv/mailtext.txt create mode 100644 inc/lang/sv/mailwrap.html create mode 100644 inc/lang/sv/newpage.txt create mode 100644 inc/lang/sv/norev.txt create mode 100644 inc/lang/sv/onceexisted.txt create mode 100644 inc/lang/sv/password.txt create mode 100644 inc/lang/sv/preview.txt create mode 100644 inc/lang/sv/pwconfirm.txt create mode 100644 inc/lang/sv/read.txt create mode 100644 inc/lang/sv/recent.txt create mode 100644 inc/lang/sv/register.txt create mode 100644 inc/lang/sv/registermail.txt create mode 100644 inc/lang/sv/resendpwd.txt create mode 100644 inc/lang/sv/resetpwd.txt create mode 100644 inc/lang/sv/revisions.txt create mode 100644 inc/lang/sv/searchpage.txt create mode 100644 inc/lang/sv/showrev.txt create mode 100644 inc/lang/sv/stopwords.txt create mode 100644 inc/lang/sv/subscr_digest.txt create mode 100644 inc/lang/sv/subscr_form.txt create mode 100644 inc/lang/sv/subscr_list.txt create mode 100644 inc/lang/sv/subscr_single.txt create mode 100644 inc/lang/sv/updateprofile.txt create mode 100644 inc/lang/sv/uploadmail.txt create mode 100644 inc/lang/ta/admin.txt create mode 100644 inc/lang/ta/adminplugins.txt create mode 100644 inc/lang/ta/backlinks.txt create mode 100644 inc/lang/ta/conflict.txt create mode 100644 inc/lang/ta/denied.txt create mode 100644 inc/lang/ta/diff.txt create mode 100644 inc/lang/ta/draft.txt create mode 100644 inc/lang/ta/edit.txt create mode 100644 inc/lang/ta/jquery.ui.datepicker.js create mode 100644 inc/lang/ta/lang.php create mode 100644 inc/lang/th/admin.txt create mode 100644 inc/lang/th/adminplugins.txt create mode 100644 inc/lang/th/backlinks.txt create mode 100644 inc/lang/th/conflict.txt create mode 100644 inc/lang/th/denied.txt create mode 100644 inc/lang/th/diff.txt create mode 100644 inc/lang/th/draft.txt create mode 100644 inc/lang/th/edit.txt create mode 100644 inc/lang/th/editrev.txt create mode 100644 inc/lang/th/index.txt create mode 100644 inc/lang/th/jquery.ui.datepicker.js create mode 100644 inc/lang/th/lang.php create mode 100644 inc/lang/th/locked.txt create mode 100644 inc/lang/th/login.txt create mode 100644 inc/lang/th/mailtext.txt create mode 100644 inc/lang/th/newpage.txt create mode 100644 inc/lang/th/norev.txt create mode 100644 inc/lang/th/password.txt create mode 100644 inc/lang/th/preview.txt create mode 100644 inc/lang/th/pwconfirm.txt create mode 100644 inc/lang/th/read.txt create mode 100644 inc/lang/th/recent.txt create mode 100644 inc/lang/th/register.txt create mode 100644 inc/lang/th/registermail.txt create mode 100644 inc/lang/th/resendpwd.txt create mode 100644 inc/lang/th/revisions.txt create mode 100644 inc/lang/th/searchpage.txt create mode 100644 inc/lang/th/showrev.txt create mode 100644 inc/lang/th/updateprofile.txt create mode 100644 inc/lang/th/uploadmail.txt create mode 100644 inc/lang/tr/admin.txt create mode 100644 inc/lang/tr/adminplugins.txt create mode 100644 inc/lang/tr/backlinks.txt create mode 100644 inc/lang/tr/conflict.txt create mode 100644 inc/lang/tr/denied.txt create mode 100644 inc/lang/tr/diff.txt create mode 100644 inc/lang/tr/draft.txt create mode 100644 inc/lang/tr/edit.txt create mode 100644 inc/lang/tr/editrev.txt create mode 100644 inc/lang/tr/index.txt create mode 100644 inc/lang/tr/install.html create mode 100644 inc/lang/tr/jquery.ui.datepicker.js create mode 100644 inc/lang/tr/lang.php create mode 100644 inc/lang/tr/locked.txt create mode 100644 inc/lang/tr/login.txt create mode 100644 inc/lang/tr/mailtext.txt create mode 100644 inc/lang/tr/newpage.txt create mode 100644 inc/lang/tr/norev.txt create mode 100644 inc/lang/tr/password.txt create mode 100644 inc/lang/tr/preview.txt create mode 100644 inc/lang/tr/pwconfirm.txt create mode 100644 inc/lang/tr/read.txt create mode 100644 inc/lang/tr/recent.txt create mode 100644 inc/lang/tr/register.txt create mode 100644 inc/lang/tr/registermail.txt create mode 100644 inc/lang/tr/resendpwd.txt create mode 100644 inc/lang/tr/resetpwd.txt create mode 100644 inc/lang/tr/revisions.txt create mode 100644 inc/lang/tr/searchpage.txt create mode 100644 inc/lang/tr/showrev.txt create mode 100644 inc/lang/tr/stopwords.txt create mode 100644 inc/lang/tr/subscr_form.txt create mode 100644 inc/lang/tr/updateprofile.txt create mode 100644 inc/lang/tr/uploadmail.txt create mode 100644 inc/lang/uk/admin.txt create mode 100644 inc/lang/uk/adminplugins.txt create mode 100644 inc/lang/uk/backlinks.txt create mode 100644 inc/lang/uk/conflict.txt create mode 100644 inc/lang/uk/denied.txt create mode 100644 inc/lang/uk/diff.txt create mode 100644 inc/lang/uk/draft.txt create mode 100644 inc/lang/uk/edit.txt create mode 100644 inc/lang/uk/editrev.txt create mode 100644 inc/lang/uk/index.txt create mode 100644 inc/lang/uk/install.html create mode 100644 inc/lang/uk/jquery.ui.datepicker.js create mode 100644 inc/lang/uk/lang.php create mode 100644 inc/lang/uk/locked.txt create mode 100644 inc/lang/uk/login.txt create mode 100644 inc/lang/uk/mailtext.txt create mode 100644 inc/lang/uk/newpage.txt create mode 100644 inc/lang/uk/norev.txt create mode 100644 inc/lang/uk/password.txt create mode 100644 inc/lang/uk/preview.txt create mode 100644 inc/lang/uk/pwconfirm.txt create mode 100644 inc/lang/uk/read.txt create mode 100644 inc/lang/uk/recent.txt create mode 100644 inc/lang/uk/register.txt create mode 100644 inc/lang/uk/registermail.txt create mode 100644 inc/lang/uk/resendpwd.txt create mode 100644 inc/lang/uk/resetpwd.txt create mode 100644 inc/lang/uk/revisions.txt create mode 100644 inc/lang/uk/searchpage.txt create mode 100644 inc/lang/uk/showrev.txt create mode 100644 inc/lang/uk/stopwords.txt create mode 100644 inc/lang/uk/subscr_digest.txt create mode 100644 inc/lang/uk/subscr_form.txt create mode 100644 inc/lang/uk/subscr_list.txt create mode 100644 inc/lang/uk/subscr_single.txt create mode 100644 inc/lang/uk/updateprofile.txt create mode 100644 inc/lang/uk/uploadmail.txt create mode 100644 inc/lang/uz/admin.txt create mode 100644 inc/lang/uz/adminplugins.txt create mode 100644 inc/lang/uz/conflict.txt create mode 100644 inc/lang/uz/denied.txt create mode 100644 inc/lang/uz/diff.txt create mode 100644 inc/lang/uz/index.txt create mode 100644 inc/lang/uz/lang.php create mode 100644 inc/lang/vi/admin.txt create mode 100644 inc/lang/vi/adminplugins.txt create mode 100644 inc/lang/vi/backlinks.txt create mode 100644 inc/lang/vi/conflict.txt create mode 100644 inc/lang/vi/denied.txt create mode 100644 inc/lang/vi/diff.txt create mode 100644 inc/lang/vi/draft.txt create mode 100644 inc/lang/vi/edit.txt create mode 100644 inc/lang/vi/editrev.txt create mode 100644 inc/lang/vi/index.txt create mode 100644 inc/lang/vi/jquery.ui.datepicker.js create mode 100644 inc/lang/vi/lang.php create mode 100644 inc/lang/vi/locked.txt create mode 100644 inc/lang/vi/login.txt create mode 100644 inc/lang/vi/mailtext.txt create mode 100644 inc/lang/vi/newpage.txt create mode 100644 inc/lang/vi/norev.txt create mode 100644 inc/lang/vi/onceexisted.txt create mode 100644 inc/lang/vi/password.txt create mode 100644 inc/lang/vi/preview.txt create mode 100644 inc/lang/vi/pwconfirm.txt create mode 100644 inc/lang/vi/read.txt create mode 100644 inc/lang/vi/recent.txt create mode 100644 inc/lang/vi/register.txt create mode 100644 inc/lang/vi/registermail.txt create mode 100644 inc/lang/vi/resendpwd.txt create mode 100644 inc/lang/vi/resetpwd.txt create mode 100644 inc/lang/vi/revisions.txt create mode 100644 inc/lang/vi/searchpage.txt create mode 100644 inc/lang/vi/showrev.txt create mode 100644 inc/lang/vi/stopwords.txt create mode 100644 inc/lang/vi/subscr_digest.txt create mode 100644 inc/lang/vi/subscr_form.txt create mode 100644 inc/lang/vi/subscr_list.txt create mode 100644 inc/lang/vi/subscr_single.txt create mode 100644 inc/lang/vi/updateprofile.txt create mode 100644 inc/lang/vi/uploadmail.txt create mode 100644 inc/lang/zh-tw/admin.txt create mode 100644 inc/lang/zh-tw/adminplugins.txt create mode 100644 inc/lang/zh-tw/backlinks.txt create mode 100644 inc/lang/zh-tw/conflict.txt create mode 100644 inc/lang/zh-tw/denied.txt create mode 100644 inc/lang/zh-tw/diff.txt create mode 100644 inc/lang/zh-tw/draft.txt create mode 100644 inc/lang/zh-tw/edit.txt create mode 100644 inc/lang/zh-tw/editrev.txt create mode 100644 inc/lang/zh-tw/index.txt create mode 100644 inc/lang/zh-tw/install.html create mode 100644 inc/lang/zh-tw/jquery.ui.datepicker.js create mode 100644 inc/lang/zh-tw/lang.php create mode 100644 inc/lang/zh-tw/locked.txt create mode 100644 inc/lang/zh-tw/login.txt create mode 100644 inc/lang/zh-tw/mailtext.txt create mode 100644 inc/lang/zh-tw/mailwrap.html create mode 100644 inc/lang/zh-tw/newpage.txt create mode 100644 inc/lang/zh-tw/norev.txt create mode 100644 inc/lang/zh-tw/onceexisted.txt create mode 100644 inc/lang/zh-tw/password.txt create mode 100644 inc/lang/zh-tw/preview.txt create mode 100644 inc/lang/zh-tw/pwconfirm.txt create mode 100644 inc/lang/zh-tw/read.txt create mode 100644 inc/lang/zh-tw/recent.txt create mode 100644 inc/lang/zh-tw/register.txt create mode 100644 inc/lang/zh-tw/registermail.txt create mode 100644 inc/lang/zh-tw/resendpwd.txt create mode 100644 inc/lang/zh-tw/resetpwd.txt create mode 100644 inc/lang/zh-tw/revisions.txt create mode 100644 inc/lang/zh-tw/searchpage.txt create mode 100644 inc/lang/zh-tw/showrev.txt create mode 100644 inc/lang/zh-tw/stopwords.txt create mode 100644 inc/lang/zh-tw/subscr_digest.txt create mode 100644 inc/lang/zh-tw/subscr_form.txt create mode 100644 inc/lang/zh-tw/subscr_list.txt create mode 100644 inc/lang/zh-tw/subscr_single.txt create mode 100644 inc/lang/zh-tw/updateprofile.txt create mode 100644 inc/lang/zh-tw/uploadmail.txt create mode 100644 inc/lang/zh/admin.txt create mode 100644 inc/lang/zh/adminplugins.txt create mode 100644 inc/lang/zh/backlinks.txt create mode 100644 inc/lang/zh/conflict.txt create mode 100644 inc/lang/zh/denied.txt create mode 100644 inc/lang/zh/diff.txt create mode 100644 inc/lang/zh/draft.txt create mode 100644 inc/lang/zh/edit.txt create mode 100644 inc/lang/zh/editrev.txt create mode 100644 inc/lang/zh/index.txt create mode 100644 inc/lang/zh/install.html create mode 100644 inc/lang/zh/jquery.ui.datepicker.js create mode 100644 inc/lang/zh/lang.php create mode 100644 inc/lang/zh/locked.txt create mode 100644 inc/lang/zh/login.txt create mode 100644 inc/lang/zh/mailtext.txt create mode 100644 inc/lang/zh/mailwrap.html create mode 100644 inc/lang/zh/newpage.txt create mode 100644 inc/lang/zh/norev.txt create mode 100644 inc/lang/zh/onceexisted.txt create mode 100644 inc/lang/zh/password.txt create mode 100644 inc/lang/zh/preview.txt create mode 100644 inc/lang/zh/pwconfirm.txt create mode 100644 inc/lang/zh/read.txt create mode 100644 inc/lang/zh/recent.txt create mode 100644 inc/lang/zh/register.txt create mode 100644 inc/lang/zh/registermail.txt create mode 100644 inc/lang/zh/resendpwd.txt create mode 100644 inc/lang/zh/resetpwd.txt create mode 100644 inc/lang/zh/revisions.txt create mode 100644 inc/lang/zh/searchpage.txt create mode 100644 inc/lang/zh/showrev.txt create mode 100644 inc/lang/zh/stopwords.txt create mode 100644 inc/lang/zh/subscr_digest.txt create mode 100644 inc/lang/zh/subscr_form.txt create mode 100644 inc/lang/zh/subscr_list.txt create mode 100644 inc/lang/zh/subscr_single.txt create mode 100644 inc/lang/zh/updateprofile.txt create mode 100644 inc/lang/zh/uploadmail.txt create mode 100644 inc/legacy.php create mode 100644 inc/load.php create mode 100644 inc/mail.php create mode 100644 inc/media.php create mode 100644 inc/pageutils.php create mode 100644 inc/parser/code.php create mode 100644 inc/parser/handler.php create mode 100644 inc/parser/metadata.php create mode 100644 inc/parser/parser.php create mode 100644 inc/parser/renderer.php create mode 100644 inc/parser/xhtml.php create mode 100644 inc/parser/xhtmlsummary.php create mode 100644 inc/parserutils.php create mode 100644 inc/pluginutils.php create mode 100644 inc/preload.php.dist create mode 100644 inc/search.php create mode 100644 inc/template.php create mode 100644 inc/toolbar.php create mode 100644 inc/utf8.php create mode 100644 index.php create mode 100644 lib/exe/ajax.php create mode 100644 lib/exe/css.php create mode 100644 lib/exe/detail.php create mode 100644 lib/exe/fetch.php create mode 100644 lib/exe/index.html create mode 100644 lib/exe/indexer.php create mode 100644 lib/exe/jquery.php create mode 100644 lib/exe/js.php create mode 100644 lib/exe/jsonrpc.php create mode 100644 lib/exe/manifest.php create mode 100644 lib/exe/mediamanager.php create mode 100644 lib/exe/openapi.php create mode 100644 lib/exe/opensearch.php create mode 100644 lib/exe/taskrunner.php create mode 100644 lib/exe/xmlrpc.php create mode 100644 lib/images/_deprecated.txt create mode 100644 lib/images/admin/acl.png create mode 100644 lib/images/admin/config.png create mode 100644 lib/images/admin/plugin.png create mode 100644 lib/images/admin/popularity.png create mode 100644 lib/images/admin/revert.png create mode 100644 lib/images/admin/styling.png create mode 100644 lib/images/admin/usermanager.png create mode 100644 lib/images/blank.gif create mode 100644 lib/images/bullet.png create mode 100644 lib/images/closed-rtl.png create mode 100644 lib/images/closed.png create mode 100644 lib/images/diff.png create mode 100644 lib/images/email.png create mode 100644 lib/images/email.svg create mode 100644 lib/images/error.png create mode 100644 lib/images/external-link.png create mode 100644 lib/images/external-link.svg create mode 100644 lib/images/fileicons/32x32/7z.png create mode 100644 lib/images/fileicons/32x32/asm.png create mode 100644 lib/images/fileicons/32x32/bash.png create mode 100644 lib/images/fileicons/32x32/bz2.png create mode 100644 lib/images/fileicons/32x32/c.png create mode 100644 lib/images/fileicons/32x32/cc.png create mode 100644 lib/images/fileicons/32x32/conf.png create mode 100644 lib/images/fileicons/32x32/cpp.png create mode 100644 lib/images/fileicons/32x32/cs.png create mode 100644 lib/images/fileicons/32x32/csh.png create mode 100644 lib/images/fileicons/32x32/css.png create mode 100644 lib/images/fileicons/32x32/csv.png create mode 100644 lib/images/fileicons/32x32/deb.png create mode 100644 lib/images/fileicons/32x32/diff.png create mode 100644 lib/images/fileicons/32x32/doc.png create mode 100644 lib/images/fileicons/32x32/docx.png create mode 100644 lib/images/fileicons/32x32/file.png create mode 100644 lib/images/fileicons/32x32/gif.png create mode 100644 lib/images/fileicons/32x32/gz.png create mode 100644 lib/images/fileicons/32x32/h.png create mode 100644 lib/images/fileicons/32x32/hpp.png create mode 100644 lib/images/fileicons/32x32/htm.png create mode 100644 lib/images/fileicons/32x32/html.png create mode 100644 lib/images/fileicons/32x32/ico.png create mode 100644 lib/images/fileicons/32x32/java.png create mode 100644 lib/images/fileicons/32x32/jpeg.png create mode 100644 lib/images/fileicons/32x32/jpg.png create mode 100644 lib/images/fileicons/32x32/js.png create mode 100644 lib/images/fileicons/32x32/json.png create mode 100644 lib/images/fileicons/32x32/lua.png create mode 100644 lib/images/fileicons/32x32/mp3.png create mode 100644 lib/images/fileicons/32x32/mp4.png create mode 100644 lib/images/fileicons/32x32/odc.png create mode 100644 lib/images/fileicons/32x32/odf.png create mode 100644 lib/images/fileicons/32x32/odg.png create mode 100644 lib/images/fileicons/32x32/odi.png create mode 100644 lib/images/fileicons/32x32/odp.png create mode 100644 lib/images/fileicons/32x32/ods.png create mode 100644 lib/images/fileicons/32x32/odt.png create mode 100644 lib/images/fileicons/32x32/ogg.png create mode 100644 lib/images/fileicons/32x32/ogv.png create mode 100644 lib/images/fileicons/32x32/pas.png create mode 100644 lib/images/fileicons/32x32/pdf.png create mode 100644 lib/images/fileicons/32x32/php.png create mode 100644 lib/images/fileicons/32x32/pl.png create mode 100644 lib/images/fileicons/32x32/png.png create mode 100644 lib/images/fileicons/32x32/ppt.png create mode 100644 lib/images/fileicons/32x32/pptx.png create mode 100644 lib/images/fileicons/32x32/ps.png create mode 100644 lib/images/fileicons/32x32/py.png create mode 100644 lib/images/fileicons/32x32/rar.png create mode 100644 lib/images/fileicons/32x32/rb.png create mode 100644 lib/images/fileicons/32x32/rpm.png create mode 100644 lib/images/fileicons/32x32/rtf.png create mode 100644 lib/images/fileicons/32x32/sh.png create mode 100644 lib/images/fileicons/32x32/sql.png create mode 100644 lib/images/fileicons/32x32/svg.png create mode 100644 lib/images/fileicons/32x32/swf.png create mode 100644 lib/images/fileicons/32x32/sxc.png create mode 100644 lib/images/fileicons/32x32/sxd.png create mode 100644 lib/images/fileicons/32x32/sxi.png create mode 100644 lib/images/fileicons/32x32/sxw.png create mode 100644 lib/images/fileicons/32x32/tar.png create mode 100644 lib/images/fileicons/32x32/tgz.png create mode 100644 lib/images/fileicons/32x32/txt.png create mode 100644 lib/images/fileicons/32x32/wav.png create mode 100644 lib/images/fileicons/32x32/webm.png create mode 100644 lib/images/fileicons/32x32/xls.png create mode 100644 lib/images/fileicons/32x32/xlsx.png create mode 100644 lib/images/fileicons/32x32/xml.png create mode 100644 lib/images/fileicons/32x32/zip.png create mode 100644 lib/images/fileicons/7z.png create mode 100644 lib/images/fileicons/asm.png create mode 100644 lib/images/fileicons/bash.png create mode 100644 lib/images/fileicons/bz2.png create mode 100644 lib/images/fileicons/c.png create mode 100644 lib/images/fileicons/cc.png create mode 100644 lib/images/fileicons/conf.png create mode 100644 lib/images/fileicons/cpp.png create mode 100644 lib/images/fileicons/cs.png create mode 100644 lib/images/fileicons/csh.png create mode 100644 lib/images/fileicons/css.png create mode 100644 lib/images/fileicons/csv.png create mode 100644 lib/images/fileicons/deb.png create mode 100644 lib/images/fileicons/diff.png create mode 100644 lib/images/fileicons/doc.png create mode 100644 lib/images/fileicons/docx.png create mode 100644 lib/images/fileicons/file.png create mode 100644 lib/images/fileicons/gif.png create mode 100644 lib/images/fileicons/gz.png create mode 100644 lib/images/fileicons/h.png create mode 100644 lib/images/fileicons/hpp.png create mode 100644 lib/images/fileicons/htm.png create mode 100644 lib/images/fileicons/html.png create mode 100644 lib/images/fileicons/ico.png create mode 100644 lib/images/fileicons/index.php create mode 100644 lib/images/fileicons/java.png create mode 100644 lib/images/fileicons/jpeg.png create mode 100644 lib/images/fileicons/jpg.png create mode 100644 lib/images/fileicons/js.png create mode 100644 lib/images/fileicons/json.png create mode 100644 lib/images/fileicons/lua.png create mode 100644 lib/images/fileicons/mp3.png create mode 100644 lib/images/fileicons/mp4.png create mode 100644 lib/images/fileicons/odc.png create mode 100644 lib/images/fileicons/odf.png create mode 100644 lib/images/fileicons/odg.png create mode 100644 lib/images/fileicons/odi.png create mode 100644 lib/images/fileicons/odp.png create mode 100644 lib/images/fileicons/ods.png create mode 100644 lib/images/fileicons/odt.png create mode 100644 lib/images/fileicons/ogg.png create mode 100644 lib/images/fileicons/ogv.png create mode 100644 lib/images/fileicons/pas.png create mode 100644 lib/images/fileicons/pdf.png create mode 100644 lib/images/fileicons/php.png create mode 100644 lib/images/fileicons/pl.png create mode 100644 lib/images/fileicons/png.png create mode 100644 lib/images/fileicons/ppt.png create mode 100644 lib/images/fileicons/pptx.png create mode 100644 lib/images/fileicons/ps.png create mode 100644 lib/images/fileicons/py.png create mode 100644 lib/images/fileicons/rar.png create mode 100644 lib/images/fileicons/rb.png create mode 100644 lib/images/fileicons/rpm.png create mode 100644 lib/images/fileicons/rtf.png create mode 100644 lib/images/fileicons/sh.png create mode 100644 lib/images/fileicons/sql.png create mode 100644 lib/images/fileicons/svg.png create mode 100644 lib/images/fileicons/svg/7z.svg create mode 100644 lib/images/fileicons/svg/asm.svg create mode 100644 lib/images/fileicons/svg/bash.svg create mode 100644 lib/images/fileicons/svg/bz2.svg create mode 100644 lib/images/fileicons/svg/c.svg create mode 100644 lib/images/fileicons/svg/conf.svg create mode 100644 lib/images/fileicons/svg/cpp.svg create mode 100644 lib/images/fileicons/svg/cs.svg create mode 100644 lib/images/fileicons/svg/csh.svg create mode 100644 lib/images/fileicons/svg/css.svg create mode 100644 lib/images/fileicons/svg/csv.svg create mode 100644 lib/images/fileicons/svg/deb.svg create mode 100644 lib/images/fileicons/svg/doc.svg create mode 100644 lib/images/fileicons/svg/docx.svg create mode 100644 lib/images/fileicons/svg/file.svg create mode 100644 lib/images/fileicons/svg/gif.svg create mode 100644 lib/images/fileicons/svg/gz.svg create mode 100644 lib/images/fileicons/svg/h.svg create mode 100644 lib/images/fileicons/svg/htm.svg create mode 100644 lib/images/fileicons/svg/html.svg create mode 100644 lib/images/fileicons/svg/ico.svg create mode 100644 lib/images/fileicons/svg/index.php create mode 100644 lib/images/fileicons/svg/java.svg create mode 100644 lib/images/fileicons/svg/jpeg.svg create mode 100644 lib/images/fileicons/svg/jpg.svg create mode 100644 lib/images/fileicons/svg/js.svg create mode 100644 lib/images/fileicons/svg/json.svg create mode 100644 lib/images/fileicons/svg/lua.svg create mode 100644 lib/images/fileicons/svg/mp3.svg create mode 100644 lib/images/fileicons/svg/mp4.svg create mode 100644 lib/images/fileicons/svg/ods.svg create mode 100644 lib/images/fileicons/svg/odt.svg create mode 100644 lib/images/fileicons/svg/ogg.svg create mode 100644 lib/images/fileicons/svg/ogv.svg create mode 100644 lib/images/fileicons/svg/pdf.svg create mode 100644 lib/images/fileicons/svg/php.svg create mode 100644 lib/images/fileicons/svg/pl.svg create mode 100644 lib/images/fileicons/svg/png.svg create mode 100644 lib/images/fileicons/svg/ppt.svg create mode 100644 lib/images/fileicons/svg/pptx.svg create mode 100644 lib/images/fileicons/svg/ps.svg create mode 100644 lib/images/fileicons/svg/py.svg create mode 100644 lib/images/fileicons/svg/rar.svg create mode 100644 lib/images/fileicons/svg/rb.svg create mode 100644 lib/images/fileicons/svg/rpm.svg create mode 100644 lib/images/fileicons/svg/rtf.svg create mode 100644 lib/images/fileicons/svg/sh.svg create mode 100644 lib/images/fileicons/svg/sql.svg create mode 100644 lib/images/fileicons/svg/svg.svg create mode 100644 lib/images/fileicons/svg/swf.svg create mode 100644 lib/images/fileicons/svg/tar.svg create mode 100644 lib/images/fileicons/svg/tgz.svg create mode 100644 lib/images/fileicons/svg/txt.svg create mode 100644 lib/images/fileicons/svg/wav.svg create mode 100644 lib/images/fileicons/svg/webm.svg create mode 100644 lib/images/fileicons/svg/xls.svg create mode 100644 lib/images/fileicons/svg/xlsx.svg create mode 100644 lib/images/fileicons/svg/xml.svg create mode 100644 lib/images/fileicons/svg/zip.svg create mode 100644 lib/images/fileicons/swf.png create mode 100644 lib/images/fileicons/sxc.png create mode 100644 lib/images/fileicons/sxd.png create mode 100644 lib/images/fileicons/sxi.png create mode 100644 lib/images/fileicons/sxw.png create mode 100644 lib/images/fileicons/tar.png create mode 100644 lib/images/fileicons/tgz.png create mode 100644 lib/images/fileicons/txt.png create mode 100644 lib/images/fileicons/wav.png create mode 100644 lib/images/fileicons/webm.png create mode 100644 lib/images/fileicons/xls.png create mode 100644 lib/images/fileicons/xlsx.png create mode 100644 lib/images/fileicons/xml.png create mode 100644 lib/images/fileicons/zip.png create mode 100644 lib/images/history.png create mode 100644 lib/images/icon-list.png create mode 100644 lib/images/icon-sort.png create mode 100644 lib/images/index.html create mode 100644 lib/images/info.png create mode 100644 lib/images/interwiki.png create mode 100644 lib/images/interwiki.svg create mode 100644 lib/images/interwiki/amazon.de.svg create mode 100644 lib/images/interwiki/amazon.svg create mode 100644 lib/images/interwiki/amazon.uk.svg create mode 100644 lib/images/interwiki/callto.svg create mode 100644 lib/images/interwiki/doku.svg create mode 100644 lib/images/interwiki/google.svg create mode 100644 lib/images/interwiki/paypal.svg create mode 100644 lib/images/interwiki/phpfn.svg create mode 100644 lib/images/interwiki/skype.svg create mode 100644 lib/images/interwiki/tel.svg create mode 100644 lib/images/interwiki/user.svg create mode 100644 lib/images/interwiki/wp.svg create mode 100644 lib/images/interwiki/wpde.svg create mode 100644 lib/images/interwiki/wpes.svg create mode 100644 lib/images/interwiki/wpfr.svg create mode 100644 lib/images/interwiki/wpjp.svg create mode 100644 lib/images/interwiki/wpmeta.svg create mode 100644 lib/images/interwiki/wppl.svg create mode 100644 lib/images/larger.gif create mode 100644 lib/images/license/badge/cc-by-nc-nd.png create mode 100644 lib/images/license/badge/cc-by-nc-sa.png create mode 100644 lib/images/license/badge/cc-by-nc.png create mode 100644 lib/images/license/badge/cc-by-nd.png create mode 100644 lib/images/license/badge/cc-by-sa.png create mode 100644 lib/images/license/badge/cc-by.png create mode 100644 lib/images/license/badge/cc-zero.png create mode 100644 lib/images/license/badge/cc.png create mode 100644 lib/images/license/badge/gnufdl.png create mode 100644 lib/images/license/badge/publicdomain.png create mode 100644 lib/images/license/button/cc-by-nc-nd.png create mode 100644 lib/images/license/button/cc-by-nc-sa.png create mode 100644 lib/images/license/button/cc-by-nc.png create mode 100644 lib/images/license/button/cc-by-nd.png create mode 100644 lib/images/license/button/cc-by-sa.png create mode 100644 lib/images/license/button/cc-by.png create mode 100644 lib/images/license/button/cc-zero.png create mode 100644 lib/images/license/button/cc.png create mode 100644 lib/images/license/button/gnufdl.png create mode 100644 lib/images/license/button/publicdomain.png create mode 100644 lib/images/magnifier.png create mode 100644 lib/images/media_align_center.png create mode 100644 lib/images/media_align_left.png create mode 100644 lib/images/media_align_noalign.png create mode 100644 lib/images/media_align_right.png create mode 100644 lib/images/media_link_direct.png create mode 100644 lib/images/media_link_displaylnk.png create mode 100644 lib/images/media_link_lnk.png create mode 100644 lib/images/media_link_nolnk.png create mode 100644 lib/images/media_size_large.png create mode 100644 lib/images/media_size_medium.png create mode 100644 lib/images/media_size_original.png create mode 100644 lib/images/media_size_small.png create mode 100644 lib/images/mediamanager.png create mode 100644 lib/images/menu/00-default_checkbox-blank-circle-outline.svg create mode 100644 lib/images/menu/01-edit_pencil.svg create mode 100644 lib/images/menu/02-create_pencil.svg create mode 100644 lib/images/menu/03-draft_android-studio.svg create mode 100644 lib/images/menu/04-show_file-document.svg create mode 100644 lib/images/menu/05-source_file-xml.svg create mode 100644 lib/images/menu/06-revert_replay.svg create mode 100644 lib/images/menu/07-revisions_history.svg create mode 100644 lib/images/menu/08-backlink_link-variant.svg create mode 100644 lib/images/menu/09-subscribe_email-outline.svg create mode 100644 lib/images/menu/10-top_arrow-up.svg create mode 100644 lib/images/menu/11-mediamanager_folder-image.svg create mode 100644 lib/images/menu/12-back_arrow-left.svg create mode 100644 lib/images/menu/account-card-details.svg create mode 100644 lib/images/menu/account-plus.svg create mode 100644 lib/images/menu/calendar-clock.svg create mode 100644 lib/images/menu/file-tree.svg create mode 100644 lib/images/menu/folder-multiple-image.svg create mode 100644 lib/images/menu/lock-reset.svg create mode 100644 lib/images/menu/login.svg create mode 100644 lib/images/menu/logout.svg create mode 100644 lib/images/menu/settings.svg create mode 100644 lib/images/minus.gif create mode 100644 lib/images/notify.png create mode 100644 lib/images/ns.png create mode 100644 lib/images/open.png create mode 100644 lib/images/page.png create mode 100644 lib/images/plus.gif create mode 100644 lib/images/resizecol.png create mode 100644 lib/images/smaller.gif create mode 100644 lib/images/smileys/biggrin.svg create mode 100644 lib/images/smileys/confused.svg create mode 100644 lib/images/smileys/cool.svg create mode 100644 lib/images/smileys/deleteme.svg create mode 100644 lib/images/smileys/doubt.svg create mode 100644 lib/images/smileys/doubt2.svg create mode 100644 lib/images/smileys/eek.svg create mode 100644 lib/images/smileys/exclaim.svg create mode 100644 lib/images/smileys/facepalm.svg create mode 100644 lib/images/smileys/fixme.svg create mode 100644 lib/images/smileys/fun.svg create mode 100644 lib/images/smileys/index.php create mode 100644 lib/images/smileys/lol.svg create mode 100644 lib/images/smileys/neutral.svg create mode 100644 lib/images/smileys/question.svg create mode 100644 lib/images/smileys/razz.svg create mode 100644 lib/images/smileys/sad.svg create mode 100644 lib/images/smileys/silenced.svg create mode 100644 lib/images/smileys/smile.svg create mode 100644 lib/images/smileys/smile2.svg create mode 100644 lib/images/smileys/surprised.svg create mode 100644 lib/images/smileys/wink.svg create mode 100644 lib/images/success.png create mode 100644 lib/images/throbber.gif create mode 100644 lib/images/toolbar/bold.png create mode 100644 lib/images/toolbar/chars.png create mode 100644 lib/images/toolbar/h.png create mode 100644 lib/images/toolbar/h1.png create mode 100644 lib/images/toolbar/h2.png create mode 100644 lib/images/toolbar/h3.png create mode 100644 lib/images/toolbar/h4.png create mode 100644 lib/images/toolbar/h5.png create mode 100644 lib/images/toolbar/hequal.png create mode 100644 lib/images/toolbar/hminus.png create mode 100644 lib/images/toolbar/hplus.png create mode 100644 lib/images/toolbar/hr.png create mode 100644 lib/images/toolbar/image.png create mode 100644 lib/images/toolbar/italic.png create mode 100644 lib/images/toolbar/link.png create mode 100644 lib/images/toolbar/linkextern.png create mode 100644 lib/images/toolbar/mono.png create mode 100644 lib/images/toolbar/ol.png create mode 100644 lib/images/toolbar/sig.png create mode 100644 lib/images/toolbar/smiley.png create mode 100644 lib/images/toolbar/strike.png create mode 100644 lib/images/toolbar/ul.png create mode 100644 lib/images/toolbar/underline.png create mode 100644 lib/images/trash.png create mode 100644 lib/images/unc.png create mode 100644 lib/images/unc.svg create mode 100644 lib/images/up.png create mode 100644 lib/images/wrap.gif create mode 100644 lib/index.html create mode 100644 lib/plugins/acl/action.php create mode 100644 lib/plugins/acl/admin.php create mode 100644 lib/plugins/acl/admin.svg create mode 100644 lib/plugins/acl/lang/af/lang.php create mode 100644 lib/plugins/acl/lang/ar/help.txt create mode 100644 lib/plugins/acl/lang/ar/lang.php create mode 100644 lib/plugins/acl/lang/bg/help.txt create mode 100644 lib/plugins/acl/lang/bg/lang.php create mode 100644 lib/plugins/acl/lang/ca-valencia/help.txt create mode 100644 lib/plugins/acl/lang/ca-valencia/lang.php create mode 100644 lib/plugins/acl/lang/ca/help.txt create mode 100644 lib/plugins/acl/lang/ca/lang.php create mode 100644 lib/plugins/acl/lang/ckb/help.txt create mode 100644 lib/plugins/acl/lang/ckb/lang.php create mode 100644 lib/plugins/acl/lang/cs/help.txt create mode 100644 lib/plugins/acl/lang/cs/lang.php create mode 100644 lib/plugins/acl/lang/cy/help.txt create mode 100644 lib/plugins/acl/lang/cy/lang.php create mode 100644 lib/plugins/acl/lang/da/help.txt create mode 100644 lib/plugins/acl/lang/da/lang.php create mode 100644 lib/plugins/acl/lang/de-informal/help.txt create mode 100644 lib/plugins/acl/lang/de-informal/lang.php create mode 100644 lib/plugins/acl/lang/de/help.txt create mode 100644 lib/plugins/acl/lang/de/lang.php create mode 100644 lib/plugins/acl/lang/el/help.txt create mode 100644 lib/plugins/acl/lang/el/lang.php create mode 100644 lib/plugins/acl/lang/en/help.txt create mode 100644 lib/plugins/acl/lang/en/lang.php create mode 100644 lib/plugins/acl/lang/eo/help.txt create mode 100644 lib/plugins/acl/lang/eo/lang.php create mode 100644 lib/plugins/acl/lang/es/help.txt create mode 100644 lib/plugins/acl/lang/es/lang.php create mode 100644 lib/plugins/acl/lang/et/help.txt create mode 100644 lib/plugins/acl/lang/et/lang.php create mode 100644 lib/plugins/acl/lang/eu/help.txt create mode 100644 lib/plugins/acl/lang/eu/lang.php create mode 100644 lib/plugins/acl/lang/fa/help.txt create mode 100644 lib/plugins/acl/lang/fa/lang.php create mode 100644 lib/plugins/acl/lang/fi/help.txt create mode 100644 lib/plugins/acl/lang/fi/lang.php create mode 100644 lib/plugins/acl/lang/fr/help.txt create mode 100644 lib/plugins/acl/lang/fr/lang.php create mode 100644 lib/plugins/acl/lang/gl/help.txt create mode 100644 lib/plugins/acl/lang/gl/lang.php create mode 100644 lib/plugins/acl/lang/he/help.txt create mode 100644 lib/plugins/acl/lang/he/lang.php create mode 100644 lib/plugins/acl/lang/hr/help.txt create mode 100644 lib/plugins/acl/lang/hr/lang.php create mode 100644 lib/plugins/acl/lang/hu/help.txt create mode 100644 lib/plugins/acl/lang/hu/lang.php create mode 100644 lib/plugins/acl/lang/ia/help.txt create mode 100644 lib/plugins/acl/lang/ia/lang.php create mode 100644 lib/plugins/acl/lang/id/lang.php create mode 100644 lib/plugins/acl/lang/is/lang.php create mode 100644 lib/plugins/acl/lang/it/help.txt create mode 100644 lib/plugins/acl/lang/it/lang.php create mode 100644 lib/plugins/acl/lang/ja/help.txt create mode 100644 lib/plugins/acl/lang/ja/lang.php create mode 100644 lib/plugins/acl/lang/kk/lang.php create mode 100644 lib/plugins/acl/lang/km/lang.php create mode 100644 lib/plugins/acl/lang/ko/help.txt create mode 100644 lib/plugins/acl/lang/ko/lang.php create mode 100644 lib/plugins/acl/lang/la/help.txt create mode 100644 lib/plugins/acl/lang/la/lang.php create mode 100644 lib/plugins/acl/lang/lb/help.txt create mode 100644 lib/plugins/acl/lang/lt/lang.php create mode 100644 lib/plugins/acl/lang/lv/help.txt create mode 100644 lib/plugins/acl/lang/lv/lang.php create mode 100644 lib/plugins/acl/lang/mk/lang.php create mode 100644 lib/plugins/acl/lang/mr/help.txt create mode 100644 lib/plugins/acl/lang/mr/lang.php create mode 100644 lib/plugins/acl/lang/ne/lang.php create mode 100644 lib/plugins/acl/lang/nl/help.txt create mode 100644 lib/plugins/acl/lang/nl/lang.php create mode 100644 lib/plugins/acl/lang/no/help.txt create mode 100644 lib/plugins/acl/lang/no/lang.php create mode 100644 lib/plugins/acl/lang/pl/help.txt create mode 100644 lib/plugins/acl/lang/pl/lang.php create mode 100644 lib/plugins/acl/lang/pt-br/help.txt create mode 100644 lib/plugins/acl/lang/pt-br/lang.php create mode 100644 lib/plugins/acl/lang/pt/help.txt create mode 100644 lib/plugins/acl/lang/pt/lang.php create mode 100644 lib/plugins/acl/lang/ro/help.txt create mode 100644 lib/plugins/acl/lang/ro/lang.php create mode 100644 lib/plugins/acl/lang/ru/help.txt create mode 100644 lib/plugins/acl/lang/ru/lang.php create mode 100644 lib/plugins/acl/lang/sk/help.txt create mode 100644 lib/plugins/acl/lang/sk/lang.php create mode 100644 lib/plugins/acl/lang/sl/help.txt create mode 100644 lib/plugins/acl/lang/sl/lang.php create mode 100644 lib/plugins/acl/lang/sq/help.txt create mode 100644 lib/plugins/acl/lang/sq/lang.php create mode 100644 lib/plugins/acl/lang/sr/help.txt create mode 100644 lib/plugins/acl/lang/sr/lang.php create mode 100644 lib/plugins/acl/lang/sv/help.txt create mode 100644 lib/plugins/acl/lang/sv/lang.php create mode 100644 lib/plugins/acl/lang/th/help.txt create mode 100644 lib/plugins/acl/lang/th/lang.php create mode 100644 lib/plugins/acl/lang/tr/help.txt create mode 100644 lib/plugins/acl/lang/tr/lang.php create mode 100644 lib/plugins/acl/lang/uk/help.txt create mode 100644 lib/plugins/acl/lang/uk/lang.php create mode 100644 lib/plugins/acl/lang/vi/help.txt create mode 100644 lib/plugins/acl/lang/vi/lang.php create mode 100644 lib/plugins/acl/lang/zh-tw/help.txt create mode 100644 lib/plugins/acl/lang/zh-tw/lang.php create mode 100644 lib/plugins/acl/lang/zh/help.txt create mode 100644 lib/plugins/acl/lang/zh/lang.php create mode 100644 lib/plugins/acl/pix/group.png create mode 100644 lib/plugins/acl/pix/ns.png create mode 100644 lib/plugins/acl/pix/page.png create mode 100644 lib/plugins/acl/pix/user.png create mode 100644 lib/plugins/acl/plugin.info.txt create mode 100644 lib/plugins/acl/remote.php create mode 100644 lib/plugins/acl/script.js create mode 100644 lib/plugins/acl/style.css create mode 100644 lib/plugins/action.php create mode 100644 lib/plugins/admin.php create mode 100644 lib/plugins/auth.php create mode 100644 lib/plugins/authad/action.php create mode 100644 lib/plugins/authad/adLDAP/adLDAP.php create mode 100644 lib/plugins/authad/adLDAP/classes/adLDAPComputers.php create mode 100644 lib/plugins/authad/adLDAP/classes/adLDAPContacts.php create mode 100644 lib/plugins/authad/adLDAP/classes/adLDAPExchange.php create mode 100644 lib/plugins/authad/adLDAP/classes/adLDAPFolders.php create mode 100644 lib/plugins/authad/adLDAP/classes/adLDAPGroups.php create mode 100644 lib/plugins/authad/adLDAP/classes/adLDAPUsers.php create mode 100644 lib/plugins/authad/adLDAP/classes/adLDAPUtils.php create mode 100644 lib/plugins/authad/adLDAP/collections/adLDAPCollection.php create mode 100644 lib/plugins/authad/adLDAP/collections/adLDAPComputerCollection.php create mode 100644 lib/plugins/authad/adLDAP/collections/adLDAPContactCollection.php create mode 100644 lib/plugins/authad/adLDAP/collections/adLDAPGroupCollection.php create mode 100644 lib/plugins/authad/adLDAP/collections/adLDAPUserCollection.php create mode 100644 lib/plugins/authad/auth.php create mode 100644 lib/plugins/authad/conf/default.php create mode 100644 lib/plugins/authad/conf/metadata.php create mode 100644 lib/plugins/authad/lang/ar/lang.php create mode 100644 lib/plugins/authad/lang/ar/settings.php create mode 100644 lib/plugins/authad/lang/bg/lang.php create mode 100644 lib/plugins/authad/lang/bg/settings.php create mode 100644 lib/plugins/authad/lang/ca/lang.php create mode 100644 lib/plugins/authad/lang/ca/settings.php create mode 100644 lib/plugins/authad/lang/ckb/lang.php create mode 100644 lib/plugins/authad/lang/ckb/settings.php create mode 100644 lib/plugins/authad/lang/cs/lang.php create mode 100644 lib/plugins/authad/lang/cs/settings.php create mode 100644 lib/plugins/authad/lang/cy/lang.php create mode 100644 lib/plugins/authad/lang/cy/settings.php create mode 100644 lib/plugins/authad/lang/da/lang.php create mode 100644 lib/plugins/authad/lang/da/settings.php create mode 100644 lib/plugins/authad/lang/de-informal/lang.php create mode 100644 lib/plugins/authad/lang/de-informal/settings.php create mode 100644 lib/plugins/authad/lang/de/lang.php create mode 100644 lib/plugins/authad/lang/de/settings.php create mode 100644 lib/plugins/authad/lang/el/lang.php create mode 100644 lib/plugins/authad/lang/el/settings.php create mode 100644 lib/plugins/authad/lang/en/lang.php create mode 100644 lib/plugins/authad/lang/en/settings.php create mode 100644 lib/plugins/authad/lang/eo/lang.php create mode 100644 lib/plugins/authad/lang/eo/settings.php create mode 100644 lib/plugins/authad/lang/es/lang.php create mode 100644 lib/plugins/authad/lang/es/settings.php create mode 100644 lib/plugins/authad/lang/et/lang.php create mode 100644 lib/plugins/authad/lang/eu/lang.php create mode 100644 lib/plugins/authad/lang/eu/settings.php create mode 100644 lib/plugins/authad/lang/fa/lang.php create mode 100644 lib/plugins/authad/lang/fa/settings.php create mode 100644 lib/plugins/authad/lang/fi/lang.php create mode 100644 lib/plugins/authad/lang/fi/settings.php create mode 100644 lib/plugins/authad/lang/fr/lang.php create mode 100644 lib/plugins/authad/lang/fr/settings.php create mode 100644 lib/plugins/authad/lang/gl/lang.php create mode 100644 lib/plugins/authad/lang/he/lang.php create mode 100644 lib/plugins/authad/lang/he/settings.php create mode 100644 lib/plugins/authad/lang/hr/lang.php create mode 100644 lib/plugins/authad/lang/hr/settings.php create mode 100644 lib/plugins/authad/lang/hu/lang.php create mode 100644 lib/plugins/authad/lang/hu/settings.php create mode 100644 lib/plugins/authad/lang/it/lang.php create mode 100644 lib/plugins/authad/lang/it/settings.php create mode 100644 lib/plugins/authad/lang/ja/lang.php create mode 100644 lib/plugins/authad/lang/ja/settings.php create mode 100644 lib/plugins/authad/lang/ka/lang.php create mode 100644 lib/plugins/authad/lang/ko/lang.php create mode 100644 lib/plugins/authad/lang/ko/settings.php create mode 100644 lib/plugins/authad/lang/lv/lang.php create mode 100644 lib/plugins/authad/lang/lv/settings.php create mode 100644 lib/plugins/authad/lang/nl/lang.php create mode 100644 lib/plugins/authad/lang/nl/settings.php create mode 100644 lib/plugins/authad/lang/no/lang.php create mode 100644 lib/plugins/authad/lang/no/settings.php create mode 100644 lib/plugins/authad/lang/pl/lang.php create mode 100644 lib/plugins/authad/lang/pl/settings.php create mode 100644 lib/plugins/authad/lang/pt-br/lang.php create mode 100644 lib/plugins/authad/lang/pt-br/settings.php create mode 100644 lib/plugins/authad/lang/pt/lang.php create mode 100644 lib/plugins/authad/lang/pt/settings.php create mode 100644 lib/plugins/authad/lang/ro/lang.php create mode 100644 lib/plugins/authad/lang/ro/settings.php create mode 100644 lib/plugins/authad/lang/ru/lang.php create mode 100644 lib/plugins/authad/lang/ru/settings.php create mode 100644 lib/plugins/authad/lang/sk/lang.php create mode 100644 lib/plugins/authad/lang/sk/settings.php create mode 100644 lib/plugins/authad/lang/sl/lang.php create mode 100644 lib/plugins/authad/lang/sl/settings.php create mode 100644 lib/plugins/authad/lang/sr/lang.php create mode 100644 lib/plugins/authad/lang/sr/settings.php create mode 100644 lib/plugins/authad/lang/sv/lang.php create mode 100644 lib/plugins/authad/lang/sv/settings.php create mode 100644 lib/plugins/authad/lang/tr/lang.php create mode 100644 lib/plugins/authad/lang/tr/settings.php create mode 100644 lib/plugins/authad/lang/uk/lang.php create mode 100644 lib/plugins/authad/lang/uk/settings.php create mode 100644 lib/plugins/authad/lang/vi/lang.php create mode 100644 lib/plugins/authad/lang/vi/settings.php create mode 100644 lib/plugins/authad/lang/zh-tw/lang.php create mode 100644 lib/plugins/authad/lang/zh-tw/settings.php create mode 100644 lib/plugins/authad/lang/zh/lang.php create mode 100644 lib/plugins/authad/lang/zh/settings.php create mode 100644 lib/plugins/authad/plugin.info.txt create mode 100644 lib/plugins/authldap/auth.php create mode 100644 lib/plugins/authldap/conf/default.php create mode 100644 lib/plugins/authldap/conf/metadata.php create mode 100644 lib/plugins/authldap/lang/ar/lang.php create mode 100644 lib/plugins/authldap/lang/ar/settings.php create mode 100644 lib/plugins/authldap/lang/bg/settings.php create mode 100644 lib/plugins/authldap/lang/ca/lang.php create mode 100644 lib/plugins/authldap/lang/ca/settings.php create mode 100644 lib/plugins/authldap/lang/ckb/lang.php create mode 100644 lib/plugins/authldap/lang/ckb/settings.php create mode 100644 lib/plugins/authldap/lang/cs/lang.php create mode 100644 lib/plugins/authldap/lang/cs/settings.php create mode 100644 lib/plugins/authldap/lang/cy/lang.php create mode 100644 lib/plugins/authldap/lang/cy/settings.php create mode 100644 lib/plugins/authldap/lang/da/lang.php create mode 100644 lib/plugins/authldap/lang/da/settings.php create mode 100644 lib/plugins/authldap/lang/de-informal/lang.php create mode 100644 lib/plugins/authldap/lang/de-informal/settings.php create mode 100644 lib/plugins/authldap/lang/de/lang.php create mode 100644 lib/plugins/authldap/lang/de/settings.php create mode 100644 lib/plugins/authldap/lang/el/lang.php create mode 100644 lib/plugins/authldap/lang/el/settings.php create mode 100644 lib/plugins/authldap/lang/en/lang.php create mode 100644 lib/plugins/authldap/lang/en/settings.php create mode 100644 lib/plugins/authldap/lang/eo/lang.php create mode 100644 lib/plugins/authldap/lang/eo/settings.php create mode 100644 lib/plugins/authldap/lang/es/lang.php create mode 100644 lib/plugins/authldap/lang/es/settings.php create mode 100644 lib/plugins/authldap/lang/et/settings.php create mode 100644 lib/plugins/authldap/lang/eu/lang.php create mode 100644 lib/plugins/authldap/lang/eu/settings.php create mode 100644 lib/plugins/authldap/lang/fa/lang.php create mode 100644 lib/plugins/authldap/lang/fa/settings.php create mode 100644 lib/plugins/authldap/lang/fi/settings.php create mode 100644 lib/plugins/authldap/lang/fr/lang.php create mode 100644 lib/plugins/authldap/lang/fr/settings.php create mode 100644 lib/plugins/authldap/lang/he/settings.php create mode 100644 lib/plugins/authldap/lang/hr/lang.php create mode 100644 lib/plugins/authldap/lang/hr/settings.php create mode 100644 lib/plugins/authldap/lang/hu/lang.php create mode 100644 lib/plugins/authldap/lang/hu/settings.php create mode 100644 lib/plugins/authldap/lang/it/lang.php create mode 100644 lib/plugins/authldap/lang/it/settings.php create mode 100644 lib/plugins/authldap/lang/ja/lang.php create mode 100644 lib/plugins/authldap/lang/ja/settings.php create mode 100644 lib/plugins/authldap/lang/ko/lang.php create mode 100644 lib/plugins/authldap/lang/ko/settings.php create mode 100644 lib/plugins/authldap/lang/lv/settings.php create mode 100644 lib/plugins/authldap/lang/nl/lang.php create mode 100644 lib/plugins/authldap/lang/nl/settings.php create mode 100644 lib/plugins/authldap/lang/no/lang.php create mode 100644 lib/plugins/authldap/lang/no/settings.php create mode 100644 lib/plugins/authldap/lang/pl/lang.php create mode 100644 lib/plugins/authldap/lang/pl/settings.php create mode 100644 lib/plugins/authldap/lang/pt-br/lang.php create mode 100644 lib/plugins/authldap/lang/pt-br/settings.php create mode 100644 lib/plugins/authldap/lang/pt/lang.php create mode 100644 lib/plugins/authldap/lang/pt/settings.php create mode 100644 lib/plugins/authldap/lang/ru/lang.php create mode 100644 lib/plugins/authldap/lang/ru/settings.php create mode 100644 lib/plugins/authldap/lang/sk/lang.php create mode 100644 lib/plugins/authldap/lang/sk/settings.php create mode 100644 lib/plugins/authldap/lang/sl/settings.php create mode 100644 lib/plugins/authldap/lang/sr/lang.php create mode 100644 lib/plugins/authldap/lang/sr/settings.php create mode 100644 lib/plugins/authldap/lang/sv/lang.php create mode 100644 lib/plugins/authldap/lang/sv/settings.php create mode 100644 lib/plugins/authldap/lang/tr/lang.php create mode 100644 lib/plugins/authldap/lang/tr/settings.php create mode 100644 lib/plugins/authldap/lang/uk/lang.php create mode 100644 lib/plugins/authldap/lang/uk/settings.php create mode 100644 lib/plugins/authldap/lang/vi/lang.php create mode 100644 lib/plugins/authldap/lang/vi/settings.php create mode 100644 lib/plugins/authldap/lang/zh-tw/settings.php create mode 100644 lib/plugins/authldap/lang/zh/lang.php create mode 100644 lib/plugins/authldap/lang/zh/settings.php create mode 100644 lib/plugins/authldap/plugin.info.txt create mode 100644 lib/plugins/authpdo/auth.php create mode 100644 lib/plugins/authpdo/conf/default.php create mode 100644 lib/plugins/authpdo/conf/metadata.php create mode 100644 lib/plugins/authpdo/lang/ar/lang.php create mode 100644 lib/plugins/authpdo/lang/ar/settings.php create mode 100644 lib/plugins/authpdo/lang/bg/lang.php create mode 100644 lib/plugins/authpdo/lang/ca/lang.php create mode 100644 lib/plugins/authpdo/lang/ca/settings.php create mode 100644 lib/plugins/authpdo/lang/ckb/lang.php create mode 100644 lib/plugins/authpdo/lang/ckb/settings.php create mode 100644 lib/plugins/authpdo/lang/cs/lang.php create mode 100644 lib/plugins/authpdo/lang/cs/settings.php create mode 100644 lib/plugins/authpdo/lang/cy/lang.php create mode 100644 lib/plugins/authpdo/lang/da/lang.php create mode 100644 lib/plugins/authpdo/lang/da/settings.php create mode 100644 lib/plugins/authpdo/lang/de-informal/lang.php create mode 100644 lib/plugins/authpdo/lang/de-informal/settings.php create mode 100644 lib/plugins/authpdo/lang/de/lang.php create mode 100644 lib/plugins/authpdo/lang/de/settings.php create mode 100644 lib/plugins/authpdo/lang/el/lang.php create mode 100644 lib/plugins/authpdo/lang/el/settings.php create mode 100644 lib/plugins/authpdo/lang/en/lang.php create mode 100644 lib/plugins/authpdo/lang/en/settings.php create mode 100644 lib/plugins/authpdo/lang/eo/lang.php create mode 100644 lib/plugins/authpdo/lang/eo/settings.php create mode 100644 lib/plugins/authpdo/lang/es/lang.php create mode 100644 lib/plugins/authpdo/lang/es/settings.php create mode 100644 lib/plugins/authpdo/lang/fa/lang.php create mode 100644 lib/plugins/authpdo/lang/fa/settings.php create mode 100644 lib/plugins/authpdo/lang/fr/lang.php create mode 100644 lib/plugins/authpdo/lang/fr/settings.php create mode 100644 lib/plugins/authpdo/lang/hr/lang.php create mode 100644 lib/plugins/authpdo/lang/hu/lang.php create mode 100644 lib/plugins/authpdo/lang/hu/settings.php create mode 100644 lib/plugins/authpdo/lang/it/lang.php create mode 100644 lib/plugins/authpdo/lang/it/settings.php create mode 100644 lib/plugins/authpdo/lang/ja/lang.php create mode 100644 lib/plugins/authpdo/lang/ja/settings.php create mode 100644 lib/plugins/authpdo/lang/ko/lang.php create mode 100644 lib/plugins/authpdo/lang/ko/settings.php create mode 100644 lib/plugins/authpdo/lang/nl/lang.php create mode 100644 lib/plugins/authpdo/lang/nl/settings.php create mode 100644 lib/plugins/authpdo/lang/pl/lang.php create mode 100644 lib/plugins/authpdo/lang/pl/settings.php create mode 100644 lib/plugins/authpdo/lang/pt-br/lang.php create mode 100644 lib/plugins/authpdo/lang/pt-br/settings.php create mode 100644 lib/plugins/authpdo/lang/pt/lang.php create mode 100644 lib/plugins/authpdo/lang/pt/settings.php create mode 100644 lib/plugins/authpdo/lang/ru/lang.php create mode 100644 lib/plugins/authpdo/lang/ru/settings.php create mode 100644 lib/plugins/authpdo/lang/sk/lang.php create mode 100644 lib/plugins/authpdo/lang/sk/settings.php create mode 100644 lib/plugins/authpdo/lang/sv/lang.php create mode 100644 lib/plugins/authpdo/lang/sv/settings.php create mode 100644 lib/plugins/authpdo/lang/tr/lang.php create mode 100644 lib/plugins/authpdo/lang/uk/lang.php create mode 100644 lib/plugins/authpdo/lang/uk/settings.php create mode 100644 lib/plugins/authpdo/lang/vi/lang.php create mode 100644 lib/plugins/authpdo/lang/vi/settings.php create mode 100644 lib/plugins/authpdo/lang/zh/lang.php create mode 100644 lib/plugins/authpdo/lang/zh/settings.php create mode 100644 lib/plugins/authpdo/plugin.info.txt create mode 100644 lib/plugins/authplain/auth.php create mode 100644 lib/plugins/authplain/lang/af/lang.php create mode 100644 lib/plugins/authplain/lang/ar/lang.php create mode 100644 lib/plugins/authplain/lang/az/lang.php create mode 100644 lib/plugins/authplain/lang/bg/lang.php create mode 100644 lib/plugins/authplain/lang/bn/lang.php create mode 100644 lib/plugins/authplain/lang/ca-valencia/lang.php create mode 100644 lib/plugins/authplain/lang/ca/lang.php create mode 100644 lib/plugins/authplain/lang/ckb/lang.php create mode 100644 lib/plugins/authplain/lang/cs/lang.php create mode 100644 lib/plugins/authplain/lang/cy/lang.php create mode 100644 lib/plugins/authplain/lang/da/lang.php create mode 100644 lib/plugins/authplain/lang/de-informal/lang.php create mode 100644 lib/plugins/authplain/lang/de/lang.php create mode 100644 lib/plugins/authplain/lang/el/lang.php create mode 100644 lib/plugins/authplain/lang/en/lang.php create mode 100644 lib/plugins/authplain/lang/eo/lang.php create mode 100644 lib/plugins/authplain/lang/es/lang.php create mode 100644 lib/plugins/authplain/lang/et/lang.php create mode 100644 lib/plugins/authplain/lang/eu/lang.php create mode 100644 lib/plugins/authplain/lang/fa/lang.php create mode 100644 lib/plugins/authplain/lang/fi/lang.php create mode 100644 lib/plugins/authplain/lang/fo/lang.php create mode 100644 lib/plugins/authplain/lang/fr/lang.php create mode 100644 lib/plugins/authplain/lang/gl/lang.php create mode 100644 lib/plugins/authplain/lang/he/lang.php create mode 100644 lib/plugins/authplain/lang/hr/lang.php create mode 100644 lib/plugins/authplain/lang/hu/lang.php create mode 100644 lib/plugins/authplain/lang/ia/lang.php create mode 100644 lib/plugins/authplain/lang/id-ni/lang.php create mode 100644 lib/plugins/authplain/lang/id/lang.php create mode 100644 lib/plugins/authplain/lang/is/lang.php create mode 100644 lib/plugins/authplain/lang/it/lang.php create mode 100644 lib/plugins/authplain/lang/ja/lang.php create mode 100644 lib/plugins/authplain/lang/ka/lang.php create mode 100644 lib/plugins/authplain/lang/kk/lang.php create mode 100644 lib/plugins/authplain/lang/km/lang.php create mode 100644 lib/plugins/authplain/lang/ko/lang.php create mode 100644 lib/plugins/authplain/lang/ku/lang.php create mode 100644 lib/plugins/authplain/lang/la/lang.php create mode 100644 lib/plugins/authplain/lang/lb/lang.php create mode 100644 lib/plugins/authplain/lang/lt/lang.php create mode 100644 lib/plugins/authplain/lang/lv/lang.php create mode 100644 lib/plugins/authplain/lang/mg/lang.php create mode 100644 lib/plugins/authplain/lang/mk/lang.php create mode 100644 lib/plugins/authplain/lang/mr/lang.php create mode 100644 lib/plugins/authplain/lang/ms/lang.php create mode 100644 lib/plugins/authplain/lang/ne/lang.php create mode 100644 lib/plugins/authplain/lang/nl/lang.php create mode 100644 lib/plugins/authplain/lang/no/lang.php create mode 100644 lib/plugins/authplain/lang/pl/lang.php create mode 100644 lib/plugins/authplain/lang/pt-br/lang.php create mode 100644 lib/plugins/authplain/lang/pt/lang.php create mode 100644 lib/plugins/authplain/lang/ro/lang.php create mode 100644 lib/plugins/authplain/lang/ru/lang.php create mode 100644 lib/plugins/authplain/lang/sk/lang.php create mode 100644 lib/plugins/authplain/lang/sl/lang.php create mode 100644 lib/plugins/authplain/lang/sq/lang.php create mode 100644 lib/plugins/authplain/lang/sr/lang.php create mode 100644 lib/plugins/authplain/lang/sv/lang.php create mode 100644 lib/plugins/authplain/lang/th/lang.php create mode 100644 lib/plugins/authplain/lang/tr/lang.php create mode 100644 lib/plugins/authplain/lang/uk/lang.php create mode 100644 lib/plugins/authplain/lang/vi/lang.php create mode 100644 lib/plugins/authplain/lang/zh-tw/lang.php create mode 100644 lib/plugins/authplain/lang/zh/lang.php create mode 100644 lib/plugins/authplain/plugin.info.txt create mode 100644 lib/plugins/bureaucracy/LICENSE create mode 100644 lib/plugins/bureaucracy/action.php create mode 100644 lib/plugins/bureaucracy/conf/default.php create mode 100644 lib/plugins/bureaucracy/conf/metadata.php create mode 100644 lib/plugins/bureaucracy/helper/action.php create mode 100644 lib/plugins/bureaucracy/helper/actionmail.php create mode 100644 lib/plugins/bureaucracy/helper/actionscript.php create mode 100644 lib/plugins/bureaucracy/helper/actiontemplate.php create mode 100644 lib/plugins/bureaucracy/helper/field.php create mode 100644 lib/plugins/bureaucracy/helper/fieldaddpage.php create mode 100644 lib/plugins/bureaucracy/helper/fielddate.php create mode 100644 lib/plugins/bureaucracy/helper/fieldemail.php create mode 100644 lib/plugins/bureaucracy/helper/fieldfieldset.php create mode 100644 lib/plugins/bureaucracy/helper/fieldfile.php create mode 100644 lib/plugins/bureaucracy/helper/fieldhidden.php create mode 100644 lib/plugins/bureaucracy/helper/fieldhiddenautoinc.php create mode 100644 lib/plugins/bureaucracy/helper/fieldmultiselect.php create mode 100644 lib/plugins/bureaucracy/helper/fieldnumber.php create mode 100644 lib/plugins/bureaucracy/helper/fieldonoff.php create mode 100644 lib/plugins/bureaucracy/helper/fieldpassword.php create mode 100644 lib/plugins/bureaucracy/helper/fieldradio.php create mode 100644 lib/plugins/bureaucracy/helper/fieldselect.php create mode 100644 lib/plugins/bureaucracy/helper/fieldstatic.php create mode 100644 lib/plugins/bureaucracy/helper/fieldsubject.php create mode 100644 lib/plugins/bureaucracy/helper/fieldsubmit.php create mode 100644 lib/plugins/bureaucracy/helper/fieldtextarea.php create mode 100644 lib/plugins/bureaucracy/helper/fieldtextbox.php create mode 100644 lib/plugins/bureaucracy/helper/fieldtime.php create mode 100644 lib/plugins/bureaucracy/helper/fieldusemailtemplate.php create mode 100644 lib/plugins/bureaucracy/helper/fielduser.php create mode 100644 lib/plugins/bureaucracy/helper/fieldusers.php create mode 100644 lib/plugins/bureaucracy/helper/fieldwiki.php create mode 100644 lib/plugins/bureaucracy/helper/fieldyesno.php create mode 100644 lib/plugins/bureaucracy/interfaces/bureaucracy_handler_interface.php create mode 100644 lib/plugins/bureaucracy/lang/cs/lang.php create mode 100644 lib/plugins/bureaucracy/lang/cs/settings.php create mode 100644 lib/plugins/bureaucracy/lang/de/lang.php create mode 100644 lib/plugins/bureaucracy/lang/de/settings.php create mode 100644 lib/plugins/bureaucracy/lang/en/lang.php create mode 100644 lib/plugins/bureaucracy/lang/en/settings.php create mode 100644 lib/plugins/bureaucracy/lang/es/lang.php create mode 100644 lib/plugins/bureaucracy/lang/es/settings.php create mode 100644 lib/plugins/bureaucracy/lang/fa/lang.php create mode 100644 lib/plugins/bureaucracy/lang/fa/settings.php create mode 100644 lib/plugins/bureaucracy/lang/fr/lang.php create mode 100644 lib/plugins/bureaucracy/lang/fr/settings.php create mode 100644 lib/plugins/bureaucracy/lang/hr/lang.php create mode 100644 lib/plugins/bureaucracy/lang/hr/settings.php create mode 100644 lib/plugins/bureaucracy/lang/it/lang.php create mode 100644 lib/plugins/bureaucracy/lang/ja/lang.php create mode 100644 lib/plugins/bureaucracy/lang/ja/settings.php create mode 100644 lib/plugins/bureaucracy/lang/lv/lang.php create mode 100644 lib/plugins/bureaucracy/lang/nl/lang.php create mode 100644 lib/plugins/bureaucracy/lang/nl/settings.php create mode 100644 lib/plugins/bureaucracy/lang/no/lang.php create mode 100644 lib/plugins/bureaucracy/lang/no/settings.php create mode 100644 lib/plugins/bureaucracy/lang/pt-br/lang.php create mode 100644 lib/plugins/bureaucracy/lang/pt-br/settings.php create mode 100644 lib/plugins/bureaucracy/lang/pt/lang.php create mode 100644 lib/plugins/bureaucracy/lang/pt/settings.php create mode 100644 lib/plugins/bureaucracy/lang/ru/lang.php create mode 100644 lib/plugins/bureaucracy/lang/ru/settings.php create mode 100644 lib/plugins/bureaucracy/lang/zh/lang.php create mode 100644 lib/plugins/bureaucracy/lang/zh/settings.php create mode 100644 lib/plugins/bureaucracy/manager.dat create mode 100644 lib/plugins/bureaucracy/plugin.info.txt create mode 100644 lib/plugins/bureaucracy/script.js create mode 100644 lib/plugins/bureaucracy/script/datepicker.js create mode 100644 lib/plugins/bureaucracy/script/fieldsets.js create mode 100644 lib/plugins/bureaucracy/script/user.js create mode 100644 lib/plugins/bureaucracy/style.css create mode 100644 lib/plugins/bureaucracy/syntax.php create mode 100644 lib/plugins/ckgedit/.gitignore create mode 100644 lib/plugins/ckgedit/LICENSE create mode 100644 lib/plugins/ckgedit/README.md create mode 100644 lib/plugins/ckgedit/action/delete.php create mode 100644 lib/plugins/ckgedit/action/edit.php create mode 100644 lib/plugins/ckgedit/action/ent.ser create mode 100644 lib/plugins/ckgedit/action/entities/ENTITIES.HOWTO create mode 100644 lib/plugins/ckgedit/action/entities/ent.ser create mode 100644 lib/plugins/ckgedit/action/entities/ents.data create mode 100644 lib/plugins/ckgedit/action/entities/ents_seri.php create mode 100644 lib/plugins/ckgedit/action/entities/fcked-ents.data create mode 100644 lib/plugins/ckgedit/action/entities/utils/entities.conf create mode 100644 lib/plugins/ckgedit/action/entities/utils/entities.html create mode 100644 lib/plugins/ckgedit/action/entities/utils/entities.pl create mode 100644 lib/plugins/ckgedit/action/entities/utils/entities.txt create mode 100644 lib/plugins/ckgedit/action/entities/utils/fcked-ents.pl create mode 100644 lib/plugins/ckgedit/action/entities/utils/fcked-ents.txt create mode 100644 lib/plugins/ckgedit/action/entities/utils/fckeditor_ents.doc create mode 100644 lib/plugins/ckgedit/action/iwiki.php create mode 100644 lib/plugins/ckgedit/action/mediamanager.php create mode 100644 lib/plugins/ckgedit/action/meta.php create mode 100644 lib/plugins/ckgedit/action/save.php create mode 100644 lib/plugins/ckgedit/action/tagapi.php create mode 100644 lib/plugins/ckgedit/admin.php create mode 100644 lib/plugins/ckgedit/ckeditor/CHANGES.md create mode 100644 lib/plugins/ckgedit/ckeditor/LICENSE.md create mode 100644 lib/plugins/ckgedit/ckeditor/README.md create mode 100644 lib/plugins/ckgedit/ckeditor/adapters/jquery.js create mode 100644 lib/plugins/ckgedit/ckeditor/additional.css create mode 100644 lib/plugins/ckgedit/ckeditor/build-config.js create mode 100644 lib/plugins/ckgedit/ckeditor/ckeditor.js create mode 100644 lib/plugins/ckgedit/ckeditor/ckeditor.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/config.js create mode 100644 lib/plugins/ckgedit/ckeditor/config.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/contents-default.css create mode 100644 lib/plugins/ckgedit/ckeditor/contents.css create mode 100644 lib/plugins/ckgedit/ckeditor/contents.css.unc create mode 100644 lib/plugins/ckgedit/ckeditor/css/additional.css create mode 100644 lib/plugins/ckgedit/ckeditor/dwsmileys.php create mode 100644 lib/plugins/ckgedit/ckeditor/get_headers.php create mode 100644 lib/plugins/ckgedit/ckeditor/get_version.php create mode 100644 lib/plugins/ckgedit/ckeditor/images/email.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/external-link.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/7z.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/asm.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/audio.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/bash.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/bz2.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/c.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/cc.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/conf.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/cpp.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/cs.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/csh.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/css.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/csv.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/deb.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/diff.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/doc.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/docx.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/file.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/gif.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/gz.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/h.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/hpp.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/htm.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/html.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/ico.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/index.php create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/java.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/jpeg.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/jpg.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/js.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/json.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/lua.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/mp3.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/mp4.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/odc.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/odf.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/odg.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/odi.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/odp.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/ods.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/odt.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/ogg.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/ogv.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/pas.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/pdf.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/php.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/pl.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/png.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/ppt.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/pptx.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/ps.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/py.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/rar.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/rb.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/rpm.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/rtf.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/sh.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/sql.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/swf.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/sxc.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/sxd.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/sxi.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/sxw.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/tar.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/tgz.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/txt.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/wav.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/webm.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/wp.gif create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/xls.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/xlsx.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/xml.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/fileicons/zip.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/interwiki.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/link_icon.gif create mode 100644 lib/plugins/ckgedit/ckeditor/images/mail_icon.gif create mode 100644 lib/plugins/ckgedit/ckeditor/images/ns.png create mode 100644 lib/plugins/ckgedit/ckeditor/images/unc.png create mode 100644 lib/plugins/ckgedit/ckeditor/lang/af.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/ar.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/az.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/bg.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/bn.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/bs.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/ca.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/cs.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/cy.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/da.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/de-ch.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/el.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/en-au.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/en-ca.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/en-gb.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/en.4.9.js.beautified create mode 100644 lib/plugins/ckgedit/ckeditor/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/en.js-4.9.merged create mode 100644 lib/plugins/ckgedit/ckeditor/lang/en.js.4.9 create mode 100644 lib/plugins/ckgedit/ckeditor/lang/en.js.ckgedit create mode 100644 lib/plugins/ckgedit/ckeditor/lang/en.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/lang/eo.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/es-mx.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/es.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/et.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/eu.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/fa.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/fi.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/fo.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/fr-ca.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/fr.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/fr.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/lang/gl.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/gu.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/he.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/hi.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/hr.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/hu.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/id.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/is.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/it.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/ja.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/ka.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/km.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/ko.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/ku.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/lang_array.txt create mode 100644 lib/plugins/ckgedit/ckeditor/lang/lt.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/lv.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/mk.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/mn.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/ms.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/nb.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/nl.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/no.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/oc.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/pl.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/pt-br.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/pt.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/ro.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/ru.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/si.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/sk.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/sl.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/sq.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/sr-latn.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/sr.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/sv.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/th.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/tr.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/tt.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/ug.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/uk.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/vi.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/zh-cn.js create mode 100644 lib/plugins/ckgedit/ckeditor/lang/zh.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/a11yhelp.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/_translationstatus.txt create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/af.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/ar.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/az.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/bg.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/ca.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/cs.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/cy.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/da.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/de-ch.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/el.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/en-au.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/en-gb.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/eo.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/es-mx.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/es.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/et.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/eu.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/fa.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/fi.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/fo.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/fr-ca.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/fr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/gl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/gu.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/he.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/hi.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/hr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/hu.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/id.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/it.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/ja.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/km.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/ko.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/ku.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/lt.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/lv.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/mk.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/mn.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/nb.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/nl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/no.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/oc.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/pl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/pt-br.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/pt.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/ro.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/ru.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/si.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/sk.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/sl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/sq.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/sr-latn.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/sr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/sv.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/th.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/tr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/tt.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/ug.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/uk.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/vi.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/zh-cn.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/a11yhelp/dialogs/lang/zh.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/about/dialogs/about.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/about/dialogs/hidpi/logo_ckeditor.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/about/dialogs/logo_ckeditor.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/clipboard/dialogs/paste.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/colordialog/dialogs/colordialog.css create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/colordialog/dialogs/colordialog.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/copyformatting/cursors/cursor-disabled.svg create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/copyformatting/cursors/cursor.svg create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/copyformatting/styles/copyformatting.css create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/dialog/dialogDefinition.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/find/dialogs/find.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/fontAssist/color.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/fontAssist/color_chart_3.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/fontAssist/images/fonts.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/fontAssist/images/icon.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/fontAssist/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/fontAssist/plugin.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/footnote/images/footnote.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/footnote/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/footnote/plugin.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/geshi/dialogs/geshi.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/geshi/dialogs/geshi.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/geshi/icons/geshi.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/geshi/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/geshi/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/geshi/lang/fr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/geshi/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/icons/HH.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/icons/LH.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/icons/P.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/icons/SH.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/icons/hidpi/HH.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/icons/hidpi/LH.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/icons/hidpi/P.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/icons/hidpi/SH.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/headerbuttons/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/icons.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/icons_hidpi.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/image/dialogs/image.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/image/dialogs/image.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/image/icons/image.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/image/images/noimage.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/image/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/image/plugin.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/link/dialogs/anchor.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/link/dialogs/link-cmpr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/link/dialogs/link.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/link/dialogs/link.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/link/images/anchor.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/link/images/anchor.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/link/images/hidpi/anchor.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/link/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/link/plugin.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/liststyle/dialogs/liststyle.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/magicline/images/hidpi/icon-rtl.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/magicline/images/hidpi/icon.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/magicline/images/icon-rtl.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/magicline/images/icon.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/dialogs/bak/msword.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/dialogs/bak/msword.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/dialogs/msword.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/dialogs/msword.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/icons/geshi.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/icons/geshi.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/icons/msword.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/icons/untitled-.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/msword/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/.gitattributes create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/README.md create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/dialogs/note.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/dialogs/note.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/icons/note.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/icons/note_basic.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/icons/note_important.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/icons/note_tip.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/icons/note_warning.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/note/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/pagebreak/images/pagebreak.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/pastebase64/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/pastefromword/filter/default.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/preview/preview.html create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/scayt/CHANGELOG.md create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/scayt/LICENSE.md create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/scayt/README.md create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/scayt/dialogs/dialog.css create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/scayt/dialogs/options.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/scayt/dialogs/toolbar.css create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/scayt/skins/moono-lisa/scayt.css create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/shortcuts/images/timestamp.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/shortcuts/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/shortcuts/plugin.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_address.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_blockquote.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_div.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_h1.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_h2.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_h3.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_h4.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_h5.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_h6.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_p.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/showblocks/images/block_pre.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/signature/images/sig.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/signature/images/timestamp.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/signature/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/signature/plugin.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/dialogs/smiley.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/dialogs/smiley.js.4.3 create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/dialogs/smiley.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/icons/hidpi/smiley.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/icons/smiley.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/angel_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/angel_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/angry_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/angry_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/broken_heart.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/broken_heart.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/confused_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/confused_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/cry_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/cry_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/devil_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/devil_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/embaressed_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/embarrassed_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/embarrassed_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/envelope.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/envelope.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/heart.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/heart.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/kiss.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/kiss.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/lightbulb.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/lightbulb.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/omg_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/omg_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/regular_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/regular_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/sad_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/sad_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/shades_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/shades_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/teeth_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/teeth_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/thumbs_down.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/thumbs_down.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/thumbs_up.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/thumbs_up.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/tongue_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/tongue_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/tounge_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/whatchutalkingabout_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/wink_smile.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/images/wink_smile.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/af.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/ar.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/bg.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/bn.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/bs.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/ca.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/cs.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/cy.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/da.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/el.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/en-au.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/en-ca.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/en-gb.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/eo.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/es.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/et.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/eu.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/fa.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/fi.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/fo.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/fr-ca.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/fr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/gl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/gu.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/he.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/hi.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/hr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/hu.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/id.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/is.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/it.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/ja.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/ka.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/km.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/ko.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/ku.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/lt.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/lv.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/mk.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/mn.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/ms.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/nb.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/nl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/no.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/pl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/pt-br.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/pt.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/ro.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/ru.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/si.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/sk.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/sl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/sq.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/sr-latn.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/sr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/sv.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/th.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/tr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/tt.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/ug.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/uk.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/vi.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/zh-cn.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/lang/zh.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/smiley/plugin.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/_translationstatus.txt create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/af.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/ar.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/bg.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/ca.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/cs.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/cy.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/da.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/el.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/en-gb.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/eo.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/es.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/et.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/fa.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/fi.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/fr-ca.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/fr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/gl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/he.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/hr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/hu.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/id.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/it.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/ja.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/km.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/ko.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/ku.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/lt.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/lv.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/nb.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/nl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/no.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/pl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/pt-br.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/pt.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/ru.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/si.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/sk.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/sl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/sq.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/sv.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/th.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/tr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/tt.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/ug.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/uk.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/vi.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/zh-cn.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/lang/zh.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/specialchar.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/specialchar.js.orig create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/specialchar/dialogs/specialchar.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/table/dialogs/table.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/table/dialogs/table.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/tableselection/styles/tableselection.css create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/tabletools/dialogs/tableCell.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/tabletools/dialogs/tableCell.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/tags/dialogs/tags.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/tags/dialogs/tags.js.unc create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/tags/images/icon.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/tags/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/tags/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/tags/lang/fr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/tags/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/timestamp/LICENSE.md create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/timestamp/icons/timestamp.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/timestamp/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/timestamp/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/timestamp/lang/fr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/timestamp/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/images/truetype.gif create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/images/truetype.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/da.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/es.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/fi.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/it.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/ja.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/nl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/ru.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/sv.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/zh-tw.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/lang/zh.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/truetype/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/version create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/dialogs/wrap.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/icons/wrap.png create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/ar.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/bn.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/cs.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/da.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/de-informal.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/de.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/en.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/eo.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/es.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/fa.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/fr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/hr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/hu.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/it.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/ja.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/ko.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/nl.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/no.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/pt-br.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/ru.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/sk.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/tr.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/zh-tw.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/lang/zh.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wrap/plugin.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wsc/LICENSE.md create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wsc/README.md create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wsc/dialogs/ciframe.html create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wsc/dialogs/tmpFrameset.html create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wsc/dialogs/wsc.css create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wsc/dialogs/wsc.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wsc/dialogs/wsc_ie.js create mode 100644 lib/plugins/ckgedit/ckeditor/plugins/wsc/skins/moono-lisa/wsc.css create mode 100644 lib/plugins/ckgedit/ckeditor/schemes.php create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/dialog.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/dialog_ie.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/dialog_ie7.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/dialog_ie8.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/dialog_iequirks.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/editor.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/editor_ie.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/editor_ie7.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/editor_ie8.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/editor_iequirks.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/icons.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/icons_hidpi.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/images/dialog_sides.gif create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/images/dialog_sides.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/images/dialog_sides_rtl.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/images/mini.gif create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/images/spinner.gif create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/images/sprites.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/images/sprites_ie6.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/images/toolbar_start.gif create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/readme.md create mode 100644 lib/plugins/ckgedit/ckeditor/skins/kama/skin.js create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/dialog.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/dialog_ie.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/dialog_ie8.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/dialog_iequirks.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/editor.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/editor_gecko.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/editor_ie.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/editor_ie8.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/editor_iequirks.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/icons.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/icons_hidpi.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/images/arrow.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/images/close.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/images/hidpi/close.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/images/hidpi/lock-open.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/images/hidpi/lock.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/images/hidpi/refresh.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/images/lock-open.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/images/lock.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/images/refresh.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/images/spinner.gif create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono-lisa/readme.md create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/dialog.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/dialog_ie.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/dialog_ie7.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/dialog_ie8.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/dialog_iequirks.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/dialog_opera.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/editor.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/editor_gecko.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/editor_ie.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/editor_ie7.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/editor_ie8.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/editor_iequirks.css create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/icons.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/icons_hidpi.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/arrow.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/close.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/hidpi/close.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/hidpi/lock-open.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/hidpi/lock.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/hidpi/refresh.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/lock-open.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/lock.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/mini.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/refresh.png create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/images/spinner.gif create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/readme.md create mode 100644 lib/plugins/ckgedit/ckeditor/skins/moono/skin.js create mode 100644 lib/plugins/ckgedit/ckeditor/styles.js create mode 100644 lib/plugins/ckgedit/ckeditor/useheading.php create mode 100644 lib/plugins/ckgedit/conf/default.php create mode 100644 lib/plugins/ckgedit/conf/metadata.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/browser.css create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/browser.html create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/frmactualfolder.html create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/frmcreatefolder.html create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/frmfolders.html create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/frmresourceslist.html create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/frmresourcetype.html create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/frmupload.html create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/ButtonArrow.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/Folder.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/Folder32.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/FolderOpened.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/FolderOpened32.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/FolderOpened32.psd create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/FolderOpened32RO.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/FolderOpenedRO.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/FolderOpenedRO.psd create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/FolderRO.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/FolderUp.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/ai.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/avi.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/bmp.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/cs.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/default.icon.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/dll.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/doc.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/exe.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/fla.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/gif.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/htm.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/html.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/jpg.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/js.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/mdb.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/mp3.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/pdf.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/png.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/ppt.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/rdp.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/swf.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/swt.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/txt.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/vsd.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/xls.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/xml.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/32/zip.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/ai.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/avi.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/bmp.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/cs.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/default.icon.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/dll.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/doc.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/exe.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/fla.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/gif.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/htm.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/html.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/jpg.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/js.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/mdb.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/mp3.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/pdf.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/png.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/ppt.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/rdp.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/swf.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/swt.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/txt.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/vsd.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/xls.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/xml.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/icons/zip.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/spacer.gif create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/images/trash.png create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/js/browser.js create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/js/common.js create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/js/fckxml.js create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/js/language.js create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/js/safeFN_class.js create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/temp.css create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/Input.class.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/SafeFN.class.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/basexml.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/check_acl.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/commands.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/config.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/connector.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/dwfck_sessions.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/input_utils.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/io.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/phpcompat.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/upload.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/useheading.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/utf8.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/util.php create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/test.html create mode 100644 lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/uploadtest.html create mode 100644 lib/plugins/ckgedit/fckeditor/userfiles/.htaccess create mode 100644 lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.closed create mode 100644 lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.open create mode 100644 lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.security create mode 100644 lib/plugins/ckgedit/fckeditor/userfiles/blink.jpg create mode 120000 lib/plugins/ckgedit/fckeditor/userfiles/file create mode 120000 lib/plugins/ckgedit/fckeditor/userfiles/flash create mode 120000 lib/plugins/ckgedit/fckeditor/userfiles/image create mode 120000 lib/plugins/ckgedit/fckeditor/userfiles/media create mode 100644 lib/plugins/ckgedit/helper.php create mode 100644 lib/plugins/ckgedit/images/keyboard.png create mode 100644 lib/plugins/ckgedit/images/larger.gif create mode 100644 lib/plugins/ckgedit/images/smaller.gif create mode 100644 lib/plugins/ckgedit/lang/ar/lang.php create mode 100644 lib/plugins/ckgedit/lang/cs/lang.php create mode 100644 lib/plugins/ckgedit/lang/de-informal/lang.php create mode 100644 lib/plugins/ckgedit/lang/de-informal/settings.php create mode 100644 lib/plugins/ckgedit/lang/de/lang.php create mode 100644 lib/plugins/ckgedit/lang/de/merger.txt create mode 100644 lib/plugins/ckgedit/lang/de/scayt.txt create mode 100644 lib/plugins/ckgedit/lang/de/settings.php create mode 100644 lib/plugins/ckgedit/lang/de/style.txt create mode 100644 lib/plugins/ckgedit/lang/en.4.9.js.beautified create mode 100644 lib/plugins/ckgedit/lang/en/hogfather.txt create mode 100644 lib/plugins/ckgedit/lang/en/lang.php create mode 100644 lib/plugins/ckgedit/lang/en/scayt.txt create mode 100644 lib/plugins/ckgedit/lang/en/settings.php create mode 100644 lib/plugins/ckgedit/lang/en/style.txt create mode 100644 lib/plugins/ckgedit/lang/eo/lang.php create mode 100644 lib/plugins/ckgedit/lang/eo/settings.php create mode 100644 lib/plugins/ckgedit/lang/es/lang.php create mode 100644 lib/plugins/ckgedit/lang/es/merger.txt create mode 100644 lib/plugins/ckgedit/lang/es/scayt.txt create mode 100644 lib/plugins/ckgedit/lang/es/settings.php create mode 100644 lib/plugins/ckgedit/lang/fa/lang.php create mode 100644 lib/plugins/ckgedit/lang/fa/merger.txt create mode 100644 lib/plugins/ckgedit/lang/fa/scayt.txt create mode 100644 lib/plugins/ckgedit/lang/fa/settings.php create mode 100644 lib/plugins/ckgedit/lang/fr/lang.php create mode 100644 lib/plugins/ckgedit/lang/fr/merger.txt create mode 100644 lib/plugins/ckgedit/lang/fr/scayt.txt create mode 100644 lib/plugins/ckgedit/lang/fr/settings.php create mode 100644 lib/plugins/ckgedit/lang/hr/lang.php create mode 100644 lib/plugins/ckgedit/lang/hr/merger.txt create mode 100644 lib/plugins/ckgedit/lang/hr/scayt.txt create mode 100644 lib/plugins/ckgedit/lang/hr/settings.php create mode 100644 lib/plugins/ckgedit/lang/it/lang.php create mode 100644 lib/plugins/ckgedit/lang/it/settings.php create mode 100644 lib/plugins/ckgedit/lang/ja/lang.php create mode 100644 lib/plugins/ckgedit/lang/ja/settings.php create mode 100644 lib/plugins/ckgedit/lang/ko/lang.php create mode 100644 lib/plugins/ckgedit/lang/ko/settings.php create mode 100644 lib/plugins/ckgedit/lang/nl/lang.php create mode 100644 lib/plugins/ckgedit/lang/nl/merger.txt create mode 100644 lib/plugins/ckgedit/lang/nl/scayt.txt create mode 100644 lib/plugins/ckgedit/lang/nl/settings.php create mode 100644 lib/plugins/ckgedit/lang/pl/lang.php create mode 100644 lib/plugins/ckgedit/lang/pt-br/lang.php create mode 100644 lib/plugins/ckgedit/lang/ru/lang.php create mode 100644 lib/plugins/ckgedit/lang/ru/merger.txt create mode 100644 lib/plugins/ckgedit/lang/ru/scayt.txt create mode 100644 lib/plugins/ckgedit/lang/ru/settings.php create mode 100644 lib/plugins/ckgedit/lang/sr/lang.php create mode 100644 lib/plugins/ckgedit/lang/sv/lang.php create mode 100644 lib/plugins/ckgedit/lang/sv/settings.php create mode 100644 lib/plugins/ckgedit/lang/vi/lang.php create mode 100644 lib/plugins/ckgedit/lang/vi/merger.txt create mode 100644 lib/plugins/ckgedit/lang/vi/scayt.txt create mode 100644 lib/plugins/ckgedit/lang/vi/settings.php create mode 100644 lib/plugins/ckgedit/lang/zh-tw/lang.php create mode 100644 lib/plugins/ckgedit/lang/zh-tw/settings.php create mode 100644 lib/plugins/ckgedit/lang/zh/lang.php create mode 100644 lib/plugins/ckgedit/lang/zh/settings.php create mode 100644 lib/plugins/ckgedit/locktimer.js create mode 100644 lib/plugins/ckgedit/manager.dat create mode 100644 lib/plugins/ckgedit/plugin.info.txt create mode 100644 lib/plugins/ckgedit/renderer.php create mode 100644 lib/plugins/ckgedit/script.js create mode 100644 lib/plugins/ckgedit/scripts/add_v_animal.sh create mode 100644 lib/plugins/ckgedit/scripts/addanimal.sh create mode 100644 lib/plugins/ckgedit/scripts/css6.php create mode 100644 lib/plugins/ckgedit/scripts/draft_delete.php create mode 100644 lib/plugins/ckgedit/scripts/mediamgr.js create mode 100644 lib/plugins/ckgedit/scripts/parse_wiki-cmpr.js create mode 100644 lib/plugins/ckgedit/scripts/parse_wiki.js.unc create mode 100644 lib/plugins/ckgedit/scripts/safeFN_class-cmpr.js create mode 100644 lib/plugins/ckgedit/scripts/safeFN_class.js create mode 100644 lib/plugins/ckgedit/scripts/safeFN_cmpr.js create mode 100644 lib/plugins/ckgedit/scripts/setsamesite.php create mode 100644 lib/plugins/ckgedit/scripts/table_debugging_code.js.unc create mode 100644 lib/plugins/ckgedit/style.css create mode 100644 lib/plugins/ckgedit/syntax/font.php create mode 100644 lib/plugins/ckgedit/syntax/specials.php create mode 100644 lib/plugins/ckgedit/version create mode 100644 lib/plugins/cli.php create mode 100644 lib/plugins/config/admin.php create mode 100644 lib/plugins/config/admin.svg create mode 100644 lib/plugins/config/core/ConfigParser.php create mode 100644 lib/plugins/config/core/Configuration.php create mode 100644 lib/plugins/config/core/Loader.php create mode 100644 lib/plugins/config/core/Setting/Setting.php create mode 100644 lib/plugins/config/core/Setting/SettingArray.php create mode 100644 lib/plugins/config/core/Setting/SettingAuthtype.php create mode 100644 lib/plugins/config/core/Setting/SettingCompression.php create mode 100644 lib/plugins/config/core/Setting/SettingDirchoice.php create mode 100644 lib/plugins/config/core/Setting/SettingDisableactions.php create mode 100644 lib/plugins/config/core/Setting/SettingEmail.php create mode 100644 lib/plugins/config/core/Setting/SettingFieldset.php create mode 100644 lib/plugins/config/core/Setting/SettingHidden.php create mode 100644 lib/plugins/config/core/Setting/SettingImConvert.php create mode 100644 lib/plugins/config/core/Setting/SettingLicense.php create mode 100644 lib/plugins/config/core/Setting/SettingMulticheckbox.php create mode 100644 lib/plugins/config/core/Setting/SettingMultichoice.php create mode 100644 lib/plugins/config/core/Setting/SettingNoClass.php create mode 100644 lib/plugins/config/core/Setting/SettingNoDefault.php create mode 100644 lib/plugins/config/core/Setting/SettingNoKnownClass.php create mode 100644 lib/plugins/config/core/Setting/SettingNumeric.php create mode 100644 lib/plugins/config/core/Setting/SettingNumericopt.php create mode 100644 lib/plugins/config/core/Setting/SettingOnoff.php create mode 100644 lib/plugins/config/core/Setting/SettingPassword.php create mode 100644 lib/plugins/config/core/Setting/SettingRegex.php create mode 100644 lib/plugins/config/core/Setting/SettingRenderer.php create mode 100644 lib/plugins/config/core/Setting/SettingSavedir.php create mode 100644 lib/plugins/config/core/Setting/SettingSepchar.php create mode 100644 lib/plugins/config/core/Setting/SettingString.php create mode 100644 lib/plugins/config/core/Setting/SettingUndefined.php create mode 100644 lib/plugins/config/core/Writer.php create mode 100644 lib/plugins/config/images/danger.png create mode 100644 lib/plugins/config/images/security.png create mode 100644 lib/plugins/config/images/warning.png create mode 100644 lib/plugins/config/lang/af/lang.php create mode 100644 lib/plugins/config/lang/ar/intro.txt create mode 100644 lib/plugins/config/lang/ar/lang.php create mode 100644 lib/plugins/config/lang/bg/intro.txt create mode 100644 lib/plugins/config/lang/bg/lang.php create mode 100644 lib/plugins/config/lang/ca-valencia/intro.txt create mode 100644 lib/plugins/config/lang/ca-valencia/lang.php create mode 100644 lib/plugins/config/lang/ca/intro.txt create mode 100644 lib/plugins/config/lang/ca/lang.php create mode 100644 lib/plugins/config/lang/ckb/intro.txt create mode 100644 lib/plugins/config/lang/ckb/lang.php create mode 100644 lib/plugins/config/lang/cs/intro.txt create mode 100644 lib/plugins/config/lang/cs/lang.php create mode 100644 lib/plugins/config/lang/cy/intro.txt create mode 100644 lib/plugins/config/lang/cy/lang.php create mode 100644 lib/plugins/config/lang/da/intro.txt create mode 100644 lib/plugins/config/lang/da/lang.php create mode 100644 lib/plugins/config/lang/de-informal/intro.txt create mode 100644 lib/plugins/config/lang/de-informal/lang.php create mode 100644 lib/plugins/config/lang/de/intro.txt create mode 100644 lib/plugins/config/lang/de/lang.php create mode 100644 lib/plugins/config/lang/el/intro.txt create mode 100644 lib/plugins/config/lang/el/lang.php create mode 100644 lib/plugins/config/lang/en/intro.txt create mode 100644 lib/plugins/config/lang/en/lang.php create mode 100644 lib/plugins/config/lang/eo/intro.txt create mode 100644 lib/plugins/config/lang/eo/lang.php create mode 100644 lib/plugins/config/lang/es/intro.txt create mode 100644 lib/plugins/config/lang/es/lang.php create mode 100644 lib/plugins/config/lang/et/lang.php create mode 100644 lib/plugins/config/lang/eu/intro.txt create mode 100644 lib/plugins/config/lang/eu/lang.php create mode 100644 lib/plugins/config/lang/fa/intro.txt create mode 100644 lib/plugins/config/lang/fa/lang.php create mode 100644 lib/plugins/config/lang/fi/intro.txt create mode 100644 lib/plugins/config/lang/fi/lang.php create mode 100644 lib/plugins/config/lang/fr/intro.txt create mode 100644 lib/plugins/config/lang/fr/lang.php create mode 100644 lib/plugins/config/lang/gl/intro.txt create mode 100644 lib/plugins/config/lang/gl/lang.php create mode 100644 lib/plugins/config/lang/he/intro.txt create mode 100644 lib/plugins/config/lang/he/lang.php create mode 100644 lib/plugins/config/lang/hi/lang.php create mode 100644 lib/plugins/config/lang/hr/intro.txt create mode 100644 lib/plugins/config/lang/hr/lang.php create mode 100644 lib/plugins/config/lang/hu/intro.txt create mode 100644 lib/plugins/config/lang/hu/lang.php create mode 100644 lib/plugins/config/lang/ia/intro.txt create mode 100644 lib/plugins/config/lang/ia/lang.php create mode 100644 lib/plugins/config/lang/id-ni/intro.txt create mode 100644 lib/plugins/config/lang/id-ni/lang.php create mode 100644 lib/plugins/config/lang/id/intro.txt create mode 100644 lib/plugins/config/lang/is/lang.php create mode 100644 lib/plugins/config/lang/it/intro.txt create mode 100644 lib/plugins/config/lang/it/lang.php create mode 100644 lib/plugins/config/lang/ja/intro.txt create mode 100644 lib/plugins/config/lang/ja/lang.php create mode 100644 lib/plugins/config/lang/ko/intro.txt create mode 100644 lib/plugins/config/lang/ko/lang.php create mode 100644 lib/plugins/config/lang/la/intro.txt create mode 100644 lib/plugins/config/lang/la/lang.php create mode 100644 lib/plugins/config/lang/lb/intro.txt create mode 100644 lib/plugins/config/lang/lt/intro.txt create mode 100644 lib/plugins/config/lang/lt/lang.php create mode 100644 lib/plugins/config/lang/lv/intro.txt create mode 100644 lib/plugins/config/lang/lv/lang.php create mode 100644 lib/plugins/config/lang/mr/intro.txt create mode 100644 lib/plugins/config/lang/mr/lang.php create mode 100644 lib/plugins/config/lang/ne/lang.php create mode 100644 lib/plugins/config/lang/nl/intro.txt create mode 100644 lib/plugins/config/lang/nl/lang.php create mode 100644 lib/plugins/config/lang/no/intro.txt create mode 100644 lib/plugins/config/lang/no/lang.php create mode 100644 lib/plugins/config/lang/pl/intro.txt create mode 100644 lib/plugins/config/lang/pl/lang.php create mode 100644 lib/plugins/config/lang/pt-br/intro.txt create mode 100644 lib/plugins/config/lang/pt-br/lang.php create mode 100644 lib/plugins/config/lang/pt/intro.txt create mode 100644 lib/plugins/config/lang/pt/lang.php create mode 100644 lib/plugins/config/lang/ro/intro.txt create mode 100644 lib/plugins/config/lang/ro/lang.php create mode 100644 lib/plugins/config/lang/ru/intro.txt create mode 100644 lib/plugins/config/lang/ru/lang.php create mode 100644 lib/plugins/config/lang/sk/intro.txt create mode 100644 lib/plugins/config/lang/sk/lang.php create mode 100644 lib/plugins/config/lang/sl/intro.txt create mode 100644 lib/plugins/config/lang/sl/lang.php create mode 100644 lib/plugins/config/lang/sq/intro.txt create mode 100644 lib/plugins/config/lang/sq/lang.php create mode 100644 lib/plugins/config/lang/sr/intro.txt create mode 100644 lib/plugins/config/lang/sr/lang.php create mode 100644 lib/plugins/config/lang/sv/intro.txt create mode 100644 lib/plugins/config/lang/sv/lang.php create mode 100644 lib/plugins/config/lang/th/lang.php create mode 100644 lib/plugins/config/lang/tr/intro.txt create mode 100644 lib/plugins/config/lang/tr/lang.php create mode 100644 lib/plugins/config/lang/uk/intro.txt create mode 100644 lib/plugins/config/lang/uk/lang.php create mode 100644 lib/plugins/config/lang/vi/intro.txt create mode 100644 lib/plugins/config/lang/vi/lang.php create mode 100644 lib/plugins/config/lang/zh-tw/intro.txt create mode 100644 lib/plugins/config/lang/zh-tw/lang.php create mode 100644 lib/plugins/config/lang/zh/intro.txt create mode 100644 lib/plugins/config/lang/zh/lang.php create mode 100644 lib/plugins/config/plugin.info.txt create mode 100644 lib/plugins/config/settings/config.metadata.php create mode 100644 lib/plugins/config/style.css create mode 100644 lib/plugins/extension/action.php create mode 100644 lib/plugins/extension/admin.php create mode 100644 lib/plugins/extension/admin.svg create mode 100644 lib/plugins/extension/all.less create mode 100644 lib/plugins/extension/cli.php create mode 100644 lib/plugins/extension/helper/extension.php create mode 100644 lib/plugins/extension/helper/gui.php create mode 100644 lib/plugins/extension/helper/list.php create mode 100644 lib/plugins/extension/helper/repository.php create mode 100644 lib/plugins/extension/images/bug.gif create mode 100644 lib/plugins/extension/images/disabled.png create mode 100644 lib/plugins/extension/images/donate.png create mode 100644 lib/plugins/extension/images/down.png create mode 100644 lib/plugins/extension/images/enabled.png create mode 100644 lib/plugins/extension/images/icons.xcf create mode 100644 lib/plugins/extension/images/license.txt create mode 100644 lib/plugins/extension/images/overlay.png create mode 100644 lib/plugins/extension/images/plugin.png create mode 100644 lib/plugins/extension/images/tag.png create mode 100644 lib/plugins/extension/images/template.png create mode 100644 lib/plugins/extension/images/up.png create mode 100644 lib/plugins/extension/images/warning.png create mode 100644 lib/plugins/extension/lang/bg/intro_install.txt create mode 100644 lib/plugins/extension/lang/bg/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/bg/intro_search.txt create mode 100644 lib/plugins/extension/lang/bg/intro_templates.txt create mode 100644 lib/plugins/extension/lang/bg/lang.php create mode 100644 lib/plugins/extension/lang/ca/lang.php create mode 100644 lib/plugins/extension/lang/ckb/intro_install.txt create mode 100644 lib/plugins/extension/lang/ckb/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/ckb/intro_search.txt create mode 100644 lib/plugins/extension/lang/ckb/intro_templates.txt create mode 100644 lib/plugins/extension/lang/ckb/lang.php create mode 100644 lib/plugins/extension/lang/cs/intro_install.txt create mode 100644 lib/plugins/extension/lang/cs/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/cs/intro_search.txt create mode 100644 lib/plugins/extension/lang/cs/intro_templates.txt create mode 100644 lib/plugins/extension/lang/cs/lang.php create mode 100644 lib/plugins/extension/lang/cy/intro_install.txt create mode 100644 lib/plugins/extension/lang/cy/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/cy/intro_search.txt create mode 100644 lib/plugins/extension/lang/cy/intro_templates.txt create mode 100644 lib/plugins/extension/lang/cy/lang.php create mode 100644 lib/plugins/extension/lang/da/intro_install.txt create mode 100644 lib/plugins/extension/lang/da/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/da/intro_search.txt create mode 100644 lib/plugins/extension/lang/da/intro_templates.txt create mode 100644 lib/plugins/extension/lang/da/lang.php create mode 100644 lib/plugins/extension/lang/de-informal/intro_install.txt create mode 100644 lib/plugins/extension/lang/de-informal/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/de-informal/intro_search.txt create mode 100644 lib/plugins/extension/lang/de-informal/intro_templates.txt create mode 100644 lib/plugins/extension/lang/de-informal/lang.php create mode 100644 lib/plugins/extension/lang/de/intro_install.txt create mode 100644 lib/plugins/extension/lang/de/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/de/intro_search.txt create mode 100644 lib/plugins/extension/lang/de/intro_templates.txt create mode 100644 lib/plugins/extension/lang/de/lang.php create mode 100644 lib/plugins/extension/lang/el/intro_install.txt create mode 100644 lib/plugins/extension/lang/el/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/el/intro_search.txt create mode 100644 lib/plugins/extension/lang/el/intro_templates.txt create mode 100644 lib/plugins/extension/lang/el/lang.php create mode 100644 lib/plugins/extension/lang/en/intro_install.txt create mode 100644 lib/plugins/extension/lang/en/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/en/intro_search.txt create mode 100644 lib/plugins/extension/lang/en/intro_templates.txt create mode 100644 lib/plugins/extension/lang/en/lang.php create mode 100644 lib/plugins/extension/lang/eo/intro_install.txt create mode 100644 lib/plugins/extension/lang/eo/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/eo/intro_search.txt create mode 100644 lib/plugins/extension/lang/eo/intro_templates.txt create mode 100644 lib/plugins/extension/lang/eo/lang.php create mode 100644 lib/plugins/extension/lang/es/intro_install.txt create mode 100644 lib/plugins/extension/lang/es/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/es/intro_search.txt create mode 100644 lib/plugins/extension/lang/es/intro_templates.txt create mode 100644 lib/plugins/extension/lang/es/lang.php create mode 100644 lib/plugins/extension/lang/fa/intro_install.txt create mode 100644 lib/plugins/extension/lang/fa/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/fa/intro_search.txt create mode 100644 lib/plugins/extension/lang/fa/intro_templates.txt create mode 100644 lib/plugins/extension/lang/fa/lang.php create mode 100644 lib/plugins/extension/lang/fi/lang.php create mode 100644 lib/plugins/extension/lang/fr/intro_install.txt create mode 100644 lib/plugins/extension/lang/fr/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/fr/intro_search.txt create mode 100644 lib/plugins/extension/lang/fr/intro_templates.txt create mode 100644 lib/plugins/extension/lang/fr/lang.php create mode 100644 lib/plugins/extension/lang/he/lang.php create mode 100644 lib/plugins/extension/lang/hr/intro_install.txt create mode 100644 lib/plugins/extension/lang/hr/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/hr/intro_search.txt create mode 100644 lib/plugins/extension/lang/hr/intro_templates.txt create mode 100644 lib/plugins/extension/lang/hr/lang.php create mode 100644 lib/plugins/extension/lang/hu/intro_install.txt create mode 100644 lib/plugins/extension/lang/hu/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/hu/intro_search.txt create mode 100644 lib/plugins/extension/lang/hu/intro_templates.txt create mode 100644 lib/plugins/extension/lang/hu/lang.php create mode 100644 lib/plugins/extension/lang/it/intro_install.txt create mode 100644 lib/plugins/extension/lang/it/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/it/intro_search.txt create mode 100644 lib/plugins/extension/lang/it/intro_templates.txt create mode 100644 lib/plugins/extension/lang/it/lang.php create mode 100644 lib/plugins/extension/lang/ja/intro_install.txt create mode 100644 lib/plugins/extension/lang/ja/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/ja/intro_search.txt create mode 100644 lib/plugins/extension/lang/ja/intro_templates.txt create mode 100644 lib/plugins/extension/lang/ja/lang.php create mode 100644 lib/plugins/extension/lang/ko/intro_install.txt create mode 100644 lib/plugins/extension/lang/ko/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/ko/intro_search.txt create mode 100644 lib/plugins/extension/lang/ko/intro_templates.txt create mode 100644 lib/plugins/extension/lang/ko/lang.php create mode 100644 lib/plugins/extension/lang/lv/intro_templates.txt create mode 100644 lib/plugins/extension/lang/lv/lang.php create mode 100644 lib/plugins/extension/lang/nl/intro_install.txt create mode 100644 lib/plugins/extension/lang/nl/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/nl/intro_search.txt create mode 100644 lib/plugins/extension/lang/nl/intro_templates.txt create mode 100644 lib/plugins/extension/lang/nl/lang.php create mode 100644 lib/plugins/extension/lang/no/intro_install.txt create mode 100644 lib/plugins/extension/lang/no/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/no/intro_search.txt create mode 100644 lib/plugins/extension/lang/no/intro_templates.txt create mode 100644 lib/plugins/extension/lang/no/lang.php create mode 100644 lib/plugins/extension/lang/pl/intro_install.txt create mode 100644 lib/plugins/extension/lang/pl/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/pl/intro_search.txt create mode 100644 lib/plugins/extension/lang/pl/intro_templates.txt create mode 100644 lib/plugins/extension/lang/pl/lang.php create mode 100644 lib/plugins/extension/lang/pt-br/intro_install.txt create mode 100644 lib/plugins/extension/lang/pt-br/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/pt-br/intro_search.txt create mode 100644 lib/plugins/extension/lang/pt-br/intro_templates.txt create mode 100644 lib/plugins/extension/lang/pt-br/lang.php create mode 100644 lib/plugins/extension/lang/pt/intro_install.txt create mode 100644 lib/plugins/extension/lang/pt/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/pt/intro_search.txt create mode 100644 lib/plugins/extension/lang/pt/intro_templates.txt create mode 100644 lib/plugins/extension/lang/pt/lang.php create mode 100644 lib/plugins/extension/lang/ru/intro_install.txt create mode 100644 lib/plugins/extension/lang/ru/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/ru/intro_search.txt create mode 100644 lib/plugins/extension/lang/ru/intro_templates.txt create mode 100644 lib/plugins/extension/lang/ru/lang.php create mode 100644 lib/plugins/extension/lang/sk/intro_install.txt create mode 100644 lib/plugins/extension/lang/sk/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/sk/intro_search.txt create mode 100644 lib/plugins/extension/lang/sk/intro_templates.txt create mode 100644 lib/plugins/extension/lang/sk/lang.php create mode 100644 lib/plugins/extension/lang/sr/intro_install.txt create mode 100644 lib/plugins/extension/lang/sr/lang.php create mode 100644 lib/plugins/extension/lang/sv/lang.php create mode 100644 lib/plugins/extension/lang/tr/lang.php create mode 100644 lib/plugins/extension/lang/uk/lang.php create mode 100644 lib/plugins/extension/lang/vi/intro_install.txt create mode 100644 lib/plugins/extension/lang/vi/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/vi/intro_search.txt create mode 100644 lib/plugins/extension/lang/vi/intro_templates.txt create mode 100644 lib/plugins/extension/lang/vi/lang.php create mode 100644 lib/plugins/extension/lang/zh-tw/intro_install.txt create mode 100644 lib/plugins/extension/lang/zh-tw/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/zh-tw/lang.php create mode 100644 lib/plugins/extension/lang/zh/intro_install.txt create mode 100644 lib/plugins/extension/lang/zh/intro_plugins.txt create mode 100644 lib/plugins/extension/lang/zh/intro_search.txt create mode 100644 lib/plugins/extension/lang/zh/intro_templates.txt create mode 100644 lib/plugins/extension/lang/zh/lang.php create mode 100644 lib/plugins/extension/plugin.info.txt create mode 100644 lib/plugins/extension/script.js create mode 100644 lib/plugins/extension/style.less create mode 100644 lib/plugins/index.html create mode 100644 lib/plugins/indexmenu/.github/workflows/dokuwiki.yml create mode 100644 lib/plugins/indexmenu/CREDITS create mode 100644 lib/plugins/indexmenu/Search.php create mode 100644 lib/plugins/indexmenu/_test/ActionTest.php create mode 100644 lib/plugins/indexmenu/_test/AjaxRequestsTest.php create mode 100644 lib/plugins/indexmenu/_test/GeneralTest.php create mode 100644 lib/plugins/indexmenu/_test/IndexmenuSyntaxTest.php create mode 100644 lib/plugins/indexmenu/action.php create mode 100644 lib/plugins/indexmenu/ajax.php create mode 100644 lib/plugins/indexmenu/all.less create mode 100644 lib/plugins/indexmenu/conf/default.php create mode 100644 lib/plugins/indexmenu/conf/metadata.php create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/base.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/empty.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/folder.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/info.txt create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/join.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/line.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/minus.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/page.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/plus.png create mode 100644 lib/plugins/indexmenu/images/bj-tango.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/base.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/empty.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/folder.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/info.txt create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/join.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/line.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/minus.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/page.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/plus.png create mode 100644 lib/plugins/indexmenu/images/bj_ubuntu.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/bw.png/base.png create mode 100644 lib/plugins/indexmenu/images/bw.png/empty.png create mode 100644 lib/plugins/indexmenu/images/bw.png/folder.png create mode 100644 lib/plugins/indexmenu/images/bw.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/bw.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/bw.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/bw.png/info.txt create mode 100644 lib/plugins/indexmenu/images/bw.png/join.png create mode 100644 lib/plugins/indexmenu/images/bw.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/bw.png/line.png create mode 100644 lib/plugins/indexmenu/images/bw.png/minus.png create mode 100644 lib/plugins/indexmenu/images/bw.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/bw.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/bw.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/bw.png/page.png create mode 100644 lib/plugins/indexmenu/images/bw.png/plus.png create mode 100644 lib/plugins/indexmenu/images/bw.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/close.gif create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/base.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/empty.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/folder.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/info.txt create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/join.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/line.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/minus.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/page.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/plus.png create mode 100644 lib/plugins/indexmenu/images/contis_tango.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/default/base.gif create mode 100644 lib/plugins/indexmenu/images/default/empty.gif create mode 100644 lib/plugins/indexmenu/images/default/folder.gif create mode 100644 lib/plugins/indexmenu/images/default/folderh.gif create mode 100644 lib/plugins/indexmenu/images/default/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/default/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/default/info.txt create mode 100644 lib/plugins/indexmenu/images/default/join.gif create mode 100644 lib/plugins/indexmenu/images/default/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/default/line.gif create mode 100644 lib/plugins/indexmenu/images/default/minus.gif create mode 100644 lib/plugins/indexmenu/images/default/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/default/nolines_minus.gif create mode 100644 lib/plugins/indexmenu/images/default/nolines_plus.gif create mode 100644 lib/plugins/indexmenu/images/default/page.gif create mode 100644 lib/plugins/indexmenu/images/default/plus.gif create mode 100644 lib/plugins/indexmenu/images/default/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/doku/base.gif create mode 100644 lib/plugins/indexmenu/images/doku/empty.gif create mode 100644 lib/plugins/indexmenu/images/doku/folder.gif create mode 100644 lib/plugins/indexmenu/images/doku/folderh.gif create mode 100644 lib/plugins/indexmenu/images/doku/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/doku/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/doku/info.txt create mode 100644 lib/plugins/indexmenu/images/doku/join.gif create mode 100644 lib/plugins/indexmenu/images/doku/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/doku/line.gif create mode 100644 lib/plugins/indexmenu/images/doku/minus.gif create mode 100644 lib/plugins/indexmenu/images/doku/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/doku/nolines_minus.gif create mode 100644 lib/plugins/indexmenu/images/doku/nolines_plus.gif create mode 100644 lib/plugins/indexmenu/images/doku/page.gif create mode 100644 lib/plugins/indexmenu/images/doku/plus.gif create mode 100644 lib/plugins/indexmenu/images/doku/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/doku2/Thumbs.db create mode 100644 lib/plugins/indexmenu/images/doku2/base.gif create mode 100644 lib/plugins/indexmenu/images/doku2/empty.gif create mode 100644 lib/plugins/indexmenu/images/doku2/folder.gif create mode 100644 lib/plugins/indexmenu/images/doku2/folderh.gif create mode 100644 lib/plugins/indexmenu/images/doku2/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/doku2/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/doku2/info.txt create mode 100644 lib/plugins/indexmenu/images/doku2/join.gif create mode 100644 lib/plugins/indexmenu/images/doku2/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/doku2/line.gif create mode 100644 lib/plugins/indexmenu/images/doku2/minus.gif create mode 100644 lib/plugins/indexmenu/images/doku2/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/doku2/nolines_minus.gif create mode 100644 lib/plugins/indexmenu/images/doku2/nolines_plus.gif create mode 100644 lib/plugins/indexmenu/images/doku2/page.gif create mode 100644 lib/plugins/indexmenu/images/doku2/plus.gif create mode 100644 lib/plugins/indexmenu/images/doku2/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/doku2/style.css create mode 100644 lib/plugins/indexmenu/images/drktheme/base.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/empty.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/folder.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/folderh.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/info.txt create mode 100644 lib/plugins/indexmenu/images/drktheme/join.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/line.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/minus.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/nolines_minus.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/nolines_plus.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/page.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/plus.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/drktheme/style.css create mode 100644 lib/plugins/indexmenu/images/dryoo.png/base.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/empty.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/folder.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/info.txt create mode 100644 lib/plugins/indexmenu/images/dryoo.png/join.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/line.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/minus.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/page.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/plus.png create mode 100644 lib/plugins/indexmenu/images/dryoo.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/empty.gif create mode 100644 lib/plugins/indexmenu/images/gnome.png/base.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/empty.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/folder.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/info.txt create mode 100644 lib/plugins/indexmenu/images/gnome.png/join.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/line.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/minus.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/page.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/plus.png create mode 100644 lib/plugins/indexmenu/images/gnome.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/human.png/base.png create mode 100644 lib/plugins/indexmenu/images/human.png/empty.png create mode 100644 lib/plugins/indexmenu/images/human.png/folder.png create mode 100644 lib/plugins/indexmenu/images/human.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/human.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/human.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/human.png/info.txt create mode 100644 lib/plugins/indexmenu/images/human.png/join.png create mode 100644 lib/plugins/indexmenu/images/human.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/human.png/line.png create mode 100644 lib/plugins/indexmenu/images/human.png/minus.png create mode 100644 lib/plugins/indexmenu/images/human.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/human.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/human.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/human.png/page.png create mode 100644 lib/plugins/indexmenu/images/human.png/plus.png create mode 100644 lib/plugins/indexmenu/images/human.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/human.png/style.css create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/base.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/empty.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/folder.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/info.txt create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/join.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/line.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/minus.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/page.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/plus.png create mode 100644 lib/plugins/indexmenu/images/icons8metrobw.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/base.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/empty.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/folder.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/info.txt create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/join.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/line.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/minus.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/page.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/plus.png create mode 100644 lib/plugins/indexmenu/images/icons8w10bw.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/indexmenu_toolbar.png create mode 100644 lib/plugins/indexmenu/images/indextheme/base.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/empty.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/folder.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/folderh.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/info.txt create mode 100644 lib/plugins/indexmenu/images/indextheme/join.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/line.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/minus.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/page.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/plus.gif create mode 100644 lib/plugins/indexmenu/images/indextheme/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/kde.png/base.png create mode 100644 lib/plugins/indexmenu/images/kde.png/empty.png create mode 100644 lib/plugins/indexmenu/images/kde.png/folder.png create mode 100644 lib/plugins/indexmenu/images/kde.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/kde.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/kde.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/kde.png/info.txt create mode 100644 lib/plugins/indexmenu/images/kde.png/join.png create mode 100644 lib/plugins/indexmenu/images/kde.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/kde.png/line.png create mode 100644 lib/plugins/indexmenu/images/kde.png/minus.png create mode 100644 lib/plugins/indexmenu/images/kde.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/kde.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/kde.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/kde.png/page.png create mode 100644 lib/plugins/indexmenu/images/kde.png/plus.png create mode 100644 lib/plugins/indexmenu/images/kde.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/kde/base.gif create mode 100644 lib/plugins/indexmenu/images/kde/empty.gif create mode 100644 lib/plugins/indexmenu/images/kde/folder.gif create mode 100644 lib/plugins/indexmenu/images/kde/folderh.gif create mode 100644 lib/plugins/indexmenu/images/kde/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/kde/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/kde/info.txt create mode 100644 lib/plugins/indexmenu/images/kde/join.gif create mode 100644 lib/plugins/indexmenu/images/kde/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/kde/line.gif create mode 100644 lib/plugins/indexmenu/images/kde/minus.gif create mode 100644 lib/plugins/indexmenu/images/kde/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/kde/nolines_minus.gif create mode 100644 lib/plugins/indexmenu/images/kde/nolines_plus.gif create mode 100644 lib/plugins/indexmenu/images/kde/page.gif create mode 100644 lib/plugins/indexmenu/images/kde/plus.gif create mode 100644 lib/plugins/indexmenu/images/kde/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/kgs/base.gif create mode 100644 lib/plugins/indexmenu/images/kgs/empty.gif create mode 100644 lib/plugins/indexmenu/images/kgs/folder.gif create mode 100644 lib/plugins/indexmenu/images/kgs/folderh.gif create mode 100644 lib/plugins/indexmenu/images/kgs/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/kgs/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/kgs/info.txt create mode 100644 lib/plugins/indexmenu/images/kgs/join.gif create mode 100644 lib/plugins/indexmenu/images/kgs/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/kgs/line.gif create mode 100644 lib/plugins/indexmenu/images/kgs/minus.gif create mode 100644 lib/plugins/indexmenu/images/kgs/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/kgs/nolines_minus.gif create mode 100644 lib/plugins/indexmenu/images/kgs/nolines_plus.gif create mode 100644 lib/plugins/indexmenu/images/kgs/page.gif create mode 100644 lib/plugins/indexmenu/images/kgs/plus.gif create mode 100644 lib/plugins/indexmenu/images/kgs/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/larrow.gif create mode 100644 lib/plugins/indexmenu/images/leopard.png/base.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/base_1.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/base_2.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/empty.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/folder.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/info.txt create mode 100644 lib/plugins/indexmenu/images/leopard.png/join.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/line.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/minus.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/page.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/plus.png create mode 100644 lib/plugins/indexmenu/images/leopard.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/msort.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/base.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/empty.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/folder.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/folderh.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/info.txt create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/join.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/line.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/minus.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/nolines_minus.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/nolines_plus.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/page.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/plus.gif create mode 100644 lib/plugins/indexmenu/images/pcc_dotted/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/phoenity.png/base.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/empty.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/favicon.ico create mode 100644 lib/plugins/indexmenu/images/phoenity.png/folder.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/folder_open_file.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/folder_right.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/home_house.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/info.txt create mode 100644 lib/plugins/indexmenu/images/phoenity.png/join.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/line.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/minus.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/new_page.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/page.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/plus.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/phoenity.png/toc_bullet.gif create mode 100644 lib/plugins/indexmenu/images/phoenity.png/toc_bullet_red.gif create mode 100644 lib/plugins/indexmenu/images/phoenity.png/web_earth.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/base.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/empty.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/folder.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/info.txt create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/join.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/line.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/minus.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/page.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/plus.png create mode 100644 lib/plugins/indexmenu/images/prdsuser-de.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/rarrow.gif create mode 100644 lib/plugins/indexmenu/images/repository/.htaccess create mode 100644 lib/plugins/indexmenu/images/repository/bj-tango.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/bj_ubuntu.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/default.zip create mode 100644 lib/plugins/indexmenu/images/repository/doku.zip create mode 100644 lib/plugins/indexmenu/images/repository/drktheme.zip create mode 100644 lib/plugins/indexmenu/images/repository/dryoo.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/gnome.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/human.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/indextheme.zip create mode 100644 lib/plugins/indexmenu/images/repository/kde.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/kde.zip create mode 100644 lib/plugins/indexmenu/images/repository/kgs.zip create mode 100644 lib/plugins/indexmenu/images/repository/leopard.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/pcc_dotted.zip create mode 100644 lib/plugins/indexmenu/images/repository/phoenity.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/prdsuser-de.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/shiki_brave.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/simple.zip create mode 100644 lib/plugins/indexmenu/images/repository/tango.png.zip create mode 100644 lib/plugins/indexmenu/images/repository/thread.zip create mode 100644 lib/plugins/indexmenu/images/repository/thread2.zip create mode 100644 lib/plugins/indexmenu/images/repository/vista.png.zip create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/base.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/empty.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/folder.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/info.txt create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/join.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/line.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/minus.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/page.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/plus.png create mode 100644 lib/plugins/indexmenu/images/shiki_brave.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/simple/base.gif create mode 100644 lib/plugins/indexmenu/images/simple/empty.gif create mode 100644 lib/plugins/indexmenu/images/simple/folder.gif create mode 100644 lib/plugins/indexmenu/images/simple/folderh.gif create mode 100644 lib/plugins/indexmenu/images/simple/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/simple/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/simple/info.txt create mode 100644 lib/plugins/indexmenu/images/simple/join.gif create mode 100644 lib/plugins/indexmenu/images/simple/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/simple/line.gif create mode 100644 lib/plugins/indexmenu/images/simple/minus.gif create mode 100644 lib/plugins/indexmenu/images/simple/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/simple/nolines_minus.gif create mode 100644 lib/plugins/indexmenu/images/simple/nolines_plus.gif create mode 100644 lib/plugins/indexmenu/images/simple/page.gif create mode 100644 lib/plugins/indexmenu/images/simple/plus.gif create mode 100644 lib/plugins/indexmenu/images/simple/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/simplefact.png/Thumbs.db create mode 100644 lib/plugins/indexmenu/images/simplefact.png/base.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/empty.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/folder.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/info.txt create mode 100644 lib/plugins/indexmenu/images/simplefact.png/join.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/line.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/minus.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/page.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/plus.png create mode 100644 lib/plugins/indexmenu/images/simplefact.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/tango.png/base.png create mode 100644 lib/plugins/indexmenu/images/tango.png/empty.png create mode 100644 lib/plugins/indexmenu/images/tango.png/favicon.ico create mode 100644 lib/plugins/indexmenu/images/tango.png/folder.png create mode 100644 lib/plugins/indexmenu/images/tango.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/tango.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/tango.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/tango.png/format-justify-left.png create mode 100644 lib/plugins/indexmenu/images/tango.png/info.txt create mode 100644 lib/plugins/indexmenu/images/tango.png/internet-group-chat.png create mode 100644 lib/plugins/indexmenu/images/tango.png/join.png create mode 100644 lib/plugins/indexmenu/images/tango.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/tango.png/line.png create mode 100644 lib/plugins/indexmenu/images/tango.png/minus.png create mode 100644 lib/plugins/indexmenu/images/tango.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/tango.png/network-transmit.png create mode 100644 lib/plugins/indexmenu/images/tango.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/tango.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/tango.png/page.png create mode 100644 lib/plugins/indexmenu/images/tango.png/plus.png create mode 100644 lib/plugins/indexmenu/images/tango.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/thread/base.gif create mode 100644 lib/plugins/indexmenu/images/thread/empty.gif create mode 100644 lib/plugins/indexmenu/images/thread/folder.gif create mode 100644 lib/plugins/indexmenu/images/thread/folderh.gif create mode 100644 lib/plugins/indexmenu/images/thread/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/thread/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/thread/info.txt create mode 100644 lib/plugins/indexmenu/images/thread/join.gif create mode 100644 lib/plugins/indexmenu/images/thread/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/thread/line.gif create mode 100644 lib/plugins/indexmenu/images/thread/minus.gif create mode 100644 lib/plugins/indexmenu/images/thread/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/thread/nolines_minus.gif create mode 100644 lib/plugins/indexmenu/images/thread/nolines_plus.gif create mode 100644 lib/plugins/indexmenu/images/thread/page.gif create mode 100644 lib/plugins/indexmenu/images/thread/plus.gif create mode 100644 lib/plugins/indexmenu/images/thread/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/thread2/base.gif create mode 100644 lib/plugins/indexmenu/images/thread2/empty.gif create mode 100644 lib/plugins/indexmenu/images/thread2/folder.gif create mode 100644 lib/plugins/indexmenu/images/thread2/folderh.gif create mode 100644 lib/plugins/indexmenu/images/thread2/folderhopen.gif create mode 100644 lib/plugins/indexmenu/images/thread2/folderopen.gif create mode 100644 lib/plugins/indexmenu/images/thread2/info.txt create mode 100644 lib/plugins/indexmenu/images/thread2/join.gif create mode 100644 lib/plugins/indexmenu/images/thread2/joinbottom.gif create mode 100644 lib/plugins/indexmenu/images/thread2/line.gif create mode 100644 lib/plugins/indexmenu/images/thread2/minus.gif create mode 100644 lib/plugins/indexmenu/images/thread2/minusbottom.gif create mode 100644 lib/plugins/indexmenu/images/thread2/nolines_minus.gif create mode 100644 lib/plugins/indexmenu/images/thread2/nolines_plus.gif create mode 100644 lib/plugins/indexmenu/images/thread2/page.gif create mode 100644 lib/plugins/indexmenu/images/thread2/plus.gif create mode 100644 lib/plugins/indexmenu/images/thread2/plusbottom.gif create mode 100644 lib/plugins/indexmenu/images/thread2/style.css create mode 100644 lib/plugins/indexmenu/images/toc_bullet.gif create mode 100644 lib/plugins/indexmenu/images/vista.png/base.png create mode 100644 lib/plugins/indexmenu/images/vista.png/empty.png create mode 100644 lib/plugins/indexmenu/images/vista.png/folder.png create mode 100644 lib/plugins/indexmenu/images/vista.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/vista.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/vista.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/vista.png/info.txt create mode 100644 lib/plugins/indexmenu/images/vista.png/join.png create mode 100644 lib/plugins/indexmenu/images/vista.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/vista.png/line.png create mode 100644 lib/plugins/indexmenu/images/vista.png/minus.png create mode 100644 lib/plugins/indexmenu/images/vista.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/vista.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/vista.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/vista.png/page.png create mode 100644 lib/plugins/indexmenu/images/vista.png/plus.png create mode 100644 lib/plugins/indexmenu/images/vista.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/was.png/base.png create mode 100644 lib/plugins/indexmenu/images/was.png/empty.png create mode 100644 lib/plugins/indexmenu/images/was.png/folder.png create mode 100644 lib/plugins/indexmenu/images/was.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/was.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/was.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/was.png/info.txt create mode 100644 lib/plugins/indexmenu/images/was.png/join.png create mode 100644 lib/plugins/indexmenu/images/was.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/was.png/line.png create mode 100644 lib/plugins/indexmenu/images/was.png/minus.png create mode 100644 lib/plugins/indexmenu/images/was.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/was.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/was.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/was.png/page.png create mode 100644 lib/plugins/indexmenu/images/was.png/plus.png create mode 100644 lib/plugins/indexmenu/images/was.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/images/was.png/style.css create mode 100644 lib/plugins/indexmenu/images/wb.png/base.png create mode 100644 lib/plugins/indexmenu/images/wb.png/empty.png create mode 100644 lib/plugins/indexmenu/images/wb.png/folder.png create mode 100644 lib/plugins/indexmenu/images/wb.png/folderh.png create mode 100644 lib/plugins/indexmenu/images/wb.png/folderhopen.png create mode 100644 lib/plugins/indexmenu/images/wb.png/folderopen.png create mode 100644 lib/plugins/indexmenu/images/wb.png/info.txt create mode 100644 lib/plugins/indexmenu/images/wb.png/join.png create mode 100644 lib/plugins/indexmenu/images/wb.png/joinbottom.png create mode 100644 lib/plugins/indexmenu/images/wb.png/line.png create mode 100644 lib/plugins/indexmenu/images/wb.png/minus.png create mode 100644 lib/plugins/indexmenu/images/wb.png/minusbottom.png create mode 100644 lib/plugins/indexmenu/images/wb.png/nolines_minus.png create mode 100644 lib/plugins/indexmenu/images/wb.png/nolines_plus.png create mode 100644 lib/plugins/indexmenu/images/wb.png/page.png create mode 100644 lib/plugins/indexmenu/images/wb.png/plus.png create mode 100644 lib/plugins/indexmenu/images/wb.png/plusbottom.png create mode 100644 lib/plugins/indexmenu/inc/pclzip.lib.php create mode 100644 lib/plugins/indexmenu/inc/repo.class.php create mode 100644 lib/plugins/indexmenu/lang/ckb/lang.php create mode 100644 lib/plugins/indexmenu/lang/ckb/settings.php create mode 100644 lib/plugins/indexmenu/lang/cs/lang.php create mode 100644 lib/plugins/indexmenu/lang/cs/settings.php create mode 100644 lib/plugins/indexmenu/lang/da/lang.php create mode 100644 lib/plugins/indexmenu/lang/da/settings.php create mode 100644 lib/plugins/indexmenu/lang/de-informal/lang.php create mode 100644 lib/plugins/indexmenu/lang/de-informal/settings.php create mode 100644 lib/plugins/indexmenu/lang/de/lang.php create mode 100644 lib/plugins/indexmenu/lang/de/settings.php create mode 100644 lib/plugins/indexmenu/lang/el/lang.php create mode 100644 lib/plugins/indexmenu/lang/en/lang.php create mode 100644 lib/plugins/indexmenu/lang/en/settings.php create mode 100644 lib/plugins/indexmenu/lang/eo/lang.php create mode 100644 lib/plugins/indexmenu/lang/eo/settings.php create mode 100644 lib/plugins/indexmenu/lang/es/lang.php create mode 100644 lib/plugins/indexmenu/lang/es/settings.php create mode 100644 lib/plugins/indexmenu/lang/fr/lang.php create mode 100644 lib/plugins/indexmenu/lang/fr/settings.php create mode 100644 lib/plugins/indexmenu/lang/hr/lang.php create mode 100644 lib/plugins/indexmenu/lang/hr/settings.php create mode 100644 lib/plugins/indexmenu/lang/hu/lang.php create mode 100644 lib/plugins/indexmenu/lang/hu/settings.php create mode 100644 lib/plugins/indexmenu/lang/it/lang.php create mode 100644 lib/plugins/indexmenu/lang/it/settings.php create mode 100644 lib/plugins/indexmenu/lang/ja/lang.php create mode 100644 lib/plugins/indexmenu/lang/ja/settings.php create mode 100644 lib/plugins/indexmenu/lang/ko/lang.php create mode 100644 lib/plugins/indexmenu/lang/ko/settings.php create mode 100644 lib/plugins/indexmenu/lang/nl/lang.php create mode 100644 lib/plugins/indexmenu/lang/nl/settings.php create mode 100644 lib/plugins/indexmenu/lang/pl/lang.php create mode 100644 lib/plugins/indexmenu/lang/pt-br/lang.php create mode 100644 lib/plugins/indexmenu/lang/pt-br/settings.php create mode 100644 lib/plugins/indexmenu/lang/ru/lang.php create mode 100644 lib/plugins/indexmenu/lang/ru/settings.php create mode 100644 lib/plugins/indexmenu/lang/sv/lang.php create mode 100644 lib/plugins/indexmenu/lang/sv/settings.php create mode 100644 lib/plugins/indexmenu/lang/tr/lang.php create mode 100644 lib/plugins/indexmenu/lang/vi/lang.php create mode 100644 lib/plugins/indexmenu/lang/zh-tw/lang.php create mode 100644 lib/plugins/indexmenu/lang/zh/lang.php create mode 100644 lib/plugins/indexmenu/lang/zh/settings.php create mode 100644 lib/plugins/indexmenu/manager.dat create mode 100644 lib/plugins/indexmenu/plugin.info.txt create mode 100644 lib/plugins/indexmenu/script.js create mode 100644 lib/plugins/indexmenu/scripts/contextmenu.js create mode 100644 lib/plugins/indexmenu/scripts/contextmenu.local.js.example create mode 100644 lib/plugins/indexmenu/scripts/contextmenu/jquery.ui-contextmenu.js create mode 100644 lib/plugins/indexmenu/scripts/contextmenu/jquery.ui-contextmenu.min.js create mode 100644 lib/plugins/indexmenu/scripts/contextmenu/jquery.ui-contextmenu.min.js.map create mode 100644 lib/plugins/indexmenu/scripts/fancytree/LICENSE.txt create mode 100644 lib/plugins/indexmenu/scripts/fancytree/jquery.fancytree-all-deps.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/jquery.fancytree-all-deps.min.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/jquery.fancytree-all-deps.min.js.map create mode 100644 lib/plugins/indexmenu/scripts/fancytree/jquery.fancytree-all.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/jquery.fancytree-all.min.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/jquery.fancytree.min.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.ariagrid.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.childcounter.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.clones.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.columnview.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.dnd.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.dnd5.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.edit.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.filter.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.fixed.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.glyph.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.grid.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.gridnav.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.logger.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.menu.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.multi.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.persist.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.table.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.themeroller.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.ui-deps.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/modules/jquery.fancytree.wide.js create mode 100644 lib/plugins/indexmenu/scripts/fancytree/readme/icons_layout__from ods.png create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-awesome/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-awesome/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-awesome/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-awesome/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-awesome/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-awesome/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap-n/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap-n/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap-n/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap-n/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap-n/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap-n/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap/boot.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-bootstrap/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-custom-1/README.md create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-lion/icons-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-lion/icons.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-lion/loading.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-lion/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-lion/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-lion/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-lion/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-lion/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-lion/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-material/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-material/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-material/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-material/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-material/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-material/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-mdi/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-mdi/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-mdi/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-mdi/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-themeroller/icons-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-themeroller/icons.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-themeroller/loading.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-themeroller/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-themeroller/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-themeroller/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-themeroller/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-themeroller/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-typicons/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-typicons/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-typicons/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-typicons/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-vista/icons-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-vista/icons.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-vista/loading.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-vista/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-vista/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-vista/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-vista/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-vista/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-vista/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win7/icons-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win7/icons.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win7/loading.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win7/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win7/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win7/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win7/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win7/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win7/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-n/icons-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-n/icons.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-n/loading.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-n/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-n/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-n/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-n/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-n/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-xxl/icons-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-xxl/icons.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-xxl/loading.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-xxl/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-xxl/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-xxl/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-xxl/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8-xxl/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8/icons-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8/icons.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8/loading.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-win8/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/icons-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/icons-rtl__old__blue laxy expanders.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/icons.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/icons__old__blue lazy expanders.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/loading.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/skin-common.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/ui.fancytree.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/ui.fancytree.less create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/ui.fancytree.min.css create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/vline-rtl.gif create mode 100644 lib/plugins/indexmenu/scripts/fancytree/skin-xp/vline.gif create mode 100644 lib/plugins/indexmenu/scripts/indexmenu.js create mode 100644 lib/plugins/indexmenu/scripts/nojsindex.js create mode 100644 lib/plugins/indexmenu/scripts/toolbarindexwizard.js create mode 100644 lib/plugins/indexmenu/style.css create mode 100644 lib/plugins/indexmenu/syntax/indexmenu.php create mode 100644 lib/plugins/indexmenu/syntax/tag.php create mode 100644 lib/plugins/info/plugin.info.txt create mode 100644 lib/plugins/info/syntax.php create mode 100644 lib/plugins/logviewer/action.php create mode 100644 lib/plugins/logviewer/admin.php create mode 100644 lib/plugins/logviewer/admin.svg create mode 100644 lib/plugins/logviewer/lang/cs/intro.txt create mode 100644 lib/plugins/logviewer/lang/cs/lang.php create mode 100644 lib/plugins/logviewer/lang/cs/nolog.txt create mode 100644 lib/plugins/logviewer/lang/de/intro.txt create mode 100644 lib/plugins/logviewer/lang/de/lang.php create mode 100644 lib/plugins/logviewer/lang/de/nolog.txt create mode 100644 lib/plugins/logviewer/lang/en/intro.txt create mode 100644 lib/plugins/logviewer/lang/en/lang.php create mode 100644 lib/plugins/logviewer/lang/en/nolog.txt create mode 100644 lib/plugins/logviewer/lang/es/intro.txt create mode 100644 lib/plugins/logviewer/lang/es/lang.php create mode 100644 lib/plugins/logviewer/lang/es/nolog.txt create mode 100644 lib/plugins/logviewer/lang/fr/intro.txt create mode 100644 lib/plugins/logviewer/lang/fr/lang.php create mode 100644 lib/plugins/logviewer/lang/fr/nolog.txt create mode 100644 lib/plugins/logviewer/lang/hu/lang.php create mode 100644 lib/plugins/logviewer/lang/it/lang.php create mode 100644 lib/plugins/logviewer/lang/ja/lang.php create mode 100644 lib/plugins/logviewer/lang/pl/intro.txt create mode 100644 lib/plugins/logviewer/lang/pl/lang.php create mode 100644 lib/plugins/logviewer/lang/pl/nolog.txt create mode 100644 lib/plugins/logviewer/lang/pt-br/intro.txt create mode 100644 lib/plugins/logviewer/lang/pt-br/lang.php create mode 100644 lib/plugins/logviewer/lang/pt-br/nolog.txt create mode 100644 lib/plugins/logviewer/lang/pt/intro.txt create mode 100644 lib/plugins/logviewer/lang/pt/lang.php create mode 100644 lib/plugins/logviewer/lang/pt/nolog.txt create mode 100644 lib/plugins/logviewer/lang/ru/intro.txt create mode 100644 lib/plugins/logviewer/lang/ru/lang.php create mode 100644 lib/plugins/logviewer/lang/ru/nolog.txt create mode 100644 lib/plugins/logviewer/lang/vi/intro.txt create mode 100644 lib/plugins/logviewer/lang/vi/lang.php create mode 100644 lib/plugins/logviewer/lang/vi/nolog.txt create mode 100644 lib/plugins/logviewer/lang/zh/intro.txt create mode 100644 lib/plugins/logviewer/lang/zh/lang.php create mode 100644 lib/plugins/logviewer/lang/zh/nolog.txt create mode 100644 lib/plugins/logviewer/plugin.info.txt create mode 100644 lib/plugins/logviewer/script.js create mode 100644 lib/plugins/logviewer/style.less create mode 100644 lib/plugins/move/.github/workflows/dokuwiki.yml create mode 100644 lib/plugins/move/.github/workflows/release.yml create mode 100644 lib/plugins/move/LICENSE create mode 100644 lib/plugins/move/MenuItem.php create mode 100644 lib/plugins/move/_test/GeneralTest.php create mode 100644 lib/plugins/move/_test/affectedPagesNs.test.php create mode 100644 lib/plugins/move/_test/cache_handling.test.php create mode 100644 lib/plugins/move/_test/findMissingDocuments.test.php create mode 100644 lib/plugins/move/_test/handler.test.php create mode 100644 lib/plugins/move/_test/log.test.php create mode 100644 lib/plugins/move/_test/mediamove.test.php create mode 100644 lib/plugins/move/_test/namespace_move.test.php create mode 100644 lib/plugins/move/_test/pagemove.test.php create mode 100644 lib/plugins/move/_test/plan.test.php create mode 100644 lib/plugins/move/_test/stepThroughDocuments.test.php create mode 100644 lib/plugins/move/_test/tpl.test.php create mode 100644 lib/plugins/move/action/progress.php create mode 100644 lib/plugins/move/action/rename.php create mode 100644 lib/plugins/move/action/rewrite.php create mode 100644 lib/plugins/move/action/tree.php create mode 100644 lib/plugins/move/admin.svg create mode 100644 lib/plugins/move/admin/main.php create mode 100644 lib/plugins/move/admin/tree.php create mode 100644 lib/plugins/move/conf/default.php create mode 100644 lib/plugins/move/conf/metadata.php create mode 100644 lib/plugins/move/deleted.files create mode 100644 lib/plugins/move/helper/file.php create mode 100644 lib/plugins/move/helper/handler.php create mode 100644 lib/plugins/move/helper/op.php create mode 100644 lib/plugins/move/helper/plan.php create mode 100644 lib/plugins/move/helper/rewrite.php create mode 100644 lib/plugins/move/images/disk.png create mode 100644 lib/plugins/move/images/folder_add.png create mode 100644 lib/plugins/move/images/page.png create mode 100644 lib/plugins/move/images/page_link.png create mode 100644 lib/plugins/move/images/rename.png create mode 100644 lib/plugins/move/images/rename.svg create mode 100644 lib/plugins/move/images/sprite.png create mode 100644 lib/plugins/move/lang/ar/lang.php create mode 100644 lib/plugins/move/lang/cs/lang.php create mode 100644 lib/plugins/move/lang/cs/move.txt create mode 100644 lib/plugins/move/lang/cs/progress.txt create mode 100644 lib/plugins/move/lang/cs/settings.php create mode 100644 lib/plugins/move/lang/cs/tree.txt create mode 100644 lib/plugins/move/lang/da/lang.php create mode 100644 lib/plugins/move/lang/da/move.txt create mode 100644 lib/plugins/move/lang/da/progress.txt create mode 100644 lib/plugins/move/lang/da/settings.php create mode 100644 lib/plugins/move/lang/da/tree.txt create mode 100644 lib/plugins/move/lang/de-informal/lang.php create mode 100644 lib/plugins/move/lang/de-informal/move.txt create mode 100644 lib/plugins/move/lang/de-informal/progress.txt create mode 100644 lib/plugins/move/lang/de-informal/settings.php create mode 100644 lib/plugins/move/lang/de-informal/tree.txt create mode 100644 lib/plugins/move/lang/de/lang.php create mode 100644 lib/plugins/move/lang/de/move.txt create mode 100644 lib/plugins/move/lang/de/progress.txt create mode 100644 lib/plugins/move/lang/de/settings.php create mode 100644 lib/plugins/move/lang/de/tree.txt create mode 100644 lib/plugins/move/lang/el/lang.php create mode 100644 lib/plugins/move/lang/el/move.txt create mode 100644 lib/plugins/move/lang/el/progress.txt create mode 100644 lib/plugins/move/lang/el/settings.php create mode 100644 lib/plugins/move/lang/el/tree.txt create mode 100644 lib/plugins/move/lang/en/lang.php create mode 100644 lib/plugins/move/lang/en/move.txt create mode 100644 lib/plugins/move/lang/en/progress.txt create mode 100644 lib/plugins/move/lang/en/settings.php create mode 100644 lib/plugins/move/lang/en/tree.txt create mode 100644 lib/plugins/move/lang/es/lang.php create mode 100644 lib/plugins/move/lang/es/move.txt create mode 100644 lib/plugins/move/lang/es/progress.txt create mode 100644 lib/plugins/move/lang/es/settings.php create mode 100644 lib/plugins/move/lang/es/tree.txt create mode 100644 lib/plugins/move/lang/fr/lang.php create mode 100644 lib/plugins/move/lang/fr/move.txt create mode 100644 lib/plugins/move/lang/fr/progress.txt create mode 100644 lib/plugins/move/lang/fr/settings.php create mode 100644 lib/plugins/move/lang/fr/tree.txt create mode 100644 lib/plugins/move/lang/hr/lang.php create mode 100644 lib/plugins/move/lang/hr/move.txt create mode 100644 lib/plugins/move/lang/hr/progress.txt create mode 100644 lib/plugins/move/lang/hr/settings.php create mode 100644 lib/plugins/move/lang/hr/tree.txt create mode 100644 lib/plugins/move/lang/id/lang.php create mode 100644 lib/plugins/move/lang/id/progress.txt create mode 100644 lib/plugins/move/lang/id/settings.php create mode 100644 lib/plugins/move/lang/id/tree.txt create mode 100644 lib/plugins/move/lang/it/lang.php create mode 100644 lib/plugins/move/lang/it/move.txt create mode 100644 lib/plugins/move/lang/ja/lang.php create mode 100644 lib/plugins/move/lang/ja/move.txt create mode 100644 lib/plugins/move/lang/ja/progress.txt create mode 100644 lib/plugins/move/lang/ja/settings.php create mode 100644 lib/plugins/move/lang/ja/tree.txt create mode 100644 lib/plugins/move/lang/ko/lang.php create mode 100644 lib/plugins/move/lang/ko/move.txt create mode 100644 lib/plugins/move/lang/ko/progress.txt create mode 100644 lib/plugins/move/lang/ko/settings.php create mode 100644 lib/plugins/move/lang/ko/tree.txt create mode 100644 lib/plugins/move/lang/lv/lang.php create mode 100644 lib/plugins/move/lang/lv/move.txt create mode 100644 lib/plugins/move/lang/nl/lang.php create mode 100644 lib/plugins/move/lang/nl/move.txt create mode 100644 lib/plugins/move/lang/nl/progress.txt create mode 100644 lib/plugins/move/lang/nl/settings.php create mode 100644 lib/plugins/move/lang/nl/tree.txt create mode 100644 lib/plugins/move/lang/no/lang.php create mode 100644 lib/plugins/move/lang/no/move.txt create mode 100644 lib/plugins/move/lang/no/progress.txt create mode 100644 lib/plugins/move/lang/no/settings.php create mode 100644 lib/plugins/move/lang/no/tree.txt create mode 100644 lib/plugins/move/lang/pl/lang.php create mode 100644 lib/plugins/move/lang/pl/move.txt create mode 100644 lib/plugins/move/lang/pt-br/lang.php create mode 100644 lib/plugins/move/lang/pt-br/move.txt create mode 100644 lib/plugins/move/lang/pt-br/progress.txt create mode 100644 lib/plugins/move/lang/pt-br/settings.php create mode 100644 lib/plugins/move/lang/pt-br/tree.txt create mode 100644 lib/plugins/move/lang/ru/lang.php create mode 100644 lib/plugins/move/lang/ru/move.txt create mode 100644 lib/plugins/move/lang/ru/progress.txt create mode 100644 lib/plugins/move/lang/ru/settings.php create mode 100644 lib/plugins/move/lang/ru/tree.txt create mode 100644 lib/plugins/move/lang/sk/lang.php create mode 100644 lib/plugins/move/lang/sk/move.txt create mode 100644 lib/plugins/move/lang/sk/progress.txt create mode 100644 lib/plugins/move/lang/sk/settings.php create mode 100644 lib/plugins/move/lang/sk/tree.txt create mode 100644 lib/plugins/move/lang/sl/lang.php create mode 100644 lib/plugins/move/lang/sl/move.txt create mode 100644 lib/plugins/move/lang/sv/lang.php create mode 100644 lib/plugins/move/lang/sv/move.txt create mode 100644 lib/plugins/move/lang/sv/progress.txt create mode 100644 lib/plugins/move/lang/sv/settings.php create mode 100644 lib/plugins/move/lang/tr/lang.php create mode 100644 lib/plugins/move/lang/tr/progress.txt create mode 100644 lib/plugins/move/lang/uk/lang.php create mode 100644 lib/plugins/move/lang/vi/lang.php create mode 100644 lib/plugins/move/lang/vi/move.txt create mode 100644 lib/plugins/move/lang/vi/progress.txt create mode 100644 lib/plugins/move/lang/vi/settings.php create mode 100644 lib/plugins/move/lang/vi/tree.txt create mode 100644 lib/plugins/move/lang/zh-tw/lang.php create mode 100644 lib/plugins/move/lang/zh-tw/move.txt create mode 100644 lib/plugins/move/lang/zh-tw/progress.txt create mode 100644 lib/plugins/move/lang/zh-tw/settings.php create mode 100644 lib/plugins/move/lang/zh-tw/tree.txt create mode 100644 lib/plugins/move/lang/zh/lang.php create mode 100644 lib/plugins/move/lang/zh/move.txt create mode 100644 lib/plugins/move/lang/zh/progress.txt create mode 100644 lib/plugins/move/lang/zh/settings.php create mode 100644 lib/plugins/move/lang/zh/tree.txt create mode 100644 lib/plugins/move/manager.dat create mode 100644 lib/plugins/move/plugin.info.txt create mode 100644 lib/plugins/move/script.js create mode 100644 lib/plugins/move/script/MoveMediaManager.js create mode 100644 lib/plugins/move/script/form.js create mode 100644 lib/plugins/move/script/json2.js create mode 100644 lib/plugins/move/script/progress.js create mode 100644 lib/plugins/move/script/rename.js create mode 100644 lib/plugins/move/script/tree.js create mode 100644 lib/plugins/move/style.less create mode 100644 lib/plugins/oembed/LICENCE create mode 100644 lib/plugins/oembed/conf/default.php create mode 100644 lib/plugins/oembed/conf/metadata.php create mode 100644 lib/plugins/oembed/docs/dokuwiki-oembed.org create mode 100644 lib/plugins/oembed/docs/dokuwiki-oembed.txt create mode 100644 lib/plugins/oembed/lang/en/settings.php create mode 100644 lib/plugins/oembed/manager.dat create mode 100644 lib/plugins/oembed/plugin.info.txt create mode 100644 lib/plugins/oembed/providers.xml create mode 100644 lib/plugins/oembed/sample-providers.xml create mode 100644 lib/plugins/oembed/style.css create mode 100644 lib/plugins/oembed/syntax.php create mode 100644 lib/plugins/popularity/action.php create mode 100644 lib/plugins/popularity/admin.php create mode 100644 lib/plugins/popularity/admin.svg create mode 100644 lib/plugins/popularity/helper.php create mode 100644 lib/plugins/popularity/lang/af/lang.php create mode 100644 lib/plugins/popularity/lang/ar/intro.txt create mode 100644 lib/plugins/popularity/lang/ar/lang.php create mode 100644 lib/plugins/popularity/lang/ar/submitted.txt create mode 100644 lib/plugins/popularity/lang/bg/intro.txt create mode 100644 lib/plugins/popularity/lang/bg/lang.php create mode 100644 lib/plugins/popularity/lang/bg/submitted.txt create mode 100644 lib/plugins/popularity/lang/ca-valencia/intro.txt create mode 100644 lib/plugins/popularity/lang/ca-valencia/lang.php create mode 100644 lib/plugins/popularity/lang/ca/intro.txt create mode 100644 lib/plugins/popularity/lang/ca/lang.php create mode 100644 lib/plugins/popularity/lang/ckb/intro.txt create mode 100644 lib/plugins/popularity/lang/ckb/lang.php create mode 100644 lib/plugins/popularity/lang/ckb/submitted.txt create mode 100644 lib/plugins/popularity/lang/cs/intro.txt create mode 100644 lib/plugins/popularity/lang/cs/lang.php create mode 100644 lib/plugins/popularity/lang/cs/submitted.txt create mode 100644 lib/plugins/popularity/lang/cy/intro.txt create mode 100644 lib/plugins/popularity/lang/cy/lang.php create mode 100644 lib/plugins/popularity/lang/cy/submitted.txt create mode 100644 lib/plugins/popularity/lang/da/intro.txt create mode 100644 lib/plugins/popularity/lang/da/lang.php create mode 100644 lib/plugins/popularity/lang/da/submitted.txt create mode 100644 lib/plugins/popularity/lang/de-informal/intro.txt create mode 100644 lib/plugins/popularity/lang/de-informal/lang.php create mode 100644 lib/plugins/popularity/lang/de-informal/submitted.txt create mode 100644 lib/plugins/popularity/lang/de/intro.txt create mode 100644 lib/plugins/popularity/lang/de/lang.php create mode 100644 lib/plugins/popularity/lang/de/submitted.txt create mode 100644 lib/plugins/popularity/lang/el/intro.txt create mode 100644 lib/plugins/popularity/lang/el/lang.php create mode 100644 lib/plugins/popularity/lang/el/submitted.txt create mode 100644 lib/plugins/popularity/lang/en/intro.txt create mode 100644 lib/plugins/popularity/lang/en/lang.php create mode 100644 lib/plugins/popularity/lang/en/submitted.txt create mode 100644 lib/plugins/popularity/lang/eo/intro.txt create mode 100644 lib/plugins/popularity/lang/eo/lang.php create mode 100644 lib/plugins/popularity/lang/eo/submitted.txt create mode 100644 lib/plugins/popularity/lang/es/intro.txt create mode 100644 lib/plugins/popularity/lang/es/lang.php create mode 100644 lib/plugins/popularity/lang/es/submitted.txt create mode 100644 lib/plugins/popularity/lang/eu/intro.txt create mode 100644 lib/plugins/popularity/lang/eu/lang.php create mode 100644 lib/plugins/popularity/lang/eu/submitted.txt create mode 100644 lib/plugins/popularity/lang/fa/intro.txt create mode 100644 lib/plugins/popularity/lang/fa/lang.php create mode 100644 lib/plugins/popularity/lang/fa/submitted.txt create mode 100644 lib/plugins/popularity/lang/fi/intro.txt create mode 100644 lib/plugins/popularity/lang/fi/lang.php create mode 100644 lib/plugins/popularity/lang/fi/submitted.txt create mode 100644 lib/plugins/popularity/lang/fr/intro.txt create mode 100644 lib/plugins/popularity/lang/fr/lang.php create mode 100644 lib/plugins/popularity/lang/fr/submitted.txt create mode 100644 lib/plugins/popularity/lang/gl/intro.txt create mode 100644 lib/plugins/popularity/lang/gl/lang.php create mode 100644 lib/plugins/popularity/lang/gl/submitted.txt create mode 100644 lib/plugins/popularity/lang/he/intro.txt create mode 100644 lib/plugins/popularity/lang/he/lang.php create mode 100644 lib/plugins/popularity/lang/hi/lang.php create mode 100644 lib/plugins/popularity/lang/hr/intro.txt create mode 100644 lib/plugins/popularity/lang/hr/lang.php create mode 100644 lib/plugins/popularity/lang/hr/submitted.txt create mode 100644 lib/plugins/popularity/lang/hu/intro.txt create mode 100644 lib/plugins/popularity/lang/hu/lang.php create mode 100644 lib/plugins/popularity/lang/hu/submitted.txt create mode 100644 lib/plugins/popularity/lang/ia/intro.txt create mode 100644 lib/plugins/popularity/lang/ia/lang.php create mode 100644 lib/plugins/popularity/lang/id-ni/intro.txt create mode 100644 lib/plugins/popularity/lang/id-ni/lang.php create mode 100644 lib/plugins/popularity/lang/is/lang.php create mode 100644 lib/plugins/popularity/lang/it/intro.txt create mode 100644 lib/plugins/popularity/lang/it/lang.php create mode 100644 lib/plugins/popularity/lang/it/submitted.txt create mode 100644 lib/plugins/popularity/lang/ja/intro.txt create mode 100644 lib/plugins/popularity/lang/ja/lang.php create mode 100644 lib/plugins/popularity/lang/ja/submitted.txt create mode 100644 lib/plugins/popularity/lang/ko/intro.txt create mode 100644 lib/plugins/popularity/lang/ko/lang.php create mode 100644 lib/plugins/popularity/lang/ko/submitted.txt create mode 100644 lib/plugins/popularity/lang/la/intro.txt create mode 100644 lib/plugins/popularity/lang/la/lang.php create mode 100644 lib/plugins/popularity/lang/la/submitted.txt create mode 100644 lib/plugins/popularity/lang/lt/lang.php create mode 100644 lib/plugins/popularity/lang/lv/intro.txt create mode 100644 lib/plugins/popularity/lang/lv/lang.php create mode 100644 lib/plugins/popularity/lang/lv/submitted.txt create mode 100644 lib/plugins/popularity/lang/mr/intro.txt create mode 100644 lib/plugins/popularity/lang/mr/lang.php create mode 100644 lib/plugins/popularity/lang/ne/lang.php create mode 100644 lib/plugins/popularity/lang/nl/intro.txt create mode 100644 lib/plugins/popularity/lang/nl/lang.php create mode 100644 lib/plugins/popularity/lang/nl/submitted.txt create mode 100644 lib/plugins/popularity/lang/no/intro.txt create mode 100644 lib/plugins/popularity/lang/no/lang.php create mode 100644 lib/plugins/popularity/lang/no/submitted.txt create mode 100644 lib/plugins/popularity/lang/pl/intro.txt create mode 100644 lib/plugins/popularity/lang/pl/lang.php create mode 100644 lib/plugins/popularity/lang/pl/submitted.txt create mode 100644 lib/plugins/popularity/lang/pt-br/intro.txt create mode 100644 lib/plugins/popularity/lang/pt-br/lang.php create mode 100644 lib/plugins/popularity/lang/pt-br/submitted.txt create mode 100644 lib/plugins/popularity/lang/pt/intro.txt create mode 100644 lib/plugins/popularity/lang/pt/lang.php create mode 100644 lib/plugins/popularity/lang/pt/submitted.txt create mode 100644 lib/plugins/popularity/lang/ro/intro.txt create mode 100644 lib/plugins/popularity/lang/ro/lang.php create mode 100644 lib/plugins/popularity/lang/ro/submitted.txt create mode 100644 lib/plugins/popularity/lang/ru/intro.txt create mode 100644 lib/plugins/popularity/lang/ru/lang.php create mode 100644 lib/plugins/popularity/lang/ru/submitted.txt create mode 100644 lib/plugins/popularity/lang/sk/intro.txt create mode 100644 lib/plugins/popularity/lang/sk/lang.php create mode 100644 lib/plugins/popularity/lang/sk/submitted.txt create mode 100644 lib/plugins/popularity/lang/sl/intro.txt create mode 100644 lib/plugins/popularity/lang/sl/lang.php create mode 100644 lib/plugins/popularity/lang/sl/submitted.txt create mode 100644 lib/plugins/popularity/lang/sq/intro.txt create mode 100644 lib/plugins/popularity/lang/sq/lang.php create mode 100644 lib/plugins/popularity/lang/sr/intro.txt create mode 100644 lib/plugins/popularity/lang/sr/lang.php create mode 100644 lib/plugins/popularity/lang/sv/intro.txt create mode 100644 lib/plugins/popularity/lang/sv/lang.php create mode 100644 lib/plugins/popularity/lang/sv/submitted.txt create mode 100644 lib/plugins/popularity/lang/th/lang.php create mode 100644 lib/plugins/popularity/lang/tr/intro.txt create mode 100644 lib/plugins/popularity/lang/tr/lang.php create mode 100644 lib/plugins/popularity/lang/uk/intro.txt create mode 100644 lib/plugins/popularity/lang/uk/lang.php create mode 100644 lib/plugins/popularity/lang/uk/submitted.txt create mode 100644 lib/plugins/popularity/lang/vi/intro.txt create mode 100644 lib/plugins/popularity/lang/vi/lang.php create mode 100644 lib/plugins/popularity/lang/vi/submitted.txt create mode 100644 lib/plugins/popularity/lang/zh-tw/intro.txt create mode 100644 lib/plugins/popularity/lang/zh-tw/lang.php create mode 100644 lib/plugins/popularity/lang/zh-tw/submitted.txt create mode 100644 lib/plugins/popularity/lang/zh/intro.txt create mode 100644 lib/plugins/popularity/lang/zh/lang.php create mode 100644 lib/plugins/popularity/lang/zh/submitted.txt create mode 100644 lib/plugins/popularity/plugin.info.txt create mode 100644 lib/plugins/remote.php create mode 100644 lib/plugins/revert/admin.php create mode 100644 lib/plugins/revert/admin.svg create mode 100644 lib/plugins/revert/lang/ar/intro.txt create mode 100644 lib/plugins/revert/lang/ar/lang.php create mode 100644 lib/plugins/revert/lang/bg/intro.txt create mode 100644 lib/plugins/revert/lang/bg/lang.php create mode 100644 lib/plugins/revert/lang/ca-valencia/intro.txt create mode 100644 lib/plugins/revert/lang/ca-valencia/lang.php create mode 100644 lib/plugins/revert/lang/ca/intro.txt create mode 100644 lib/plugins/revert/lang/ca/lang.php create mode 100644 lib/plugins/revert/lang/ckb/intro.txt create mode 100644 lib/plugins/revert/lang/ckb/lang.php create mode 100644 lib/plugins/revert/lang/cs/intro.txt create mode 100644 lib/plugins/revert/lang/cs/lang.php create mode 100644 lib/plugins/revert/lang/cy/intro.txt create mode 100644 lib/plugins/revert/lang/cy/lang.php create mode 100644 lib/plugins/revert/lang/da/intro.txt create mode 100644 lib/plugins/revert/lang/da/lang.php create mode 100644 lib/plugins/revert/lang/de-informal/intro.txt create mode 100644 lib/plugins/revert/lang/de-informal/lang.php create mode 100644 lib/plugins/revert/lang/de/intro.txt create mode 100644 lib/plugins/revert/lang/de/lang.php create mode 100644 lib/plugins/revert/lang/el/intro.txt create mode 100644 lib/plugins/revert/lang/el/lang.php create mode 100644 lib/plugins/revert/lang/en/intro.txt create mode 100644 lib/plugins/revert/lang/en/lang.php create mode 100644 lib/plugins/revert/lang/eo/intro.txt create mode 100644 lib/plugins/revert/lang/eo/lang.php create mode 100644 lib/plugins/revert/lang/es/intro.txt create mode 100644 lib/plugins/revert/lang/es/lang.php create mode 100644 lib/plugins/revert/lang/et/lang.php create mode 100644 lib/plugins/revert/lang/eu/intro.txt create mode 100644 lib/plugins/revert/lang/eu/lang.php create mode 100644 lib/plugins/revert/lang/fa/intro.txt create mode 100644 lib/plugins/revert/lang/fa/lang.php create mode 100644 lib/plugins/revert/lang/fi/intro.txt create mode 100644 lib/plugins/revert/lang/fi/lang.php create mode 100644 lib/plugins/revert/lang/fr/intro.txt create mode 100644 lib/plugins/revert/lang/fr/lang.php create mode 100644 lib/plugins/revert/lang/gl/intro.txt create mode 100644 lib/plugins/revert/lang/gl/lang.php create mode 100644 lib/plugins/revert/lang/he/intro.txt create mode 100644 lib/plugins/revert/lang/he/lang.php create mode 100644 lib/plugins/revert/lang/hr/intro.txt create mode 100644 lib/plugins/revert/lang/hr/lang.php create mode 100644 lib/plugins/revert/lang/hu/intro.txt create mode 100644 lib/plugins/revert/lang/hu/lang.php create mode 100644 lib/plugins/revert/lang/ia/intro.txt create mode 100644 lib/plugins/revert/lang/ia/lang.php create mode 100644 lib/plugins/revert/lang/is/lang.php create mode 100644 lib/plugins/revert/lang/it/intro.txt create mode 100644 lib/plugins/revert/lang/it/lang.php create mode 100644 lib/plugins/revert/lang/ja/intro.txt create mode 100644 lib/plugins/revert/lang/ja/lang.php create mode 100644 lib/plugins/revert/lang/ko/intro.txt create mode 100644 lib/plugins/revert/lang/ko/lang.php create mode 100644 lib/plugins/revert/lang/la/intro.txt create mode 100644 lib/plugins/revert/lang/la/lang.php create mode 100644 lib/plugins/revert/lang/lb/intro.txt create mode 100644 lib/plugins/revert/lang/lv/intro.txt create mode 100644 lib/plugins/revert/lang/lv/lang.php create mode 100644 lib/plugins/revert/lang/mr/intro.txt create mode 100644 lib/plugins/revert/lang/mr/lang.php create mode 100644 lib/plugins/revert/lang/ne/lang.php create mode 100644 lib/plugins/revert/lang/nl/intro.txt create mode 100644 lib/plugins/revert/lang/nl/lang.php create mode 100644 lib/plugins/revert/lang/no/intro.txt create mode 100644 lib/plugins/revert/lang/no/lang.php create mode 100644 lib/plugins/revert/lang/pl/intro.txt create mode 100644 lib/plugins/revert/lang/pl/lang.php create mode 100644 lib/plugins/revert/lang/pt-br/intro.txt create mode 100644 lib/plugins/revert/lang/pt-br/lang.php create mode 100644 lib/plugins/revert/lang/pt/intro.txt create mode 100644 lib/plugins/revert/lang/pt/lang.php create mode 100644 lib/plugins/revert/lang/ro/intro.txt create mode 100644 lib/plugins/revert/lang/ro/lang.php create mode 100644 lib/plugins/revert/lang/ru/intro.txt create mode 100644 lib/plugins/revert/lang/ru/lang.php create mode 100644 lib/plugins/revert/lang/sk/intro.txt create mode 100644 lib/plugins/revert/lang/sk/lang.php create mode 100644 lib/plugins/revert/lang/sl/intro.txt create mode 100644 lib/plugins/revert/lang/sl/lang.php create mode 100644 lib/plugins/revert/lang/sq/intro.txt create mode 100644 lib/plugins/revert/lang/sq/lang.php create mode 100644 lib/plugins/revert/lang/sr/intro.txt create mode 100644 lib/plugins/revert/lang/sr/lang.php create mode 100644 lib/plugins/revert/lang/sv/intro.txt create mode 100644 lib/plugins/revert/lang/sv/lang.php create mode 100644 lib/plugins/revert/lang/th/intro.txt create mode 100644 lib/plugins/revert/lang/th/lang.php create mode 100644 lib/plugins/revert/lang/tr/intro.txt create mode 100644 lib/plugins/revert/lang/tr/lang.php create mode 100644 lib/plugins/revert/lang/uk/intro.txt create mode 100644 lib/plugins/revert/lang/uk/lang.php create mode 100644 lib/plugins/revert/lang/vi/intro.txt create mode 100644 lib/plugins/revert/lang/vi/lang.php create mode 100644 lib/plugins/revert/lang/zh-tw/intro.txt create mode 100644 lib/plugins/revert/lang/zh-tw/lang.php create mode 100644 lib/plugins/revert/lang/zh/intro.txt create mode 100644 lib/plugins/revert/lang/zh/lang.php create mode 100644 lib/plugins/revert/plugin.info.txt create mode 100644 lib/plugins/safefnrecode/action.php create mode 100644 lib/plugins/safefnrecode/plugin.info.txt create mode 100644 lib/plugins/styling/.travis.yml create mode 100644 lib/plugins/styling/action.php create mode 100644 lib/plugins/styling/admin.php create mode 100644 lib/plugins/styling/admin.svg create mode 100644 lib/plugins/styling/lang/bg/lang.php create mode 100644 lib/plugins/styling/lang/ca/lang.php create mode 100644 lib/plugins/styling/lang/ckb/intro.txt create mode 100644 lib/plugins/styling/lang/ckb/lang.php create mode 100644 lib/plugins/styling/lang/cs/intro.txt create mode 100644 lib/plugins/styling/lang/cs/lang.php create mode 100644 lib/plugins/styling/lang/cy/intro.txt create mode 100644 lib/plugins/styling/lang/cy/lang.php create mode 100644 lib/plugins/styling/lang/da/intro.txt create mode 100644 lib/plugins/styling/lang/da/lang.php create mode 100644 lib/plugins/styling/lang/de-informal/intro.txt create mode 100644 lib/plugins/styling/lang/de-informal/lang.php create mode 100644 lib/plugins/styling/lang/de/intro.txt create mode 100644 lib/plugins/styling/lang/de/lang.php create mode 100644 lib/plugins/styling/lang/el/lang.php create mode 100644 lib/plugins/styling/lang/en/intro.txt create mode 100644 lib/plugins/styling/lang/en/lang.php create mode 100644 lib/plugins/styling/lang/eo/lang.php create mode 100644 lib/plugins/styling/lang/es/intro.txt create mode 100644 lib/plugins/styling/lang/es/lang.php create mode 100644 lib/plugins/styling/lang/fa/intro.txt create mode 100644 lib/plugins/styling/lang/fa/lang.php create mode 100644 lib/plugins/styling/lang/fr/intro.txt create mode 100644 lib/plugins/styling/lang/fr/lang.php create mode 100644 lib/plugins/styling/lang/hr/intro.txt create mode 100644 lib/plugins/styling/lang/hr/lang.php create mode 100644 lib/plugins/styling/lang/hu/intro.txt create mode 100644 lib/plugins/styling/lang/hu/lang.php create mode 100644 lib/plugins/styling/lang/it/intro.txt create mode 100644 lib/plugins/styling/lang/it/lang.php create mode 100644 lib/plugins/styling/lang/ja/intro.txt create mode 100644 lib/plugins/styling/lang/ja/lang.php create mode 100644 lib/plugins/styling/lang/ko/intro.txt create mode 100644 lib/plugins/styling/lang/ko/lang.php create mode 100644 lib/plugins/styling/lang/nl/intro.txt create mode 100644 lib/plugins/styling/lang/nl/lang.php create mode 100644 lib/plugins/styling/lang/no/intro.txt create mode 100644 lib/plugins/styling/lang/no/lang.php create mode 100644 lib/plugins/styling/lang/oc/lang.php create mode 100644 lib/plugins/styling/lang/pl/intro.txt create mode 100644 lib/plugins/styling/lang/pl/lang.php create mode 100644 lib/plugins/styling/lang/pt-br/intro.txt create mode 100644 lib/plugins/styling/lang/pt-br/lang.php create mode 100644 lib/plugins/styling/lang/pt/intro.txt create mode 100644 lib/plugins/styling/lang/pt/lang.php create mode 100644 lib/plugins/styling/lang/ru/intro.txt create mode 100644 lib/plugins/styling/lang/ru/lang.php create mode 100644 lib/plugins/styling/lang/sk/intro.txt create mode 100644 lib/plugins/styling/lang/sk/lang.php create mode 100644 lib/plugins/styling/lang/sv/lang.php create mode 100644 lib/plugins/styling/lang/uk/lang.php create mode 100644 lib/plugins/styling/lang/vi/intro.txt create mode 100644 lib/plugins/styling/lang/vi/lang.php create mode 100644 lib/plugins/styling/lang/zh-tw/lang.php create mode 100644 lib/plugins/styling/lang/zh/intro.txt create mode 100644 lib/plugins/styling/lang/zh/lang.php create mode 100644 lib/plugins/styling/plugin.info.txt create mode 100644 lib/plugins/styling/popup.php create mode 100644 lib/plugins/styling/script.js create mode 100644 lib/plugins/styling/style.less create mode 100644 lib/plugins/syntax.php create mode 100644 lib/plugins/usermanager/admin.php create mode 100644 lib/plugins/usermanager/admin.svg create mode 100644 lib/plugins/usermanager/cli.php create mode 100644 lib/plugins/usermanager/images/search.png create mode 100644 lib/plugins/usermanager/lang/af/lang.php create mode 100644 lib/plugins/usermanager/lang/ar/add.txt create mode 100644 lib/plugins/usermanager/lang/ar/delete.txt create mode 100644 lib/plugins/usermanager/lang/ar/edit.txt create mode 100644 lib/plugins/usermanager/lang/ar/intro.txt create mode 100644 lib/plugins/usermanager/lang/ar/lang.php create mode 100644 lib/plugins/usermanager/lang/ar/list.txt create mode 100644 lib/plugins/usermanager/lang/bg/add.txt create mode 100644 lib/plugins/usermanager/lang/bg/delete.txt create mode 100644 lib/plugins/usermanager/lang/bg/edit.txt create mode 100644 lib/plugins/usermanager/lang/bg/intro.txt create mode 100644 lib/plugins/usermanager/lang/bg/lang.php create mode 100644 lib/plugins/usermanager/lang/bg/list.txt create mode 100644 lib/plugins/usermanager/lang/ca-valencia/add.txt create mode 100644 lib/plugins/usermanager/lang/ca-valencia/delete.txt create mode 100644 lib/plugins/usermanager/lang/ca-valencia/edit.txt create mode 100644 lib/plugins/usermanager/lang/ca-valencia/intro.txt create mode 100644 lib/plugins/usermanager/lang/ca-valencia/lang.php create mode 100644 lib/plugins/usermanager/lang/ca-valencia/list.txt create mode 100644 lib/plugins/usermanager/lang/ca/add.txt create mode 100644 lib/plugins/usermanager/lang/ca/delete.txt create mode 100644 lib/plugins/usermanager/lang/ca/edit.txt create mode 100644 lib/plugins/usermanager/lang/ca/intro.txt create mode 100644 lib/plugins/usermanager/lang/ca/lang.php create mode 100644 lib/plugins/usermanager/lang/ca/list.txt create mode 100644 lib/plugins/usermanager/lang/ckb/add.txt create mode 100644 lib/plugins/usermanager/lang/ckb/delete.txt create mode 100644 lib/plugins/usermanager/lang/ckb/edit.txt create mode 100644 lib/plugins/usermanager/lang/ckb/import.txt create mode 100644 lib/plugins/usermanager/lang/ckb/intro.txt create mode 100644 lib/plugins/usermanager/lang/ckb/lang.php create mode 100644 lib/plugins/usermanager/lang/ckb/list.txt create mode 100644 lib/plugins/usermanager/lang/cs/add.txt create mode 100644 lib/plugins/usermanager/lang/cs/delete.txt create mode 100644 lib/plugins/usermanager/lang/cs/edit.txt create mode 100644 lib/plugins/usermanager/lang/cs/import.txt create mode 100644 lib/plugins/usermanager/lang/cs/intro.txt create mode 100644 lib/plugins/usermanager/lang/cs/lang.php create mode 100644 lib/plugins/usermanager/lang/cs/list.txt create mode 100644 lib/plugins/usermanager/lang/cy/add.txt create mode 100644 lib/plugins/usermanager/lang/cy/delete.txt create mode 100644 lib/plugins/usermanager/lang/cy/edit.txt create mode 100644 lib/plugins/usermanager/lang/cy/import.txt create mode 100644 lib/plugins/usermanager/lang/cy/intro.txt create mode 100644 lib/plugins/usermanager/lang/cy/lang.php create mode 100644 lib/plugins/usermanager/lang/cy/list.txt create mode 100644 lib/plugins/usermanager/lang/da/add.txt create mode 100644 lib/plugins/usermanager/lang/da/delete.txt create mode 100644 lib/plugins/usermanager/lang/da/edit.txt create mode 100644 lib/plugins/usermanager/lang/da/import.txt create mode 100644 lib/plugins/usermanager/lang/da/intro.txt create mode 100644 lib/plugins/usermanager/lang/da/lang.php create mode 100644 lib/plugins/usermanager/lang/da/list.txt create mode 100644 lib/plugins/usermanager/lang/de-informal/add.txt create mode 100644 lib/plugins/usermanager/lang/de-informal/delete.txt create mode 100644 lib/plugins/usermanager/lang/de-informal/edit.txt create mode 100644 lib/plugins/usermanager/lang/de-informal/import.txt create mode 100644 lib/plugins/usermanager/lang/de-informal/intro.txt create mode 100644 lib/plugins/usermanager/lang/de-informal/lang.php create mode 100644 lib/plugins/usermanager/lang/de-informal/list.txt create mode 100644 lib/plugins/usermanager/lang/de/add.txt create mode 100644 lib/plugins/usermanager/lang/de/delete.txt create mode 100644 lib/plugins/usermanager/lang/de/edit.txt create mode 100644 lib/plugins/usermanager/lang/de/import.txt create mode 100644 lib/plugins/usermanager/lang/de/intro.txt create mode 100644 lib/plugins/usermanager/lang/de/lang.php create mode 100644 lib/plugins/usermanager/lang/de/list.txt create mode 100644 lib/plugins/usermanager/lang/el/add.txt create mode 100644 lib/plugins/usermanager/lang/el/delete.txt create mode 100644 lib/plugins/usermanager/lang/el/edit.txt create mode 100644 lib/plugins/usermanager/lang/el/intro.txt create mode 100644 lib/plugins/usermanager/lang/el/lang.php create mode 100644 lib/plugins/usermanager/lang/el/list.txt create mode 100644 lib/plugins/usermanager/lang/en/add.txt create mode 100644 lib/plugins/usermanager/lang/en/delete.txt create mode 100644 lib/plugins/usermanager/lang/en/edit.txt create mode 100644 lib/plugins/usermanager/lang/en/import.txt create mode 100644 lib/plugins/usermanager/lang/en/intro.txt create mode 100644 lib/plugins/usermanager/lang/en/lang.php create mode 100644 lib/plugins/usermanager/lang/en/list.txt create mode 100644 lib/plugins/usermanager/lang/eo/add.txt create mode 100644 lib/plugins/usermanager/lang/eo/delete.txt create mode 100644 lib/plugins/usermanager/lang/eo/edit.txt create mode 100644 lib/plugins/usermanager/lang/eo/import.txt create mode 100644 lib/plugins/usermanager/lang/eo/intro.txt create mode 100644 lib/plugins/usermanager/lang/eo/lang.php create mode 100644 lib/plugins/usermanager/lang/eo/list.txt create mode 100644 lib/plugins/usermanager/lang/es/add.txt create mode 100644 lib/plugins/usermanager/lang/es/delete.txt create mode 100644 lib/plugins/usermanager/lang/es/edit.txt create mode 100644 lib/plugins/usermanager/lang/es/import.txt create mode 100644 lib/plugins/usermanager/lang/es/intro.txt create mode 100644 lib/plugins/usermanager/lang/es/lang.php create mode 100644 lib/plugins/usermanager/lang/es/list.txt create mode 100644 lib/plugins/usermanager/lang/et/lang.php create mode 100644 lib/plugins/usermanager/lang/eu/add.txt create mode 100644 lib/plugins/usermanager/lang/eu/delete.txt create mode 100644 lib/plugins/usermanager/lang/eu/edit.txt create mode 100644 lib/plugins/usermanager/lang/eu/intro.txt create mode 100644 lib/plugins/usermanager/lang/eu/lang.php create mode 100644 lib/plugins/usermanager/lang/eu/list.txt create mode 100644 lib/plugins/usermanager/lang/fa/add.txt create mode 100644 lib/plugins/usermanager/lang/fa/delete.txt create mode 100644 lib/plugins/usermanager/lang/fa/edit.txt create mode 100644 lib/plugins/usermanager/lang/fa/import.txt create mode 100644 lib/plugins/usermanager/lang/fa/intro.txt create mode 100644 lib/plugins/usermanager/lang/fa/lang.php create mode 100644 lib/plugins/usermanager/lang/fa/list.txt create mode 100644 lib/plugins/usermanager/lang/fi/add.txt create mode 100644 lib/plugins/usermanager/lang/fi/delete.txt create mode 100644 lib/plugins/usermanager/lang/fi/edit.txt create mode 100644 lib/plugins/usermanager/lang/fi/intro.txt create mode 100644 lib/plugins/usermanager/lang/fi/lang.php create mode 100644 lib/plugins/usermanager/lang/fi/list.txt create mode 100644 lib/plugins/usermanager/lang/fr/add.txt create mode 100644 lib/plugins/usermanager/lang/fr/delete.txt create mode 100644 lib/plugins/usermanager/lang/fr/edit.txt create mode 100644 lib/plugins/usermanager/lang/fr/import.txt create mode 100644 lib/plugins/usermanager/lang/fr/intro.txt create mode 100644 lib/plugins/usermanager/lang/fr/lang.php create mode 100644 lib/plugins/usermanager/lang/fr/list.txt create mode 100644 lib/plugins/usermanager/lang/gl/add.txt create mode 100644 lib/plugins/usermanager/lang/gl/delete.txt create mode 100644 lib/plugins/usermanager/lang/gl/edit.txt create mode 100644 lib/plugins/usermanager/lang/gl/intro.txt create mode 100644 lib/plugins/usermanager/lang/gl/lang.php create mode 100644 lib/plugins/usermanager/lang/gl/list.txt create mode 100644 lib/plugins/usermanager/lang/he/add.txt create mode 100644 lib/plugins/usermanager/lang/he/delete.txt create mode 100644 lib/plugins/usermanager/lang/he/edit.txt create mode 100644 lib/plugins/usermanager/lang/he/intro.txt create mode 100644 lib/plugins/usermanager/lang/he/lang.php create mode 100644 lib/plugins/usermanager/lang/he/list.txt create mode 100644 lib/plugins/usermanager/lang/hr/add.txt create mode 100644 lib/plugins/usermanager/lang/hr/delete.txt create mode 100644 lib/plugins/usermanager/lang/hr/edit.txt create mode 100644 lib/plugins/usermanager/lang/hr/import.txt create mode 100644 lib/plugins/usermanager/lang/hr/intro.txt create mode 100644 lib/plugins/usermanager/lang/hr/lang.php create mode 100644 lib/plugins/usermanager/lang/hr/list.txt create mode 100644 lib/plugins/usermanager/lang/hu/add.txt create mode 100644 lib/plugins/usermanager/lang/hu/delete.txt create mode 100644 lib/plugins/usermanager/lang/hu/edit.txt create mode 100644 lib/plugins/usermanager/lang/hu/import.txt create mode 100644 lib/plugins/usermanager/lang/hu/intro.txt create mode 100644 lib/plugins/usermanager/lang/hu/lang.php create mode 100644 lib/plugins/usermanager/lang/hu/list.txt create mode 100644 lib/plugins/usermanager/lang/ia/add.txt create mode 100644 lib/plugins/usermanager/lang/ia/delete.txt create mode 100644 lib/plugins/usermanager/lang/ia/edit.txt create mode 100644 lib/plugins/usermanager/lang/ia/intro.txt create mode 100644 lib/plugins/usermanager/lang/ia/lang.php create mode 100644 lib/plugins/usermanager/lang/ia/list.txt create mode 100644 lib/plugins/usermanager/lang/id/add.txt create mode 100644 lib/plugins/usermanager/lang/id/delete.txt create mode 100644 lib/plugins/usermanager/lang/id/edit.txt create mode 100644 lib/plugins/usermanager/lang/id/intro.txt create mode 100644 lib/plugins/usermanager/lang/id/lang.php create mode 100644 lib/plugins/usermanager/lang/id/list.txt create mode 100644 lib/plugins/usermanager/lang/is/delete.txt create mode 100644 lib/plugins/usermanager/lang/is/lang.php create mode 100644 lib/plugins/usermanager/lang/it/add.txt create mode 100644 lib/plugins/usermanager/lang/it/delete.txt create mode 100644 lib/plugins/usermanager/lang/it/edit.txt create mode 100644 lib/plugins/usermanager/lang/it/import.txt create mode 100644 lib/plugins/usermanager/lang/it/intro.txt create mode 100644 lib/plugins/usermanager/lang/it/lang.php create mode 100644 lib/plugins/usermanager/lang/it/list.txt create mode 100644 lib/plugins/usermanager/lang/ja/add.txt create mode 100644 lib/plugins/usermanager/lang/ja/delete.txt create mode 100644 lib/plugins/usermanager/lang/ja/edit.txt create mode 100644 lib/plugins/usermanager/lang/ja/import.txt create mode 100644 lib/plugins/usermanager/lang/ja/intro.txt create mode 100644 lib/plugins/usermanager/lang/ja/lang.php create mode 100644 lib/plugins/usermanager/lang/ja/list.txt create mode 100644 lib/plugins/usermanager/lang/kk/lang.php create mode 100644 lib/plugins/usermanager/lang/ko/add.txt create mode 100644 lib/plugins/usermanager/lang/ko/delete.txt create mode 100644 lib/plugins/usermanager/lang/ko/edit.txt create mode 100644 lib/plugins/usermanager/lang/ko/import.txt create mode 100644 lib/plugins/usermanager/lang/ko/intro.txt create mode 100644 lib/plugins/usermanager/lang/ko/lang.php create mode 100644 lib/plugins/usermanager/lang/ko/list.txt create mode 100644 lib/plugins/usermanager/lang/la/add.txt create mode 100644 lib/plugins/usermanager/lang/la/delete.txt create mode 100644 lib/plugins/usermanager/lang/la/edit.txt create mode 100644 lib/plugins/usermanager/lang/la/intro.txt create mode 100644 lib/plugins/usermanager/lang/la/lang.php create mode 100644 lib/plugins/usermanager/lang/la/list.txt create mode 100644 lib/plugins/usermanager/lang/lb/list.txt create mode 100644 lib/plugins/usermanager/lang/lt/add.txt create mode 100644 lib/plugins/usermanager/lang/lt/delete.txt create mode 100644 lib/plugins/usermanager/lang/lt/edit.txt create mode 100644 lib/plugins/usermanager/lang/lt/intro.txt create mode 100644 lib/plugins/usermanager/lang/lt/lang.php create mode 100644 lib/plugins/usermanager/lang/lt/list.txt create mode 100644 lib/plugins/usermanager/lang/lv/add.txt create mode 100644 lib/plugins/usermanager/lang/lv/delete.txt create mode 100644 lib/plugins/usermanager/lang/lv/edit.txt create mode 100644 lib/plugins/usermanager/lang/lv/import.txt create mode 100644 lib/plugins/usermanager/lang/lv/intro.txt create mode 100644 lib/plugins/usermanager/lang/lv/lang.php create mode 100644 lib/plugins/usermanager/lang/lv/list.txt create mode 100644 lib/plugins/usermanager/lang/mk/add.txt create mode 100644 lib/plugins/usermanager/lang/mk/delete.txt create mode 100644 lib/plugins/usermanager/lang/mk/edit.txt create mode 100644 lib/plugins/usermanager/lang/mk/intro.txt create mode 100644 lib/plugins/usermanager/lang/mk/lang.php create mode 100644 lib/plugins/usermanager/lang/mk/list.txt create mode 100644 lib/plugins/usermanager/lang/mr/add.txt create mode 100644 lib/plugins/usermanager/lang/mr/delete.txt create mode 100644 lib/plugins/usermanager/lang/mr/edit.txt create mode 100644 lib/plugins/usermanager/lang/mr/intro.txt create mode 100644 lib/plugins/usermanager/lang/mr/lang.php create mode 100644 lib/plugins/usermanager/lang/mr/list.txt create mode 100644 lib/plugins/usermanager/lang/ne/add.txt create mode 100644 lib/plugins/usermanager/lang/ne/delete.txt create mode 100644 lib/plugins/usermanager/lang/ne/edit.txt create mode 100644 lib/plugins/usermanager/lang/ne/intro.txt create mode 100644 lib/plugins/usermanager/lang/ne/lang.php create mode 100644 lib/plugins/usermanager/lang/ne/list.txt create mode 100644 lib/plugins/usermanager/lang/nl/add.txt create mode 100644 lib/plugins/usermanager/lang/nl/delete.txt create mode 100644 lib/plugins/usermanager/lang/nl/edit.txt create mode 100644 lib/plugins/usermanager/lang/nl/import.txt create mode 100644 lib/plugins/usermanager/lang/nl/intro.txt create mode 100644 lib/plugins/usermanager/lang/nl/lang.php create mode 100644 lib/plugins/usermanager/lang/nl/list.txt create mode 100644 lib/plugins/usermanager/lang/no/add.txt create mode 100644 lib/plugins/usermanager/lang/no/delete.txt create mode 100644 lib/plugins/usermanager/lang/no/edit.txt create mode 100644 lib/plugins/usermanager/lang/no/import.txt create mode 100644 lib/plugins/usermanager/lang/no/intro.txt create mode 100644 lib/plugins/usermanager/lang/no/lang.php create mode 100644 lib/plugins/usermanager/lang/no/list.txt create mode 100644 lib/plugins/usermanager/lang/oc/lang.php create mode 100644 lib/plugins/usermanager/lang/oc/list.txt create mode 100644 lib/plugins/usermanager/lang/pl/add.txt create mode 100644 lib/plugins/usermanager/lang/pl/delete.txt create mode 100644 lib/plugins/usermanager/lang/pl/edit.txt create mode 100644 lib/plugins/usermanager/lang/pl/import.txt create mode 100644 lib/plugins/usermanager/lang/pl/intro.txt create mode 100644 lib/plugins/usermanager/lang/pl/lang.php create mode 100644 lib/plugins/usermanager/lang/pl/list.txt create mode 100644 lib/plugins/usermanager/lang/pt-br/add.txt create mode 100644 lib/plugins/usermanager/lang/pt-br/delete.txt create mode 100644 lib/plugins/usermanager/lang/pt-br/edit.txt create mode 100644 lib/plugins/usermanager/lang/pt-br/import.txt create mode 100644 lib/plugins/usermanager/lang/pt-br/intro.txt create mode 100644 lib/plugins/usermanager/lang/pt-br/lang.php create mode 100644 lib/plugins/usermanager/lang/pt-br/list.txt create mode 100644 lib/plugins/usermanager/lang/pt/add.txt create mode 100644 lib/plugins/usermanager/lang/pt/delete.txt create mode 100644 lib/plugins/usermanager/lang/pt/edit.txt create mode 100644 lib/plugins/usermanager/lang/pt/import.txt create mode 100644 lib/plugins/usermanager/lang/pt/intro.txt create mode 100644 lib/plugins/usermanager/lang/pt/lang.php create mode 100644 lib/plugins/usermanager/lang/pt/list.txt create mode 100644 lib/plugins/usermanager/lang/ro/add.txt create mode 100644 lib/plugins/usermanager/lang/ro/delete.txt create mode 100644 lib/plugins/usermanager/lang/ro/edit.txt create mode 100644 lib/plugins/usermanager/lang/ro/intro.txt create mode 100644 lib/plugins/usermanager/lang/ro/lang.php create mode 100644 lib/plugins/usermanager/lang/ro/list.txt create mode 100644 lib/plugins/usermanager/lang/ru/add.txt create mode 100644 lib/plugins/usermanager/lang/ru/delete.txt create mode 100644 lib/plugins/usermanager/lang/ru/edit.txt create mode 100644 lib/plugins/usermanager/lang/ru/import.txt create mode 100644 lib/plugins/usermanager/lang/ru/intro.txt create mode 100644 lib/plugins/usermanager/lang/ru/lang.php create mode 100644 lib/plugins/usermanager/lang/ru/list.txt create mode 100644 lib/plugins/usermanager/lang/sk/add.txt create mode 100644 lib/plugins/usermanager/lang/sk/delete.txt create mode 100644 lib/plugins/usermanager/lang/sk/edit.txt create mode 100644 lib/plugins/usermanager/lang/sk/import.txt create mode 100644 lib/plugins/usermanager/lang/sk/intro.txt create mode 100644 lib/plugins/usermanager/lang/sk/lang.php create mode 100644 lib/plugins/usermanager/lang/sk/list.txt create mode 100644 lib/plugins/usermanager/lang/sl/add.txt create mode 100644 lib/plugins/usermanager/lang/sl/delete.txt create mode 100644 lib/plugins/usermanager/lang/sl/edit.txt create mode 100644 lib/plugins/usermanager/lang/sl/intro.txt create mode 100644 lib/plugins/usermanager/lang/sl/lang.php create mode 100644 lib/plugins/usermanager/lang/sl/list.txt create mode 100644 lib/plugins/usermanager/lang/sq/add.txt create mode 100644 lib/plugins/usermanager/lang/sq/delete.txt create mode 100644 lib/plugins/usermanager/lang/sq/edit.txt create mode 100644 lib/plugins/usermanager/lang/sq/intro.txt create mode 100644 lib/plugins/usermanager/lang/sq/lang.php create mode 100644 lib/plugins/usermanager/lang/sq/list.txt create mode 100644 lib/plugins/usermanager/lang/sr/add.txt create mode 100644 lib/plugins/usermanager/lang/sr/delete.txt create mode 100644 lib/plugins/usermanager/lang/sr/edit.txt create mode 100644 lib/plugins/usermanager/lang/sr/intro.txt create mode 100644 lib/plugins/usermanager/lang/sr/lang.php create mode 100644 lib/plugins/usermanager/lang/sr/list.txt create mode 100644 lib/plugins/usermanager/lang/sv/add.txt create mode 100644 lib/plugins/usermanager/lang/sv/delete.txt create mode 100644 lib/plugins/usermanager/lang/sv/edit.txt create mode 100644 lib/plugins/usermanager/lang/sv/intro.txt create mode 100644 lib/plugins/usermanager/lang/sv/lang.php create mode 100644 lib/plugins/usermanager/lang/sv/list.txt create mode 100644 lib/plugins/usermanager/lang/th/add.txt create mode 100644 lib/plugins/usermanager/lang/th/delete.txt create mode 100644 lib/plugins/usermanager/lang/th/edit.txt create mode 100644 lib/plugins/usermanager/lang/th/intro.txt create mode 100644 lib/plugins/usermanager/lang/th/lang.php create mode 100644 lib/plugins/usermanager/lang/th/list.txt create mode 100644 lib/plugins/usermanager/lang/tr/add.txt create mode 100644 lib/plugins/usermanager/lang/tr/delete.txt create mode 100644 lib/plugins/usermanager/lang/tr/edit.txt create mode 100644 lib/plugins/usermanager/lang/tr/intro.txt create mode 100644 lib/plugins/usermanager/lang/tr/lang.php create mode 100644 lib/plugins/usermanager/lang/tr/list.txt create mode 100644 lib/plugins/usermanager/lang/uk/add.txt create mode 100644 lib/plugins/usermanager/lang/uk/delete.txt create mode 100644 lib/plugins/usermanager/lang/uk/edit.txt create mode 100644 lib/plugins/usermanager/lang/uk/intro.txt create mode 100644 lib/plugins/usermanager/lang/uk/lang.php create mode 100644 lib/plugins/usermanager/lang/uk/list.txt create mode 100644 lib/plugins/usermanager/lang/vi/add.txt create mode 100644 lib/plugins/usermanager/lang/vi/delete.txt create mode 100644 lib/plugins/usermanager/lang/vi/edit.txt create mode 100644 lib/plugins/usermanager/lang/vi/import.txt create mode 100644 lib/plugins/usermanager/lang/vi/intro.txt create mode 100644 lib/plugins/usermanager/lang/vi/lang.php create mode 100644 lib/plugins/usermanager/lang/vi/list.txt create mode 100644 lib/plugins/usermanager/lang/zh-tw/add.txt create mode 100644 lib/plugins/usermanager/lang/zh-tw/delete.txt create mode 100644 lib/plugins/usermanager/lang/zh-tw/edit.txt create mode 100644 lib/plugins/usermanager/lang/zh-tw/import.txt create mode 100644 lib/plugins/usermanager/lang/zh-tw/intro.txt create mode 100644 lib/plugins/usermanager/lang/zh-tw/lang.php create mode 100644 lib/plugins/usermanager/lang/zh-tw/list.txt create mode 100644 lib/plugins/usermanager/lang/zh/add.txt create mode 100644 lib/plugins/usermanager/lang/zh/delete.txt create mode 100644 lib/plugins/usermanager/lang/zh/edit.txt create mode 100644 lib/plugins/usermanager/lang/zh/import.txt create mode 100644 lib/plugins/usermanager/lang/zh/intro.txt create mode 100644 lib/plugins/usermanager/lang/zh/lang.php create mode 100644 lib/plugins/usermanager/lang/zh/list.txt create mode 100644 lib/plugins/usermanager/plugin.info.txt create mode 100644 lib/plugins/usermanager/remote.php create mode 100644 lib/plugins/usermanager/script.js create mode 100644 lib/plugins/usermanager/style.css create mode 100644 lib/plugins/vshare/.github/workflows/dokuwiki.yml create mode 100644 lib/plugins/vshare/_test/GeneralTest.php create mode 100644 lib/plugins/vshare/_test/SitesTest.php create mode 100644 lib/plugins/vshare/_test/VideoSyntaxTest.php create mode 100644 lib/plugins/vshare/action.php create mode 100644 lib/plugins/vshare/all.css create mode 100644 lib/plugins/vshare/button.png create mode 100644 lib/plugins/vshare/conf/default.php create mode 100644 lib/plugins/vshare/conf/metadata.php create mode 100644 lib/plugins/vshare/deleted.files create mode 100644 lib/plugins/vshare/helper.php create mode 100644 lib/plugins/vshare/lang/ar/lang.php create mode 100644 lib/plugins/vshare/lang/ckb/lang.php create mode 100644 lib/plugins/vshare/lang/cs/lang.php create mode 100644 lib/plugins/vshare/lang/da/lang.php create mode 100644 lib/plugins/vshare/lang/de-informal/lang.php create mode 100644 lib/plugins/vshare/lang/de-informal/settings.php create mode 100644 lib/plugins/vshare/lang/de/lang.php create mode 100644 lib/plugins/vshare/lang/de/settings.php create mode 100644 lib/plugins/vshare/lang/el/lang.php create mode 100644 lib/plugins/vshare/lang/en/lang.php create mode 100644 lib/plugins/vshare/lang/en/settings.php create mode 100644 lib/plugins/vshare/lang/es/lang.php create mode 100644 lib/plugins/vshare/lang/fa/lang.php create mode 100644 lib/plugins/vshare/lang/fr/lang.php create mode 100644 lib/plugins/vshare/lang/fr/settings.php create mode 100644 lib/plugins/vshare/lang/it/lang.php create mode 100644 lib/plugins/vshare/lang/ja/lang.php create mode 100644 lib/plugins/vshare/lang/ko/lang.php create mode 100644 lib/plugins/vshare/lang/ko/settings.php create mode 100644 lib/plugins/vshare/lang/nl/lang.php create mode 100644 lib/plugins/vshare/lang/nl/settings.php create mode 100644 lib/plugins/vshare/lang/no/lang.php create mode 100644 lib/plugins/vshare/lang/pl/lang.php create mode 100644 lib/plugins/vshare/lang/pl/settings.php create mode 100644 lib/plugins/vshare/lang/pt-br/lang.php create mode 100644 lib/plugins/vshare/lang/pt-br/settings.php create mode 100644 lib/plugins/vshare/lang/ru/lang.php create mode 100644 lib/plugins/vshare/lang/ru/settings.php create mode 100644 lib/plugins/vshare/lang/tr/lang.php create mode 100644 lib/plugins/vshare/lang/vi/lang.php create mode 100644 lib/plugins/vshare/lang/vi/settings.php create mode 100644 lib/plugins/vshare/lang/zh-tw/lang.php create mode 100644 lib/plugins/vshare/lang/zh-tw/settings.php create mode 100644 lib/plugins/vshare/lang/zh/lang.php create mode 100644 lib/plugins/vshare/lang/zh/settings.php create mode 100644 lib/plugins/vshare/manager.dat create mode 100644 lib/plugins/vshare/pdf.css create mode 100644 lib/plugins/vshare/plugin.info.txt create mode 100644 lib/plugins/vshare/script.js create mode 100644 lib/plugins/vshare/sites.ini create mode 100644 lib/plugins/vshare/syntax/debug.php create mode 100644 lib/plugins/vshare/syntax/video.php create mode 100644 lib/plugins/vshare/video.png create mode 100644 lib/plugins/vshare/video.svg create mode 100644 lib/plugins/wrap/.github/workflows/phpTestLinux.yml create mode 100644 lib/plugins/wrap/_test/GeneralTest.php create mode 100644 lib/plugins/wrap/_test/SyntaxTest.php create mode 100644 lib/plugins/wrap/action.php create mode 100644 lib/plugins/wrap/all.less create mode 100644 lib/plugins/wrap/conf/default.php create mode 100644 lib/plugins/wrap/conf/lang2dir.conf create mode 100644 lib/plugins/wrap/conf/metadata.php create mode 100644 lib/plugins/wrap/example.txt create mode 100644 lib/plugins/wrap/helper.php create mode 100644 lib/plugins/wrap/images/note/16/alert.png create mode 100644 lib/plugins/wrap/images/note/16/download.png create mode 100644 lib/plugins/wrap/images/note/16/help.png create mode 100644 lib/plugins/wrap/images/note/16/important.png create mode 100644 lib/plugins/wrap/images/note/16/info.png create mode 100644 lib/plugins/wrap/images/note/16/tip.png create mode 100644 lib/plugins/wrap/images/note/16/todo.png create mode 100644 lib/plugins/wrap/images/note/48/alert.png create mode 100644 lib/plugins/wrap/images/note/48/download.png create mode 100644 lib/plugins/wrap/images/note/48/help.png create mode 100644 lib/plugins/wrap/images/note/48/important.png create mode 100644 lib/plugins/wrap/images/note/48/info.png create mode 100644 lib/plugins/wrap/images/note/48/tip.png create mode 100644 lib/plugins/wrap/images/note/48/todo.png create mode 100644 lib/plugins/wrap/images/toolbar/box.png create mode 100644 lib/plugins/wrap/images/toolbar/clear.png create mode 100644 lib/plugins/wrap/images/toolbar/column.png create mode 100644 lib/plugins/wrap/images/toolbar/em.png create mode 100644 lib/plugins/wrap/images/toolbar/hi.png create mode 100644 lib/plugins/wrap/images/toolbar/lo.png create mode 100644 lib/plugins/wrap/images/toolbar/picker.png create mode 100644 lib/plugins/wrap/lang/ar/lang.php create mode 100644 lib/plugins/wrap/lang/ar/settings.php create mode 100644 lib/plugins/wrap/lang/bg/lang.php create mode 100644 lib/plugins/wrap/lang/bg/settings.php create mode 100644 lib/plugins/wrap/lang/bn/lang.php create mode 100644 lib/plugins/wrap/lang/bn/settings.php create mode 100644 lib/plugins/wrap/lang/ckb/lang.php create mode 100644 lib/plugins/wrap/lang/ckb/settings.php create mode 100644 lib/plugins/wrap/lang/cs/lang.php create mode 100644 lib/plugins/wrap/lang/cs/settings.php create mode 100644 lib/plugins/wrap/lang/cy/lang.php create mode 100644 lib/plugins/wrap/lang/cy/settings.php create mode 100644 lib/plugins/wrap/lang/da/lang.php create mode 100644 lib/plugins/wrap/lang/da/settings.php create mode 100644 lib/plugins/wrap/lang/de-informal/lang.php create mode 100644 lib/plugins/wrap/lang/de-informal/settings.php create mode 100644 lib/plugins/wrap/lang/de/lang.php create mode 100644 lib/plugins/wrap/lang/de/settings.php create mode 100644 lib/plugins/wrap/lang/el/lang.php create mode 100644 lib/plugins/wrap/lang/el/settings.php create mode 100644 lib/plugins/wrap/lang/en/lang.php create mode 100644 lib/plugins/wrap/lang/en/settings.php create mode 100644 lib/plugins/wrap/lang/eo/lang.php create mode 100644 lib/plugins/wrap/lang/eo/settings.php create mode 100644 lib/plugins/wrap/lang/es/lang.php create mode 100644 lib/plugins/wrap/lang/es/settings.php create mode 100644 lib/plugins/wrap/lang/fa/lang.php create mode 100644 lib/plugins/wrap/lang/fa/settings.php create mode 100644 lib/plugins/wrap/lang/fr/lang.php create mode 100644 lib/plugins/wrap/lang/fr/settings.php create mode 100644 lib/plugins/wrap/lang/hr/lang.php create mode 100644 lib/plugins/wrap/lang/hr/settings.php create mode 100644 lib/plugins/wrap/lang/hu/lang.php create mode 100644 lib/plugins/wrap/lang/hu/settings.php create mode 100644 lib/plugins/wrap/lang/it/lang.php create mode 100644 lib/plugins/wrap/lang/it/settings.php create mode 100644 lib/plugins/wrap/lang/ja/lang.php create mode 100644 lib/plugins/wrap/lang/ja/settings.php create mode 100644 lib/plugins/wrap/lang/ko/lang.php create mode 100644 lib/plugins/wrap/lang/ko/settings.php create mode 100644 lib/plugins/wrap/lang/nl/lang.php create mode 100644 lib/plugins/wrap/lang/nl/settings.php create mode 100644 lib/plugins/wrap/lang/no/lang.php create mode 100644 lib/plugins/wrap/lang/no/settings.php create mode 100644 lib/plugins/wrap/lang/pl/lang.php create mode 100644 lib/plugins/wrap/lang/pl/settings.php create mode 100644 lib/plugins/wrap/lang/pt-br/lang.php create mode 100644 lib/plugins/wrap/lang/pt-br/settings.php create mode 100644 lib/plugins/wrap/lang/ru/lang.php create mode 100644 lib/plugins/wrap/lang/ru/settings.php create mode 100644 lib/plugins/wrap/lang/sk/lang.php create mode 100644 lib/plugins/wrap/lang/sk/settings.php create mode 100644 lib/plugins/wrap/lang/sr/lang.php create mode 100644 lib/plugins/wrap/lang/sr/settings.php create mode 100644 lib/plugins/wrap/lang/sv/lang.php create mode 100644 lib/plugins/wrap/lang/sv/settings.php create mode 100644 lib/plugins/wrap/lang/tr/lang.php create mode 100644 lib/plugins/wrap/lang/tr/settings.php create mode 100644 lib/plugins/wrap/lang/uk/lang.php create mode 100644 lib/plugins/wrap/lang/uk/settings.php create mode 100644 lib/plugins/wrap/lang/vi/lang.php create mode 100644 lib/plugins/wrap/lang/vi/settings.php create mode 100644 lib/plugins/wrap/lang/zh-tw/lang.php create mode 100644 lib/plugins/wrap/lang/zh-tw/settings.php create mode 100644 lib/plugins/wrap/lang/zh/lang.php create mode 100644 lib/plugins/wrap/lang/zh/settings.php create mode 100644 lib/plugins/wrap/manager.dat create mode 100644 lib/plugins/wrap/pdf.less create mode 100644 lib/plugins/wrap/plugin.info.txt create mode 100644 lib/plugins/wrap/print.less create mode 100644 lib/plugins/wrap/print_or_pdf.less create mode 100644 lib/plugins/wrap/style.less create mode 100644 lib/plugins/wrap/syntax/closesection.php create mode 100644 lib/plugins/wrap/syntax/div.php create mode 100644 lib/plugins/wrap/syntax/divblock.php create mode 100644 lib/plugins/wrap/syntax/divwrap.php create mode 100644 lib/plugins/wrap/syntax/span.php create mode 100644 lib/plugins/wrap/syntax/spaninline.php create mode 100644 lib/plugins/wrap/syntax/spanwrap.php create mode 100644 lib/scripts/behaviour.js create mode 100644 lib/scripts/compatibility.js create mode 100644 lib/scripts/cookie.js create mode 100644 lib/scripts/delay.js create mode 100644 lib/scripts/edit.js create mode 100644 lib/scripts/editor.js create mode 100644 lib/scripts/fileuploader.js create mode 100644 lib/scripts/fileuploaderextended.js create mode 100644 lib/scripts/helpers.js create mode 100644 lib/scripts/hotkeys.js create mode 100644 lib/scripts/index.html create mode 100644 lib/scripts/index.js create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_55_fbf9ee_1x400.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_65_ffffff_1x400.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_dadada_1x400.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_75_e6e6e6_1x400.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-bg_glass_95_fef1ec_1x400.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-bg_highlight-soft_75_cccccc_1x100.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-icons_222222_256x240.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-icons_2e83ff_256x240.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-icons_454545_256x240.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-icons_888888_256x240.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/images/ui-icons_cd0a0a_256x240.png create mode 100644 lib/scripts/jquery/jquery-ui-theme/smoothness.css create mode 100644 lib/scripts/jquery/jquery-ui.min.js create mode 100644 lib/scripts/jquery/jquery.cookie.js create mode 100644 lib/scripts/jquery/jquery.min.js create mode 100755 lib/scripts/jquery/update.sh create mode 100644 lib/scripts/jquery/versions create mode 100644 lib/scripts/linkwiz.js create mode 100644 lib/scripts/locktimer.js create mode 100644 lib/scripts/media.js create mode 100644 lib/scripts/page.js create mode 100644 lib/scripts/qsearch.js create mode 100644 lib/scripts/script.js create mode 100644 lib/scripts/search.js create mode 100644 lib/scripts/textselection.js create mode 100644 lib/scripts/toolbar.js create mode 100644 lib/scripts/tree.js create mode 100644 lib/styles/all.css create mode 100644 lib/styles/feed.css create mode 100644 lib/styles/geshi.less create mode 100644 lib/styles/index.html create mode 100644 lib/styles/print.css create mode 100644 lib/styles/screen.css create mode 100644 lib/tpl/arcadebasic/README.md create mode 100644 lib/tpl/arcadebasic/conf/default.php create mode 100644 lib/tpl/arcadebasic/conf/metadata.php create mode 100644 lib/tpl/arcadebasic/css/arcadebasic-responsive.css create mode 100644 lib/tpl/arcadebasic/css/arcadebasic.css create mode 100644 lib/tpl/arcadebasic/css/basic.css create mode 100644 lib/tpl/arcadebasic/css/content.css create mode 100644 lib/tpl/arcadebasic/css/design.css create mode 100644 lib/tpl/arcadebasic/css/includes.css create mode 100644 lib/tpl/arcadebasic/css/mobile.css create mode 100644 lib/tpl/arcadebasic/css/print.css create mode 100644 lib/tpl/arcadebasic/css/structure.css create mode 100644 lib/tpl/arcadebasic/detail.php create mode 100644 lib/tpl/arcadebasic/images/apple-touch-icon.png create mode 100644 lib/tpl/arcadebasic/images/arcade basic dokuwiki template screenshot.png create mode 100644 lib/tpl/arcadebasic/images/color-picker.jpg create mode 100644 lib/tpl/arcadebasic/images/custom-header.jpg create mode 100644 lib/tpl/arcadebasic/images/customizer.jpg create mode 100644 lib/tpl/arcadebasic/images/extended-footer.jpg create mode 100644 lib/tpl/arcadebasic/images/favicon.ico create mode 100644 lib/tpl/arcadebasic/images/google-fonts.jpg create mode 100644 lib/tpl/arcadebasic/images/grid-template.jpg create mode 100644 lib/tpl/arcadebasic/images/header01-thumbnail.jpg create mode 100644 lib/tpl/arcadebasic/images/header01.jpg create mode 100644 lib/tpl/arcadebasic/images/home-page-widgets.jpg create mode 100644 lib/tpl/arcadebasic/images/jetpack.jpg create mode 100644 lib/tpl/arcadebasic/images/jumbo-headline.jpg create mode 100644 lib/tpl/arcadebasic/images/layout.jpg create mode 100644 lib/tpl/arcadebasic/images/post-block.jpg create mode 100644 lib/tpl/arcadebasic/images/pull-quotes.jpg create mode 100644 lib/tpl/arcadebasic/images/screenshot_sml.jpg create mode 100644 lib/tpl/arcadebasic/images/social-menu.jpg create mode 100644 lib/tpl/arcadebasic/images/video-header.jpg create mode 100644 lib/tpl/arcadebasic/lang/af/lang.php create mode 100644 lib/tpl/arcadebasic/lang/ar/lang.php create mode 100644 lib/tpl/arcadebasic/lang/az/lang.php create mode 100644 lib/tpl/arcadebasic/lang/bg/lang.php create mode 100644 lib/tpl/arcadebasic/lang/ca/lang.php create mode 100644 lib/tpl/arcadebasic/lang/cs/lang.php create mode 100644 lib/tpl/arcadebasic/lang/da/lang.php create mode 100644 lib/tpl/arcadebasic/lang/de/lang.php create mode 100644 lib/tpl/arcadebasic/lang/de/settings.php create mode 100644 lib/tpl/arcadebasic/lang/el/lang.php create mode 100644 lib/tpl/arcadebasic/lang/en/lang.php create mode 100644 lib/tpl/arcadebasic/lang/en/settings.php create mode 100644 lib/tpl/arcadebasic/lang/en/style.txt create mode 100644 lib/tpl/arcadebasic/lang/eo/lang.php create mode 100644 lib/tpl/arcadebasic/lang/es/lang.php create mode 100644 lib/tpl/arcadebasic/lang/et/lang.php create mode 100644 lib/tpl/arcadebasic/lang/eu/lang.php create mode 100644 lib/tpl/arcadebasic/lang/fa/lang.php create mode 100644 lib/tpl/arcadebasic/lang/fi/lang.php create mode 100644 lib/tpl/arcadebasic/lang/fo/lang.php create mode 100644 lib/tpl/arcadebasic/lang/fr/lang.php create mode 100644 lib/tpl/arcadebasic/lang/fr/settings.php create mode 100644 lib/tpl/arcadebasic/lang/gl/lang.php create mode 100644 lib/tpl/arcadebasic/lang/he/lang.php create mode 100644 lib/tpl/arcadebasic/lang/hi/lang.php create mode 100644 lib/tpl/arcadebasic/lang/hr/lang.php create mode 100644 lib/tpl/arcadebasic/lang/hu/lang.php create mode 100644 lib/tpl/arcadebasic/lang/ia/lang.php create mode 100644 lib/tpl/arcadebasic/lang/id/lang.php create mode 100644 lib/tpl/arcadebasic/lang/is/lang.php create mode 100644 lib/tpl/arcadebasic/lang/it/lang.php create mode 100644 lib/tpl/arcadebasic/lang/ja/lang.php create mode 100644 lib/tpl/arcadebasic/lang/km/lang.php create mode 100644 lib/tpl/arcadebasic/lang/ko/lang.php create mode 100644 lib/tpl/arcadebasic/lang/la/lang.php create mode 100644 lib/tpl/arcadebasic/lang/lb/lang.php create mode 100644 lib/tpl/arcadebasic/lang/lt/lang.php create mode 100644 lib/tpl/arcadebasic/lang/lv/lang.php create mode 100644 lib/tpl/arcadebasic/lang/mg/lang.php create mode 100644 lib/tpl/arcadebasic/lang/mk/lang.php create mode 100644 lib/tpl/arcadebasic/lang/mr/lang.php create mode 100644 lib/tpl/arcadebasic/lang/ne/lang.php create mode 100644 lib/tpl/arcadebasic/lang/nl/lang.php create mode 100644 lib/tpl/arcadebasic/lang/no/lang.php create mode 100644 lib/tpl/arcadebasic/lang/pl/lang.php create mode 100644 lib/tpl/arcadebasic/lang/pt-br/lang.php create mode 100644 lib/tpl/arcadebasic/lang/pt/lang.php create mode 100644 lib/tpl/arcadebasic/lang/ro/lang.php create mode 100644 lib/tpl/arcadebasic/lang/ru/lang.php create mode 100644 lib/tpl/arcadebasic/lang/ru/settings.php create mode 100644 lib/tpl/arcadebasic/lang/sk/lang.php create mode 100644 lib/tpl/arcadebasic/lang/sl/lang.php create mode 100644 lib/tpl/arcadebasic/lang/sq/lang.php create mode 100644 lib/tpl/arcadebasic/lang/sr/lang.php create mode 100644 lib/tpl/arcadebasic/lang/sv/lang.php create mode 100644 lib/tpl/arcadebasic/lang/th/lang.php create mode 100644 lib/tpl/arcadebasic/lang/tr/lang.php create mode 100644 lib/tpl/arcadebasic/lang/uk/lang.php create mode 100644 lib/tpl/arcadebasic/lang/vi/lang.php create mode 100644 lib/tpl/arcadebasic/lang/zh-tw/lang.php create mode 100644 lib/tpl/arcadebasic/lang/zh/lang.php create mode 100644 lib/tpl/arcadebasic/main.php create mode 100644 lib/tpl/arcadebasic/manager.dat create mode 100644 lib/tpl/arcadebasic/mediamanager.php create mode 100644 lib/tpl/arcadebasic/style.ini create mode 100644 lib/tpl/arcadebasic/template.info.txt create mode 100644 lib/tpl/arcadebasic/tpl_functions.php create mode 100644 lib/tpl/bootstrap3/.editorconfig create mode 100644 lib/tpl/bootstrap3/.github/ISSUE_TEMPLATE/bug_report.md create mode 100644 lib/tpl/bootstrap3/.github/ISSUE_TEMPLATE/feature_request.md create mode 100644 lib/tpl/bootstrap3/.github/no-response.yml create mode 100644 lib/tpl/bootstrap3/.travis.yml create mode 100644 lib/tpl/bootstrap3/AUTHORS.md create mode 100644 lib/tpl/bootstrap3/EventHandlers.php create mode 100644 lib/tpl/bootstrap3/LICENSE create mode 100644 lib/tpl/bootstrap3/README.md create mode 100644 lib/tpl/bootstrap3/RELEASE.md create mode 100644 lib/tpl/bootstrap3/SVG.php create mode 100644 lib/tpl/bootstrap3/Template.php create mode 100644 lib/tpl/bootstrap3/_test/general.test.php create mode 100644 lib/tpl/bootstrap3/assets/anchorjs/anchor.min.js create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/cerulean/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/cosmo/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/cyborg/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/darkly/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/default/bootstrap-theme.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/default/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/flatly/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/fonts/glyphicons-halflings-regular.eot create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/fonts/glyphicons-halflings-regular.svg create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/fonts/glyphicons-halflings-regular.ttf create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/fonts/glyphicons-halflings-regular.woff create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/fonts/glyphicons-halflings-regular.woff2 create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/journal/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/js/bootstrap.min.js create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/lumen/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/paper/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/readable/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/sandstone/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/simplex/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/slate/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/solar/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/spacelab/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/superhero/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/united/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/bootstrap/yeti/bootstrap.min.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_300.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_300.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_300.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_300.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_400.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_400.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_400.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_400.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_400.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_400italic.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_400italic.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_400italic.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_400italic.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_400italic.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_700.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_700.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_700.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_700.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Lato_700.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/News_Cycle_400.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/News_Cycle_400.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/News_Cycle_700.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/News_Cycle_700.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/News_Cycle_700.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/News_Cycle_700.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_300.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_300.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_300.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_300.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_300italic.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_300italic.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_300italic.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_300italic.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_400.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_400.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_400.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_400.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_400italic.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_400italic.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_400italic.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_400italic.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_700.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_700.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_700.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_700.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_700italic.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_700italic.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_700italic.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Open_Sans_700italic.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Raleway_400.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Raleway_400.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Raleway_400.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Raleway_400.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Raleway_700.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Raleway_700.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Raleway_700.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Raleway_700.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_300.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_300.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_300.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_300.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_400.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_400.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_400.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_400.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_500.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_500.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_500.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_500.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_700.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_700.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_700.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Roboto_700.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_300.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_300.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_300.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_300.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_400.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_400.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_400.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_400.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_400italic.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_400italic.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_400italic.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_400italic.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_700.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_700.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_700.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Source_Sans_Pro_700.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Ubuntu_400.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Ubuntu_400.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Ubuntu_400.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Ubuntu_400.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/Ubuntu_700.eot create mode 100644 lib/tpl/bootstrap3/assets/fonts/Ubuntu_700.svg create mode 100644 lib/tpl/bootstrap3/assets/fonts/Ubuntu_700.woff create mode 100644 lib/tpl/bootstrap3/assets/fonts/Ubuntu_700.woff2 create mode 100644 lib/tpl/bootstrap3/assets/fonts/cosmo.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/cyborg.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/darkly.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/flatly.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/journal.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/lumen.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/paper.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/readable.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/sandstone.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/simplex.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/solar.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/spacelab.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/superhero.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/united.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/fonts/yeti.fonts.css create mode 100644 lib/tpl/bootstrap3/assets/iconify/iconify.min.js create mode 100644 lib/tpl/bootstrap3/assets/iconify/json/fa.json create mode 100644 lib/tpl/bootstrap3/assets/iconify/json/mdi.json create mode 100644 lib/tpl/bootstrap3/assets/iconify/plugins/fa.css create mode 100644 lib/tpl/bootstrap3/assets/iconify/plugins/fa.js create mode 100644 lib/tpl/bootstrap3/assets/typeahead/bootstrap3-typeahead.min.js create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/AbstractMenu.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/DetailMenu.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/AbstractItem.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Admin.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Back.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Backlink.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Edit.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/ImgBackto.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Index.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Login.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Media.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/MediaManager.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Profile.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Recent.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Register.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Resendpwd.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Revert.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Revisions.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Subscribe.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/Item/Top.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/MenuInterface.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/MobileMenu.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/PageMenu.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/SiteMenu.php create mode 100644 lib/tpl/bootstrap3/compat/inc/Menu/UserMenu.php create mode 100644 lib/tpl/bootstrap3/compat/inc/functions.php create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/00-default_checkbox-blank-circle-outline.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/01-edit_pencil.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/02-create_pencil.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/03-draft_android-studio.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/04-show_file-document.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/05-source_file-xml.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/06-revert_replay.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/07-revisions_history.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/08-backlink_link-variant.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/09-subscribe_email-outline.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/10-top_arrow-up.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/11-mediamanager_folder-image.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/12-back_arrow-left.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/account-card-details.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/account-plus.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/calendar-clock.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/file-tree.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/folder-multiple-image.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/lock-reset.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/login.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/logout.svg create mode 100644 lib/tpl/bootstrap3/compat/lib/images/menu/settings.svg create mode 100644 lib/tpl/bootstrap3/conf/default.php create mode 100644 lib/tpl/bootstrap3/conf/metadata.php create mode 100644 lib/tpl/bootstrap3/css.php create mode 100644 lib/tpl/bootstrap3/css/bs4-utilities.less create mode 100644 lib/tpl/bootstrap3/css/callouts.less create mode 100644 lib/tpl/bootstrap3/css/core/_admin.less create mode 100644 lib/tpl/bootstrap3/css/core/_edit.css create mode 100644 lib/tpl/bootstrap3/css/core/_fileuploader.css create mode 100644 lib/tpl/bootstrap3/css/core/_forms.css create mode 100644 lib/tpl/bootstrap3/css/core/_links.css create mode 100644 lib/tpl/bootstrap3/css/core/_media_fullscreen.css create mode 100644 lib/tpl/bootstrap3/css/core/_media_popup.css create mode 100644 lib/tpl/bootstrap3/css/core/_modal.css create mode 100644 lib/tpl/bootstrap3/css/core/_search.less create mode 100644 lib/tpl/bootstrap3/css/diff.less create mode 100644 lib/tpl/bootstrap3/css/mobile.less create mode 100644 lib/tpl/bootstrap3/css/plugins/addnewpage.less create mode 100644 lib/tpl/bootstrap3/css/plugins/bureaucracy.less create mode 100644 lib/tpl/bootstrap3/css/plugins/data.less create mode 100644 lib/tpl/bootstrap3/css/plugins/database2.less create mode 100644 lib/tpl/bootstrap3/css/plugins/datatables.less create mode 100644 lib/tpl/bootstrap3/css/plugins/dir.less create mode 100644 lib/tpl/bootstrap3/css/plugins/discussion.less create mode 100644 lib/tpl/bootstrap3/css/plugins/inlinetoc.less create mode 100644 lib/tpl/bootstrap3/css/plugins/linkback.less create mode 100644 lib/tpl/bootstrap3/css/plugins/move.less create mode 100644 lib/tpl/bootstrap3/css/plugins/overlay.less create mode 100644 lib/tpl/bootstrap3/css/plugins/publish.less create mode 100644 lib/tpl/bootstrap3/css/plugins/simplenavi.less create mode 100644 lib/tpl/bootstrap3/css/plugins/struct.less create mode 100644 lib/tpl/bootstrap3/css/plugins/tag.less create mode 100644 lib/tpl/bootstrap3/css/plugins/tagging.less create mode 100644 lib/tpl/bootstrap3/css/plugins/translation.less create mode 100644 lib/tpl/bootstrap3/css/print.less create mode 100644 lib/tpl/bootstrap3/css/recent.less create mode 100644 lib/tpl/bootstrap3/css/replacements.less create mode 100644 lib/tpl/bootstrap3/css/template.less create mode 100644 lib/tpl/bootstrap3/css/toc.less create mode 100644 lib/tpl/bootstrap3/detail.php create mode 100644 lib/tpl/bootstrap3/extra/hooks/navbar.html create mode 100644 lib/tpl/bootstrap3/extra/hooks/social.html create mode 100644 lib/tpl/bootstrap3/iconify.php create mode 100644 lib/tpl/bootstrap3/images/apple-touch-icon.png create mode 100644 lib/tpl/bootstrap3/images/avatar.png create mode 100644 lib/tpl/bootstrap3/images/bootstrap.png create mode 100644 lib/tpl/bootstrap3/images/button-bootstrap3.png create mode 100644 lib/tpl/bootstrap3/images/css3.png create mode 100644 lib/tpl/bootstrap3/images/favicon.ico create mode 100644 lib/tpl/bootstrap3/images/html5.png create mode 100644 lib/tpl/bootstrap3/images/license/by.png create mode 100644 lib/tpl/bootstrap3/images/license/cc.png create mode 100644 lib/tpl/bootstrap3/images/license/gnufdl.png create mode 100644 lib/tpl/bootstrap3/images/license/nc-eu.png create mode 100644 lib/tpl/bootstrap3/images/license/nc-jp.png create mode 100644 lib/tpl/bootstrap3/images/license/nc.png create mode 100644 lib/tpl/bootstrap3/images/license/nd.png create mode 100644 lib/tpl/bootstrap3/images/license/pd.png create mode 100644 lib/tpl/bootstrap3/images/license/remix.png create mode 100644 lib/tpl/bootstrap3/images/license/sa.png create mode 100644 lib/tpl/bootstrap3/images/license/sampling.plus.png create mode 100644 lib/tpl/bootstrap3/images/license/sampling.png create mode 100644 lib/tpl/bootstrap3/images/license/share.png create mode 100644 lib/tpl/bootstrap3/images/license/zero.png create mode 100644 lib/tpl/bootstrap3/images/logo.png create mode 100644 lib/tpl/bootstrap3/images/menu/comment-text-multiple.svg create mode 100644 lib/tpl/bootstrap3/images/menu/email-plus.svg create mode 100644 lib/tpl/bootstrap3/images/menu/file-document-box-outline.svg create mode 100644 lib/tpl/bootstrap3/images/menu/help.svg create mode 100644 lib/tpl/bootstrap3/images/menu/image-size-select-large.svg create mode 100644 lib/tpl/bootstrap3/images/menu/link.svg create mode 100644 lib/tpl/bootstrap3/images/menu/printer.svg create mode 100644 lib/tpl/bootstrap3/images/menu/puzzle.svg create mode 100644 lib/tpl/bootstrap3/images/menu/rss.svg create mode 100644 lib/tpl/bootstrap3/images/menu/share-variant.svg create mode 100644 lib/tpl/bootstrap3/images/php.png create mode 100644 lib/tpl/bootstrap3/inc/Menu/DetailMenu.php create mode 100644 lib/tpl/bootstrap3/inc/Menu/Item/Discussion.php create mode 100644 lib/tpl/bootstrap3/inc/Menu/Item/Feed.php create mode 100644 lib/tpl/bootstrap3/inc/Menu/Item/Help.php create mode 100644 lib/tpl/bootstrap3/inc/Menu/Item/ImgOriginalSize.php create mode 100644 lib/tpl/bootstrap3/inc/Menu/Item/Permalink.php create mode 100644 lib/tpl/bootstrap3/inc/Menu/Item/PrintPage.php create mode 100644 lib/tpl/bootstrap3/inc/Menu/Item/SendMail.php create mode 100644 lib/tpl/bootstrap3/inc/Menu/Item/ShareOn.php create mode 100644 lib/tpl/bootstrap3/inc/Menu/PageIconsMenu.php create mode 100644 lib/tpl/bootstrap3/inc/Menu/PageMenu.php create mode 100644 lib/tpl/bootstrap3/inc/simple_html_dom.php create mode 100644 lib/tpl/bootstrap3/index.html create mode 100644 lib/tpl/bootstrap3/js/plugins/csv.js create mode 100644 lib/tpl/bootstrap3/js/plugins/data.js create mode 100644 lib/tpl/bootstrap3/js/plugins/database2.js create mode 100644 lib/tpl/bootstrap3/js/plugins/datatables.js create mode 100644 lib/tpl/bootstrap3/js/plugins/davcal.js create mode 100644 lib/tpl/bootstrap3/js/plugins/discussion.js create mode 100644 lib/tpl/bootstrap3/js/plugins/explain.js create mode 100644 lib/tpl/bootstrap3/js/plugins/folded.js create mode 100644 lib/tpl/bootstrap3/js/plugins/gallery.js create mode 100644 lib/tpl/bootstrap3/js/plugins/include.js create mode 100644 lib/tpl/bootstrap3/js/plugins/inlinetoc.js create mode 100644 lib/tpl/bootstrap3/js/plugins/monthcal.js create mode 100644 lib/tpl/bootstrap3/js/plugins/move.js create mode 100644 lib/tpl/bootstrap3/js/plugins/overlay.js create mode 100644 lib/tpl/bootstrap3/js/plugins/plantuml.js create mode 100644 lib/tpl/bootstrap3/js/plugins/publish.js create mode 100644 lib/tpl/bootstrap3/js/plugins/semantic.js create mode 100644 lib/tpl/bootstrap3/js/plugins/simplenavi.js create mode 100644 lib/tpl/bootstrap3/js/plugins/struct.js create mode 100644 lib/tpl/bootstrap3/js/plugins/tabbox.js create mode 100644 lib/tpl/bootstrap3/js/plugins/tagalerts.js create mode 100644 lib/tpl/bootstrap3/js/plugins/tagging.js create mode 100644 lib/tpl/bootstrap3/js/plugins/translation.js create mode 100644 lib/tpl/bootstrap3/js/plugins/watchcycle.js create mode 100644 lib/tpl/bootstrap3/js/plugins/wrap.js create mode 100644 lib/tpl/bootstrap3/lang/ar/lang.php create mode 100644 lib/tpl/bootstrap3/lang/ar/settings.php create mode 100644 lib/tpl/bootstrap3/lang/de/lang.php create mode 100644 lib/tpl/bootstrap3/lang/de/settings.php create mode 100644 lib/tpl/bootstrap3/lang/en/lang.php create mode 100644 lib/tpl/bootstrap3/lang/en/settings.php create mode 100644 lib/tpl/bootstrap3/lang/eo/lang.php create mode 100644 lib/tpl/bootstrap3/lang/es/lang.php create mode 100644 lib/tpl/bootstrap3/lang/es/settings.php create mode 100644 lib/tpl/bootstrap3/lang/fa/lang.php create mode 100644 lib/tpl/bootstrap3/lang/fa/settings.php create mode 100644 lib/tpl/bootstrap3/lang/fr/lang.php create mode 100644 lib/tpl/bootstrap3/lang/fr/settings.php create mode 100644 lib/tpl/bootstrap3/lang/hu/lang.php create mode 100644 lib/tpl/bootstrap3/lang/id/lang.php create mode 100644 lib/tpl/bootstrap3/lang/id/settings.php create mode 100644 lib/tpl/bootstrap3/lang/it/lang.php create mode 100644 lib/tpl/bootstrap3/lang/it/settings.php create mode 100644 lib/tpl/bootstrap3/lang/ja/lang.php create mode 100644 lib/tpl/bootstrap3/lang/ja/settings.php create mode 100644 lib/tpl/bootstrap3/lang/ko/lang.php create mode 100644 lib/tpl/bootstrap3/lang/ko/settings.php create mode 100644 lib/tpl/bootstrap3/lang/no/lang.php create mode 100644 lib/tpl/bootstrap3/lang/no/settings.php create mode 100644 lib/tpl/bootstrap3/lang/pl/lang.php create mode 100644 lib/tpl/bootstrap3/lang/pl/settings.php create mode 100644 lib/tpl/bootstrap3/lang/pt-br/lang.php create mode 100644 lib/tpl/bootstrap3/lang/pt-br/settings.php create mode 100644 lib/tpl/bootstrap3/lang/pt/lang.php create mode 100644 lib/tpl/bootstrap3/lang/pt/settings.php create mode 100644 lib/tpl/bootstrap3/lang/ru/lang.php create mode 100644 lib/tpl/bootstrap3/lang/ru/settings.php create mode 100644 lib/tpl/bootstrap3/lang/zh/lang.php create mode 100644 lib/tpl/bootstrap3/lang/zh/settings.php create mode 100644 lib/tpl/bootstrap3/main.php create mode 100644 lib/tpl/bootstrap3/manager.dat create mode 100644 lib/tpl/bootstrap3/mediamanager.php create mode 100644 lib/tpl/bootstrap3/script.js create mode 100644 lib/tpl/bootstrap3/style.ini create mode 100644 lib/tpl/bootstrap3/template.info.txt create mode 100644 lib/tpl/bootstrap3/tpl/badges.php create mode 100644 lib/tpl/bootstrap3/tpl/breadcrumbs.php create mode 100644 lib/tpl/bootstrap3/tpl/cookielaw.php create mode 100644 lib/tpl/bootstrap3/tpl/footer.php create mode 100644 lib/tpl/bootstrap3/tpl/functions.php create mode 100644 lib/tpl/bootstrap3/tpl/global.php create mode 100644 lib/tpl/bootstrap3/tpl/menu-admin.php create mode 100644 lib/tpl/bootstrap3/tpl/menu-tools.php create mode 100644 lib/tpl/bootstrap3/tpl/menu-user.php create mode 100644 lib/tpl/bootstrap3/tpl/navbar-searchform.php create mode 100644 lib/tpl/bootstrap3/tpl/navbar.php create mode 100644 lib/tpl/bootstrap3/tpl/new-page.php create mode 100644 lib/tpl/bootstrap3/tpl/page-icons.php create mode 100644 lib/tpl/bootstrap3/tpl/page-tools.php create mode 100644 lib/tpl/bootstrap3/tpl/sidebar.php create mode 100644 lib/tpl/bootstrap3/tpl/theme-switcher.php create mode 100644 lib/tpl/bootstrap3/tpl/translation.php create mode 100644 lib/tpl/bootstrap3/tpl_functions.php create mode 100644 lib/tpl/bootstrap3/tpl_global.php create mode 100644 lib/tpl/dokuwiki/css/_admin.less create mode 100644 lib/tpl/dokuwiki/css/_diff.css create mode 100644 lib/tpl/dokuwiki/css/_edit.css create mode 100644 lib/tpl/dokuwiki/css/_fileuploader.css create mode 100644 lib/tpl/dokuwiki/css/_footnotes.css create mode 100644 lib/tpl/dokuwiki/css/_forms.css create mode 100644 lib/tpl/dokuwiki/css/_imgdetail.css create mode 100644 lib/tpl/dokuwiki/css/_links.css create mode 100644 lib/tpl/dokuwiki/css/_media_fullscreen.css create mode 100644 lib/tpl/dokuwiki/css/_media_popup.css create mode 100644 lib/tpl/dokuwiki/css/_modal.css create mode 100644 lib/tpl/dokuwiki/css/_recent.css create mode 100644 lib/tpl/dokuwiki/css/_search.less create mode 100644 lib/tpl/dokuwiki/css/_tabs.css create mode 100644 lib/tpl/dokuwiki/css/_toc.css create mode 100644 lib/tpl/dokuwiki/css/basic.less create mode 100644 lib/tpl/dokuwiki/css/content.less create mode 100644 lib/tpl/dokuwiki/css/design.less create mode 100644 lib/tpl/dokuwiki/css/mobile.less create mode 100644 lib/tpl/dokuwiki/css/pagetools.less create mode 100644 lib/tpl/dokuwiki/css/print.css create mode 100644 lib/tpl/dokuwiki/css/structure.less create mode 100644 lib/tpl/dokuwiki/css/usertools.less create mode 100644 lib/tpl/dokuwiki/detail.php create mode 100644 lib/tpl/dokuwiki/images/apple-touch-icon.png create mode 100644 lib/tpl/dokuwiki/images/button-css.png create mode 100644 lib/tpl/dokuwiki/images/button-donate.gif create mode 100644 lib/tpl/dokuwiki/images/button-dw.png create mode 100644 lib/tpl/dokuwiki/images/button-html5.png create mode 100644 lib/tpl/dokuwiki/images/button-php.gif create mode 100644 lib/tpl/dokuwiki/images/button-rss.png create mode 100644 lib/tpl/dokuwiki/images/dokuwiki.svg create mode 100644 lib/tpl/dokuwiki/images/favicon.ico create mode 100644 lib/tpl/dokuwiki/images/license.txt create mode 100644 lib/tpl/dokuwiki/images/logo.png create mode 100644 lib/tpl/dokuwiki/images/page-background.svg create mode 100644 lib/tpl/dokuwiki/images/page-gradient.png create mode 100644 lib/tpl/dokuwiki/images/pagetools-build.php create mode 100644 lib/tpl/dokuwiki/images/pagetools-sprite.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/00_default.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/01_edit.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/02_create.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/03_draft.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/04_show.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/05_source.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/06_revert.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/07_revisions.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/08_backlink.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/09_subscribe.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/10_top.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/11_mediamanager.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/12_back.png create mode 100644 lib/tpl/dokuwiki/images/pagetools/license.txt create mode 100644 lib/tpl/dokuwiki/images/search.png create mode 100644 lib/tpl/dokuwiki/images/toc-arrows.png create mode 100644 lib/tpl/dokuwiki/images/toc-bullet.png create mode 100644 lib/tpl/dokuwiki/images/usertools.png create mode 100644 lib/tpl/dokuwiki/lang/bg/lang.php create mode 100644 lib/tpl/dokuwiki/lang/ckb/lang.php create mode 100644 lib/tpl/dokuwiki/lang/ckb/style.txt create mode 100644 lib/tpl/dokuwiki/lang/cs/lang.php create mode 100644 lib/tpl/dokuwiki/lang/cs/style.txt create mode 100644 lib/tpl/dokuwiki/lang/cy/lang.php create mode 100644 lib/tpl/dokuwiki/lang/cy/style.txt create mode 100644 lib/tpl/dokuwiki/lang/da/lang.php create mode 100644 lib/tpl/dokuwiki/lang/da/style.txt create mode 100644 lib/tpl/dokuwiki/lang/de-informal/lang.php create mode 100644 lib/tpl/dokuwiki/lang/de-informal/style.txt create mode 100644 lib/tpl/dokuwiki/lang/de/lang.php create mode 100644 lib/tpl/dokuwiki/lang/de/style.txt create mode 100644 lib/tpl/dokuwiki/lang/el/lang.php create mode 100644 lib/tpl/dokuwiki/lang/el/style.txt create mode 100644 lib/tpl/dokuwiki/lang/en/lang.php create mode 100644 lib/tpl/dokuwiki/lang/en/style.txt create mode 100644 lib/tpl/dokuwiki/lang/es/lang.php create mode 100644 lib/tpl/dokuwiki/lang/es/style.txt create mode 100644 lib/tpl/dokuwiki/lang/fa/lang.php create mode 100644 lib/tpl/dokuwiki/lang/fa/style.txt create mode 100644 lib/tpl/dokuwiki/lang/fr/lang.php create mode 100644 lib/tpl/dokuwiki/lang/fr/style.txt create mode 100644 lib/tpl/dokuwiki/lang/hr/lang.php create mode 100644 lib/tpl/dokuwiki/lang/hr/style.txt create mode 100644 lib/tpl/dokuwiki/lang/hu/lang.php create mode 100644 lib/tpl/dokuwiki/lang/hu/style.txt create mode 100644 lib/tpl/dokuwiki/lang/it/lang.php create mode 100644 lib/tpl/dokuwiki/lang/it/style.txt create mode 100644 lib/tpl/dokuwiki/lang/ja/lang.php create mode 100644 lib/tpl/dokuwiki/lang/ja/style.txt create mode 100644 lib/tpl/dokuwiki/lang/ko/lang.php create mode 100644 lib/tpl/dokuwiki/lang/ko/style.txt create mode 100644 lib/tpl/dokuwiki/lang/nl/lang.php create mode 100644 lib/tpl/dokuwiki/lang/nl/style.txt create mode 100644 lib/tpl/dokuwiki/lang/no/lang.php create mode 100644 lib/tpl/dokuwiki/lang/no/style.txt create mode 100644 lib/tpl/dokuwiki/lang/oc/lang.php create mode 100644 lib/tpl/dokuwiki/lang/pl/lang.php create mode 100644 lib/tpl/dokuwiki/lang/pl/style.txt create mode 100644 lib/tpl/dokuwiki/lang/pt-br/lang.php create mode 100644 lib/tpl/dokuwiki/lang/pt-br/style.txt create mode 100644 lib/tpl/dokuwiki/lang/pt/lang.php create mode 100644 lib/tpl/dokuwiki/lang/pt/style.txt create mode 100644 lib/tpl/dokuwiki/lang/ru/lang.php create mode 100644 lib/tpl/dokuwiki/lang/ru/style.txt create mode 100644 lib/tpl/dokuwiki/lang/sk/lang.php create mode 100644 lib/tpl/dokuwiki/lang/sk/style.txt create mode 100644 lib/tpl/dokuwiki/lang/sv/lang.php create mode 100644 lib/tpl/dokuwiki/lang/vi/lang.php create mode 100644 lib/tpl/dokuwiki/lang/vi/style.txt create mode 100644 lib/tpl/dokuwiki/lang/zh-tw/style.txt create mode 100644 lib/tpl/dokuwiki/lang/zh/lang.php create mode 100644 lib/tpl/dokuwiki/lang/zh/style.txt create mode 100644 lib/tpl/dokuwiki/main.php create mode 100644 lib/tpl/dokuwiki/mediamanager.php create mode 100644 lib/tpl/dokuwiki/script.js create mode 100644 lib/tpl/dokuwiki/style.ini create mode 100644 lib/tpl/dokuwiki/template.info.txt create mode 100644 lib/tpl/dokuwiki/tpl_footer.php create mode 100644 lib/tpl/dokuwiki/tpl_header.php create mode 100644 lib/tpl/flat/assets/.DS_Store create mode 100644 lib/tpl/flat/assets/css/.DS_Store create mode 100644 lib/tpl/flat/assets/css/admin-style.css create mode 100644 lib/tpl/flat/assets/css/editor-style.css create mode 100644 lib/tpl/flat/assets/css/flat.css create mode 100644 lib/tpl/flat/assets/css/flat.css.map create mode 100644 lib/tpl/flat/assets/css/flat.min.css create mode 100644 lib/tpl/flat/assets/css/style.css create mode 100644 lib/tpl/flat/assets/fonts/FontAwesome.otf create mode 100644 lib/tpl/flat/assets/fonts/fontawesome-webfont.eot create mode 100644 lib/tpl/flat/assets/fonts/fontawesome-webfont.svg create mode 100644 lib/tpl/flat/assets/fonts/fontawesome-webfont.ttf create mode 100644 lib/tpl/flat/assets/fonts/fontawesome-webfont.woff create mode 100644 lib/tpl/flat/assets/fonts/fontawesome-webfont.woff2 create mode 100644 lib/tpl/flat/assets/img/default-background.jpg create mode 100644 lib/tpl/flat/assets/js/flat.js create mode 100644 lib/tpl/flat/assets/js/flat.min.js create mode 100644 lib/tpl/flat/assets/js/flat.min2.js create mode 100644 lib/tpl/flat/assets/js/html5shiv.js create mode 100644 lib/tpl/flat/assets/js/html5shiv.min.js create mode 100644 lib/tpl/flat/conf/default.php create mode 100644 lib/tpl/flat/conf/metadata.php create mode 100644 lib/tpl/flat/css/.DS_Store create mode 100644 lib/tpl/flat/css/_admin.less create mode 100644 lib/tpl/flat/css/_diff.css create mode 100644 lib/tpl/flat/css/_edit.css create mode 100644 lib/tpl/flat/css/_fileuploader.css create mode 100644 lib/tpl/flat/css/_footnotes.css create mode 100644 lib/tpl/flat/css/_forms.css create mode 100644 lib/tpl/flat/css/_imgdetail.css create mode 100644 lib/tpl/flat/css/_links.css create mode 100644 lib/tpl/flat/css/_media_fullscreen.css create mode 100644 lib/tpl/flat/css/_media_popup.css create mode 100644 lib/tpl/flat/css/_modal.css create mode 100644 lib/tpl/flat/css/_recent.css create mode 100644 lib/tpl/flat/css/_search.css create mode 100644 lib/tpl/flat/css/_tabs.css create mode 100644 lib/tpl/flat/css/_toc.css create mode 100644 lib/tpl/flat/css/accordion.css create mode 100644 lib/tpl/flat/css/admin-style.css create mode 100644 lib/tpl/flat/css/basic.less create mode 100644 lib/tpl/flat/css/content.less create mode 100644 lib/tpl/flat/css/customFlat.css create mode 100644 lib/tpl/flat/css/design.less create mode 100644 lib/tpl/flat/css/editor-style.css create mode 100644 lib/tpl/flat/css/mobile.less create mode 100644 lib/tpl/flat/css/pagetools.less create mode 100644 lib/tpl/flat/css/print.css create mode 100644 lib/tpl/flat/css/structure.less create mode 100644 lib/tpl/flat/detail.php create mode 100644 lib/tpl/flat/flat.min.js create mode 100644 lib/tpl/flat/footer.html create mode 100644 lib/tpl/flat/images/apple-touch-icon.png create mode 100644 lib/tpl/flat/images/button-css.png create mode 100644 lib/tpl/flat/images/button-donate.gif create mode 100644 lib/tpl/flat/images/button-dw.png create mode 100644 lib/tpl/flat/images/button-html5.png create mode 100644 lib/tpl/flat/images/button-php.gif create mode 100644 lib/tpl/flat/images/button-rss.png create mode 100644 lib/tpl/flat/images/favicon.ico create mode 100644 lib/tpl/flat/images/license.txt create mode 100644 lib/tpl/flat/images/logo.png create mode 100644 lib/tpl/flat/images/page-background.svg create mode 100644 lib/tpl/flat/images/page-gradient.png create mode 100644 lib/tpl/flat/images/pagetools-build.php create mode 100644 lib/tpl/flat/images/pagetools-sprite.png create mode 100644 lib/tpl/flat/images/pagetools/00_default.png create mode 100644 lib/tpl/flat/images/pagetools/01_edit.png create mode 100644 lib/tpl/flat/images/pagetools/02_create.png create mode 100644 lib/tpl/flat/images/pagetools/03_draft.png create mode 100644 lib/tpl/flat/images/pagetools/04_show.png create mode 100644 lib/tpl/flat/images/pagetools/05_source.png create mode 100644 lib/tpl/flat/images/pagetools/06_revert.png create mode 100644 lib/tpl/flat/images/pagetools/07_revisions.png create mode 100644 lib/tpl/flat/images/pagetools/08_backlink.png create mode 100644 lib/tpl/flat/images/pagetools/09_subscribe.png create mode 100644 lib/tpl/flat/images/pagetools/10_top.png create mode 100644 lib/tpl/flat/images/pagetools/11_mediamanager.png create mode 100644 lib/tpl/flat/images/pagetools/12_back.png create mode 100644 lib/tpl/flat/images/pagetools/license.txt create mode 100644 lib/tpl/flat/images/search.png create mode 100644 lib/tpl/flat/images/toc-arrows.png create mode 100644 lib/tpl/flat/images/toc-bullet.png create mode 100644 lib/tpl/flat/images/usertools.png create mode 100644 lib/tpl/flat/lang/en/settings.php create mode 100644 lib/tpl/flat/lang/fr/settings.php create mode 100644 lib/tpl/flat/main.php create mode 100644 lib/tpl/flat/manager.dat create mode 100644 lib/tpl/flat/mediamanager.php create mode 100644 lib/tpl/flat/script.js create mode 100644 lib/tpl/flat/sidebar.php create mode 100644 lib/tpl/flat/style.ini create mode 100644 lib/tpl/flat/template.info.txt create mode 100644 lib/tpl/flat/tpl_content.php create mode 100644 lib/tpl/flat/tpl_footer.php create mode 100644 lib/tpl/flat/tpl_header.php create mode 100644 lib/tpl/index.php create mode 100644 lib/tpl/material/LICENSE create mode 100644 lib/tpl/material/README.md create mode 100644 lib/tpl/material/conf/default.php create mode 100644 lib/tpl/material/conf/metadata.php create mode 100644 lib/tpl/material/copy these icons to toolbar folder/bold.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/chars.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/h.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/hequal.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/hminus.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/hplus.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/image.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/italic.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/link.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/linkextern.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/mono.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/ol.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/smiley.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/strike.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/ul.png create mode 100644 lib/tpl/material/copy these icons to toolbar folder/underline.png create mode 100644 lib/tpl/material/css/basic.less create mode 100644 lib/tpl/material/css/comp.less create mode 100644 lib/tpl/material/css/editor.less create mode 100644 lib/tpl/material/css/fixes.less create mode 100644 lib/tpl/material/css/links.less create mode 100644 lib/tpl/material/css/mobile.less create mode 100644 lib/tpl/material/images/favicon.ico create mode 100644 lib/tpl/material/images/logo.svg create mode 100644 lib/tpl/material/lang/en/settings.php create mode 100644 lib/tpl/material/main.php create mode 100644 lib/tpl/material/manager.dat create mode 100644 lib/tpl/material/sidebar.php create mode 100644 lib/tpl/material/style.ini create mode 100644 lib/tpl/material/template.info.txt create mode 100644 lib/tpl/minima/_admin.css create mode 100644 lib/tpl/minima/_linkwiz.css create mode 100644 lib/tpl/minima/_mediaoptions.css create mode 100644 lib/tpl/minima/_subscription.css create mode 100644 lib/tpl/minima/conf/default.php create mode 100644 lib/tpl/minima/conf/metadata.php create mode 100644 lib/tpl/minima/design.css create mode 100644 lib/tpl/minima/detail.php create mode 100644 lib/tpl/minima/footer.html create mode 100644 lib/tpl/minima/functions.php create mode 100644 lib/tpl/minima/images/bullet_blue.gif create mode 100644 lib/tpl/minima/images/bullet_brown.gif create mode 100644 lib/tpl/minima/images/bullet_gray.gif create mode 100644 lib/tpl/minima/images/bullet_green.gif create mode 100644 lib/tpl/minima/images/bullet_pink.gif create mode 100644 lib/tpl/minima/images/bullet_purple.gif create mode 100644 lib/tpl/minima/images/button-cc.gif create mode 100644 lib/tpl/minima/images/button-donate.gif create mode 100644 lib/tpl/minima/images/button-dw.png create mode 100644 lib/tpl/minima/images/button-rss.png create mode 100644 lib/tpl/minima/images/button-wikidesign.gif create mode 100644 lib/tpl/minima/images/buttonshadow.png create mode 100644 lib/tpl/minima/images/closed_blue.gif create mode 100644 lib/tpl/minima/images/closed_brown.gif create mode 100644 lib/tpl/minima/images/closed_gray.gif create mode 100644 lib/tpl/minima/images/closed_green.gif create mode 100644 lib/tpl/minima/images/closed_pink.gif create mode 100644 lib/tpl/minima/images/closed_purple.gif create mode 100644 lib/tpl/minima/images/edgeleft_blue.gif create mode 100644 lib/tpl/minima/images/edgeleft_brown.gif create mode 100644 lib/tpl/minima/images/edgeleft_gray.gif create mode 100644 lib/tpl/minima/images/edgeleft_green.gif create mode 100644 lib/tpl/minima/images/edgeleft_pink.gif create mode 100644 lib/tpl/minima/images/edgeleft_purple.gif create mode 100644 lib/tpl/minima/images/edgeright_blue.gif create mode 100644 lib/tpl/minima/images/edgeright_brown.gif create mode 100644 lib/tpl/minima/images/edgeright_gray.gif create mode 100644 lib/tpl/minima/images/edgeright_green.gif create mode 100644 lib/tpl/minima/images/edgeright_pink.gif create mode 100644 lib/tpl/minima/images/edgeright_purple.gif create mode 100644 lib/tpl/minima/images/favicon.ico create mode 100644 lib/tpl/minima/images/header_medium_blue.jpg create mode 100644 lib/tpl/minima/images/header_medium_brown.jpg create mode 100644 lib/tpl/minima/images/header_medium_gray.jpg create mode 100644 lib/tpl/minima/images/header_medium_green.jpg create mode 100644 lib/tpl/minima/images/header_medium_pink.jpg create mode 100644 lib/tpl/minima/images/header_medium_purple.jpg create mode 100644 lib/tpl/minima/images/header_narrow_blue.jpg create mode 100644 lib/tpl/minima/images/header_narrow_brown.jpg create mode 100644 lib/tpl/minima/images/header_narrow_gray.jpg create mode 100644 lib/tpl/minima/images/header_narrow_green.jpg create mode 100644 lib/tpl/minima/images/header_narrow_pink.jpg create mode 100644 lib/tpl/minima/images/header_narrow_purple.jpg create mode 100644 lib/tpl/minima/images/header_wide_blue.jpg create mode 100644 lib/tpl/minima/images/header_wide_brown.jpg create mode 100644 lib/tpl/minima/images/header_wide_gray.jpg create mode 100644 lib/tpl/minima/images/header_wide_green.jpg create mode 100644 lib/tpl/minima/images/header_wide_pink.jpg create mode 100644 lib/tpl/minima/images/header_wide_purple.jpg create mode 100644 lib/tpl/minima/images/inputshadow.png create mode 100644 lib/tpl/minima/images/link_icon.gif create mode 100644 lib/tpl/minima/images/mail_icon.gif create mode 100644 lib/tpl/minima/images/open_blue.gif create mode 100644 lib/tpl/minima/images/open_brown.gif create mode 100644 lib/tpl/minima/images/open_gray.gif create mode 100644 lib/tpl/minima/images/open_green.gif create mode 100644 lib/tpl/minima/images/open_pink.gif create mode 100644 lib/tpl/minima/images/open_purple.gif create mode 100644 lib/tpl/minima/images/tocdot2_blue.gif create mode 100644 lib/tpl/minima/images/tocdot2_brown.gif create mode 100644 lib/tpl/minima/images/tocdot2_gray.gif create mode 100644 lib/tpl/minima/images/tocdot2_green.gif create mode 100644 lib/tpl/minima/images/tocdot2_pink.gif create mode 100644 lib/tpl/minima/images/tocdot2_purple.gif create mode 100644 lib/tpl/minima/images/windows.gif create mode 100644 lib/tpl/minima/lang/de/settings.php create mode 100644 lib/tpl/minima/lang/en/settings.php create mode 100644 lib/tpl/minima/lang/es/settings.php create mode 100644 lib/tpl/minima/layout.css create mode 100644 lib/tpl/minima/main.php create mode 100644 lib/tpl/minima/manager.dat create mode 100644 lib/tpl/minima/media.css create mode 100644 lib/tpl/minima/mediamanager.php create mode 100644 lib/tpl/minima/print.css create mode 100644 lib/tpl/minima/rtl.css create mode 100644 lib/tpl/minima/style.ini create mode 100644 lib/tpl/minima/style_blue.ini create mode 100644 lib/tpl/minima/style_brown.ini create mode 100644 lib/tpl/minima/style_gray.ini create mode 100644 lib/tpl/minima/style_green.ini create mode 100644 lib/tpl/minima/style_pink.ini create mode 100644 lib/tpl/minima/style_purple.ini create mode 100644 lib/tpl/sprintdoc/LICENSE create mode 100644 lib/tpl/sprintdoc/Template.php create mode 100644 lib/tpl/sprintdoc/conf/default.php create mode 100644 lib/tpl/sprintdoc/conf/metadata.php create mode 100644 lib/tpl/sprintdoc/css/area_content.less create mode 100644 lib/tpl/sprintdoc/css/area_footer.less create mode 100644 lib/tpl/sprintdoc/css/area_footnotes.less create mode 100644 lib/tpl/sprintdoc/css/area_forms.less create mode 100644 lib/tpl/sprintdoc/css/area_header.less create mode 100644 lib/tpl/sprintdoc/css/area_main-content-anchor.less create mode 100644 lib/tpl/sprintdoc/css/area_main-content-secedit.less create mode 100644 lib/tpl/sprintdoc/css/area_main-content.less create mode 100644 lib/tpl/sprintdoc/css/area_main-sidebar-nav.less create mode 100644 lib/tpl/sprintdoc/css/area_main-sidebar-search.less create mode 100644 lib/tpl/sprintdoc/css/area_main-sidebar-tabs.less create mode 100644 lib/tpl/sprintdoc/css/area_msg.less create mode 100644 lib/tpl/sprintdoc/css/area_nav-breadcrumb.less create mode 100644 lib/tpl/sprintdoc/css/area_nav-direct.less create mode 100644 lib/tpl/sprintdoc/css/area_nav-metabox.less create mode 100644 lib/tpl/sprintdoc/css/area_nav-page-attributes.less create mode 100644 lib/tpl/sprintdoc/css/area_nav-pagetools.less create mode 100644 lib/tpl/sprintdoc/css/area_nav-usertools.less create mode 100644 lib/tpl/sprintdoc/css/area_recent.less create mode 100644 lib/tpl/sprintdoc/css/area_search.less create mode 100644 lib/tpl/sprintdoc/css/area_tabs.less create mode 100644 lib/tpl/sprintdoc/css/area_togglelink.less create mode 100644 lib/tpl/sprintdoc/css/base.less create mode 100644 lib/tpl/sprintdoc/css/base_design.less create mode 100644 lib/tpl/sprintdoc/css/base_fontello-icons.less create mode 100644 lib/tpl/sprintdoc/css/base_mixins.less create mode 100644 lib/tpl/sprintdoc/css/base_structure.less create mode 100644 lib/tpl/sprintdoc/css/base_vars.less create mode 100644 lib/tpl/sprintdoc/css/plugins/bureaucracy.less create mode 100644 lib/tpl/sprintdoc/css/plugins/configmanager.less create mode 100644 lib/tpl/sprintdoc/css/plugins/data.less create mode 100644 lib/tpl/sprintdoc/css/plugins/do_tasks.less create mode 100644 lib/tpl/sprintdoc/css/plugins/edit.less create mode 100644 lib/tpl/sprintdoc/css/plugins/edittable.less create mode 100644 lib/tpl/sprintdoc/css/plugins/extension__manager.less create mode 100644 lib/tpl/sprintdoc/css/plugins/fastwiki.less create mode 100644 lib/tpl/sprintdoc/css/plugins/folded.less create mode 100644 lib/tpl/sprintdoc/css/plugins/highlight_parent.less create mode 100644 lib/tpl/sprintdoc/css/plugins/magic-matcher.less create mode 100644 lib/tpl/sprintdoc/css/plugins/mediamanager.less create mode 100644 lib/tpl/sprintdoc/css/plugins/move.less create mode 100644 lib/tpl/sprintdoc/css/plugins/popupviewer.less create mode 100644 lib/tpl/sprintdoc/css/plugins/qc.less create mode 100644 lib/tpl/sprintdoc/css/plugins/sitemapnavi.less create mode 100644 lib/tpl/sprintdoc/css/plugins/starred.less create mode 100644 lib/tpl/sprintdoc/css/plugins/struct.less create mode 100644 lib/tpl/sprintdoc/css/plugins/structstatus.less create mode 100644 lib/tpl/sprintdoc/css/plugins/tabinclude.less create mode 100644 lib/tpl/sprintdoc/css/plugins/tablelayout.less create mode 100644 lib/tpl/sprintdoc/css/plugins/tagging.less create mode 100644 lib/tpl/sprintdoc/css/plugins/tplinc.less create mode 100644 lib/tpl/sprintdoc/css/plugins/translation.less create mode 100644 lib/tpl/sprintdoc/css/print.less create mode 100644 lib/tpl/sprintdoc/css/template_admin.less create mode 100644 lib/tpl/sprintdoc/css/template_detail.less create mode 100644 lib/tpl/sprintdoc/css/toollist.less create mode 100644 lib/tpl/sprintdoc/deleted.files create mode 100644 lib/tpl/sprintdoc/detail.php create mode 100644 lib/tpl/sprintdoc/fonts/icons/LICENSE.txt create mode 100644 lib/tpl/sprintdoc/fonts/icons/README.txt create mode 100644 lib/tpl/sprintdoc/fonts/icons/config.json create mode 100644 lib/tpl/sprintdoc/fonts/icons/fontello-codes.css create mode 100644 lib/tpl/sprintdoc/fonts/icons/fontello-no-materialdesign.zip create mode 100644 lib/tpl/sprintdoc/fonts/icons/fontello.eot create mode 100644 lib/tpl/sprintdoc/fonts/icons/fontello.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/fontello.ttf create mode 100644 lib/tpl/sprintdoc/fonts/icons/fontello.woff create mode 100644 lib/tpl/sprintdoc/fonts/icons/fontello.woff2 create mode 100644 lib/tpl/sprintdoc/fonts/icons/fontello.zip create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/elusive-clipboard-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/elusive-clipboard-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/elusive-doc-new-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/elusive-doc-new-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/entypo-down-open-big-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/entypo-down-open-big-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/entypo-help-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/entypo-help-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/entypo-search-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/entypo-search-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/entypo-up-open-big-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/entypo-up-open-big-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/entypo-user-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/entypo-user-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-bell-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-bell-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-bookmark-empty-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-bookmark-empty-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-clock-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-clock-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-code-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-code-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-cog-alt-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-cog-alt-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-cog-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-cog-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-doc-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-doc-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-doc-text-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-doc-text-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-docs-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-docs-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-file-pdf-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-file-pdf-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-frown-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-frown-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-home-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-home-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-link-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-link-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-login-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-login-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-logout-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-logout-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-mail-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-mail-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-meh-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-meh-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-menu-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-menu-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-plus-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-plus-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-puzzle-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-puzzle-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-sitemap-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-sitemap-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-smile-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontawesome-smile-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-angry-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-angry-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-cry-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-cry-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-grin-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-grin-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-happy-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-happy-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-laugh-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-laugh-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-sleep-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-sleep-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-squint-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-squint-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-thumbsup-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-thumbsup-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-unhappy-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-unhappy-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-wink-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-wink-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-wink2-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/fontelico-emo-wink2-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/iconic-book-open-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/iconic-book-open-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/linecons-cloud-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/linecons-cloud-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/linecons-pencil-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/linecons-pencil-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/modernpics-pencil-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/modernpics-pencil-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-cloud-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-cloud-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-down-outline-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-down-outline-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-down-small-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-down-small-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-home-outline-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-home-outline-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-left-outline-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-left-outline-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-left-small-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-left-small-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-puzzle-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-puzzle-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-right-outline-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-right-outline-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-right-small-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-right-small-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-up-outline-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-up-outline-hover.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-up-small-default.svg create mode 100644 lib/tpl/sprintdoc/fonts/icons/svg/typicons-up-small-hover.svg create mode 100644 lib/tpl/sprintdoc/images/fav/android-chrome-192x192.png create mode 100644 lib/tpl/sprintdoc/images/fav/apple-touch-icon-114x114.png create mode 100644 lib/tpl/sprintdoc/images/fav/apple-touch-icon-120x120.png create mode 100644 lib/tpl/sprintdoc/images/fav/apple-touch-icon-144x144.png create mode 100644 lib/tpl/sprintdoc/images/fav/apple-touch-icon-152x152.png create mode 100644 lib/tpl/sprintdoc/images/fav/apple-touch-icon-180x180.png create mode 100644 lib/tpl/sprintdoc/images/fav/apple-touch-icon-57x57.png create mode 100644 lib/tpl/sprintdoc/images/fav/apple-touch-icon-60x60.png create mode 100644 lib/tpl/sprintdoc/images/fav/apple-touch-icon-72x72.png create mode 100644 lib/tpl/sprintdoc/images/fav/apple-touch-icon-76x76.png create mode 100644 lib/tpl/sprintdoc/images/fav/favicon-32x32.png create mode 100644 lib/tpl/sprintdoc/images/fav/favicon-96x96.png create mode 100644 lib/tpl/sprintdoc/images/fav/largetile.png create mode 100644 lib/tpl/sprintdoc/images/fav/mediumtile.png create mode 100644 lib/tpl/sprintdoc/images/fav/smalltile.png create mode 100644 lib/tpl/sprintdoc/images/fav/widetile.png create mode 100644 lib/tpl/sprintdoc/images/favicon.ico create mode 100644 lib/tpl/sprintdoc/images/pagetools-sprite.png create mode 100644 lib/tpl/sprintdoc/images/tools/00-default_checkbox-blank-circle-outline.svg create mode 100644 lib/tpl/sprintdoc/images/tools/01-edit_pencil.svg create mode 100644 lib/tpl/sprintdoc/images/tools/02-create_pencil.svg create mode 100644 lib/tpl/sprintdoc/images/tools/03-draft_android-studio.svg create mode 100644 lib/tpl/sprintdoc/images/tools/04-show_file-document.svg create mode 100644 lib/tpl/sprintdoc/images/tools/05-source_file-xml.svg create mode 100644 lib/tpl/sprintdoc/images/tools/06-revert_replay.svg create mode 100644 lib/tpl/sprintdoc/images/tools/07-revisions_history.svg create mode 100644 lib/tpl/sprintdoc/images/tools/08-backlink_link-variant.svg create mode 100644 lib/tpl/sprintdoc/images/tools/09-subscribe_email-outline.svg create mode 100644 lib/tpl/sprintdoc/images/tools/10-top_arrow-up.svg create mode 100644 lib/tpl/sprintdoc/images/tools/11-mediamanager_folder-image.svg create mode 100644 lib/tpl/sprintdoc/images/tools/12-back_arrow-left.svg create mode 100644 lib/tpl/sprintdoc/images/tools/40-pdf-file.svg create mode 100644 lib/tpl/sprintdoc/images/tools/41-format-paint.svg create mode 100644 lib/tpl/sprintdoc/images/tools/43-file-delimeted.svg create mode 100644 lib/tpl/sprintdoc/img/account-settings.svg create mode 100644 lib/tpl/sprintdoc/img/apple-safari.svg create mode 100644 lib/tpl/sprintdoc/img/down.svg create mode 100644 lib/tpl/sprintdoc/img/file-export.svg create mode 100644 lib/tpl/sprintdoc/img/menu.svg create mode 100644 lib/tpl/sprintdoc/img/pencil.svg create mode 100644 lib/tpl/sprintdoc/img/sitemap.svg create mode 100644 lib/tpl/sprintdoc/img/star-circle.svg create mode 100644 lib/tpl/sprintdoc/img/up.svg create mode 100644 lib/tpl/sprintdoc/js/anchor.js create mode 100644 lib/tpl/sprintdoc/js/base/rem.min.js create mode 100644 lib/tpl/sprintdoc/js/base/spc.js create mode 100644 lib/tpl/sprintdoc/js/base/velocity.min.js create mode 100644 lib/tpl/sprintdoc/js/direct.js create mode 100644 lib/tpl/sprintdoc/js/legacy/html5shiv.js create mode 100644 lib/tpl/sprintdoc/js/legacy/respond.min.js create mode 100644 lib/tpl/sprintdoc/js/meta-box.js create mode 100644 lib/tpl/sprintdoc/js/plugins/bookcreator.js create mode 100644 lib/tpl/sprintdoc/js/plugins/do_tasks.js create mode 100644 lib/tpl/sprintdoc/js/plugins/folded.js create mode 100644 lib/tpl/sprintdoc/js/plugins/qc.js create mode 100644 lib/tpl/sprintdoc/js/sidebar.js create mode 100644 lib/tpl/sprintdoc/lang/cs/lang.php create mode 100644 lib/tpl/sprintdoc/lang/cs/settings.php create mode 100644 lib/tpl/sprintdoc/lang/cs/style.txt create mode 100644 lib/tpl/sprintdoc/lang/de/lang.php create mode 100644 lib/tpl/sprintdoc/lang/de/settings.php create mode 100644 lib/tpl/sprintdoc/lang/en/lang.php create mode 100644 lib/tpl/sprintdoc/lang/en/settings.php create mode 100644 lib/tpl/sprintdoc/lang/en/style.txt create mode 100644 lib/tpl/sprintdoc/lang/es/lang.php create mode 100644 lib/tpl/sprintdoc/lang/es/settings.php create mode 100644 lib/tpl/sprintdoc/lang/es/style.txt create mode 100644 lib/tpl/sprintdoc/lang/fr/lang.php create mode 100644 lib/tpl/sprintdoc/lang/fr/settings.php create mode 100644 lib/tpl/sprintdoc/lang/fr/style.txt create mode 100644 lib/tpl/sprintdoc/lang/it/lang.php create mode 100644 lib/tpl/sprintdoc/lang/it/settings.php create mode 100644 lib/tpl/sprintdoc/lang/it/style.txt create mode 100644 lib/tpl/sprintdoc/lang/nl/lang.php create mode 100644 lib/tpl/sprintdoc/lang/nl/settings.php create mode 100644 lib/tpl/sprintdoc/lang/nl/style.txt create mode 100644 lib/tpl/sprintdoc/lang/ru/lang.php create mode 100644 lib/tpl/sprintdoc/lang/ru/settings.php create mode 100644 lib/tpl/sprintdoc/lang/ru/style.txt create mode 100644 lib/tpl/sprintdoc/lang/zh-tw/lang.php create mode 100644 lib/tpl/sprintdoc/lang/zh-tw/settings.php create mode 100644 lib/tpl/sprintdoc/lang/zh-tw/style.txt create mode 100644 lib/tpl/sprintdoc/main.php create mode 100644 lib/tpl/sprintdoc/manager.dat create mode 100644 lib/tpl/sprintdoc/mediamanager.php create mode 100644 lib/tpl/sprintdoc/script.js create mode 100644 lib/tpl/sprintdoc/style.ini create mode 100644 lib/tpl/sprintdoc/svg.php create mode 100644 lib/tpl/sprintdoc/template.info.txt create mode 100644 lib/tpl/sprintdoc/tpl.php create mode 100644 lib/tpl/sprintdoc/tpl/favicon_tiles.php create mode 100644 lib/tpl/sprintdoc/tpl/main-footer.php create mode 100644 lib/tpl/sprintdoc/tpl/main-sidebar-logo.php create mode 100644 lib/tpl/sprintdoc/tpl/main-sidebar-nav.php create mode 100644 lib/tpl/sprintdoc/tpl/main-sidebar-search.php create mode 100644 lib/tpl/sprintdoc/tpl/nav-breadcrumb.php create mode 100644 lib/tpl/sprintdoc/tpl/nav-direct.php create mode 100644 lib/tpl/sprintdoc/tpl/nav-magicmatcher.php create mode 100644 lib/tpl/sprintdoc/tpl/nav-meta-box.php create mode 100644 lib/tpl/sprintdoc/tpl/nav-page-attributes.php create mode 100644 lib/tpl/sprintdoc/tpl/nav-page-tools.php create mode 100644 lib/tpl/sprintdoc/tpl/nav-status.php create mode 100644 lib/tpl/sprintdoc/tpl/nav-usertools-buttons.php create mode 100644 lib/tpl/vector/.htaccess create mode 100644 lib/tpl/vector/CREDITS create mode 100644 lib/tpl/vector/conf/.htaccess create mode 100644 lib/tpl/vector/conf/boxes.php create mode 100644 lib/tpl/vector/conf/buttons.php create mode 100644 lib/tpl/vector/conf/default.php create mode 100644 lib/tpl/vector/conf/index.html create mode 100644 lib/tpl/vector/conf/metadata.php create mode 100644 lib/tpl/vector/conf/tabs.php create mode 100644 lib/tpl/vector/detail.php create mode 100644 lib/tpl/vector/inc_cite.php create mode 100644 lib/tpl/vector/inc_detail.php create mode 100644 lib/tpl/vector/index.html create mode 100644 lib/tpl/vector/lang/.htaccess create mode 100644 lib/tpl/vector/lang/ca/.htaccess create mode 100644 lib/tpl/vector/lang/ca/index.html create mode 100644 lib/tpl/vector/lang/ca/lang.php create mode 100644 lib/tpl/vector/lang/ca/settings.php create mode 100644 lib/tpl/vector/lang/ca/style.css create mode 100644 lib/tpl/vector/lang/cs/.htaccess create mode 100644 lib/tpl/vector/lang/cs/index.html create mode 100644 lib/tpl/vector/lang/cs/lang.php create mode 100644 lib/tpl/vector/lang/cs/settings.php create mode 100644 lib/tpl/vector/lang/cs/style.css create mode 100644 lib/tpl/vector/lang/de-informal/.htaccess create mode 100644 lib/tpl/vector/lang/de-informal/index.html create mode 100644 lib/tpl/vector/lang/de-informal/lang.php create mode 100644 lib/tpl/vector/lang/de-informal/settings.php create mode 100644 lib/tpl/vector/lang/de-informal/style.css create mode 100644 lib/tpl/vector/lang/de/.htaccess create mode 100644 lib/tpl/vector/lang/de/index.html create mode 100644 lib/tpl/vector/lang/de/lang.php create mode 100644 lib/tpl/vector/lang/de/settings.php create mode 100644 lib/tpl/vector/lang/de/style.css create mode 100644 lib/tpl/vector/lang/en/.htaccess create mode 100644 lib/tpl/vector/lang/en/index.html create mode 100644 lib/tpl/vector/lang/en/lang.php create mode 100644 lib/tpl/vector/lang/en/settings.php create mode 100644 lib/tpl/vector/lang/en/style.css create mode 100644 lib/tpl/vector/lang/es/.htaccess create mode 100644 lib/tpl/vector/lang/es/index.html create mode 100644 lib/tpl/vector/lang/es/lang.php create mode 100644 lib/tpl/vector/lang/es/settings.php create mode 100644 lib/tpl/vector/lang/es/style.css create mode 100644 lib/tpl/vector/lang/eu/.htaccess create mode 100644 lib/tpl/vector/lang/eu/index.html create mode 100644 lib/tpl/vector/lang/eu/lang.php create mode 100644 lib/tpl/vector/lang/eu/settings.php create mode 100644 lib/tpl/vector/lang/eu/style.css create mode 100644 lib/tpl/vector/lang/fa/.htaccess create mode 100644 lib/tpl/vector/lang/fa/index.html create mode 100644 lib/tpl/vector/lang/fa/lang.php create mode 100644 lib/tpl/vector/lang/fa/settings.php create mode 100644 lib/tpl/vector/lang/fa/style.css create mode 100644 lib/tpl/vector/lang/fr/.htaccess create mode 100644 lib/tpl/vector/lang/fr/index.html create mode 100644 lib/tpl/vector/lang/fr/lang.php create mode 100644 lib/tpl/vector/lang/fr/settings.php create mode 100644 lib/tpl/vector/lang/fr/style.css create mode 100644 lib/tpl/vector/lang/he/.htaccess create mode 100644 lib/tpl/vector/lang/he/index.html create mode 100644 lib/tpl/vector/lang/he/lang.php create mode 100644 lib/tpl/vector/lang/he/style.css create mode 100644 lib/tpl/vector/lang/index.html create mode 100644 lib/tpl/vector/lang/it/.htaccess create mode 100644 lib/tpl/vector/lang/it/index.html create mode 100644 lib/tpl/vector/lang/it/lang.php create mode 100644 lib/tpl/vector/lang/it/settings.php create mode 100644 lib/tpl/vector/lang/it/style.css create mode 100644 lib/tpl/vector/lang/ja/.htaccess create mode 100644 lib/tpl/vector/lang/ja/index.html create mode 100644 lib/tpl/vector/lang/ja/lang.php create mode 100644 lib/tpl/vector/lang/ja/settings.php create mode 100644 lib/tpl/vector/lang/ja/style.css create mode 100644 lib/tpl/vector/lang/ko/.htaccess create mode 100644 lib/tpl/vector/lang/ko/index.html create mode 100644 lib/tpl/vector/lang/ko/lang.php create mode 100644 lib/tpl/vector/lang/ko/settings.php create mode 100644 lib/tpl/vector/lang/ko/style.css create mode 100644 lib/tpl/vector/lang/nl/.htaccess create mode 100644 lib/tpl/vector/lang/nl/index.html create mode 100644 lib/tpl/vector/lang/nl/lang.php create mode 100644 lib/tpl/vector/lang/nl/settings.php create mode 100644 lib/tpl/vector/lang/nl/style.css create mode 100644 lib/tpl/vector/lang/pt-br/.htaccess create mode 100644 lib/tpl/vector/lang/pt-br/index.html create mode 100644 lib/tpl/vector/lang/pt-br/lang.php create mode 100644 lib/tpl/vector/lang/pt-br/settings.php create mode 100644 lib/tpl/vector/lang/pt-br/style.css create mode 100644 lib/tpl/vector/lang/ru/.htaccess create mode 100644 lib/tpl/vector/lang/ru/index.html create mode 100644 lib/tpl/vector/lang/ru/lang.php create mode 100644 lib/tpl/vector/lang/ru/settings.php create mode 100644 lib/tpl/vector/lang/ru/style.css create mode 100644 lib/tpl/vector/lang/sk/.htaccess create mode 100644 lib/tpl/vector/lang/sk/index.html create mode 100644 lib/tpl/vector/lang/sk/lang.php create mode 100644 lib/tpl/vector/lang/sk/settings.php create mode 100644 lib/tpl/vector/lang/sk/style.css create mode 100644 lib/tpl/vector/lang/zh/.htaccess create mode 100644 lib/tpl/vector/lang/zh/index.html create mode 100644 lib/tpl/vector/lang/zh/lang.php create mode 100644 lib/tpl/vector/lang/zh/settings.php create mode 100644 lib/tpl/vector/lang/zh/style.css create mode 100644 lib/tpl/vector/main.php create mode 100644 lib/tpl/vector/manager.dat create mode 100644 lib/tpl/vector/mediamanager.php create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/00_starter-tmpl-notes.txt create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_admin.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_diff.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_edit.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_fileuploader.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_footnotes.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_forms.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_imgdetail.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_links.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_media_fullscreen.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_media_popup.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_modal.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_recent.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_search.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_tabs.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/_toc.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/apple-touch-icon.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/bullet.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/buttonshadow.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/closed-rtl.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/closed.gif create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/closed.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/email.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/external-link.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/favicon.ico create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/index.html create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/inputshadow.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/logo.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/logo.png-readme.txt create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/open.gif create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/open.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/print.css create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/resizecol.png create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/tocdot2.gif create mode 100644 lib/tpl/vector/static/3rd/dokuwiki/unc.png create mode 100644 lib/tpl/vector/static/3rd/index.html create mode 100644 lib/tpl/vector/static/3rd/vector/arrow-down-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/audio-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/border.png create mode 100644 lib/tpl/vector/static/3rd/vector/bullet-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/csshover.htc create mode 100644 lib/tpl/vector/static/3rd/vector/document-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/edit-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/external-link-ltr-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/external-link-rtl-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/file-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/index.html create mode 100644 lib/tpl/vector/static/3rd/vector/link-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/lock-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/magnify-clip.png create mode 100644 lib/tpl/vector/static/3rd/vector/mail-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/main-ltr.css create mode 100644 lib/tpl/vector/static/3rd/vector/main-rtl.css create mode 100644 lib/tpl/vector/static/3rd/vector/news-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/page-base.png create mode 100644 lib/tpl/vector/static/3rd/vector/page-fade.png create mode 100644 lib/tpl/vector/static/3rd/vector/portal-break-ltr.png create mode 100644 lib/tpl/vector/static/3rd/vector/portal-break-rtl.png create mode 100644 lib/tpl/vector/static/3rd/vector/portal-break.png create mode 100644 lib/tpl/vector/static/3rd/vector/preferences-base.png create mode 100644 lib/tpl/vector/static/3rd/vector/preferences-break.png create mode 100644 lib/tpl/vector/static/3rd/vector/preferences-edge.png create mode 100644 lib/tpl/vector/static/3rd/vector/preferences-fade.png create mode 100644 lib/tpl/vector/static/3rd/vector/search-fade.png create mode 100644 lib/tpl/vector/static/3rd/vector/search-ltr.png create mode 100644 lib/tpl/vector/static/3rd/vector/search-rtl.png create mode 100644 lib/tpl/vector/static/3rd/vector/tab-break.png create mode 100644 lib/tpl/vector/static/3rd/vector/tab-current-fade.png create mode 100644 lib/tpl/vector/static/3rd/vector/tab-normal-fade.png create mode 100644 lib/tpl/vector/static/3rd/vector/talk-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/user-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/video-icon.png create mode 100644 lib/tpl/vector/static/3rd/vector/watch-icon-loading.gif create mode 100644 lib/tpl/vector/static/3rd/vector/watch-icons.png create mode 100644 lib/tpl/vector/static/css/index.html create mode 100644 lib/tpl/vector/static/css/print.css create mode 100644 lib/tpl/vector/static/css/rtl.css create mode 100644 lib/tpl/vector/static/css/screen.css create mode 100644 lib/tpl/vector/static/css/screen_iehacks.css create mode 100644 lib/tpl/vector/static/img/button-css.png create mode 100644 lib/tpl/vector/static/img/button-donate.gif create mode 100644 lib/tpl/vector/static/img/button-dw.png create mode 100644 lib/tpl/vector/static/img/button-rss.png create mode 100644 lib/tpl/vector/static/img/button-vector.png create mode 100644 lib/tpl/vector/static/img/button-xhtml.png create mode 100644 lib/tpl/vector/static/img/index.html create mode 100644 lib/tpl/vector/static/index.html create mode 100644 lib/tpl/vector/static/js/index.html create mode 100644 lib/tpl/vector/style.ini create mode 100644 lib/tpl/vector/template.info.txt create mode 100644 lib/tpl/vector/user/.htaccess create mode 100644 lib/tpl/vector/user/boxes.php.dist create mode 100644 lib/tpl/vector/user/buttons.php.dist create mode 100644 lib/tpl/vector/user/index.html create mode 100644 lib/tpl/vector/user/print.css.dist create mode 100644 lib/tpl/vector/user/rtl.css.dist create mode 100644 lib/tpl/vector/user/screen.css.dist create mode 100644 lib/tpl/vector/user/tabs.php.dist create mode 100644 lib/tpl/vector/user/tracker.php.dist create mode 100644 lib/tpl/vector/user/user.js.dist diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..40d4ed1 --- /dev/null +++ b/.gitignore @@ -0,0 +1,23 @@ +# Another repository +/data + +# やばいの +/conf/users.auth.php +/conf/local.php + +# Ignore vendor directory +vendor/ + +# DokuWiki upgrade/install files +install.php +VERSION +CHANGES +README +COPYING +SECURITY.md + +# Temporary files +*.tmp +*.bak +*.swp +*~ diff --git a/.htaccess b/.htaccess new file mode 100644 index 0000000..0465dae --- /dev/null +++ b/.htaccess @@ -0,0 +1,45 @@ +## You should disable Indexes and MultiViews either here or in the +## global config. Symlinks maybe needed for URL rewriting. +#Options -Indexes -MultiViews +FollowSymLinks + +## make sure nobody gets the htaccess, README, COPYING or VERSION files + + + Require all denied + + + Order allow,deny + Deny from all + + + +## Don't allow access to git directories + + RedirectMatch 404 /\.git + + +## Uncomment these rules if you want to have nice URLs using +## $conf['userewrite'] = 1 - not needed for rewrite mode 2 +RewriteEngine on + +RewriteRule ^_media/(.*) lib/exe/fetch.php?media=$1 [QSA,L] +RewriteRule ^_detail/(.*) lib/exe/detail.php?media=$1 [QSA,L] +RewriteRule ^_export/([^/]+)/(.*) doku.php?do=export_$1&id=$2 [QSA,L] +RewriteRule ^$ doku.php [L] +RewriteCond %{REQUEST_FILENAME} !-f +RewriteCond %{REQUEST_FILENAME} !-d +RewriteRule (.*) doku.php?id=$1 [QSA,L] +RewriteRule ^index.php$ doku.php + +## Not all installations will require the following line. If you do, +## change "/dokuwiki" to the path to your dokuwiki directory relative +## to your document root. +#RewriteBase /dokuwiki +# +## If you enable DokuWikis XML-RPC interface, you should consider to +## restrict access to it over HTTPS only! Uncomment the following two +## rules if your server setup allows HTTPS. +#RewriteCond %{HTTPS} !=on +#RewriteRule ^lib/exe/xmlrpc.php$ https://%{SERVER_NAME}%{REQUEST_URI} [L,R=301] + +# vim: set tabstop=2 softtabstop=2 expandtab : diff --git a/bin/.htaccess b/bin/.htaccess new file mode 100644 index 0000000..7625314 --- /dev/null +++ b/bin/.htaccess @@ -0,0 +1,7 @@ + + Require all denied + + + Order allow,deny + Deny from all + diff --git a/bin/dwpage.php b/bin/dwpage.php new file mode 100755 index 0000000..a343cb0 --- /dev/null +++ b/bin/dwpage.php @@ -0,0 +1,359 @@ +#!/usr/bin/env php +registerOption( + 'force', + 'force obtaining a lock for the page (generally bad idea)', + 'f' + ); + $options->registerOption( + 'user', + 'work as this user. defaults to current CLI user', + 'u', + 'username' + ); + $options->setHelp( + 'Utility to help command line Dokuwiki page editing, allow ' . + 'pages to be checked out for editing then committed after changes' + ); + + /* checkout command */ + $options->registerCommand( + 'checkout', + 'Checks out a file from the repository, using the wiki id and obtaining ' . + 'a lock for the page. ' . "\n" . + 'If a working_file is specified, this is where the page is copied to. ' . + 'Otherwise defaults to the same as the wiki page in the current ' . + 'working directory.' + ); + $options->registerArgument( + 'wikipage', + 'The wiki page to checkout', + true, + 'checkout' + ); + $options->registerArgument( + 'workingfile', + 'How to name the local checkout', + false, + 'checkout' + ); + + /* commit command */ + $options->registerCommand( + 'commit', + 'Checks in the working_file into the repository using the specified ' . + 'wiki id, archiving the previous version.' + ); + $options->registerArgument( + 'workingfile', + 'The local file to commit', + true, + 'commit' + ); + $options->registerArgument( + 'wikipage', + 'The wiki page to create or update', + true, + 'commit' + ); + $options->registerOption( + 'message', + 'Summary describing the change (required)', + 'm', + 'summary', + 'commit' + ); + $options->registerOption( + 'trivial', + 'minor change', + 't', + false, + 'commit' + ); + + /* lock command */ + $options->registerCommand( + 'lock', + 'Obtains or updates a lock for a wiki page' + ); + $options->registerArgument( + 'wikipage', + 'The wiki page to lock', + true, + 'lock' + ); + + /* unlock command */ + $options->registerCommand( + 'unlock', + 'Removes a lock for a wiki page.' + ); + $options->registerArgument( + 'wikipage', + 'The wiki page to unlock', + true, + 'unlock' + ); + + /* gmeta command */ + $options->registerCommand( + 'getmeta', + 'Prints metadata value for a page to stdout.' + ); + $options->registerArgument( + 'wikipage', + 'The wiki page to get the metadata for', + true, + 'getmeta' + ); + $options->registerArgument( + 'key', + 'The name of the metadata item to be retrieved.' . "\n" . + 'If empty, an array of all the metadata items is returned.' . "\n" . + 'For retrieving items that are stored in sub-arrays, separate the ' . + 'keys of the different levels by spaces, in quotes, eg "date modified".', + false, + 'getmeta' + ); + } + + /** + * Your main program + * + * Arguments and options have been parsed when this is run + * + * @param Options $options + * @return void + */ + protected function main(Options $options) + { + $this->force = $options->getOpt('force', false); + $this->username = $options->getOpt('user', $this->getUser()); + + $command = $options->getCmd(); + $args = $options->getArgs(); + switch ($command) { + case 'checkout': + $wiki_id = array_shift($args); + $localfile = array_shift($args); + $this->commandCheckout($wiki_id, $localfile); + break; + case 'commit': + $localfile = array_shift($args); + $wiki_id = array_shift($args); + $this->commandCommit( + $localfile, + $wiki_id, + $options->getOpt('message', ''), + $options->getOpt('trivial', false) + ); + break; + case 'lock': + $wiki_id = array_shift($args); + $this->obtainLock($wiki_id); + $this->success("$wiki_id locked"); + break; + case 'unlock': + $wiki_id = array_shift($args); + $this->clearLock($wiki_id); + $this->success("$wiki_id unlocked"); + break; + case 'getmeta': + $wiki_id = array_shift($args); + $key = trim(array_shift($args)); + $meta = p_get_metadata($wiki_id, $key, METADATA_RENDER_UNLIMITED); + echo trim(json_encode($meta, JSON_PRETTY_PRINT)); + echo "\n"; + break; + default: + echo $options->help(); + } + } + + /** + * Check out a file + * + * @param string $wiki_id + * @param string $localfile + */ + protected function commandCheckout($wiki_id, $localfile) + { + global $conf; + + $wiki_id = cleanID($wiki_id); + $wiki_fn = wikiFN($wiki_id); + + if (!file_exists($wiki_fn)) { + $this->fatal("$wiki_id does not yet exist"); + } + + if (empty($localfile)) { + $localfile = getcwd() . '/' . PhpString::basename($wiki_fn); + } + + if (!file_exists(dirname($localfile))) { + $this->fatal("Directory " . dirname($localfile) . " does not exist"); + } + + if (stristr(realpath(dirname($localfile)), (string) realpath($conf['datadir'])) !== false) { + $this->fatal("Attempt to check out file into data directory - not allowed"); + } + + $this->obtainLock($wiki_id); + + if (!copy($wiki_fn, $localfile)) { + $this->clearLock($wiki_id); + $this->fatal("Unable to copy $wiki_fn to $localfile"); + } + + $this->success("$wiki_id > $localfile"); + } + + /** + * Save a file as a new page revision + * + * @param string $localfile + * @param string $wiki_id + * @param string $message + * @param bool $minor + */ + protected function commandCommit($localfile, $wiki_id, $message, $minor) + { + $wiki_id = cleanID($wiki_id); + $message = trim($message); + + if (!file_exists($localfile)) { + $this->fatal("$localfile does not exist"); + } + + if (!is_readable($localfile)) { + $this->fatal("Cannot read from $localfile"); + } + + if (!$message) { + $this->fatal("Summary message required"); + } + + $this->obtainLock($wiki_id); + + saveWikiText($wiki_id, file_get_contents($localfile), $message, $minor); + + $this->clearLock($wiki_id); + + $this->success("$localfile > $wiki_id"); + } + + /** + * Lock the given page or exit + * + * @param string $wiki_id + */ + protected function obtainLock($wiki_id) + { + if ($this->force) $this->deleteLock($wiki_id); + + $_SERVER['REMOTE_USER'] = $this->username; + + if (checklock($wiki_id)) { + $this->error("Page $wiki_id is already locked by another user"); + exit(1); + } + + lock($wiki_id); + + if (checklock($wiki_id)) { + $this->error("Unable to obtain lock for $wiki_id "); + var_dump(checklock($wiki_id)); + exit(1); + } + } + + /** + * Clear the lock on the given page + * + * @param string $wiki_id + */ + protected function clearLock($wiki_id) + { + if ($this->force) $this->deleteLock($wiki_id); + + $_SERVER['REMOTE_USER'] = $this->username; + if (checklock($wiki_id)) { + $this->error("Page $wiki_id is locked by another user"); + exit(1); + } + + unlock($wiki_id); + + if (file_exists(wikiLockFN($wiki_id))) { + $this->error("Unable to clear lock for $wiki_id"); + exit(1); + } + } + + /** + * Forcefully remove a lock on the page given + * + * @param string $wiki_id + */ + protected function deleteLock($wiki_id) + { + $wikiLockFN = wikiLockFN($wiki_id); + + if (file_exists($wikiLockFN)) { + if (!unlink($wikiLockFN)) { + $this->error("Unable to delete $wikiLockFN"); + exit(1); + } + } + } + + /** + * Get the current user's username from the environment + * + * @return string + */ + protected function getUser() + { + $user = getenv('USER'); + if (empty($user)) { + $user = getenv('USERNAME'); + } else { + return $user; + } + if (empty($user)) { + $user = 'admin'; + } + return $user; + } +} + +// Main +$cli = new PageCLI(); +$cli->run(); diff --git a/bin/gittool.php b/bin/gittool.php new file mode 100755 index 0000000..8503be2 --- /dev/null +++ b/bin/gittool.php @@ -0,0 +1,346 @@ +#!/usr/bin/env php + + */ +class GitToolCLI extends CLI +{ + /** + * Register options and arguments on the given $options object + * + * @param Options $options + * @return void + */ + protected function setup(Options $options) + { + $options->setHelp( + "Manage git repositories for DokuWiki and its plugins and templates.\n\n" . + "$> ./bin/gittool.php clone gallery template:ach\n" . + "$> ./bin/gittool.php repos\n" . + "$> ./bin/gittool.php origin -v" + ); + + $options->registerArgument( + 'command', + 'Command to execute. See below', + true + ); + + $options->registerCommand( + 'clone', + 'Tries to install a known plugin or template (prefix with template:) via git. Uses the DokuWiki.org ' . + 'plugin repository to find the proper git repository. Multiple extensions can be given as parameters' + ); + $options->registerArgument( + 'extension', + 'name of the extension to install, prefix with \'template:\' for templates', + true, + 'clone' + ); + + $options->registerCommand( + 'install', + 'The same as clone, but when no git source repository can be found, the extension is installed via ' . + 'download' + ); + $options->registerArgument( + 'extension', + 'name of the extension to install, prefix with \'template:\' for templates', + true, + 'install' + ); + + $options->registerCommand( + 'repos', + 'Lists all git repositories found in this DokuWiki installation' + ); + + $options->registerCommand( + '*', + 'Any unknown commands are assumed to be arguments to git and will be executed in all repositories ' . + 'found within this DokuWiki installation' + ); + } + + /** + * Your main program + * + * Arguments and options have been parsed when this is run + * + * @param Options $options + * @return void + */ + protected function main(Options $options) + { + $command = $options->getCmd(); + $args = $options->getArgs(); + if (!$command) $command = array_shift($args); + + switch ($command) { + case '': + echo $options->help(); + break; + case 'clone': + $this->cmdClone($args); + break; + case 'install': + $this->cmdInstall($args); + break; + case 'repo': + case 'repos': + $this->cmdRepos(); + break; + default: + $this->cmdGit($command, $args); + } + } + + /** + * Tries to install the given extensions using git clone + * + * @param array $extensions + */ + public function cmdClone($extensions) + { + $errors = []; + $succeeded = []; + + foreach ($extensions as $ext) { + $repo = $this->getSourceRepo($ext); + + if (!$repo) { + $this->error("could not find a repository for $ext"); + $errors[] = $ext; + } elseif ($this->cloneExtension($ext, $repo)) { + $succeeded[] = $ext; + } else { + $errors[] = $ext; + } + } + + echo "\n"; + if ($succeeded) $this->success('successfully cloned the following extensions: ' . implode(', ', $succeeded)); + if ($errors) $this->error('failed to clone the following extensions: ' . implode(', ', $errors)); + } + + /** + * Tries to install the given extensions using git clone with fallback to install + * + * @param array $extensions + */ + public function cmdInstall($extensions) + { + $errors = []; + $succeeded = []; + + foreach ($extensions as $ext) { + $repo = $this->getSourceRepo($ext); + + if (!$repo) { + $this->info("could not find a repository for $ext"); + if ($this->downloadExtension($ext)) { + $succeeded[] = $ext; + } else { + $errors[] = $ext; + } + } elseif ($this->cloneExtension($ext, $repo)) { + $succeeded[] = $ext; + } else { + $errors[] = $ext; + } + } + + echo "\n"; + if ($succeeded) $this->success('successfully installed the following extensions: ' . implode(', ', $succeeded)); + if ($errors) $this->error('failed to install the following extensions: ' . implode(', ', $errors)); + } + + /** + * Executes the given git command in every repository + * + * @param $cmd + * @param $arg + */ + public function cmdGit($cmd, $arg) + { + $repos = $this->findRepos(); + + $shell = array_merge(['git', $cmd], $arg); + $shell = array_map('escapeshellarg', $shell); + $shell = implode(' ', $shell); + + foreach ($repos as $repo) { + if (!@chdir($repo)) { + $this->error("Could not change into $repo"); + continue; + } + + $this->info("executing $shell in $repo"); + $ret = 0; + system($shell, $ret); + + if ($ret == 0) { + $this->success("git succeeded in $repo"); + } else { + $this->error("git failed in $repo"); + } + } + } + + /** + * Simply lists the repositories + */ + public function cmdRepos() + { + $repos = $this->findRepos(); + foreach ($repos as $repo) { + echo "$repo\n"; + } + } + + /** + * Install extension from the given download URL + * + * @param string $ext + * @return bool|null + */ + private function downloadExtension($ext) + { + /** @var helper_plugin_extension_extension $plugin */ + $plugin = plugin_load('helper', 'extension_extension'); + if (!$ext) die("extension plugin not available, can't continue"); + + $plugin->setExtension($ext); + + $url = $plugin->getDownloadURL(); + if (!$url) { + $this->error("no download URL for $ext"); + return false; + } + + $ok = false; + try { + $this->info("installing $ext via download from $url"); + $ok = $plugin->installFromURL($url); + } catch (Exception $e) { + $this->error($e->getMessage()); + } + + if ($ok) { + $this->success("installed $ext via download"); + return true; + } else { + $this->success("failed to install $ext via download"); + return false; + } + } + + /** + * Clones the extension from the given repository + * + * @param string $ext + * @param string $repo + * @return bool + */ + private function cloneExtension($ext, $repo) + { + if (str_starts_with($ext, 'template:')) { + $target = fullpath(tpl_incdir() . '../' . substr($ext, 9)); + } else { + $target = DOKU_PLUGIN . $ext; + } + + $this->info("cloning $ext from $repo to $target"); + $ret = 0; + system("git clone $repo $target", $ret); + if ($ret === 0) { + $this->success("cloning of $ext succeeded"); + return true; + } else { + $this->error("cloning of $ext failed"); + return false; + } + } + + /** + * Returns all git repositories in this DokuWiki install + * + * Looks in root, template and plugin directories only. + * + * @return array + */ + private function findRepos() + { + $this->info('Looking for .git directories'); + $data = array_merge( + glob(DOKU_INC . '.git', GLOB_ONLYDIR), + glob(DOKU_PLUGIN . '*/.git', GLOB_ONLYDIR), + glob(fullpath(tpl_incdir() . '../') . '/*/.git', GLOB_ONLYDIR) + ); + + if (!$data) { + $this->error('Found no .git directories'); + } else { + $this->success('Found ' . count($data) . ' .git directories'); + } + $data = array_map('fullpath', array_map('dirname', $data)); + return $data; + } + + /** + * Returns the repository for the given extension + * + * @param $extension + * @return false|string + */ + private function getSourceRepo($extension) + { + /** @var helper_plugin_extension_extension $ext */ + $ext = plugin_load('helper', 'extension_extension'); + if (!$ext) die("extension plugin not available, can't continue"); + + $ext->setExtension($extension); + + $repourl = $ext->getSourcerepoURL(); + if (!$repourl) return false; + + // match github repos + if (preg_match('/github\.com\/([^\/]+)\/([^\/]+)/i', $repourl, $m)) { + $user = $m[1]; + $repo = $m[2]; + return 'https://github.com/' . $user . '/' . $repo . '.git'; + } + + // match gitorious repos + if (preg_match('/gitorious.org\/([^\/]+)\/([^\/]+)?/i', $repourl, $m)) { + $user = $m[1]; + $repo = $m[2]; + if (!$repo) $repo = $user; + + return 'https://git.gitorious.org/' . $user . '/' . $repo . '.git'; + } + + // match bitbucket repos - most people seem to use mercurial there though + if (preg_match('/bitbucket\.org\/([^\/]+)\/([^\/]+)/i', $repourl, $m)) { + $user = $m[1]; + $repo = $m[2]; + return 'https://bitbucket.org/' . $user . '/' . $repo . '.git'; + } + + return false; + } +} + +// Main +$cli = new GitToolCLI(); +$cli->run(); diff --git a/bin/indexer.php b/bin/indexer.php new file mode 100755 index 0000000..cda740d --- /dev/null +++ b/bin/indexer.php @@ -0,0 +1,113 @@ +#!/usr/bin/env php +setHelp( + 'Updates the searchindex by indexing all new or changed pages. When the -c option is ' . + 'given the index is cleared first.' + ); + + $options->registerOption( + 'clear', + 'clear the index before updating', + 'c' + ); + $options->registerOption( + 'quiet', + 'don\'t produce any output', + 'q' + ); + } + + /** + * Your main program + * + * Arguments and options have been parsed when this is run + * + * @param Options $options + * @return void + */ + protected function main(Options $options) + { + $this->clear = $options->getOpt('clear'); + $this->quiet = $options->getOpt('quiet'); + + if ($this->clear) $this->clearindex(); + + $this->update(); + } + + /** + * Update the index + */ + protected function update() + { + global $conf; + $data = []; + $this->quietecho("Searching pages... "); + search($data, $conf['datadir'], 'search_allpages', ['skipacl' => true]); + $this->quietecho(count($data) . " pages found.\n"); + + foreach ($data as $val) { + $this->index($val['id']); + } + } + + /** + * Index the given page + * + * @param string $id + */ + protected function index($id) + { + $this->quietecho("$id... "); + idx_addPage($id, !$this->quiet, $this->clear); + $this->quietecho("done.\n"); + } + + /** + * Clear all index files + */ + protected function clearindex() + { + $this->quietecho("Clearing index... "); + idx_get_indexer()->clear(); + $this->quietecho("done.\n"); + } + + /** + * Print message if not supressed + * + * @param string $msg + */ + protected function quietecho($msg) + { + if (!$this->quiet) echo $msg; + } +} + +// Main +$cli = new IndexerCLI(); +$cli->run(); diff --git a/bin/plugin.php b/bin/plugin.php new file mode 100755 index 0000000..99c496b --- /dev/null +++ b/bin/plugin.php @@ -0,0 +1,110 @@ +#!/usr/bin/env php +setHelp('Excecutes Plugin command line tools'); + $options->registerArgument('plugin', 'The plugin CLI you want to run. Leave off to see list', false); + } + + /** + * Your main program + * + * Arguments and options have been parsed when this is run + * + * @param Options $options + * @return void + */ + protected function main(Options $options) + { + global $argv; + $argv = $options->getArgs(); + + if ($argv) { + $plugin = $this->loadPlugin($argv[0]); + if ($plugin instanceof CLIPlugin) { + $plugin->run(); + } else { + $this->fatal('Command {cmd} not found.', ['cmd' => $argv[0]]); + } + } else { + echo $options->help(); + $this->listPlugins(); + } + } + + /** + * List available plugins + */ + protected function listPlugins() + { + /** @var PluginController $plugin_controller */ + global $plugin_controller; + + echo "\n"; + echo "\n"; + echo $this->colors->wrap('AVAILABLE PLUGINS:', Colors::C_BROWN); + echo "\n"; + + $list = $plugin_controller->getList('cli'); + sort($list); + if ($list === []) { + echo $this->colors->wrap(" No plugins providing CLI components available\n", Colors::C_RED); + } else { + $tf = new TableFormatter($this->colors); + + foreach ($list as $name) { + $plugin = $this->loadPlugin($name); + if (!$plugin instanceof CLIPlugin) continue; + $info = $plugin->getInfo(); + + echo $tf->format( + [2, '30%', '*'], + ['', $name, $info['desc']], + ['', Colors::C_CYAN, ''] + ); + } + } + } + + /** + * Instantiate a CLI plugin + * + * @param string $name + * @return CLIPlugin|null + */ + protected function loadPlugin($name) + { + if (plugin_isdisabled($name)) return null; + + // execute the plugin CLI + $class = "cli_plugin_$name"; + if (class_exists($class)) { + return new $class(); + } + return null; + } +} + +// Main +$cli = new PluginCLI(); +$cli->run(); diff --git a/bin/render.php b/bin/render.php new file mode 100755 index 0000000..6f5b5bb --- /dev/null +++ b/bin/render.php @@ -0,0 +1,66 @@ +#!/usr/bin/env php + + */ +class RenderCLI extends CLI +{ + /** + * Register options and arguments on the given $options object + * + * @param Options $options + * @return void + */ + protected function setup(Options $options) + { + $options->setHelp( + 'A simple commandline tool to render some DokuWiki syntax with a given renderer.' . + "\n\n" . + 'This may not work for plugins that expect a certain environment to be ' . + 'set up before rendering, but should work for most or even all standard ' . + 'DokuWiki markup' + ); + $options->registerOption('renderer', 'The renderer mode to use. Defaults to xhtml', 'r', 'mode'); + } + + /** + * Your main program + * + * Arguments and options have been parsed when this is run + * + * @param Options $options + * @throws DokuCLI_Exception + * @return void + */ + protected function main(Options $options) + { + $renderer = $options->getOpt('renderer', 'xhtml'); + + // do the action + $source = stream_get_contents(STDIN); + $info = []; + $result = p_render($renderer, p_get_instructions($source), $info); + if (is_null($result)) throw new DokuCLI_Exception("No such renderer $renderer"); + echo $result; + } +} + +// Main +$cli = new RenderCLI(); +$cli->run(); diff --git a/bin/striplangs.php b/bin/striplangs.php new file mode 100755 index 0000000..b7895b5 --- /dev/null +++ b/bin/striplangs.php @@ -0,0 +1,116 @@ +#!/usr/bin/env php +setHelp( + 'Remove all languages from the installation, besides the ones specified. English language ' . + 'is never removed!' + ); + + $options->registerOption( + 'keep', + 'Comma separated list of languages to keep in addition to English.', + 'k', + 'langcodes' + ); + $options->registerOption( + 'english-only', + 'Remove all languages except English', + 'e' + ); + } + + /** + * Your main program + * + * Arguments and options have been parsed when this is run + * + * @param Options $options + * @return void + */ + protected function main(Options $options) + { + if ($options->getOpt('keep')) { + $keep = explode(',', $options->getOpt('keep')); + if (!in_array('en', $keep)) $keep[] = 'en'; + } elseif ($options->getOpt('english-only')) { + $keep = ['en']; + } else { + echo $options->help(); + exit(0); + } + + // Kill all language directories in /inc/lang and /lib/plugins besides those in $langs array + $this->stripDirLangs(realpath(__DIR__ . '/../inc/lang'), $keep); + $this->processExtensions(realpath(__DIR__ . '/../lib/plugins'), $keep); + $this->processExtensions(realpath(__DIR__ . '/../lib/tpl'), $keep); + } + + /** + * Strip languages from extensions + * + * @param string $path path to plugin or template dir + * @param array $keep_langs languages to keep + */ + protected function processExtensions($path, $keep_langs) + { + if (is_dir($path)) { + $entries = scandir($path); + + foreach ($entries as $entry) { + if ($entry != "." && $entry != "..") { + if (is_dir($path . '/' . $entry)) { + $plugin_langs = $path . '/' . $entry . '/lang'; + + if (is_dir($plugin_langs)) { + $this->stripDirLangs($plugin_langs, $keep_langs); + } + } + } + } + } + } + + /** + * Strip languages from path + * + * @param string $path path to lang dir + * @param array $keep_langs languages to keep + */ + protected function stripDirLangs($path, $keep_langs) + { + $dir = dir($path); + + while (($cur_dir = $dir->read()) !== false) { + if ($cur_dir != '.' && $cur_dir != '..' && is_dir($path . '/' . $cur_dir)) { + if (!in_array($cur_dir, $keep_langs, true)) { + io_rmdir($path . '/' . $cur_dir, true); + } + } + } + $dir->close(); + } +} + +$cli = new StripLangsCLI(); +$cli->run(); diff --git a/bin/wantedpages.php b/bin/wantedpages.php new file mode 100755 index 0000000..00ed28a --- /dev/null +++ b/bin/wantedpages.php @@ -0,0 +1,188 @@ +#!/usr/bin/env php +setHelp( + 'Outputs a list of wanted pages (pages that do not exist yet) and their origin pages ' . + ' (the pages that are linkin to these missing pages).' + ); + $options->registerArgument( + 'namespace', + 'The namespace to lookup. Defaults to root namespace', + false + ); + + $options->registerOption( + 'sort', + 'Sort by wanted or origin page', + 's', + '(wanted|origin)' + ); + + $options->registerOption( + 'skip', + 'Do not show the second dimension', + 'k' + ); + } + + /** + * Your main program + * + * Arguments and options have been parsed when this is run + * + * @param Options $options + * @return void + */ + protected function main(Options $options) + { + $args = $options->getArgs(); + if ($args) { + $startdir = dirname(wikiFN($args[0] . ':xxx')); + } else { + $startdir = dirname(wikiFN('xxx')); + } + + $this->skip = $options->getOpt('skip'); + $this->sort = $options->getOpt('sort'); + + $this->info("searching $startdir"); + + foreach ($this->getPages($startdir) as $page) { + $this->internalLinks($page); + } + Sort::ksort($this->result); + foreach ($this->result as $main => $subs) { + if ($this->skip) { + echo "$main\n"; + } else { + $subs = array_unique($subs); + Sort::sort($subs); + foreach ($subs as $sub) { + printf("%-40s %s\n", $main, $sub); + } + } + } + } + + /** + * Determine directions of the search loop + * + * @param string $entry + * @param string $basepath + * @return int + */ + protected function dirFilter($entry, $basepath) + { + if ($entry == '.' || $entry == '..') { + return WantedPagesCLI::DIR_CONTINUE; + } + if (is_dir($basepath . '/' . $entry)) { + if (strpos($entry, '_') === 0) { + return WantedPagesCLI::DIR_CONTINUE; + } + return WantedPagesCLI::DIR_NS; + } + if (preg_match('/\.txt$/', $entry)) { + return WantedPagesCLI::DIR_PAGE; + } + return WantedPagesCLI::DIR_CONTINUE; + } + + /** + * Collects recursively the pages in a namespace + * + * @param string $dir + * @return array + * @throws DokuCLI_Exception + */ + protected function getPages($dir) + { + static $trunclen = null; + if (!$trunclen) { + global $conf; + $trunclen = strlen($conf['datadir'] . ':'); + } + + if (!is_dir($dir)) { + throw new DokuCLI_Exception("Unable to read directory $dir"); + } + + $pages = []; + $dh = opendir($dir); + while (false !== ($entry = readdir($dh))) { + $status = $this->dirFilter($entry, $dir); + if ($status == WantedPagesCLI::DIR_CONTINUE) { + continue; + } elseif ($status == WantedPagesCLI::DIR_NS) { + $pages = array_merge($pages, $this->getPages($dir . '/' . $entry)); + } else { + $page = ['id' => pathID(substr($dir . '/' . $entry, $trunclen)), 'file' => $dir . '/' . $entry]; + $pages[] = $page; + } + } + closedir($dh); + return $pages; + } + + /** + * Parse instructions and add the non-existing links to the result array + * + * @param array $page array with page id and file path + */ + protected function internalLinks($page) + { + global $conf; + $instructions = p_get_instructions(file_get_contents($page['file'])); + $resolver = new PageResolver($page['id']); + $pid = $page['id']; + foreach ($instructions as $ins) { + if ($ins[0] == 'internallink' || ($conf['camelcase'] && $ins[0] == 'camelcaselink')) { + $mid = $resolver->resolveId($ins[1][0]); + if (!page_exists($mid)) { + [$mid] = explode('#', $mid); //record pages without hashes + + if ($this->sort == 'origin') { + $this->result[$pid][] = $mid; + } else { + $this->result[$mid][] = $pid; + } + } + } + } + } +} + +// Main +$cli = new WantedPagesCLI(); +$cli->run(); diff --git a/conf/.htaccess b/conf/.htaccess new file mode 100644 index 0000000..9f49132 --- /dev/null +++ b/conf/.htaccess @@ -0,0 +1,8 @@ +## no access to the conf directory + + Require all denied + + + Order allow,deny + Deny from all + diff --git a/conf/acl.auth.php b/conf/acl.auth.php new file mode 100644 index 0000000..482fd82 --- /dev/null +++ b/conf/acl.auth.php @@ -0,0 +1,9 @@ +# acl.auth.php +# +# Don't modify the lines above +# +# Access Control Lists +# +# Auto-generated by install script +# Date: Sun, 07 Jul 2024 09:48:21 +0000 +* @ALL 8 diff --git a/conf/acl.auth.php.dist b/conf/acl.auth.php.dist new file mode 100644 index 0000000..14344d7 --- /dev/null +++ b/conf/acl.auth.php.dist @@ -0,0 +1,21 @@ +# acl.auth.php +# +# Don't modify the lines above +# +# Access Control Lists +# +# Editing this file by hand shouldn't be necessary. Use the ACL +# Manager interface instead. +# +# If your auth backend allows special char like spaces in groups +# or user names you need to urlencode them (only chars <128, leave +# UTF-8 multibyte chars as is) +# +# none 0 +# read 1 +# edit 2 +# create 4 +# upload 8 +# delete 16 + +* @ALL 8 diff --git a/conf/acronyms.conf b/conf/acronyms.conf new file mode 100644 index 0000000..2ecdeda --- /dev/null +++ b/conf/acronyms.conf @@ -0,0 +1,62 @@ +# Acronyms. + +ACL Access Control List +AFAICS As far as I can see +AFAIK As far as I know +AFAIR As far as I remember +API Application Programming Interface +ASAP As soon as possible +ASCII American Standard Code for Information Interchange +BTW By the way +CMS Content Management System +CSS Cascading Style Sheets +DNS Domain Name System +EOF End of file +EOL End of line +EOM End of message +EOT End of text +FAQ Frequently Asked Questions +FTP File Transfer Protocol +FOSS Free & Open-Source Software +FLOSS Free/Libre and Open Source Software +FUD Fear, Uncertainty, and Doubt +FYI For your information +GB Gigabyte +GHz Gigahertz +GPL GNU General Public License +GUI Graphical User Interface +HTML HyperText Markup Language +IANAL I am not a lawyer (but) +IE Internet Explorer +IIRC If I remember correctly +IMHO In my humble opinion +IMO In my opinion +IOW In other words +IRC Internet Relay Chat +IRL In real life +KISS Keep it simple stupid +LAN Local Area Network +LGPL GNU Lesser General Public License +LOL Laughing out loud +MathML Mathematical Markup Language +MB Megabyte +MHz Megahertz +MSIE Microsoft Internet Explorer +OMG Oh my God +OS Operating System +OSS Open Source Software +OTOH On the other hand +PITA Pain in the Ass +RFC Request for Comments +ROTFL Rolling on the floor laughing +RTFM Read The Fine Manual +spec specification +TIA Thanks in advance +TL;DR Too long; didn't read +TOC Table of Contents +URI Uniform Resource Identifier +URL Uniform Resource Locator +W3C World Wide Web Consortium +WTF? What the f*** +WYSIWYG What You See Is What You Get +YMMV Your mileage may vary diff --git a/conf/dokuwiki.php b/conf/dokuwiki.php new file mode 100644 index 0000000..9cb0357 --- /dev/null +++ b/conf/dokuwiki.php @@ -0,0 +1,181 @@ + tags + // 'htmldiff' - diff as HTML table + // 'html' - the full page rendered in XHTML +$conf['rss_media'] = 'both'; //what should be listed? + // 'both' - page and media changes + // 'pages' - page changes only + // 'media' - media changes only +$conf['rss_update'] = 5*60; //Update the RSS feed every n seconds (defaults to 5 minutes) +$conf['rss_show_summary'] = 1; //Add revision summary to title? 0|1 +$conf['rss_show_deleted'] = 1; //Show deleted items 0|1 + +/* Advanced Settings */ +$conf['updatecheck'] = 1; //automatically check for new releases? +$conf['userewrite'] = 0; //this makes nice URLs: 0: off 1: .htaccess 2: internal +$conf['useslash'] = 0; //use slash instead of colon? only when rewrite is on +$conf['sepchar'] = '_'; //word separator character in page names; may be a + // letter, a digit, '_', '-', or '.'. +$conf['canonical'] = 0; //Should all URLs use full canonical http://... style? +$conf['fnencode'] = 'url'; //encode filenames (url|safe|utf-8) +$conf['autoplural'] = 0; //try (non)plural form of nonexistent files? +$conf['compression'] = 'gz'; //compress old revisions: (0: off) ('gz': gnuzip) ('bz2': bzip) + // bz2 generates smaller files, but needs more cpu-power +$conf['gzip_output'] = 0; //use gzip content encoding for the output xhtml (if allowed by browser) +$conf['compress'] = 1; //Strip whitespaces and comments from Styles and JavaScript? 1|0 +$conf['cssdatauri'] = 512; //Maximum byte size of small images to embed into CSS, won't work on IE<8 +$conf['send404'] = 0; //Send an HTTP 404 status for nonexistent pages? +$conf['broken_iua'] = 0; //Platform with broken ignore_user_abort (IIS+CGI) 0|1 +$conf['xsendfile'] = 0; //Use X-Sendfile (1 = lighttpd, 2 = standard) +$conf['renderer_xhtml'] = 'xhtml'; //renderer to use for main page generation +$conf['readdircache'] = 0; //time cache in second for the readdir operation, 0 to deactivate. +$conf['search_nslimit'] = 0; //limit the search to the current X namespaces +$conf['search_fragment'] = 'exact'; //specify the default fragment search behavior +$conf['trustedproxy'] = '^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)'; + //Regexp of trusted proxy address when reading IP using HTTP header + // if blank, do not trust any proxy (including local IP) + +/* Feature Flags */ +$conf['defer_js'] = 1; // Defer javascript to be executed after the page's HTML has been parsed. Setting will be removed in the next release. +$conf['hidewarnings'] = 0; // Hide warnings + +/* Network Settings */ +$conf['dnslookups'] = 1; //disable to disallow IP to hostname lookups +$conf['jquerycdn'] = 0; //use a CDN for delivering jQuery? +// Proxy setup - if your Server needs a proxy to access the web set these +$conf['proxy']['host'] = ''; +$conf['proxy']['port'] = ''; +$conf['proxy']['user'] = ''; +$conf['proxy']['pass'] = ''; +$conf['proxy']['ssl'] = 0; +$conf['proxy']['except'] = ''; diff --git a/conf/entities.conf b/conf/entities.conf new file mode 100644 index 0000000..c0d653c --- /dev/null +++ b/conf/entities.conf @@ -0,0 +1,22 @@ +# Typography replacements +# +# Order does matter! +# +# You can use HTML entities here, but it is not recommended because it may break +# non-HTML renderers. Use UTF-8 chars directly instead. + +<-> ↔ +-> → +<- ← +<=> ⇔ +=> ⇒ +<= ⇐ +>> » +<< « +--- — +-- – +(c) © +(tm) ™ +(r) ® +... … + diff --git a/conf/interwiki.conf b/conf/interwiki.conf new file mode 100644 index 0000000..a509056 --- /dev/null +++ b/conf/interwiki.conf @@ -0,0 +1,43 @@ +# Each URL may contain one of these placeholders +# {URL} is replaced by the URL encoded representation of the wikiname +# this is the right thing to do in most cases +# {NAME} this is replaced by the wikiname as given in the document +# only mandatory encoded is done, urlencoding if the link +# is an external URL, or encoding as a wikiname if it is an +# internal link (begins with a colon) +# {SCHEME} +# {HOST} +# {PORT} +# {PATH} +# {QUERY} these placeholders will be replaced with the appropriate part +# of the link when parsed as a URL +# If no placeholder is defined the urlencoded name is appended to the URL + +# To prevent losing your added InterWiki shortcuts after an upgrade, +# you should add new ones to interwiki.local.conf + +wp https://en.wikipedia.org/wiki/{NAME} +wpfr https://fr.wikipedia.org/wiki/{NAME} +wpde https://de.wikipedia.org/wiki/{NAME} +wpes https://es.wikipedia.org/wiki/{NAME} +wppl https://pl.wikipedia.org/wiki/{NAME} +wpjp https://ja.wikipedia.org/wiki/{NAME} +wpru https://ru.wikipedia.org/wiki/{NAME} +wpmeta https://meta.wikipedia.org/wiki/{NAME} +doku https://www.dokuwiki.org/ +rfc https://tools.ietf.org/html/rfc +man http://man.cx/ +amazon https://www.amazon.com/dp/{URL}?tag=splitbrain-20 +amazon.de https://www.amazon.de/dp/{URL}?tag=splitbrain-21 +amazon.uk https://www.amazon.co.uk/dp/{URL} +paypal https://www.paypal.com/cgi-bin/webscr?cmd=_xclick&business= +phpfn https://secure.php.net/{NAME} +skype skype:{NAME} +google https://www.google.com/search?q= +google.de https://www.google.de/search?q= +go https://www.google.com/search?q={URL}&btnI=lucky +user :user:{NAME} + +# To support VoIP/SIP/TEL links +callto callto://{NAME} +tel tel:{NAME} diff --git a/conf/license.php b/conf/license.php new file mode 100644 index 0000000..845c59f --- /dev/null +++ b/conf/license.php @@ -0,0 +1,38 @@ + 'CC0 1.0 Universal', + 'url' => 'https://creativecommons.org/publicdomain/zero/1.0/deed.'.$LC, +); +$license['publicdomain'] = array( + 'name' => 'Public Domain', + 'url' => 'https://creativecommons.org/licenses/publicdomain/deed.'.$LC, +); +$license['cc-by'] = array( + 'name' => 'CC Attribution 4.0 International', + 'url' => 'https://creativecommons.org/licenses/by/4.0/deed.'.$LC, +); +$license['cc-by-sa'] = array( + 'name' => 'CC Attribution-Share Alike 4.0 International', + 'url' => 'https://creativecommons.org/licenses/by-sa/4.0/deed.'.$LC, +); +$license['gnufdl'] = array( + 'name' => 'GNU Free Documentation License 1.3', + 'url' => 'https://www.gnu.org/licenses/fdl-1.3.html', +); +$license['cc-by-nc'] = array( + 'name' => 'CC Attribution-Noncommercial 4.0 International', + 'url' => 'https://creativecommons.org/licenses/by-nc/4.0/deed.'.$LC, +); +$license['cc-by-nc-sa'] = array( + 'name' => 'CC Attribution-Noncommercial-Share Alike 4.0 International', + 'url' => 'https://creativecommons.org/licenses/by-nc-sa/4.0/deed.'.$LC, +); + diff --git a/conf/local.php.bak.php b/conf/local.php.bak.php new file mode 100644 index 0000000..9634ec0 --- /dev/null +++ b/conf/local.php.bak.php @@ -0,0 +1,21 @@ + array('Iptc.Headline', + 'img_title', + 'text'), + + 20 => array('', + 'img_date', + 'date', + array('Date.EarliestTime')), + + 30 => array('', + 'img_fname', + 'text', + array('File.Name')), + + 40 => array('Iptc.Caption', + 'img_caption', + 'textarea', + array('Exif.UserComment', + 'Exif.TIFFImageDescription', + 'Exif.TIFFUserComment')), + + 50 => array('Iptc.Byline', + 'img_artist', + 'text', + array('Exif.TIFFArtist', + 'Exif.Artist', + 'Iptc.Credit')), + + 60 => array('Iptc.CopyrightNotice', + 'img_copyr', + 'text', + array('Exif.TIFFCopyright', + 'Exif.Copyright')), + + 70 => array('', + 'img_format', + 'text', + array('File.Format')), + + 80 => array('', + 'img_fsize', + 'text', + array('File.NiceSize')), + + 90 => array('', + 'img_width', + 'text', + array('File.Width')), + + 100 => array('', + 'img_height', + 'text', + array('File.Height')), + + 110 => array('', + 'img_camera', + 'text', + array('Simple.Camera')), + + 120 => array('Iptc.Keywords', + 'img_keywords', + 'text', + array('Exif.Category')), +); diff --git a/conf/mime.conf b/conf/mime.conf new file mode 100644 index 0000000..b271322 --- /dev/null +++ b/conf/mime.conf @@ -0,0 +1,75 @@ +# Allowed uploadable file extensions and mimetypes are defined here. +# To extend this file it is recommended to create a mime.local.conf +# file. Mimetypes that should be downloadable and not be opened in the +# should be prefixed with a ! + +jpg image/jpeg +jpeg image/jpeg +gif image/gif +png image/png +webp image/webp +ico image/vnd.microsoft.icon + +mp3 audio/mpeg +ogg audio/ogg +wav audio/wav +webm video/webm +ogv video/ogg +mp4 video/mp4 +vtt text/vtt + +tgz !application/octet-stream +tar !application/x-gtar +gz !application/octet-stream +bz2 !application/octet-stream +zip !application/zip +rar !application/rar +7z !application/x-7z-compressed + +pdf application/pdf +ps !application/postscript + +rpm !application/octet-stream +deb !application/octet-stream + +doc !application/msword +xls !application/msexcel +ppt !application/mspowerpoint +rtf !application/msword + +docx !application/vnd.openxmlformats-officedocument.wordprocessingml.document +xlsx !application/vnd.openxmlformats-officedocument.spreadsheetml.sheet +pptx !application/vnd.openxmlformats-officedocument.presentationml.presentation + +sxw !application/soffice +sxc !application/soffice +sxi !application/soffice +sxd !application/soffice + +odc !application/vnd.oasis.opendocument.chart +odf !application/vnd.oasis.opendocument.formula +odg !application/vnd.oasis.opendocument.graphics +odi !application/vnd.oasis.opendocument.image +odp !application/vnd.oasis.opendocument.presentation +ods !application/vnd.oasis.opendocument.spreadsheet +odt !application/vnd.oasis.opendocument.text + +svg image/svg+xml + +# You should enable HTML and Text uploads only for restricted Wikis. +# Spammers are known to upload spam pages through unprotected Wikis. +# Note: Enabling HTML opens Cross Site Scripting vulnerabilities +# through JavaScript. Only enable this with trusted users. You +# need to disable the iexssprotect option additionally to +# adding the mime type here +#html text/html +#htm text/html +#txt text/plain +#conf text/plain +#xml text/xml +#csv text/csv + +# Also flash may be able to execute arbitrary scripts in the website's +# context +#swf application/x-shockwave-flash + diff --git a/conf/mysql.conf.php.example b/conf/mysql.conf.php.example new file mode 100644 index 0000000..eef99fc --- /dev/null +++ b/conf/mysql.conf.php.example @@ -0,0 +1,253 @@ + +# Don't modify the lines above +# +# Userfile +# +# Format: +# +# login:passwordhash:Real Name:email:groups,comma,separated + diff --git a/conf/wordblock.conf b/conf/wordblock.conf new file mode 100644 index 0000000..3040fa0 --- /dev/null +++ b/conf/wordblock.conf @@ -0,0 +1,29 @@ +# This blacklist is maintained by the DokuWiki community +# patches welcome +# +https?:\/\/(\S*?)(-side-effects|top|pharm|pill|discount|discount-|deal|price|order|now|best|cheap|cheap-|online|buy|buy-|sale|sell)(\S*?)(cialis|viagra|prazolam|xanax|zanax|soma|vicodin|zenical|xenical|meridia|paxil|prozac|claritin|allegra|lexapro|wellbutrin|zoloft|retin|valium|levitra|phentermine) +https?:\/\/(\S*?)(bi\s*sex|gay\s*sex|fetish|incest|penis|\brape\b) +zoosex +gang\s*bang +facials +ladyboy +\btits\b +bolea\.com +52crystal +baida\.org +web-directory\.awardspace\.us +korsan-team\.com +BUDA TAMAMDIR +wow-powerleveling-wow\.com +wow gold +wow-gold\.dinmo\.cn +downgrade-vista\.com +downgradetowindowsxp\.com +elegantugg\.com +classicedhardy\.com +research-service\.com +https?:\/\/(\S*?)(2-pay-secure|911essay|academia-research|anypapers|applicationessay|bestbuyessay|bestdissertation|bestessay|bestresume|besttermpaper|businessessay|college-paper|customessay|custom-made-paper|custom-writing|degree-?result|dissertationblog|dissertation-service|dissertations?expert|essaybank|essay-?blog|essaycapital|essaylogic|essaymill|essayontime|essaypaper|essays?land|essaytownsucks|essay-?writ|fastessays|freelancercareers|genuinecontent|genuineessay|genuinepaper|goessay|grandresume|killer-content|ma-dissertation|managementessay|masterpaper|mightystudent|needessay|researchedge|researchpaper-blog|resumecvservice|resumesexperts|resumesplanet|rushessay|samedayessay|superiorcontent|superiorpaper|superiorthesis|term-paper|termpaper-blog|term-paper-research|thesisblog|universalresearch|valwriting|vdwriters|wisetranslation|writersassembly|writers\.com\.ph|writers\.ph) +flatsinmumbai\.co\.in +https?:\/\/(\S*?)penny-?stock +mattressreview\.biz +(just|simply) (my|a) profile (site|webpage|page) diff --git a/doku.php b/doku.php new file mode 100644 index 0000000..4d17a3c --- /dev/null +++ b/doku.php @@ -0,0 +1,136 @@ + + * + * @global Input $INPUT + */ + +use dokuwiki\ChangeLog\PageChangeLog; +use dokuwiki\Extension\Event; + +// update message version - always use a string to avoid localized floats! +$updateVersion = "55.1"; + +// xdebug_start_profiling(); + +if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/'); + +// define all DokuWiki globals here (needed within test requests but also helps to keep track) +global $ACT, $INPUT, $QUERY, $ID, $REV, $DATE_AT, $IDX, + $DATE, $RANGE, $HIGH, $TEXT, $PRE, $SUF, $SUM, $INFO, $JSINFO; + + +if (isset($_SERVER['HTTP_X_DOKUWIKI_DO'])) { + $ACT = trim(strtolower($_SERVER['HTTP_X_DOKUWIKI_DO'])); +} elseif (!empty($_REQUEST['idx'])) { + $ACT = 'index'; +} elseif (isset($_REQUEST['do'])) { + $ACT = $_REQUEST['do']; +} else { + $ACT = 'show'; +} + +// load and initialize the core system +require_once(DOKU_INC . 'inc/init.php'); + +//import variables +$INPUT->set('id', str_replace("\xC2\xAD", '', $INPUT->str('id'))); //soft-hyphen +$QUERY = trim($INPUT->str('q')); +$ID = getID(); + +$REV = $INPUT->int('rev'); +$DATE_AT = $INPUT->str('at'); +$IDX = $INPUT->str('idx'); +$DATE = $INPUT->int('date'); +$RANGE = $INPUT->str('range'); +$HIGH = $INPUT->param('s'); +if (empty($HIGH)) $HIGH = getGoogleQuery(); + +if ($INPUT->post->has('wikitext')) { + $TEXT = cleanText($INPUT->post->str('wikitext')); +} +$PRE = cleanText(substr($INPUT->post->str('prefix'), 0, -1)); +$SUF = cleanText($INPUT->post->str('suffix')); +$SUM = $INPUT->post->str('summary'); + + +//parse DATE_AT +if ($DATE_AT) { + $date_parse = strtotime($DATE_AT); + if ($date_parse) { + $DATE_AT = $date_parse; + } else { // check for UNIX Timestamp + $date_parse = @date('Ymd', $DATE_AT); + if (!$date_parse || $date_parse === '19700101') { + msg(sprintf($lang['unable_to_parse_date'], hsc($DATE_AT))); + $DATE_AT = null; + } + } +} + +//check for existing $REV related to $DATE_AT +if ($DATE_AT) { + $pagelog = new PageChangeLog($ID); + $rev_t = $pagelog->getLastRevisionAt($DATE_AT); + if ($rev_t === '') { + //current revision + $REV = null; + $DATE_AT = null; + } elseif ($rev_t === false) { + //page did not exist + $rev_n = $pagelog->getRelativeRevision($DATE_AT, +1); + msg( + sprintf( + $lang['page_nonexist_rev'], + dformat($DATE_AT), + wl($ID, ['rev' => $rev_n]), + dformat($rev_n) + ) + ); + $REV = $DATE_AT; //will result in a page not exists message + } else { + $REV = $rev_t; + } +} + +//make infos about the selected page available +$INFO = pageinfo(); + +// handle debugging +if ($conf['allowdebug'] && $ACT == 'debug') { + html_debug(); + exit; +} + +//send 404 for missing pages if configured or ID has special meaning to bots +if ( + !$INFO['exists'] && + ($conf['send404'] || preg_match('/^(robots\.txt|sitemap\.xml(\.gz)?|favicon\.ico|crossdomain\.xml)$/', $ID)) && + ($ACT == 'show' || (!is_array($ACT) && str_starts_with($ACT, 'export_'))) +) { + header('HTTP/1.0 404 Not Found'); +} + +//prepare breadcrumbs (initialize a static var) +if ($conf['breadcrumbs']) breadcrumbs(); + +// check upstream +checkUpdateMessages(); + +$tmp = []; // No event data +Event::createAndTrigger('DOKUWIKI_STARTED', $tmp); + +//close session +session_write_close(); + +//do the work (picks up what to do from global env) +act_dispatch(); + +$tmp = []; // No event data +Event::createAndTrigger('DOKUWIKI_DONE', $tmp); + +// xdebug_dump_function_profile(1); diff --git a/feed.php b/feed.php new file mode 100644 index 0000000..e6fefbc --- /dev/null +++ b/feed.php @@ -0,0 +1,75 @@ + + * + * @global array $conf + * @global Input $INPUT + */ + +use dokuwiki\Feed\FeedCreator; +use dokuwiki\Feed\FeedCreatorOptions; +use dokuwiki\Cache\Cache; +use dokuwiki\ChangeLog\MediaChangeLog; +use dokuwiki\ChangeLog\PageChangeLog; +use dokuwiki\Extension\AuthPlugin; +use dokuwiki\Extension\Event; + +if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/'); +require_once(DOKU_INC . 'inc/init.php'); + +//close session +session_write_close(); + +//feed disabled? +if (!actionOK('rss')) { + http_status(404); + echo 'RSS feed is disabled.'; + exit; +} + +$options = new FeedCreatorOptions(); + +// the feed is dynamic - we need a cache for each combo +// (but most people just use the default feed so it's still effective) +$key = implode('$', [ + $options->getCacheKey(), + $INPUT->server->str('REMOTE_USER'), + $INPUT->server->str('HTTP_HOST'), + $INPUT->server->str('SERVER_PORT') +]); +$cache = new Cache($key, '.feed'); + +// prepare cache depends +$depends['files'] = getConfigFiles('main'); +$depends['age'] = $conf['rss_update']; +$depends['purge'] = $INPUT->bool('purge'); + +// check cacheage and deliver if nothing has changed since last +// time or the update interval has not passed, also handles conditional requests +header('Cache-Control: must-revalidate, post-check=0, pre-check=0'); +header('Pragma: public'); +header('Content-Type: ' . $options->getMimeType()); +header('X-Robots-Tag: noindex'); +if ($cache->useCache($depends)) { + http_conditionalRequest($cache->getTime()); + if ($conf['allowdebug']) header("X-CacheUsed: $cache->cache"); + echo $cache->retrieveCache(); + exit; +} else { + http_conditionalRequest(time()); +} + +// create new feed +try { + $feed = (new FeedCreator($options))->build(); + $cache->storeCache($feed); + echo $feed; +} catch (Exception $e) { + http_status(500); + echo '' . hsc($e->getMessage()) . ''; + exit; +} diff --git a/inc/.htaccess b/inc/.htaccess new file mode 100644 index 0000000..6ba7d91 --- /dev/null +++ b/inc/.htaccess @@ -0,0 +1,8 @@ +## no access to the inc directory + + Require all denied + + + Order allow,deny + Deny from all + diff --git a/inc/Action/AbstractAclAction.php b/inc/Action/AbstractAclAction.php new file mode 100644 index 0000000..27b514d --- /dev/null +++ b/inc/Action/AbstractAclAction.php @@ -0,0 +1,26 @@ +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 + * @throws FatalException + */ + 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/inc/Action/AbstractAliasAction.php b/inc/Action/AbstractAliasAction.php new file mode 100644 index 0000000..605e1c1 --- /dev/null +++ b/inc/Action/AbstractAliasAction.php @@ -0,0 +1,32 @@ +server->str('REMOTE_USER') === '') { + throw new ActionUserRequiredException(); + } + } +} diff --git a/inc/Action/Admin.php b/inc/Action/Admin.php new file mode 100644 index 0000000..d292dee --- /dev/null +++ b/inc/Action/Admin.php @@ -0,0 +1,45 @@ +str('page', '', true) != '') { + /** @var AdminPlugin $plugin */ + if ($plugin = plugin_getRequestAdminPlugin()) { // FIXME this method does also permission checking + if (!$plugin->isAccessibleByCurrentUser()) { + throw new ActionException('denied'); + } + $plugin->handle(); + } + } + } + + /** @inheritDoc */ + public function tplContent() + { + tpl_admin(); + } +} diff --git a/inc/Action/Authtoken.php b/inc/Action/Authtoken.php new file mode 100644 index 0000000..92b171b --- /dev/null +++ b/inc/Action/Authtoken.php @@ -0,0 +1,34 @@ +server->str('REMOTE_USER')); + $token->save(); + throw new ActionAbort('profile'); + } +} diff --git a/inc/Action/Backlink.php b/inc/Action/Backlink.php new file mode 100644 index 0000000..6e1735f --- /dev/null +++ b/inc/Action/Backlink.php @@ -0,0 +1,28 @@ +show(); + } +} diff --git a/inc/Action/Cancel.php b/inc/Action/Cancel.php new file mode 100644 index 0000000..31b481e --- /dev/null +++ b/inc/Action/Cancel.php @@ -0,0 +1,28 @@ + redirect -> show + throw new ActionAbort('draftdel'); + } +} diff --git a/inc/Action/Check.php b/inc/Action/Check.php new file mode 100644 index 0000000..88d3a3e --- /dev/null +++ b/inc/Action/Check.php @@ -0,0 +1,27 @@ +show(); + } +} diff --git a/inc/Action/Denied.php b/inc/Action/Denied.php new file mode 100644 index 0000000..14cbd89 --- /dev/null +++ b/inc/Action/Denied.php @@ -0,0 +1,52 @@ +showBanner(); + + $data = null; + $event = new Event('ACTION_DENIED_TPLCONTENT', $data); + if ($event->advise_before()) { + global $INPUT; + if (empty($INPUT->server->str('REMOTE_USER')) && actionOK('login')) { + (new Login())->show(); + } + } + $event->advise_after(); + } + + /** + * Display error on denied pages + * + * @author Andreas Gohr + * + * @return void + */ + public function showBanner() + { + // print intro + echo p_locale_xhtml('denied'); + } +} diff --git a/inc/Action/Diff.php b/inc/Action/Diff.php new file mode 100644 index 0000000..c12de9c --- /dev/null +++ b/inc/Action/Diff.php @@ -0,0 +1,41 @@ +str('difftype'); + if (!empty($difftype)) { + set_doku_pref('difftype', $difftype); + } + } + + /** @inheritdoc */ + public function tplContent() + { + global $INFO; + (new PageDiff($INFO['id']))->preference('showIntro', true)->show(); + } +} diff --git a/inc/Action/Draft.php b/inc/Action/Draft.php new file mode 100644 index 0000000..e327eb5 --- /dev/null +++ b/inc/Action/Draft.php @@ -0,0 +1,43 @@ +show(); + } +} diff --git a/inc/Action/Draftdel.php b/inc/Action/Draftdel.php new file mode 100644 index 0000000..770a8c7 --- /dev/null +++ b/inc/Action/Draftdel.php @@ -0,0 +1,40 @@ +isDraftAvailable() && checkSecurityToken()) { + $draft->deleteDraft(); + } + + throw new ActionAbort('redirect'); + } +} diff --git a/inc/Action/Edit.php b/inc/Action/Edit.php new file mode 100644 index 0000000..e8ac347 --- /dev/null +++ b/inc/Action/Edit.php @@ -0,0 +1,96 @@ +show(); + } +} diff --git a/inc/Action/Exception/ActionAbort.php b/inc/Action/Exception/ActionAbort.php new file mode 100644 index 0000000..4f9006b --- /dev/null +++ b/inc/Action/Exception/ActionAbort.php @@ -0,0 +1,20 @@ +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/inc/Action/Exception/ActionUserRequiredException.php b/inc/Action/Exception/ActionUserRequiredException.php new file mode 100644 index 0000000..33ff328 --- /dev/null +++ b/inc/Action/Exception/ActionUserRequiredException.php @@ -0,0 +1,17 @@ + + * @author Michael Klier + * @inheritdoc + */ + public function preProcess() + { + global $ID; + global $REV; + global $conf; + global $lang; + + $pre = ''; + $post = ''; + $headers = []; + + // 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 .= '' . DOKU_LF; + $pre .= '' . DOKU_LF; + $pre .= '' . DOKU_LF; + $pre .= ' ' . DOKU_LF; // FIXME improve wrapper + $pre .= ' ' . $ID . '' . DOKU_LF; + + // get metaheaders + ob_start(); + tpl_metaheaders(); + $pre .= ob_get_clean(); + + $pre .= '' . DOKU_LF; + $pre .= '' . DOKU_LF; + $pre .= '
' . DOKU_LF; + + // get toc + $pre .= tpl_toc(true); + + $headers['Content-Type'] = 'text/html; charset=utf-8'; + $output = p_wiki_xhtml($ID, $REV, false); + + $post .= '
' . DOKU_LF; + $post .= '' . DOKU_LF; + $post .= '' . 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 = []; + $data['id'] = $ID; + $data['mode'] = $mode; + $data['headers'] = $headers; + $data['output'] =& $output; + + Event::createAndTrigger('ACTION_EXPORT_POSTPROCESS', $data); + + if (!empty($data['output'])) { + if (is_array($data['headers'])) foreach ($data['headers'] as $key => $val) { + header("$key: $val"); + } + echo $pre . $data['output'] . $post; + exit; + } + + throw new ActionAbort(); + } +} diff --git a/inc/Action/Index.php b/inc/Action/Index.php new file mode 100644 index 0000000..5a2120d --- /dev/null +++ b/inc/Action/Index.php @@ -0,0 +1,28 @@ +show(); + } +} diff --git a/inc/Action/Locked.php b/inc/Action/Locked.php new file mode 100644 index 0000000..6849777 --- /dev/null +++ b/inc/Action/Locked.php @@ -0,0 +1,57 @@ +showBanner(); + (new Editor())->show(); + } + + /** + * Display error on locked pages + * + * @return void + * @author Andreas Gohr + * + */ + public function showBanner() + { + 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 intro + echo p_locale_xhtml('locked'); + + echo '
    '; + echo '
  • ' . $lang['lockedby'] . ' ' . + editorinfo($INFO['locked']) . '
  • '; + echo '
  • ' . $lang['lockexpire'] . ' ' . + $expire . ' (' . $min . ' min)
  • '; + echo '
' . DOKU_LF; + } +} diff --git a/inc/Action/Login.php b/inc/Action/Login.php new file mode 100644 index 0000000..6d3d124 --- /dev/null +++ b/inc/Action/Login.php @@ -0,0 +1,39 @@ +server->has('REMOTE_USER')) { + // nothing to do + throw new ActionException(); + } + } + + /** @inheritdoc */ + public function tplContent() + { + (new Ui\Login())->show(); + } +} diff --git a/inc/Action/Logout.php b/inc/Action/Logout.php new file mode 100644 index 0000000..a4cbfcc --- /dev/null +++ b/inc/Action/Logout.php @@ -0,0 +1,55 @@ +canDo('logout')) throw new ActionDisabledException(); + } + + /** @inheritdoc */ + public function preProcess() + { + global $ID; + global $INPUT; + + if (!checkSecurityToken()) throw new ActionException(); + + // 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, ['do' => 'login'], true, '&')); + + // should never be reached + throw new ActionException('login'); + } +} diff --git a/inc/Action/Media.php b/inc/Action/Media.php new file mode 100644 index 0000000..0571af8 --- /dev/null +++ b/inc/Action/Media.php @@ -0,0 +1,25 @@ +actionname); + if ($evt->advise_before()) { + msg('Failed to handle action: ' . hsc($this->actionname), -1); + } + $evt->advise_after(); + } +} diff --git a/inc/Action/Preview.php b/inc/Action/Preview.php new file mode 100644 index 0000000..7ab6941 --- /dev/null +++ b/inc/Action/Preview.php @@ -0,0 +1,49 @@ +savedraft(); + parent::preProcess(); + } + + /** @inheritdoc */ + public function tplContent() + { + global $TEXT; + (new Editor())->show(); + (new PageView($TEXT))->show(); + } + + /** + * Saves a draft on preview + */ + protected function savedraft() + { + global $ID, $INFO; + $draft = new Draft($ID, $INFO['client']); + if (!$draft->saveDraft()) { + $errors = $draft->getErrors(); + foreach ($errors as $error) { + msg(hsc($error), -1); + } + } + } +} diff --git a/inc/Action/Profile.php b/inc/Action/Profile.php new file mode 100644 index 0000000..41615af --- /dev/null +++ b/inc/Action/Profile.php @@ -0,0 +1,51 @@ +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() + { + (new UserProfile())->show(); + } +} diff --git a/inc/Action/ProfileDelete.php b/inc/Action/ProfileDelete.php new file mode 100644 index 0000000..5c190cd --- /dev/null +++ b/inc/Action/ProfileDelete.php @@ -0,0 +1,45 @@ +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/inc/Action/Recent.php b/inc/Action/Recent.php new file mode 100644 index 0000000..f5b45a1 --- /dev/null +++ b/inc/Action/Recent.php @@ -0,0 +1,44 @@ +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; + (new Ui\Recent($INPUT->extract('first')->int('first'), $this->showType))->show(); + } +} diff --git a/inc/Action/Recover.php b/inc/Action/Recover.php new file mode 100644 index 0000000..5e5c95d --- /dev/null +++ b/inc/Action/Recover.php @@ -0,0 +1,24 @@ + $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'); + } elseif ($PRE && preg_match('/^\s*==+([^=\n]+)/', $TEXT, $match)) { + // Fallback to old mechanism + $check = false; //Byref + $opts['fragment'] = sectionID($match[0], $check); + } + + // execute the redirect + Event::createAndTrigger('ACTION_SHOW_REDIRECT', $opts, [$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/inc/Action/Register.php b/inc/Action/Register.php new file mode 100644 index 0000000..232d21a --- /dev/null +++ b/inc/Action/Register.php @@ -0,0 +1,51 @@ +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() + { + (new UserRegister())->show(); + } +} diff --git a/inc/Action/Resendpwd.php b/inc/Action/Resendpwd.php new file mode 100644 index 0000000..2813bfc --- /dev/null +++ b/inc/Action/Resendpwd.php @@ -0,0 +1,182 @@ +canDo('modPass')) throw new ActionDisabledException(); + } + + /** @inheritdoc */ + public function preProcess() + { + if ($this->resendpwd()) { + throw new ActionAbort('login'); + } + } + + /** @inheritdoc */ + public function tplContent() + { + (new UserResendPwd())->show(); + } + + /** + * 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 + * @author Chris Smith + * @author Andreas Gohr + * @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 AuthPlugin $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 (empty($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', [$user, ['pass' => $pass]])) { + msg($lang['proffail'], -1); + return false; + } + } else { // autogenerate the password and send by mail + $pass = auth_pwgen($user); + if (!$auth->triggerUserMod('modify', [$user, ['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 (empty($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('', ['do' => 'resendpwd', 'pwauth' => $token], true, '&'); + + io_saveFile($tfile, $user); + + $text = rawLocale('pwconfirm'); + $trep = [ + '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/inc/Action/Revert.php b/inc/Action/Revert.php new file mode 100644 index 0000000..4a42fe0 --- /dev/null +++ b/inc/Action/Revert.php @@ -0,0 +1,61 @@ + redirect -> show + throw new ActionAbort('draftdel'); + } +} diff --git a/inc/Action/Revisions.php b/inc/Action/Revisions.php new file mode 100644 index 0000000..9d8e604 --- /dev/null +++ b/inc/Action/Revisions.php @@ -0,0 +1,29 @@ +show($INPUT->int('first', -1)); + } +} diff --git a/inc/Action/Save.php b/inc/Action/Save.php new file mode 100644 index 0000000..3df208b --- /dev/null +++ b/inc/Action/Save.php @@ -0,0 +1,65 @@ + $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/inc/Action/Search.php b/inc/Action/Search.php new file mode 100644 index 0000000..10433d3 --- /dev/null +++ b/inc/Action/Search.php @@ -0,0 +1,136 @@ +has('q')) { + parse_str($INPUT->server->str('QUERY_STRING'), $urlParts); + $urlParts['q'] = $urlParts['id']; + unset($urlParts['id']); + $url = wl($ID, $urlParts, true, '&'); + 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/inc/Action/Show.php b/inc/Action/Show.php new file mode 100644 index 0000000..c274e06 --- /dev/null +++ b/inc/Action/Show.php @@ -0,0 +1,42 @@ +show(); + } +} diff --git a/inc/Action/Sitemap.php b/inc/Action/Sitemap.php new file mode 100644 index 0000000..f1f22ab --- /dev/null +++ b/inc/Action/Sitemap.php @@ -0,0 +1,68 @@ + + * @throws FatalException + * @inheritdoc + */ + public function preProcess() + { + global $conf; + + if ($conf['sitemap'] < 1 || !is_numeric($conf['sitemap'])) { + throw new FatalException('Sitemap generation is disabled', 404); + } + + $sitemap = Mapper::getFilePath(); + if (Mapper::sitemapIsCompressed()) { + $mime = 'application/x-gzip'; + } else { + $mime = 'application/xml; charset=utf-8'; + } + + // Check if sitemap file exists, otherwise create it + if (!is_readable($sitemap)) { + Mapper::generate(); + } + + if (is_readable($sitemap)) { + // Send headers + header('Content-Type: ' . $mime); + header('Content-Disposition: attachment; filename=' . PhpString::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('Could not read the sitemap file - bad permissions?'); + } +} diff --git a/inc/Action/Source.php b/inc/Action/Source.php new file mode 100644 index 0000000..0d2f822 --- /dev/null +++ b/inc/Action/Source.php @@ -0,0 +1,41 @@ +show(); + } +} diff --git a/inc/Action/Subscribe.php b/inc/Action/Subscribe.php new file mode 100644 index 0000000..640bb42 --- /dev/null +++ b/inc/Action/Subscribe.php @@ -0,0 +1,181 @@ +handleSubscribeData(); + } catch (ActionAbort $e) { + throw $e; + } catch (Exception $e) { + msg($e->getMessage(), -1); + } + } + + /** @inheritdoc */ + public function tplContent() + { + (new Ui\Subscribe())->show(); + } + + /** + * Handle page 'subscribe' + * + * @author Adrian Lang + * @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 = []; + foreach (['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. + Event::createAndTrigger('ACTION_HANDLE_SUBSCRIBE', $params, [$this, 'handlePostData']); + + $target = $params['target']; + $style = $params['style']; + $action = $params['action']; + + // Perform action. + $subManager = new SubscriberManager(); + if ($action === 'unsubscribe') { + $ok = $subManager->remove($target, $INPUT->server->str('REMOTE_USER'), $style); + } else { + $ok = $subManager->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'); + } + + 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 + * + * @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 = ['every', 'digest']; + if (str_ends_with($target, ':')) { + // 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', + ['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 = ['target' => $target, 'style' => $style, 'action' => $action]; + } +} diff --git a/inc/ActionRouter.php b/inc/ActionRouter.php new file mode 100644 index 0000000..daed634 --- /dev/null +++ b/inc/ActionRouter.php @@ -0,0 +1,235 @@ +disabled = explode(',', $conf['disableactions']); + $this->disabled = array_map('trim', $this->disabled); + + $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 instanceof \dokuwiki\ActionRouter) || $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 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 ($e instanceof ActionDisabledException) { + 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(\Throwable $e) + { + if ($e instanceof FatalException) { + http_status($e->getCode()); + } else { + http_status(500); + } + if (defined('DOKU_UNITTEST')) { + throw $e; + } + ErrorHandler::logException($e); + $msg = 'Something unforeseen 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 ($parts !== []) { + $load = implode('_', $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/inc/Ajax.php b/inc/Ajax.php new file mode 100644 index 0000000..2a7de07 --- /dev/null +++ b/inc/Ajax.php @@ -0,0 +1,447 @@ +$callfn(); + } else { + $evt = new Event('AJAX_CALL_UNKNOWN', $call); + if ($evt->advise_before()) { + echo "AJAX call '" . hsc($call) . "' unknown!\n"; + } else { + $evt->advise_after(); + unset($evt); + } + } + } + + /** + * Searches for matching pagenames + * + * @author Andreas Gohr + */ + protected function callQsearch() + { + 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 ($data === []) return; + + echo '' . $lang['quickhits'] . ''; + echo '
    '; + $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 '
  • ' . html_wikilink(':' . $id, $name) . '
  • '; + + $counter++; + if ($counter > $maxnumbersuggestions) { + echo '
  • ...
  • '; + break; + } + } + echo '
'; + } + + /** + * Support OpenSearch suggestions + * + * @link http://www.opensearch.org/Specifications/OpenSearch/Extensions/Suggestions/1.0 + * @author Mike Frysinger + */ + protected function callSuggestions() + { + 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 ($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::sort($data); + + /* now construct a json */ + $suggestions = [ + $query, // the original query + $data, // some suggestions + [], // no description + [], // no urls + ]; + + header('Content-Type: application/x-suggestions+json'); + echo json_encode($suggestions, JSON_THROW_ON_ERROR); + } + + /** + * Refresh a page lock and save draft + * + * Andreas Gohr + */ + protected function callLock() + { + global $ID; + global $INFO; + global $INPUT; + + $ID = cleanID($INPUT->post->str('id')); + if (empty($ID)) return; + + $INFO = pageinfo(); + + $response = [ + 'errors' => [], + 'lock' => '0', + 'draft' => '', + ]; + if (!$INFO['writable']) { + $response['errors'][] = 'Permission to write this page has been denied.'; + echo json_encode($response); + return; + } + + if (!checklock($ID)) { + lock($ID); + $response['lock'] = '1'; + } + + $draft = new Draft($ID, $INFO['client']); + if ($draft->saveDraft()) { + $response['draft'] = $draft->getDraftMessage(); + } else { + $response['errors'] = array_merge($response['errors'], $draft->getErrors()); + } + echo json_encode($response, JSON_THROW_ON_ERROR); + } + + /** + * Delete a draft + * + * @author Andreas Gohr + */ + protected function callDraftdel() + { + global $INPUT; + $id = cleanID($INPUT->str('id')); + if (empty($id)) return; + + $client = $INPUT->server->str('REMOTE_USER'); + if (!$client) $client = clientIP(true); + + $draft = new Draft($id, $client); + if ($draft->isDraftAvailable() && checkSecurityToken()) { + $draft->deleteDraft(); + } + } + + /** + * Return subnamespaces for the Mediamanager + * + * @author Andreas Gohr + */ + protected function callMedians() + { + global $conf; + global $INPUT; + + // wanted namespace + $ns = cleanID($INPUT->post->str('ns')); + $dir = utf8_encodeFN(str_replace(':', '/', $ns)); + + $lvl = count(explode(':', $ns)); + + $data = []; + search($data, $conf['mediadir'], 'search_index', ['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 + */ + protected function callMedialist() + { + 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 + */ + protected function callMediadetails() + { + 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 + */ + protected function callMediadiff() + { + global $INPUT; + + $image = ''; + if ($INPUT->has('image')) $image = cleanID($INPUT->str('image')); + (new MediaDiff($image))->preference('fromAjax', true)->show(); + } + + /** + * Manages file uploads + * + * @author Kate Arzamastseva + */ + protected function callMediaupload() + { + global $NS, $MSG, $INPUT; + + $id = ''; + if (isset($_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 (isset($_FILES['qqfile']['error']) && $_FILES['qqfile']['error']) unset($_FILES['qqfile']); + + $res = false; + if (isset($_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 = [ + 'success' => true, + 'link' => media_managerURL(['ns' => $ns, 'image' => $NS . ':' . $id], '&'), + 'id' => $NS . ':' . $id, + 'ns' => $NS + ]; + } else { + $error = ''; + if (isset($MSG)) { + foreach ($MSG as $msg) { + $error .= $msg['msg']; + } + } + $result = ['error' => $error, 'ns' => $NS]; + } + + header('Content-Type: application/json'); + echo json_encode($result, JSON_THROW_ON_ERROR); + } + + /** + * Return sub index for index view + * + * @author Andreas Gohr + */ + protected function callIndex() + { + global $conf; + global $INPUT; + + // wanted namespace + $ns = cleanID($INPUT->post->str('idx')); + $dir = utf8_encodeFN(str_replace(':', '/', $ns)); + + $lvl = count(explode(':', $ns)); + + $data = []; + search($data, $conf['datadir'], 'search_index', ['ns' => $ns], $dir); + foreach (array_keys($data) as $item) { + $data[$item]['level'] = $lvl + 1; + } + $idx = new Index(); + echo html_buildlist($data, 'idx', [$idx,'formatListItem'], [$idx,'tagListItem']); + } + + /** + * List matching namespaces and pages for the link wizard + * + * @author Andreas Gohr + */ + protected function callLinkwiz() + { + 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 = []; + if ($q !== '' && $ns === '') { + // use index to lookup matching pages + $pages = ft_pageLookup($id, true); + + // If 'useheading' option is 'always' or 'content', + // search page titles with original query as well. + if ($conf['useheading'] == '1' || $conf['useheading'] == 'content') { + $pages = array_merge($pages, ft_pageLookup($q, true, true)); + asort($pages, SORT_STRING); + } + + // result contains matches in pages and namespaces + // we now extract the matching namespaces to show + // them seperately + $dirs = []; + + foreach ($pages as $pid => $title) { + if (strpos(getNS($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[] = ['id' => $pid, 'title' => $title, 'type' => 'f']; + } + unset($pages[$pid]); + } + foreach (array_keys($dirs) as $dir) { + $data[] = ['id' => $dir, 'type' => 'd']; + } + } else { + $opts = [ + '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, + ['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 '
'; + + if ($item['type'] == 'u') { + $name = $lang['upperns']; + } else { + $name = hsc($item['id']); + } + + echo '' . $name . ''; + + if (!blank($item['title'])) { + echo '' . hsc($item['title']) . ''; + } + echo '
'; + } + } +} diff --git a/inc/Cache/Cache.php b/inc/Cache/Cache.php new file mode 100644 index 0000000..e304943 --- /dev/null +++ b/inc/Cache/Cache.php @@ -0,0 +1,240 @@ +key = $key; + $this->ext = $ext; + $this->cache = getCacheName($key, $ext); + + /** + * @deprecated since 2019-02-02 use the respective getters instead! + */ + $this->deprecatePublicProperty('_event'); + $this->deprecatePublicProperty('_time'); + $this->deprecatePublicProperty('_nocache'); + } + + public function getTime() + { + return $this->_time; + } + + public function getEvent() + { + return $this->_event; + } + + public function setEvent($event) + { + $this->_event = $event; + } + + /** + * 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 makeDefaultCacheDecision() + * + * @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 = []) + { + $this->depends = $depends; + $this->addDependencies(); + + if ($this->getEvent()) { + return $this->stats( + Event::createAndTrigger( + $this->getEvent(), + $this, + [$this, 'makeDefaultCacheDecision'] + ) + ); + } + + return $this->stats($this->makeDefaultCacheDecision()); + } + + /** + * internal 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 + * + * @internal This method may only be called by the event handler! Call \dokuwiki\Cache\Cache::useCache instead! + * + * @return bool see useCache() + */ + public function makeDefaultCacheDecision() + { + 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])) { + [$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, implode("\n", $stats)); + + return $success; + } + + /** + * @return bool + */ + public function isNoCache() + { + return $this->_nocache; + } +} diff --git a/inc/Cache/CacheImageMod.php b/inc/Cache/CacheImageMod.php new file mode 100644 index 0000000..bec3ef4 --- /dev/null +++ b/inc/Cache/CacheImageMod.php @@ -0,0 +1,54 @@ +file = $file; + + $this->setEvent('IMAGEMOD_CACHE_USE'); + parent::__construct($file, $fullext); + } + + /** @inheritdoc */ + public function makeDefaultCacheDecision() + { + if (!file_exists($this->file)) { + return false; + } + return parent::makeDefaultCacheDecision(); + } + + /** + * Caching depends on the source and the wiki config + * @inheritdoc + */ + protected function addDependencies() + { + parent::addDependencies(); + + $this->depends['files'] = array_merge( + [$this->file], + getConfigFiles('main') + ); + } +} diff --git a/inc/Cache/CacheInstructions.php b/inc/Cache/CacheInstructions.php new file mode 100644 index 0000000..8bc72d9 --- /dev/null +++ b/inc/Cache/CacheInstructions.php @@ -0,0 +1,45 @@ +cache, false); + return empty($contents) ? [] : unserialize($contents); + } + + /** + * 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/inc/Cache/CacheParser.php b/inc/Cache/CacheParser.php new file mode 100644 index 0000000..d885d25 --- /dev/null +++ b/inc/Cache/CacheParser.php @@ -0,0 +1,63 @@ +page = $id; + } + $this->file = $file; + $this->mode = $mode; + + $this->setEvent('PARSER_CACHE_USE'); + parent::__construct($file . $INPUT->server->str('HTTP_HOST') . $INPUT->server->str('SERVER_PORT'), '.' . $mode); + } + + /** + * method contains cache use decision logic + * + * @return bool see useCache() + */ + public function makeDefaultCacheDecision() + { + if (!file_exists($this->file)) { + // source doesn't exist + return false; + } + return parent::makeDefaultCacheDecision(); + } + + protected function addDependencies() + { + // parser cache file dependencies ... + $files = [ + $this->file, // source + DOKU_INC . 'inc/Parsing/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']) ? + $files : + array_merge($files, $this->depends['files']); + parent::addDependencies(); + } +} diff --git a/inc/Cache/CacheRenderer.php b/inc/Cache/CacheRenderer.php new file mode 100644 index 0000000..95b330d --- /dev/null +++ b/inc/Cache/CacheRenderer.php @@ -0,0 +1,92 @@ +page)) { + return true; + } + + // meta cache older than file it depends on? + if ($this->_time < @filemtime(metaFN($this->page, '.meta'))) { + return false; + } + + // 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 = [DOKU_INC . 'inc/parser/' . $this->mode . '.php']; + + // page implies metadata and possibly some other dependencies + if (isset($this->page)) { + // for xhtml this will render the metadata if needed + $valid = p_get_metadata($this->page, 'date valid'); + 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']) ? + $files : + array_merge($files, $this->depends['files']); + + parent::addDependencies(); + } +} diff --git a/inc/ChangeLog/ChangeLog.php b/inc/ChangeLog/ChangeLog.php new file mode 100644 index 0000000..3011b5c --- /dev/null +++ b/inc/ChangeLog/ChangeLog.php @@ -0,0 +1,700 @@ +cache =& $cache_revinfo; + if (!isset($this->cache[$id])) { + $this->cache[$id] = []; + } + + $this->id = $id; + $this->setChunkSize($chunk_size); + } + + /** + * Returns path to current page/media + * + * @param string|int $rev empty string or revision timestamp + * @return string path to file + */ + abstract protected function getFilename($rev = ''); + + /** + * Returns mode + * + * @return string RevisionInfo::MODE_MEDIA or RevisionInfo::MODE_PAGE + */ + abstract protected function getMode(); + + /** + * 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 == $this->currentRevision(); + } + + /** + * Checks if the revision is last revision + * + * @param int $rev revision timestamp + * @return bool true if $rev is last revision, otherwise false + */ + public function isLastRevision($rev = null) + { + return $rev === $this->lastRevision(); + } + + /** + * Return the current revision identifier + * + * The "current" revision means current version of the page or media file. It is either + * identical with or newer than the "last" revision, that depends on whether the file + * has modified, created or deleted outside of DokuWiki. + * The value of identifier can be determined by timestamp as far as the file exists, + * otherwise it must be assigned larger than any other revisions to keep them sortable. + * + * @return int|false revision timestamp + */ + public function currentRevision() + { + if (!isset($this->currentRevision)) { + // set ChangeLog::currentRevision property + $this->getCurrentRevisionInfo(); + } + return $this->currentRevision; + } + + /** + * Return the last revision identifier, date value of the last entry of the changelog + * + * @return int|false revision timestamp + */ + public function lastRevision() + { + $revs = $this->getRevisions(-1, 1); + return empty($revs) ? false : $revs[0]; + } + + /** + * Parses a changelog line into its components and save revision info to the cache pool + * + * @param string $value changelog line + * @return array|bool parsed line or false + */ + protected function parseAndCacheLogLine($value) + { + $info = static::parseLogLine($value); + if (is_array($info)) { + $info['mode'] = $this->getMode(); + $this->cache[$this->id][$info['date']] ??= $info; + return $info; + } + return false; + } + + /** + * Get the changelog information for a specific 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 + * @param bool $retrieveCurrentRevInfo allows to skip for getting other revision info in the + * getCurrentRevisionInfo() where $currentRevision is not yet determined + * @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) + * - sizechange: change of filesize + * additional: + * - mode: page or media + * + * @author Ben Coburn + * @author Kate Arzamastseva + */ + public function getRevisionInfo($rev, $retrieveCurrentRevInfo = true) + { + $rev = max(0, $rev); + if (!$rev) return false; + + //ensure the external edits are cached as well + if (!isset($this->currentRevision) && $retrieveCurrentRevInfo) { + $this->getCurrentRevisionInfo(); + } + + // check if it's already in the memory cache + if (isset($this->cache[$this->id][$rev])) { + return $this->cache[$this->id][$rev]; + } + + //read lines from changelog + [$fp, $lines] = $this->readloglines($rev); + if ($fp) { + fclose($fp); + } + if (empty($lines)) return false; + + // parse and cache changelog lines + foreach ($lines as $line) { + $this->parseAndCacheLogLine($line); + } + + return $this->cache[$this->id][$rev] ?? false; + } + + /** + * 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 received. + * + * @param int $first skip the first n changelog lines + * @param int $num number of revisions to return + * @return array with the revision timestamps + * + * @author Ben Coburn + * @author Kate Arzamastseva + */ + public function getRevisions($first, $num) + { + $revs = []; + $lines = []; + $count = 0; + + $logfile = $this->getChangelogFilename(); + if (!file_exists($logfile)) return $revs; + + $num = max($num, 0); + if ($num == 0) { + return $revs; + } + + if ($first < 0) { + $first = 0; + } else { + $fileLastMod = $this->getFilename(); + if (file_exists($fileLastMod) && $this->isLastRevision(filemtime($fileLastMod))) { + // skip last revision if the page exists + $first = max($first + 1, 0); + } + } + + if (filesize($logfile) < $this->chunk_size || $this->chunk_size == 0) { + // read whole file + $lines = file($logfile); + if ($lines === false) { + return $revs; + } + } else { + // read chunks backwards + $fp = fopen($logfile, '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 = [...$tmp, ...$lines]; + + // next chunk + if ($finger == 0) { + break; + } else { // already read all the lines + $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); + } elseif ($first > 0 && $num == 0) { + $lines = array_slice($lines, 0, max(count($lines) - $first, 0)); + } elseif ($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--) { + $info = $this->parseAndCacheLogLine($lines[$i]); + if (is_array($info)) { + $revs[] = $info['date']; + } + } + + return $revs; + } + + /** + * Get the nth revision left or right-hand side 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 chunk. + * + * Adjacent changelog lines are optimistically parsed and cached to speed up + * consecutive calls to getRevisionInfo. + * + * @param int $rev revision timestamp used as start date + * (doesn't need to be exact revision number) + * @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 + [$fp, $lines, $head, $tail, $eof] = $this->readloglines($rev); + if (empty($lines)) return false; + + // look for revisions later/earlier than $rev, when founded count till the wanted revision is reached + // also parse and cache changelog lines for getRevisionInfo(). + $revCounter = 0; + $relativeRev = false; + $checkOtherChunk = true; //always runs once + while (!$relativeRev && $checkOtherChunk) { + $info = []; + //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 += $step) { + $info = $this->parseAndCacheLogLine($lines[$i]); + if (is_array($info)) { + //look for revs older/earlier then reference $rev and select $direction-th one + if (($direction > 0 && $info['date'] > $rev) || ($direction < 0 && $info['date'] < $rev)) { + $revCounter++; + if ($revCounter == abs($direction)) { + $relativeRev = $info['date']; + } + } + } + } + + //true when $rev is found, but not the wanted follow-up. + $checkOtherChunk = $fp + && ($info['date'] == $rev || ($revCounter > 0 && !$relativeRev)) + && (!($tail == $eof && $direction > 0) && !($head == 0 && $direction < 0)); + + if ($checkOtherChunk) { + [$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 = (int) (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. + $rev2 = $this->currentRevision(); + } + //collect revisions around rev2 + [$revs2, $allRevs, $fp, $lines, $head, $tail] = $this->retrieveRevisionsAround($rev2, $max); + + if (empty($revs2)) return [[], []]; + + //collect revisions around rev1 + $index = array_search($rev1, $allRevs); + if ($index === false) { + //no overlapping revisions + [$revs1, , , , , ] = $this->retrieveRevisionsAround($rev1, $max); + if (empty($revs1)) $revs1 = []; + } else { + //revisions overlaps, reuse revisions around rev2 + $lastRev = array_pop($allRevs); //keep last entry that could be external edit + $revs1 = $allRevs; + while ($head > 0) { + for ($i = count($lines) - 1; $i >= 0; $i--) { + $info = $this->parseAndCacheLogLine($lines[$i]); + if (is_array($info)) { + $revs1[] = $info['date']; + $index++; + + if ($index > (int) ($max / 2)) { + break 2; + } + } + } + + [$lines, $head, $tail] = $this->readAdjacentChunk($fp, $head, $tail, -1); + } + sort($revs1); + $revs1[] = $lastRev; //push back last entry + + //return wanted selection + $revs1 = array_slice($revs1, max($index - (int) ($max / 2), 0), $max); + } + + return [array_reverse($revs1), array_reverse($revs2)]; + } + + /** + * 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) + */ + public function getLastRevisionAt($date_at) + { + $fileLastMod = $this->getFilename(); + //requested date_at(timestamp) younger or equal then modified_time($this->id) => load current + if (file_exists($fileLastMod) && $date_at >= @filemtime($fileLastMod)) { + return ''; + } elseif ($rev = $this->getRelativeRevision($date_at + 1, -1)) { + //+1 to get also the requested date revision + return $rev; + } else { + return false; + } + } + + /** + * Collect the $max revisions near to the timestamp $rev + * + * Ideally, half of retrieved timestamps are older than $rev, another half are newer. + * The returned array $requestedRevs may not contain the reference timestamp $rev + * when it does not match any revision value recorded in changelog. + * + * @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: file pointer only defined for chuck reading, needs closing. + * - $lines: non-parsed changelog lines before the parsed revisions + * - $head: position of first read changelog line + * - $lastTail: position of end of last read changelog line + * otherwise false + */ + protected function retrieveRevisionsAround($rev, $max) + { + $revs = []; + $afterCount = 0; + $beforeCount = 0; + + //get lines from changelog + [$fp, $lines, $startHead, $startTail, $eof] = $this->readloglines($rev); + if (empty($lines)) return false; + + //parse changelog lines in chunk, and read forward more chunks until $max/2 is reached + $head = $startHead; + $tail = $startTail; + while (count($lines) > 0) { + foreach ($lines as $line) { + $info = $this->parseAndCacheLogLine($line); + if (is_array($info)) { + $revs[] = $info['date']; + if ($info['date'] >= $rev) { + //count revs after reference $rev + $afterCount++; + if ($afterCount == 1) { + $beforeCount = count($revs); + } + } + //enough revs after reference $rev? + if ($afterCount > (int) ($max / 2)) { + break 2; + } + } + } + //retrieve next chunk + [$lines, $head, $tail] = $this->readAdjacentChunk($fp, $head, $tail, 1); + } + $lastTail = $tail; + + // add a possible revision of external edit, create or deletion + if ( + $lastTail == $eof && $afterCount <= (int) ($max / 2) && + count($revs) && !$this->isCurrentRevision($revs[count($revs) - 1]) + ) { + $revs[] = $this->currentRevision; + $afterCount++; + } + + if ($afterCount == 0) { + //given timestamp $rev is newer than the most recent line in chunk + return false; //FIXME: or proceed to collect older revisions? + } + + //read more chunks backward until $max/2 is reached and total number of revs is equal to $max + $lines = []; + $i = 0; + $head = $startHead; + $tail = $startTail; + while ($head > 0) { + [$lines, $head, $tail] = $this->readAdjacentChunk($fp, $head, $tail, -1); + + for ($i = count($lines) - 1; $i >= 0; $i--) { + $info = $this->parseAndCacheLogLine($lines[$i]); + if (is_array($info)) { + $revs[] = $info['date']; + $beforeCount++; + //enough revs before reference $rev? + if ($beforeCount > max((int) ($max / 2), $max - $afterCount)) { + break 2; + } + } + } + } + //keep only non-parsed lines + $lines = array_slice($lines, 0, $i); + + sort($revs); + + //trunk desired selection + $requestedRevs = array_slice($revs, -$max, $max); + + return [$requestedRevs, $revs, $fp, $lines, $head, $lastTail]; + } + + /** + * Get the current revision information, considering external edit, create or deletion + * + * When the file has not modified since its last revision, the information of the last + * change that had already recorded in the changelog is returned as current change info. + * Otherwise, the change information since the last revision caused outside DokuWiki + * should be returned, which is referred as "external revision". + * + * The change date of the file can be determined by timestamp as far as the file exists, + * however this is not possible when the file has already deleted outside of DokuWiki. + * In such case we assign 1 sec before current time() for the external deletion. + * As a result, the value of current revision identifier may change each time because: + * 1) the file has again modified outside of DokuWiki, or + * 2) the value is essentially volatile for deleted but once existed files. + * + * @return bool|array false when page had never existed or array with entries: + * - date: revision identifier (timestamp or last revision +1) + * - ip: IPv4 address (127.0.0.1) + * - type: log line type + * - id: id of page or media + * - user: user name + * - sum: edit summary (or action reason) + * - extra: extra data (varies by line type) + * - sizechange: change of filesize + * - timestamp: unix timestamp or false (key set only for external edit occurred) + * additional: + * - mode: page or media + * + * @author Satoshi Sahara + */ + public function getCurrentRevisionInfo() + { + global $lang; + + if (isset($this->currentRevision)) { + return $this->getRevisionInfo($this->currentRevision); + } + + // get revision id from the item file timestamp and changelog + $fileLastMod = $this->getFilename(); + $fileRev = @filemtime($fileLastMod); // false when the file not exist + $lastRev = $this->lastRevision(); // false when no changelog + + if (!$fileRev && !$lastRev) { // has never existed + $this->currentRevision = false; + return false; + } elseif ($fileRev === $lastRev) { // not external edit + $this->currentRevision = $lastRev; + return $this->getRevisionInfo($lastRev); + } + + if (!$fileRev && $lastRev) { // item file does not exist + // check consistency against changelog + $revInfo = $this->getRevisionInfo($lastRev, false); + if ($revInfo['type'] == DOKU_CHANGE_TYPE_DELETE) { + $this->currentRevision = $lastRev; + return $revInfo; + } + + // externally deleted, set revision date as late as possible + $revInfo = [ + 'date' => max($lastRev + 1, time() - 1), // 1 sec before now or new page save + 'ip' => '127.0.0.1', + 'type' => DOKU_CHANGE_TYPE_DELETE, + 'id' => $this->id, + 'user' => '', + 'sum' => $lang['deleted'] . ' - ' . $lang['external_edit'] . ' (' . $lang['unknowndate'] . ')', + 'extra' => '', + 'sizechange' => -io_getSizeFile($this->getFilename($lastRev)), + 'timestamp' => false, + 'mode' => $this->getMode() + ]; + } else { // item file exists, with timestamp $fileRev + // here, file timestamp $fileRev is different with last revision timestamp $lastRev in changelog + $isJustCreated = $lastRev === false || ( + $fileRev > $lastRev && + $this->getRevisionInfo($lastRev, false)['type'] == DOKU_CHANGE_TYPE_DELETE + ); + $filesize_new = filesize($this->getFilename()); + $filesize_old = $isJustCreated ? 0 : io_getSizeFile($this->getFilename($lastRev)); + $sizechange = $filesize_new - $filesize_old; + + if ($isJustCreated) { + $timestamp = $fileRev; + $sum = $lang['created'] . ' - ' . $lang['external_edit']; + } elseif ($fileRev > $lastRev) { + $timestamp = $fileRev; + $sum = $lang['external_edit']; + } else { + // $fileRev is older than $lastRev, that is erroneous/incorrect occurrence. + $msg = "Warning: current file modification time is older than last revision date"; + $details = 'File revision: ' . $fileRev . ' ' . dformat($fileRev, "%Y-%m-%d %H:%M:%S") . "\n" + . 'Last revision: ' . $lastRev . ' ' . dformat($lastRev, "%Y-%m-%d %H:%M:%S"); + Logger::error($msg, $details, $this->getFilename()); + $timestamp = false; + $sum = $lang['external_edit'] . ' (' . $lang['unknowndate'] . ')'; + } + + // externally created or edited + $revInfo = [ + 'date' => $timestamp ?: $lastRev + 1, + 'ip' => '127.0.0.1', + 'type' => $isJustCreated ? DOKU_CHANGE_TYPE_CREATE : DOKU_CHANGE_TYPE_EDIT, + 'id' => $this->id, + 'user' => '', + 'sum' => $sum, + 'extra' => '', + 'sizechange' => $sizechange, + 'timestamp' => $timestamp, + 'mode' => $this->getMode() + ]; + } + + // cache current revision information of external edition + $this->currentRevision = $revInfo['date']; + $this->cache[$this->id][$this->currentRevision] = $revInfo; + return $this->getRevisionInfo($this->currentRevision); + } + + /** + * Mechanism to trace no-actual external current revision + * @param int $rev + */ + public function traceCurrentRevision($rev) + { + if ($rev > $this->lastRevision()) { + $rev = $this->currentRevision(); + } + return $rev; + } +} diff --git a/inc/ChangeLog/ChangeLogTrait.php b/inc/ChangeLog/ChangeLogTrait.php new file mode 100644 index 0000000..f10c53d --- /dev/null +++ b/inc/ChangeLog/ChangeLogTrait.php @@ -0,0 +1,262 @@ + + * + */ + public static function parseLogLine($line) + { + $info = sexplode("\t", rtrim($line, "\n"), 8); + if ($info[3]) { // we need at least the page id to consider it a valid line + return [ + 'date' => (int)$info[0], // unix timestamp + 'ip' => $info[1], // IP address (127.0.0.1) + 'type' => $info[2], // log line type + 'id' => $info[3], // page id + 'user' => $info[4], // user name + 'sum' => $info[5], // edit summary (or action reason) + 'extra' => $info[6], // extra data (varies by line type) + 'sizechange' => ($info[7] != '') ? (int)$info[7] : null, // size difference in bytes + ]; + } else { + return false; + } + } + + /** + * Build a changelog line from its components + * + * @param array $info Revision info structure + * @param int $timestamp log line date (optional) + * @return string changelog line + */ + public static function buildLogLine(array &$info, $timestamp = null) + { + $strip = ["\t", "\n"]; + $entry = [ + 'date' => $timestamp ?? $info['date'], + 'ip' => $info['ip'], + 'type' => str_replace($strip, '', $info['type']), + 'id' => $info['id'], + 'user' => $info['user'], + 'sum' => PhpString::substr(str_replace($strip, '', $info['sum'] ?? ''), 0, 255), + 'extra' => str_replace($strip, '', $info['extra']), + 'sizechange' => $info['sizechange'] + ]; + $info = $entry; + return implode("\t", $entry) . "\n"; + } + + /** + * Returns path to changelog + * + * @return string path to file + */ + abstract protected function getChangelogFilename(); + + /** + * Checks if the ID has old revisions + * @return boolean + */ + public function hasRevisions() + { + $logfile = $this->getChangelogFilename(); + return file_exists($logfile); + } + + + /** @var int */ + protected $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 = max($chunk_size, 0); + } + + /** + * Returns lines from changelog. + * If file larger than $chunk_size, only chunk is read that could contain $rev. + * + * When reference timestamp $rev is outside time range of changelog, readloglines() will return + * lines in first or last chunk, but they obviously does not 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; + } + fseek($fp, 0, SEEK_END); + $eof = ftell($fp); + $tail = $eof; + + // find chunk + while ($tail - $head > $this->chunk_size) { + $finger = $head + (int)(($tail - $head) / 2); + $finger = $this->getNewlinepointer($fp, $finger); + $tmp = fgets($fp); + if ($finger == $head || $finger == $tail) { + break; + } + $info = $this->parseLogLine($tmp); + $finger_rev = $info['date']; + + if ($finger_rev > $rev) { + $tail = $finger; + } else { + $head = $finger; + } + } + + if ($tail - $head < 1) { + // could not find chunk, assume requested rev is missing + fclose($fp); + return false; + } + + $lines = $this->readChunk($fp, $head, $tail); + } + return [$fp, $lines, $head, $tail, $eof]; + } + + /** + * Read chunk and return array with lines of given chunk. + * Has no check if $head and $tail are really at a new line + * + * @param resource $fp resource file pointer + * @param int $head start point chunk + * @param int $tail end point chunk + * @return array lines read from chunk + */ + 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 file pointer + * @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; + } + + /** + * Returns the next lines of the changelog of the chunk before head or after tail + * + * @param resource $fp file pointer + * @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 read chunk + * - $head: head of chunk + * - $tail: tail of chunk + */ + protected function readAdjacentChunk($fp, $head, $tail, $direction) + { + if (!$fp) return [[], $head, $tail]; + + if ($direction > 0) { + //read forward + $head = $tail; + $tail = $head + (int)($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 chunk + $lines = $this->readChunk($fp, $head, $tail); + return [$lines, $head, $tail]; + } +} diff --git a/inc/ChangeLog/MediaChangeLog.php b/inc/ChangeLog/MediaChangeLog.php new file mode 100644 index 0000000..3ec7062 --- /dev/null +++ b/inc/ChangeLog/MediaChangeLog.php @@ -0,0 +1,68 @@ +id, '.changes'); + } + + /** + * Returns path to current page/media + * + * @param string|int $rev empty string or revision timestamp + * @return string path to file + */ + protected function getFilename($rev = '') + { + return mediaFN($this->id, $rev); + } + + /** + * Returns mode + * + * @return string RevisionInfo::MODE_PAGE + */ + protected function getMode() + { + return RevisionInfo::MODE_MEDIA; + } + + + /** + * Adds an entry to the changelog + * + * @param array $info Revision info structure of a media file + * @param int $timestamp log line date (optional) + * @return array revision info of added log line + * + * @see also addMediaLogEntry() in inc/changelog.php file + */ + public function addLogEntry(array $info, $timestamp = null) + { + global $conf; + + if (isset($timestamp)) unset($this->cache[$this->id][$info['date']]); + + // add changelog lines + $logline = static::buildLogLine($info, $timestamp); + io_saveFile(mediaMetaFN($this->id, '.changes'), $logline, $append = true); + io_saveFile($conf['media_changelog'], $logline, $append = true); //global changelog cache + + // update cache + $this->currentRevision = $info['date']; + $info['mode'] = $this->getMode(); + $this->cache[$this->id][$this->currentRevision] = $info; + return $info; + } +} diff --git a/inc/ChangeLog/PageChangeLog.php b/inc/ChangeLog/PageChangeLog.php new file mode 100644 index 0000000..f0e2b9a --- /dev/null +++ b/inc/ChangeLog/PageChangeLog.php @@ -0,0 +1,68 @@ +id, '.changes'); + } + + /** + * Returns path to current page/media + * + * @param string|int $rev empty string or revision timestamp + * @return string path to file + */ + protected function getFilename($rev = '') + { + return wikiFN($this->id, $rev); + } + + /** + * Returns mode + * + * @return string RevisionInfo::MODE_PAGE + */ + protected function getMode() + { + return RevisionInfo::MODE_PAGE; + } + + + /** + * Adds an entry to the changelog + * + * @param array $info Revision info structure of a page + * @param int $timestamp log line date (optional) + * @return array revision info of added log line + * + * @see also addLogEntry() in inc/changelog.php file + */ + public function addLogEntry(array $info, $timestamp = null) + { + global $conf; + + if (isset($timestamp)) unset($this->cache[$this->id][$info['date']]); + + // add changelog lines + $logline = static::buildLogLine($info, $timestamp); + io_saveFile(metaFN($this->id, '.changes'), $logline, true); + io_saveFile($conf['changelog'], $logline, true); //global changelog cache + + // update cache + $this->currentRevision = $info['date']; + $info['mode'] = $this->getMode(); + $this->cache[$this->id][$this->currentRevision] = $info; + return $info; + } +} diff --git a/inc/ChangeLog/RevisionInfo.php b/inc/ChangeLog/RevisionInfo.php new file mode 100644 index 0000000..9a75530 --- /dev/null +++ b/inc/ChangeLog/RevisionInfo.php @@ -0,0 +1,395 @@ + self::MODE_PAGE, + 'date' => false, + ]; + } + $this->info = $info; + } + + /** + * Set or return whether this revision is current page or media file + * + * This method does not check exactly whether the revision is current or not. Instead, + * set value of associated "current" key for internal use. Some UI element like diff + * link button depend on relation to current page or media file. A changelog line does + * not indicate whether it corresponds to current page or media file. + * + * @param bool $value true if the revision is current, otherwise false + * @return bool + */ + public function isCurrent($value = null) + { + return (bool) $this->val('current', $value); + } + + /** + * Return or set a value of associated key of revision information + * but does not allow to change values of existing keys + * + * @param string $key + * @param mixed $value + * @return string|null + */ + public function val($key, $value = null) + { + if (isset($value) && !array_key_exists($key, $this->info)) { + // setter, only for new keys + $this->info[$key] = $value; + } + if (array_key_exists($key, $this->info)) { + // getter + return $this->info[$key]; + } + return null; + } + + /** + * Set extra key-value to the revision information + * but does not allow to change values of existing keys + * @param array $info + * @return void + */ + public function append(array $info) + { + foreach ($info as $key => $value) { + $this->val($key, $value); + } + } + + + /** + * file icon of the page or media file + * used in [Ui\recent] + * + * @return string + */ + public function showFileIcon() + { + $id = $this->val('id'); + if ($this->val('mode') == self::MODE_MEDIA) { + // media file revision + return media_printicon($id); + } elseif ($this->val('mode') == self::MODE_PAGE) { + // page revision + return '' . $id . ''; + } + } + + /** + * edit date and time of the page or media file + * used in [Ui\recent, Ui\Revisions] + * + * @param bool $checkTimestamp enable timestamp check, alter formatted string when timestamp is false + * @return string + */ + public function showEditDate($checkTimestamp = false) + { + $formatted = dformat($this->val('date')); + if ($checkTimestamp && $this->val('timestamp') === false) { + // exact date is unknown for externally deleted file + // when unknown, alter formatted string "YYYY-mm-DD HH:MM" to "____-__-__ __:__" + $formatted = preg_replace('/[0-9a-zA-Z]/', '_', $formatted); + } + return '' . $formatted . ''; + } + + /** + * edit summary + * used in [Ui\recent, Ui\Revisions] + * + * @return string + */ + public function showEditSummary() + { + return '' . ' – ' . hsc($this->val('sum')) . ''; + } + + /** + * editor of the page or media file + * used in [Ui\recent, Ui\Revisions] + * + * @return string + */ + public function showEditor() + { + if ($this->val('user')) { + $html = '' . editorinfo($this->val('user')) . ''; + if (auth_ismanager()) { + $html .= ' (' . $this->val('ip') . ')'; + } + } else { + $html = '' . $this->val('ip') . ''; + } + return '' . $html . ''; + } + + /** + * name of the page or media file + * used in [Ui\recent, Ui\Revisions] + * + * @return string + */ + public function showFileName() + { + $id = $this->val('id'); + $rev = $this->isCurrent() ? '' : $this->val('date'); + + if ($this->val('mode') == self::MODE_MEDIA) { + // media file revision + $params = ['tab_details' => 'view', 'ns' => getNS($id), 'image' => $id]; + if ($rev) $params += ['rev' => $rev]; + $href = media_managerURL($params, '&'); + $display_name = $id; + $exists = file_exists(mediaFN($id, $rev)); + } elseif ($this->val('mode') == self::MODE_PAGE) { + // page revision + $params = $rev ? ['rev' => $rev] : []; + $href = wl($id, $params, false, '&'); + $display_name = useHeading('navigation') ? hsc(p_get_first_heading($id)) : $id; + if (!$display_name) $display_name = $id; + $exists = page_exists($id, $rev); + } + + if ($exists) { + $class = 'wikilink1'; + } elseif ($this->isCurrent()) { + //show only not-existing link for current page, which allows for directly create a new page/upload + $class = 'wikilink2'; + } else { + //revision is not in attic + return $display_name; + } + if ($this->val('type') == DOKU_CHANGE_TYPE_DELETE) { + $class = 'wikilink2'; + } + return '' . $display_name . ''; + } + + /** + * Revision Title for PageDiff table headline + * + * @return string + */ + public function showRevisionTitle() + { + global $lang; + + if (!$this->val('date')) return '—'; + + $id = $this->val('id'); + $rev = $this->isCurrent() ? '' : $this->val('date'); + $params = ($rev) ? ['rev' => $rev] : []; + + // revision info may have timestamp key when external edits occurred + $date = ($this->val('timestamp') === false) + ? $lang['unknowndate'] + : dformat($this->val('date')); + + + if ($this->val('mode') == self::MODE_MEDIA) { + // media file revision + $href = ml($id, $params, false, '&'); + $exists = file_exists(mediaFN($id, $rev)); + } elseif ($this->val('mode') == self::MODE_PAGE) { + // page revision + $href = wl($id, $params, false, '&'); + $exists = page_exists($id, $rev); + } + if ($exists) { + $class = 'wikilink1'; + } elseif ($this->isCurrent()) { + //show only not-existing link for current page, which allows for directly create a new page/upload + $class = 'wikilink2'; + } else { + //revision is not in attic + return $id . ' [' . $date . ']'; + } + if ($this->val('type') == DOKU_CHANGE_TYPE_DELETE) { + $class = 'wikilink2'; + } + return '' . $id . ' [' . $date . ']' . ''; + } + + /** + * diff link icon in recent changes list, to compare (this) current revision with previous one + * all items in "recent changes" are current revision of the page or media + * + * @return string + */ + public function showIconCompareWithPrevious() + { + global $lang; + $id = $this->val('id'); + + $href = ''; + if ($this->val('mode') == self::MODE_MEDIA) { + // media file revision + // unlike page, media file does not copied to media_attic when uploaded. + // diff icon will not be shown when external edit occurred + // because no attic file to be compared with current. + $revs = (new MediaChangeLog($id))->getRevisions(0, 1); + $showLink = (count($revs) && file_exists(mediaFN($id, $revs[0])) && file_exists(mediaFN($id))); + if ($showLink) { + $param = ['tab_details' => 'history', 'mediado' => 'diff', 'ns' => getNS($id), 'image' => $id]; + $href = media_managerURL($param, '&'); + } + } elseif ($this->val('mode') == self::MODE_PAGE) { + // page revision + // when a page just created anyway, it is natural to expect no older revisions + // even if it had once existed but deleted before. Simply ignore to check changelog. + if ($this->val('type') !== DOKU_CHANGE_TYPE_CREATE) { + $href = wl($id, ['do' => 'diff'], false, '&'); + } + } + + if ($href) { + return '' + . '' . $lang['diff'] . '' + . ''; + } else { + return ''; + } + } + + /** + * diff link icon in revisions list, compare this revision with current one + * the icon does not displayed for the current revision + * + * @return string + */ + public function showIconCompareWithCurrent() + { + global $lang; + $id = $this->val('id'); + $rev = $this->isCurrent() ? '' : $this->val('date'); + + $href = ''; + if ($this->val('mode') == self::MODE_MEDIA) { + // media file revision + if (!$this->isCurrent() && file_exists(mediaFN($id, $rev))) { + $param = ['mediado' => 'diff', 'image' => $id, 'rev' => $rev]; + $href = media_managerURL($param, '&'); + } + } elseif ($this->val('mode') == self::MODE_PAGE) { + // page revision + if (!$this->isCurrent()) { + $href = wl($id, ['rev' => $rev, 'do' => 'diff'], false, '&'); + } + } + + if ($href) { + return '' + . '' . $lang['diff'] . '' + . ''; + } else { + return ''; + } + } + + /** + * icon for revision action + * used in [Ui\recent] + * + * @return string + */ + public function showIconRevisions() + { + global $lang; + + if (!actionOK('revisions')) { + return ''; + } + + $id = $this->val('id'); + if ($this->val('mode') == self::MODE_MEDIA) { + // media file revision + $param = ['tab_details' => 'history', 'ns' => getNS($id), 'image' => $id]; + $href = media_managerURL($param, '&'); + } elseif ($this->val('mode') == self::MODE_PAGE) { + // page revision + $href = wl($id, ['do' => 'revisions'], false, '&'); + } + return '' + . '' . $lang['btn_revs'] . '' + . ''; + } + + /** + * size change + * used in [Ui\recent, Ui\Revisions] + * + * @return string + */ + public function showSizeChange() + { + $class = 'sizechange'; + $value = filesize_h(abs($this->val('sizechange'))); + if ($this->val('sizechange') > 0) { + $class .= ' positive'; + $value = '+' . $value; + } elseif ($this->val('sizechange') < 0) { + $class .= ' negative'; + $value = '-' . $value; + } else { + $value = '±' . $value; + } + return '' . $value . ''; + } + + /** + * current indicator, used in revision list + * not used in Ui\Recent because recent files are always current one + * + * @return string + */ + public function showCurrentIndicator() + { + global $lang; + return $this->isCurrent() ? '(' . $lang['current'] . ')' : ''; + } +} diff --git a/inc/Debug/DebugHelper.php b/inc/Debug/DebugHelper.php new file mode 100644 index 0000000..4fc8bf9 --- /dev/null +++ b/inc/Debug/DebugHelper.php @@ -0,0 +1,178 @@ +isLogging() && + (!$EVENT_HANDLER instanceof EventHandler || !$EVENT_HANDLER->hasHandlerForEvent('INFO_DEPRECATION_LOG')) + ) { + // avoid any work if no one cares + return false; + } + return true; + } + + /** + * Log accesses to deprecated fucntions to the debug log + * + * @param string $alternative (optional) The function or method that should be used instead + * @param int $callerOffset (optional) How far the deprecated method is removed from this one + * @param string $thing (optional) The deprecated thing, defaults to the calling method + * @triggers \dokuwiki\Debug::INFO_DEPRECATION_LOG_EVENT + */ + public static function dbgDeprecatedFunction($alternative = '', $callerOffset = 1, $thing = '') + { + if (!self::isEnabled()) return; + + $backtrace = debug_backtrace(); + for ($i = 0; $i < $callerOffset; ++$i) { + if (count($backtrace) > 1) array_shift($backtrace); + } + + [$self, $call] = $backtrace; + + self::triggerDeprecationEvent( + $backtrace, + $alternative, + self::formatCall($self), + self::formatCall($call), + $self['file'] ?? $call['file'] ?? '', + $self['line'] ?? $call['line'] ?? 0 + ); + } + + /** + * Format the given backtrace info into a proper function/method call string + * @param array $call + * @return string + */ + protected static function formatCall($call) + { + $thing = ''; + if (!empty($call['class'])) { + $thing .= $call['class'] . '::'; + } + $thing .= $call['function'] . '()'; + return trim($thing, ':'); + } + + /** + * This marks logs a deprecation warning for a property that should no longer be used + * + * This is usually called withing a magic getter or setter. + * For logging deprecated functions or methods see dbgDeprecatedFunction() + * + * @param string $class The class with the deprecated property + * @param string $propertyName The name of the deprecated property + * + * @triggers \dokuwiki\Debug::INFO_DEPRECATION_LOG_EVENT + */ + public static function dbgDeprecatedProperty($class, $propertyName) + { + if (!self::isEnabled()) return; + + $backtrace = debug_backtrace(); + array_shift($backtrace); + $call = $backtrace[1]; + $caller = trim($call['class'] . '::' . $call['function'] . '()', ':'); + $qualifiedName = $class . '::$' . $propertyName; + self::triggerDeprecationEvent( + $backtrace, + '', + $qualifiedName, + $caller, + $backtrace[0]['file'], + $backtrace[0]['line'] + ); + } + + /** + * Trigger a custom deprecation event + * + * Usually dbgDeprecatedFunction() or dbgDeprecatedProperty() should be used instead. + * This method is intended only for those situation where they are not applicable. + * + * @param string $alternative + * @param string $deprecatedThing + * @param string $caller + * @param string $file + * @param int $line + * @param int $callerOffset How many lines should be removed from the beginning of the backtrace + */ + public static function dbgCustomDeprecationEvent( + $alternative, + $deprecatedThing, + $caller, + $file, + $line, + $callerOffset = 1 + ) { + if (!self::isEnabled()) return; + + $backtrace = array_slice(debug_backtrace(), $callerOffset); + + self::triggerDeprecationEvent( + $backtrace, + $alternative, + $deprecatedThing, + $caller, + $file, + $line + ); + } + + /** + * @param array $backtrace + * @param string $alternative + * @param string $deprecatedThing + * @param string $caller + * @param string $file + * @param int $line + */ + private static function triggerDeprecationEvent( + array $backtrace, + $alternative, + $deprecatedThing, + $caller, + $file, + $line + ) { + $data = [ + 'trace' => $backtrace, + 'alternative' => $alternative, + 'called' => $deprecatedThing, + 'caller' => $caller, + 'file' => $file, + 'line' => $line, + ]; + $event = new Event(self::INFO_DEPRECATION_LOG_EVENT, $data); + if ($event->advise_before()) { + $msg = $event->data['called'] . ' is deprecated. It was called from '; + $msg .= $event->data['caller'] . ' in ' . $event->data['file'] . ':' . $event->data['line']; + if ($event->data['alternative']) { + $msg .= ' ' . $event->data['alternative'] . ' should be used instead!'; + } + Logger::getInstance(Logger::LOG_DEPRECATED)->log($msg); + } + $event->advise_after(); + } +} diff --git a/inc/Debug/PropertyDeprecationHelper.php b/inc/Debug/PropertyDeprecationHelper.php new file mode 100644 index 0000000..7336679 --- /dev/null +++ b/inc/Debug/PropertyDeprecationHelper.php @@ -0,0 +1,133 @@ +deprecatePublicProperty( 'bar', '1.21', __CLASS__ ); + * } + * } + * + * $foo = new Foo; + * $foo->bar; // works but logs a warning + * + * Cannot be used with classes that have their own __get/__set methods. + * + */ +trait PropertyDeprecationHelper +{ + /** + * List of deprecated properties, in => format + * where is the the name of the class defining the property + * + * E.g. [ '_event' => '\dokuwiki\Cache\Cache' ] + * @var string[] + */ + protected $deprecatedPublicProperties = []; + + /** + * Mark a property as deprecated. Only use this for properties that used to be public and only + * call it in the constructor. + * + * @param string $property The name of the property. + * @param null $class name of the class defining the property + * @see DebugHelper::dbgDeprecatedProperty + */ + protected function deprecatePublicProperty( + $property, + $class = null + ) { + $this->deprecatedPublicProperties[$property] = $class ?: get_class($this); + } + + public function __get($name) + { + if (isset($this->deprecatedPublicProperties[$name])) { + $class = $this->deprecatedPublicProperties[$name]; + DebugHelper::dbgDeprecatedProperty($class, $name); + return $this->$name; + } + + $qualifiedName = get_class() . '::$' . $name; + if ($this->deprecationHelperGetPropertyOwner($name)) { + // Someone tried to access a normal non-public property. Try to behave like PHP would. + trigger_error("Cannot access non-public property $qualifiedName", E_USER_ERROR); + } else { + // Non-existing property. Try to behave like PHP would. + trigger_error("Undefined property: $qualifiedName", E_USER_NOTICE); + } + return null; + } + + public function __set($name, $value) + { + if (isset($this->deprecatedPublicProperties[$name])) { + $class = $this->deprecatedPublicProperties[$name]; + DebugHelper::dbgDeprecatedProperty($class, $name); + $this->$name = $value; + return; + } + + $qualifiedName = get_class() . '::$' . $name; + if ($this->deprecationHelperGetPropertyOwner($name)) { + // Someone tried to access a normal non-public property. Try to behave like PHP would. + trigger_error("Cannot access non-public property $qualifiedName", E_USER_ERROR); + } else { + // Non-existing property. Try to behave like PHP would. + $this->$name = $value; + } + } + + /** + * Like property_exists but also check for non-visible private properties and returns which + * class in the inheritance chain declared the property. + * @param string $property + * @return string|bool Best guess for the class in which the property is defined. + */ + private function deprecationHelperGetPropertyOwner($property) + { + // Easy branch: check for protected property / private property of the current class. + if (property_exists($this, $property)) { + // The class name is not necessarily correct here but getting the correct class + // name would be expensive, this will work most of the time and getting it + // wrong is not a big deal. + return self::class; + } + // property_exists() returns false when the property does exist but is private (and not + // defined by the current class, for some value of "current" that differs slightly + // between engines). + // Since PHP triggers an error on public access of non-public properties but happily + // allows public access to undefined properties, we need to detect this case as well. + // Reflection is slow so use array cast hack to check for that: + $obfuscatedProps = array_keys((array)$this); + $obfuscatedPropTail = "\0$property"; + foreach ($obfuscatedProps as $obfuscatedProp) { + // private props are in the form \0\0 + if (strpos($obfuscatedProp, $obfuscatedPropTail, 1) !== false) { + $classname = substr($obfuscatedProp, 1, -strlen($obfuscatedPropTail)); + if ($classname === '*') { + // sanity; this shouldn't be possible as protected properties were handled earlier + $classname = self::class; + } + return $classname; + } + } + return false; + } +} diff --git a/inc/DifferenceEngine.php b/inc/DifferenceEngine.php new file mode 100644 index 0000000..1ec3230 --- /dev/null +++ b/inc/DifferenceEngine.php @@ -0,0 +1,1568 @@ + + * @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 + */ +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 { + + /** @var array */ + protected $_lines; + + /** @var string */ + protected $_line; + + /** @var string */ + protected $_group; + + /** @var string */ + protected $_tag; + + function __construct() { + $this->_lines = array(); + $this->_line = ''; + $this->_group = ''; + $this->_tag = ''; + } + + function _flushGroup($new_tag) { + if ($this->_group !== '') { + if ($this->_tag == 'mark') + $this->_line .= ''.$this->_escape($this->_group).''; + elseif ($this->_tag == 'add') + $this->_line .= ''.$this->_escape($this->_group).''; + elseif ($this->_tag == 'del') + $this->_line .= ''.$this->_escape($this->_group).''; + 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(' ','  ', $val); + $val = preg_replace('/ (?=<)|(?<=[ >]) /', ' ', $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 = ''.$l1.":\n". + ''.$l2.":\n". + "\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 '+'. + '' . $line.''; + } + + function deletedLine($line,$escaped=false) { + if (!$escaped){ + $line = $this->_escape($line); + } + return '-'. + '' . $line.''; + } + + function emptyLine() { + return ' '; + } + + function contextLine($line) { + return ' '. + ''.$this->_escape($line).''; + } + + function _added($lines) { + $this->_addedLines($lines,false); + } + + function _addedLines($lines,$escaped=false){ + foreach ($lines as $line) { + print('' . $this->emptyLine() . $this->addedLine($line,$escaped) . "\n"); + } + } + + function _deleted($lines) { + foreach ($lines as $line) { + print('' . $this->deletedLine($line) . $this->emptyLine() . "\n"); + } + } + + function _context($lines) { + foreach ($lines as $line) { + print('' . $this->contextLine($line) . $this->contextLine($line) . "\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('' . $this->deletedLine($line,true) . $this->addedLine($aline,true) . "\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(' ','  ', $val); + $val = preg_replace('/ (?=<)|(?<=[ >]) /', ' ', $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 = '@@ '.$lang['line']." -$xbeg +$ybeg @@"; + $r .= ' '.$lang['deleted'].''; + $r .= ' '.$lang['created'].''; + $r .= "\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(' '. $this->_escape($line) . "\n"); + } + } + + function _deleted($lines) { + foreach ($lines as $line) { + print(' ' . $this->_escape($line) . "\n"); + } + } + + function _context($lines) { + foreach ($lines as $line) { + print(' '. $this->_escape($line) ."\n"); + } + } + + function _changed($orig, $closing) { + $diff = new InlineWordLevelDiff($orig, $closing); // this escapes the diff data + $add = $diff->inline(); + + foreach ($add as $line) + print(' '.$line."\n"); + } + + function _escape($str) { + return hsc($str); + } +} + +/** + * A class for computing three way diffs. + * + * @author Geoffrey T. Dairiki + */ +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 + * + * @access private + */ +class _Diff3_Op { + + /** @var array|mixed */ + protected $orig; + + /** @var array|mixed */ + protected $final1; + + /** @var array|mixed */ + protected $final2; + + /** @var array|mixed|false */ + protected $_merged; + + 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 + * + * @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 + * + * @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/inc/Draft.php b/inc/Draft.php new file mode 100644 index 0000000..4f108f6 --- /dev/null +++ b/inc/Draft.php @@ -0,0 +1,168 @@ +id = $ID; + $this->client = $client; + $this->cname = getCacheName("$client\n$ID", '.draft'); + if (file_exists($this->cname) && file_exists(wikiFN($ID))) { + if (filemtime($this->cname) < filemtime(wikiFN($ID))) { + // remove stale draft + $this->deleteDraft(); + } + } + } + + /** + * Get the filename for this draft (whether or not it exists) + * + * @return string + */ + public function getDraftFilename() + { + return $this->cname; + } + + /** + * Checks if this draft exists on the filesystem + * + * @return bool + */ + public function isDraftAvailable() + { + return file_exists($this->cname); + } + + /** + * Save a draft of a current edit session + * + * The draft will not be saved if + * - drafts are deactivated in the config + * - or the editarea is empty and there are no event handlers registered + * - or the event is prevented + * + * @triggers DRAFT_SAVE + * + * @return bool whether has the draft been saved + */ + public function saveDraft() + { + global $INPUT, $INFO, $EVENT_HANDLER, $conf; + if (!$conf['usedraft']) { + return false; + } + if ( + !$INPUT->post->has('wikitext') && + !$EVENT_HANDLER->hasHandlerForEvent('DRAFT_SAVE') + ) { + return false; + } + $draft = [ + 'id' => $this->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' => $this->client, + 'cname' => $this->cname, + 'errors' => [], + ]; + $event = new Event('DRAFT_SAVE', $draft); + if ($event->advise_before()) { + $draft['hasBeenSaved'] = io_saveFile($draft['cname'], serialize($draft)); + if ($draft['hasBeenSaved']) { + $INFO['draft'] = $draft['cname']; + } + } else { + $draft['hasBeenSaved'] = false; + } + $event->advise_after(); + + $this->errors = $draft['errors']; + + return $draft['hasBeenSaved']; + } + + /** + * Get the text from the draft file + * + * @throws \RuntimeException if the draft file doesn't exist + * + * @return string + */ + public function getDraftText() + { + if (!file_exists($this->cname)) { + throw new \RuntimeException( + "Draft for page $this->id and user $this->client doesn't exist at $this->cname." + ); + } + $draft = unserialize(io_readFile($this->cname, false)); + return cleanText(con($draft['prefix'], $draft['text'], $draft['suffix'], true)); + } + + /** + * Remove the draft from the filesystem + * + * Also sets $INFO['draft'] to null + */ + public function deleteDraft() + { + global $INFO; + @unlink($this->cname); + $INFO['draft'] = null; + } + + /** + * Get a formatted message stating when the draft was saved + * + * @return string + */ + public function getDraftMessage() + { + global $lang; + return $lang['draftdate'] . ' ' . dformat(filemtime($this->cname)); + } + + /** + * Retrieve the errors that occured when saving the draft + * + * @return array + */ + public function getErrors() + { + return $this->errors; + } + + /** + * Get the timestamp when this draft was saved + * + * @return int + */ + public function getDraftDate() + { + return filemtime($this->cname); + } +} diff --git a/inc/ErrorHandler.php b/inc/ErrorHandler.php new file mode 100644 index 0000000..bd21196 --- /dev/null +++ b/inc/ErrorHandler.php @@ -0,0 +1,205 @@ + 'E_ERROR', + 2 => 'E_WARNING', + 4 => 'E_PARSE', + 8 => 'E_NOTICE', + 16 => 'E_CORE_ERROR', + 32 => 'E_CORE_WARNING', + 64 => 'E_COMPILE_ERROR', + 128 => 'E_COMPILE_WARNING', + 256 => 'E_USER_ERROR', + 512 => 'E_USER_WARNING', + 1024 => 'E_USER_NOTICE', + 2048 => 'E_STRICT', + 4096 => 'E_RECOVERABLE_ERROR', + 8192 => 'E_DEPRECATED', + 16384 => 'E_USER_DEPRECATED', + ]; + + /** + * Register the default error handling + */ + public static function register() + { + if (!defined('DOKU_UNITTEST')) { + set_exception_handler([ErrorHandler::class, 'fatalException']); + register_shutdown_function([ErrorHandler::class, 'fatalShutdown']); + set_error_handler( + [ErrorHandler::class, 'errorHandler'], + E_WARNING | E_USER_ERROR | E_USER_WARNING | E_RECOVERABLE_ERROR + ); + } + } + + /** + * Default Exception handler to show a nice user message before dieing + * + * The exception is logged to the error log + * + * @param \Throwable $e + */ + public static function fatalException($e) + { + $plugin = self::guessPlugin($e); + $title = hsc(get_class($e) . ': ' . $e->getMessage()); + $msg = 'An unforeseen error has occured. This is most likely a bug somewhere.'; + if ($plugin) $msg .= ' It might be a problem in the ' . $plugin . ' plugin.'; + $logged = self::logException($e) + ? 'More info has been written to the DokuWiki error log.' + : $e->getFile() . ':' . $e->getLine(); + + echo << + +$title + +
+

$title

+

$msg

+

$logged

+
+ + +EOT; + } + + /** + * Convenience method to display an error message for the given Exception + * + * @param \Throwable $e + * @param string $intro + */ + public static function showExceptionMsg($e, $intro = 'Error!') + { + $msg = hsc($intro) . '
' . hsc(get_class($e) . ': ' . $e->getMessage()); + if (self::logException($e)) $msg .= '
More info is available in the error log.'; + msg($msg, -1); + } + + /** + * Last resort to handle fatal errors that still can't be caught + */ + public static function fatalShutdown() + { + $error = error_get_last(); + // Check if it's a core/fatal error, otherwise it's a normal shutdown + if ( + $error !== null && + in_array( + $error['type'], + [ + E_ERROR, + E_CORE_ERROR, + E_COMPILE_ERROR, + ] + ) + ) { + self::fatalException( + new FatalException($error['message'], 0, $error['type'], $error['file'], $error['line']) + ); + } + } + + /** + * Log the given exception to the error log + * + * @param \Throwable $e + * @return bool false if the logging failed + */ + public static function logException($e) + { + if ($e instanceof \ErrorException) { + $prefix = self::ERRORCODES[$e->getSeverity()]; + } else { + $prefix = get_class($e); + } + + return Logger::getInstance()->log( + $prefix . ': ' . $e->getMessage(), + $e->getTraceAsString(), + $e->getFile(), + $e->getLine() + ); + } + + /** + * Error handler to log non-exception errors + * + * @param int $errno + * @param string $errstr + * @param string $errfile + * @param int $errline + * @return bool + */ + public static function errorHandler($errno, $errstr, $errfile, $errline) + { + global $conf; + + // ignore supressed warnings + if (!(error_reporting() & $errno)) return false; + + $ex = new \ErrorException( + $errstr, + 0, + $errno, + $errfile, + $errline + ); + self::logException($ex); + + if ($ex->getSeverity() === E_WARNING && $conf['hidewarnings']) { + return true; + } + + return false; + } + + /** + * Checks the the stacktrace for plugin files + * + * @param \Throwable $e + * @return false|string + */ + protected static function guessPlugin($e) + { + if (preg_match('/lib\/plugins\/(\w+)\//', str_replace('\\', '/', $e->getFile()), $match)) { + return $match[1]; + } + + foreach ($e->getTrace() as $line) { + if ( + isset($line['class']) && + preg_match('/\w+?_plugin_(\w+)/', $line['class'], $match) + ) { + return $match[1]; + } + + if ( + isset($line['file']) && + preg_match('/lib\/plugins\/(\w+)\//', str_replace('\\', '/', $line['file']), $match) + ) { + return $match[1]; + } + } + + return false; + } +} diff --git a/inc/Exception/FatalException.php b/inc/Exception/FatalException.php new file mode 100644 index 0000000..c303511 --- /dev/null +++ b/inc/Exception/FatalException.php @@ -0,0 +1,10 @@ + + */ +abstract class ActionPlugin extends Plugin +{ + /** + * Registers a callback function for a given event + * + * @param EventHandler $controller + */ + abstract public function register(EventHandler $controller); +} diff --git a/inc/Extension/AdminPlugin.php b/inc/Extension/AdminPlugin.php new file mode 100644 index 0000000..099a836 --- /dev/null +++ b/inc/Extension/AdminPlugin.php @@ -0,0 +1,121 @@ + + */ +abstract class AdminPlugin extends Plugin +{ + /** + * Return the text that is displayed at the main admin menu + * (Default localized language string 'menu' is returned, override this function for setting another name) + * + * @param string $language language code + * @return string menu string + */ + public function getMenuText($language) + { + $menutext = $this->getLang('menu'); + if (!$menutext) { + $info = $this->getInfo(); + $menutext = $info['name'] . ' ...'; + } + return $menutext; + } + + /** + * Return the path to the icon being displayed in the main admin menu. + * By default it tries to find an 'admin.svg' file in the plugin directory. + * (Override this function for setting another image) + * + * Important: you have to return a single path, monochrome SVG icon! It has to be + * under 2 Kilobytes! + * + * We recommend icons from https://materialdesignicons.com/ or to use a matching + * style. + * + * @return string full path to the icon file + */ + public function getMenuIcon() + { + $plugin = $this->getPluginName(); + return DOKU_PLUGIN . $plugin . '/admin.svg'; + } + + /** + * Determine position in list in admin window + * Lower values are sorted up + * + * @return int + */ + public function getMenuSort() + { + return 1000; + } + + /** + * Carry out required processing + */ + public function handle() + { + // some plugins might not need this + } + + /** + * Output html of the admin page + */ + abstract public function html(); + + /** + * Checks if access should be granted to this admin plugin + * + * @return bool true if the current user may access this admin plugin + */ + public function isAccessibleByCurrentUser() + { + $data = []; + $data['instance'] = $this; + $data['hasAccess'] = false; + + $event = new Event('ADMINPLUGIN_ACCESS_CHECK', $data); + if ($event->advise_before()) { + if ($this->forAdminOnly()) { + $data['hasAccess'] = auth_isadmin(); + } else { + $data['hasAccess'] = auth_ismanager(); + } + } + $event->advise_after(); + + return $data['hasAccess']; + } + + /** + * Return true for access only by admins (config:superuser) or false if managers are allowed as well + * + * @return bool + */ + public function forAdminOnly() + { + return true; + } + + /** + * Return array with ToC items. Items can be created with the html_mktocitem() + * + * @see html_mktocitem() + * @see tpl_toc() + * + * @return array + */ + public function getTOC() + { + return []; + } +} diff --git a/inc/Extension/AuthPlugin.php b/inc/Extension/AuthPlugin.php new file mode 100644 index 0000000..4e889f9 --- /dev/null +++ b/inc/Extension/AuthPlugin.php @@ -0,0 +1,459 @@ + + * @author Jan Schumann + */ +abstract class AuthPlugin extends Plugin +{ + public $success = true; + + /** + * Possible things an auth backend module may be able to + * do. The things a backend can do need to be set to true + * in the constructor. + */ + protected $cando = [ + 'addUser' => false, // can Users be created? + 'delUser' => false, // can Users be deleted? + 'modLogin' => false, // can login names be changed? + 'modPass' => false, // can passwords be changed? + 'modName' => false, // can real names be changed? + 'modMail' => false, // can emails be changed? + 'modGroups' => false, // can groups be changed? + 'getUsers' => false, // can a (filtered) list of users be retrieved? + 'getUserCount' => false, // can the number of users be retrieved? + 'getGroups' => false, // can a list of available groups be retrieved? + 'external' => false, // does the module do external auth checking? + 'logout' => true, // can the user logout again? (eg. not possible with HTTP auth) + ]; + + /** + * Constructor. + * + * Carry out sanity checks to ensure the object is + * able to operate. Set capabilities in $this->cando + * array here + * + * For future compatibility, sub classes should always include a call + * to parent::__constructor() in their constructors! + * + * Set $this->success to false if checks fail + * + * @author Christopher Smith + */ + public function __construct() + { + // the base class constructor does nothing, derived class + // constructors do the real work + } + + /** + * Available Capabilities. [ DO NOT OVERRIDE ] + * + * For introspection/debugging + * + * @author Christopher Smith + * @return array + */ + public function getCapabilities() + { + return array_keys($this->cando); + } + + /** + * Capability check. [ DO NOT OVERRIDE ] + * + * Checks the capabilities set in the $this->cando array and + * some pseudo capabilities (shortcutting access to multiple + * ones) + * + * ususal capabilities start with lowercase letter + * shortcut capabilities start with uppercase letter + * + * @author Andreas Gohr + * @param string $cap the capability to check + * @return bool + */ + public function canDo($cap) + { + switch ($cap) { + case 'Profile': + // can at least one of the user's properties be changed? + return ($this->cando['modPass'] || + $this->cando['modName'] || + $this->cando['modMail']); + case 'UserMod': + // can at least anything be changed? + return ($this->cando['modPass'] || + $this->cando['modName'] || + $this->cando['modMail'] || + $this->cando['modLogin'] || + $this->cando['modGroups'] || + $this->cando['modMail']); + default: + // print a helping message for developers + if (!isset($this->cando[$cap])) { + msg("Check for unknown capability '$cap' - Do you use an outdated Plugin?", -1); + } + return $this->cando[$cap]; + } + } + + /** + * Trigger the AUTH_USERDATA_CHANGE event and call the modification function. [ DO NOT OVERRIDE ] + * + * You should use this function instead of calling createUser, modifyUser or + * deleteUsers directly. The event handlers can prevent the modification, for + * example for enforcing a user name schema. + * + * @author Gabriel Birke + * @param string $type Modification type ('create', 'modify', 'delete') + * @param array $params Parameters for the createUser, modifyUser or deleteUsers method. + * The content of this array depends on the modification type + * @return bool|null|int Result from the modification function or false if an event handler has canceled the action + */ + public function triggerUserMod($type, $params) + { + $validTypes = [ + 'create' => 'createUser', + 'modify' => 'modifyUser', + 'delete' => 'deleteUsers' + ]; + if (empty($validTypes[$type])) { + return false; + } + + $result = false; + $eventdata = ['type' => $type, 'params' => $params, 'modification_result' => null]; + $evt = new Event('AUTH_USER_CHANGE', $eventdata); + if ($evt->advise_before(true)) { + $result = call_user_func_array([$this, $validTypes[$type]], $evt->data['params']); + $evt->data['modification_result'] = $result; + } + $evt->advise_after(); + unset($evt); + return $result; + } + + /** + * Log off the current user [ OPTIONAL ] + * + * Is run in addition to the ususal logoff method. Should + * only be needed when trustExternal is implemented. + * + * @see auth_logoff() + * @author Andreas Gohr + */ + public function logOff() + { + } + + /** + * Do all authentication [ OPTIONAL ] + * + * Set $this->cando['external'] = true when implemented + * + * If this function is implemented it will be used to + * authenticate a user - all other DokuWiki internals + * will not be used for authenticating (except this + * function returns null, in which case, DokuWiki will + * still run auth_login as a fallback, which may call + * checkPass()). If this function is not returning null, + * implementing checkPass() is not needed here anymore. + * + * The function can be used to authenticate against third + * party cookies or Apache auth mechanisms and replaces + * the auth_login() function + * + * The function will be called with or without a set + * username. If the Username is given it was called + * from the login form and the given credentials might + * need to be checked. If no username was given it + * the function needs to check if the user is logged in + * by other means (cookie, environment). + * + * The function needs to set some globals needed by + * DokuWiki like auth_login() does. + * + * @see auth_login() + * @author Andreas Gohr + * + * @param string $user Username + * @param string $pass Cleartext Password + * @param bool $sticky Cookie should not expire + * @return bool true on successful auth, + * null on unknown result (fallback to checkPass) + */ + public function trustExternal($user, $pass, $sticky = false) + { + /* some example: + + global $USERINFO; + global $conf; + $sticky ? $sticky = true : $sticky = false; //sanity check + + // do the checking here + + // set the globals if authed + $USERINFO['name'] = 'FIXME'; + $USERINFO['mail'] = 'FIXME'; + $USERINFO['grps'] = array('FIXME'); + $_SERVER['REMOTE_USER'] = $user; + $_SESSION[DOKU_COOKIE]['auth']['user'] = $user; + $_SESSION[DOKU_COOKIE]['auth']['pass'] = $pass; + $_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO; + return true; + + */ + } + + /** + * Check user+password [ MUST BE OVERRIDDEN ] + * + * Checks if the given user exists and the given + * plaintext password is correct + * + * May be ommited if trustExternal is used. + * + * @author Andreas Gohr + * @param string $user the user name + * @param string $pass the clear text password + * @return bool + */ + public function checkPass($user, $pass) + { + msg("no valid authorisation system in use", -1); + return false; + } + + /** + * Return user info [ MUST BE OVERRIDDEN ] + * + * Returns info about the given user needs to contain + * at least these fields: + * + * name string full name of the user + * mail string email address of the user + * grps array list of groups the user is in + * + * @author Andreas Gohr + * @param string $user the user name + * @param bool $requireGroups whether or not the returned data must include groups + * @return false|array containing user data or false + */ + public function getUserData($user, $requireGroups = true) + { + if (!$this->cando['external']) msg("no valid authorisation system in use", -1); + return false; + } + + /** + * Create a new User [implement only where required/possible] + * + * Returns false if the user already exists, null when an error + * occurred and true if everything went well. + * + * The new user HAS TO be added to the default group by this + * function! + * + * Set addUser capability when implemented + * + * @author Andreas Gohr + * @param string $user + * @param string $pass + * @param string $name + * @param string $mail + * @param null|array $grps + * @return bool|null + */ + public function createUser($user, $pass, $name, $mail, $grps = null) + { + msg("authorisation method does not allow creation of new users", -1); + return null; + } + + /** + * Modify user data [implement only where required/possible] + * + * Set the mod* capabilities according to the implemented features + * + * @author Chris Smith + * @param string $user nick of the user to be changed + * @param array $changes array of field/value pairs to be changed (password will be clear text) + * @return bool + */ + public function modifyUser($user, $changes) + { + msg("authorisation method does not allow modifying of user data", -1); + return false; + } + + /** + * Delete one or more users [implement only where required/possible] + * + * Set delUser capability when implemented + * + * @author Chris Smith + * @param array $users + * @return int number of users deleted + */ + public function deleteUsers($users) + { + msg("authorisation method does not allow deleting of users", -1); + return 0; + } + + /** + * Return a count of the number of user which meet $filter criteria + * [should be implemented whenever retrieveUsers is implemented] + * + * Set getUserCount capability when implemented + * + * @author Chris Smith + * @param array $filter array of field/pattern pairs, empty array for no filter + * @return int + */ + public function getUserCount($filter = []) + { + msg("authorisation method does not provide user counts", -1); + return 0; + } + + /** + * Bulk retrieval of user data [implement only where required/possible] + * + * Set getUsers capability when implemented + * + * @author Chris Smith + * @param int $start index of first user to be returned + * @param int $limit max number of users to be returned, 0 for unlimited + * @param array $filter array of field/pattern pairs, null for no filter + * @return array list of userinfo (refer getUserData for internal userinfo details) + */ + public function retrieveUsers($start = 0, $limit = 0, $filter = null) + { + msg("authorisation method does not support mass retrieval of user data", -1); + return []; + } + + /** + * Define a group [implement only where required/possible] + * + * Set addGroup capability when implemented + * + * @author Chris Smith + * @param string $group + * @return bool + */ + public function addGroup($group) + { + msg("authorisation method does not support independent group creation", -1); + return false; + } + + /** + * Retrieve groups [implement only where required/possible] + * + * Set getGroups capability when implemented + * + * @author Chris Smith + * @param int $start + * @param int $limit + * @return array + */ + public function retrieveGroups($start = 0, $limit = 0) + { + msg("authorisation method does not support group list retrieval", -1); + return []; + } + + /** + * Return case sensitivity of the backend [OPTIONAL] + * + * When your backend is caseinsensitive (eg. you can login with USER and + * user) then you need to overwrite this method and return false + * + * @return bool + */ + public function isCaseSensitive() + { + return true; + } + + /** + * Sanitize a given username [OPTIONAL] + * + * This function is applied to any user name that is given to + * the backend and should also be applied to any user name within + * the backend before returning it somewhere. + * + * This should be used to enforce username restrictions. + * + * @author Andreas Gohr + * @param string $user username + * @return string the cleaned username + */ + public function cleanUser($user) + { + return $user; + } + + /** + * Sanitize a given groupname [OPTIONAL] + * + * This function is applied to any groupname that is given to + * the backend and should also be applied to any groupname within + * the backend before returning it somewhere. + * + * This should be used to enforce groupname restrictions. + * + * Groupnames are to be passed without a leading '@' here. + * + * @author Andreas Gohr + * @param string $group groupname + * @return string the cleaned groupname + */ + public function cleanGroup($group) + { + return $group; + } + + /** + * Check Session Cache validity [implement only where required/possible] + * + * DokuWiki caches user info in the user's session for the timespan defined + * in $conf['auth_security_timeout']. + * + * This makes sure slow authentication backends do not slow down DokuWiki. + * This also means that changes to the user database will not be reflected + * on currently logged in users. + * + * To accommodate for this, the user manager plugin will touch a reference + * file whenever a change is submitted. This function compares the filetime + * of this reference file with the time stored in the session. + * + * This reference file mechanism does not reflect changes done directly in + * the backend's database through other means than the user manager plugin. + * + * Fast backends might want to return always false, to force rechecks on + * each page load. Others might want to use their own checking here. If + * unsure, do not override. + * + * @param string $user - The username + * @author Andreas Gohr + * @return bool + */ + public function useSessionCache($user) + { + global $conf; + return ($_SESSION[DOKU_COOKIE]['auth']['time'] >= @filemtime($conf['cachedir'] . '/sessionpurge')); + } +} diff --git a/inc/Extension/CLIPlugin.php b/inc/Extension/CLIPlugin.php new file mode 100644 index 0000000..e06e87d --- /dev/null +++ b/inc/Extension/CLIPlugin.php @@ -0,0 +1,15 @@ +name = $name; + $this->data =& $data; + } + + /** + * @return string + */ + public function __toString() + { + return $this->name; + } + + /** + * advise all registered BEFORE 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 dokuwiki\Plugin\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->runDefault + */ + public function advise_before($enablePreventDefault = true) + { + global $EVENT_HANDLER; + + $this->canPreventDefault = $enablePreventDefault; + if ($EVENT_HANDLER !== null) { + $EVENT_HANDLER->process_event($this, 'BEFORE'); + } else { + Logger::getInstance(Logger::LOG_DEBUG) + ->log($this->name . ':BEFORE event triggered before event system was initialized'); + } + + return (!$enablePreventDefault || $this->runDefault); + } + + /** + * advise all registered AFTER handlers of this event + * + * @param bool $enablePreventDefault + * @see advise_before() for details + */ + public function advise_after() + { + global $EVENT_HANDLER; + + $this->mayContinue = true; + + if ($EVENT_HANDLER !== null) { + $EVENT_HANDLER->process_event($this, 'AFTER'); + } else { + Logger::getInstance(Logger::LOG_DEBUG)-> + log($this->name . ':AFTER event triggered before event system was initialized'); + } + } + + /** + * trigger + * + * - advise all registered (_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 (_AFTER) handlers that the event has taken place + * + * @param null|callable $action + * @param bool $enablePrevent + * @return mixed $event->results + * the value set by any _before or handlers if the default action is prevented + * or the results of the default action (as modified by _after handlers) + * or NULL no action took place and no handler modified the value + */ + public function trigger($action = null, $enablePrevent = true) + { + + if (!is_callable($action)) { + $enablePrevent = false; + if ($action !== null) { + 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)) { + $this->result = call_user_func_array($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->mayContinue = false; + } + + /** + * may the event propagate to the next handler? + * + * @return bool + */ + public function mayPropagate() + { + return $this->mayContinue; + } + + /** + * preventDefault + * + * prevent the default action taking place + */ + public function preventDefault() + { + $this->runDefault = false; + } + + /** + * should the default action be executed? + * + * @return bool + */ + public function mayRunDefault() + { + return $this->runDefault; + } + + /** + * Convenience method to trigger an event + * + * Creates, triggers and destroys an event in one go + * + * @param string $name name for the event + * @param mixed $data event data + * @param callable $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 + */ + public static function createAndTrigger($name, &$data, $action = null, $canPreventDefault = true) + { + $evt = new Event($name, $data); + return $evt->trigger($action, $canPreventDefault); + } +} diff --git a/inc/Extension/EventHandler.php b/inc/Extension/EventHandler.php new file mode 100644 index 0000000..cc537d3 --- /dev/null +++ b/inc/Extension/EventHandler.php @@ -0,0 +1,119 @@ +register($this); + } + } + + /** + * register_hook + * + * register a hook for an event + * + * @param string $event name used by the event + * @param string $advise BEFORE|AFTER + * @param object $obj scope for the method be executed on, NULL for global function or callable + * @param string|callable $method event handler function + * @param mixed $param data passed to the event handler + * @param int $seq sequence number for ordering hook execution (ascending) + */ + public 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][] = [$obj, $method, $param]; + + if ($doSort) { + ksort($this->hooks[$event . '_' . $advise]); + } + } + + /** + * process the before/after event + * + * @param Event $event + * @param string $advise BEFORE or AFTER + */ + public 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) { + [$obj, $method, $param] = $hook; + + if ($obj === null) { + $method($event, $param); + } else { + $obj->$method($event, $param); + } + + if (!$event->mayPropagate()) return; + } + } + } + } + + /** + * Check if an event has any registered handlers + * + * When $advise is empty, both BEFORE and AFTER events will be considered, + * otherwise only the given advisory is checked + * + * @param string $name Name of the event + * @param string $advise BEFORE, AFTER or empty + * @return bool + */ + public function hasHandlerForEvent($name, $advise = '') + { + if ($advise) { + return isset($this->hooks[$name . '_' . $advise]); + } + + return isset($this->hooks[$name . '_BEFORE']) || isset($this->hooks[$name . '_AFTER']); + } + + /** + * Get all hooks and their currently registered handlers + * + * The handlers are sorted by sequence, then by register time + * + * @return array + */ + public function getEventHandlers() + { + return $this->hooks; + } +} diff --git a/inc/Extension/Plugin.php b/inc/Extension/Plugin.php new file mode 100644 index 0000000..03637fe --- /dev/null +++ b/inc/Extension/Plugin.php @@ -0,0 +1,13 @@ + + */ +class PluginController +{ + /** @var array the types of plugins DokuWiki supports */ + public const PLUGIN_TYPES = ['auth', 'admin', 'syntax', 'action', 'renderer', 'helper', 'remote', 'cli']; + + protected $listByType = []; + /** @var array all installed plugins and their enabled state [plugin=>enabled] */ + protected $masterList = []; + protected $pluginCascade = ['default' => [], 'local' => [], 'protected' => []]; + protected $lastLocalConfigFile = ''; + + /** + * Populates the master list of plugins + */ + public function __construct() + { + $this->loadConfig(); + $this->populateMasterList(); + $this->initAutoloaders(); + } + + /** + * 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 + */ + public function getList($type = '', $all = false) + { + + // request the complete list + if (!$type) { + return $all ? array_keys($this->masterList) : array_keys(array_filter($this->masterList)); + } + + if (!isset($this->listByType[$type]['enabled'])) { + $this->listByType[$type]['enabled'] = $this->getListByType($type, true); + } + if ($all && !isset($this->listByType[$type]['disabled'])) { + $this->listByType[$type]['disabled'] = $this->getListByType($type, false); + } + + return $all + ? array_merge($this->listByType[$type]['enabled'], $this->listByType[$type]['disabled']) + : $this->listByType[$type]['enabled']; + } + + /** + * Loads the given plugin and creates an object of it + * + * @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 PluginInterface|null the plugin object or null on failure + * @author Andreas Gohr + * + */ + public function load($type, $name, $new = false, $disabled = false) + { + + //we keep all loaded plugins available in global scope for reuse + global $DOKU_PLUGINS; + + [$plugin, /* component */ ] = $this->splitName($name); + + // check if disabled + if (!$disabled && !$this->isEnabled($plugin)) { + return null; + } + + $class = $type . '_plugin_' . $name; + + try { + //plugin already loaded? + if (!empty($DOKU_PLUGINS[$type][$name])) { + if ($new || !$DOKU_PLUGINS[$type][$name]->isSingleton()) { + return class_exists($class, true) ? new $class() : null; + } + + return $DOKU_PLUGINS[$type][$name]; + } + + //construct class and instantiate + if (!class_exists($class, true)) { + # the plugin might be in the wrong directory + $inf = confToHash(DOKU_PLUGIN . "$plugin/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(); + } catch (\Throwable $e) { + ErrorHandler::showExceptionMsg($e, sprintf('Failed to load plugin %s', $plugin)); + return null; + } + + return $DOKU_PLUGINS[$type][$name]; + } + + /** + * Whether plugin is disabled + * + * @param string $plugin name of plugin + * @return bool true disabled, false enabled + * @deprecated in favor of the more sensible isEnabled where the return value matches the enabled state + */ + public function isDisabled($plugin) + { + dbg_deprecated('isEnabled()'); + return !$this->isEnabled($plugin); + } + + /** + * Check whether plugin is disabled + * + * @param string $plugin name of plugin + * @return bool true enabled, false disabled + */ + public function isEnabled($plugin) + { + return !empty($this->masterList[$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->pluginCascade['protected'])) return false; + $this->masterList[$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->pluginCascade['protected'])) return false; + $this->masterList[$plugin] = 1; + return $this->saveList(); + } + + /** + * Returns cascade of the config files + * + * @return array with arrays of plugin configs + */ + public function getCascade() + { + return $this->pluginCascade; + } + + /** + * Read all installed plugins and their current enabled state + */ + protected function populateMasterList() + { + if ($dh = @opendir(DOKU_PLUGIN)) { + $all_plugins = []; + 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->masterList) && $this->masterList[$plugin] == 0) { + $all_plugins[$plugin] = 0; + } elseif (array_key_exists($plugin, $this->masterList) && $this->masterList[$plugin] == 1) { + $all_plugins[$plugin] = 1; + } else { + $all_plugins[$plugin] = 1; + } + } + $this->masterList = $all_plugins; + if (!file_exists($this->lastLocalConfigFile)) { + $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 = []; + 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->masterList)) return false; + + // Rebuild list of local settings + $local_plugins = $this->rebuildLocal(); + if ($local_plugins != $this->pluginCascade['local'] || $forceSave) { + $file = $this->lastLocalConfigFile; + $out = " $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 ($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->masterList; + //Can't do anything about protected one so rule them out completely + $local_default = array_diff_key($backup, $this->pluginCascade['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->pluginCascade['default']); + //The ones which we are sure of (list of 0s not in default) + $sure_plugins = array_filter($diffed_ones, [$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->pluginCascade['default'])); + } + + /** + * Build the list of plugins and cascade + * + */ + protected function loadConfig() + { + global $config_cascade; + foreach (['default', 'protected'] as $type) { + if (array_key_exists($type, $config_cascade['plugins'])) { + $this->pluginCascade[$type] = $this->checkRequire($config_cascade['plugins'][$type]); + } + } + $local = $config_cascade['plugins']['local']; + $this->lastLocalConfigFile = array_pop($local); + $this->pluginCascade['local'] = $this->checkRequire([$this->lastLocalConfigFile]); + $this->pluginCascade['default'] = array_merge( + $this->pluginCascade['default'], + $this->checkRequire($local) + ); + $this->masterList = array_merge( + $this->pluginCascade['default'], + $this->pluginCascade['local'], + $this->pluginCascade['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->masterList)) + : array_keys(array_filter($this->masterList, [$this, 'negate'])); + $plugins = []; + + foreach ($master_list as $plugin) { + if (file_exists(DOKU_PLUGIN . "$plugin/$type.php")) { + $plugins[] = $plugin; + continue; + } + + $typedir = DOKU_PLUGIN . "$plugin/$type/"; + if (is_dir($typedir)) { + if ($dp = opendir($typedir)) { + while (false !== ($component = readdir($dp))) { + if ( + str_starts_with($component, '.') || + !str_ends_with(strtolower($component), '.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 (!isset($this->masterList[$name])) { + return sexplode('_', $name, 2, ''); + } + + return [$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; + } + + /** + * Initialize vendor autoloaders for all plugins that have them + */ + protected function initAutoloaders() + { + $plugins = $this->getList(); + foreach ($plugins as $plugin) { + if (file_exists(DOKU_PLUGIN . $plugin . '/vendor/autoload.php')) { + try { + require_once(DOKU_PLUGIN . $plugin . '/vendor/autoload.php'); + } catch (\Throwable $e) { + ErrorHandler::showExceptionMsg($e, sprintf('Failed to init plugin %s autoloader', $plugin)); + } + } + } + } +} diff --git a/inc/Extension/PluginInterface.php b/inc/Extension/PluginInterface.php new file mode 100644 index 0000000..b5ded25 --- /dev/null +++ b/inc/Extension/PluginInterface.php @@ -0,0 +1,159 @@ + + */ +interface 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 + * + * @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 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/inc/Extension/PluginTrait.php b/inc/Extension/PluginTrait.php new file mode 100644 index 0000000..2117534 --- /dev/null +++ b/inc/Extension/PluginTrait.php @@ -0,0 +1,280 @@ +getLang() + protected $configloaded = false; // set to true by loadConfig() after loading plugin configuration variables + protected $conf = []; // array to hold plugin settings, best accessed via ->getConf() + + /** + * @see PluginInterface::getInfo() + */ + public function getInfo() + { + $class = get_class($this); + $parts = sexplode('_', $class, 3); + $ext = $parts[2]; + + if (empty($ext)) { + throw new \RuntimeException('Class does not follow the plugin naming convention'); + } + + // class like action_plugin_myplugin_ajax belongs to plugin 'myplugin' + $ext = strtok($ext, '_'); + + $base = [ + 'base' => $ext, + 'author' => 'Unknown', + 'email' => 'unknown@example.com', + 'date' => '0000-00-00', + 'name' => $ext . ' plugin', + 'desc' => 'Unknown purpose - bad plugin.info.txt', + 'url' => 'https://www.dokuwiki.org/plugins/' . $ext, + ]; + + $file = DOKU_PLUGIN . '/' . $ext . '/plugin.info.txt'; + if (file_exists($file)) { + $raw = confToHash($file); + + // check if all required fields are present + $msg = 'Extension %s does not provide a valid %s in %s'; + foreach (array_keys($base) as $line) { + if (empty($raw[$line])) Logger::error(sprintf($msg, $ext, $line, $file)); + } + + return array_merge($base, $raw); + } + + Logger::error(sprintf('Extension %s does not provide a plugin.info.txt in %s', $ext, $file)); + return $base; + } + + /** + * @see PluginInterface::isSingleton() + */ + public function isSingleton() + { + return true; + } + + /** + * @see 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 PluginInterface::getPluginType() + */ + public function getPluginType() + { + [$t] = explode('_', get_class($this), 2); + return $t; + } + + /** + * @see PluginInterface::getPluginName() + */ + public function getPluginName() + { + [/* t */, /* p */, $n] = sexplode('_', get_class($this), 4, ''); + return $n; + } + + /** + * @see PluginInterface::getPluginComponent() + */ + public function getPluginComponent() + { + [/* t */, /* p */, /* n */, $c] = sexplode('_', get_class($this), 4, ''); + return $c; + } + + // endregion + // region localization methods + + /** + * @see PluginInterface::getLang() + */ + public function getLang($id) + { + if (!$this->localised) $this->setupLocale(); + + return ($this->lang[$id] ?? ''); + } + + /** + * @see PluginInterface::locale_xhtml() + */ + public function locale_xhtml($id) + { + return p_cached_output($this->localFN($id)); + } + + /** + * @see 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 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 = []; + + // 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 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 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 = []; + + if (file_exists($path . 'default.php')) { + include($path . 'default.php'); + } + + return $conf; + } + + // endregion + // region output methods + + /** + * @see PluginInterface::email() + */ + public function email($email, $name = '', $class = '', $more = '') + { + if (!$email) return $name; + $email = obfuscate($email); + if (!$name) $name = $email; + $class = "class='" . ($class ?: 'mail') . "'"; + return "$name"; + } + + /** + * @see 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 "$title"; + } + + /** + * @see PluginInterface::render_text() + */ + public function render_text($text, $format = 'xhtml') + { + return p_render($format, p_get_instructions($text), $info); + } + + // endregion +} diff --git a/inc/Extension/RemotePlugin.php b/inc/Extension/RemotePlugin.php new file mode 100644 index 0000000..7f0909d --- /dev/null +++ b/inc/Extension/RemotePlugin.php @@ -0,0 +1,79 @@ +api = new Api(); + } + + /** + * Get all available methods with remote access. + * + * By default it exports all public methods of a remote plugin. Methods beginning + * with an underscore are skipped. + * + * @return ApiCall[] Information about all provided methods. ('methodname' => ApiCall) + * @throws ReflectionException + */ + public function getMethods() + { + $result = []; + + $reflection = new \ReflectionClass($this); + foreach ($reflection->getMethods(ReflectionMethod::IS_PUBLIC) as $method) { + // skip parent methods, only methods further down are exported + $declaredin = $method->getDeclaringClass()->name; + if ($declaredin === 'dokuwiki\Extension\Plugin' || $declaredin === 'dokuwiki\Extension\RemotePlugin') { + continue; + } + $method_name = $method->name; + if ($method_name[0] === '_') { + continue; + } + if ($method_name === 'getMethods') { + continue; // skip self, if overridden + } + + // add to result + $result[$method_name] = new ApiCall([$this, $method_name], 'plugins'); + } + + return $result; + } + + /** + * @deprecated 2023-11-30 + */ + public function _getMethods() + { + dbg_deprecated('getMethods()'); + } + + + + /** + * @return Api + */ + protected function getApi() + { + return $this->api; + } +} diff --git a/inc/Extension/SyntaxPlugin.php b/inc/Extension/SyntaxPlugin.php new file mode 100644 index 0000000..0f362e7 --- /dev/null +++ b/inc/Extension/SyntaxPlugin.php @@ -0,0 +1,131 @@ + + */ +abstract class SyntaxPlugin extends Plugin +{ + protected $allowedModesSetup = false; + + /** + * Syntax Type + * + * Needs to return one of the mode types defined in $PARSER_MODES in Parser.php + * + * @return string + */ + abstract public function getType(); + + /** + * Allowed Mode Types + * + * Defines the mode types for other dokuwiki markup that maybe nested within the + * plugin's own markup. Needs to return an array of one or more of the mode types + * defined in $PARSER_MODES in Parser.php + * + * @return array + */ + public function getAllowedTypes() + { + return []; + } + + /** + * Paragraph Type + * + * Defines how this syntax is handled regarding paragraphs. This is important + * for correct XHTML nesting. Should return one of the following: + * + * 'normal' - The plugin can be used inside paragraphs + * 'block' - Open paragraphs need to be closed before plugin output + * 'stack' - Special case. Plugin wraps other paragraphs. + * + * @see Doku_Handler_Block + * + * @return string + */ + public function getPType() + { + return 'normal'; + } + + /** + * Handler to prepare matched data for the rendering process + * + * This function can only pass data to render() via its return value - render() + * may be not be run during the object's current life. + * + * Usually you should only need the $match param. + * + * @param string $match The text matched by the patterns + * @param int $state The lexer state for the match + * @param int $pos The character position of the matched text + * @param Doku_Handler $handler The Doku_Handler object + * @return bool|array Return an array with all data you want to use in render, false don't add an instruction + */ + abstract public function handle($match, $state, $pos, Doku_Handler $handler); + + /** + * Handles the actual output creation. + * + * The function must not assume any other of the classes methods have been run + * during the object's current life. The only reliable data it receives are its + * parameters. + * + * The function should always check for the given output format and return false + * when a format isn't supported. + * + * $renderer contains a reference to the renderer object which is + * currently handling the rendering. You need to use it for writing + * the output. How this is done depends on the renderer used (specified + * by $format + * + * The contents of the $data array depends on what the handler() function above + * created + * + * @param string $format output format being rendered + * @param Doku_Renderer $renderer the current renderer object + * @param array $data data created by handler() + * @return boolean rendered correctly? (however, returned value is not used at the moment) + */ + abstract public function render($format, Doku_Renderer $renderer, $data); + + /** + * There should be no need to override this function + * + * @param string $mode + * @return bool + */ + public function accepts($mode) + { + + if (!$this->allowedModesSetup) { + global $PARSER_MODES; + + $allowedModeTypes = $this->getAllowedTypes(); + foreach ($allowedModeTypes as $mt) { + $this->allowedModes = array_merge($this->allowedModes, $PARSER_MODES[$mt]); + } + + $idx = array_search(substr(get_class($this), 7), (array)$this->allowedModes, true); + if ($idx !== false) { + unset($this->allowedModes[$idx]); + } + $this->allowedModesSetup = true; + } + + return parent::accepts($mode); + } +} diff --git a/inc/Feed/FeedCreator.php b/inc/Feed/FeedCreator.php new file mode 100644 index 0000000..a767a64 --- /dev/null +++ b/inc/Feed/FeedCreator.php @@ -0,0 +1,232 @@ +options = $options; + + $this->feed = new \UniversalFeedCreator(); + $this->feed->title = $this->options->get('title'); + $this->feed->description = $this->options->get('subtitle'); + $this->feed->link = DOKU_URL; + $this->feed->syndicationURL = DOKU_URL . 'feed.php'; + $this->feed->cssStyleSheet = DOKU_URL . 'lib/exe/css.php?s=feed'; + + $this->initLogo(); + } + + /** + * Build the feed + * + * @return string The raw XML for the feed + */ + public function build() + { + switch ($this->options->get('feed_mode')) { + case 'list': + $items = $this->fetchItemsFromNamespace(); + break; + case 'search': + $items = $this->fetchItemsFromSearch(); + break; + case 'recent': + $items = $this->fetchItemsFromRecentChanges(); + break; + default: + $items = $this->fetchItemsFromPlugin(); + } + + $eventData = [ + 'rss' => $this->feed, + 'data' => &$items, + 'opt' => &$this->options->options, + ]; + $event = new Event('FEED_DATA_PROCESS', $eventData); + if ($event->advise_before(false)) { + foreach ($items as $item) { + $this->createAndAddItem($item); + } + } + $event->advise_after(); + + return $this->feed->createFeed($this->options->getType()); + } + + /** + * Process the raw data, create feed item and add it to the feed + * + * @param array|string $data raw item data + * @return \FeedItem + * @triggers FEED_ITEM_ADD + */ + protected function createAndAddItem($data) + { + if (is_string($data)) { + $data = ['id' => $data]; + } + + if (($data['mode'] ?? '') == 'media' || isset($data['media'])) { + $data['id'] = $data['media'] ?? $data['id']; + $proc = new FeedMediaProcessor($data); + } else { + $proc = new FeedPageProcessor($data); + } + + $item = new \FeedItem(); + $item->title = $proc->getTitle(); + if ($this->options->get('show_summary') && $proc->getSummary()) { + $item->title .= ' - ' . $proc->getSummary(); + } + $item->date = $proc->getRev(); + [$item->authorEmail, $item->author] = $proc->getAuthor(); + $item->link = $proc->getURL($this->options->get('link_to')); + $item->description = $proc->getBody($this->options->get('item_content')); + + $evdata = [ + 'item' => $item, + 'opt' => &$this->options->options, + 'ditem' => &$data, + 'rss' => $this->feed, + ]; + + $evt = new Event('FEED_ITEM_ADD', $evdata); + if ($evt->advise_before()) { + $this->feed->addItem($item); + } + $evt->advise_after(); + + return $item; + } + + /** + * Read all pages from a namespace + * + * @todo this currently does not honor the rss_media setting and only ever lists pages + * @return array + */ + protected function fetchItemsFromNamespace() + { + global $conf; + + $ns = ':' . cleanID($this->options->get('namespace')); + $ns = utf8_encodeFN(str_replace(':', '/', $ns)); + + $data = []; + $search_opts = [ + 'depth' => 1, + 'pagesonly' => true, + 'listfiles' => true + ]; + search( + $data, + $conf['datadir'], + 'search_universal', + $search_opts, + $ns, + $lvl = 1, + $this->options->get('sort') + ); + + return $data; + } + + /** + * Add the result of a full text search to the feed object + * + * @return array + */ + protected function fetchItemsFromSearch() + { + if (!actionOK('search')) throw new \RuntimeException('search is disabled'); + if (!$this->options->get('search_query')) return []; + + $data = ft_pageSearch($this->options->get('search_query'), $poswords); + return array_keys($data); + } + + /** + * Add recent changed pages to the feed object + * + * @return array + */ + protected function fetchItemsFromRecentChanges() + { + global $conf; + $flags = 0; + if (!$this->options->get('show_deleted')) $flags += RECENTS_SKIP_DELETED; + if (!$this->options->get('show_minor')) $flags += RECENTS_SKIP_MINORS; + if ($this->options->get('only_new')) $flags += RECENTS_ONLY_CREATION; + if ($this->options->get('content_type') == 'media' && $conf['mediarevisions']) { + $flags += RECENTS_MEDIA_CHANGES; + } + if ($this->options->get('content_type') == 'both' && $conf['mediarevisions']) { + $flags += RECENTS_MEDIA_PAGES_MIXED; + } + + return getRecents(0, $this->options->get('items'), $this->options->get('namespace'), $flags); + } + + /** + * Add items from a plugin to the feed object + * + * @triggers FEED_MODE_UNKNOWN + * @return array + */ + protected function fetchItemsFromPlugin() + { + $eventData = [ + 'opt' => $this->options->options, + 'data' => [], + ]; + $event = new Event('FEED_MODE_UNKNOWN', $eventData); + if ($event->advise_before(true)) { + throw new \RuntimeException('unknown feed mode'); + } + $event->advise_after(); + + return $eventData['data']; + } + + /** + * Add a logo to the feed + * + * Looks at different possible candidates for a logo and adds the first one + * + * @return void + */ + protected function initLogo() + { + global $conf; + + $this->feed->image = new \FeedImage(); + $this->feed->image->title = $conf['title']; + $this->feed->image->link = DOKU_URL; + $this->feed->image->url = tpl_getMediaFile([ + ':wiki:logo.svg', + ':logo.svg', + ':wiki:logo.png', + ':logo.png', + ':wiki:logo.jpg', + ':logo.jpg', + ':wiki:favicon.ico', + ':favicon.ico', + ':wiki:dokuwiki.svg', + ':wiki:dokuwiki-128.png', + 'images/favicon.ico' + ], true); + } +} diff --git a/inc/Feed/FeedCreatorOptions.php b/inc/Feed/FeedCreatorOptions.php new file mode 100644 index 0000000..7ccb1e4 --- /dev/null +++ b/inc/Feed/FeedCreatorOptions.php @@ -0,0 +1,161 @@ + [ + 'name' => 'RSS0.91', + 'mime' => 'text/xml; charset=utf-8', + ], + 'rss1' => [ + 'name' => 'RSS1.0', + 'mime' => 'text/xml; charset=utf-8', + ], + 'rss2' => [ + 'name' => 'RSS2.0', + 'mime' => 'text/xml; charset=utf-8', + ], + 'atom' => [ + 'name' => 'ATOM0.3', + 'mime' => 'application/xml; charset=utf-8', + ], + 'atom1' => [ + 'name' => 'ATOM1.0', + 'mime' => 'application/atom+xml; charset=utf-8', + ], + ]; + + /** @var array[] the set options */ + public $options = [ + 'type' => 'rss', + 'feed_mode' => 'recent', + 'link_to' => 'page', + 'item_content' => 'diff', + 'namespace' => '', + 'items' => 15, + 'show_minor' => false, + 'show_deleted' => false, + 'show_summary' => false, + 'only_new' => false, + 'sort' => 'natural', + 'search_query' => '', + 'content_type' => 'pages', + 'guardmail' => 'none', + 'title' => '', + ]; + + /** + * Initialize the options from the request, falling back to config defaults + * + * @triggers FEED_OPTS_POSTPROCESS + * @param array $options additional options to set (for testing) + */ + public function __construct($options = []) + { + global $conf; + global $INPUT; + + $this->options['type'] = $INPUT->valid( + 'type', + array_keys($this->types), + $conf['rss_type'] + ); + // we only support 'list', 'search', 'recent' but accept anything so plugins can take over + $this->options['feed_mode'] = $INPUT->str('mode', 'recent'); + $this->options['link_to'] = $INPUT->valid( + 'linkto', + ['diff', 'page', 'rev', 'current'], + $conf['rss_linkto'] + ); + $this->options['item_content'] = $INPUT->valid( + 'content', + ['abstract', 'diff', 'htmldiff', 'html'], + $conf['rss_content'] + ); + $this->options['namespace'] = $INPUT->filter('cleanID')->str('ns'); + $this->options['items'] = max(0, $INPUT->int('num', $conf['recent'])); + $this->options['show_minor'] = $INPUT->bool('minor'); + $this->options['show_deleted'] = $conf['rss_show_deleted']; + $this->options['show_summary'] = $conf['rss_show_summary']; + $this->options['only_new'] = $INPUT->bool('onlynewpages'); + $this->options['sort'] = $INPUT->valid( + 'sort', + ['natural', 'date'], + 'natural' + ); + $this->options['search_query'] = $INPUT->str('q'); + $this->options['content_type'] = $INPUT->valid( + 'view', + ['pages', 'media', 'both'], + $conf['rss_media'] + ); + $this->options['guardmail'] = $conf['mailguard']; + $this->options['title'] = $conf['title']; + if ($this->options['namespace']) { + $this->options['title'] .= ' - ' . $this->options['namespace']; + } + $this->options['subtitle'] = $conf['tagline']; + + $this->options = array_merge($this->options, $options); + + // initialization finished, let plugins know + $eventData = [ + 'opt' => &$this->options, + ]; + Event::createAndTrigger('FEED_OPTS_POSTPROCESS', $eventData); + } + + /** + * The cache key to use for a feed with these options + * + * Does not contain user or host specific information yet + * + * @return string + */ + public function getCacheKey() + { + return implode('', array_values($this->options)); + } + + /** + * Return a feed option by name + * + * @param string $option The name of the option + * @param mixed $default default value if option is not set (should usually not happen) + * @return mixed + */ + public function get($option, $default = null) + { + return $this->options[$option] ?? $default; + } + + /** + * Return the feed type for UniversalFeedCreator + * + * This returns the apropriate type for UniversalFeedCreator + * + * @return string + */ + public function getType() + { + return $this->types[$this->options['type']]['name']; + } + + /** + * Return the feed mime type + * + * @return string + */ + public function getMimeType() + { + return $this->types[$this->options['type']]['mime']; + } +} diff --git a/inc/Feed/FeedItemProcessor.php b/inc/Feed/FeedItemProcessor.php new file mode 100644 index 0000000..c2dfbaa --- /dev/null +++ b/inc/Feed/FeedItemProcessor.php @@ -0,0 +1,172 @@ +id = cleanID($data['id']); + $this->data = $data; + } + + /** + * Get the page ID + * + * @return string + */ + public function getId() + { + return $this->id; + } + + /** + * Get the revision timestamp of this page + * + * If the input gave us a revision, date or lastmodified already, we trust that it is correct. + * + * Note: we only handle most current revisions in feeds, so the revision is usually just the + * lastmodifed timestamp of the page file. However, if the item does not exist, we need to + * determine the revision from the changelog. + * + * @return int + */ + public function getRev() + { + if ($this->data['rev'] ?? 0) return $this->data['rev']; + + if (isset($this->data['date'])) { + $this->data['rev'] = (int)$this->data['date']; + } + + if (isset($this->data['lastmodified'])) { + $this->data['rev'] = (int)$this->data['lastmodified']; + } + + return $this->data['rev'] ?? 0; + } + + /** + * Construct the URL for the feed item based on the link_to option + * + * @param string $linkto The link_to option + * @return string URL + */ + abstract public function getURL($linkto); + + /** + * @return string + */ + public function getTitle() + { + return $this->data['title'] ?? noNS($this->getId()); + } + + /** + * Construct the body of the feed item based on the item_content option + * + * @param string $content The item_content option + * @return string + */ + abstract public function getBody($content); + + /** + * Get the change summary for this item if any + * + * @return string + */ + public function getSummary() + { + return (string)($this->data['sum'] ?? ''); + } + + /** + * Get the author info for this item + * + * @return string[] [email, author] + */ + public function getAuthor() + { + global $conf; + global $auth; + + $user = $this->data['user'] ?? ''; + $author = 'Anonymous'; + $email = 'anonymous@undisclosed.example.com'; + + if (!$user) return [$email, $author]; + $author = $user; + $email = $user . '@undisclosed.example.com'; + + if ($conf['useacl'] && $auth instanceof AuthPlugin) { + $userInfo = $auth->getUserData($user); + if ($userInfo) { + switch ($conf['showuseras']) { + case 'username': + case 'username_link': + $author = $userInfo['name']; + break; + } + } + } + return [$email, $author]; + } + + /** + * Get the categories for this item + * + * @return string[] + */ + abstract public function getCategory(); + + + /** + * Clean HTML for the use in feeds + * + * @param string $html + * @return string + */ + protected function cleanHTML($html) + { + global $conf; + + // no TOC in feeds + $html = preg_replace('/().*()/s', '', $html); + + // add alignment for images + $html = preg_replace('/( $this->getId(), + 'ns' => getNS($this->getId()), + 'rev' => $this->getRev() + ]; + break; + case 'rev': + $opt = [ + 'image' => $this->getId(), + 'ns' => getNS($this->getId()), + 'rev' => $this->getRev(), + 'tab_details' => 'history' + ]; + break; + case 'current': + $opt = [ + 'image' => $this->getId(), + 'ns' => getNS($this->getId()) + ]; + break; + case 'diff': + default: + $opt = [ + 'image' => $this->getId(), + 'ns' => getNS($this->getId()), + 'rev' => $this->getRev(), + 'tab_details' => 'history', + 'media_do' => 'diff' + ]; + } + + return media_managerURL($opt, '&', true); + } + + public function getBody($content) + { + switch ($content) { + case 'diff': + case 'htmldiff': + $prev = $this->getPrev(); + + if ($prev) { + if ($this->isExisting()) { + $src1 = new MediaFile($this->getId(), $prev); + $src2 = new MediaFile($this->getId()); + } else { + $src1 = new MediaFile($this->getId(), $prev); + $src2 = null; + } + } else { + $src1 = null; + $src2 = new MediaFile($this->getId()); + } + return $this->createDiffTable($src1, $src2); + + case 'abstract': + case 'html': + default: + $src = new Display(new MediaFile($this->getId())); + return $this->cleanHTML($src->getPreviewHtml(500, 500)); + } + } + + /** + * @inheritdoc + * @todo read exif keywords + */ + public function getCategory() + { + return (array)getNS($this->getId()); + } + + /** + * Get the revision timestamp of this page + * + * Note: we only handle most current revisions in feeds, so the revision is usually just the + * lastmodifed timestamp of the page file. However, if the page does not exist, we need to + * determine the revision from the changelog. + * @return int + */ + public function getRev() + { + $rev = parent::getRev(); + if ($rev) return $rev; + + if (media_exists($this->id)) { + $this->data['rev'] = filemtime(mediaFN($this->id)); + $this->data['exists'] = true; + } else { + $this->loadRevisions(); + } + return $this->data['rev']; + } + + /** + * Get the previous revision timestamp of this page + * + * @return int|null The previous revision or null if there is none + */ + public function getPrev() + { + if ($this->data['prev'] ?? 0) return $this->data['prev']; + $this->loadRevisions(); + return $this->data['prev']; + } + + /** + * Does this page exist? + * + * @return bool + */ + public function isExisting() + { + if (!isset($this->data['exists'])) { + $this->data['exists'] = media_exists($this->id); + } + return $this->data['exists']; + } + + /** + * Load the current and previous revision from the changelog + * @return void + */ + protected function loadRevisions() + { + $changelog = new MediaChangeLog($this->id); + $revs = $changelog->getRevisions(0, 2); // FIXME check that this returns the current one correctly + if (!isset($this->data['rev'])) { + // prefer an already set date, only set if missing + // it should usally not happen that neither is available + $this->data['rev'] = $revs[0] ?? 0; + } + // a previous revision might not exist + $this->data['prev'] = $revs[1] ?? null; + } + + /** + * Create a table showing the two media files + * + * @param MediaFile|null $src1 + * @param MediaFile|null $src2 + * @return string + */ + protected function createDiffTable($src1, $src2) + { + global $lang; + + $content = ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + $content .= ''; + + $content .= ''; + + $content .= ''; + + $content .= ''; + $content .= '
' . ($src1 ? $src1->getRev() : '') . '' . $lang['current'] . '
'; + if ($src1) { + $display = new Display($src1); + $display->getPreviewHtml(300, 300); + } + $content .= ''; + if ($src2) { + $display = new Display($src2); + $display->getPreviewHtml(300, 300); + } + $content .= '
'; + + return $this->cleanHTML($content); + } +} diff --git a/inc/Feed/FeedPageProcessor.php b/inc/Feed/FeedPageProcessor.php new file mode 100644 index 0000000..25df6f4 --- /dev/null +++ b/inc/Feed/FeedPageProcessor.php @@ -0,0 +1,215 @@ + $this->getRev()]; + break; + case 'rev': + $opt = ['rev' => $this->getRev(), 'do' => 'revisions']; + break; + case 'current': + $opt = []; + break; + case 'diff': + default: + $opt = ['rev' => $this->getRev(), 'do' => 'diff']; + } + + return wl($this->getId(), $opt, true, '&'); + } + + /** @inheritdoc */ + public function getBody($content) + { + global $lang; + + switch ($content) { + case 'diff': + $diff = $this->getDiff(); + // note: diff output must be escaped, UnifiedDiffFormatter provides plain text + $udf = new UnifiedDiffFormatter(); + return "
\n" . hsc($udf->format($diff)) . "\n
"; + + case 'htmldiff': + $diff = $this->getDiff(); + // note: no need to escape diff output, TableDiffFormatter provides 'safe' html + $tdf = new TableDiffFormatter(); + $content = ''; + $content .= ''; + $content .= ''; + $content .= $tdf->format($diff); + $content .= '
' . dformat($this->getPrev()) . '' . $lang['current'] . '
'; + return $content; + + case 'html': + if ($this->isExisting()) { + $html = p_wiki_xhtml($this->getId(), '', false); + } else { + $html = p_wiki_xhtml($this->getId(), $this->getRev(), false); + } + return $this->cleanHTML($html); + + case 'abstract': + default: + return $this->getAbstract(); + } + } + + /** @inheritdoc */ + public function getCategory() + { + $meta = $this->getMetaData(); + return (array)($meta['subject'] ?? (string)getNS($this->getId())); + } + + // endregion + + // region data accessors + + /** + * Get the page abstract + * + * @return string + */ + public function getAbstract() + { + if (!isset($this->data['abstract'])) { + $meta = $this->getMetaData(); + if (isset($meta['description']['abstract'])) { + $this->data['abstract'] = (string)$meta['description']['abstract']; + } else { + $this->data['abstract'] = ''; + } + } + return $this->data['abstract']; + } + + /** @inheritdoc */ + public function getRev() + { + $rev = parent::getRev(); + if ($rev) return $rev; + + if (page_exists($this->id)) { + $this->data['rev'] = filemtime(wikiFN($this->id)); + $this->data['exists'] = true; + } else { + $this->loadRevisions(); + } + return $this->data['rev']; + } + + /** + * Get the previous revision timestamp of this page + * + * @return int|null The previous revision or null if there is none + */ + public function getPrev() + { + if ($this->data['prev'] ?? 0) return $this->data['prev']; + $this->loadRevisions(); + return $this->data['prev']; + } + + /** + * Does this page exist? + * + * @return bool + */ + public function isExisting() + { + if (!isset($this->data['exists'])) { + $this->data['exists'] = page_exists($this->id); + } + return $this->data['exists']; + } + + /** + * Get the title of this page + * + * @return string + */ + public function getTitle() + { + global $conf; + if (!isset($this->data['title'])) { + if ($conf['useheading']) { + $this->data['title'] = p_get_first_heading($this->id); + } else { + $this->data['title'] = noNS($this->id); + } + } + return $this->data['title']; + } + + // endregion + + /** + * Get the metadata of this page + * + * @return array[] + */ + protected function getMetaData() + { + if (!isset($this->meta)) { + $this->meta = (array)p_get_metadata($this->id); + } + return $this->meta; + } + + /** + * Load the current and previous revision from the changelog + * @return void + */ + protected function loadRevisions() + { + $changelog = new PageChangeLog($this->id); + $revs = $changelog->getRevisions(0, 2); // FIXME check that this returns the current one correctly + if (!isset($this->data['rev'])) { + // prefer an already set date, only set if missing + // it should usally not happen that neither is available + $this->data['rev'] = $revs[0] ?? 0; + } + // a previous revision might not exist + $this->data['prev'] = $revs[1] ?? null; + } + + /** + * Get a diff between this and the previous revision + * + * @return Diff + */ + protected function getDiff() + { + $prev = $this->getPrev(); + + if ($prev) { + return new Diff( + explode("\n", rawWiki($this->getId(), $prev)), + explode("\n", rawWiki($this->getId(), '')) + ); + } + return new Diff([''], explode("\n", rawWiki($this->getId(), ''))); + } +} diff --git a/inc/FeedParser.php b/inc/FeedParser.php new file mode 100644 index 0000000..b93ba29 --- /dev/null +++ b/inc/FeedParser.php @@ -0,0 +1,32 @@ +enable_cache(false); + $this->registry->register(File::class, FeedParserFile::class); + } + + /** + * Backward compatibility for older plugins + * + * phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps + * @param string $url + */ + public function feed_url($url) + { + $this->set_feed_url($url); + } +} diff --git a/inc/FeedParserFile.php b/inc/FeedParserFile.php new file mode 100644 index 0000000..3297a0d --- /dev/null +++ b/inc/FeedParserFile.php @@ -0,0 +1,58 @@ +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 */ + public function headers() + { + return $this->headers; + } + + /** @inheritdoc */ + public function body() + { + return $this->body; + } + + /** @inheritdoc */ + public function close() + { + return true; + } +} diff --git a/inc/File/MediaFile.php b/inc/File/MediaFile.php new file mode 100644 index 0000000..f685e90 --- /dev/null +++ b/inc/File/MediaFile.php @@ -0,0 +1,174 @@ +id = $id; //FIXME should it be cleaned? + $this->path = mediaFN($id, $rev); + $this->rev = $rev; + + [$this->ext, $this->mime, $this->downloadable] = mimetype($this->path, false); + } + + /** @return string */ + public function getId() + { + return $this->id; + } + + /** @return string|int Empty string for current version */ + public function getRev() + { + return $this->rev; + } + + /** @return string */ + public function getPath() + { + return $this->path; + } + + /** + * The ID without namespace, used for display purposes + * + * @return string + */ + public function getDisplayName() + { + return noNS($this->id); + } + + /** @return string */ + public function getMime() + { + if (!$this->mime) return 'application/octet-stream'; + return $this->mime; + } + + /** @return string */ + public function getExtension() + { + return (string)$this->ext; + } + + /** + * Similar to the extesion but does some clean up + * + * @return string + */ + public function getIcoClass() + { + $ext = $this->getExtension(); + if ($ext === '') $ext = 'file'; + return preg_replace('/[^_\-a-z0-9]+/i', '_', $ext); + } + + /** + * Should this file be downloaded instead being displayed inline? + * + * @return bool + */ + public function isDownloadable() + { + return $this->downloadable; + } + + /** @return int */ + public function getFileSize() + { + return filesize($this->path); + } + + /** @return int */ + public function getLastModified() + { + return filemtime($this->path); + } + + /** @return bool */ + public function isWritable() + { + return is_writable($this->path); + } + + /** @return bool */ + public function isImage() + { + return (str_starts_with($this->mime, 'image/')); + } + + /** + * initializes width and height for images when requested + */ + protected function initSizes() + { + $this->width = 0; + $this->height = 0; + if (!$this->isImage()) return; + $info = getimagesize($this->path); + if ($info === false) return; + [$this->width, $this->height] = $info; + } + + /** + * Returns the width if this is a supported image, 0 otherwise + * + * @return int + */ + public function getWidth() + { + if ($this->width === null) $this->initSizes(); + return $this->width; + } + + /** + * Returns the height if this is a supported image, 0 otherwise + * + * @return int + */ + public function getHeight() + { + if ($this->height === null) $this->initSizes(); + return $this->height; + } + + /** + * Returns the permissions the current user has on the file + * + * @todo doing this for each file within a namespace is a waste, we need to cache this somehow + * @return int + */ + public function userPermission() + { + return auth_quickaclcheck(getNS($this->id) . ':*'); + } + + /** @return JpegMeta */ + public function getMeta() + { + if ($this->meta === null) $this->meta = new JpegMeta($this->path); + return $this->meta; + } +} diff --git a/inc/File/MediaResolver.php b/inc/File/MediaResolver.php new file mode 100644 index 0000000..cc65978 --- /dev/null +++ b/inc/File/MediaResolver.php @@ -0,0 +1,15 @@ +id = $id; + $this->changelog = new PageChangeLog($this->id); + } + + /** @return string */ + public function getId() + { + return $this->id; + } + + /** @return string */ + public function getPath($rev = '') + { + return wikiFN($this->id, $rev); + } + + /** + * Get raw WikiText of the page, considering change type at revision date + * similar to function rawWiki($id, $rev = '') + * + * @param int|false $rev timestamp when a revision of wikitext is desired + * @return string + */ + public function rawWikiText($rev = null) + { + if ($rev !== null) { + $revInfo = $rev ? $this->changelog->getRevisionInfo($rev) : false; + return (!$revInfo || $revInfo['type'] == DOKU_CHANGE_TYPE_DELETE) + ? '' // attic stores complete last page version for a deleted page + : io_readWikiPage($this->getPath($rev), $this->id, $rev); // retrieve from attic + } else { + return io_readWikiPage($this->getPath(), $this->id, ''); + } + } + + /** + * Saves a wikitext by calling io_writeWikiPage. + * Also directs changelog and attic updates. + * + * @author Andreas Gohr + * @author Ben Coburn + * + * @param string $text wikitext being saved + * @param string $summary summary of text update + * @param bool $minor mark this saved version as minor update + * @return array|void data of event COMMON_WIKIPAGE_SAVE + */ + public function saveWikiText($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; + + // prevent recursive call + if (isset($this->data)) return; + + $pagefile = $this->getPath(); + $currentRevision = @filemtime($pagefile); // int or false + $currentContent = $this->rawWikiText(); + $currentSize = file_exists($pagefile) ? filesize($pagefile) : 0; + + // prepare data for event COMMON_WIKIPAGE_SAVE + $data = [ + 'id' => $this->id,// should not be altered by any handlers + 'file' => $pagefile,// same above + 'changeType' => null,// set prior to event, and confirm later + 'revertFrom' => $REV, + 'oldRevision' => $currentRevision, + 'oldContent' => $currentContent, + 'newRevision' => 0,// only available in the after hook + 'newContent' => $text, + 'summary' => $summary, + 'contentChanged' => ($text != $currentContent),// confirm later + 'changeInfo' => '',// automatically determined by revertFrom + 'sizechange' => strlen($text) - strlen($currentContent), + ]; + + // determine tentatively change type and relevant elements of event data + if ($data['revertFrom']) { + // new text may differ from exact revert revision + $data['changeType'] = DOKU_CHANGE_TYPE_REVERT; + $data['changeInfo'] = $REV; + } elseif (trim($data['newContent']) == '') { + // empty or whitespace only content deletes + $data['changeType'] = DOKU_CHANGE_TYPE_DELETE; + } elseif (!file_exists($pagefile)) { + $data['changeType'] = DOKU_CHANGE_TYPE_CREATE; + } else { + // minor edits allowable only for logged in users + $is_minor_change = ($minor && $conf['useacl'] && $INPUT->server->str('REMOTE_USER')); + $data['changeType'] = $is_minor_change + ? DOKU_CHANGE_TYPE_MINOR_EDIT + : DOKU_CHANGE_TYPE_EDIT; + } + + $this->data = $data; + $data['page'] = $this; // allow event handlers to use this class methods + + $event = new Event('COMMON_WIKIPAGE_SAVE', $data); + if (!$event->advise_before()) return; + + // if the content has not been changed, no save happens (plugins may override this) + if (!$data['contentChanged']) return; + + // Check whether the pagefile has modified during $event->advise_before() + clearstatcache(); + $fileRev = @filemtime($pagefile); + if ($fileRev === $currentRevision) { + // pagefile has not touched by plugin's event handler + // add a potential external edit entry to changelog and store it into attic + $this->detectExternalEdit(); + $filesize_old = $currentSize; + } else { + // pagefile has modified by plugin's event handler, confirm sizechange + $filesize_old = ( + $data['changeType'] == DOKU_CHANGE_TYPE_CREATE || ( + $data['changeType'] == DOKU_CHANGE_TYPE_REVERT && !file_exists($pagefile)) + ) ? 0 : filesize($pagefile); + } + + // make change to the current file + if ($data['changeType'] == DOKU_CHANGE_TYPE_DELETE) { + // nothing to do when the file has already deleted + if (!file_exists($pagefile)) return; + // autoset summary on deletion + if (blank($data['summary'])) { + $data['summary'] = $lang['deleted']; + } + // send "update" event with empty data, so plugins can react to page deletion + $ioData = [[$pagefile, '', false], getNS($this->id), noNS($this->id), false]; + Event::createAndTrigger('IO_WIKIPAGE_WRITE', $ioData); + // pre-save deleted revision + @touch($pagefile); + clearstatcache(); + $data['newRevision'] = $this->saveOldRevision(); + // remove empty file + @unlink($pagefile); + $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($this->id); + // remove empty namespaces + io_sweepNS($this->id, 'datadir'); + io_sweepNS($this->id, 'mediadir'); + } else { + // save file (namespace dir is created in io_writeWikiPage) + io_writeWikiPage($pagefile, $data['newContent'], $this->id); + // pre-save the revision, to keep the attic in sync + $data['newRevision'] = $this->saveOldRevision(); + $filesize_new = filesize($pagefile); + } + $data['sizechange'] = $filesize_new - $filesize_old; + + $event->advise_after(); + + unset($data['page']); + + // adds an entry to the changelog and saves the metadata for the page + $logEntry = $this->changelog->addLogEntry([ + 'date' => $data['newRevision'], + 'ip' => clientIP(true), + 'type' => $data['changeType'], + 'id' => $this->id, + 'user' => $INPUT->server->str('REMOTE_USER'), + 'sum' => $data['summary'], + 'extra' => $data['changeInfo'], + 'sizechange' => $data['sizechange'], + ]); + // update metadata + $this->updateMetadata($logEntry); + + // update the purgefile (timestamp of the last time anything within the wiki was changed) + io_saveFile($conf['cachedir'] . '/purgefile', time()); + + return $data; + } + + /** + * 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() + */ + public function detectExternalEdit() + { + $revInfo = $this->changelog->getCurrentRevisionInfo(); + + // only interested in external revision + if (empty($revInfo) || !array_key_exists('timestamp', $revInfo)) return; + + if ($revInfo['type'] != DOKU_CHANGE_TYPE_DELETE && !$revInfo['timestamp']) { + // file is older than last revision, that is erroneous/incorrect occurence. + // try to change file modification time + $fileLastMod = $this->getPath(); + $wrong_timestamp = filemtime($fileLastMod); + if (touch($fileLastMod, $revInfo['date'])) { + clearstatcache(); + $msg = "PageFile($this->id)::detectExternalEdit(): timestamp successfully modified"; + $details = '(' . $wrong_timestamp . ' -> ' . $revInfo['date'] . ')'; + Logger::error($msg, $details, $fileLastMod); + } else { + // runtime error + $msg = "PageFile($this->id)::detectExternalEdit(): page file should be newer than last revision " + . '(' . filemtime($fileLastMod) . ' < ' . $this->changelog->lastRevision() . ')'; + throw new RuntimeException($msg); + } + } + + // keep at least 1 sec before new page save + if ($revInfo['date'] == time()) sleep(1); // wait a tick + + // store externally edited file to the attic folder + $this->saveOldRevision(); + // add a changelog entry for externally edited file + $this->changelog->addLogEntry($revInfo); + // remove soon to be stale instructions + $cache = new CacheInstructions($this->id, $this->getPath()); + $cache->removeCache(); + } + + /** + * Moves the current version to the attic and returns its revision date + * + * @author Andreas Gohr + * + * @return int|string revision timestamp + */ + public function saveOldRevision() + { + $oldfile = $this->getPath(); + if (!file_exists($oldfile)) return ''; + $date = filemtime($oldfile); + $newfile = $this->getPath($date); + io_writeWikiPage($newfile, $this->rawWikiText(), $this->id, $date); + return $date; + } + + /** + * Update metadata of changed page + * + * @param array $logEntry changelog entry + */ + public function updateMetadata(array $logEntry) + { + global $INFO; + + ['date' => $date, 'type' => $changeType, 'user' => $user, ] = $logEntry; + + $wasRemoved = ($changeType === DOKU_CHANGE_TYPE_DELETE); + $wasCreated = ($changeType === DOKU_CHANGE_TYPE_CREATE); + $wasReverted = ($changeType === DOKU_CHANGE_TYPE_REVERT); + $wasMinorEdit = ($changeType === DOKU_CHANGE_TYPE_MINOR_EDIT); + + $createdDate = @filectime($this->getPath()); + + if ($wasRemoved) return; + + $oldmeta = p_read_metadata($this->id)['persistent']; + $meta = []; + + if ( + $wasCreated && + (empty($oldmeta['date']['created']) || $oldmeta['date']['created'] === $createdDate) + ) { + // newly created + $meta['date']['created'] = $createdDate; + if ($user) { + $meta['creator'] = $INFO['userinfo']['name'] ?? null; + $meta['user'] = $user; + } + } elseif (($wasCreated || $wasReverted) && !empty($oldmeta['date']['created'])) { + // re-created / restored + $meta['date']['created'] = $oldmeta['date']['created']; + $meta['date']['modified'] = $createdDate; // use the files ctime here + $meta['creator'] = $oldmeta['creator'] ?? null; + if ($user) { + $meta['contributor'][$user] = $INFO['userinfo']['name'] ?? null; + } + } elseif (!$wasMinorEdit) { // non-minor modification + $meta['date']['modified'] = $date; + if ($user) { + $meta['contributor'][$user] = $INFO['userinfo']['name'] ?? null; + } + } + $meta['last_change'] = $logEntry; + p_set_metadata($this->id, $meta); + } +} diff --git a/inc/File/PageResolver.php b/inc/File/PageResolver.php new file mode 100644 index 0000000..66a5a02 --- /dev/null +++ b/inc/File/PageResolver.php @@ -0,0 +1,97 @@ +resolveStartPage($id, $rev, $isDateAt); + if ($conf['autoplural']) { + $id = $this->resolveAutoPlural($id, $rev, $isDateAt); + } + } else { + $id = $this->contextID; + } + + $id = cleanID($id); // FIXME always? or support parameter + // readd hash if any + if ($hash !== '') $id .= "#$hash"; + return $id; + } + + /** + * IDs ending in : + * + * @param string $id + * @param string|int|false $rev + * @param bool $isDateAt + * @return string + */ + protected function resolveStartPage($id, $rev, $isDateAt) + { + global $conf; + + if ($id === '' || $id[-1] !== ':') return $id; + + if (page_exists($id . $conf['start'], $rev, true, $isDateAt)) { + // start page inside namespace + return $id . $conf['start']; + } elseif (page_exists($id . noNS(cleanID($id)), $rev, true, $isDateAt)) { + // page named like the NS inside the NS + return $id . noNS(cleanID($id)); + } elseif (page_exists(substr($id, 0, -1), $rev, true, $isDateAt)) { + // page named like the NS outside the NS + return substr($id, 0, -1); + } + + // fall back to default start page + return $id . $conf['start']; + } + + /** + * Try alternative plural/singular form + * + * @param string $id + * @param int $rev + * @param bool $isDateAt + * @return string + */ + protected function resolveAutoPlural($id, $rev, $isDateAt) + { + if (page_exists($id, $rev, $isDateAt)) return $id; + + if ($id[-1] === 's') { + $try = substr($id, 0, -1); + } else { + $try = $id . 's'; + } + + if (page_exists($try, $rev, true, $isDateAt)) { + return $try; + } + return $id; + } +} diff --git a/inc/File/Resolver.php b/inc/File/Resolver.php new file mode 100644 index 0000000..bb0c10b --- /dev/null +++ b/inc/File/Resolver.php @@ -0,0 +1,105 @@ +contextID = $contextID; + $this->contextNS = (string)getNS($contextID); + } + + /** + * Resolves a given ID to be absolute + * + * @param string $id The ID to resolve + * @param string|int|false $rev The revision time to use when resolving + * @param bool $isDateAt Is the given revision only a datetime hint not an exact revision? + * @return string + */ + public function resolveId($id, $rev = '', $isDateAt = false) + { + global $conf; + + // some pre cleaning for useslash: + if ($conf['useslash']) $id = str_replace('/', ':', $id); + // on some systems, semicolons might be used instead of colons: + $id = str_replace(';', ':', $id); + + $id = $this->resolvePrefix($id); + return $this->resolveRelatives($id); + } + + /** + * Handle IDs starting with . or ~ and prepend the proper prefix + * + * @param string $id + * @return string + */ + protected function resolvePrefix($id) + { + if ($id === '') return $id; + + // relative to current page (makes the current page a start page) + if ($id[0] === '~') { + $id = $this->contextID . ':' . substr($id, 1); + } + + // relative to current namespace + if ($id[0] === '.') { + // normalize initial dots without a colon + $id = preg_replace('/^((\.+:)*)(\.+)(?=[^:\.])/', '\1\3:', $id); + $id = $this->contextNS . ':' . $id; + } + + // auto-relative, because there is a context namespace but no namespace in the ID + if ($this->contextID !== '' && strpos($id, ':') === false) { + $id = $this->contextNS . ':' . $id; + } + + return $id; + } + + /** + * Handle . and .. within IDs + * + * @param string $id + * @return string + */ + protected function resolveRelatives($id) + { + $id = rtrim($id, '.'); // trailing dots are invalid + if ($id === '') return ''; + $trail = ($id[-1] === ':') ? ':' : ''; // keep trailing colon + + $result = []; + $parts = explode(':', $id); + + foreach ($parts as $dir) { + if ($dir === '.') continue; + if ($dir === '') continue; + if ($dir === '..') { + array_pop($result); + continue; + } + $result[] = $dir; + } + + $id = implode(':', $result); + $id .= $trail; + + return $id; + } +} diff --git a/inc/Form/ButtonElement.php b/inc/Form/ButtonElement.php new file mode 100644 index 0000000..b68554a --- /dev/null +++ b/inc/Form/ButtonElement.php @@ -0,0 +1,36 @@ + $name, 'value' => 1]); + $this->content = $content; + } + + /** + * The HTML representation of this element + * + * @return string + */ + public function toHTML() + { + return ''; + } +} diff --git a/inc/Form/CheckableElement.php b/inc/Form/CheckableElement.php new file mode 100644 index 0000000..29a3b0d --- /dev/null +++ b/inc/Form/CheckableElement.php @@ -0,0 +1,82 @@ +attr('value', 1); + } + + /** + * Handles the useInput flag and sets the checked attribute accordingly + */ + protected function prefillInput() + { + global $INPUT; + [$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'); + } + } + } + } + } + + /** + * The HTML representation of this element wrapped in a label + * Note: allow HTML tags in label text + * + * @return string + */ + public function toHTML() + { + if ($this->label) { + return ''; + } else { + return $this->mainElementHTML(); + } + } +} diff --git a/inc/Form/DropdownElement.php b/inc/Form/DropdownElement.php new file mode 100644 index 0000000..4e89273 --- /dev/null +++ b/inc/Form/DropdownElement.php @@ -0,0 +1,199 @@ +rmattr('type'); + $this->optGroups[''] = new OptGroup(null, $options); + $this->val(''); + } + + /** + * Add an `` and respective options + * + * @param string $label + * @param array $options + * @return OptGroup a reference to the added optgroup + * @throws \InvalidArgumentException + */ + public function addOptGroup($label, $options) + { + if (empty($label)) { + throw new \InvalidArgumentException(hsc(' 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 @param null|array $optGroups + * @return OptGroup[]|DropdownElement + * @see OptGroup::options() + * + */ + 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 = []; + 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; + } + + /** + * 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|string[] $value The value to set + * @return $this|string|string[] + */ + public function val($value = null) + { + // getter + if ($value === null) { + if (isset($this->attributes['multiple'])) { + return $this->values; + } else { + return $this->values[0]; + } + } + + // setter + $this->values = $this->setValuesInOptGroups((array) $value); + if (!$this->values) { + // unknown value set, select first option instead + $this->values = $this->setValuesInOptGroups((array) $this->getFirstOptionKey()); + } + + return $this; + } + + /** + * Returns the first option's key + * + * @return string + */ + protected function getFirstOptionKey() + { + $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); + } + } + + return ''; // should not happen + } + + /** + * Set the value in the OptGroups, including the optgroup for the options without optgroup. + * + * @param string[] $values The values to be set + * @return string[] The values actually set + */ + protected function setValuesInOptGroups($values) + { + $valueset = []; + + /** @var OptGroup $optGroup */ + foreach ($this->optGroups as $optGroup) { + $found = $optGroup->storeValues($values); + $values = array_diff($values, $found); + $valueset = array_merge($valueset, $found); + } + + return $valueset; + } + + /** + * Create the HTML for the select it self + * + * @return string + */ + protected function mainElementHTML() + { + $attr = $this->attrs(); + if (isset($attr['multiple'])) { + // use array notation when multiple values are allowed + $attr['name'] .= '[]'; + } elseif ($this->useInput) { + // prefilling is only supported for non-multi fields + $this->prefillInput(); + } + + $html = ''; + + return $html; + } +} diff --git a/inc/Form/Element.php b/inc/Form/Element.php new file mode 100644 index 0000000..c56c758 --- /dev/null +++ b/inc/Form/Element.php @@ -0,0 +1,160 @@ +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', implode(' ', $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/inc/Form/FieldsetCloseElement.php b/inc/Form/FieldsetCloseElement.php new file mode 100644 index 0000000..afcc552 --- /dev/null +++ b/inc/Form/FieldsetCloseElement.php @@ -0,0 +1,33 @@ +type = 'fieldsetclose'; + } + + + /** + * The HTML representation of this element + * + * @return string + */ + public function toHTML() + { + return ''; + } +} diff --git a/inc/Form/FieldsetOpenElement.php b/inc/Form/FieldsetOpenElement.php new file mode 100644 index 0000000..2d99255 --- /dev/null +++ b/inc/Form/FieldsetOpenElement.php @@ -0,0 +1,39 @@ +type = 'fieldsetopen'; + } + + /** + * The HTML representation of this element + * + * @return string + */ + public function toHTML() + { + $html = '
attrs()) . '>'; + $legend = $this->val(); + if ($legend) $html .= DOKU_LF . '' . hsc($legend) . ''; + return $html; + } +} diff --git a/inc/Form/Form.php b/inc/Form/Form.php new file mode 100644 index 0000000..ae3145f --- /dev/null +++ b/inc/Form/Form.php @@ -0,0 +1,499 @@ +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, [$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, [$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($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; + } elseif ($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 + * + * @param string $eventName (optional) name of the event: FORM_{$name}_OUTPUT + * @return string + */ + public function toHTML($eventName = null) + { + $this->balanceFieldsets(); + + // trigger event to provide an opportunity to modify this form + if (isset($eventName)) { + $eventName = 'FORM_' . strtoupper($eventName) . '_OUTPUT'; + Event::createAndTrigger($eventName, $this, null, false); + } + + $html = '
attrs()) . '>'; + + foreach ($this->hidden as $name => $value) { + $html .= ''; + } + + foreach ($this->elements as $element) { + $html .= $element->toHTML(); + } + + $html .= '
'; + + return $html; + } +} diff --git a/inc/Form/HTMLElement.php b/inc/Form/HTMLElement.php new file mode 100644 index 0000000..41c0199 --- /dev/null +++ b/inc/Form/HTMLElement.php @@ -0,0 +1,31 @@ +val(); + } +} diff --git a/inc/Form/InputElement.php b/inc/Form/InputElement.php new file mode 100644 index 0000000..ab67845 --- /dev/null +++ b/inc/Form/InputElement.php @@ -0,0 +1,170 @@ + $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 (isset($parsed[$name]) && is_array($parsed[$name])) { + $key = array_keys($parsed[$name]); + $key = array_shift($key); + } else { + $key = null; + } + + return [$name, $key]; + } + + /** + * Handles the useInput flag and set the value attribute accordingly + */ + protected function prefillInput() + { + global $INPUT; + + [$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 'attrs()) . ' />'; + } + + /** + * The HTML representation of this element wrapped in a label + * + * @return string + */ + public function toHTML() + { + if ($this->label) { + return ''; + } else { + return $this->mainElementHTML(); + } + } +} diff --git a/inc/Form/LabelElement.php b/inc/Form/LabelElement.php new file mode 100644 index 0000000..9a9bb63 --- /dev/null +++ b/inc/Form/LabelElement.php @@ -0,0 +1,30 @@ +attrs()) . '>' . $this->val() . ''; + } +} diff --git a/inc/Form/LegacyForm.php b/inc/Form/LegacyForm.php new file mode 100644 index 0000000..f5b6e92 --- /dev/null +++ b/inc/Form/LegacyForm.php @@ -0,0 +1,182 @@ +params); + + $this->hidden = $oldform->_hidden; + + foreach ($oldform->_content as $element) { + [$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']); + 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 = []; + $control = []; + + 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 [$control, $attributes]; + } + + /** + * Translates our types to the legacy types + * + * @param string $type + * @return string + */ + protected function legacyType($type) + { + static $types = [ + 'text' => 'textfield', + 'password' => 'passwordfield', + 'checkbox' => 'checkboxfield', + 'radio' => 'radiofield', + 'tagopen' => 'opentag', + 'tagclose' => 'closetag', + 'fieldsetopen' => 'openfieldset', + 'fieldsetclose' => 'closefieldset' + ]; + return $types[$type] ?? $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 instanceof LabelElement) { + $data['_class'] = $label->attr('class'); + } + $legacy->_content[] = $data; + } + } + + return $legacy; + } +} diff --git a/inc/Form/OptGroup.php b/inc/Form/OptGroup.php new file mode 100644 index 0000000..4e7808d --- /dev/null +++ b/inc/Form/OptGroup.php @@ -0,0 +1,122 @@ + $label]); + $this->options($options); + } + + /** + * Store the given values so they can be used during rendering + * + * This is intended to be only called from within DropdownElement::val() + * + * @param string[] $values the values to set + * @return string[] the values that have been set (options exist) + * @see DropdownElement::val() + */ + public function storeValues($values) + { + $this->values = []; + foreach ($values as $value) { + if (isset($this->options[$value])) { + $this->values[] = $value; + } + } + + return $this->values; + } + + /** + * 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 = []; + foreach ($options as $key => $val) { + if (is_array($val)) { + if (!array_key_exists('label', $val)) { + throw new \InvalidArgumentException( + 'If option is given as array, it has to have a "label"-key!' + ); + } + if ( + array_key_exists('attrs', $val) && + is_array($val['attrs']) && + array_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] = ['label' => (string)$val]; + } else { + $this->options[$key] = ['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 = 'attrs()) . '>'; + $html .= $this->renderOptions(); + $html .= ''; + return $html; + } + + /** + * @return string + */ + protected function renderOptions() + { + $html = ''; + foreach ($this->options as $key => $val) { + $selected = in_array((string)$key, $this->values) ? ' selected="selected"' : ''; + $attrs = ''; + if (!empty($val['attrs']) && is_array($val['attrs'])) { + $attrs = buildAttributes($val['attrs']); + } + $html .= ''; + $html .= hsc($val['label']); + $html .= ''; + } + return $html; + } +} diff --git a/inc/Form/TagCloseElement.php b/inc/Form/TagCloseElement.php new file mode 100644 index 0000000..20579a1 --- /dev/null +++ b/inc/Form/TagCloseElement.php @@ -0,0 +1,94 @@ +val() . '>'; + } +} diff --git a/inc/Form/TagElement.php b/inc/Form/TagElement.php new file mode 100644 index 0000000..0dbe136 --- /dev/null +++ b/inc/Form/TagElement.php @@ -0,0 +1,32 @@ +val() . ' ' . buildAttributes($this->attrs()) . ' />'; + } +} diff --git a/inc/Form/TagOpenElement.php b/inc/Form/TagOpenElement.php new file mode 100644 index 0000000..1dbfd0a --- /dev/null +++ b/inc/Form/TagOpenElement.php @@ -0,0 +1,33 @@ +val() . ' ' . buildAttributes($this->attrs()) . '>'; + } +} diff --git a/inc/Form/TextareaElement.php b/inc/Form/TextareaElement.php new file mode 100644 index 0000000..7f515bb --- /dev/null +++ b/inc/Form/TextareaElement.php @@ -0,0 +1,54 @@ +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 ''; + } +} diff --git a/inc/Form/ValueElement.php b/inc/Form/ValueElement.php new file mode 100644 index 0000000..fab0b40 --- /dev/null +++ b/inc/Form/ValueElement.php @@ -0,0 +1,46 @@ +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/inc/HTTP/DokuHTTPClient.php b/inc/HTTP/DokuHTTPClient.php new file mode 100644 index 0000000..56d70ba --- /dev/null +++ b/inc/HTTP/DokuHTTPClient.php @@ -0,0 +1,79 @@ + + * @link https://www.dokuwiki.org/devel:httpclient + */ +class DokuHTTPClient extends HTTPClient +{ + /** + * Constructor. + * + * @author Andreas Gohr + */ + public 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 + */ + /** + * @param string $url + * @param string|array $data the post data either as array or raw data + * @param string $method + * @return bool + */ + public function sendRequest($url, $data = '', $method = 'GET') + { + $httpdata = [ + 'url' => $url, + 'data' => $data, + 'method' => $method + ]; + $evt = new 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); + } +} diff --git a/inc/HTTP/HTTPClient.php b/inc/HTTP/HTTPClient.php new file mode 100644 index 0000000..1a6ccc2 --- /dev/null +++ b/inc/HTTP/HTTPClient.php @@ -0,0 +1,906 @@ + + * @author Andreas Gohr + * @author Tobias Sarnowski + */ +class HTTPClient +{ + //set these if you like + public $agent; // User agent + public $http = '1.0'; // HTTP version defaults to 1.0 + public $timeout = 15; // read timeout (seconds) + public $cookies = []; + public $referer = ''; + public $max_redirect = 3; + public $max_bodysize = 0; + public $max_bodysize_abort = true; // if set, abort if the response body is bigger than max_bodysize + public $header_regexp = ''; // if set this RE must match against the headers, else abort + public $headers = []; + public $debug = false; + public $start = 0.0; // for timings + public $keep_alive = true; // keep alive rocks + + // don't set these, read on error + public $error; + public $redirect_count = 0; + + // read these after a successful request + public $status = 0; + public $resp_body; + public $resp_headers; + + // set these to do basic authentication + public $user; + public $pass; + + // set these if you need to use a proxy + public $proxy_host; + public $proxy_port; + public $proxy_user; + public $proxy_pass; + public $proxy_ssl; //boolean set to true if your proxy needs SSL + public $proxy_except; // regexp of URLs to exclude from proxy + + // list of kept alive connections + protected static $connections = []; + + // what we use as boundary on multipart/form-data posts + protected $boundary = '---DokuWikiHTTPClient--4523452351'; + + /** + * Constructor. + * + * @author Andreas Gohr + */ + public function __construct() + { + $this->agent = 'Mozilla/4.0 (compatible; DokuWiki HTTP Client; ' . PHP_OS . ')'; + 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 + */ + public 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 + */ + public 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 + */ + public 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 + * @author Andreas Gohr + */ + public function sendRequest($url, $data = '', $method = 'GET') + { + $this->start = microtime(true); + $this->error = ''; + $this->status = 0; + $this->resp_body = ''; + $this->resp_headers = []; + + // save unencoded data for recursive call + $unencodedData = $data; + + // don't accept gzip if truncated bodies might occur + if ( + $this->max_bodysize && + !$this->max_bodysize_abort && + isset($this->headers['Accept-encoding']) && + $this->headers['Accept-encoding'] == 'gzip' + ) { + unset($this->headers['Accept-encoding']); + } + + // parse URL into bits + $uri = parse_url($url); + $server = $uri['host']; + $path = empty($uri['path']) ? '/' : $uri['path']; + $uriPort = empty($uri['port']) ? null : $uri['port']; + if (!empty($uri['query'])) $path .= '?' . $uri['query']; + if (isset($uri['user'])) $this->user = $uri['user']; + if (isset($uri['pass'])) $this->pass = $uri['pass']; + + // proxy setup + if ($this->useProxyForUrl($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; + $port = $uriPort ?: ($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'] + . ($uriPort ? ':' . $uriPort : ''); + $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; + } + if ($headers['Content-Type'] == 'multipart/form-data') { + $headers['Content-Type'] = 'multipart/form-data; boundary=' . $this->boundary; + $data = $this->postMultipartEncode($data); + } else { + $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 to 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->useProxyForUrl($request_url)) { + // 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/s', $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) { + [$cookie] = sexplode(';', $cookie, 2, ''); + [$key, $val] = sexplode('=', $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 (in_array($this->status, [301, 302, 303, 307, 308])) { + 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'] . ':' . $uriPort . + dirname($path) . '/' . $this->resp_headers['location']; + } else { + $this->resp_headers['location'] = $uri['scheme'] . '://' . $uri['host'] . ':' . $uriPort . + $this->resp_headers['location']; + } + } + if ($this->status == 307 || $this->status == 308) { + // perform redirected request, same method as before (required by RFC) + return $this->sendRequest($this->resp_headers['location'], $unencodedData, $method); + } else { + // perform redirected request, always via GET (required by RFC) + return $this->sendRequest($this->resp_headers['location'], [], '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 + 1; + } 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 + 1, '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 have read max_bodysize+1 or even the whole body, so we abort late 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 && str_starts_with($r_body, "\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 + * @return bool true if a tunnel was established + * @throws HTTPClientException when a tunnel is needed but could not be established + */ + protected function ssltunnel(&$socket, &$requesturl) + { + if (!$this->useProxyForUrl($requesturl)) return false; + $requestinfo = parse_url($requesturl); + if ($requestinfo['scheme'] != 'https') return false; + if (empty($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 + */ + protected function sendData($socket, $data, $message) + { + // send request + $towrite = strlen($data); + $written = 0; + while ($written < $towrite) { + // check timeout + $time_used = microtime(true) - $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 = [$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 + * @return string + * + * @throws HTTPClientException + * @author Tom N Harris + */ + protected 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 = microtime(true) - $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 = [$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 + * @return string + * + * @throws HTTPClientException + * @author Tom N Harris + */ + protected function readLine($socket, $message) + { + $r_data = ''; + do { + $time_used = microtime(true) - $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 = [$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 + * + * @param string $info + * @param mixed $var + * @author Andreas Gohr + * + */ + protected function debug($info, $var = null) + { + if (!$this->debug) return; + if (PHP_SAPI == 'cli') { + $this->debugText($info, $var); + } else { + $this->debugHtml($info, $var); + } + } + + /** + * print debug info as HTML + * + * @param string $info + * @param mixed $var + */ + protected function debugHtml($info, $var = null) + { + echo '' . $info . ' ' . (microtime(true) - $this->start) . 's
'; + if (!is_null($var)) { + ob_start(); + print_r($var); + $content = htmlspecialchars(ob_get_contents()); + ob_end_clean(); + echo '
' . $content . '
'; + } + } + + /** + * prints debug info as plain text + * + * @param string $info + * @param mixed $var + */ + protected function debugText($info, $var = null) + { + echo '*' . $info . '* ' . (microtime(true) - $this->start) . "s\n"; + if (!is_null($var)) print_r($var); + echo "\n-----------------------------------------------\n"; + } + + /** + * convert given header string to Header array + * + * All Keys are lowercased. + * + * @param string $string + * @return array + * @author Andreas Gohr + * + */ + protected function parseHeaders($string) + { + $headers = []; + $lines = explode("\n", $string); + array_shift($lines); //skip first line (status) + foreach ($lines as $line) { + [$key, $val] = sexplode(':', $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] = [$headers[$key], $val]; + } + } else { + $headers[$key] = $val; + } + } + return $headers; + } + + /** + * convert given header array to header string + * + * @param array $headers + * @return string + * @author Andreas Gohr + * + */ + protected 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 + * + * @return string + * @author Andreas Goetz + * + */ + protected 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 + * + * @param array $data + * @return string + * @author Andreas Gohr + * + */ + protected function postEncode($data) + { + return http_build_query($data, '', '&'); + } + + /** + * Encode data for posting using multipart encoding + * + * @fixme use of urlencode might be wrong here + * @param array $data + * @return string + * @author Andreas Gohr + * + */ + protected 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 + */ + protected function uniqueConnectionId($server, $port) + { + return "$server:$port"; + } + + /** + * Should the Proxy be used for the given URL? + * + * Checks the exceptions + * + * @param string $url + * @return bool + */ + protected function useProxyForUrl($url) + { + return $this->proxy_host && (!$this->proxy_except || !preg_match('/' . $this->proxy_except . '/i', $url)); + } +} diff --git a/inc/HTTP/HTTPClientException.php b/inc/HTTP/HTTPClientException.php new file mode 100644 index 0000000..17439a9 --- /dev/null +++ b/inc/HTTP/HTTPClientException.php @@ -0,0 +1,9 @@ + $values) { + // if the value is not an array, we also accept newline terminated strings + if (!is_array($values)) $values = explode("\n", $values); + $values = array_map('trim', $values); + $values = array_unique($values); + $values = array_filter($values); + $policy[$key] = $values; + } + + $cspheader = 'Content-Security-Policy:'; + foreach ($policy as $key => $values) { + if ($values) { + $cspheader .= " $key " . implode(' ', $values) . ';'; + } else { + $cspheader .= " $key;"; + } + } + + header($cspheader); + } +} diff --git a/inc/Info.php b/inc/Info.php new file mode 100644 index 0000000..1cdccd7 --- /dev/null +++ b/inc/Info.php @@ -0,0 +1,52 @@ + '', // stable, rc + 'date' => '', // YYYY-MM-DD + 'hotfix' => '', // a, b, c, ... + 'version' => '', // sortable, full version string + 'codename' => '', // codename + 'raw' => $version, // raw version string as given + ]; + + if (preg_match('/^(rc)?(\d{4}-\d{2}-\d{2})([a-z]*)/', $version, $matches)) { + $return['date'] = $matches[2]; + if ($matches[1] == 'rc') { + $return['type'] = 'rc'; + } else { + $return['type'] = 'stable'; + } + if ($matches[3]) { + $return['hotfix'] = $matches[3]; + } + } else { + throw new \Exception('failed to parse version string'); + } + + [, $return['codename']] = sexplode(' ', $version, 2); + $return['codename'] = trim($return['codename'], ' "'); + + $return['version'] = $return['date']; + $return['version'] .= $return['type'] == 'rc' ? 'rc' : $return['hotfix']; + + return $return; + } +} diff --git a/inc/Input/Get.php b/inc/Input/Get.php new file mode 100644 index 0000000..99ab265 --- /dev/null +++ b/inc/Input/Get.php @@ -0,0 +1,29 @@ +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; + } +} diff --git a/inc/Input/Input.php b/inc/Input/Input.php new file mode 100644 index 0000000..d08eec6 --- /dev/null +++ b/inc/Input/Input.php @@ -0,0 +1,286 @@ + + */ +class Input +{ + /** @var Post Access $_POST parameters */ + public $post; + /** @var Get Access $_GET parameters */ + public $get; + /** @var Server Access $_SERVER parameters */ + public $server; + + protected $access; + + /** + * @var Callable + */ + protected $filter; + + /** + * Intilizes the dokuwiki\Input\Input class and it subcomponents + */ + public function __construct() + { + $this->access = &$_REQUEST; + $this->post = new Post(); + $this->get = new Get(); + $this->server = new Server(); + } + + /** + * 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 = [], $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 $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; + } +} diff --git a/inc/Input/Post.php b/inc/Input/Post.php new file mode 100644 index 0000000..88ca288 --- /dev/null +++ b/inc/Input/Post.php @@ -0,0 +1,29 @@ +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; + } +} diff --git a/inc/Input/Server.php b/inc/Input/Server.php new file mode 100644 index 0000000..b254629 --- /dev/null +++ b/inc/Input/Server.php @@ -0,0 +1,17 @@ +access = &$_SERVER; + } +} diff --git a/inc/JWT.php b/inc/JWT.php new file mode 100644 index 0000000..ce42a85 --- /dev/null +++ b/inc/JWT.php @@ -0,0 +1,184 @@ +user = $user; + $this->issued = $issued; + } + + /** + * Load the cookiesalt as secret + * + * @return string + */ + protected static function getSecret() + { + return auth_cookiesalt(false, true); + } + + /** + * Create a new instance from a token + * + * @param $token + * @return self + * @throws \Exception + */ + public static function validate($token) + { + [$header, $payload, $signature] = sexplode('.', $token, 3, ''); + $signature = base64_decode($signature); + + if (!hash_equals($signature, hash_hmac('sha256', "$header.$payload", self::getSecret(), true))) { + throw new \Exception('Invalid JWT signature'); + } + + try { + $header = json_decode(base64_decode($header), true, 512, JSON_THROW_ON_ERROR); + $payload = json_decode(base64_decode($payload), true, 512, JSON_THROW_ON_ERROR); + } catch (\Exception $e) { + throw new \Exception('Invalid JWT', $e->getCode(), $e); + } + + if (!$header || !$payload || !$signature) { + throw new \Exception('Invalid JWT'); + } + + if ($header['alg'] !== 'HS256') { + throw new \Exception('Unsupported JWT algorithm'); + } + if ($header['typ'] !== 'JWT') { + throw new \Exception('Unsupported JWT type'); + } + if ($payload['iss'] !== 'dokuwiki') { + throw new \Exception('Unsupported JWT issuer'); + } + if (isset($payload['exp']) && $payload['exp'] < time()) { + throw new \Exception('JWT expired'); + } + + $user = $payload['sub']; + $file = self::getStorageFile($user); + if (!file_exists($file)) { + throw new \Exception('JWT not found, maybe it expired?'); + } + + if (file_get_contents($file) !== $token) { + throw new \Exception('JWT invalid, maybe it expired?'); + } + + return new self($user, $payload['iat']); + } + + /** + * Create a new instance from a user + * + * Loads an existing token if available + * + * @param $user + * @return self + */ + public static function fromUser($user) + { + $file = self::getStorageFile($user); + + if (file_exists($file)) { + try { + return self::validate(io_readFile($file)); + } catch (\Exception $ignored) { + } + } + + $token = new self($user, time()); + $token->save(); + return $token; + } + + + /** + * Get the JWT token for this instance + * + * @return string + */ + public function getToken() + { + $header = [ + 'alg' => 'HS256', + 'typ' => 'JWT', + ]; + $header = base64_encode(json_encode($header)); + + $payload = [ + 'iss' => 'dokuwiki', + 'sub' => $this->user, + 'iat' => $this->issued, + ]; + $payload = base64_encode(json_encode($payload, JSON_THROW_ON_ERROR)); + + $signature = hash_hmac('sha256', "$header.$payload", self::getSecret(), true); + $signature = base64_encode($signature); + return "$header.$payload.$signature"; + } + + /** + * Save the token for the user + * + * Resets the issued timestamp + */ + public function save() + { + $this->issued = time(); + io_saveFile(self::getStorageFile($this->user), $this->getToken()); + } + + /** + * Get the user of this token + * + * @return string + */ + public function getUser() + { + return $this->user; + } + + /** + * Get the issued timestamp of this token + * + * @return int + */ + public function getIssued() + { + return $this->issued; + } + + /** + * Get the storage file for this token + * + * Tokens are stored to be able to invalidate them + * + * @param string $user The user the token is for + * @return string + */ + public static function getStorageFile($user) + { + return getCacheName($user, '.token'); + } +} diff --git a/inc/JpegMeta.php b/inc/JpegMeta.php new file mode 100644 index 0000000..593cddc --- /dev/null +++ b/inc/JpegMeta.php @@ -0,0 +1,3266 @@ + + * @link http://github.com/sd/jpeg-php + * @author Sebastian Delmont + * @author Andreas Gohr + * @author Hakan Sandell + * @todo Add support for Maker Notes, Extend for GIF and PNG metadata + */ + +// Original copyright notice: +// +// Copyright (c) 2003 Sebastian Delmont +// 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 + * + * @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 + */ + function & getRawInfo() { + $this->_parseAll(); + + if ($this->_markers == null) { + return false; + } + + return $this->_info; + } + + /** + * Returns basic image info + * + * @author Sebastian Delmont + */ + 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 + * + * @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){ + $lower_field = strtolower($field); + if(str_starts_with($lower_field, 'iptc.')){ + $info = $this->getIPTCField(substr($field,5)); + }elseif(str_starts_with($lower_field, 'exif.')){ + $info = $this->getExifField(substr($field,5)); + }elseif(str_starts_with($lower_field, 'xmp.')){ + $info = $this->getXmpField(substr($field,4)); + }elseif(str_starts_with($lower_field, 'file.')){ + $info = $this->getFileField(substr($field,5)); + }elseif(str_starts_with($lower_field, 'date.')){ + $info = $this->getDateField(substr($field,5)); + }elseif($lower_field == 'simple.camera'){ + $info = $this->getCamera(); + }elseif($lower_field == 'simple.raw'){ + return $this->getRawInfo(); + }elseif($lower_field == 'simple.title'){ + $info = $this->getTitle(); + }elseif($lower_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{ + $arr = array(); + foreach($info as $part){ + if(is_array($part)){ + if(isset($part['val'])){ + $arr[] = $part['val']; + }else{ + $arr[] = join(', ',$part); + } + }else{ + $arr[] = $part; + } + } + $info = join(', ',$arr); + } + } + return trim($info); + } + + /** + * Convinience function to set nearly all available Data + * through one function + * + * @author Andreas Gohr + * + * @param string $field field name + * @param string $value + * @return bool success or fail + */ + function setField($field, $value) { + $lower_field = strtolower($field); + if(str_starts_with($lower_field, 'iptc.')){ + return $this->setIPTCField(substr($field,5),$value); + }elseif(str_starts_with($lower_field, '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 + * + * @param string $field field name + * @return bool + */ + function deleteField($field) { + $lower_field = strtolower($field); + if(str_starts_with($lower_field, 'iptc.')){ + return $this->deleteIPTCField(substr($field,5)); + }elseif(str_starts_with($lower_field, 'exif.')){ + return $this->deleteExifField(substr($field,5)); + }else{ + return $this->deleteExifField($field); + } + } + + /** + * Return a date field + * + * @author Andreas Gohr + * + * @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 + * + * @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 + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * @author Joe Lapp + * + * @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 && str_starts_with(strtolower($field), '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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + */ + 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 + * + * @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']['DateTimeOriginal']; + + $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']['DateTimeDigitized']; + + $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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * @author Andreas Gohr + * + * @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 + * @author Andreas Gohr + */ + function _parseFileInfo() { + if (file_exists($this->_fileName) && is_file($this->_fileName)) { + $this->_info['file'] = array(); + $this->_info['file']['Name'] = utf8_decodeFN(\dokuwiki\Utf8\PhpString::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 + if ($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'] = \dokuwiki\Utf8\PhpString::basename($this->_fileName); + $this->_info['file']['Url'] = $this->_fileName; + } + + return true; + } + + /*************************************************************/ + function _parseMarkerJFIF() { + if (!isset($this->_markers)) { + $this->_readJPEG(); + } + + if ($this->_markers == null || $this->_isMarkerDisabled(('jfif'))) { + return false; + } + + try { + $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; + } catch(Exception $e) { + $this->_handleMarkerParsingException($e); + $this->_info['jfif'] = false; + return false; + } + + return true; + } + + /*************************************************************/ + function _parseMarkerSOF() { + if (!isset($this->_markers)) { + $this->_readJPEG(); + } + + if ($this->_markers == null || $this->_isMarkerDisabled(('sof'))) { + return false; + } + + try { + $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); + } catch(Exception $e) { + $this->_handleMarkerParsingException($e); + $this->_info['sof'] = false; + return false; + } + + return true; + } + + /** + * Parses the XMP data + * + * @author Hakan Sandell + */ + function _parseMarkerXmp() { + if (!isset($this->_markers)) { + $this->_readJPEG(); + } + + if ($this->_markers == null || $this->_isMarkerDisabled(('xmp'))) { + return false; + } + + try { + $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); + } + } + } + } catch (Exception $e) { + $this->_handleMarkerParsingException($e); + $this->_info['xmp'] = false; + return false; + } + + return true; + } + + /** + * Parses XMP nodes by recursion + * + * @author Hakan Sandell + * + * @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 || $this->_isMarkerDisabled(('exif'))) { + return false; + } + + try { + $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'); + } catch(Exception $e) { + $this->_handleMarkerParsingException($e); + $this->_info['exif'] = false; + return false; + } + + 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("

Unknown tag %02x (t: %d l: %d) %s in %s

", $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 _handleMarkerParsingException($e) { + \dokuwiki\ErrorHandler::logException($e, $this->_fileName); + } + + /*************************************************************/ + function _isMarkerDisabled($name) { + if (!isset($this->_info)) return false; + return isset($this->_info[$name]) && $this->_info[$name] === false; + } + + /*************************************************************/ + function _parseMarkerAdobe() { + if (!isset($this->_markers)) { + $this->_readJPEG(); + } + + if ($this->_markers == null || $this->_isMarkerDisabled('adobe')) { + return false; + } + try { + $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 + } + } catch(Exception $e) { + $this->_handleMarkerParsingException($e); + $this->_info['adobe'] = false; + $this->_info['iptc'] = false; + return false; + } + } + + /*************************************************************/ + 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 (str_starts_with($label, '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) { + if (!isset($data[$pos])) { + throw new Exception("Requested byte at ".$pos.". Reading outside of file's boundaries."); + } + + 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 (!isset($data[$pos]) || !isset($data[$pos + 1])) { + throw new Exception("Requested short at ".$pos.". Reading outside of file's boundaries."); + } + + 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) { + // Assume that if the start and end bytes are defined, the bytes inbetween are defined as well. + if (!isset($data[$pos]) || !isset($data[$pos + 3])){ + throw new Exception("Requested long at ".$pos.". Reading outside of file's boundaries."); + } + 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 (!isset($data[$pos])) { + throw new Exception("Requested null-terminated string at offset ".$pos.". File terminated before the null-byte."); + } + 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); + if (strlen($rv) != $length) { + throw new ErrorException(sprintf( + "JPEGMeta failed parsing image metadata of %s. Got %d instead of %d bytes at offset %d.", + $this->_fileName, strlen($rv), $length, $pos + ), 0, E_WARNING); + } + 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 "\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 .= '<'; + elseif ($c == 62) + $ascii .= '>'; + elseif ($c == 32) + $ascii .= ' '; + elseif ($c > 32) + $ascii .= chr($c); + else + $ascii .= '.'; + + if (($count % 4) == 0) { + echo ' - '; + } + + if (($count % 16) == 0) { + echo ': ' . $ascii . "
\n"; + $ascii = ''; + } + } + + if ($ascii != '') { + while (($count % 16) != 0) { + echo '-- '; + $count++; + if (($count % 4) == 0) { + echo ' - '; + } + } + echo ': ' . $ascii . "
\n"; + } + + echo "
\n"; + } + + /*****************************************************************/ +} + +/* vim: set expandtab tabstop=4 shiftwidth=4: */ diff --git a/inc/Logger.php b/inc/Logger.php new file mode 100644 index 0000000..0b8a48a --- /dev/null +++ b/inc/Logger.php @@ -0,0 +1,235 @@ +facility = $facility; + + // Should logging be disabled for this facility? + $dontlog = explode(',', $conf['dontlog']); + $dontlog = array_map('trim', $dontlog); + if (in_array($facility, $dontlog)) $this->isLogging = false; + } + + /** + * Return a Logger instance for the given facility + * + * @param string $facility The type of log + * @return Logger + */ + public static function getInstance($facility = self::LOG_ERROR) + { + if (empty(self::$instances[$facility])) { + self::$instances[$facility] = new Logger($facility); + } + return self::$instances[$facility]; + } + + /** + * Convenience method to directly log to the error log + * + * @param string $message The log message + * @param mixed $details Any details that should be added to the log entry + * @param string $file A source filename if this is related to a source position + * @param int $line A line number for the above file + * @return bool has a log been written? + */ + public static function error($message, $details = null, $file = '', $line = 0) + { + return self::getInstance(self::LOG_ERROR)->log( + $message, + $details, + $file, + $line + ); + } + + /** + * Convenience method to directly log to the debug log + * + * @param string $message The log message + * @param mixed $details Any details that should be added to the log entry + * @param string $file A source filename if this is related to a source position + * @param int $line A line number for the above file + * @return bool has a log been written? + */ + public static function debug($message, $details = null, $file = '', $line = 0) + { + return self::getInstance(self::LOG_DEBUG)->log( + $message, + $details, + $file, + $line + ); + } + + /** + * Convenience method to directly log to the deprecation log + * + * @param string $message The log message + * @param mixed $details Any details that should be added to the log entry + * @param string $file A source filename if this is related to a source position + * @param int $line A line number for the above file + * @return bool has a log been written? + */ + public static function deprecated($message, $details = null, $file = '', $line = 0) + { + return self::getInstance(self::LOG_DEPRECATED)->log( + $message, + $details, + $file, + $line + ); + } + + /** + * Log a message to the facility log + * + * @param string $message The log message + * @param mixed $details Any details that should be added to the log entry + * @param string $file A source filename if this is related to a source position + * @param int $line A line number for the above file + * @triggers LOGGER_DATA_FORMAT can be used to change the logged data or intercept it + * @return bool has a log been written? + */ + public function log($message, $details = null, $file = '', $line = 0) + { + global $EVENT_HANDLER; + if (!$this->isLogging) return false; + + $datetime = time(); + $data = [ + 'facility' => $this->facility, + 'datetime' => $datetime, + 'message' => $message, + 'details' => $details, + 'file' => $file, + 'line' => $line, + 'loglines' => [], + 'logfile' => $this->getLogfile($datetime), + ]; + + if ($EVENT_HANDLER !== null) { + $event = new Event('LOGGER_DATA_FORMAT', $data); + if ($event->advise_before()) { + $data['loglines'] = $this->formatLogLines($data); + } + $event->advise_after(); + } else { + // The event system is not yet available, to ensure the log isn't lost even on + // fatal errors, the default action is executed + $data['loglines'] = $this->formatLogLines($data); + } + + // only log when any data available + if (count($data['loglines'])) { + return $this->writeLogLines($data['loglines'], $data['logfile']); + } else { + return false; + } + } + + /** + * Is this logging instace actually logging? + * + * @return bool + */ + public function isLogging() + { + return $this->isLogging; + } + + /** + * Formats the given data as loglines + * + * @param array $data Event data from LOGGER_DATA_FORMAT + * @return string[] the lines to log + */ + protected function formatLogLines($data) + { + extract($data); + + // details are logged indented + if ($details) { + if (!is_string($details)) { + $details = json_encode($details, JSON_PRETTY_PRINT); + } + $details = explode("\n", $details); + $loglines = array_map(static fn($line) => ' ' . $line, $details); + } elseif ($details) { + $loglines = [$details]; + } else { + $loglines = []; + } + + // datetime, fileline, message + $logline = gmdate('Y-m-d H:i:s', $datetime) . "\t"; + if ($file) { + $logline .= $file; + if ($line) $logline .= "($line)"; + } + $logline .= "\t" . $message; + array_unshift($loglines, $logline); + + return $loglines; + } + + /** + * Construct the log file for the given day + * + * @param false|string|int $date Date to access, false for today + * @return string + */ + public function getLogfile($date = false) + { + global $conf; + + if ($date !== null && !is_numeric($date)) { + $date = strtotime($date); + } + if (!$date) $date = time(); + + return $conf['logdir'] . '/' . $this->facility . '/' . date('Y-m-d', $date) . '.log'; + } + + /** + * Write the given lines to today's facility log + * + * @param string[] $lines the raw lines to append to the log + * @param string $logfile where to write to + * @return bool true if the log was written + */ + protected function writeLogLines($lines, $logfile) + { + if (defined('DOKU_UNITTEST')) { + fwrite(STDERR, "\n[" . $this->facility . '] ' . implode("\n", $lines) . "\n"); + } + return io_saveFile($logfile, implode("\n", $lines) . "\n", true); + } +} diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php new file mode 100644 index 0000000..b511a32 --- /dev/null +++ b/inc/Mailer.class.php @@ -0,0 +1,797 @@ + + */ + +use dokuwiki\Utf8\PhpString; +use dokuwiki\Utf8\Clean; +use dokuwiki\Extension\Event; + +/** + * Mail Handling + */ +class Mailer +{ + protected $headers = []; + protected $attach = []; + protected $html = ''; + protected $text = ''; + + protected $boundary = ''; + protected $partid = ''; + protected $sendparam; + + protected $allowhtml = true; + + protected $replacements = ['text' => [], 'html' => []]; + + /** + * 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 .= '.localhost'; + + $this->partid = substr(md5(uniqid(random_int(0, mt_getrandmax()), true)), 0, 8) . '@' . $server; + $this->boundary = '__________' . md5(uniqid(random_int(0, mt_getrandmax()), true)); + + $listid = implode('.', array_reverse(explode('/', DOKU_BASE))) . $server; + $listid = strtolower(trim($listid, '.')); + + $messageid = uniqid(random_int(0, mt_getrandmax()), true) . "@$server"; + + $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->setHeader('Message-Id', "<$messageid>"); + + $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 = PhpString::basename($path); + } + + $this->attach[] = [ + '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) { + [, $ext] = explode('/', $mime); + $name = count($this->attach) . ".$ext"; + } + + $this->attach[] = [ + '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 autoEmbedCallBack($matches) + { + static $embeds = 0; + $embeds++; + + // get file and mime type + $media = cleanID($matches[1]); + [, $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 (urls wrapped in 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 ($html === null) { + $html = $text; + $html = hsc($html); + $html = preg_replace('/^----+$/m', '
', $html); + $html = nl2br($html); + } + if ($wrap) { + $wrapper = rawLocale('mailwrap', 'html'); + $html = preg_replace('/\n--
.*$/s', '', $html); //strip signature + $html = str_replace('@EMAILSIGNATURE@', '', $html); //strip @EMAILSIGNATURE@ + $html = str_replace('@HTMLBODY@', $html, $wrapper); + } + + 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] = '
' . hsc($value) . ''; + } else { + $htmlrep[$key] = hsc($value); + } + } + + // embed media from templates + $html = preg_replace_callback( + '/@MEDIA\(([^\)]+)\)@/', + [$this, 'autoEmbedCallBack'], + $html + ); + + // add default token replacements + $trep = array_merge($this->replacements['text'], $textrep); + $hrep = array_merge($this->replacements['html'], $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; + } + + /** + * Return a clean name which can be safely used in mail address + * fields. That means the name will be enclosed in '"' if it includes + * a '"' or a ','. Also a '"' will be escaped as '\"'. + * + * @param string $name the name to clean-up + * @see cleanAddress + */ + public function getCleanName($name) + { + $name = trim($name, " \t\""); + $name = str_replace('"', '\"', $name, $count); + if ($count > 0 || strpos($name, ',') !== false) { + $name = '"' . $name . '"'; + } + return $name; + } + + /** + * 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! + * + * If @$addresses is a string then it will be split into multiple + * addresses. Addresses must be separated by a comma. If the display + * name includes a comma then it MUST be properly enclosed by '"' to + * prevent spliting at the wrong point. + * + * Example: + * cc("föö , me@somewhere.com","TBcc"); + * to("foo, Dr." , me@somewhere.com"); + * + * @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)) { + $count = preg_match_all('/\s*(?:("[^"]*"[^,]+),*)|([^,]+)\s*,*/', $addresses, $matches, PREG_SET_ORDER); + $addresses = []; + if ($count !== false && is_array($matches)) { + foreach ($matches as $match) { + $addresses[] = rtrim($match[0], ','); + } + } + } + + 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 { + $text = ''; + $addr = $part; + } + // skip empty ones + if (empty($addr)) { + continue; + } + + // FIXME: is there a way to encode the localpart of a emailaddress? + if (!Clean::isASCII($addr)) { + msg(hsc("E-Mail address <$addr> is not ASCII"), -1, __LINE__, __FILE__, MSG_ADMINS_ONLY); + continue; + } + + if (!mail_isvalid($addr)) { + msg(hsc("E-Mail address <$addr> is not valid"), -1, __LINE__, __FILE__, MSG_ADMINS_ONLY); + 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 = Clean::deaccent($text); + $text = Clean::strip($text); + } + + if (strpos($text, ',') !== false || !Clean::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 = ['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 (PhpString::strlen($conf['title']) < 20) { + $prefix = '[' . $conf['title'] . ']'; + } else { + $prefix = '[' . PhpString::substr($conf['title'], 0, 20) . '...]'; + } + } else { + $prefix = '[' . $conf['mailprefix'] . ']'; + } + if (!str_starts_with($this->headers['Subject'], $prefix)) { + $this->headers['Subject'] = $prefix . ' ' . $this->headers['Subject']; + } + + // encode subject + if (defined('MAILHEADER_ASCIIONLY')) { + $this->headers['Subject'] = Clean::deaccent($this->headers['Subject']); + $this->headers['Subject'] = Clean::strip($this->headers['Subject']); + } + if (!Clean::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 === '' || $val === null) 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); + $name = $INFO['userinfo']['name'] ?? ''; + $mail = $INFO['userinfo']['mail'] ?? ''; + + $this->replacements['text'] = [ + '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' => $name, + 'MAIL' => $mail + ]; + + $signature = str_replace( + '@DOKUWIKIURL@', + $this->replacements['text']['DOKUWIKIURL'], + $lang['email_signature_text'] + ); + $this->replacements['text']['EMAILSIGNATURE'] = "\n-- \n" . $signature . "\n"; + + $this->replacements['html'] = [ + 'DATE' => '' . hsc(dformat()) . '', + 'BROWSER' => hsc($INPUT->server->str('HTTP_USER_AGENT')), + 'IPADDRESS' => '' . hsc($ip) . '', + 'HOSTNAME' => '' . hsc($cip) . '', + 'TITLE' => hsc($conf['title']), + 'DOKUWIKIURL' => '' . DOKU_URL . '', + 'USER' => hsc($INPUT->server->str('REMOTE_USER')), + 'NAME' => hsc($name), + 'MAIL' => '' . hsc($mail) . '' + ]; + $signature = $lang['email_signature_text']; + if (!empty($lang['email_signature_html'])) { + $signature = $lang['email_signature_html']; + } + $signature = str_replace( + ['@DOKUWIKIURL@', "\n"], + [$this->replacements['html']['DOKUWIKIURL'], '
'], + $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() + { + global $lang; + $success = false; + + // prepare hook data + $data = [ + // 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 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']); + } + + if (!function_exists('mail')) { + $emsg = $lang['email_fail'] . $subject; + error_log($emsg); + msg(hsc($emsg), -1, __LINE__, __FILE__, MSG_MANAGERS_ONLY); + $evt->advise_after(); + return false; + } + + // send the thing + if ($to === '') $to = '(undisclosed-recipients)'; // #1422 + if ($this->sendparam === null) { + $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/inc/Manifest.php b/inc/Manifest.php new file mode 100644 index 0000000..15d9446 --- /dev/null +++ b/inc/Manifest.php @@ -0,0 +1,83 @@ +cssStyleini(); + $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['__background_alt__'] + : $replacements['__theme_color__']; + } + + 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; + }; + } + } + + Event::createAndTrigger('MANIFEST_SEND', $manifest); + + header('Content-Type: application/manifest+json'); + echo json_encode($manifest, JSON_THROW_ON_ERROR); + } +} diff --git a/inc/Menu/AbstractMenu.php b/inc/Menu/AbstractMenu.php new file mode 100644 index 0000000..4995006 --- /dev/null +++ b/inc/Menu/AbstractMenu.php @@ -0,0 +1,96 @@ +context = $context; + } + + /** + * Get the list of action items in this menu + * + * @return AbstractItem[] + * @triggers MENU_ITEMS_ASSEMBLY + */ + public function getItems() + { + $data = ['view' => $this->view, 'items' => []]; + Event::createAndTrigger('MENU_ITEMS_ASSEMBLY', $data, [$this, 'loadItems']); + return $data['items']; + } + + /** + * Default action for the MENU_ITEMS_ASSEMBLY event + * + * @param array $data The plugin data + * @see getItems() + */ + 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 .= ""; + $html .= $item->asHtmlLink(false, $svg); + $html .= ''; + } + return $html; + } +} diff --git a/inc/Menu/DetailMenu.php b/inc/Menu/DetailMenu.php new file mode 100644 index 0000000..2eb5c08 --- /dev/null +++ b/inc/Menu/DetailMenu.php @@ -0,0 +1,16 @@ +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. + * + * @return string + * @see wl() + */ + public function getLink() + { + if ($this->id && $this->id[0] == '#') { + return $this->id; + } else { + return wl($this->id, $this->params, false, '&'); + } + } + + /** + * Convenience method to get the attributes for constructing an element + * + * @param string|false $classprefix create a class from type with this prefix, false for no class + * @return array + * @see buildAttributes() + */ + public function getLinkAttributes($classprefix = 'menuitem ') + { + $attr = ['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 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 = ""; + if ($svg) { + $html .= '' . hsc($this->getLabel()) . ''; + $html .= inlineSVG($this->getSvg()); + } else { + $html .= hsc($this->getLabel()); + } + $html .= ""; + + return $html; + } + + /** + * Convenience method to create a '; + $html .= ''; + $html .= ''; + + return $html; + } +} diff --git a/inc/Menu/PageMenu.php b/inc/Menu/PageMenu.php new file mode 100644 index 0000000..2ad2196 --- /dev/null +++ b/inc/Menu/PageMenu.php @@ -0,0 +1,15 @@ +callWriter = $callWriter; + } + + /** @inheritdoc */ + public function writeCall($call) + { + $this->calls[] = $call; + } + + /** * @inheritdoc */ + public function writeCalls($calls) + { + $this->calls = array_merge($this->calls, $calls); + } + + /** @inheritDoc */ + public function getCallWriter() + { + return $this->callWriter; + } +} diff --git a/inc/Parsing/Handler/Block.php b/inc/Parsing/Handler/Block.php new file mode 100644 index 0000000..db0a470 --- /dev/null +++ b/inc/Parsing/Handler/Block.php @@ -0,0 +1,201 @@ + + */ +class Block +{ + protected $calls = []; + protected $skipEol = false; + protected $inParagraph = false; + + // Blocks these should not be inside paragraphs + protected $blockOpen = [ + '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', 'footnote_open' + ]; + + protected $blockClose = [ + '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', 'footnote_close' + ]; + + // Stacks can contain paragraphs + protected $stackOpen = ['section_open']; + + protected $stackClose = ['section_close']; + + + /** + * Constructor. Adds loaded syntax plugins to the block and stack + * arrays + * + * @author Andreas Gohr + */ + public 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; + } + } + } + + protected function openParagraph($pos) + { + if ($this->inParagraph) return; + $this->calls[] = ['p_open', [], $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 + * + * @param string|integer $pos + */ + protected 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], "\n"); + $this->calls[] = ['p_close', [], $pos]; + } + + $this->inParagraph = false; + $this->skipEol = true; + } + + protected function addCall($call) + { + $key = count($this->calls); + if ($key && $call[0] == 'cdata' && $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 + protected function storeCall($call) + { + $this->calls[] = $call; + } + + /** + * Processes the whole instruction stack to open and close paragraphs + * + * @author Harry Fuecks + * @author Andreas Gohr + * + * @param array $calls + * + * @return array + */ + public 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(['cdata', ["\n"], $call[2]]); + } + } + continue; + } + /* normal */ + $this->addCall($call); + $this->skipEol = false; + } + // close last paragraph + $call = end($this->calls); + $this->closeParagraph($call[2]); + return $this->calls; + } +} diff --git a/inc/Parsing/Handler/CallWriter.php b/inc/Parsing/Handler/CallWriter.php new file mode 100644 index 0000000..28b106d --- /dev/null +++ b/inc/Parsing/Handler/CallWriter.php @@ -0,0 +1,39 @@ +Handler = $Handler; + } + + /** @inheritdoc */ + public function writeCall($call) + { + $this->Handler->calls[] = $call; + } + + /** @inheritdoc */ + public function writeCalls($calls) + { + $this->Handler->calls = array_merge($this->Handler->calls, $calls); + } + + /** + * @inheritdoc + * function is required, but since this call writer is first/highest in + * the chain it is not required to do anything + */ + public function finalise() + { + unset($this->Handler); + } +} diff --git a/inc/Parsing/Handler/CallWriterInterface.php b/inc/Parsing/Handler/CallWriterInterface.php new file mode 100644 index 0000000..ffc2468 --- /dev/null +++ b/inc/Parsing/Handler/CallWriterInterface.php @@ -0,0 +1,30 @@ +calls); + $this->writeCall(['list_close', [], $last_call[2]]); + + $this->process(); + $this->callWriter->finalise(); + unset($this->callWriter); + } + + /** @inheritdoc */ + public 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); + return $this->callWriter; + } + + protected 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[] = [$listType, $depth, 1]; + + $this->listCalls[] = ['list' . $listType . '_open', [], $call[2]]; + $this->listCalls[] = ['listitem_open', [1], $call[2]]; + $this->listCalls[] = ['listcontent_open', [], $call[2]]; + } + + + protected function listEnd($call) + { + $closeContent = true; + + while ($list = array_pop($this->listStack)) { + if ($closeContent) { + $this->listCalls[] = ['listcontent_close', [], $call[2]]; + $closeContent = false; + } + $this->listCalls[] = ['listitem_close', [], $call[2]]; + $this->listCalls[] = ['list' . $list[0] . '_close', [], $call[2]]; + } + } + + protected 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[] = ['listcontent_close', [], $call[2]]; + $this->listCalls[] = ['listitem_close', [], $call[2]]; + $this->listCalls[] = ['listitem_open', [$depth - 1], $call[2]]; + $this->listCalls[] = ['listcontent_open', [], $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[] = ['listcontent_close', [], $call[2]]; + $this->listCalls[] = ['listitem_close', [], $call[2]]; + $this->listCalls[] = ['list' . $end[0] . '_close', [], $call[2]]; + $this->listCalls[] = ['list' . $listType . '_open', [], $call[2]]; + $this->listCalls[] = ['listitem_open', [$depth - 1], $call[2]]; + $this->listCalls[] = ['listcontent_open', [], $call[2]]; + + array_pop($this->listStack); + $this->listStack[] = [$listType, $depth, count($this->listCalls) - 2]; + } + } elseif ($depth > $end[1]) { // Getting deeper... + $this->listCalls[] = ['listcontent_close', [], $call[2]]; + $this->listCalls[] = ['list' . $listType . '_open', [], $call[2]]; + $this->listCalls[] = ['listitem_open', [$depth - 1], $call[2]]; + $this->listCalls[] = ['listcontent_open', [], $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[] = [$listType, $depth, count($this->listCalls) - 2]; + } else { // Getting shallower ( $depth < $end[1] ) + $this->listCalls[] = ['listcontent_close', [], $call[2]]; + $this->listCalls[] = ['listitem_close', [], $call[2]]; + $this->listCalls[] = ['list' . $end[0] . '_close', [], $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[] = ['listitem_close', [], $call[2]]; + + if ($end[0] == $listType) { + $this->listCalls[] = ['listitem_open', [$depth - 1], $call[2]]; + $this->listCalls[] = ['listcontent_open', [], $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[] = ['list' . $end[0] . '_close', [], $call[2]]; + $this->listCalls[] = ['list' . $listType . '_open', [], $call[2]]; + $this->listCalls[] = ['listitem_open', [$depth - 1], $call[2]]; + $this->listCalls[] = ['listcontent_open', [], $call[2]]; + + array_pop($this->listStack); + $this->listStack[] = [$listType, $depth, count($this->listCalls) - 2]; + } + + break; + + // Haven't dropped down far enough yet.... ( $end[1] > $depth ) + } else { + $this->listCalls[] = ['listitem_close', [], $call[2]]; + $this->listCalls[] = ['list' . $end[0] . '_close', [], $call[2]]; + + array_pop($this->listStack); + } + } + } + } + + protected function listContent($call) + { + $this->listCalls[] = $call; + } + + protected function interpretSyntax($match, &$type) + { + if (str_ends_with($match, '*')) { + $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; + } +} diff --git a/inc/Parsing/Handler/Nest.php b/inc/Parsing/Handler/Nest.php new file mode 100644 index 0000000..f4e58e4 --- /dev/null +++ b/inc/Parsing/Handler/Nest.php @@ -0,0 +1,80 @@ + + */ +class Nest extends AbstractRewriter +{ + protected $closingInstruction; + + /** + * @inheritdoc + * + * @param CallWriterInterface $CallWriter the parser's current call writer, i.e. the one above us in the chain + * @param string $close closing instruction name, this is required to properly terminate the + * syntax mode if the document ends without a closing pattern + */ + public function __construct(CallWriterInterface $CallWriter, $close = "nest_close") + { + parent::__construct($CallWriter); + $this->closingInstruction = $close; + } + + /** @inheritdoc */ + public function writeCall($call) + { + $this->calls[] = $call; + } + + /** @inheritdoc */ + public function writeCalls($calls) + { + $this->calls = array_merge($this->calls, $calls); + } + + /** @inheritdoc */ + public function finalise() + { + $last_call = end($this->calls); + $this->writeCall([$this->closingInstruction, [], $last_call[2]]); + + $this->process(); + $this->callWriter->finalise(); + unset($this->callWriter); + } + + /** @inheritdoc */ + public function process() + { + // merge consecutive cdata + $unmerged_calls = $this->calls; + $this->calls = []; + + foreach ($unmerged_calls as $call) $this->addCall($call); + + $first_call = reset($this->calls); + $this->callWriter->writeCall(["nest", [$this->calls], $first_call[2]]); + + return $this->callWriter; + } + + /** + * @param array $call + */ + protected function addCall($call) + { + $key = count($this->calls); + if ($key && $call[0] == 'cdata' && $this->calls[$key - 1][0] == 'cdata') { + $this->calls[$key - 1][1][0] .= $call[1][0]; + } elseif ($call[0] == 'eol') { + // do nothing (eol shouldn't be allowed, to counter preformatted fix in #1652 & #1699) + } else { + $this->calls[] = $call; + } + } +} diff --git a/inc/Parsing/Handler/Preformatted.php b/inc/Parsing/Handler/Preformatted.php new file mode 100644 index 0000000..bda7dfa --- /dev/null +++ b/inc/Parsing/Handler/Preformatted.php @@ -0,0 +1,48 @@ +calls); + $this->writeCall(['preformatted_end', [], $last_call[2]]); + + $this->process(); + $this->callWriter->finalise(); + unset($this->callWriter); + } + + /** @inheritdoc */ + public 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(['preformatted', [$this->text], $this->pos]); + } + // see FS#1699 & FS#1652, add 'eol' instructions to ensure proper triggering of following p_open + $this->callWriter->writeCall(['eol', [], $this->pos]); + $this->callWriter->writeCall(['eol', [], $this->pos]); + break; + } + } + + return $this->callWriter; + } +} diff --git a/inc/Parsing/Handler/Quote.php b/inc/Parsing/Handler/Quote.php new file mode 100644 index 0000000..caa04cc --- /dev/null +++ b/inc/Parsing/Handler/Quote.php @@ -0,0 +1,86 @@ +calls); + $this->writeCall(['quote_end', [], $last_call[2]]); + + $this->process(); + $this->callWriter->finalise(); + unset($this->callWriter); + } + + /** @inheritdoc */ + public function process() + { + + $quoteDepth = 1; + + foreach ($this->calls as $call) { + switch ($call[0]) { + + /** @noinspection PhpMissingBreakStatementInspection */ + case 'quote_start': + $this->quoteCalls[] = ['quote_open', [], $call[2]]; + // fallthrough + case 'quote_newline': + $quoteLength = $this->getDepth($call[1][0]); + + if ($quoteLength > $quoteDepth) { + $quoteDiff = $quoteLength - $quoteDepth; + for ($i = 1; $i <= $quoteDiff; $i++) { + $this->quoteCalls[] = ['quote_open', [], $call[2]]; + } + } elseif ($quoteLength < $quoteDepth) { + $quoteDiff = $quoteDepth - $quoteLength; + for ($i = 1; $i <= $quoteDiff; $i++) { + $this->quoteCalls[] = ['quote_close', [], $call[2]]; + } + } elseif ($call[0] != 'quote_start') { + $this->quoteCalls[] = ['linebreak', [], $call[2]]; + } + + $quoteDepth = $quoteLength; + + break; + + case 'quote_end': + if ($quoteDepth > 1) { + $quoteDiff = $quoteDepth - 1; + for ($i = 1; $i <= $quoteDiff; $i++) { + $this->quoteCalls[] = ['quote_close', [], $call[2]]; + } + } + + $this->quoteCalls[] = ['quote_close', [], $call[2]]; + + $this->callWriter->writeCalls($this->quoteCalls); + break; + + default: + $this->quoteCalls[] = $call; + break; + } + } + + return $this->callWriter; + } + + /** + * @param string $marker + * @return int + */ + protected function getDepth($marker) + { + preg_match('/>{1,}/', $marker, $matches); + $quoteLength = strlen($matches[0]); + return $quoteLength; + } +} diff --git a/inc/Parsing/Handler/ReWriterInterface.php b/inc/Parsing/Handler/ReWriterInterface.php new file mode 100644 index 0000000..2fa7b25 --- /dev/null +++ b/inc/Parsing/Handler/ReWriterInterface.php @@ -0,0 +1,37 @@ + 0, 'tablecell' => 0]; + protected $countTableHeadRows = 0; + + /** @inheritdoc */ + public function finalise() + { + $last_call = end($this->calls); + $this->writeCall(['table_end', [], $last_call[2]]); + + $this->process(); + $this->callWriter->finalise(); + unset($this->callWriter); + } + + /** @inheritdoc */ + public 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(['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); + + return $this->callWriter; + } + + protected function tableStart($call) + { + $this->tableCalls[] = ['table_open', $call[1], $call[2]]; + $this->tableCalls[] = ['tablerow_open', [], $call[2]]; + $this->firstCell = true; + } + + protected function tableEnd($call) + { + $this->tableCalls[] = ['table_close', $call[1], $call[2]]; + $this->finalizeTable(); + } + + protected function tableRowOpen($call) + { + $this->tableCalls[] = $call; + $this->currentCols = 0; + $this->firstCell = true; + $this->lastCellType = 'tablecell'; + $this->maxRows++; + if ($this->inTableHead) { + $this->currentRow = ['tablecell' => 0, 'tableheader' => 0]; + } + } + + protected 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[] = ['tablerow_close', [], $call[2]]; + + if ($this->currentCols > $this->maxCols) { + $this->maxCols = $this->currentCols; + } + } + + protected function isTableHeadRow() + { + $td = $this->currentRow['tablecell']; + $th = $this->currentRow['tableheader']; + + if (!$th || $td > 2) return false; + if (2 * $td > $th) return false; + + return true; + } + + protected 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[] = ['colspan', [], $call[2]]; + } + + $this->tableCalls[] = [$this->lastCellType . '_close', [], $call[2]]; + $this->tableCalls[] = [$call[0] . '_open', [1, null, 1], $call[2]]; + $this->lastCellType = $call[0]; + } else { + $this->tableCalls[] = [$call[0] . '_open', [1, null, 1], $call[2]]; + $this->lastCellType = $call[0]; + $this->firstCell = false; + } + + $this->currentCols++; + } + + protected function tableDefault($call) + { + $this->tableCalls[] = $call; + } + + protected 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 = []; + $toDelete = []; + + // if still in tableheader, then there can be no table header + // as all rows can't be within + 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 + $key = -1; + while (++$key < count($this->tableCalls)) { + $call = $this->tableCalls[$key]; + + switch ($call[0]) { + case 'table_open': + if ($this->countTableHeadRows) { + array_splice($this->tableCalls, $key + 1, 0, [['tablethead_open', [], $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], ['tablecell_open', 'tableheader_open']); + $next = in_array($this->tableCalls[$key + 1][0], ['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] = ''; + break; + } + $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 = []; + while (++$lastCell < $this->maxCols) { + $moreCalls[] = ['tablecell_open', [1, null, 1], $call[2]]; + $moreCalls[] = ['cdata', [''], $call[2]]; + $moreCalls[] = ['tablecell_close', [], $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, [['tablethead_close', [], $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); + } +} diff --git a/inc/Parsing/Lexer/Lexer.php b/inc/Parsing/Lexer/Lexer.php new file mode 100644 index 0000000..87c4b3c --- /dev/null +++ b/inc/Parsing/Lexer/Lexer.php @@ -0,0 +1,349 @@ +case = $case; + $this->handler = $handler; + $this->modeStack = new StateStack($start); + } + + /** + * 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. + */ + public function addPattern($pattern, $mode = "accept") + { + if (! isset($this->regexes[$mode])) { + $this->regexes[$mode] = new ParallelRegex($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. + */ + public function addEntryPattern($pattern, $mode, $new_mode) + { + if (! isset($this->regexes[$mode])) { + $this->regexes[$mode] = new ParallelRegex($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. + */ + public function addExitPattern($pattern, $mode) + { + if (! isset($this->regexes[$mode])) { + $this->regexes[$mode] = new ParallelRegex($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. + */ + public function addSpecialPattern($pattern, $mode, $special) + { + if (! isset($this->regexes[$mode])) { + $this->regexes[$mode] = new ParallelRegex($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. + */ + 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. + */ + public function parse($raw) + { + if (! isset($this->handler)) { + return false; + } + $initialLength = strlen($raw); + $length = $initialLength; + $pos = 0; + while (is_array($parsed = $this->reduce($raw))) { + [$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->invokeHandler($raw, DOKU_LEXER_UNMATCHED, $pos); + } + + /** + * Gives plugins access to the mode stack + * + * @return StateStack + */ + public function getModeStack() + { + return $this->modeStack; + } + + /** + * 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. + */ + protected function dispatchTokens($unmatched, $matched, $mode, $initialPos, $matchPos) + { + if (! $this->invokeHandler($unmatched, DOKU_LEXER_UNMATCHED, $initialPos)) { + return false; + } + if ($this->isModeEnd($mode)) { + if (! $this->invokeHandler($matched, DOKU_LEXER_EXIT, $matchPos)) { + return false; + } + return $this->modeStack->leave(); + } + if ($this->isSpecialMode($mode)) { + $this->modeStack->enter($this->decodeSpecial($mode)); + if (! $this->invokeHandler($matched, DOKU_LEXER_SPECIAL, $matchPos)) { + return false; + } + return $this->modeStack->leave(); + } + if (is_string($mode)) { + $this->modeStack->enter($mode); + return $this->invokeHandler($matched, DOKU_LEXER_ENTER, $matchPos); + } + return $this->invokeHandler($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. + */ + protected 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. + */ + protected function isSpecialMode($mode) + { + return str_starts_with($mode, '_'); + } + + /** + * Strips the magic underscore marking single token modes. + * + * @param string $mode Mode to decode. + * @return string Underlying mode name. + */ + protected 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 + */ + protected function invokeHandler($content, $is_match, $pos) + { + if (($content === "") || ($content === false)) { + return true; + } + $handler = $this->modeStack->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 (str_starts_with($handler, 'plugin_')) { + [$handler, $plugin] = sexplode('_', $handler, 2, ''); + return $this->handler->$handler($content, $is_match, $pos, $plugin); + } + + return $this->handler->$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|bool 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. + */ + protected function reduce(&$raw) + { + if (! isset($this->regexes[$this->modeStack->getCurrent()])) { + return false; + } + if ($raw === "") { + return true; + } + if ($action = $this->regexes[$this->modeStack->getCurrent()]->split($raw, $split)) { + [$unparsed, $match, $raw] = $split; + return [$unparsed, $match, $action]; + } + return true; + } + + /** + * Escapes regex characters other than (, ) and / + * + * @param string $str + * @return string + */ + public static function escape($str) + { + $chars = [ + '/\\\\/', + '/\./', + '/\+/', + '/\*/', + '/\?/', + '/\[/', + '/\^/', + '/\]/', + '/\$/', + '/\{/', + '/\}/', + '/\=/', + '/\!/', + '/\/', + '/\|/', + '/\:/' + ]; + + $escaped = [ + '\\\\\\\\', + '\.', + '\+', + '\*', + '\?', + '\[', + '\^', + '\]', + '\$', + '\{', + '\}', + '\=', + '\!', + '\<', + '\>', + '\|', + '\:' + ]; + + return preg_replace($chars, $escaped, $str); + } +} diff --git a/inc/Parsing/Lexer/ParallelRegex.php b/inc/Parsing/Lexer/ParallelRegex.php new file mode 100644 index 0000000..d041063 --- /dev/null +++ b/inc/Parsing/Lexer/ParallelRegex.php @@ -0,0 +1,201 @@ +case = $case; + } + + /** + * 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 + */ + 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 bool|string False if no match found, label if label exists, true if not + */ + public function apply($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); + // FIXME this could be made faster by storing the labels as keys in a hashmap + 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. + * + * @author Christopher Smith + */ + public 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 = [$subject, "", ""]; + return false; + } + + $idx = count($matches) - 2; + [$pre, $post] = preg_split($this->patterns[$idx] . $this->getPerlMatchingFlags(), $subject, 2); + $split = [$pre, $matches[0], $post]; + + return $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. + * + * @return null|string + */ + protected 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 (str_starts_with($elt, '\\')) + $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. + */ + protected function getPerlMatchingFlags() + { + return ($this->case ? "msS" : "msSi"); + } +} diff --git a/inc/Parsing/Lexer/StateStack.php b/inc/Parsing/Lexer/StateStack.php new file mode 100644 index 0000000..a2d72e4 --- /dev/null +++ b/inc/Parsing/Lexer/StateStack.php @@ -0,0 +1,61 @@ +stack = [$start]; + } + + /** + * Accessor for current state. + * @return string State. + */ + 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. + */ + public function enter($state) + { + $this->stack[] = $state; + } + + /** + * Leaves the current state and reverts + * to the previous one. + * @return boolean false if we attempt to drop off the bottom of the list. + */ + public function leave() + { + if (count($this->stack) == 1) { + return false; + } + array_pop($this->stack); + return true; + } +} diff --git a/inc/Parsing/Parser.php b/inc/Parsing/Parser.php new file mode 100644 index 0000000..018f45e --- /dev/null +++ b/inc/Parsing/Parser.php @@ -0,0 +1,131 @@ +handler = $handler; + } + + /** + * Adds the base mode and initialized the lexer + * + * @param Base $BaseMode + */ + protected function addBaseMode($BaseMode) + { + $this->modes['base'] = $BaseMode; + if (!$this->lexer) { + $this->lexer = new Lexer($this->handler, 'base', true); + } + $this->modes['base']->Lexer = $this->lexer; + } + + /** + * Add a new syntax element (mode) to the parser + * + * PHP preserves order of associative elements + * Mode sequence is important + * + * @param string $name + * @param ModeInterface $Mode + */ + public function addMode($name, ModeInterface $Mode) + { + if (!isset($this->modes['base'])) { + $this->addBaseMode(new Base()); + } + $Mode->Lexer = $this->lexer; // FIXME should be done by setter + $this->modes[$name] = $Mode; + } + + /** + * Connect all modes with each other + * + * This is the last step before actually parsing. + */ + protected 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; + } + + /** + * Parses wiki syntax to instructions + * + * @param string $doc the wiki syntax text + * @return array instructions + */ + public function parse($doc) + { + $this->connectModes(); + // Normalize CRs and pad doc + $doc = "\n" . str_replace("\r\n", "\n", $doc) . "\n"; + $this->lexer->parse($doc); + + if (!method_exists($this->handler, 'finalize')) { + /** @deprecated 2019-10 we have a legacy handler from a plugin, assume legacy _finalize exists */ + + DebugHelper::dbgCustomDeprecationEvent( + 'finalize()', + get_class($this->handler) . '::_finalize()', + __METHOD__, + __FILE__, + __LINE__ + ); + $this->handler->_finalize(); + } else { + $this->handler->finalize(); + } + return $this->handler->calls; + } +} diff --git a/inc/Parsing/ParserMode/AbstractMode.php b/inc/Parsing/ParserMode/AbstractMode.php new file mode 100644 index 0000000..44dfe01 --- /dev/null +++ b/inc/Parsing/ParserMode/AbstractMode.php @@ -0,0 +1,42 @@ + + */ +abstract class AbstractMode implements ModeInterface +{ + /** @var Lexer $Lexer will be injected on loading FIXME this should be done by setter */ + public $Lexer; + protected $allowedModes = []; + + /** @inheritdoc */ + abstract public function getSort(); + + /** @inheritdoc */ + public function preConnect() + { + } + + /** @inheritdoc */ + public function connectTo($mode) + { + } + + /** @inheritdoc */ + public function postConnect() + { + } + + /** @inheritdoc */ + public function accepts($mode) + { + return in_array($mode, (array) $this->allowedModes); + } +} diff --git a/inc/Parsing/ParserMode/Acronym.php b/inc/Parsing/ParserMode/Acronym.php new file mode 100644 index 0000000..b80df48 --- /dev/null +++ b/inc/Parsing/ParserMode/Acronym.php @@ -0,0 +1,68 @@ +acronyms = $acronyms; + } + + /** @inheritdoc */ + public function preConnect() + { + if (!count($this->acronyms)) return; + + $bound = '[\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f]'; + $acronyms = array_map(['\\dokuwiki\\Parsing\\Lexer\\Lexer', 'escape'], $this->acronyms); + $this->pattern = '(?<=^|' . $bound . ')(?:' . implode('|', $acronyms) . ')(?=' . $bound . ')'; + } + + /** @inheritdoc */ + public function connectTo($mode) + { + if (!count($this->acronyms)) return; + + if (strlen($this->pattern) > 0) { + $this->Lexer->addSpecialPattern($this->pattern, $mode, 'acronym'); + } + } + + /** @inheritdoc */ + public function getSort() + { + return 240; + } + + /** + * sort callback to order by string length descending + * + * @param string $a + * @param string $b + * + * @return int + */ + protected function compare($a, $b) + { + $a_len = strlen($a); + $b_len = strlen($b); + if ($a_len > $b_len) { + return -1; + } elseif ($a_len < $b_len) { + return 1; + } + + return 0; + } +} diff --git a/inc/Parsing/ParserMode/Base.php b/inc/Parsing/ParserMode/Base.php new file mode 100644 index 0000000..85049ce --- /dev/null +++ b/inc/Parsing/ParserMode/Base.php @@ -0,0 +1,30 @@ +allowedModes = array_merge( + $PARSER_MODES['container'], + $PARSER_MODES['baseonly'], + $PARSER_MODES['paragraphs'], + $PARSER_MODES['formatting'], + $PARSER_MODES['substition'], + $PARSER_MODES['protected'], + $PARSER_MODES['disabled'] + ); + } + + /** @inheritdoc */ + public function getSort() + { + return 0; + } +} diff --git a/inc/Parsing/ParserMode/Camelcaselink.php b/inc/Parsing/ParserMode/Camelcaselink.php new file mode 100644 index 0000000..31fd812 --- /dev/null +++ b/inc/Parsing/ParserMode/Camelcaselink.php @@ -0,0 +1,22 @@ +Lexer->addSpecialPattern( + '\b[A-Z]+[a-z]+[A-Z][A-Za-z]*\b', + $mode, + 'camelcaselink' + ); + } + + /** @inheritdoc */ + public function getSort() + { + return 290; + } +} diff --git a/inc/Parsing/ParserMode/Code.php b/inc/Parsing/ParserMode/Code.php new file mode 100644 index 0000000..6efba0c --- /dev/null +++ b/inc/Parsing/ParserMode/Code.php @@ -0,0 +1,24 @@ +Lexer->addEntryPattern(')', $mode, 'code'); + } + + /** @inheritdoc */ + public function postConnect() + { + $this->Lexer->addExitPattern('', 'code'); + } + + /** @inheritdoc */ + public function getSort() + { + return 200; + } +} diff --git a/inc/Parsing/ParserMode/Emaillink.php b/inc/Parsing/ParserMode/Emaillink.php new file mode 100644 index 0000000..c4b7e35 --- /dev/null +++ b/inc/Parsing/ParserMode/Emaillink.php @@ -0,0 +1,19 @@ +Lexer->addSpecialPattern('<' . PREG_PATTERN_VALID_EMAIL . '>', $mode, 'emaillink'); + } + + /** @inheritdoc */ + public function getSort() + { + return 340; + } +} diff --git a/inc/Parsing/ParserMode/Entity.php b/inc/Parsing/ParserMode/Entity.php new file mode 100644 index 0000000..0435111 --- /dev/null +++ b/inc/Parsing/ParserMode/Entity.php @@ -0,0 +1,49 @@ +entities = $entities; + } + + + /** @inheritdoc */ + public function preConnect() + { + if (!count($this->entities) || $this->pattern != '') return; + + $sep = ''; + foreach ($this->entities as $entity) { + $this->pattern .= $sep . Lexer::escape($entity); + $sep = '|'; + } + } + + /** @inheritdoc */ + public function connectTo($mode) + { + if (!count($this->entities)) return; + + if (strlen($this->pattern) > 0) { + $this->Lexer->addSpecialPattern($this->pattern, $mode, 'entity'); + } + } + + /** @inheritdoc */ + public function getSort() + { + return 260; + } +} diff --git a/inc/Parsing/ParserMode/Eol.php b/inc/Parsing/ParserMode/Eol.php new file mode 100644 index 0000000..6190065 --- /dev/null +++ b/inc/Parsing/ParserMode/Eol.php @@ -0,0 +1,24 @@ +Lexer->addSpecialPattern('(?:^[ \t]*)?\n', $mode, 'eol'); + } + + /** @inheritdoc */ + public function getSort() + { + return 370; + } +} diff --git a/inc/Parsing/ParserMode/Externallink.php b/inc/Parsing/ParserMode/Externallink.php new file mode 100644 index 0000000..354254b --- /dev/null +++ b/inc/Parsing/ParserMode/Externallink.php @@ -0,0 +1,54 @@ +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[] = '(?patterns[] = '(?patterns as $pattern) { + $this->Lexer->addSpecialPattern($pattern, $mode, 'externallink'); + } + } + + /** @inheritdoc */ + public function getSort() + { + return 330; + } + + /** + * @return array + */ + public function getPatterns() + { + return $this->patterns; + } +} diff --git a/inc/Parsing/ParserMode/File.php b/inc/Parsing/ParserMode/File.php new file mode 100644 index 0000000..a49b1c1 --- /dev/null +++ b/inc/Parsing/ParserMode/File.php @@ -0,0 +1,24 @@ +Lexer->addEntryPattern(')', $mode, 'file'); + } + + /** @inheritdoc */ + public function postConnect() + { + $this->Lexer->addExitPattern('', 'file'); + } + + /** @inheritdoc */ + public function getSort() + { + return 210; + } +} diff --git a/inc/Parsing/ParserMode/Filelink.php b/inc/Parsing/ParserMode/Filelink.php new file mode 100644 index 0000000..3e57af3 --- /dev/null +++ b/inc/Parsing/ParserMode/Filelink.php @@ -0,0 +1,37 @@ +pattern = '\b(?i)file(?-i)://[' . $any . ']+?[' . + $punc . ']*[^' . $any . ']'; + } + + /** @inheritdoc */ + public function connectTo($mode) + { + $this->Lexer->addSpecialPattern( + $this->pattern, + $mode, + 'filelink' + ); + } + + /** @inheritdoc */ + public function getSort() + { + return 360; + } +} diff --git a/inc/Parsing/ParserMode/Footnote.php b/inc/Parsing/ParserMode/Footnote.php new file mode 100644 index 0000000..5bd2827 --- /dev/null +++ b/inc/Parsing/ParserMode/Footnote.php @@ -0,0 +1,49 @@ +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)]); + } + + /** @inheritdoc */ + public function connectTo($mode) + { + $this->Lexer->addEntryPattern( + '\x28\x28(?=.*\x29\x29)', + $mode, + 'footnote' + ); + } + + /** @inheritdoc */ + public function postConnect() + { + $this->Lexer->addExitPattern( + '\x29\x29', + 'footnote' + ); + } + + /** @inheritdoc */ + public function getSort() + { + return 150; + } +} diff --git a/inc/Parsing/ParserMode/Formatting.php b/inc/Parsing/ParserMode/Formatting.php new file mode 100644 index 0000000..7949698 --- /dev/null +++ b/inc/Parsing/ParserMode/Formatting.php @@ -0,0 +1,110 @@ + [ + 'entry' => '\*\*(?=.*\*\*)', + 'exit' => '\*\*', + 'sort' => 70 + ], + 'emphasis' => [ + 'entry' => '//(?=[^\x00]*[^:])', + //hack for bugs #384 #763 #1468 + 'exit' => '//', + 'sort' => 80, + ], + 'underline' => [ + 'entry' => '__(?=.*__)', + 'exit' => '__', + 'sort' => 90 + ], + 'monospace' => [ + 'entry' => '\x27\x27(?=.*\x27\x27)', + 'exit' => '\x27\x27', + 'sort' => 100 + ], + 'subscript' => [ + 'entry' => '(?=.*)', + 'exit' => '', + 'sort' => 110 + ], + 'superscript' => [ + 'entry' => '(?=.*)', + 'exit' => '', + 'sort' => 120 + ], + 'deleted' => [ + 'entry' => '(?=.*)', + 'exit' => '', + 'sort' => 130 + ] + ]; + + /** + * @param string $type + */ + public 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'] + ); + } + + /** @inheritdoc */ + public 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 + ); + } + + /** @inheritdoc */ + public function postConnect() + { + + $this->Lexer->addExitPattern( + $this->formatting[$this->type]['exit'], + $this->type + ); + } + + /** @inheritdoc */ + public function getSort() + { + return $this->formatting[$this->type]['sort']; + } +} diff --git a/inc/Parsing/ParserMode/Header.php b/inc/Parsing/ParserMode/Header.php new file mode 100644 index 0000000..8dc8937 --- /dev/null +++ b/inc/Parsing/ParserMode/Header.php @@ -0,0 +1,23 @@ +Lexer->addSpecialPattern( + '[ \t]*={2,}[^\n]+={2,}[ \t]*(?=\n)', + $mode, + 'header' + ); + } + + /** @inheritdoc */ + public function getSort() + { + return 50; + } +} diff --git a/inc/Parsing/ParserMode/Hr.php b/inc/Parsing/ParserMode/Hr.php new file mode 100644 index 0000000..a64137b --- /dev/null +++ b/inc/Parsing/ParserMode/Hr.php @@ -0,0 +1,18 @@ +Lexer->addSpecialPattern('\n[ \t]*-{4,}[ \t]*(?=\n)', $mode, 'hr'); + } + + /** @inheritdoc */ + public function getSort() + { + return 160; + } +} diff --git a/inc/Parsing/ParserMode/Internallink.php b/inc/Parsing/ParserMode/Internallink.php new file mode 100644 index 0000000..c3ed458 --- /dev/null +++ b/inc/Parsing/ParserMode/Internallink.php @@ -0,0 +1,19 @@ +Lexer->addSpecialPattern("\[\[.*?\]\](?!\])", $mode, 'internallink'); + } + + /** @inheritdoc */ + public function getSort() + { + return 300; + } +} diff --git a/inc/Parsing/ParserMode/Linebreak.php b/inc/Parsing/ParserMode/Linebreak.php new file mode 100644 index 0000000..9b52467 --- /dev/null +++ b/inc/Parsing/ParserMode/Linebreak.php @@ -0,0 +1,18 @@ +Lexer->addSpecialPattern('\x5C{2}(?:[ \t]|(?=\n))', $mode, 'linebreak'); + } + + /** @inheritdoc */ + public function getSort() + { + return 140; + } +} diff --git a/inc/Parsing/ParserMode/Listblock.php b/inc/Parsing/ParserMode/Listblock.php new file mode 100644 index 0000000..a9adbe6 --- /dev/null +++ b/inc/Parsing/ParserMode/Listblock.php @@ -0,0 +1,43 @@ +allowedModes = array_merge( + $PARSER_MODES['formatting'], + $PARSER_MODES['substition'], + $PARSER_MODES['disabled'], + $PARSER_MODES['protected'] + ); + } + + /** @inheritdoc */ + public 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'); + } + + /** @inheritdoc */ + public function postConnect() + { + $this->Lexer->addExitPattern('\n', 'listblock'); + } + + /** @inheritdoc */ + public function getSort() + { + return 10; + } +} diff --git a/inc/Parsing/ParserMode/Media.php b/inc/Parsing/ParserMode/Media.php new file mode 100644 index 0000000..ec6b322 --- /dev/null +++ b/inc/Parsing/ParserMode/Media.php @@ -0,0 +1,19 @@ +Lexer->addSpecialPattern("\{\{(?:[^\}]|(?:\}[^\}]))+\}\}", $mode, 'media'); + } + + /** @inheritdoc */ + public function getSort() + { + return 320; + } +} diff --git a/inc/Parsing/ParserMode/ModeInterface.php b/inc/Parsing/ParserMode/ModeInterface.php new file mode 100644 index 0000000..7cca038 --- /dev/null +++ b/inc/Parsing/ParserMode/ModeInterface.php @@ -0,0 +1,46 @@ +Lexer->addSpecialPattern( + '(?<=\b)(?:[1-9]|\d{2,})[xX]\d+(?=\b)', + $mode, + 'multiplyentity' + ); + } + + /** @inheritdoc */ + public function getSort() + { + return 270; + } +} diff --git a/inc/Parsing/ParserMode/Nocache.php b/inc/Parsing/ParserMode/Nocache.php new file mode 100644 index 0000000..93ffb39 --- /dev/null +++ b/inc/Parsing/ParserMode/Nocache.php @@ -0,0 +1,18 @@ +Lexer->addSpecialPattern('~~NOCACHE~~', $mode, 'nocache'); + } + + /** @inheritdoc */ + public function getSort() + { + return 40; + } +} diff --git a/inc/Parsing/ParserMode/Notoc.php b/inc/Parsing/ParserMode/Notoc.php new file mode 100644 index 0000000..5747050 --- /dev/null +++ b/inc/Parsing/ParserMode/Notoc.php @@ -0,0 +1,18 @@ +Lexer->addSpecialPattern('~~NOTOC~~', $mode, 'notoc'); + } + + /** @inheritdoc */ + public function getSort() + { + return 30; + } +} diff --git a/inc/Parsing/ParserMode/Plugin.php b/inc/Parsing/ParserMode/Plugin.php new file mode 100644 index 0000000..5023af6 --- /dev/null +++ b/inc/Parsing/ParserMode/Plugin.php @@ -0,0 +1,14 @@ +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'); + } + + /** @inheritdoc */ + public function postConnect() + { + $this->Lexer->addExitPattern('\n', 'preformatted'); + } + + /** @inheritdoc */ + public function getSort() + { + return 20; + } +} diff --git a/inc/Parsing/ParserMode/Quote.php b/inc/Parsing/ParserMode/Quote.php new file mode 100644 index 0000000..c6c2d28 --- /dev/null +++ b/inc/Parsing/ParserMode/Quote.php @@ -0,0 +1,40 @@ +allowedModes = array_merge( + $PARSER_MODES['formatting'], + $PARSER_MODES['substition'], + $PARSER_MODES['disabled'], + $PARSER_MODES['protected'] + ); + } + + /** @inheritdoc */ + public function connectTo($mode) + { + $this->Lexer->addEntryPattern('\n>{1,}', $mode, 'quote'); + } + + /** @inheritdoc */ + public function postConnect() + { + $this->Lexer->addPattern('\n>{1,}', 'quote'); + $this->Lexer->addExitPattern('\n', 'quote'); + } + + /** @inheritdoc */ + public function getSort() + { + return 220; + } +} diff --git a/inc/Parsing/ParserMode/Quotes.php b/inc/Parsing/ParserMode/Quotes.php new file mode 100644 index 0000000..f83964a --- /dev/null +++ b/inc/Parsing/ParserMode/Quotes.php @@ -0,0 +1,50 @@ +<"\''; // 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' + ); + } + + /** @inheritdoc */ + public function getSort() + { + return 280; + } +} diff --git a/inc/Parsing/ParserMode/Rss.php b/inc/Parsing/ParserMode/Rss.php new file mode 100644 index 0000000..757a5b1 --- /dev/null +++ b/inc/Parsing/ParserMode/Rss.php @@ -0,0 +1,18 @@ +Lexer->addSpecialPattern("\{\{rss>[^\}]+\}\}", $mode, 'rss'); + } + + /** @inheritdoc */ + public function getSort() + { + return 310; + } +} diff --git a/inc/Parsing/ParserMode/Smiley.php b/inc/Parsing/ParserMode/Smiley.php new file mode 100644 index 0000000..8523c9f --- /dev/null +++ b/inc/Parsing/ParserMode/Smiley.php @@ -0,0 +1,48 @@ +smileys = $smileys; + } + + /** @inheritdoc */ + public function preConnect() + { + if (!count($this->smileys) || $this->pattern != '') return; + + $sep = ''; + foreach ($this->smileys as $smiley) { + $this->pattern .= $sep . '(?<=\W|^)' . Lexer::escape($smiley) . '(?=\W|$)'; + $sep = '|'; + } + } + + /** @inheritdoc */ + public function connectTo($mode) + { + if (!count($this->smileys)) return; + + if (strlen($this->pattern) > 0) { + $this->Lexer->addSpecialPattern($this->pattern, $mode, 'smiley'); + } + } + + /** @inheritdoc */ + public function getSort() + { + return 230; + } +} diff --git a/inc/Parsing/ParserMode/Table.php b/inc/Parsing/ParserMode/Table.php new file mode 100644 index 0000000..4fb5585 --- /dev/null +++ b/inc/Parsing/ParserMode/Table.php @@ -0,0 +1,46 @@ +allowedModes = array_merge( + $PARSER_MODES['formatting'], + $PARSER_MODES['substition'], + $PARSER_MODES['disabled'], + $PARSER_MODES['protected'] + ); + } + + /** @inheritdoc */ + public function connectTo($mode) + { + $this->Lexer->addEntryPattern('[\t ]*\n\^', $mode, 'table'); + $this->Lexer->addEntryPattern('[\t ]*\n\|', $mode, 'table'); + } + + /** @inheritdoc */ + public 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'); + } + + /** @inheritdoc */ + public function getSort() + { + return 60; + } +} diff --git a/inc/Parsing/ParserMode/Unformatted.php b/inc/Parsing/ParserMode/Unformatted.php new file mode 100644 index 0000000..58f1435 --- /dev/null +++ b/inc/Parsing/ParserMode/Unformatted.php @@ -0,0 +1,27 @@ +Lexer->addEntryPattern('(?=.*)', $mode, 'unformatted'); + $this->Lexer->addEntryPattern('%%(?=.*%%)', $mode, 'unformattedalt'); + } + + /** @inheritdoc */ + public function postConnect() + { + $this->Lexer->addExitPattern('', 'unformatted'); + $this->Lexer->addExitPattern('%%', 'unformattedalt'); + $this->Lexer->mapHandler('unformattedalt', 'unformatted'); + } + + /** @inheritdoc */ + public function getSort() + { + return 170; + } +} diff --git a/inc/Parsing/ParserMode/Windowssharelink.php b/inc/Parsing/ParserMode/Windowssharelink.php new file mode 100644 index 0000000..a6517d6 --- /dev/null +++ b/inc/Parsing/ParserMode/Windowssharelink.php @@ -0,0 +1,30 @@ +pattern = "\\\\\\\\\w+?(?:\\\\[\w\-$]+)+"; + } + + /** @inheritdoc */ + public function connectTo($mode) + { + $this->Lexer->addSpecialPattern( + $this->pattern, + $mode, + 'windowssharelink' + ); + } + + /** @inheritdoc */ + public function getSort() + { + return 350; + } +} diff --git a/inc/Parsing/ParserMode/Wordblock.php b/inc/Parsing/ParserMode/Wordblock.php new file mode 100644 index 0000000..64d377f --- /dev/null +++ b/inc/Parsing/ParserMode/Wordblock.php @@ -0,0 +1,52 @@ +badwords = $badwords; + } + + /** @inheritdoc */ + public function preConnect() + { + + if (count($this->badwords) == 0 || $this->pattern != '') { + return; + } + + $sep = ''; + foreach ($this->badwords as $badword) { + $this->pattern .= $sep . '(?<=\b)(?i)' . Lexer::escape($badword) . '(?-i)(?=\b)'; + $sep = '|'; + } + } + + /** @inheritdoc */ + public function connectTo($mode) + { + if (strlen($this->pattern) > 0) { + $this->Lexer->addSpecialPattern($this->pattern, $mode, 'wordblock'); + } + } + + /** @inheritdoc */ + public function getSort() + { + return 250; + } +} diff --git a/inc/PassHash.php b/inc/PassHash.php new file mode 100644 index 0000000..8b1adb5 --- /dev/null +++ b/inc/PassHash.php @@ -0,0 +1,867 @@ + + * @author Schplurtz le Déboulonné + * @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 + * @author Schplurtz le Déboulonné + * + * @param string $clear Clear-Text password + * @param string $hash Hash to compare against + * @return bool + */ + public function verify_hash($clear, $hash) + { + $method = ''; + $salt = ''; + $magic = ''; + + //determine the used method and salt + if (str_starts_with($hash, 'U$')) { + // This may be an updated password from user_update_7000(). Such hashes + // have 'U' added as the first character and need an extra md5(). + $hash = substr($hash, 1); + $clear = md5($clear); + } + $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('/^\$S\$(.{52})$/', $hash, $m)) { + $method = 'drupal_sha512'; + $salt = $m[1]; + $magic = 'S'; + } 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 = ['algo' => $m[1], 'iter' => $m[2]]; + $salt = $m[3]; + } elseif (preg_match('/^PBKDF2(SHA\d+)\$(\d+)\$([[:xdigit:]]+)\$([[:xdigit:]]+)$/', $hash, $m)) { + $method = 'seafilepbkdf2'; + $magic = ['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 (str_starts_with($hash, '{SSHA}')) { + $method = 'ssha'; + $salt = substr(base64_decode(substr($hash, 6)), 20); + } elseif (str_starts_with($hash, '{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('/^\$(5|6)\$(rounds=\d+)?\$?(.+?)\$/', $hash, $m)) { + $method = 'sha2'; + $salt = $m[3]; + $magic = ['prefix' => $m[1], 'rounds' => $m[2]]; + } elseif (preg_match('/^\$(argon2id?)/', $hash, $m)) { + if (!defined('PASSWORD_' . strtoupper($m[1]))) { + throw new \Exception('This PHP installation has no ' . strtoupper($m[1]) . ' support'); + } + return password_verify($clear, $hash); + } 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 + * @author + * @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 + * @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 + * @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 stretched hashing wrapper. + * + * Initial hash is repeatedly rehashed with same password. + * Any salted hash algorithm supported by PHP hash() can be used. 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 2 to the power of the given count, + * maximum is 30 (-> 2^30 = 1_073_741_824). If a higher one is given, + * the function throws an exception. + * This iteration count is expected to grow with increasing power of + * new computers. + * + * @author Andreas Gohr + * @author Schplurtz le Déboulonné + * @link http://www.openwall.com/phpass/ + * + * @param string $algo The hash algorithm to be used + * @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 + */ + protected function stretched_hash($algo, $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 log2(iteration count) + $iter = strpos($itoa64, $iterc); + + if ($iter > 30) { + throw new \Exception("Too high iteration count ($iter) in " . + self::class . '::' . __FUNCTION__); + } + + $iter = 1 << $iter; + $salt = substr($salt, 1, 8); + + // iterate + $hash = hash($algo, $salt . $clear, true); + do { + $hash = hash($algo, $hash . $clear, true); + } while (--$iter); + + // encode + $output = ''; + $count = strlen($hash); + $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; + } + + /** + * Password hashing method 'pmd5' + * + * Repeatedly uses salted MD5 hashs. See stretched_hash() for the + * details. + * + * + * @author Schplurtz le Déboulonné + * @link http://www.openwall.com/phpass/ + * @see PassHash::stretched_hash() for the implementation details. + * + * @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) + { + return $this->stretched_hash('md5', $clear, $salt, $magic, $compute); + } + + /** + * Password hashing method 'drupal_sha512' + * + * Implements Drupal salted sha512 hashs. Drupal truncates the hash at 55 + * characters. See stretched_hash() for the details; + * + * @author Schplurtz le Déboulonné + * @link https://api.drupal.org/api/drupal/includes%21password.inc/7.x + * @see PassHash::stretched_hash() for the implementation details. + * + * @param string $clear The clear text to hash + * @param string $salt The salt to use, null for random + * @param string $magic The hash identifier (S) + * @param int $compute The iteration count for new passwords (defautl is drupal 7's) + * @throws Exception + * @return string Hashed password + */ + public function hash_drupal_sha512($clear, $salt = null, $magic = 'S', $compute = 15) + { + return substr($this->stretched_hash('sha512', $clear, $salt, $magic, $compute), 0, 55); + } + + /** + * Alias for hash_pmd5 + * + * @param string $clear + * @param null|string $salt + * @param string $magic + * @param int $compute + * + * @return string + * @throws \Exception + */ + 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 'seafilepbkdf2' + * + * An algorithm and iteration count should be given in the opts array. + * + * Hash algorithm is the string that is in the password string in seafile + * database. It has to be converted to a php algo name. + * + * @author Schplurtz le Déboulonné + * @see https://stackoverflow.com/a/23670177 + * + * @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_seafilepbkdf2($clear, $salt = null, $opts = []) + { + $this->init_salt($salt, 64); + if (empty($opts['algo'])) { + $prefixalgo = 'SHA256'; + } else { + $prefixalgo = $opts['algo']; + } + $algo = strtolower($prefixalgo); + if (empty($opts['iter'])) { + $iter = 10000; + } 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 = hash_pbkdf2($algo, $clear, hex2bin($salt), $iter, 0); + return "PBKDF2$prefixalgo\$$iter\$$salt\$$hash"; + } + + /** + * 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 = []) + { + $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 = []) + { + $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 = []) + { + $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 SHA-2 + * + * This is only supported on PHP 5.3.2 or higher and will throw an exception if + * the needed crypt support is not available + * + * Uses: + * - SHA-2 with 256-bit output for prefix $5$ + * - SHA-2 with 512-bit output for prefix $6$ (default) + * + * @param string $clear The clear text to hash + * @param string $salt The salt to use, null for random + * @param array $opts ('rounds' => rounds for sha256/sha512, 'prefix' => selected method from SHA-2 family) + * @return string Hashed password + * @throws \Exception + */ + public function hash_sha2($clear, $salt = null, $opts = []) + { + if (empty($opts['prefix'])) { + $prefix = '6'; + } else { + $prefix = $opts['prefix']; + } + if (empty($opts['rounds'])) { + $rounds = null; + } else { + $rounds = $opts['rounds']; + } + if ($prefix == '5' && (!defined('CRYPT_SHA256') || CRYPT_SHA256 !== 1)) { + throw new \Exception('This PHP installation has no SHA256 support'); + } + if ($prefix == '6' && (!defined('CRYPT_SHA512') || CRYPT_SHA512 !== 1)) { + throw new \Exception('This PHP installation has no SHA512 support'); + } + $this->init_salt($salt, 8, false); + if (empty($rounds)) { + return crypt($clear, '$' . $prefix . '$' . $salt . '$'); + } else { + return crypt($clear, '$' . $prefix . '$' . $rounds . '$' . $salt . '$'); + } + } + + /** @see sha2 */ + public function hash_sha512($clear, $salt = null, $opts = []) + { + $opts['prefix'] = 6; + return $this->hash_sha2($clear, $salt, $opts); + } + + /** @see sha2 */ + public function hash_sha256($clear, $salt = null, $opts = []) + { + $opts['prefix'] = 5; + return $this->hash_sha2($clear, $salt, $opts); + } + + /** + * 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)); + } + + + /** + * Password hashing method 'argon2i' + * + * Uses php's own password_hash function to create argon2i password hash + * Default Cost and thread options are used for now. + * + * @link https://www.php.net/manual/de/function.password-hash.php + * + * @param string $clear The clear text to hash + * @return string Hashed password + */ + public function hash_argon2i($clear) + { + if (!defined('PASSWORD_ARGON2I')) { + throw new \Exception('This PHP installation has no ARGON2I support'); + } + return password_hash($clear, PASSWORD_ARGON2I); + } + + /** + * Password hashing method 'argon2id' + * + * Uses php's own password_hash function to create argon2id password hash + * Default Cost and thread options are used for now. + * + * @link https://www.php.net/manual/de/function.password-hash.php + * + * @param string $clear The clear text to hash + * @return string Hashed password + */ + public function hash_argon2id($clear) + { + if (!defined('PASSWORD_ARGON2ID')) { + throw new \Exception('This PHP installation has no ARGON2ID support'); + } + return password_hash($clear, PASSWORD_ARGON2ID); + } + + /** + * 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++) { + $ochar = $opad[$i] ^ $key[$i]; + $ichar = $ipad[$i] ^ $key[$i]; + $opad[$i] = $ochar; + $ipad[$i] = $ichar; + } + + $output = $algo($opad . pack($pack, $algo($ipad . $data))); + + return ($raw_output) ? pack($pack, $output) : $output; + } + + /** + * Use a secure random generator + * + * @param int $min + * @param int $max + * @return int + */ + protected function random($min, $max) + { + try { + return random_int($min, $max); + } catch (\Exception $e) { + // availability of random source is checked elsewhere in DokuWiki + // we demote this to an unchecked runtime exception here + throw new \RuntimeException($e->getMessage(), $e->getCode(), $e); + } + } +} diff --git a/inc/Remote/AccessDeniedException.php b/inc/Remote/AccessDeniedException.php new file mode 100644 index 0000000..65f6689 --- /dev/null +++ b/inc/Remote/AccessDeniedException.php @@ -0,0 +1,10 @@ + 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..'. + * i.e.: plugin.clock.getTime or plugin.clock_gmt.getTime + */ +class Api +{ + /** @var ApiCall[] core methods provided by dokuwiki */ + protected $coreMethods; + + /** @var ApiCall[] remote methods provided by dokuwiki plugins */ + protected $pluginMethods; + + /** + * Get all available methods with remote access. + * + * @return ApiCall[] with information to all available methods + */ + public function getMethods() + { + return array_merge($this->getCoreMethods(), $this->getPluginMethods()); + } + + /** + * Collects all the core methods + * + * @param ApiCore|MockApiCore $apiCore this parameter is used for testing. + * Here you can pass a non-default RemoteAPICore instance. (for mocking) + * @return ApiCall[] all core methods. + */ + public function getCoreMethods($apiCore = null) + { + if (!$this->coreMethods) { + if ($apiCore === null) { + $this->coreMethods = (new LegacyApiCore())->getMethods(); + } else { + $this->coreMethods = $apiCore->getMethods(); + } + } + return $this->coreMethods; + } + + /** + * Collects all the methods of the enabled Remote Plugins + * + * @return ApiCall[] all plugin methods. + */ + public function getPluginMethods() + { + if ($this->pluginMethods) return $this->pluginMethods; + + $plugins = plugin_list('remote'); + foreach ($plugins as $pluginName) { + /** @var RemotePlugin $plugin */ + $plugin = plugin_load('remote', $pluginName); + if (!is_subclass_of($plugin, RemotePlugin::class)) { + Logger::error("Remote Plugin $pluginName does not implement dokuwiki\Extension\RemotePlugin"); + continue; + } + + try { + $methods = $plugin->getMethods(); + } catch (\ReflectionException $e) { + Logger::error( + "Remote Plugin $pluginName failed to return methods", + $e->getMessage(), + $e->getFile(), + $e->getLine() + ); + continue; + } + + foreach ($methods as $method => $call) { + $this->pluginMethods["plugin.$pluginName.$method"] = $call; + } + } + + return $this->pluginMethods; + } + + /** + * 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. + * @throws RemoteException + */ + public function call($method, $args = []) + { + if ($args === null) { + $args = []; + } + + // pre-flight checks + $this->ensureApiIsEnabled(); + $methods = $this->getMethods(); + if (!isset($methods[$method])) { + throw new RemoteException('Method does not exist', -32603); + } + $this->ensureAccessIsAllowed($methods[$method]); + + // invoke the ApiCall + try { + return $methods[$method]($args); + } catch (\InvalidArgumentException | \ArgumentCountError $e) { + throw new RemoteException($e->getMessage(), -32602); + } + } + + /** + * Check that the API is generally enabled + * + * @return void + * @throws RemoteException thrown when the API is disabled + */ + public function ensureApiIsEnabled() + { + global $conf; + if (!$conf['remote'] || trim($conf['remoteuser']) == '!!not set!!') { + throw new AccessDeniedException('Server Error. API is not enabled in config.', -32604); + } + } + + /** + * Check if the current user is allowed to call the given method + * + * @param ApiCall $method + * @return void + * @throws AccessDeniedException Thrown when the user is not allowed to call the method + */ + public function ensureAccessIsAllowed(ApiCall $method) + { + global $conf; + global $INPUT; + global $USERINFO; + + if ($method->isPublic()) return; // public methods are always allowed + if (!$conf['useacl']) return; // ACL is not enabled, so we can't check users + if (trim($conf['remoteuser']) === '') return; // all users are allowed + if (auth_isMember($conf['remoteuser'], $INPUT->server->str('REMOTE_USER'), (array)($USERINFO['grps'] ?? []))) { + return; // user is allowed + } + + // still here? no can do + throw new AccessDeniedException('server error. not authorized to call method', -32604); + } +} diff --git a/inc/Remote/ApiCall.php b/inc/Remote/ApiCall.php new file mode 100644 index 0000000..fa05fe6 --- /dev/null +++ b/inc/Remote/ApiCall.php @@ -0,0 +1,179 @@ +method = $method; + $this->category = $category; + } + + /** + * Call the method + * + * Important: access/authentication checks need to be done before calling this! + * + * @param array $args + * @return mixed + */ + public function __invoke($args) + { + if (!array_is_list($args)) { + $args = $this->namedArgsToPositional($args); + } + return call_user_func_array($this->method, $args); + } + + /** + * Access the method documentation + * + * This lazy loads the docs only when needed + * + * @return DocBlockMethod + */ + public function getDocs() + { + if ($this->docs === null) { + try { + if (is_array($this->method)) { + $reflect = new ReflectionMethod($this->method[0], $this->method[1]); + } else { + $reflect = new ReflectionFunction($this->method); + } + $this->docs = new DocBlockMethod($reflect); + } catch (ReflectionException $e) { + throw new RuntimeException('Failed to parse API method documentation', 0, $e); + } + } + return $this->docs; + } + + /** + * Is this a public method? + * + * Public methods can be called without authentication + * + * @return bool + */ + public function isPublic() + { + return $this->isPublic; + } + + /** + * Set the public flag + * + * @param bool $isPublic + * @return $this + */ + public function setPublic(bool $isPublic = true) + { + $this->isPublic = $isPublic; + return $this; + } + + /** + * Get information about the argument of this call + * + * @return array + */ + public function getArgs() + { + return $this->getDocs()->getParameters(); + } + + /** + * Get information about the return value of this call + * + * @return array + */ + public function getReturn() + { + return $this->getDocs()->getReturn(); + } + + /** + * Get the summary of this call + * + * @return string + */ + public function getSummary() + { + return $this->getDocs()->getSummary(); + } + + /** + * Get the description of this call + * + * @return string + */ + public function getDescription() + { + return $this->getDocs()->getDescription(); + } + + /** + * Get the category of this call + * + * @return string + */ + public function getCategory() + { + return $this->category; + } + + /** + * Converts named arguments to positional arguments + * + * @fixme with PHP 8 we can use named arguments directly using the spread operator + * @param array $params + * @return array + */ + protected function namedArgsToPositional($params) + { + $args = []; + + foreach ($this->getDocs()->getParameters() as $arg => $arginfo) { + if (isset($params[$arg])) { + $args[] = $params[$arg]; + } elseif ($arginfo['optional'] && array_key_exists('default', $arginfo)) { + $args[] = $arginfo['default']; + } else { + throw new InvalidArgumentException("Missing argument $arg"); + } + } + + return $args; + } +} diff --git a/inc/Remote/ApiCore.php b/inc/Remote/ApiCore.php new file mode 100644 index 0000000..6f924ba --- /dev/null +++ b/inc/Remote/ApiCore.php @@ -0,0 +1,1001 @@ +' and 'dokuwiki.' namespaces + */ +class ApiCore +{ + /** @var int Increased whenever the API is changed */ + public const API_VERSION = 12; + + /** + * Returns details about the core methods + * + * @return array + */ + public function getMethods() + { + return [ + 'core.getAPIVersion' => (new ApiCall([$this, 'getAPIVersion'], 'info'))->setPublic(), + + 'core.getWikiVersion' => new ApiCall('getVersion', 'info'), + 'core.getWikiTitle' => (new ApiCall([$this, 'getWikiTitle'], 'info'))->setPublic(), + 'core.getWikiTime' => (new ApiCall([$this, 'getWikiTime'], 'info')), + + 'core.login' => (new ApiCall([$this, 'login'], 'user'))->setPublic(), + 'core.logoff' => new ApiCall([$this, 'logoff'], 'user'), + 'core.whoAmI' => (new ApiCall([$this, 'whoAmI'], 'user')), + 'core.aclCheck' => new ApiCall([$this, 'aclCheck'], 'user'), + + 'core.listPages' => new ApiCall([$this, 'listPages'], 'pages'), + 'core.searchPages' => new ApiCall([$this, 'searchPages'], 'pages'), + 'core.getRecentPageChanges' => new ApiCall([$this, 'getRecentPageChanges'], 'pages'), + + 'core.getPage' => (new ApiCall([$this, 'getPage'], 'pages')), + 'core.getPageHTML' => (new ApiCall([$this, 'getPageHTML'], 'pages')), + 'core.getPageInfo' => (new ApiCall([$this, 'getPageInfo'], 'pages')), + 'core.getPageHistory' => new ApiCall([$this, 'getPageHistory'], 'pages'), + 'core.getPageLinks' => new ApiCall([$this, 'getPageLinks'], 'pages'), + 'core.getPageBackLinks' => new ApiCall([$this, 'getPageBackLinks'], 'pages'), + + 'core.lockPages' => new ApiCall([$this, 'lockPages'], 'pages'), + 'core.unlockPages' => new ApiCall([$this, 'unlockPages'], 'pages'), + 'core.savePage' => new ApiCall([$this, 'savePage'], 'pages'), + 'core.appendPage' => new ApiCall([$this, 'appendPage'], 'pages'), + + 'core.listMedia' => new ApiCall([$this, 'listMedia'], 'media'), + 'core.getRecentMediaChanges' => new ApiCall([$this, 'getRecentMediaChanges'], 'media'), + + 'core.getMedia' => new ApiCall([$this, 'getMedia'], 'media'), + 'core.getMediaInfo' => new ApiCall([$this, 'getMediaInfo'], 'media'), + // todo: implement getMediaHistory + // todo: implement getMediaUsage + + 'core.saveMedia' => new ApiCall([$this, 'saveMedia'], 'media'), + 'core.deleteMedia' => new ApiCall([$this, 'deleteMedia'], 'media'), + ]; + } + + // region info + + /** + * Return the API version + * + * This is the version of the DokuWiki API. It increases whenever the API definition changes. + * + * When developing a client, you should check this version and make sure you can handle it. + * + * @return int + */ + public function getAPIVersion() + { + return self::API_VERSION; + } + + /** + * Returns the wiki title + * + * @link https://www.dokuwiki.org/config:title + * @return string + */ + public function getWikiTitle() + { + global $conf; + return $conf['title']; + } + + /** + * Return the current server time + * + * Returns a Unix timestamp (seconds since 1970-01-01 00:00:00 UTC). + * + * You can use this to compensate for differences between your client's time and the + * server's time when working with last modified timestamps (revisions). + * + * @return int A unix timestamp + */ + public function getWikiTime() + { + return time(); + } + + // endregion + + // region user + + /** + * Login + * + * This will use the given credentials and attempt to login the user. This will set the + * appropriate cookies, which can be used for subsequent requests. + * + * Use of this mechanism is discouraged. Using token authentication is preferred. + * + * @param string $user The user name + * @param string $pass The password + * @return int If the login was successful + */ + public function login($user, $pass) + { + global $conf; + /** @var AuthPlugin $auth */ + global $auth; + + if (!$conf['useacl']) return 0; + if (!$auth instanceof AuthPlugin) return 0; + + @session_start(); // reopen session for login + $ok = null; + if ($auth->canDo('external')) { + $ok = $auth->trustExternal($user, $pass, false); + } + if ($ok === null) { + $evdata = [ + 'user' => $user, + 'password' => $pass, + 'sticky' => false, + 'silent' => true + ]; + $ok = Event::createAndTrigger('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper'); + } + session_write_close(); // we're done with the session + + return $ok; + } + + /** + * Log off + * + * Attempt to log out the current user, deleting the appropriate cookies + * + * Use of this mechanism is discouraged. Using token authentication is preferred. + * + * @return int 0 on failure, 1 on success + */ + public function logoff() + { + global $conf; + global $auth; + if (!$conf['useacl']) return 0; + if (!$auth instanceof AuthPlugin) return 0; + + auth_logoff(); + + return 1; + } + + /** + * Info about the currently authenticated user + * + * @return User + */ + public function whoAmI() + { + return new User(); + } + + /** + * Check ACL Permissions + * + * This call allows to check the permissions for a given page/media and user/group combination. + * If no user/group is given, the current user is used. + * + * Read the link below to learn more about the permission levels. + * + * @link https://www.dokuwiki.org/acl#background_info + * @param string $page A page or media ID + * @param string $user username + * @param string[] $groups array of groups + * @return int permission level + * @throws RemoteException + */ + public function aclCheck($page, $user = '', $groups = []) + { + /** @var AuthPlugin $auth */ + global $auth; + + $page = $this->checkPage($page, 0, false, AUTH_NONE); + + if ($user === '') { + return auth_quickaclcheck($page); + } else { + if ($groups === []) { + $userinfo = $auth->getUserData($user); + if ($userinfo === false) { + $groups = []; + } else { + $groups = $userinfo['grps']; + } + } + return auth_aclcheck($page, $user, $groups); + } + } + + // endregion + + // region pages + + /** + * List all pages in the given namespace (and below) + * + * Setting the `depth` to `0` and the `namespace` to `""` will return all pages in the wiki. + * + * Note: author information is not available in this call. + * + * @param string $namespace The namespace to search. Empty string for root namespace + * @param int $depth How deep to search. 0 for all subnamespaces + * @param bool $hash Whether to include a MD5 hash of the page content + * @return Page[] A list of matching pages + * @todo might be a good idea to replace search_allpages with search_universal + */ + public function listPages($namespace = '', $depth = 1, $hash = false) + { + global $conf; + + $namespace = cleanID($namespace); + + // shortcut for all pages + if ($namespace === '' && $depth === 0) { + return $this->getAllPages($hash); + } + + // search_allpages handles depth weird, we need to add the given namespace depth + if ($depth) { + $depth += substr_count($namespace, ':') + 1; + } + + // run our search iterator to get the pages + $dir = utf8_encodeFN(str_replace(':', '/', $namespace)); + $data = []; + $opts['skipacl'] = 0; + $opts['depth'] = $depth; + $opts['hash'] = $hash; + search($data, $conf['datadir'], 'search_allpages', $opts, $dir); + + return array_map(static fn($item) => new Page( + $item['id'], + 0, // we're searching current revisions only + $item['mtime'], + '', // not returned by search_allpages + $item['size'], + null, // not returned by search_allpages + $item['hash'] ?? '' + ), $data); + } + + /** + * Get all pages at once + * + * This is uses the page index and is quicker than iterating which is done in listPages() + * + * @return Page[] A list of all pages + * @see listPages() + */ + protected function getAllPages($hash = false) + { + $list = []; + $pages = idx_get_indexer()->getPages(); + Sort::ksort($pages); + + foreach (array_keys($pages) as $idx) { + $perm = auth_quickaclcheck($pages[$idx]); + if ($perm < AUTH_READ || isHiddenPage($pages[$idx]) || !page_exists($pages[$idx])) { + continue; + } + + $page = new Page($pages[$idx], 0, 0, '', null, $perm); + if ($hash) $page->calculateHash(); + + $list[] = $page; + } + + return $list; + } + + /** + * Do a fulltext search + * + * This executes a full text search and returns the results. The query uses the standard + * DokuWiki search syntax. + * + * Snippets are provided for the first 15 results only. The title is either the first heading + * or the page id depending on the wiki's configuration. + * + * @link https://www.dokuwiki.org/search#syntax + * @param string $query The search query as supported by the DokuWiki search + * @return PageHit[] A list of matching pages + */ + public function searchPages($query) + { + $regex = []; + $data = ft_pageSearch($query, $regex); + $pages = []; + + // prepare additional data + $idx = 0; + foreach ($data as $id => $score) { + if ($idx < FT_SNIPPET_NUMBER) { + $snippet = ft_snippet($id, $regex); + $idx++; + } else { + $snippet = ''; + } + + $pages[] = new PageHit( + $id, + $snippet, + $score, + useHeading('navigation') ? p_get_first_heading($id) : $id + ); + } + return $pages; + } + + /** + * Get recent page changes + * + * Returns a list of recent changes to wiki pages. The results can be limited to changes newer than + * a given timestamp. + * + * Only changes within the configured `$conf['recent']` range are returned. This is the default + * when no timestamp is given. + * + * @link https://www.dokuwiki.org/config:recent + * @param int $timestamp Only show changes newer than this unix timestamp + * @return PageChange[] + * @author Michael Klier + * @author Michael Hamann + */ + public function getRecentPageChanges($timestamp = 0) + { + $recents = getRecentsSince($timestamp); + + $changes = []; + foreach ($recents as $recent) { + $changes[] = new PageChange( + $recent['id'], + $recent['date'], + $recent['user'], + $recent['ip'], + $recent['sum'], + $recent['type'], + $recent['sizechange'] + ); + } + + return $changes; + } + + /** + * Get a wiki page's syntax + * + * Returns the syntax of the given page. When no revision is given, the current revision is returned. + * + * A non-existing page (or revision) will return an empty string usually. For the current revision + * a page template will be returned if configured. + * + * Read access is required for the page. + * + * @param string $page wiki page id + * @param int $rev Revision timestamp to access an older revision + * @return string the syntax of the page + * @throws AccessDeniedException + * @throws RemoteException + */ + public function getPage($page, $rev = 0) + { + $page = $this->checkPage($page, $rev, false); + + $text = rawWiki($page, $rev); + if (!$text && !$rev) { + return pageTemplate($page); + } else { + return $text; + } + } + + /** + * Return a wiki page rendered to HTML + * + * The page is rendered to HTML as it would be in the wiki. The HTML consist only of the data for the page + * content itself, no surrounding structural tags, header, footers, sidebars etc are returned. + * + * References in the HTML are relative to the wiki base URL unless the `canonical` configuration is set. + * + * If the page does not exist, an error is returned. + * + * @link https://www.dokuwiki.org/config:canonical + * @param string $page page id + * @param int $rev revision timestamp + * @return string Rendered HTML for the page + * @throws AccessDeniedException + * @throws RemoteException + */ + public function getPageHTML($page, $rev = 0) + { + $page = $this->checkPage($page, $rev); + + return (string)p_wiki_xhtml($page, $rev, false); + } + + /** + * Return some basic data about a page + * + * The call will return an error if the requested page does not exist. + * + * Read access is required for the page. + * + * @param string $page page id + * @param int $rev revision timestamp + * @param bool $author whether to include the author information + * @param bool $hash whether to include the MD5 hash of the page content + * @return Page + * @throws AccessDeniedException + * @throws RemoteException + */ + public function getPageInfo($page, $rev = 0, $author = false, $hash = false) + { + $page = $this->checkPage($page, $rev); + + $result = new Page($page, $rev); + if ($author) $result->retrieveAuthor(); + if ($hash) $result->calculateHash(); + + return $result; + } + + /** + * Returns a list of available revisions of a given wiki page + * + * The number of returned pages is set by `$conf['recent']`, but non accessible revisions pages + * are skipped, so less than that may be returned. + * + * @link https://www.dokuwiki.org/config:recent + * @param string $page page id + * @param int $first skip the first n changelog lines, 0 starts at the current revision + * @return PageChange[] + * @throws AccessDeniedException + * @throws RemoteException + * @author Michael Klier + */ + public function getPageHistory($page, $first = 0) + { + global $conf; + + $page = $this->checkPage($page, 0, false); + + $pagelog = new PageChangeLog($page); + $pagelog->setChunkSize(1024); + // old revisions are counted from 0, so we need to subtract 1 for the current one + $revisions = $pagelog->getRevisions($first - 1, $conf['recent']); + + $result = []; + foreach ($revisions as $rev) { + if (!page_exists($page, $rev)) continue; // skip non-existing revisions + $info = $pagelog->getRevisionInfo($rev); + + $result[] = new PageChange( + $page, + $rev, + $info['user'], + $info['ip'], + $info['sum'], + $info['type'], + $info['sizechange'] + ); + } + + return $result; + } + + /** + * Get a page's links + * + * This returns a list of links found in the given page. This includes internal, external and interwiki links + * + * If a link occurs multiple times on the page, it will be returned multiple times. + * + * Read access for the given page is needed and page has to exist. + * + * @param string $page page id + * @return Link[] A list of links found on the given page + * @throws AccessDeniedException + * @throws RemoteException + * @todo returning link titles would be a nice addition + * @todo hash handling seems not to be correct + * @todo maybe return the same link only once? + * @author Michael Klier + */ + public function getPageLinks($page) + { + $page = $this->checkPage($page); + + // resolve page instructions + $ins = p_cached_instructions(wikiFN($page)); + + // instantiate new Renderer - needed for interwiki links + $Renderer = new Doku_Renderer_xhtml(); + $Renderer->interwiki = getInterwiki(); + + // parse instructions + $links = []; + foreach ($ins as $in) { + switch ($in[0]) { + case 'internallink': + $links[] = new Link('local', $in[1][0], wl($in[1][0])); + break; + case 'externallink': + $links[] = new Link('extern', $in[1][0], $in[1][0]); + break; + case 'interwikilink': + $url = $Renderer->_resolveInterWiki($in[1][2], $in[1][3]); + $links[] = new Link('interwiki', $in[1][0], $url); + break; + } + } + + return ($links); + } + + /** + * Get a page's backlinks + * + * A backlink is a wiki link on another page that links to the given page. + * + * Only links from pages readable by the current user are returned. The page itself + * needs to be readable. Otherwise an error is returned. + * + * @param string $page page id + * @return string[] A list of pages linking to the given page + * @throws AccessDeniedException + * @throws RemoteException + */ + public function getPageBackLinks($page) + { + $page = $this->checkPage($page, 0, false); + + return ft_backlinks($page); + } + + /** + * Lock the given set of pages + * + * This call will try to lock all given pages. It will return a list of pages that were + * successfully locked. If a page could not be locked, eg. because a different user is + * currently holding a lock, that page will be missing from the returned list. + * + * You should always ensure that the list of returned pages matches the given list of + * pages. It's up to you to decide how to handle failed locking. + * + * Note: you can only lock pages that you have write access for. It is possible to create + * a lock for a page that does not exist, yet. + * + * Note: it is not necessary to lock a page before saving it. The `savePage()` call will + * automatically lock and unlock the page for you. However if you plan to do related + * operations on multiple pages, locking them all at once beforehand can be useful. + * + * @param string[] $pages A list of pages to lock + * @return string[] A list of pages that were successfully locked + */ + public function lockPages($pages) + { + $locked = []; + + foreach ($pages as $id) { + $id = cleanID($id); + if ($id === '') continue; + if (auth_quickaclcheck($id) < AUTH_EDIT || checklock($id)) { + continue; + } + lock($id); + $locked[] = $id; + } + return $locked; + } + + /** + * Unlock the given set of pages + * + * This call will try to unlock all given pages. It will return a list of pages that were + * successfully unlocked. If a page could not be unlocked, eg. because a different user is + * currently holding a lock, that page will be missing from the returned list. + * + * You should always ensure that the list of returned pages matches the given list of + * pages. It's up to you to decide how to handle failed unlocking. + * + * Note: you can only unlock pages that you have write access for. + * + * @param string[] $pages A list of pages to unlock + * @return string[] A list of pages that were successfully unlocked + */ + public function unlockPages($pages) + { + $unlocked = []; + + foreach ($pages as $id) { + $id = cleanID($id); + if ($id === '') continue; + if (auth_quickaclcheck($id) < AUTH_EDIT || !unlock($id)) { + continue; + } + $unlocked[] = $id; + } + + return $unlocked; + } + + /** + * Save a wiki page + * + * Saves the given wiki text to the given page. If the page does not exist, it will be created. + * Just like in the wiki, saving an empty text will delete the page. + * + * You need write permissions for the given page and the page may not be locked by another user. + * + * @param string $page page id + * @param string $text wiki text + * @param string $summary edit summary + * @param bool $isminor whether this is a minor edit + * @return bool Returns true on success + * @throws AccessDeniedException no write access for page + * @throws RemoteException no id, empty new page or locked + * @author Michael Klier + */ + public function savePage($page, $text, $summary = '', $isminor = false) + { + global $TEXT; + global $lang; + + $page = $this->checkPage($page, 0, false, AUTH_EDIT); + $TEXT = cleanText($text); + + + if (!page_exists($page) && trim($TEXT) == '') { + throw new RemoteException('Refusing to write an empty new wiki page', 132); + } + + // Check, if page is locked + if (checklock($page)) { + throw new RemoteException('The page is currently locked', 133); + } + + // SPAM check + if (checkwordblock()) { + throw new RemoteException('The page content was blocked', 134); + } + + // autoset summary on new pages + if (!page_exists($page) && empty($summary)) { + $summary = $lang['created']; + } + + // autoset summary on deleted pages + if (page_exists($page) && empty($TEXT) && empty($summary)) { + $summary = $lang['deleted']; + } + + // FIXME auto set a summary in other cases "API Edit" might be a good idea? + + lock($page); + saveWikiText($page, $TEXT, $summary, $isminor); + unlock($page); + + // run the indexer if page wasn't indexed yet + idx_addPage($page); + + return true; + } + + /** + * Appends text to the end of a wiki page + * + * If the page does not exist, it will be created. If a page template for the non-existant + * page is configured, the given text will appended to that template. + * + * The call will create a new page revision. + * + * You need write permissions for the given page. + * + * @param string $page page id + * @param string $text wiki text + * @param string $summary edit summary + * @param bool $isminor whether this is a minor edit + * @return bool Returns true on success + * @throws AccessDeniedException + * @throws RemoteException + */ + public function appendPage($page, $text, $summary = '', $isminor = false) + { + $currentpage = $this->getPage($page); + if (!is_string($currentpage)) { + $currentpage = ''; + } + return $this->savePage($page, $currentpage . $text, $summary, $isminor); + } + + // endregion + + // region media + + /** + * List all media files in the given namespace (and below) + * + * Setting the `depth` to `0` and the `namespace` to `""` will return all media files in the wiki. + * + * When `pattern` is given, it needs to be a valid regular expression as understood by PHP's + * `preg_match()` including delimiters. + * The pattern is matched against the full media ID, including the namespace. + * + * @link https://www.php.net/manual/en/reference.pcre.pattern.syntax.php + * @param string $namespace The namespace to search. Empty string for root namespace + * @param string $pattern A regular expression to filter the returned files + * @param int $depth How deep to search. 0 for all subnamespaces + * @param bool $hash Whether to include a MD5 hash of the media content + * @return Media[] + * @author Gina Haeussge + */ + public function listMedia($namespace = '', $pattern = '', $depth = 1, $hash = false) + { + global $conf; + + $namespace = cleanID($namespace); + + $options = [ + 'skipacl' => 0, + 'depth' => $depth, + 'hash' => $hash, + 'pattern' => $pattern, + ]; + + $dir = utf8_encodeFN(str_replace(':', '/', $namespace)); + $data = []; + search($data, $conf['mediadir'], 'search_media', $options, $dir); + return array_map(static fn($item) => new Media( + $item['id'], + 0, // we're searching current revisions only + $item['mtime'], + $item['size'], + $item['perm'], + $item['isimg'], + $item['hash'] ?? '' + ), $data); + } + + /** + * Get recent media changes + * + * Returns a list of recent changes to media files. The results can be limited to changes newer than + * a given timestamp. + * + * Only changes within the configured `$conf['recent']` range are returned. This is the default + * when no timestamp is given. + * + * @link https://www.dokuwiki.org/config:recent + * @param int $timestamp Only show changes newer than this unix timestamp + * @return MediaChange[] + * @author Michael Klier + * @author Michael Hamann + */ + public function getRecentMediaChanges($timestamp = 0) + { + + $recents = getRecentsSince($timestamp, null, '', RECENTS_MEDIA_CHANGES); + + $changes = []; + foreach ($recents as $recent) { + $changes[] = new MediaChange( + $recent['id'], + $recent['date'], + $recent['user'], + $recent['ip'], + $recent['sum'], + $recent['type'], + $recent['sizechange'] + ); + } + + return $changes; + } + + /** + * Get a media file's content + * + * Returns the content of the given media file. When no revision is given, the current revision is returned. + * + * @link https://en.wikipedia.org/wiki/Base64 + * @param string $media file id + * @param int $rev revision timestamp + * @return string Base64 encoded media file contents + * @throws AccessDeniedException no permission for media + * @throws RemoteException not exist + * @author Gina Haeussge + * + */ + public function getMedia($media, $rev = 0) + { + $media = cleanID($media); + if (auth_quickaclcheck($media) < AUTH_READ) { + throw new AccessDeniedException('You are not allowed to read this media file', 211); + } + + $file = mediaFN($media, $rev); + if (!@ file_exists($file)) { + throw new RemoteException('The requested media file (revision) does not exist', 221); + } + + $data = io_readFile($file, false); + return base64_encode($data); + } + + /** + * Return info about a media file + * + * The call will return an error if the requested media file does not exist. + * + * Read access is required for the media file. + * + * @param string $media file id + * @param int $rev revision timestamp + * @param bool $author whether to include the author information + * @param bool $hash whether to include the MD5 hash of the media content + * @return Media + * @throws AccessDeniedException no permission for media + * @throws RemoteException if not exist + * @author Gina Haeussge + */ + public function getMediaInfo($media, $rev = 0, $author = false, $hash = false) + { + $media = cleanID($media); + if (auth_quickaclcheck($media) < AUTH_READ) { + throw new AccessDeniedException('You are not allowed to read this media file', 211); + } + if (!media_exists($media, $rev)) { + throw new RemoteException('The requested media file does not exist', 221); + } + + $info = new Media($media, $rev); + if ($hash) $info->calculateHash(); + if ($author) $info->retrieveAuthor(); + + return $info; + } + + /** + * Uploads a file to the wiki + * + * The file data has to be passed as a base64 encoded string. + * + * @link https://en.wikipedia.org/wiki/Base64 + * @param string $media media id + * @param string $base64 Base64 encoded file contents + * @param bool $overwrite Should an existing file be overwritten? + * @return bool Should always be true + * @throws RemoteException + * @author Michael Klier + */ + public function saveMedia($media, $base64, $overwrite = false) + { + $media = cleanID($media); + $auth = auth_quickaclcheck(getNS($media) . ':*'); + + if ($media === '') { + throw new RemoteException('Empty or invalid media ID given', 231); + } + + // clean up base64 encoded data + $base64 = strtr($base64, [ + "\n" => '', // strip newlines + "\r" => '', // strip carriage returns + '-' => '+', // RFC4648 base64url + '_' => '/', // RFC4648 base64url + ' ' => '+', // JavaScript data uri + ]); + + $data = base64_decode($base64, true); + if ($data === false) { + throw new RemoteException('Invalid base64 encoded data', 234); + } + + if ($data === '') { + throw new RemoteException('Empty file given', 235); + } + + // save temporary file + global $conf; + $ftmp = $conf['tmpdir'] . '/' . md5($media . clientIP()); + @unlink($ftmp); + io_saveFile($ftmp, $data); + + $res = media_save(['name' => $ftmp], $media, $overwrite, $auth, 'rename'); + if (is_array($res)) { + throw new RemoteException('Failed to save media: ' . $res[0], 236); + } + return (bool)$res; // should always be true at this point + } + + /** + * Deletes a file from the wiki + * + * You need to have delete permissions for the file. + * + * @param string $media media id + * @return bool Should always be true + * @throws AccessDeniedException no permissions + * @throws RemoteException file in use or not deleted + * @author Gina Haeussge + * + */ + public function deleteMedia($media) + { + $media = cleanID($media); + + $auth = auth_quickaclcheck($media); + $res = media_delete($media, $auth); + if ($res & DOKU_MEDIA_DELETED) { + return true; + } elseif ($res & DOKU_MEDIA_NOT_AUTH) { + throw new AccessDeniedException('You are not allowed to delete this media file', 212); + } elseif ($res & DOKU_MEDIA_INUSE) { + throw new RemoteException('Media file is still referenced', 232); + } elseif (!media_exists($media)) { + throw new RemoteException('The media file requested to delete does not exist', 221); + } else { + throw new RemoteException('Failed to delete media file', 233); + } + } + + // endregion + + + /** + * Convenience method for page checks + * + * This method will perform multiple tasks: + * + * - clean the given page id + * - disallow an empty page id + * - check if the page exists (unless disabled) + * - check if the user has the required access level (pass AUTH_NONE to skip) + * + * @param string $id page id + * @param int $rev page revision + * @param bool $existCheck + * @param int $minAccess + * @return string the cleaned page id + * @throws AccessDeniedException + * @throws RemoteException + */ + private function checkPage($id, $rev = 0, $existCheck = true, $minAccess = AUTH_READ) + { + $id = cleanID($id); + if ($id === '') { + throw new RemoteException('Empty or invalid page ID given', 131); + } + + if ($existCheck && !page_exists($id, $rev)) { + throw new RemoteException('The requested page (revision) does not exist', 121); + } + + if ($minAccess && auth_quickaclcheck($id) < $minAccess) { + throw new AccessDeniedException('You are not allowed to read this page', 111); + } + + return $id; + } +} diff --git a/inc/Remote/IXR/Client.php b/inc/Remote/IXR/Client.php new file mode 100644 index 0000000..9ca6646 --- /dev/null +++ b/inc/Remote/IXR/Client.php @@ -0,0 +1,86 @@ +posturl = $server; + } else { + $this->posturl = 'http://' . $server . ':' . $port . $path; + } + + $this->httpClient = new HTTPClient(); + $this->httpClient->timeout = $timeout; + } + + /** @inheritdoc */ + public function query(...$args) + { + $method = array_shift($args); + $request = new Request($method, $args); + $length = $request->getLength(); + $xml = $request->getXml(); + + $this->headers['Content-Type'] = 'text/xml'; + $this->headers['Content-Length'] = $length; + $this->httpClient->headers = array_merge($this->httpClient->headers, $this->headers); + + if (!$this->httpClient->sendRequest($this->posturl, $xml, 'POST')) { + $this->handleError(-32300, 'transport error - ' . $this->httpClient->error); + return false; + } + + // Check HTTP Response code + if ($this->httpClient->status < 200 || $this->httpClient->status > 206) { + $this->handleError(-32300, 'transport error - HTTP status ' . $this->httpClient->status); + return false; + } + + // Now parse what we've got back + $this->message = new Message($this->httpClient->resp_body); + if (!$this->message->parse()) { + // XML error + return $this->handleError(-32700, 'Parse error. Message not well formed'); + } + + // Is the message a fault? + if ($this->message->messageType == 'fault') { + return $this->handleError($this->message->faultCode, $this->message->faultString); + } + + // Message must be OK + return true; + } + + /** + * Direct access to the underlying HTTP client if needed + * + * @return HTTPClient + */ + public function getHTTPClient() + { + return $this->httpClient; + } +} diff --git a/inc/Remote/JsonRpcServer.php b/inc/Remote/JsonRpcServer.php new file mode 100644 index 0000000..40af30c --- /dev/null +++ b/inc/Remote/JsonRpcServer.php @@ -0,0 +1,188 @@ +remote = new Api(); + } + + /** + * Serve the request + * + * @param string $body Should only be set for testing, otherwise the request body is read from php://input + * @return mixed + * @throws RemoteException + */ + public function serve($body = '') + { + global $conf; + global $INPUT; + + if (!$conf['remote']) { + http_status(404); + throw new RemoteException("JSON-RPC server not enabled.", -32605); + } + if (!empty($conf['remotecors'])) { + header('Access-Control-Allow-Origin: ' . $conf['remotecors']); + } + if ($INPUT->server->str('REQUEST_METHOD') !== 'POST') { + http_status(405); + header('Allow: POST'); + throw new RemoteException("JSON-RPC server only accepts POST requests.", -32606); + } + if ($INPUT->server->str('CONTENT_TYPE') !== 'application/json') { + http_status(415); + throw new RemoteException("JSON-RPC server only accepts application/json requests.", -32606); + } + + try { + if ($body === '') { + $body = file_get_contents('php://input'); + } + if ($body !== '') { + $data = json_decode($body, true, 512, JSON_THROW_ON_ERROR); + } else { + $data = []; + } + } catch (\Exception $e) { + http_status(400); + throw new RemoteException("JSON-RPC server only accepts valid JSON.", -32700); + } + + return $this->createResponse($data); + } + + /** + * This executes the method and returns the result + * + * This should handle all JSON-RPC versions and our simplified version + * + * @link https://en.wikipedia.org/wiki/JSON-RPC + * @link https://www.jsonrpc.org/specification + * @param array $data + * @return array + * @throws RemoteException + */ + protected function createResponse($data) + { + global $INPUT; + $return = []; + + if (isset($data['method'])) { + // this is a standard conform request (at least version 1.0) + $method = $data['method']; + $params = $data['params'] ?? []; + $this->version = 1; + + // always return the same ID + if (isset($data['id'])) $return['id'] = $data['id']; + + // version 2.0 request + if (isset($data['jsonrpc'])) { + $return['jsonrpc'] = $data['jsonrpc']; + $this->version = (float)$data['jsonrpc']; + } + + // version 1.1 request + if (isset($data['version'])) { + $return['version'] = $data['version']; + $this->version = (float)$data['version']; + } + } else { + // this is a simplified request + $method = $INPUT->server->str('PATH_INFO'); + $method = trim($method, '/'); + $params = $data; + $this->version = 0; + } + + // excute the method + $return['result'] = $this->call($method, $params); + $this->addErrorData($return); // handles non-error info + return $return; + } + + /** + * Create an error response + * + * @param \Exception $exception + * @return array + */ + public function returnError($exception) + { + $return = []; + $this->addErrorData($return, $exception); + return $return; + } + + /** + * Depending on the requested version, add error data to the response + * + * @param array $response + * @param \Exception|null $e + * @return void + */ + protected function addErrorData(&$response, $e = null) + { + if ($e !== null) { + // error occured, add to response + $response['error'] = [ + 'code' => $e->getCode(), + 'message' => $e->getMessage() + ]; + } else { + // no error, act according to version + if ($this->version > 0 && $this->version < 2) { + // version 1.* wants null + $response['error'] = null; + } elseif ($this->version < 1) { + // simplified version wants success + $response['error'] = [ + 'code' => 0, + 'message' => 'success' + ]; + } + // version 2 wants no error at all + } + } + + /** + * Call an API method + * + * @param string $methodname + * @param array $args + * @return mixed + * @throws RemoteException + */ + public function call($methodname, $args) + { + try { + return $this->remote->call($methodname, $args); + } catch (AccessDeniedException $e) { + if (!isset($_SERVER['REMOTE_USER'])) { + http_status(401); + throw new RemoteException("server error. not authorized to call method $methodname", -32603); + } else { + http_status(403); + throw new RemoteException("server error. forbidden to call the method $methodname", -32604); + } + } catch (RemoteException $e) { + http_status(400); + throw $e; + } + } +} diff --git a/inc/Remote/LegacyApiCore.php b/inc/Remote/LegacyApiCore.php new file mode 100644 index 0000000..4b679de --- /dev/null +++ b/inc/Remote/LegacyApiCore.php @@ -0,0 +1,558 @@ + new ApiCall([$this, 'legacyGetVersion'], 'legacy'), + 'dokuwiki.login' => (new ApiCall([$this, 'legacyLogin'], 'legacy'))->setPublic(), + 'dokuwiki.logoff' => new ApiCall([$this, 'legacyLogoff'], 'legacy'), + 'dokuwiki.getPagelist' => new ApiCall([$this, 'legacyGetPagelist'], 'legacy'), + 'dokuwiki.search' => new ApiCall([$this, 'legacySearch'], 'legacy'), + 'dokuwiki.getTime' => new ApiCall([$this, 'legacyGetTime'], 'legacy'), + 'dokuwiki.setLocks' => new ApiCall([$this, 'legacySetLocks'], 'legacy'), + 'dokuwiki.getTitle' => (new ApiCall([$this, 'legacyGetTitle'], 'legacy'))->setPublic(), + 'dokuwiki.appendPage' => new ApiCall([$this, 'legacyAppendPage'], 'legacy'), + 'dokuwiki.createUser' => new ApiCall([$this, 'legacyCreateUser'], 'legacy'), + 'dokuwiki.deleteUsers' => new ApiCall([$this, 'legacyDeleteUsers'], 'legacy'), + 'wiki.getPage' => new ApiCall([$this, 'legacyGetPage'], 'legacy'), + 'wiki.getPageVersion' => new ApiCall([$this, 'legacyGetPageVersion'], 'legacy'), + 'wiki.getPageHTML' => new ApiCall([$this, 'legacyGetPageHTML'], 'legacy'), + 'wiki.getPageHTMLVersion' => new ApiCall([$this, 'legacyGetPageHTMLVersion'], 'legacy'), + 'wiki.getAllPages' => new ApiCall([$this, 'legacyGetAllPages'], 'legacy'), + 'wiki.getAttachments' => new ApiCall([$this, 'legacyGetAttachments'], 'legacy'), + 'wiki.getBackLinks' => new ApiCall([$this, 'legacyGetBackLinks'], 'legacy'), + 'wiki.getPageInfo' => new ApiCall([$this, 'legacyGetPageInfo'], 'legacy'), + 'wiki.getPageInfoVersion' => new ApiCall([$this, 'legacyGetPageInfoVersion'], 'legacy'), + 'wiki.getPageVersions' => new ApiCall([$this, 'legacyGetPageVersions'], 'legacy'), + 'wiki.putPage' => new ApiCall([$this, 'legacyPutPage'], 'legacy'), + 'wiki.listLinks' => new ApiCall([$this, 'legacyListLinks'], 'legacy'), + 'wiki.getRecentChanges' => new ApiCall([$this, 'legacyGetRecentChanges'], 'legacy'), + 'wiki.getRecentMediaChanges' => new ApiCall([$this, 'legacyGetRecentMediaChanges'], 'legacy'), + 'wiki.aclCheck' => new ApiCall([$this, 'legacyAclCheck'], 'legacy'), + 'wiki.putAttachment' => new ApiCall([$this, 'legacyPutAttachment'], 'legacy'), + 'wiki.deleteAttachment' => new ApiCall([$this, 'legacyDeleteAttachment'], 'legacy'), + 'wiki.getAttachment' => new ApiCall([$this, 'legacyGetAttachment'], 'legacy'), + 'wiki.getAttachmentInfo' => new ApiCall([$this, 'legacyGetAttachmentInfo'], 'legacy'), + 'dokuwiki.getXMLRPCAPIVersion' => (new ApiCall([$this, 'legacyGetXMLRPCAPIVersion'], 'legacy')) + ->setPublic(), + 'wiki.getRPCVersionSupported' => (new ApiCall([$this, 'legacyGetRPCVersionSupported'], 'legacy')) + ->setPublic(), + ] + ); + } + + /** + * This returns a XMLRPC object that will not work for the new JSONRPC API + * + * @param int $ts + * @return Date + */ + protected function toDate($ts) + { + return new Date($ts); + } + + + /** + * @deprecated use core.getWikiVersion instead + */ + public function legacyGetVersion() + { + return getVersion(); + } + + /** + * @deprecated use core.getWikiTime instead + */ + public function legacyGetTime() + { + return $this->getWikiTime(); + } + + + /** + * @deprecated use core.getPage instead + */ + public function legacyGetPage($id) + { + try { + return $this->getPage($id); + } catch (RemoteException $e) { + if ($e->getCode() === 121) { + return ''; + } + throw $e; + } + } + + /** + * @deprecated use core.getPage instead + */ + public function legacyGetPageVersion($id, $rev = '') + { + try { + return $this->getPage($id, $rev); + } catch (RemoteException $e) { + if ($e->getCode() === 121) { + return ''; + } + throw $e; + } + } + + /** + * @deprecated use core.getMedia instead + */ + public function legacyGetAttachment($id) + { + return new Base64(base64_decode($this->getMedia($id))); + } + + /** + * @deprecated use core.getMediaInfo instead + */ + public function legacygetAttachmentInfo($id) + { + $info = $this->getMediaInfo($id); + return [ + 'lastModified' => $this->toDate($info->revision), + 'size' => $info->size, + ]; + } + + /** + * @deprecated use core.getPageHTML instead + */ + public function legacyGetPageHTML($id) + { + try { + return $this->getPageHTML($id); + } catch (RemoteException $e) { + if ($e->getCode() === 121) { + return ''; + } + throw $e; + } + } + + /** + * @deprecated use core.getPageHTML instead + */ + public function legacyGetPageHTMLVersion($id, $rev = '') + { + try { + return $this->getPageHTML($id, (int)$rev); + } catch (RemoteException $e) { + if ($e->getCode() === 121) { + return ''; + } + throw $e; + } + } + + /** + * @deprecated use core.listPages instead + */ + public function legacyGetAllPages() + { + $pages = $this->listPages('', 0); + + $result = []; + foreach ($pages as $page) { + $result[] = [ + 'id' => $page->id, + 'perms' => $page->permission, + 'size' => $page->size, + 'lastModified' => $this->toDate($page->revision), + ]; + } + return $result; + } + + /** + * @deprecated use core.listPages instead + */ + public function legacyGetPagelist($ns, $opts = []) + { + $data = $this->listPages($ns, $opts['depth'] ?? 0, $opts['hash'] ?? false); + $result = []; + + foreach ($data as $page) { + $result[] = [ + 'id' => $page->id, + 'perms' => $page->permission, + 'size' => $page->size, + 'rev' => $page->revision, + 'mtime' => $page->revision, + 'hash' => $page->hash, + + ]; + } + + return $result; + } + + /** + * @deprecated use core.searchPages instead + */ + public function legacySearch($query) + { + $this->searchPages($query); + $pages = []; + + foreach ($this->searchPages($query) as $page) { + $pages[] = [ + 'id' => $page->id, + 'score' => $page->score, + 'rev' => $page->revision, + 'lastModified' => $this->toDate($page->revision), + 'size' => $page->size, + 'snippet' => $page->snippet, + 'title' => $page->title + ]; + } + + return $pages; + } + + /** + * @deprecated use core.getWikiTitle instead + */ + public function legacyGetTitle() + { + return $this->getWikiTitle(); + } + + /** + * @deprecated use core.listMedia instead + */ + public function legacyGetAttachments($ns, $options = []) + { + $files = $this->listMedia($ns, $options['pattern'] ?? '', $options['depth'] ?? 0, $options['hash'] ?? false); + $result = []; + foreach ($files as $file) { + $result[] = [ + 'id' => $file->id, + 'perms' => $file->permission, + 'size' => $file->size, + 'rev' => $file->revision, + 'lastModified' => $this->toDate($file->revision), + 'mtime' => $this->toDate($file->revision), + 'hash' => $file->hash, + 'file' => PhpString::basename(mediaFN($file->id)), + 'writable' => is_writable(mediaFN($file->id)), + 'isimg' => $file->isimage, + + ]; + } + return $result; + } + + /** + * @deprecated use core.getPageBackLinks instead + */ + public function legacyGetBackLinks($id) + { + return $this->getPageBackLinks($id); + } + + /** + * @deprecated use core.getPageInfo instead + */ + public function legacyGetPageInfo($id) + { + $info = $this->getPageInfo($id, 0); + return [ + 'name' => $info->id, + 'lastModified' => $this->toDate($info->revision), + 'author' => $info->author, + 'version' => $info->revision, + ]; + } + + /** + * @deprecated use core.getPageInfo instead + */ + public function legacyGetPageInfoVersion($id, $rev = '') + { + $info = $this->getPageInfo($id, $rev); + return [ + 'name' => $info->id, + 'lastModified' => $this->toDate($info->revision), + 'author' => $info->author, + 'version' => $info->revision, + ]; + } + + /** + * @deprecated use core.savePage instead + */ + public function legacyPutPage($id, $text, $params = []) + { + return $this->savePage($id, $text, $params['sum'] ?? '', $params['minor'] ?? false); + } + + /** + * @deprecated use core.appendPage instead + */ + public function legacyAppendPage($id, $text, $params = []) + { + $ok = $this->appendPage($id, $text, $params['summary'] ?? '', $params['minor'] ?? false); + if ($ok === true) { + return cleanID($id); + } else { + return $ok; + } + } + + /** + * @deprecated use plugin.usermanager.createUser instead + */ + public function legacyCreateUser($userStruct) + { + if (!auth_isadmin()) { + throw new AccessDeniedException('Only admins are allowed to create users', 114); + } + + /** @var AuthPlugin $auth */ + global $auth; + + if (!$auth->canDo('addUser')) { + throw new AccessDeniedException( + sprintf('Authentication backend %s can\'t do addUser', $auth->getPluginName()), + 114 + ); + } + + $user = trim($auth->cleanUser($userStruct['user'] ?? '')); + $password = $userStruct['password'] ?? ''; + $name = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $userStruct['name'] ?? '')); + $mail = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $userStruct['mail'] ?? '')); + $groups = $userStruct['groups'] ?? []; + + $notify = (bool)$userStruct['notify'] ?? false; + + if ($user === '') throw new RemoteException('empty or invalid user', 401); + if ($name === '') throw new RemoteException('empty or invalid user name', 402); + if (!mail_isvalid($mail)) throw new RemoteException('empty or invalid mail address', 403); + + if ((string)$password === '') { + $password = auth_pwgen($user); + } + + if (!is_array($groups) || $groups === []) { + $groups = null; + } + + $ok = $auth->triggerUserMod('create', [$user, $password, $name, $mail, $groups]); + + if ($ok !== false && $ok !== null) { + $ok = true; + } + + if ($ok) { + if ($notify) { + auth_sendPassword($user, $password); + } + } + + return $ok; + } + + + /** + * @deprecated use plugin.usermanager.deleteUser instead + */ + public function legacyDeleteUsers($usernames) + { + if (!auth_isadmin()) { + throw new AccessDeniedException('Only admins are allowed to delete users', 114); + } + /** @var AuthPlugin $auth */ + global $auth; + return (bool)$auth->triggerUserMod('delete', [$usernames]); + } + + /** + * @deprecated use core.saveMedia instead + */ + public function legacyPutAttachment($id, $file, $params = []) + { + $ok = $this->saveMedia($id, base64_encode($file), $params['ow'] ?? false); + if ($ok === true) { + return cleanID($id); + } else { + return $ok; + } + } + + /** + * @deprecated use core.deleteMedia instead + */ + public function legacyDeleteAttachment($id) + { + $ok = $this->deleteMedia($id); + if ($ok === true) { + return 0; + } else { + return $ok; + } + } + + /** + * @deprecated use core.aclCheck instead + */ + public function legacyAclCheck($id, $user = null, $groups = null) + { + return $this->aclCheck($id, (string)$user, (string)$groups); + } + + /** + * @deprecated use core.listLinks instead + */ + public function legacyListLinks($id) + { + $links = $this->getPageLinks($id); + $result = []; + foreach ($links as $link) { + $result[] = [ + 'type' => $link['type'], + 'page' => $link['page'], + 'href' => $link['href'], + ]; + } + return $result; + } + + /** + * @deprecated use core.getRecentChanges instead + */ + public function legacyGetRecentChanges($timestamp) + { + $recents = $this->getRecentPageChanges($timestamp); + $result = []; + foreach ($recents as $recent) { + $result[] = [ + 'name' => $recent->id, + 'lastModified' => $this->toDate($recent->revision), + 'author' => $recent->author, + 'version' => $recent->revision, + 'perms' => auth_quickaclcheck($recent->id), + 'size' => @filesize(wikiFN($recent->id)), + ]; + } + return $result; + } + + /** + * @deprecated use core.getRecentMediaChanges instead + */ + public function legacyGetRecentMediaChanges($timestamp) + { + $recents = $this->getRecentMediaChanges($timestamp); + $result = []; + foreach ($recents as $recent) { + $result[] = [ + 'name' => $recent->id, + 'lastModified' => $this->toDate($recent->revision), + 'author' => $recent->author, + 'version' => $recent->revision, + 'perms' => auth_quickaclcheck($recent->id), + 'size' => @filesize(mediaFN($recent->id)), + ]; + } + return $result; + } + + /** + * @deprecated use core.getPageHistory instead + */ + public function legacyGetPageVersions($id, $first = 0) + { + $revisions = $this->getPageHistory($id, $first); + $result = []; + + foreach ($revisions as $revision) { + $result[] = [ + 'user' => $revision->author, + 'ip' => $revision->ip, + 'type' => $revision->type, + 'sum' => $revision->summary, + 'modified' => $this->toDate($revision->revision), + 'version' => $revision->revision, + ]; + } + return $result; + } + + /** + * @deprecated Wiki RPC spec is no longer supported + */ + public function legacyGetRPCVersionSupported() + { + return 2; + } + + /** + * @deprecated use core.lockPages and core.unlockPages instead + */ + public function legacySetLocks($set) + { + $locked = $this->lockPages($set['lock']); + $lockfail = array_diff($set['lock'], $locked); + + $unlocked = $this->unlockPages($set['unlock']); + $unlockfail = array_diff($set['unlock'], $unlocked); + + return [ + 'locked' => $locked, + 'lockfail' => $lockfail, + 'unlocked' => $unlocked, + 'unlockfail' => $unlockfail + ]; + } + + /** + * @deprecated use core.getAPIVersion instead + */ + public function legacyGetXMLRPCAPIVersion() + { + return $this->getAPIVersion(); + } + + /** + * @deprecated use core.login instead + */ + public function legacyLogin($user, $pass) + { + return parent::login($user, $pass); + } + + /** + * @deprecated use core.logoff instead + */ + public function legacyLogoff() + { + return parent::logoff(); + } +} diff --git a/inc/Remote/OpenApiDoc/ClassResolver.php b/inc/Remote/OpenApiDoc/ClassResolver.php new file mode 100644 index 0000000..6198fec --- /dev/null +++ b/inc/Remote/OpenApiDoc/ClassResolver.php @@ -0,0 +1,186 @@ +getClassUses($context); + + return $classinfo['uses'][$classalias] ?? $classinfo['ownNS'] . '\\' . $classalias; + } + + /** + * Resolve a class name to a fully qualified class name and return a DocBlockClass for it + * + * Results are cached in the instance for reuse + * + * @param string $classalias The class name to resolve + * @param string $context The classname in which context in which the class is used + * @return DocBlockClass|null + */ + public function document($classalias, $context) + { + $class = $this->resolve($classalias, $context); + if (!class_exists($class)) return null; + + if (isset($this->classDocs[$class])) { + $reflector = new \ReflectionClass($class); + $this->classDocs[$class] = new DocBlockClass($reflector); + } + + return $this->classDocs[$class]; + } + + /** + * Cached fetching of all defined class aliases + * + * @param string $class The class to parse + * @return array + */ + public function getClassUses($class) + { + if (!isset($this->classUses[$class])) { + $reflector = new \ReflectionClass($class); + $source = $this->readSource($reflector->getFileName(), $reflector->getStartLine()); + $this->classUses[$class] = [ + 'ownNS' => $reflector->getNamespaceName(), + 'uses' => $this->tokenizeSource($source) + ]; + } + return $this->classUses[$class]; + } + + /** + * Parse the use statements from the given source code + * + * This is a simplified version of the code by @jasondmoss - we do not support multiple + * classed within one file + * + * @link https://gist.github.com/jasondmoss/6200807 + * @param string $source + * @return array + */ + private function tokenizeSource($source) + { + + $tokens = token_get_all($source); + + $useStatements = []; + $record = false; + $currentUse = [ + 'class' => '', + 'as' => '' + ]; + + foreach ($tokens as $token) { + if (!is_array($token)) { + // statement ended + if ($record) { + $useStatements[] = $currentUse; + $record = false; + $currentUse = [ + 'class' => '', + 'as' => '' + ]; + } + continue; + } + $tokenname = token_name($token[0]); + + if ($token[0] === T_CLASS) { + break; // we reached the class itself, no need to parse further + } + + if ($token[0] === T_USE) { + $record = 'class'; + continue; + } + + if ($token[0] === T_AS) { + $record = 'as'; + continue; + } + + if ($record) { + switch ($token[0]) { + case T_STRING: + case T_NS_SEPARATOR: + case defined('T_NAME_QUALIFIED') ? T_NAME_QUALIFIED : -1: // PHP 7.4 compatibility + $currentUse[$record] .= $token[1]; + break; + } + } + } + + // Return a lookup table alias to FQCN + $table = []; + foreach ($useStatements as $useStatement) { + $class = $useStatement['class']; + $alias = $useStatement['as'] ?: substr($class, strrpos($class, '\\') + 1); + $table[$alias] = $class; + } + + return $table; + } + + + /** + * Read file source up to the line where our class is defined. + * + * @return string + */ + protected function readSource($file, $startline) + { + $file = fopen($file, 'r'); + $line = 0; + $source = ''; + + while (!feof($file)) { + ++$line; + + if ($line >= $startline) { + break; + } + + $source .= fgets($file); + } + fclose($file); + + return $source; + } +} diff --git a/inc/Remote/OpenApiDoc/DocBlock.php b/inc/Remote/OpenApiDoc/DocBlock.php new file mode 100644 index 0000000..879b026 --- /dev/null +++ b/inc/Remote/OpenApiDoc/DocBlock.php @@ -0,0 +1,111 @@ +reflector = $reflector; + $docblock = $reflector->getDocComment(); + + // strip asterisks and leading spaces + $docblock = trim(preg_replace( + ['/^[ \t]*\/\*+[ \t]*/m', '/[ \t]*\*+[ \t]*/m', '/\*+\/\s*$/m', '/\s*\/\s*$/m'], + ['', '', '', ''], + $docblock + )); + + // get all tags + $tags = []; + if (preg_match_all('/^@(\w+)\s+(.*)$/m', $docblock, $matches, PREG_SET_ORDER)) { + foreach ($matches as $match) { + $tags[$match[1]][] = trim($match[2]); + } + } + + // strip the tags from the docblock + $docblock = preg_replace('/^@(\w+)\s+(.*)$/m', '', $docblock); + + // what remains is summary and description + [$summary, $description] = sexplode("\n\n", $docblock, 2, ''); + + // store everything + $this->summary = trim($summary); + $this->description = trim($description); + $this->tags = $tags; + } + + /** + * The class name of the declaring class + * + * @return string + */ + protected function getContext() + { + return $this->reflector->getDeclaringClass()->getName(); + } + + /** + * Get the first line of the description + * + * @return string + */ + public function getSummary() + { + return $this->summary; + } + + /** + * Get the full description + * + * @return string + */ + public function getDescription() + { + return $this->description; + } + + /** + * Get all tags + * + * @return array + */ + public function getTags() + { + return $this->tags; + } + + /** + * Get a specific tag + * + * @param string $tag + * @return array + */ + public function getTag($tag) + { + if (!isset($this->tags[$tag])) return []; + return $this->tags[$tag]; + } +} diff --git a/inc/Remote/OpenApiDoc/DocBlockClass.php b/inc/Remote/OpenApiDoc/DocBlockClass.php new file mode 100644 index 0000000..7b2b757 --- /dev/null +++ b/inc/Remote/OpenApiDoc/DocBlockClass.php @@ -0,0 +1,70 @@ +reflector->getName(); + } + + /** + * Get the public methods of this class + * + * @return DocBlockMethod[] + */ + public function getMethodDocs() + { + if ($this->methods) return $this->methods; + + foreach ($this->reflector->getMethods() as $method) { + /** @var \ReflectionMethod $method */ + if ($method->isConstructor()) continue; + if ($method->isDestructor()) continue; + if (!$method->isPublic()) continue; + $this->methods[$method->getName()] = new DocBlockMethod($method); + } + + return $this->methods; + } + + /** + * Get the public properties of this class + * + * @return DocBlockProperty[] + */ + public function getPropertyDocs() + { + if ($this->properties) return $this->properties; + + foreach ($this->reflector->getProperties() as $property) { + /** @var \ReflectionProperty $property */ + if (!$property->isPublic()) continue; + $this->properties[$property->getName()] = new DocBlockProperty($property); + } + + return $this->properties; + } +} diff --git a/inc/Remote/OpenApiDoc/DocBlockMethod.php b/inc/Remote/OpenApiDoc/DocBlockMethod.php new file mode 100644 index 0000000..26e0efd --- /dev/null +++ b/inc/Remote/OpenApiDoc/DocBlockMethod.php @@ -0,0 +1,112 @@ +refineParam(); + $this->refineReturn(); + } + + /** @inheritdoc */ + protected function getContext() + { + if ($this->reflector instanceof ReflectionFunction) { + return null; + } + return parent::getContext(); + } + + /** + * Convenience method to access the method parameters + * + * @return array + */ + public function getParameters() + { + return $this->getTag('param'); + } + + /** + * Convenience method to access the method return + * + * @return array + */ + public function getReturn() + { + return $this->getTag('return'); + } + + /** + * Parse the param tag into its components + * + * @return void + */ + protected function refineParam() + { + $result = []; + + // prefill from reflection + foreach ($this->reflector->getParameters() as $parameter) { + $refType = $parameter->getType(); + $result[$parameter->getName()] = [ + 'type' => new Type($refType ? $refType->getName() : 'string', $this->getContext()), + 'optional' => $parameter->isOptional(), + 'description' => '', + ]; + if ($parameter->isDefaultValueAvailable()) { + $result[$parameter->getName()]['default'] = $parameter->getDefaultValue(); + } + } + + // refine from doc tags + foreach ($this->tags['param'] ?? [] as $param) { + [$type, $name, $description] = array_map('trim', sexplode(' ', $param, 3, '')); + if ($name === '' || $name[0] !== '$') continue; + $name = substr($name, 1); + if (!isset($result[$name])) continue; // reflection says this param does not exist + + $result[$name]['type'] = new Type($type, $this->getContext()); + $result[$name]['description'] = $description; + } + $this->tags['param'] = $result; + } + + /** + * Parse the return tag into its components + * + * @return void + */ + protected function refineReturn() + { + + + // prefill from reflection + $refType = $this->reflector->getReturnType(); + $result = [ + 'type' => new Type($refType ? $refType->getName() : 'void', $this->getContext()), + 'description' => '', + ]; + + // refine from doc tag + foreach ($this->tags['return'] ?? [] as $return) { + [$type, $description] = array_map('trim', sexplode(' ', $return, 2, '')); + $result['type'] = new Type($type, $this->getContext()); + $result['description'] = $description; + } + $this->tags['return'] = $result; + } +} diff --git a/inc/Remote/OpenApiDoc/DocBlockProperty.php b/inc/Remote/OpenApiDoc/DocBlockProperty.php new file mode 100644 index 0000000..ec54600 --- /dev/null +++ b/inc/Remote/OpenApiDoc/DocBlockProperty.php @@ -0,0 +1,50 @@ +refineVar(); + } + + /** + * The Type of this property + * + * @return Type + */ + public function getType() + { + return $this->type; + } + + /** + * Parse the var tag into its components + * + * @return void + */ + protected function refineVar() + { + $refType = $this->reflector->getType(); + $this->type = new Type($refType ? $refType->getName() : 'string', $this->getContext()); + + + if (!isset($this->tags['var'])) return; + + [$type, $description] = array_map('trim', sexplode(' ', $this->tags['var'][0], 2, '')); + $this->type = new Type($type, $this->getContext()); + $this->summary = $description; + } +} diff --git a/inc/Remote/OpenApiDoc/OpenAPIGenerator.php b/inc/Remote/OpenApiDoc/OpenAPIGenerator.php new file mode 100644 index 0000000..8e91ef3 --- /dev/null +++ b/inc/Remote/OpenApiDoc/OpenAPIGenerator.php @@ -0,0 +1,382 @@ +api = new Api(); + } + + /** + * Generate the OpenAPI documentation + * + * @return string JSON encoded OpenAPI specification + */ + public function generate() + { + $this->documentation = []; + $this->documentation['openapi'] = '3.1.0'; + $this->documentation['info'] = [ + 'title' => 'DokuWiki API', + 'description' => 'The DokuWiki API OpenAPI specification', + 'version' => ((string)ApiCore::API_VERSION), + 'x-locale' => 'en-US', + ]; + + $this->addServers(); + $this->addSecurity(); + $this->addMethods(); + + return json_encode($this->documentation, JSON_PRETTY_PRINT); + } + + /** + * Read all error codes used in ApiCore.php + * + * This is useful for the documentation, but also for checking if the error codes are unique + * + * @return array + * @todo Getting all classes/methods registered with the API and reading their error codes would be even better + * @todo This is super crude. Using the PHP Tokenizer would be more sensible + */ + public function getErrorCodes() + { + $lines = file(DOKU_INC . 'inc/Remote/ApiCore.php'); + + $codes = []; + $method = ''; + + foreach ($lines as $no => $line) { + if (preg_match('/ *function (\w+)/', $line, $match)) { + $method = $match[1]; + } + if (preg_match('/^ *throw new RemoteException\(\'([^\']+)\'.*?, (\d+)/', $line, $match)) { + $codes[] = [ + 'line' => $no, + 'exception' => 'RemoteException', + 'method' => $method, + 'code' => $match[2], + 'message' => $match[1], + ]; + } + if (preg_match('/^ *throw new AccessDeniedException\(\'([^\']+)\'.*?, (\d+)/', $line, $match)) { + $codes[] = [ + 'line' => $no, + 'exception' => 'AccessDeniedException', + 'method' => $method, + 'code' => $match[2], + 'message' => $match[1], + ]; + } + } + + usort($codes, static fn($a, $b) => $a['code'] <=> $b['code']); + + return $codes; + } + + + /** + * Add the current DokuWiki instance as a server + * + * @return void + */ + protected function addServers() + { + $this->documentation['servers'] = [ + [ + 'url' => DOKU_URL . 'lib/exe/jsonrpc.php', + ], + ]; + } + + /** + * Define the default security schemes + * + * @return void + */ + protected function addSecurity() + { + $this->documentation['components']['securitySchemes'] = [ + 'basicAuth' => [ + 'type' => 'http', + 'scheme' => 'basic', + ], + 'jwt' => [ + 'type' => 'http', + 'scheme' => 'bearer', + 'bearerFormat' => 'JWT', + ] + ]; + $this->documentation['security'] = [ + [ + 'basicAuth' => [], + ], + [ + 'jwt' => [], + ], + ]; + } + + /** + * Add all methods available in the API to the documentation + * + * @return void + */ + protected function addMethods() + { + $methods = $this->api->getMethods(); + + $this->documentation['paths'] = []; + foreach ($methods as $method => $call) { + $this->documentation['paths']['/' . $method] = [ + 'post' => $this->getMethodDefinition($method, $call), + ]; + } + } + + /** + * Create the schema definition for a single API method + * + * @param string $method API method name + * @param ApiCall $call The call definition + * @return array + */ + protected function getMethodDefinition(string $method, ApiCall $call) + { + $description = $call->getDescription(); + $links = $call->getDocs()->getTag('link'); + if ($links) { + $description .= "\n\n**See also:**"; + foreach ($links as $link) { + $description .= "\n\n* " . $this->generateLink($link); + } + } + + $retType = $call->getReturn()['type']; + $result = array_merge( + [ + 'description' => $call->getReturn()['description'], + 'examples' => [$this->generateExample('result', $retType->getOpenApiType())], + ], + $this->typeToSchema($retType) + ); + + $definition = [ + 'operationId' => $method, + 'summary' => $call->getSummary() ?: $method, + 'description' => $description, + 'tags' => [PhpString::ucwords($call->getCategory())], + 'requestBody' => [ + 'required' => true, + 'content' => [ + 'application/json' => $this->getMethodArguments($call->getArgs()), + ] + ], + 'responses' => [ + 200 => [ + 'description' => 'Result', + 'content' => [ + 'application/json' => [ + 'schema' => [ + 'type' => 'object', + 'properties' => [ + 'result' => $result, + 'error' => [ + 'type' => 'object', + 'description' => 'Error object in case of an error', + 'properties' => [ + 'code' => [ + 'type' => 'integer', + 'description' => 'The error code', + 'examples' => [0], + ], + 'message' => [ + 'type' => 'string', + 'description' => 'The error message', + 'examples' => ['Success'], + ], + ], + ], + ], + ], + ], + ], + ], + ] + ]; + + if ($call->isPublic()) { + $definition['security'] = [ + new stdClass(), + ]; + $definition['description'] = 'This method is public and does not require authentication. ' . + "\n\n" . $definition['description']; + } + + if ($call->getDocs()->getTag('deprecated')) { + $definition['deprecated'] = true; + $definition['description'] = '**This method is deprecated.** ' . + $call->getDocs()->getTag('deprecated')[0] . + "\n\n" . $definition['description']; + } + + return $definition; + } + + /** + * Create the schema definition for the arguments of a single API method + * + * @param array $args The arguments of the method as returned by ApiCall::getArgs() + * @return array + */ + protected function getMethodArguments($args) + { + if (!$args) { + // even if no arguments are needed, we need to define a body + // this is to ensure the openapi spec knows that a application/json header is needed + return ['schema' => ['type' => 'null']]; + } + + $props = []; + $reqs = []; + $schema = [ + 'schema' => [ + 'type' => 'object', + 'required' => &$reqs, + 'properties' => &$props + ] + ]; + + foreach ($args as $name => $info) { + $example = $this->generateExample($name, $info['type']->getOpenApiType()); + + $description = $info['description']; + if ($info['optional'] && isset($info['default'])) { + $description .= ' [_default: `' . json_encode($info['default'], JSON_THROW_ON_ERROR) . '`_]'; + } + + $props[$name] = array_merge( + [ + 'description' => $description, + 'examples' => [$example], + ], + $this->typeToSchema($info['type']) + ); + if (!$info['optional']) $reqs[] = $name; + } + + + return $schema; + } + + /** + * Generate an example value for the given parameter + * + * @param string $name The parameter's name + * @param string $type The parameter's type + * @return mixed + */ + protected function generateExample($name, $type) + { + switch ($type) { + case 'integer': + if ($name === 'rev') return 0; + if ($name === 'revision') return 0; + if ($name === 'timestamp') return time() - 60 * 24 * 30 * 2; + return 42; + case 'boolean': + return true; + case 'string': + if ($name === 'page') return 'playground:playground'; + if ($name === 'media') return 'wiki:dokuwiki-128.png'; + return 'some-' . $name; + case 'array': + return ['some-' . $name, 'other-' . $name]; + default: + return new stdClass(); + } + } + + /** + * Generates a markdown link from a dokuwiki.org URL + * + * @param $url + * @return mixed|string + */ + protected function generateLink($url) + { + if (preg_match('/^https?:\/\/(www\.)?dokuwiki\.org\/(.+)$/', $url, $match)) { + $name = $match[2]; + + $name = str_replace(['_', '#', ':'], [' ', ' ', ' '], $name); + $name = PhpString::ucwords($name); + + return "[$name]($url)"; + } else { + return $url; + } + } + + + /** + * Generate the OpenAPI schema for the given type + * + * @param Type $type + * @return array + */ + public function typeToSchema(Type $type) + { + $schema = [ + 'type' => $type->getOpenApiType(), + ]; + + // if a sub type is known, define the items + if ($schema['type'] === 'array' && $type->getSubType()) { + $schema['items'] = $this->typeToSchema($type->getSubType()); + } + + // if this is an object, define the properties + if ($schema['type'] === 'object') { + try { + $baseType = $type->getBaseType(); + $doc = new DocBlockClass(new ReflectionClass($baseType)); + $schema['properties'] = []; + foreach ($doc->getPropertyDocs() as $property => $propertyDoc) { + $schema['properties'][$property] = array_merge( + [ + 'description' => $propertyDoc->getSummary(), + ], + $this->typeToSchema($propertyDoc->getType()) + ); + } + } catch (ReflectionException $e) { + // The class is not available, so we cannot generate a schema + } + } + + return $schema; + } +} diff --git a/inc/Remote/OpenApiDoc/Type.php b/inc/Remote/OpenApiDoc/Type.php new file mode 100644 index 0000000..209fba4 --- /dev/null +++ b/inc/Remote/OpenApiDoc/Type.php @@ -0,0 +1,149 @@ +typehint = $typehint; + $this->context = $context; + } + + /** + * Return the typehint as read from the docblock + * + * @return string + */ + public function __toString() + { + return $this->typehint; + } + + /** + * Return the base type + * + * This is the type this variable is. Eg. a string[] is an array. + * + * @return string + */ + public function getBaseType() + { + $typehint = $this->typehint; + + if (str_ends_with($typehint, '[]')) { + return 'array'; + } + + if (in_array($typehint, ['boolean', 'false', 'true'])) { + return 'bool'; + } + + if (in_array($typehint, ['integer', 'date'])) { + return 'int'; + } + + if ($typehint === 'file') { + return 'string'; + } + + // fully qualified class name + if ($typehint[0] === '\\') { + return ltrim($typehint, '\\'); + } + + // relative class name, try to resolve + if ($this->context && ctype_upper($typehint[0])) { + return ClassResolver::getInstance()->resolve($typehint, $this->context); + } + + return $typehint; + } + + /** + * Return a primitive type understood by the XMLRPC server + * + * @param string $typehint + * @return string + */ + public function getJSONRPCType() + { + return $this->getBaseType(); + } + + /** + * Get the base type as one of the supported OpenAPI types + * + * Formats (eg. int32 or double) are not supported + * + * @link https://swagger.io/docs/specification/data-models/data-types/ + * @return string + */ + public function getOpenApiType() + { + switch ($this->getBaseType()) { + case 'int': + return 'integer'; + case 'bool': + return 'boolean'; + case 'array': + return 'array'; + case 'string': + case 'mixed': + return 'string'; + case 'double': + case 'float': + return 'number'; + default: + return 'object'; + } + } + + + /** + * If this is an array, return the type of the array elements + * + * @return Type|null null if this is not a typed array + */ + public function getSubType() + { + $type = $this->typehint; + if (!str_ends_with($type, '[]')) { + return null; + } + $type = substr($type, 0, -2); + return new Type($type, $this->context); + } + + /** + * Return a type understood by the XMLRPC server + * + * @return string + */ + public function getXMLRPCType() + { + $type = $this->typehint; + + // keep custom types + if (in_array($type, ['date', 'file', 'struct'])) { + return $type; + } + + $type = $this->getBaseType($this->typehint); + + // primitive types + if (in_array($type, ['int', 'string', 'double', 'bool', 'array'])) { + return $type; + } + + // everything else is an object + return 'object'; //should this return 'struct'? + } +} diff --git a/inc/Remote/RemoteException.php b/inc/Remote/RemoteException.php new file mode 100644 index 0000000..129a6c2 --- /dev/null +++ b/inc/Remote/RemoteException.php @@ -0,0 +1,10 @@ +type = $type; + $this->page = $page; + $this->href = $href; + } + + /** @inheritdoc */ + public function __toString() + { + return $this->href; + } +} diff --git a/inc/Remote/Response/Media.php b/inc/Remote/Response/Media.php new file mode 100644 index 0000000..6b42582 --- /dev/null +++ b/inc/Remote/Response/Media.php @@ -0,0 +1,87 @@ +id = $id; + $this->file = mediaFN($this->id, $revision); + $this->revision = $revision ?: $mtime ?: filemtime($this->file); + $this->size = $size ?? filesize($this->file); + $this->permission = $perms ?? auth_quickaclcheck($this->id); + ; + $this->isimage = (bool)($isimage ?? preg_match("/\.(jpe?g|gif|png)$/", $id)); + $this->hash = $hash; + $this->author = $author; + } + + /** + * Calculate the hash for this page + * + * This is a heavy operation and should only be called when needed. + */ + public function calculateHash() + { + $this->hash = md5(io_readFile($this->file, false)); + } + + /** + * Retrieve the author of this page + */ + public function retrieveAuthor() + { + $pagelog = new MediaChangeLog($this->id, 1024); + $info = $pagelog->getRevisionInfo($this->revision); + $this->author = is_array($info) ? ($info['user'] ?: $info['ip']) : ''; + } + + /** @inheritdoc */ + public function __toString() + { + return $this->id . '@' . $this->revision; + } +} diff --git a/inc/Remote/Response/MediaChange.php b/inc/Remote/Response/MediaChange.php new file mode 100644 index 0000000..92ef93d --- /dev/null +++ b/inc/Remote/Response/MediaChange.php @@ -0,0 +1,52 @@ +id = $id; + $this->revision = $revision; + $this->author = $author; + $this->ip = $ip; + $this->summary = $summary; + $this->type = $type; + $this->sizechange = $sizechange; + } + + /** @inheritdoc */ + public function __toString() + { + return $this->id . '@' . $this->revision; + } +} diff --git a/inc/Remote/Response/Page.php b/inc/Remote/Response/Page.php new file mode 100644 index 0000000..6361dd2 --- /dev/null +++ b/inc/Remote/Response/Page.php @@ -0,0 +1,107 @@ +id = $id; + $this->file = wikiFN($this->id, $revision); + $this->revision = $revision ?: $mtime ?: @filemtime($this->file); + $this->size = $size ?? @filesize($this->file); + $this->permission = $perms ?? auth_quickaclcheck($this->id); + $this->hash = $hash; + $this->author = $author; + $this->title = $title ?: $this->retrieveTitle(); + } + + /** + * Get the title for the page + * + * Honors $conf['useheading'] + * + * @return string + */ + protected function retrieveTitle() + { + global $conf; + + if ($conf['useheading']) { + $title = p_get_first_heading($this->id); + if ($title) { + return $title; + } + } + return $this->id; + } + + /** + * Calculate the hash for this page + * + * This is a heavy operation and should only be called when needed. + */ + public function calculateHash() + { + $this->hash = md5(io_readFile($this->file)); + } + + /** + * Retrieve the author of this page + */ + public function retrieveAuthor() + { + $pagelog = new PageChangeLog($this->id, 1024); + $info = $pagelog->getRevisionInfo($this->revision); + $this->author = is_array($info) ? ($info['user'] ?: $info['ip']) : ''; + } + + /** @inheritdoc */ + public function __toString() + { + return $this->id . '@' . $this->revision; + } +} diff --git a/inc/Remote/Response/PageChange.php b/inc/Remote/Response/PageChange.php new file mode 100644 index 0000000..adc555b --- /dev/null +++ b/inc/Remote/Response/PageChange.php @@ -0,0 +1,52 @@ +id = $id; + $this->revision = $revision; + $this->author = $author; + $this->ip = $ip; + $this->summary = $summary; + $this->type = $type; + $this->sizechange = $sizechange; + } + + /** @inheritdoc */ + public function __toString() + { + return $this->id . '@' . $this->revision; + } +} diff --git a/inc/Remote/Response/PageHit.php b/inc/Remote/Response/PageHit.php new file mode 100644 index 0000000..c3a8ac2 --- /dev/null +++ b/inc/Remote/Response/PageHit.php @@ -0,0 +1,37 @@ +snippet = $snippet; + $this->score = $score; + } +} diff --git a/inc/Remote/Response/User.php b/inc/Remote/Response/User.php new file mode 100644 index 0000000..b45d91c --- /dev/null +++ b/inc/Remote/Response/User.php @@ -0,0 +1,71 @@ +login = $login; + $this->name = $name; + $this->mail = $mail; + $this->groups = $groups; + + if ($this->login === '') { + $this->login = $INPUT->server->str('REMOTE_USER'); + } + + if ($this->login === '') { + throw new \RuntimeException('No user available'); + } + + // for current user, use $USERINFO to fill up + if ($this->login === $INPUT->server->str('REMOTE_USER')) { + $this->name = $this->name ?: $USERINFO['name']; + $this->mail = $this->mail ?: $USERINFO['mail']; + $this->groups = $this->groups ?: $USERINFO['grps']; + } else { + // for other users, use auth_getUserData to fill up + $userData = $auth->getUserData($this->login); + $this->name = $this->name ?: $userData['name']; + $this->mail = $this->mail ?: $userData['mail']; + $this->groups = $this->groups ?: $userData['grps']; + } + + // check for admin and manager + $this->isadmin = auth_isAdmin($this->login, $this->groups); + $this->ismanager = auth_isManager($this->login, $this->groups); + } + + /** @inheritdoc */ + public function __toString() + { + return $this->login; + } +} diff --git a/inc/Remote/XmlRpcServer.php b/inc/Remote/XmlRpcServer.php new file mode 100644 index 0000000..1cfa914 --- /dev/null +++ b/inc/Remote/XmlRpcServer.php @@ -0,0 +1,70 @@ +remote = new Api(); + parent::__construct(false, false, $wait); + } + + /** @inheritdoc */ + public function serve($data = false) + { + global $conf; + if (!$conf['remote']) { + throw new ServerException("XML-RPC server not enabled.", -32605); + } + if (!empty($conf['remotecors'])) { + header('Access-Control-Allow-Origin: ' . $conf['remotecors']); + } + if ( + !isset($_SERVER['CONTENT_TYPE']) || + ( + strtolower($_SERVER['CONTENT_TYPE']) !== 'text/xml' && + strtolower($_SERVER['CONTENT_TYPE']) !== 'application/xml' + ) + ) { + throw new ServerException('XML-RPC server accepts XML requests only.', -32606); + } + + parent::serve($data); + } + + /** + * @inheritdoc + */ + protected function call($methodname, $args) + { + try { + $result = $this->remote->call($methodname, $args); + return $result; + } catch (AccessDeniedException $e) { + if (!isset($_SERVER['REMOTE_USER'])) { + http_status(401); + return new Error(-32603, "server error. not authorized to call method $methodname"); + } else { + http_status(403); + return new Error(-32604, "server error. forbidden to call the method $methodname"); + } + } catch (RemoteException $e) { + return new Error($e->getCode(), $e->getMessage()); + } + } +} diff --git a/inc/SafeFN.class.php b/inc/SafeFN.class.php new file mode 100644 index 0000000..a383f6d --- /dev/null +++ b/inc/SafeFN.class.php @@ -0,0 +1,169 @@ + + * @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 + */ + public static function encode($filename) + { + return self::unicodeToSafe(Unicode::fromUtf8($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 + */ + public static function decode($filename) + { + return Unicode::toUtf8(self::safeToUnicode(strtolower($filename))); + } + + public static function validatePrintableUtf8($printable_utf8) + { + return !preg_match('#[\x01-\x1f]#', $printable_utf8); + } + + public static function validateSafe($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 + */ + private static function unicodeToSafe($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); + } elseif ($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 + */ + private static function safeToUnicode($safe) + { + + $unicode = []; + $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; + } elseif ($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/inc/Search/Indexer.php b/inc/Search/Indexer.php new file mode 100644 index 0000000..97d0ec0 --- /dev/null +++ b/inc/Search/Indexer.php @@ -0,0 +1,1247 @@ + + */ +class Indexer +{ + /** + * @var array $pidCache Cache for getPID() + */ + protected $pidCache = []; + + /** + * 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 + * @author Andreas Gohr + */ + 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 = []; + // 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 = []; + foreach ($delwords as $word) { + if ($word != '') { + [$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 = implode(':', $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 + * @author Christopher Smith + * @author Tom N Harris + */ + protected function getPageWords($text) + { + + $tokens = $this->tokenizer($text); + $tokens = array_count_values($tokens); // count the frequency of each token + + $words = []; + foreach ($tokens as $w => $c) { + $l = wordlen($w); + if (isset($words[$l])) { + $words[$l][$w] = $c + ($words[$l][$w] ?? 0); + } else { + $words[$l] = [$w => $c]; + } + } + + // arrive here with $words = array(wordlen => array(word => frequency)) + $index = []; //resulting index + foreach (array_keys($words) as $wlen) { + $word_idx = $this->getIndex('w', $wlen); + $word_idx_modified = false; + 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] = []; + $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 + * @author Michael Hamann + */ + public function addMetaKeys($page, $key, $value = null) + { + if (!is_array($key)) { + $key = [$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 (isset($key['title'])) { + $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 = [$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 = []; + } + + 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)) { + return false; + } + + $pages[$new_id] = 'deleted:' . time() . random_int(0, 9999); + } + + $pages[$id] = $newpage; + + // update index + if (!$this->saveIndex('page', '', $pages)) { + $this->unlock(); + return false; + } + + // reset the pid cache + $this->pidCache = []; + + $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, if exists 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) { + [$id, $count] = explode('*', $part); + $newindexline = $this->updateTuple($newindexline, $id, $count); + + $keyline = explode(':', $pagekeys[$id]); + // remove old meta value + $keyline = array_diff($keyline, [$oldid]); + // add new meta value when not already present + if (!in_array($newid, $keyline)) { + $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 + */ + 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 + */ + 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 = []; + foreach ($delwords as $word) { + if ($word != '') { + [$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 ( + str_ends_with($f, '.idx') && + (str_starts_with($f, 'i') || + str_starts_with($f, 'w') || + str_ends_with($f, '_w.idx') || + str_ends_with($f, '_i.idx') || + str_ends_with($f, '_p.idx')) + ) + @unlink($conf['indexdir'] . "/$f"); + } + } + @unlink($conf['indexdir'] . '/lengths.idx'); + + // clear the pid cache + $this->pidCache = []; + + $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 + * @author Andreas Gohr + */ + public function tokenizer($text, $wc = false) + { + $wc = ($wc) ? '' : '\*'; + $stopwords =& idx_get_stopwords(); + + // prepare the text to be tokenized + $evt = new Event('INDEXER_TEXT_PREPARE', $text); + if ($evt->advise_before(true)) { + if (preg_match('/[^0-9A-Za-z ]/u', $text)) { + $text = Asian::separateAsianWords($text); + } + } + $evt->advise_after(); + unset($evt); + + $text = strtr( + $text, + ["\r" => ' ', "\n" => ' ', "\t" => ' ', "\xC2\xAD" => ''] + ); + if (preg_match('/[^0-9A-Za-z ]/u', $text)) + $text = Clean::stripspecials($text, ' ', '\._\-:' . $wc); + + $wordlist = explode(' ', $text); + foreach ($wordlist as $i => $word) { + $wordlist[$i] = (preg_match('/[^0-9A-Za-z]/u', $word)) ? + PhpString::strtolower($word) : strtolower($word); + } + + foreach ($wordlist as $i => $word) { + if ( + (!is_numeric($word) && strlen($word) < IDX_MINWORDLENGTH) + || in_array($word, $stopwords, true) + ) + 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 + * @author Andreas Gohr + */ + public function lookup(&$tokens) + { + $result = []; + $wids = $this->getIndexWords($tokens, $result); + if (empty($wids)) return []; + // load known words and documents + $page_idx = $this->getIndex('page', ''); + $docs = []; + 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 = []; + foreach ($result as $word => $res) { + $final[$word] = []; + 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 + * @author Michael Hamann + */ + public function lookupKey($key, &$value, $func = null) + { + if (!is_array($value)) + $value_array = [$value]; + else $value_array =& $value; + + // the matching ids for the provided value(s) + $value_ids = []; + + $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, [$val, $word])) + $value_ids[$i][] = $val; + } + } + } else { + foreach ($value_array as $val) { + $xval = $val; + $caret = '^'; + $dollar = '$'; + // check for wildcards + if (str_starts_with($xval, '*')) { + $xval = substr($xval, 1); + $caret = ''; + } + if (str_ends_with($xval, '*')) { + $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; + } elseif (($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 = []; + foreach ($value_array as $val) { + $result[$val] = []; + } + + $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] = [...$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 + */ + protected function getIndexWords(&$words, &$result) + { + $tokens = []; + $tokenlength = []; + $tokenwild = []; + foreach ($words as $word) { + $result[$word] = []; + $caret = '^'; + $dollar = '$'; + $xword = $word; + $wlen = wordlen($word); + + // check for wildcards + if (str_starts_with($xword, '*')) { + $xword = substr($xword, 1); + $caret = ''; + --$wlen; + } + if (str_ends_with($xword, '*')) { + $xword = substr($xword, 0, -1); + $dollar = ''; + --$wlen; + } + 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][] = [$word, '/' . $re . '/']; + if (!isset($tokenwild[$xword])) + $tokenwild[$xword] = $wlen; + } else { + $tokens[$xword][] = [$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 = $tokenwild === [] ? $tokenlength : min(array_keys($tokenlength)); + $indexes_known = $this->indexLengths($length_filter); + if ($tokenwild !== []) sort($indexes_known); + // get word IDs + $wids = []; + 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 + */ + 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 = []; + $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 + */ + public function histogram($min = 1, $max = 0, $minlen = 3, $key = null) + { + if ($min < 1) + $min = 1; + if ($max < $min) + $max = 0; + + $result = []; + + 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 = []; + 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 + * + * @return bool|string + */ + protected function lock() + { + global $conf; + $status = true; + $run = 0; + $lock = $conf['lockdir'] . '/_indexer.lock'; + while (!@mkdir($lock)) { + 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 ($conf['dperm']) { + chmod($lock, $conf['dperm']); + } + return $status; + } + + /** + * Release the indexer lock. + * + * @author Tom N Harris + * + * @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 + */ + protected function getIndex($idx, $suffix) + { + global $conf; + $fn = $conf['indexdir'] . '/' . $idx . $suffix . '.idx'; + if (!file_exists($fn)) return []; + 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 + */ + protected function saveIndex($idx, $suffix, &$lines) + { + global $conf; + $fn = $conf['indexdir'] . '/' . $idx . $suffix; + $fh = @fopen($fn . '.tmp', 'w'); + if (!$fh) return false; + fwrite($fh, implode("\n", $lines)); + if (!empty($lines)) + fwrite($fh, "\n"); + fclose($fh); + if ($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 + */ + 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 + */ + protected function saveIndexKey($idx, $suffix, $id, $line) + { + global $conf; + if (!str_ends_with($line, "\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 ($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 + */ + 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 + * + * @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 + * + * @param array|int $filter + * @return array + */ + protected function indexLengths($filter) + { + global $conf; + $idx = []; + if (is_array($filter)) { + // testing if index files exist only + $path = $conf['indexdir'] . "/i"; + foreach (array_keys($filter) as $key) { + if (file_exists($path . $key . '.idx')) + $idx[] = $key; + } + } else { + $lengths = idx_listIndexLengths(); + foreach ($lengths as $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 + * + * @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 + * @author Andreas Gohr + * + * @param array $keys + * @param string $line + * @return array + */ + protected function parseTuples(&$keys, $line) + { + $result = []; + if ($line == '') return $result; + $parts = explode(':', $line); + foreach ($parts as $tuple) { + if ($tuple === '') continue; + [$key, $cnt] = explode('*', $tuple); + if (!$cnt) continue; + if (isset($keys[$key])) { + $key = $keys[$key]; + if ($key === false || is_null($key)) continue; + } + $result[$key] = $cnt; + } + return $result; + } + + /** + * Sum the counts in a list of tuples. + * + * @author Tom N Harris + * + * @param string $line + * @return int + */ + protected function countTuples($line) + { + $freq = 0; + $parts = explode(':', $line); + foreach ($parts as $tuple) { + if ($tuple === '') continue; + [/* pid */, $cnt] = explode('*', $tuple); + $freq += (int)$cnt; + } + return $freq; + } +} diff --git a/inc/Sitemap/Item.php b/inc/Sitemap/Item.php new file mode 100644 index 0000000..c8e602f --- /dev/null +++ b/inc/Sitemap/Item.php @@ -0,0 +1,70 @@ +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 Item 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 Item(wl($id, '', true), $date, $changefreq, $priority); + } + + /** + * Get the XML representation of the sitemap item. + * + * @return string The XML representation. + */ + public function toXML() + { + $result = ' ' . NL + . ' ' . hsc($this->url) . '' . NL + . ' ' . date_iso8601($this->lastmod) . '' . NL; + if ($this->changefreq !== null) + $result .= ' ' . hsc($this->changefreq) . '' . NL; + if ($this->priority !== null) + $result .= ' ' . hsc($this->priority) . '' . NL; + $result .= ' ' . NL; + return $result; + } +} diff --git a/inc/Sitemap/Mapper.php b/inc/Sitemap/Mapper.php new file mode 100644 index 0000000..917fdd6 --- /dev/null +++ b/inc/Sitemap/Mapper.php @@ -0,0 +1,175 @@ + + */ + +namespace dokuwiki\Sitemap; + +use dokuwiki\Extension\Event; +use dokuwiki\HTTP\DokuHTTPClient; +use dokuwiki\Logger; + +/** + * A class for building sitemaps and pinging search engines with the sitemap URL. + * + * @author Michael Hamann + */ +class Mapper +{ + /** + * 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 = Mapper::getFilePath(); + + if (file_exists($sitemap)) { + if (!is_writable($sitemap)) return false; + } elseif (!is_writable(dirname($sitemap))) { + return false; + } + + if ( + @filesize($sitemap) && + @filemtime($sitemap) > (time() - ($conf['sitemap'] * 86400)) + ) { // 60*60*24=86400 + Logger::debug('Sitemapper::generate(): Sitemap up to date'); + return false; + } + + Logger::debug("Sitemapper::generate(): using $sitemap"); + + $pages = idx_get_indexer()->getPages(); + Logger::debug('Sitemapper::generate(): creating sitemap using ' . count($pages) . ' pages'); + $items = []; + + // build the sitemap items + foreach ($pages as $id) { + //skip hidden, non existing and restricted files + if (isHiddenPage($id)) continue; + if (auth_aclcheck($id, '', []) < AUTH_READ) continue; + $item = Item::createFromID($id); + if ($item instanceof Item) + $items[] = $item; + } + + $eventData = ['items' => &$items, 'sitemap' => &$sitemap]; + $event = new Event('SITEMAP_GENERATE', $eventData); + if ($event->advise_before(true)) { + //save the new sitemap + $event->result = io_saveFile($sitemap, (new Mapper())->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 function getXML($items) + { + ob_start(); + echo '' . NL; + echo '' . NL; + foreach ($items as $item) { + /** @var Item $item */ + echo $item->toXML(); + } + echo '' . 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('', ['do' => 'sitemap'], true, '&')); + $ping_urls = [ + 'google' => 'https://www.google.com/ping?sitemap=' . $encoded_sitemap_url, + 'yandex' => 'https://webmaster.yandex.com/ping?sitemap=' . $encoded_sitemap_url + ]; + + $data = [ + 'ping_urls' => $ping_urls, + 'encoded_sitemap_url' => $encoded_sitemap_url + ]; + $event = new Event('SITEMAP_PING', $data); + if ($event->advise_before(true)) { + foreach ($data['ping_urls'] as $name => $url) { + Logger::debug("Sitemapper::PingSearchEngines(): pinging $name"); + $resp = $http->get($url); + if ($http->error) { + Logger::debug("Sitemapper:pingSearchengines(): $http->error", $resp); + } + } + } + $event->advise_after(); + + return true; + } +} diff --git a/inc/StyleUtils.php b/inc/StyleUtils.php new file mode 100644 index 0000000..eb07856 --- /dev/null +++ b/inc/StyleUtils.php @@ -0,0 +1,193 @@ + "#000", + '__background__' => "#fff", + '__text_alt__' => "#999", + '__background_alt__' => "#eee", + '__text_neu__' => "#666", + '__background_neu__' => "#ddd", + '__border__' => "#ccc", + '__highlight__' => "#ff9", + '__link__' => "#00f" + ]; + + /** + * StyleUtils constructor. + * @param string $tpl template name: if not passed as argument, the default value from $conf will be used + * @param bool $preview + * @param bool $reinit whether static style conf should be reinitialized + */ + public function __construct($tpl = '', $preview = false, $reinit = false) + { + if (!$tpl) { + global $conf; + $tpl = $conf['template']; + } + $this->tpl = $tpl; + $this->reinit = $reinit; + $this->preview = $preview; + } + + /** + * Load style ini contents + * + * Loads and merges style.ini files from template and config and prepares + * the stylesheet modes + * + * @author Andreas Gohr + * @author Anna Dabrowska + * + * @return array with keys 'stylesheets' and 'replacements' + */ + public function cssStyleini() + { + static $combined = []; + if (!empty($combined) && !$this->reinit) { + return $combined; + } + + global $conf; + global $config_cascade; + $stylesheets = []; // mode, file => base + + // guaranteed placeholder => value + $replacements = $this->defaultReplacements; + + // merge all styles from config cascade + if (!is_array($config_cascade['styleini'])) { + trigger_error('Missing config cascade for styleini', E_USER_WARNING); + } + + // allow replacement overwrites in preview mode + if ($this->preview) { + $config_cascade['styleini']['local'][] = $conf['cachedir'] . '/preview.ini'; + } + + $combined['stylesheets'] = []; + $combined['replacements'] = []; + + foreach (['default', 'local', 'protected'] as $config_group) { + if (empty($config_cascade['styleini'][$config_group])) continue; + + // set proper server dirs + $webbase = $this->getWebbase($config_group); + + foreach ($config_cascade['styleini'][$config_group] as $inifile) { + // replace the placeholder with the name of the current template + $inifile = str_replace('%TEMPLATE%', $this->tpl, $inifile); + + $incbase = dirname($inifile) . '/'; + + if (file_exists($inifile)) { + $config = parse_ini_file($inifile, true); + + if (isset($config['stylesheets']) && is_array($config['stylesheets'])) { + foreach ($config['stylesheets'] as $inifile => $mode) { + // validate and include style files + $stylesheets = array_merge( + $stylesheets, + $this->getValidatedStyles($stylesheets, $inifile, $mode, $incbase, $webbase) + ); + $combined['stylesheets'] = array_merge($combined['stylesheets'], $stylesheets); + } + } + + if (isset($config['replacements']) && is_array($config['replacements'])) { + $replacements = array_replace( + $replacements, + $this->cssFixreplacementurls($config['replacements'], $webbase) + ); + $combined['replacements'] = array_merge($combined['replacements'], $replacements); + } + } + } + } + + return $combined; + } + + /** + * Checks if configured style files exist and, if necessary, adjusts file extensions in config + * + * @param array $stylesheets + * @param string $file + * @param string $mode + * @param string $incbase + * @param string $webbase + * @return mixed + */ + protected function getValidatedStyles($stylesheets, $file, $mode, $incbase, $webbase) + { + global $conf; + if (!file_exists($incbase . $file)) { + [$extension, $basename] = array_map('strrev', sexplode('.', 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 \"$this->tpl\" template.", 2); + } + } elseif ($conf['allowdebug']) { + msg("Stylesheet $file not found, please contact the developer of \"$this->tpl\" template.", 2); + } + } + $stylesheets[$mode][fullpath($incbase . $file)] = $webbase; + return $stylesheets; + } + + /** + * Returns the web base path for the given level/group in config cascade. + * Style resources are relative to the template directory for the main (default) styles + * but relative to DOKU_BASE for everything else" + * + * @param string $config_group + * @return string + */ + protected function getWebbase($config_group) + { + if ($config_group === 'default') { + return tpl_basedir($this->tpl); + } else { + return DOKU_BASE; + } + } + + /** + * Amend paths used in replacement relative urls, refer FS#2879 + * + * @author Chris Smith + * + * @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/inc/Subscriptions/BulkSubscriptionSender.php b/inc/Subscriptions/BulkSubscriptionSender.php new file mode 100644 index 0000000..30ff46d --- /dev/null +++ b/inc/Subscriptions/BulkSubscriptionSender.php @@ -0,0 +1,259 @@ +isenabled()) { + return 0; + } + + /** @var AuthPlugin $auth */ + global $auth; + global $conf; + global $USERINFO; + /** @var Input $INPUT */ + global $INPUT; + $count = 0; + + $subscriptions = $subscriberManager->subscribers($page, null, ['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) { + [$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 (str_ends_with($target, ':')) { + // 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 = [$meta['last_change']]; + } + + // Filter out pages only changed in small and own edits + $change_ids = []; + foreach ($changes as $rev) { + $n = 0; + $pagelog = new PageChangeLog($rev['id']); + while ( + !is_null($rev) && $rev['date'] >= $lastupdate && + ($INPUT->server->str('REMOTE_USER') === $rev['user'] || + $rev['type'] === DOKU_CHANGE_TYPE_MINOR_EDIT) + ) { + $revisions = $pagelog->getRevisions($n++, 1); + $rev = ($revisions !== []) ? $pagelog->getRevisionInfo($revisions[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->sendDigest( + $USERINFO['mail'], + $change_id, + $lastupdate + ); + $count++; + } + } elseif ($style === 'list') { + $this->sendList($USERINFO['mail'], $change_ids, $target); + $count++; + } + // TODO: Handle duplicate subscriptions. + + // Update notification time. + $subscriberManager->add($target, $user, $style, time()); + } + $this->unlock($target); + } + + // restore current user info + $USERINFO = $olduinfo; + $INPUT->server->set('REMOTE_USER', $olduser); + return $count; + } + + /** + * Lock subscription info + * + * We don't use io_lock() her because we do not wait for the lock and use a larger stale time + * + * @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 + * @author Adrian Lang + */ + 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)) { + return false; + } + + if ($conf['dperm']) { + chmod($lock, $conf['dperm']); + } + return true; + } + + /** + * Unlock subscription info + * + * @param string $id The target page or namespace, specified by id; Namespaces + * are identified by appending a colon. + * + * @return bool + * @author Adrian Lang + */ + protected function unlock($id) + { + global $conf; + $lock = $conf['lockdir'] . '/_subscr_' . md5($id) . '.lock'; + return @rmdir($lock); + } + + /** + * Send a digest mail + * + * Sends a digest mail showing a bunch of changes of a single page. Basically the same as sendPageDiff() + * but determines the last known revision first + * + * @param string $subscriber_mail The target mail address + * @param string $id The ID + * @param int $lastupdate Time of the last notification + * + * @return bool + * @author Adrian Lang + * + */ + protected function sendDigest($subscriber_mail, $id, $lastupdate) + { + $pagelog = new PageChangeLog($id); + $n = 0; + do { + $rev = $pagelog->getRevisions($n++, 1); + $rev = ($rev !== []) ? $rev[0] : null; + } while (!is_null($rev) && $rev > $lastupdate); + + // TODO I'm not happy with the following line and passing $this->mailer around. Not sure how to solve it better + $pageSubSender = new PageSubscriptionSender($this->mailer); + return $pageSubSender->sendPageDiff( + $subscriber_mail, + 'subscr_digest', + $id, + $rev + ); + } + + /** + * Send a list mail + * + * Sends a list mail showing a list of changed pages. + * + * @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 + * @author Adrian Lang + * + */ + protected function sendList($subscriber_mail, $ids, $ns_id) + { + if ($ids === []) { + return false; + } + + $tlist = ''; + $hlist = '
    '; + foreach ($ids as $id) { + $link = wl($id, [], true); + $tlist .= '* ' . $link . NL; + $hlist .= '
  • ' . hsc($id) . '
  • ' . NL; + } + $hlist .= '
'; + + $id = prettyprint_id($ns_id); + $trep = [ + 'DIFF' => rtrim($tlist), + 'PAGE' => $id, + 'SUBSCRIBE' => wl($id, ['do' => 'subscribe'], true, '&'), + ]; + $hrep = [ + 'DIFF' => $hlist, + ]; + + return $this->send( + $subscriber_mail, + 'subscribe_list', + $ns_id, + 'subscr_list', + $trep, + $hrep + ); + } +} diff --git a/inc/Subscriptions/MediaSubscriptionSender.php b/inc/Subscriptions/MediaSubscriptionSender.php new file mode 100644 index 0000000..84497c0 --- /dev/null +++ b/inc/Subscriptions/MediaSubscriptionSender.php @@ -0,0 +1,44 @@ + $mime, + 'MEDIA' => ml($id, $current_rev ? ('rev=' . $current_rev) : '', true, '&', true), + 'SIZE' => filesize_h(filesize($file)), + ]; + + if ($rev && $conf['mediarevisions']) { + $trep['OLD'] = ml($id, "rev=$rev", true, '&', true); + } else { + $trep['OLD'] = '---'; + } + + $headers = ['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); + } +} diff --git a/inc/Subscriptions/PageSubscriptionSender.php b/inc/Subscriptions/PageSubscriptionSender.php new file mode 100644 index 0000000..dbdc454 --- /dev/null +++ b/inc/Subscriptions/PageSubscriptionSender.php @@ -0,0 +1,84 @@ + $id, + 'NEWPAGE' => wl($id, $current_rev ? ('rev=' . $current_rev) : '', true, '&'), + 'SUMMARY' => $summary, + 'SUBSCRIBE' => wl($id, ['do' => 'subscribe'], true, '&'), + ]; + $hrep = []; + + 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 = '' . $hdiff . '
'; + $DIFF_INLINESTYLES = false; + } else { + $subject = 'newpage'; + $trep['OLDPAGE'] = '---'; + $tdiff = rawWiki($id); + $hdiff = nl2br(hsc($tdiff)); + } + + $trep['DIFF'] = $tdiff; + $hrep['DIFF'] = $hdiff; + + $headers = ['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 + ); + } +} diff --git a/inc/Subscriptions/RegistrationSubscriptionSender.php b/inc/Subscriptions/RegistrationSubscriptionSender.php new file mode 100644 index 0000000..34cfc89 --- /dev/null +++ b/inc/Subscriptions/RegistrationSubscriptionSender.php @@ -0,0 +1,39 @@ + + * + */ + public function sendRegister($login, $fullname, $email) + { + global $conf; + if (empty($conf['registernotify'])) { + return false; + } + + $trep = [ + 'NEWUSER' => $login, + 'NEWNAME' => $fullname, + 'NEWEMAIL' => $email, + ]; + + return $this->send( + $conf['registernotify'], + 'new_user', + $login, + 'registermail', + $trep + ); + } +} diff --git a/inc/Subscriptions/SubscriberManager.php b/inc/Subscriptions/SubscriberManager.php new file mode 100644 index 0000000..8da1ac3 --- /dev/null +++ b/inc/Subscriptions/SubscriberManager.php @@ -0,0 +1,299 @@ +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 + * @throws Exception + */ + 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; + } + + $regexBuilder = new SubscriberRegexBuilder(); + $re = $regexBuilder->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|false + * @throws Exception + * + * @author Adrian Lang + */ + public function userSubscription($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'); + } + + if (empty($user)) { + // not logged in + return false; + } + + $subs = $this->subscribers($id, $user); + if ($subs === []) { + return false; + } + + $result = []; + foreach ($subs as $target => $info) { + $result[] = [ + 'target' => $target, + 'style' => $info[$user][0], + 'data' => $info[$user][1], + ]; + } + + return $result; + } + + /** + * Recursively search for matching subscriptions + * + * This function searches all relevant subscription files for a page or + * namespace. + * + * @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 + * @throws Exception + * + * @author Adrian Lang + * + */ + public function subscribers($page, $user = null, $style = null, $data = null) + { + if (!$this->isenabled()) { + return []; + } + + // Construct list of files which may contain relevant subscriptions. + $files = [':' => $this->file(':')]; + do { + $files[$page] = $this->file($page); + $page = getNS(rtrim($page, ':')) . ':'; + } while ($page !== ':'); + + $regexBuilder = new SubscriberRegexBuilder(); + $re = $regexBuilder->buildRegex($user, $style, $data); + + // Handle files. + $result = []; + 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; + } + + // if no last sent is set, use 0 + if (!isset($m[3])) { + $m[3] = 0; + } + + $u = rawurldecode($m[1]); // decode the user name + if (!isset($result[$target])) { + $result[$target] = []; + } + $result[$target][$u] = [$m[2], $m[3]]; // add to result + } + } + return array_reverse($result); + } + + /** + * Default callback for COMMON_NOTIFY_ADDRESSLIST + * + * Aggregates all email addresses of user who have subscribed the given page with 'every' style + * + * @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) + * @throws Exception + * + * @author Adrian Lang + * @author Steven Danz + * + * @todo move the whole functionality into this class, trigger SUBSCRIPTION_NOTIFY_ADDRESSLIST instead, + * use an array for the addresses within it + */ + public function notifyAddresses(&$data) + { + if (!$this->isenabled()) { + return; + } + + /** @var AuthPlugin $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 = []; + foreach ($subscriptions as $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), ','); + } + + /** + * Return the subscription meta file for the given ID + * + * @author Adrian Lang + * + * @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 (str_ends_with($id, ':')) { + $meta_froot = getNS($id); + $meta_fname = '/' . $meta_fname; + } else { + $meta_froot = $id; + } + return metaFN((string)$meta_froot, $meta_fname); + } +} diff --git a/inc/Subscriptions/SubscriberRegexBuilder.php b/inc/Subscriptions/SubscriberRegexBuilder.php new file mode 100644 index 0000000..6c8fd7e --- /dev/null +++ b/inc/Subscriptions/SubscriberRegexBuilder.php @@ -0,0 +1,70 @@ + + * + */ + public 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 = implode('|', $user); + $style = implode('|', $style); + $data = implode('|', $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$/"; + } +} diff --git a/inc/Subscriptions/SubscriptionSender.php b/inc/Subscriptions/SubscriptionSender.php new file mode 100644 index 0000000..4a4e31e --- /dev/null +++ b/inc/Subscriptions/SubscriptionSender.php @@ -0,0 +1,86 @@ +mailer = $mailer; + } + + /** + * 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 = implode('.', 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>"; + } + + /** + * Helper function for sending a mail + * + * @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 + * @author Adrian Lang + * + */ + protected function send($subscriber_mail, $subject, $context, $template, $trep, $hrep = null, $headers = []) + { + global $lang; + global $conf; + + $text = rawLocale($template); + $subject = $lang['mail_' . $subject] . ' ' . $context; + $mail = $this->mailer; + $mail->bcc($subscriber_mail); + $mail->subject($subject); + $mail->setBody($text, $trep, $hrep); + if (in_array($template, ['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(); + } +} diff --git a/inc/TaskRunner.php b/inc/TaskRunner.php new file mode 100644 index 0000000..fea2fed --- /dev/null +++ b/inc/TaskRunner.php @@ -0,0 +1,248 @@ +has('debug') && $conf['allowdebug']; + if (!$defer && !$output) { + $this->sendGIF(); + } + + $ID = cleanID($INPUT->str('id')); + + // Catch any possible output (e.g. errors) + if (!$output) { + ob_start(); + } else { + header('Content-Type: text/plain'); + } + + // run one of the jobs + $tmp = []; // No event data + $evt = new Event('INDEXER_TASKS_RUN', $tmp); + if ($evt->advise_before()) { + if ( + !( + $this->runIndexer() || + $this->runSitemapper() || + $this->sendDigest() || + $this->runTrimRecentChanges() || + $this->runTrimRecentChanges(true)) + ) { + $evt->advise_after(); + } + } + + if (!$output) { + ob_end_clean(); + if ($defer) { + $this->sendGIF(); + } + } + } + + /** + * Just send a 1x1 pixel blank gif to the browser + * + * @author Andreas Gohr + * @author Harry Fuecks + */ + protected function sendGIF() + { + $img = base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAEALAAAAAABAAEAAAIBTAA7'); + header('Content-Type: image/gif'); + header('Content-Length: ' . strlen($img)); + header('Connection: Close'); + echo $img; + tpl_flush(); + // Browser should drop connection after this + // Thinks it's got the whole image + } + + /** + * Trims the recent changes cache (or imports the old changelog) as needed. + * + * @param bool $media_changes If the media changelog shall be trimmed instead of + * the page changelog + * + * @return bool + * @triggers TASK_RECENTCHANGES_TRIM + * @author Ben Coburn + */ + protected function runTrimRecentChanges($media_changes = false) + { + global $conf; + + echo "runTrimRecentChanges($media_changes): started" . NL; + + $fn = ($media_changes ? $conf['media_changelog'] : $conf['changelog']); + + // Trim the Recent Changes + // Trims the recent changes cache to the last $conf['changes_days'] recent + // changes or $conf['recent'] items, which ever is larger. + // The trimming is only done once a day. + if ( + file_exists($fn) && + (@filemtime($fn . '.trimmed') + 86400) < time() && + !file_exists($fn . '_tmp') + ) { + @touch($fn . '.trimmed'); + io_lock($fn); + $lines = file($fn); + if (count($lines) <= $conf['recent']) { + // nothing to trim + io_unlock($fn); + echo "runTrimRecentChanges($media_changes): finished" . NL; + return false; + } + + io_saveFile($fn . '_tmp', ''); // presave tmp as 2nd lock + $trim_time = time() - $conf['recent_days'] * 86400; + $out_lines = []; + $old_lines = []; + $counter = count($lines); + for ($i = 0; $i < $counter; $i++) { + $log = ChangeLog::parseLogLine($lines[$i]); + if ($log === false) { + continue; // discard junk + } + + if ($log['date'] < $trim_time) { + // keep old lines for now (append .$i to prevent key collisions) + $old_lines[$log['date'] . ".$i"] = $lines[$i]; + } else { + // definitely keep these lines + $out_lines[$log['date'] . ".$i"] = $lines[$i]; + } + } + + if (count($lines) === count($out_lines)) { + // nothing to trim + @unlink($fn . '_tmp'); + io_unlock($fn); + echo "runTrimRecentChanges($media_changes): finished" . NL; + return false; + } + + // sort the final result, it shouldn't be necessary, + // however the extra robustness in making the changelog cache self-correcting is worth it + ksort($out_lines); + $extra = $conf['recent'] - count($out_lines); // do we need extra lines do bring us up to minimum + if ($extra > 0) { + ksort($old_lines); + $out_lines = array_merge(array_slice($old_lines, -$extra), $out_lines); + } + + $eventData = [ + 'isMedia' => $media_changes, + 'trimmedChangelogLines' => $out_lines, + 'removedChangelogLines' => $extra > 0 ? array_slice($old_lines, 0, -$extra) : $old_lines, + ]; + Event::createAndTrigger('TASK_RECENTCHANGES_TRIM', $eventData); + $out_lines = $eventData['trimmedChangelogLines']; + + // save trimmed changelog + io_saveFile($fn . '_tmp', implode('', $out_lines)); + @unlink($fn); + if (!rename($fn . '_tmp', $fn)) { + // rename failed so try another way... + io_unlock($fn); + io_saveFile($fn, implode('', $out_lines)); + @unlink($fn . '_tmp'); + } else { + io_unlock($fn); + } + echo "runTrimRecentChanges($media_changes): finished" . NL; + return true; + } + + // nothing done + echo "runTrimRecentChanges($media_changes): finished" . NL; + return false; + } + + + /** + * Runs the indexer for the current page + * + * @author Andreas Gohr + */ + protected function runIndexer() + { + global $ID; + echo 'runIndexer(): started' . NL; + + if ((string) $ID === '') { + return false; + } + + // do the work + return idx_addPage($ID, true); + } + + /** + * Builds a Google Sitemap of all public pages known to the indexer + * + * The map is placed in the root directory named sitemap.xml.gz - This + * file needs to be writable! + * + * @author Andreas Gohr + * @link https://www.google.com/webmasters/sitemaps/docs/en/about.html + */ + protected function runSitemapper() + { + echo 'runSitemapper(): started' . NL; + $result = Mapper::generate() && Mapper::pingSearchEngines(); + echo 'runSitemapper(): finished' . NL; + return $result; + } + + /** + * Send digest and list mails for all subscriptions which are in effect for the + * current page + * + * @author Adrian Lang + */ + protected function sendDigest() + { + global $ID; + + echo 'sendDigest(): started' . NL; + if (!actionOK('subscribe')) { + echo 'sendDigest(): disabled' . NL; + return false; + } + $sub = new BulkSubscriptionSender(); + $sent = $sub->sendBulk($ID); + + echo "sendDigest(): sent $sent mails" . NL; + echo 'sendDigest(): finished' . NL; + return (bool)$sent; + } +} diff --git a/inc/Ui/Admin.php b/inc/Ui/Admin.php new file mode 100644 index 0000000..9e300d8 --- /dev/null +++ b/inc/Ui/Admin.php @@ -0,0 +1,178 @@ + + * @author Håkan Sandell + */ +class Admin extends Ui +{ + protected $forAdmins = ['usermanager', 'acl', 'extension', 'config', 'logviewer', 'styling']; + protected $forManagers = ['revert', 'popularity']; + /** @var array[] */ + protected $menu; + + /** + * Display the UI element + * + * @return void + */ + public function show() + { + $this->menu = $this->getPluginList(); + echo '
'; + echo p_locale_xhtml('admin'); + + $this->showMenu('admin'); + $this->showMenu('manager'); + $this->showSecurityCheck(); + $this->showVersion(); + $this->showMenu('other'); + echo '
'; + } + + /** + * Show the given menu of available plugins + * + * @param string $type admin|manager|other + */ + protected function showMenu($type) + { + if (!$this->menu[$type]) return; + + if ($type === 'other') { + echo p_locale_xhtml('adminplugins'); + $class = 'admin_plugins'; + } else { + $class = 'admin_tasks'; + } + + echo "
    "; + foreach ($this->menu[$type] as $item) { + $this->showMenuItem($item); + } + echo '
'; + } + + /** + * Display the DokuWiki version + */ + protected function showVersion() + { + echo '
'; + echo getVersion(); + echo '
'; + } + + /** + * 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 + * + * The actual check is carried out via JavaScript. See behaviour.js + */ + protected function showSecurityCheck() + { + global $conf; + if (!str_starts_with($conf['savedir'], './')) return; + $img = DOKU_URL . $conf['savedir'] . + '/dont-panic-if-you-see-this-in-your-logs-it-means-your-directory-permissions-are-correct.png'; + echo '
'; + } + + /** + * Display a single Admin menu item + * + * @param array $item + */ + protected function showMenuItem($item) + { + global $ID; + if (blank($item['prompt'])) return; + echo '
  • '; + } + + /** + * 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 $conf; + + $pluginlist = plugin_list('admin'); + $menu = ['admin' => [], 'manager' => [], 'other' => []]; + + foreach ($pluginlist as $p) { + /** @var AdminPlugin $obj */ + if (!($obj = plugin_load('admin', $p)) instanceof PluginInterface) continue; + + // check permissions + if (!$obj->isAccessibleByCurrentUser()) continue; + + if (in_array($p, $this->forAdmins, true)) { + $type = 'admin'; + } elseif (in_array($p, $this->forManagers, true)) { + $type = 'manager'; + } else { + $type = 'other'; + } + + $menu[$type][$p] = [ + 'plugin' => $p, + 'prompt' => $obj->getMenuText($conf['lang']), + 'icon' => $obj->getMenuIcon(), + 'sort' => $obj->getMenuSort() + ]; + } + + // sort by name, then sort + uasort($menu['admin'], [$this, 'menuSort']); + uasort($menu['manager'], [$this, 'menuSort']); + uasort($menu['other'], [$this, 'menuSort']); + + return $menu; + } + + /** + * Custom sorting for admin menu + * + * We sort alphabetically first, then by sort value + * + * @param array $a + * @param array $b + * @return int + */ + protected function menuSort($a, $b) + { + $strcmp = Sort::strcmp($a['prompt'], $b['prompt']); + if ($strcmp != 0) return $strcmp; + return $a['sort'] <=> $b['sort']; + } +} diff --git a/inc/Ui/Backlinks.php b/inc/Ui/Backlinks.php new file mode 100644 index 0000000..8eb5582 --- /dev/null +++ b/inc/Ui/Backlinks.php @@ -0,0 +1,42 @@ + + * + * @author Andreas Gohr + */ + public function show() + { + global $ID; + global $lang; + + // print intro + echo p_locale_xhtml('backlinks'); + + $data = ft_backlinks($ID); + + if (!empty($data)) { + echo '
      '; + foreach ($data as $blink) { + echo '
    • '; + echo html_wikilink(':' . $blink, useHeading('navigation') ? null : $blink); + echo '
    • '; + } + echo '
    '; + } else { + echo '

    ' . $lang['nothingfound'] . '

    '; + } + } +} diff --git a/inc/Ui/Diff.php b/inc/Ui/Diff.php new file mode 100644 index 0000000..70c050d --- /dev/null +++ b/inc/Ui/Diff.php @@ -0,0 +1,129 @@ +id = $id; + $this->setChangeLog(); + } + + /** + * set class property changelog + */ + abstract protected function setChangeLog(); + + /** + * Prepare revision info of comparison pair + */ + abstract protected function preProcess(); + + /** + * Set a pair of revisions to be compared + * + * @param int $rev1 older revision + * @param int $rev2 newer revision + * @return $this + */ + public function compare($rev1, $rev2) + { + if ($rev2 < $rev1) [$rev1, $rev2] = [$rev2, $rev1]; + $this->rev1 = (int)$rev1; + $this->rev2 = (int)$this->changelog->traceCurrentRevision($rev2); + return $this; + } + + /** + * Gets or Sets preference of the Ui\Diff object + * + * @param string|array $prefs a key name or key-value pair(s) + * @param mixed $value value used when the first args is string + * @return array|$this + */ + public function preference($prefs = null, $value = null) + { + // set + if (is_string($prefs) && isset($value)) { + $this->preference[$prefs] = $value; + return $this; + } elseif (is_array($prefs)) { + foreach ($prefs as $name => $value) { + $this->preference[$name] = $value; + } + return $this; + } + // get + return $this->preference; + } + + /** + * Handle requested revision(s) + * + * @return void + */ + protected function handle() + { + global $INPUT; + + // diff link icon click, eg. &do=diff&rev=# + if ($INPUT->has('rev')) { + $this->rev1 = $INPUT->int('rev'); + $this->rev2 = $this->changelog->currentRevision(); + if ($this->rev2 <= $this->rev1) { + // fallback to compare previous with current + unset($this->rev1, $this->rev2); + } + } + + // submit button with two checked boxes, eg. &do=diff&rev2[0]=#&rev2[1]=# + $revs = $INPUT->arr('rev2', []); + if (count($revs) > 1) { + [$rev1, $rev2] = $revs; + if ($rev2 < $rev1) [$rev1, $rev2] = [$rev2, $rev1]; + $this->rev1 = (int)$rev1; + $this->rev2 = (int)$this->changelog->traceCurrentRevision($rev2); + } + + // no revision was given, compare previous to current + if (!isset($this->rev1, $this->rev2)) { + $rev2 = $this->changelog->currentRevision(); + if ($rev2 > $this->changelog->lastRevision()) { + $rev1 = $this->changelog->lastRevision(); + } else { + $revs = $this->changelog->getRevisions(0, 1); + $rev1 = count($revs) ? $revs[0] : false; + } + $this->rev1 = $rev1; + $this->rev2 = $rev2; + } + } +} diff --git a/inc/Ui/Editor.php b/inc/Ui/Editor.php new file mode 100644 index 0000000..ba159b7 --- /dev/null +++ b/inc/Ui/Editor.php @@ -0,0 +1,210 @@ + + * + * @triggers EDIT_FORM_ADDTEXTAREA + */ + public function show() + { + global $INPUT; + global $ID; + global $REV; + global $DATE; + global $PRE; + global $SUF; + global $INFO; + global $SUM; + global $lang; + global $conf; + global $TEXT; + + global $license; + + 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']; + + // intro locale text (edit, rditrev, or read) + if ($wr) { + $intro = ($REV) ? 'editrev' : 'edit'; + } else { + // check pseudo action 'source' + if (!actionOK('source')) { + msg('Command disabled: source', -1); + return; + } + $intro = 'read'; + } + + // create the Editor form + $form = new Form(['id' => 'dw__editform']); + $form->setHiddenField('id', $ID); + $form->setHiddenField('rev', $REV); + $form->setHiddenField('date', $DATE); + $form->setHiddenField('prefix', $PRE . '.'); + $form->setHiddenField('suffix', $SUF); + $form->setHiddenField('changecheck', $check); + + // prepare data for EDIT_FORM_ALTERNATE event + $data = [ + 'form' => $form, + 'wr' => $wr, + 'media_manager' => true, + 'target' => ($INPUT->has('target') && $wr) ? $INPUT->str('target') : 'section', + 'intro_locale' => $intro + ]; + + if ($data['target'] !== 'section') { + // Only emit event if page is writable, section edit data is valid and + // edit target is not section. + Event::createAndTrigger('EDIT_FORM_ADDTEXTAREA', $data, [$this, 'addTextarea'], true); + } else { + $this->addTextarea($data); + } + + $form->setHiddenField('target', $data['target']); + + if ($INPUT->has('hid')) { + $form->setHiddenField('hid', $INPUT->str('hid')); + } + if ($INPUT->has('codeblockOffset')) { + $form->setHiddenField('codeblockOffset', $INPUT->str('codeblockOffset')); + } + + $form->addTagOpen('div')->id('wiki__editbar')->addClass('editBar'); + + $form->addTagOpen('div')->id('size__ctl'); + $form->addTagClose('div'); + + if ($wr) { + // add edit buttons: save, preview, cancel + $form->addTagOpen('div')->addClass('editButtons'); + $form->addButton('do[save]', $lang['btn_save'])->attr('type', 'submit') + ->attrs(['accesskey' => 's', 'tabindex' => '4']) + ->id('edbtn__save'); + $form->addButton('do[preview]', $lang['btn_preview'])->attr('type', 'submit') + ->attrs(['accesskey' => 'p', 'tabindex' => '5']) + ->id('edbtn__preview'); + $form->addButton('do[cancel]', $lang['btn_cancel'])->attr('type', 'submit') + ->attrs(['tabindex' => '6']); + $form->addTagClose('div'); // close div editButtons class + + // add a textbox for edit summary + $form->addTagOpen('div')->addClass('summary'); + $input = $form->addTextInput('summary', $lang['summary']) + ->attrs(['size' => '50', 'tabindex' => '2']) + ->id('edit__summary')->addClass('edit') + ->val($SUM); + $input->getLabel()->attr('class', 'nowrap'); + + // adds a checkbox for minor edits for logged in users + if ($conf['useacl'] && $INPUT->server->str('REMOTE_USER')) { + $form->addHTML(' '); + $form->addCheckbox('minor', $lang['minoredit'])->id('edit__minoredit')->addClass('nowrap')->val('1'); + } + $form->addTagClose('div'); // close div summary class + } + + $form->addTagClose('div'); // close div editBar class + + // license note + if ($wr && $conf['license']) { + $attr = [ + 'href' => $license[$conf['license']]['url'], + 'rel' => 'license', + 'class' => 'urlextern', + 'target' => $conf['target']['extern'] ?: '' + ]; + $form->addTagOpen('div')->addClass('license'); + $form->addHTML($lang['licenseok'] + . ' ' . $license[$conf['license']]['name'] . ''); + $form->addTagClose('div'); + } + + // start editor html output + if ($wr) { + // sets changed to true when previewed + echo ''; + } + + // print intro locale text (edit, rditrev, or read.txt) + if (isset($data['intro_locale'])) { + echo p_locale_xhtml($data['intro_locale']); + } + + echo '
    '; + + echo '
    '; + echo '
    '; + if ($wr && $data['media_manager']) { + echo ''; + echo $lang['mediaselect']; + echo ''; + } + echo '
    '; + echo '
    '; + + echo '
    '; + $draft = new Draft($ID, $INFO['client']); + if ($draft->isDraftAvailable()) { + echo $draft->getDraftMessage(); + } + echo '
    '; + + echo $form->toHTML('Edit'); + + echo '
    '; // close div editBox class + } + + /** + * Display the default edit form (textarea) + * + * the default action for EDIT_FORM_ADDTEXTAREA + * + * @param array{wr: bool, media_manager: bool, target: string, intro_locale: string, form: Form} $data + */ + public function addTextarea(&$data) + { + global $TEXT; + + if ($data['target'] !== 'section') { + msg('No editor for edit target ' . hsc($data['target']) . ' found.', -1); + } + + // set textarea attributes + $attr = ['tabindex' => '1']; + if (!$data['wr']) $attr['readonly'] = 'readonly'; + $attr['dir'] = 'auto'; + $attr['cols'] = '80'; + $attr['rows'] = '10'; + + $data['form']->addTextarea('wikitext', '')->attrs($attr)->val($TEXT) + ->id('wiki__text')->addClass('edit'); + } +} diff --git a/inc/Ui/Index.php b/inc/Ui/Index.php new file mode 100644 index 0000000..22132c9 --- /dev/null +++ b/inc/Ui/Index.php @@ -0,0 +1,130 @@ +ns = $ns; + } + + + /** + * Display page index + * + * @return void + * @author Andreas Gohr + * + */ + public function show() + { + // print intro + echo p_locale_xhtml('index'); + + echo $this->sitemap(); + } + + /** + * Build html of sitemap, unordered list of pages under the namespace + * + * @return string + */ + public function sitemap() + { + global $conf; + global $ID; + + $ns = cleanID($this->ns); + if (empty($ns)) { + $ns = getNS($ID); + if ($ns === false) $ns = ''; + } + $ns = utf8_encodeFN(str_replace(':', '/', $ns)); + $data = []; + search($data, $conf['datadir'], 'search_index', ['ns' => $ns]); + + return '
    ' + . html_buildlist($data, 'idx', [$this, 'formatListItem'], [$this, 'tagListItem']) + . '
    '; + } + + /** + * Index item formatter + * + * User function for html_buildlist() + * + * @param array $item + * @return string + * @author Andreas Gohr + * + */ + public function formatListItem($item) // RENAMED from html_list_index() + { + global $ID, $conf; + + // prevent searchbots needlessly following links + $nofollow = ($ID != $conf['start'] || $conf['sitemap']) ? 'rel="nofollow"' : ''; + + $html = ''; + $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 + $link = wl($ID, 'idx=' . rawurlencode($item['id'])); + $html .= ''; + $html .= $base; + $html .= ''; + } else { + // default is noNSorNS($id), but we want noNS($id) when useheading is off FS#2605 + $html .= html_wikilink(':' . $item['id'], useHeading('navigation') ? null : noNS($item['id'])); + } + return $html; + } + + /** + * Index List item + * + * This user function is used in html_buildlist to build the + *
  • tags for namespaces when displaying the page index + * it gives different classes to opened or closed "folders" + * + * @param array $item + * @return string html + * @author Andreas Gohr + * + */ + public function tagListItem($item) // RENAMED from html_li_index() + { + global $INFO; + global $ACT; + + $class = ''; + $id = ''; + + if ($item['type'] == 'f') { + // scroll to the current item + if (isset($INFO) && $item['id'] == $INFO['id'] && $ACT == 'index') { + $id = ' id="scroll__here"'; + $class = ' bounce'; + } + return '
  • '; + } elseif ($item['open']) { + return '
  • '; + } else { + return '
  • '; + } + } +} diff --git a/inc/Ui/Login.php b/inc/Ui/Login.php new file mode 100644 index 0000000..09fc538 --- /dev/null +++ b/inc/Ui/Login.php @@ -0,0 +1,83 @@ +showIcon = (bool)$showIcon; + } + + /** + * Display the Login Form Panel + * + * @return void + * @author Andreas Gohr + * + */ + public function show() + { + global $lang; + global $conf; + global $ID; + global $INPUT; + + // print intro + echo p_locale_xhtml('login'); + echo '
    ' . NL; + + // create the login form + $form = new Form(['id' => 'dw__login', 'action' => wl($ID)]); + $form->addTagOpen('div')->addClass('no'); + $form->addFieldsetOpen($lang['btn_login']); + $form->setHiddenField('id', $ID); + $form->setHiddenField('do', 'login'); + + $input = $form->addTextInput('u', $lang['user'])->id('focus__this')->addClass('edit') + ->val(($INPUT->bool('http_credentials')) ? '' : $INPUT->str('u')); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + + $input = $form->addPasswordInput('p', $lang['pass'])->addClass('block edit'); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + + if ($conf['rememberme']) { + $form->addCheckbox('r', $lang['remember'])->id('remember__me')->val('1'); + } + $form->addButton('', $lang['btn_login'])->attr('type', 'submit'); + $form->addFieldsetClose(); + $form->addTagClose('div'); + + if (actionOK('register')) { + $registerLink = (new Register())->asHtmlLink('', $this->showIcon); + $form->addHTML('

    ' . $lang['reghere'] . ': ' . $registerLink . '

    '); + } + + if (actionOK('resendpwd')) { + $resendPwLink = (new Resendpwd())->asHtmlLink('', $this->showIcon); + $form->addHTML('

    ' . $lang['pwdforget'] . ': ' . $resendPwLink . '

    '); + } + + echo $form->toHTML('Login'); + + echo '
    '; + } +} diff --git a/inc/Ui/Media/Display.php b/inc/Ui/Media/Display.php new file mode 100644 index 0000000..4443e44 --- /dev/null +++ b/inc/Ui/Media/Display.php @@ -0,0 +1,126 @@ +mediaFile = $mediaFile; + } + + /** + * Get the HTML to display a preview image if possible, otherwise show an icon + * + * @param int $w bounding box width to resize pixel based images to + * @param int $h bounding box height to resize pixel based images to + * @return string + */ + public function getPreviewHtml($w, $h) + { + if ($this->mediaFile->isImage()) { + $src = ml($this->mediaFile->getId(), ['w' => $w, 'h' => $h]); + } else { + $src = $this->getIconUrl(); + } + + $attr = [ + 'alt' => $this->mediaFile->getDisplayName(), + 'loading' => 'lazy', + 'width' => $w, + 'height' => $h, + ]; + + return ''; + } + + /** + * Return the URL to the icon for this file + * + * @return string + */ + public function getIconUrl() + { + $link = 'lib/images/fileicons/svg/' . $this->mediaFile->getIcoClass() . '.svg'; + if (!file_exists(DOKU_INC . $link)) $link = 'lib/images/fileicons/svg/file.svg'; + return DOKU_BASE . $link; + } + + /** + * Show IDs relative to this namespace + * + * @param string|null $ns Use null to disable + */ + public function relativeDisplay($ns) + { + $this->relativeDisplay = $ns; + } + + /** + * Scroll to this file on display? + * + * @param bool $set + */ + public function scrollIntoView($set = true) + { + $this->scrollIntoView = $set; + } + + /** @return string */ + protected function formatDate() + { + return dformat($this->mediaFile->getLastModified()); + } + + /** + * Output the image dimension if any + * + * @param string $empty what to show when no dimensions are available + * @return string + */ + protected function formatDimensions($empty = ' ') + { + $w = $this->mediaFile->getWidth(); + $h = $this->mediaFile->getHeight(); + if ($w && $h) { + return $w . '×' . $h; + } else { + return $empty; + } + } + + /** @return string */ + protected function formatFileSize() + { + return filesize_h($this->mediaFile->getFileSize()); + } + + /** @return string */ + protected function formatDisplayName() + { + if ($this->relativeDisplay !== null) { + $id = $this->mediaFile->getId(); + if (str_starts_with($id, $this->relativeDisplay)) { + $id = substr($id, strlen($this->relativeDisplay)); + } + return ltrim($id, ':'); + } else { + return $this->mediaFile->getDisplayName(); + } + } +} diff --git a/inc/Ui/Media/DisplayRow.php b/inc/Ui/Media/DisplayRow.php new file mode 100644 index 0000000..03bb60f --- /dev/null +++ b/inc/Ui/Media/DisplayRow.php @@ -0,0 +1,91 @@ +mediaFile->getId(); + $class = 'select mediafile mf_' . $this->mediaFile->getIcoClass(); + $info = trim($this->formatDimensions('') . ' ' . $this->formatDate() . ' ' . $this->formatFileSize()); + $jump = $this->scrollIntoView ? 'id="scroll__here"' : ''; + + echo '
    '; + echo '' . + $this->formatDisplayName() . + ' '; + echo '(' . $info . ')' . NL; + + // view button + $link = ml($id, '', true); + echo ' '; + + // mediamanager button + $link = wl('', ['do' => 'media', 'image' => $id, 'ns' => getNS($id)]); + echo ' '; + + // delete button + if ($this->mediaFile->isWritable() && $this->mediaFile->userPermission() >= AUTH_DELETE) { + $link = DOKU_BASE . 'lib/exe/mediamanager.php?delete=' . rawurlencode($id) . + '&sectok=' . getSecurityToken(); + echo ' ' . + '' . $lang['btn_delete'] . ''; + } + + echo '
    '; + echo $lang['mediausage'] . ' {{:' . $id . '}}'; + echo '
    '; + if ($this->mediaFile->isImage()) $this->showDetails(); + echo '
    ' . NL; + echo '
    ' . NL; + } + + /** + * Show Thumbnail and EXIF data + */ + protected function showDetails() + { + $id = $this->mediaFile->getId(); + + echo '
    '; + echo ''; + + // read EXIF/IPTC data + $t = $this->mediaFile->getMeta()->getField(['IPTC.Headline', 'xmp.dc:title']); + $d = $this->mediaFile->getMeta()->getField([ + 'IPTC.Caption', + 'EXIF.UserComment', + 'EXIF.TIFFImageDescription', + 'EXIF.TIFFUserComment' + ]); + if (PhpString::strlen($d) > 250) $d = PhpString::substr($d, 0, 250) . '...'; + $k = $this->mediaFile->getMeta()->getField(['IPTC.Keywords', 'IPTC.Category', 'xmp.dc:subject']); + + // print EXIF/IPTC data + if ($t || $d || $k) { + echo '

    '; + if ($t) echo '' . hsc($t) . '
    '; + if ($d) echo hsc($d) . '
    '; + if ($t) echo '' . hsc($k) . ''; + echo '

    '; + } + echo '
    '; + } +} diff --git a/inc/Ui/Media/DisplayTile.php b/inc/Ui/Media/DisplayTile.php new file mode 100644 index 0000000..aff294b --- /dev/null +++ b/inc/Ui/Media/DisplayTile.php @@ -0,0 +1,54 @@ +mmUrl = media_managerURL([ + 'image' => $this->mediaFile->getId(), + 'ns' => getNS($this->mediaFile->getId()), + 'tab_details' => 'view', + ]); + } + + /** + * Display the tile + */ + public function show() + { + $jump = $this->scrollIntoView ? 'id="scroll__here"' : ''; + + echo '
    '; + echo '
    '; + echo ''; + echo $this->getPreviewHtml(90, 90); + echo ''; + echo '
    '; + + echo '
    '; + echo '' . + $this->formatDisplayName() . + ''; + echo '
    '; + + echo '
    ' . $this->formatDimensions() . '
    '; + echo '
    ' . $this->formatDate() . '
    '; + echo '
    ' . $this->formatFileSize() . '
    '; + + echo '
    '; + } +} diff --git a/inc/Ui/MediaDiff.php b/inc/Ui/MediaDiff.php new file mode 100644 index 0000000..90691b7 --- /dev/null +++ b/inc/Ui/MediaDiff.php @@ -0,0 +1,326 @@ +preference['fromAjax'] = false; // see dokuwiki\Ajax::callMediadiff() + $this->preference['showIntro'] = false; + $this->preference['difftype'] = 'both'; // diff view type: both, opacity or portions + + parent::__construct($id); + } + + /** @inheritdoc */ + protected function setChangeLog() + { + $this->changelog = new MediaChangeLog($this->id); + } + + /** + * Handle requested revision(s) and diff view preferences + * + * @return void + */ + protected function handle() + { + global $INPUT; + + // retrieve requested rev or rev2 + parent::handle(); + + // requested diff view type + if ($INPUT->has('difftype')) { + $this->preference['difftype'] = $INPUT->str('difftype'); + } + } + + /** + * Prepare revision info of comparison pair + */ + protected function preProcess() + { + $changelog =& $this->changelog; + + // create revision info object for older and newer sides + // RevInfo1 : older, left side + // RevInfo2 : newer, right side + + $changelogRev1 = $changelog->getRevisionInfo($this->rev1); + $changelogRev2 = $changelog->getRevisionInfo($this->rev2); + + $this->RevInfo1 = new RevisionInfo($changelogRev1); + $this->RevInfo2 = new RevisionInfo($changelogRev2); + + $this->is_img = preg_match('/\.(jpe?g|gif|png)$/', $this->id); + + foreach ([$this->RevInfo1, $this->RevInfo2] as $RevInfo) { + $isCurrent = $changelog->isCurrentRevision($RevInfo->val('date')); + $RevInfo->isCurrent($isCurrent); + + if ($this->is_img) { + $rev = $isCurrent ? '' : $RevInfo->val('date'); + $meta = new JpegMeta(mediaFN($this->id, $rev)); + // get image width and height for the media manager preview panel + $RevInfo->append([ + 'previewSize' => media_image_preview_size($this->id, $rev, $meta) + ]); + } + } + + // re-check image, ensure minimum image width for showImageDiff() + $this->is_img = ($this->is_img + && ($this->RevInfo1->val('previewSize')[0] ?? 0) >= 30 + && ($this->RevInfo2->val('previewSize')[0] ?? 0) >= 30 + ); + // adjust requested diff view type + if (!$this->is_img) { + $this->preference['difftype'] = 'both'; + } + } + + + /** + * Shows difference between two revisions of media + * + * @author Kate Arzamastseva + */ + public function show() + { + global $conf; + + $ns = getNS($this->id); + $auth = auth_quickaclcheck("$ns:*"); + + if ($auth < AUTH_READ || !$this->id || !$conf['mediarevisions']) return; + + // retrieve form parameters: rev, rev2, difftype + $this->handle(); + // prepare revision info of comparison pair + $this->preProcess(); + + // display intro + if ($this->preference['showIntro']) echo p_locale_xhtml('diff'); + + // print form to choose diff view type + if ($this->is_img && !$this->preference['fromAjax']) { + $this->showDiffViewSelector(); + echo '
    '; + } + + switch ($this->preference['difftype']) { + case 'opacity': + case 'portions': + $this->showImageDiff(); + break; + case 'both': + default: + $this->showFileDiff(); + break; + } + + if ($this->is_img && !$this->preference['fromAjax']) { + echo '
    '; + } + } + + /** + * Print form to choose diff view type + * the dropdown is to be added through JavaScript, see lib/scripts/media.js + */ + protected function showDiffViewSelector() + { + // use timestamp for current revision, date may be false when revisions < 2 + [$rev1, $rev2] = [(int)$this->RevInfo1->val('date'), (int)$this->RevInfo2->val('date')]; + + echo '
    '; + + $form = new Form([ + 'id' => 'mediamanager__form_diffview', + 'action' => media_managerURL([], '&'), + 'method' => 'get', + 'class' => 'diffView', + ]); + $form->addTagOpen('div')->addClass('no'); + $form->setHiddenField('sectok', null); + $form->setHiddenField('mediado', 'diff'); + $form->setHiddenField('rev2[0]', $rev1); + $form->setHiddenField('rev2[1]', $rev2); + $form->addTagClose('div'); + echo $form->toHTML(); + + echo '
    '; // .diffoptions + } + + /** + * Prints two images side by side + * and slider + * + * @author Kate Arzamastseva + */ + protected function showImageDiff() + { + $rev1 = $this->RevInfo1->isCurrent() ? '' : $this->RevInfo1->val('date'); + $rev2 = $this->RevInfo2->isCurrent() ? '' : $this->RevInfo2->val('date'); + + // diff view type: opacity or portions + $type = $this->preference['difftype']; + + // adjust image width, right side (newer) has priority + $rev1Size = $this->RevInfo1->val('previewSize'); + $rev2Size = $this->RevInfo2->val('previewSize'); + if ($rev1Size != $rev2Size) { + if ($rev2Size[0] > $rev1Size[0]) { + $rev1Size = $rev2Size; + } + } + + $rev1Src = ml($this->id, ['rev' => $rev1, 'h' => $rev1Size[1], 'w' => $rev1Size[0]]); + $rev2Src = ml($this->id, ['rev' => $rev2, 'h' => $rev1Size[1], 'w' => $rev1Size[0]]); + + // slider + echo '
    '; + + // two images in divs + echo '
    '; + echo '
    '; + echo ''; + echo '
    '; + echo '
    '; + echo ''; + echo '
    '; + echo '
    '; + } + + /** + * Shows difference between two revisions of media file + * + * @author Kate Arzamastseva + */ + protected function showFileDiff() + { + global $lang; + + $ns = getNS($this->id); + $auth = auth_quickaclcheck("$ns:*"); + + $rev1 = $this->RevInfo1->isCurrent() ? '' : (int)$this->RevInfo1->val('date'); + $rev2 = $this->RevInfo2->isCurrent() ? '' : (int)$this->RevInfo2->val('date'); + + // revision title + $rev1Title = trim($this->RevInfo1->showRevisionTitle() . ' ' . $this->RevInfo1->showCurrentIndicator()); + $rev1Summary = ($this->RevInfo1->val('date')) + ? $this->RevInfo1->showEditSummary() . ' ' . $this->RevInfo1->showEditor() + : ''; + $rev2Title = trim($this->RevInfo2->showRevisionTitle() . ' ' . $this->RevInfo2->showCurrentIndicator()); + $rev2Summary = ($this->RevInfo2->val('date')) + ? $this->RevInfo2->showEditSummary() . ' ' . $this->RevInfo2->showEditor() + : ''; + + $rev1Meta = new JpegMeta(mediaFN($this->id, $rev1)); + $rev2Meta = new JpegMeta(mediaFN($this->id, $rev2)); + + // display diff view table + echo '
    '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + + echo ''; + echo ''; + + echo ''; + echo ''; + + echo ''; + echo ''; + + echo ''; + echo ''; + + $rev1Tags = media_file_tags($rev1Meta); + $rev2Tags = media_file_tags($rev2Meta); + // FIXME rev2Tags-only stuff ignored + foreach ($rev1Tags as $key => $tag) { + if ($tag['value'] != $rev2Tags[$key]['value']) { + $rev2Tags[$key]['highlighted'] = true; + $rev1Tags[$key]['highlighted'] = true; + } elseif (!$tag['value'] || !$rev2Tags[$key]['value']) { + unset($rev2Tags[$key]); + unset($rev1Tags[$key]); + } + } + + echo ''; + foreach ([$rev1Tags, $rev2Tags] as $tags) { + echo ''; + } + echo ''; + + echo '
    ' . $rev1Title . ' ' . $rev1Summary . '' . $rev2Title . ' ' . $rev2Summary . '
    '; + media_preview($this->id, $auth, $rev1, $rev1Meta); // $auth not used in media_preview()? + echo ''; + media_preview($this->id, $auth, $rev2, $rev2Meta); + echo '
    '; + media_preview_buttons($this->id, $auth, $rev1); // $auth used in media_preview_buttons() + echo ''; + media_preview_buttons($this->id, $auth, $rev2); + echo '
    '; + + echo '
    '; + foreach ($tags as $tag) { + $value = cleanText($tag['value']); + if (!$value) $value = '-'; + echo '
    ' . $lang[$tag['tag'][1]] . '
    '; + echo '
    '; + if (!empty($tag['highlighted'])) echo ''; + if ($tag['tag'][2] == 'date') { + echo dformat($value); + } else { + echo hsc($value); + } + if (!empty($tag['highlighted'])) echo ''; + echo '
    '; + } + echo '
    '; + + echo '
    '; + echo '
    '; + } +} diff --git a/inc/Ui/MediaRevisions.php b/inc/Ui/MediaRevisions.php new file mode 100644 index 0000000..34c0293 --- /dev/null +++ b/inc/Ui/MediaRevisions.php @@ -0,0 +1,121 @@ +changelog = new MediaChangeLog($this->id); + } + + /** + * Display a list of Media Revisions in the MediaManager + * + * @param int $first skip the first n changelog lines + * @return void + * @author Kate Arzamastseva + * @author Satoshi Sahara + * + * @author Andreas Gohr + * @author Ben Coburn + */ + public function show($first = -1) + { + global $lang; + $changelog =& $this->changelog; + + // get revisions, and set correct pagination parameters (first, hasNext) + if ($first === null) $first = -1; + $hasNext = false; + $revisions = $this->getRevisions($first, $hasNext); + + // create the form + $form = new Form([ + 'id' => 'page__revisions', // must not be "media__revisions" + 'action' => media_managerURL(['image' => $this->id], '&'), + 'class' => 'changes', + ]); + $form->setHiddenField('mediado', 'diff'); // required for media revisions + $form->addTagOpen('div')->addClass('no'); + + // start listing + $form->addTagOpen('ul'); + foreach ($revisions as $info) { + $rev = $info['date']; + $RevInfo = new RevisionInfo($info); + $RevInfo->isCurrent($changelog->isCurrentRevision($rev)); + + $class = ($RevInfo->val('type') === DOKU_CHANGE_TYPE_MINOR_EDIT) ? 'minor' : ''; + $form->addTagOpen('li')->addClass($class); + $form->addTagOpen('div')->addClass('li'); + + if ($RevInfo->isCurrent()) { + $form->addCheckbox('rev2[]')->val($rev); + } elseif (file_exists(mediaFN($this->id, $rev))) { + $form->addCheckbox('rev2[]')->val($rev); + } else { + $form->addCheckbox('')->val($rev)->attr('disabled', 'disabled'); + } + $form->addHTML(' '); + + $html = implode(' ', [ + $RevInfo->showEditDate(), // edit date and time + $RevInfo->showIconCompareWithCurrent(), // link to diff view icon + $RevInfo->showFileName(), // name of page or media + '
    ', + $RevInfo->showEditSummary(), // edit summary + $RevInfo->showEditor(), // editor info + $RevInfo->showSizechange(), // size change indicator + $RevInfo->showCurrentIndicator(), // current indicator (only when k=1) + '
    ', + ]); + $form->addHTML($html); + + $form->addTagClose('div'); + $form->addTagClose('li'); + } + $form->addTagClose('ul'); // end of revision list + + // show button for diff view + $form->addButton('do[diff]', $lang['diff2'])->attr('type', 'submit'); + + $form->addTagClose('div'); // close div class=no + + echo $form->toHTML('Revisions'); + + // provide navigation for paginated revision list (of pages and/or media files) + echo $this->navigation( + $first, + $hasNext, + static fn($n) => media_managerURL(['first' => $n], '&', false, true) + ); + } +} diff --git a/inc/Ui/PageConflict.php b/inc/Ui/PageConflict.php new file mode 100644 index 0000000..fd28170 --- /dev/null +++ b/inc/Ui/PageConflict.php @@ -0,0 +1,62 @@ +text = $text; + $this->summary = $summary; + } + + /** + * Show conflict form to ask whether save anyway or cancel the page edits + * + * @return void + * @author Andreas Gohr + * + */ + public function show() + { + global $INFO; + global $lang; + + // print intro + echo p_locale_xhtml('conflict'); + + // create the form + $form = new Form(['id' => 'dw__editform']); + $form->addTagOpen('div')->addClass('no'); + $form->setHiddenField('id', $INFO['id']); + $form->setHiddenField('wikitext', $this->text); + $form->setHiddenField('summary', $this->summary); + + $form->addButton('do[save]', $lang['btn_save'])->attrs(['type' => 'submit', 'accesskey' => 's']); + $form->addButton('do[cancel]', $lang['btn_cancel'])->attrs(['type' => 'submit']); + $form->addTagClose('div'); + + echo $form->toHTML('Conflict'); + + echo '



    '; + + // print difference + (new PageDiff($INFO['id']))->compareWith($this->text)->preference('showIntro', false)->show(); + } +} diff --git a/inc/Ui/PageDiff.php b/inc/Ui/PageDiff.php new file mode 100644 index 0000000..394f295 --- /dev/null +++ b/inc/Ui/PageDiff.php @@ -0,0 +1,559 @@ + + * @author Satoshi Sahara + * @package dokuwiki\Ui + */ +class PageDiff extends Diff +{ + /* @var PageChangeLog */ + protected $changelog; + + /* @var RevisionInfo older revision */ + protected $RevInfo1; + /* @var RevisionInfo newer revision */ + protected $RevInfo2; + + /* @var string */ + protected $text; + + /** + * PageDiff Ui constructor + * + * @param string $id page id + */ + public function __construct($id = null) + { + global $INFO; + if (!isset($id)) $id = $INFO['id']; + + // init preference + $this->preference['showIntro'] = true; + $this->preference['difftype'] = 'sidebyside'; // diff view type: inline or sidebyside + + parent::__construct($id); + } + + /** @inheritdoc */ + protected function setChangeLog() + { + $this->changelog = new PageChangeLog($this->id); + } + + /** + * Set text to be compared with most current version + * when it has been externally edited + * exclusively use of the compare($old, $new) method + * + * @param string $text + * @return $this + */ + public function compareWith($text = null) + { + if (isset($text)) { + $this->text = $text; + $changelog =& $this->changelog; + + // revision info object of older file (left side) + $info = $changelog->getCurrentRevisionInfo(); + $this->RevInfo1 = new RevisionInfo($info); + $this->RevInfo1->append([ + 'current' => true, + 'text' => rawWiki($this->id), + ]); + + // revision info object of newer file (right side) + $this->RevInfo2 = new RevisionInfo(); + $this->RevInfo2->append([ + 'date' => false, + //'ip' => '127.0.0.1', + //'type' => DOKU_CHANGE_TYPE_CREATE, + 'id' => $this->id, + //'user' => '', + //'sum' => '', + 'extra' => 'compareWith', + //'sizechange' => strlen($this->text) - io_getSizeFile(wikiFN($this->id)), + 'current' => false, + 'text' => cleanText($this->text), + ]); + } + return $this; + } + + /** + * Handle requested revision(s) and diff view preferences + * + * @return void + */ + protected function handle() + { + global $INPUT; + + // retrieve requested rev or rev2 + if (!isset($this->RevInfo1, $this->RevInfo2)) { + parent::handle(); + } + + // requested diff view type + $mode = ''; + if ($INPUT->has('difftype')) { + $mode = $INPUT->str('difftype'); + } else { + // read preference from DokuWiki cookie. PageDiff only + $mode = get_doku_pref('difftype', null); + } + if (in_array($mode, ['inline', 'sidebyside'])) { + $this->preference['difftype'] = $mode; + } + + if (!$INPUT->has('rev') && !$INPUT->has('rev2')) { + global $INFO, $REV; + if ($this->id == $INFO['id']) { + $REV = $this->rev1; // store revision back in $REV + } + } + } + + /** + * Prepare revision info of comparison pair + */ + protected function preProcess() + { + global $lang; + + $changelog =& $this->changelog; + + // create revision info object for older and newer sides + // RevInfo1 : older, left side + // RevInfo2 : newer, right side + + $changelogRev1 = $changelog->getRevisionInfo($this->rev1); + $changelogRev2 = $changelog->getRevisionInfo($this->rev2); + + $this->RevInfo1 = new RevisionInfo($changelogRev1); + $this->RevInfo2 = new RevisionInfo($changelogRev2); + + foreach ([$this->RevInfo1, $this->RevInfo2] as $RevInfo) { + $isCurrent = $changelog->isCurrentRevision($RevInfo->val('date')); + $RevInfo->isCurrent($isCurrent); + + if ($RevInfo->val('type') == DOKU_CHANGE_TYPE_DELETE || empty($RevInfo->val('type'))) { + $text = ''; + } else { + $rev = $isCurrent ? '' : $RevInfo->val('date'); + $text = rawWiki($this->id, $rev); + } + $RevInfo->append(['text' => $text]); + } + + // msg could displayed only when wrong url typed in browser address bar + if ($this->rev2 === false) { + msg(sprintf( + $lang['page_nonexist_rev'], + $this->id, + wl($this->id, ['do' => 'edit']), + $this->id + ), -1); + } elseif (!$this->rev1 || $this->rev1 == $this->rev2) { + msg('no way to compare when less than two revisions', -1); + } + } + + /** + * Show diff + * between current page version and provided $text + * or between the revisions provided via GET or POST + * + * @return void + * @author Andreas Gohr + * + */ + public function show() + { + global $lang; + + if (!isset($this->RevInfo1, $this->RevInfo2)) { + // retrieve form parameters: rev, rev2, difftype + $this->handle(); + // prepare revision info of comparison pair, except PageConfrict or PageDraft + $this->preProcess(); + } + + // revision title + $rev1Title = trim($this->RevInfo1->showRevisionTitle() . ' ' . $this->RevInfo1->showCurrentIndicator()); + $rev1Summary = ($this->RevInfo1->val('date')) + ? $this->RevInfo1->showEditSummary() . ' ' . $this->RevInfo1->showEditor() + : ''; + + if ($this->RevInfo2->val('extra') == 'compareWith') { + $rev2Title = $lang['yours']; + $rev2Summary = ''; + } else { + $rev2Title = trim($this->RevInfo2->showRevisionTitle() . ' ' . $this->RevInfo2->showCurrentIndicator()); + $rev2Summary = ($this->RevInfo2->val('date')) + ? $this->RevInfo2->showEditSummary() . ' ' . $this->RevInfo2->showEditor() + : ''; + } + + // create difference engine object + $Difference = new \Diff( + explode("\n", $this->RevInfo1->val('text')), + explode("\n", $this->RevInfo2->val('text')) + ); + + // build paired navigation + [$rev1Navi, $rev2Navi] = $this->buildRevisionsNavigation(); + + // display intro + if ($this->preference['showIntro']) echo p_locale_xhtml('diff'); + + // print form to choose diff view type, and exact url reference to the view + $this->showDiffViewSelector(); + + // assign minor edit checker to the variable + $classEditType = static fn($changeType) => ($changeType === DOKU_CHANGE_TYPE_MINOR_EDIT) + ? ' class="minor"' + : ''; + + // display diff view table + echo '
    '; + echo ''; + + //navigation and header + switch ($this->preference['difftype']) { + case 'inline': + $title1 = $rev1Title . ($rev1Summary ? '
    ' . $rev1Summary : ''); + $title2 = $rev2Title . ($rev2Summary ? '
    ' . $rev2Summary : ''); + // no navigation for PageConflict or PageDraft + if ($this->RevInfo2->val('extra') !== 'compareWith') { + echo '' + . '' + . '' + . ''; + echo '' + . '' + . 'RevInfo1->val('type')) . '>' . $title1 . '' + . ''; + } + echo '' + . '' + . '' + . ''; + echo '' + . '' + . 'RevInfo2->val('type')) . '>' . $title2 . '' + . ''; + // create formatter object + $DiffFormatter = new InlineDiffFormatter(); + break; + + case 'sidebyside': + default: + $title1 = $rev1Title . ($rev1Summary ? ' ' . $rev1Summary : ''); + $title2 = $rev2Title . ($rev2Summary ? ' ' . $rev2Summary : ''); + // no navigation for PageConflict or PageDraft + if ($this->RevInfo2->val('extra') !== 'compareWith') { + echo '' + . '' + . '' + . ''; + } + echo '' + . '' + . '' + . ''; + // create formatter object + $DiffFormatter = new TableDiffFormatter(); + break; + } + + // output formatted difference + echo $this->insertSoftbreaks($DiffFormatter->format($Difference)); + + echo '
    -' . $rev1Navi . '
    -
    +' . $rev2Navi . '
    +
    ' . $rev1Navi . '' . $rev2Navi . '
    RevInfo1->val('type')) . '>' . $title1 . 'RevInfo2->val('type')) . '>' . $title2 . '
    '; + echo '
    '; + } + + /** + * Print form to choose diff view type, and exact url reference to the view + */ + protected function showDiffViewSelector() + { + global $lang; + + // no revisions selector for PageConflict or PageDraft + if ($this->RevInfo2->val('extra') == 'compareWith') return; + + // use timestamp for current revision, date may be false when revisions < 2 + [$rev1, $rev2] = [(int)$this->RevInfo1->val('date'), (int)$this->RevInfo2->val('date')]; + + echo '
    '; + + // create the form to select difftype + $form = new Form(['action' => wl()]); + $form->setHiddenField('id', $this->id); + $form->setHiddenField('rev2[0]', $rev1); + $form->setHiddenField('rev2[1]', $rev2); + $form->setHiddenField('do', 'diff'); + + $options = ['sidebyside' => $lang['diff_side'], 'inline' => $lang['diff_inline']]; + $input = $form->addDropdown('difftype', $options, $lang['diff_type']) + ->val($this->preference['difftype']) + ->addClass('quickselect'); + $input->useInput(false); // inhibit prefillInput() during toHTML() process + $form->addButton('do[diff]', 'Go')->attr('type', 'submit'); + echo $form->toHTML(); + + // show exact url reference to the view when it is meaningful + echo '

    '; + if ($rev1 && $rev2) { + // link to exactly this view FS#2835 + $viewUrl = $this->diffViewlink('difflink', $rev1, $rev2); + } + echo $viewUrl ?? '
    '; + echo '

    '; + + echo '
    '; + } + + /** + * Create html for revision navigation + * + * The navigation consists of older and newer revisions selectors, each + * state mutually depends on the selected revision of opposite side. + * + * @return string[] html of navigation for both older and newer sides + */ + protected function buildRevisionsNavigation() + { + $changelog =& $this->changelog; + + if ($this->RevInfo2->val('extra') == 'compareWith') { + // no revisions selector for PageConflict or PageDraft + return ['', '']; + } + + // use timestamp for current revision, date may be false when revisions < 2 + [$rev1, $rev2] = [(int)$this->RevInfo1->val('date'), (int)$this->RevInfo2->val('date')]; + + // retrieve revisions used in dropdown selectors, even when rev1 or rev2 is false + [$revs1, $revs2] = $changelog->getRevisionsAround( + ($rev1 ?: $changelog->currentRevision()), + ($rev2 ?: $changelog->currentRevision()) + ); + + // build options for dropdown selector + $rev1Options = $this->buildRevisionOptions('older', $revs1); + $rev2Options = $this->buildRevisionOptions('newer', $revs2); + // determine previous/next revisions (older/left side) + $rev1Prev = false; + $rev1Next = false; + if (($index = array_search($rev1, $revs1)) !== false) { + $rev1Prev = ($index + 1 < count($revs1)) ? $revs1[$index + 1] : false; + $rev1Next = ($index > 0) ? $revs1[$index - 1] : false; + } + // determine previous/next revisions (newer/right side) + $rev2Prev = false; + $rev2Next = false; + if (($index = array_search($rev2, $revs2)) !== false) { + $rev2Prev = ($index + 1 < count($revs2)) ? $revs2[$index + 1] : false; + $rev2Next = ($index > 0) ? $revs2[$index - 1] : false; + } + + /* + * navigation UI for older revisions / Left side: + */ + $rev1Navi = ''; + // move backward both side: ◀◀ + if ($rev1Prev && $rev2Prev) { + $rev1Navi .= $this->diffViewlink('diffbothprevrev', $rev1Prev, $rev2Prev); + } + // move backward left side: ◀ + if ($rev1Prev) { + $rev1Navi .= $this->diffViewlink('diffprevrev', $rev1Prev, $rev2); + } + // dropdown + $rev1Navi .= $this->buildDropdownSelector('older', $rev1Options); + // move forward left side: ▶ + if ($rev1Next && ($rev1Next < $rev2)) { + $rev1Navi .= $this->diffViewlink('diffnextrev', $rev1Next, $rev2); + } + + /* + * navigation UI for newer revisions / Right side: + */ + $rev2Navi = ''; + // move backward right side: ◀ + if ($rev2Prev && ($rev1 < $rev2Prev)) { + $rev2Navi .= $this->diffViewlink('diffprevrev', $rev1, $rev2Prev); + } + // dropdown + $rev2Navi .= $this->buildDropdownSelector('newer', $rev2Options); + // move forward right side: ▶ + if ($rev2Next) { + if ($changelog->isCurrentRevision($rev2Next)) { + $rev2Navi .= $this->diffViewlink('difflastrev', $rev1, $rev2Next); + } else { + $rev2Navi .= $this->diffViewlink('diffnextrev', $rev1, $rev2Next); + } + } + // move forward both side: ▶▶ + if ($rev1Next && $rev2Next) { + $rev2Navi .= $this->diffViewlink('diffbothnextrev', $rev1Next, $rev2Next); + } + + return [$rev1Navi, $rev2Navi]; + } + + /** + * prepare options for dropdwon selector + * + * @params string $side "older" or "newer" + * @params array $revs list of revsion + * @return array + */ + protected function buildRevisionOptions($side, $revs) + { + // use timestamp for current revision, date may be false when revisions < 2 + [$rev1, $rev2] = [(int)$this->RevInfo1->val('date'), (int)$this->RevInfo2->val('date')]; + + $changelog =& $this->changelog; + $options = []; + + foreach ($revs as $rev) { + $info = $changelog->getRevisionInfo($rev); + // revision info may have timestamp key when external edits occurred + $info['timestamp'] ??= true; + $date = dformat($info['date']); + if ($info['timestamp'] === false) { + // externally deleted or older file restored + $date = preg_replace('/[0-9a-zA-Z]/', '_', $date); + } + $options[$rev] = [ + 'label' => implode(' ', [ + $date, + editorinfo($info['user'], true), + $info['sum'], + ]), + 'attrs' => ['title' => $rev] + ]; + if ( + ($side == 'older' && ($rev2 && $rev >= $rev2)) + || ($side == 'newer' && ($rev <= $rev1)) + ) { + $options[$rev]['attrs']['disabled'] = 'disabled'; + } + } + return $options; + } + + /** + * build Dropdown form for revisions navigation + * + * @params string $side "older" or "newer" + * @params array $options dropdown options + * @return string + */ + protected function buildDropdownSelector($side, $options) + { + // use timestamp for current revision, date may be false when revisions < 2 + [$rev1, $rev2] = [(int)$this->RevInfo1->val('date'), (int)$this->RevInfo2->val('date')]; + + $form = new Form(['action' => wl($this->id)]); + $form->setHiddenField('id', $this->id); + $form->setHiddenField('do', 'diff'); + $form->setHiddenField('difftype', $this->preference['difftype']); + + if ($side == 'older') { + // left side + $form->setHiddenField('rev2[1]', $rev2); + $input = $form->addDropdown('rev2[0]', $options) + ->val($rev1)->addClass('quickselect'); + $input->useInput(false); + } elseif ($side == 'newer') { + // right side + $form->setHiddenField('rev2[0]', $rev1); + $input = $form->addDropdown('rev2[1]', $options) + ->val($rev2)->addClass('quickselect'); + $input->useInput(false); + } + $form->addButton('do[diff]', 'Go')->attr('type', 'submit'); + return $form->toHTML(); + } + + /** + * Create html link to a diff view defined by two revisions + * + * @param string $linktype + * @param int $rev1 older revision + * @param int $rev2 newer revision or null for diff with current revision + * @return string html of link to a diff view + */ + protected function diffViewlink($linktype, $rev1, $rev2 = null) + { + global $lang; + if ($rev1 === false) return ''; + + if ($rev2 === null) { + $urlparam = [ + 'do' => 'diff', + 'rev' => $rev1, + 'difftype' => $this->preference['difftype'] + ]; + } else { + $urlparam = [ + 'do' => 'diff', + 'rev2[0]' => $rev1, + 'rev2[1]' => $rev2, + 'difftype' => $this->preference['difftype'] + ]; + } + $attr = [ + 'class' => $linktype, + 'href' => wl($this->id, $urlparam, true, '&'), + 'title' => $lang[$linktype] + ]; + return '' . $lang[$linktype] . ''; + } + + + /** + * Insert soft breaks in diff html + * + * @param string $diffhtml + * @return string + */ + public function insertSoftbreaks($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,}/', function ($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 + // word break opportunity ( tag) in front of 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', $match[0]); + }, $diffhtml); + } +} diff --git a/inc/Ui/PageDraft.php b/inc/Ui/PageDraft.php new file mode 100644 index 0000000..967c30b --- /dev/null +++ b/inc/Ui/PageDraft.php @@ -0,0 +1,54 @@ + + * + */ + public function show() + { + global $INFO; + global $lang; + + $draft = new Draft($INFO['id'], $INFO['client']); + $text = $draft->getDraftText(); + + // print intro + echo p_locale_xhtml('draft'); + + // print difference + (new PageDiff($INFO['id']))->compareWith($text)->preference('showIntro', false)->show(); + + // create the draft form + $form = new Form(['id' => 'dw__editform']); + $form->addTagOpen('div')->addClass('no'); + $form->setHiddenField('id', $INFO['id']); + $form->setHiddenField('date', $draft->getDraftDate()); + $form->setHiddenField('wikitext', $text); + + $form->addTagOpen('div')->id('draft__status'); + $form->addHTML($draft->getDraftMessage()); + $form->addTagClose('div'); + $form->addButton('do[recover]', $lang['btn_recover'])->attrs(['type' => 'submit', 'tabindex' => '1']); + $form->addButton('do[draftdel]', $lang['btn_draftdel'])->attrs(['type' => 'submit', 'tabindex' => '2']); + $form->addButton('do[show]', $lang['btn_cancel'])->attrs(['type' => 'submit', 'tabindex' => '3']); + $form->addTagClose('div'); + + echo $form->toHTML('Draft'); + } +} diff --git a/inc/Ui/PageRevisions.php b/inc/Ui/PageRevisions.php new file mode 100644 index 0000000..72e5e62 --- /dev/null +++ b/inc/Ui/PageRevisions.php @@ -0,0 +1,116 @@ +changelog = new PageChangeLog($this->id); + } + + /** + * Display list of old revisions of the page + * + * @param int $first skip the first n changelog lines + * @return void + * @author Kate Arzamastseva + * @author Satoshi Sahara + * + * @author Andreas Gohr + * @author Ben Coburn + */ + public function show($first = -1) + { + global $lang, $REV; + $changelog =& $this->changelog; + + // get revisions, and set correct pagination parameters (first, hasNext) + if ($first === null) $first = -1; + $hasNext = false; + $revisions = $this->getRevisions($first, $hasNext); + + // print intro + echo p_locale_xhtml('revisions'); + + // create the form + $form = new Form([ + 'id' => 'page__revisions', + 'class' => 'changes', + ]); + $form->addTagOpen('div')->addClass('no'); + + // start listing + $form->addTagOpen('ul'); + foreach ($revisions as $info) { + $rev = $info['date']; + + $RevInfo = new RevisionInfo($info); + $RevInfo->isCurrent($changelog->isCurrentRevision($rev)); + + $class = ($RevInfo->val('type') === DOKU_CHANGE_TYPE_MINOR_EDIT) ? 'minor' : ''; + $form->addTagOpen('li')->addClass($class); + $form->addTagOpen('div')->addClass('li'); + + if ($RevInfo->isCurrent()) { + $form->addCheckbox('rev2[]')->val($rev); + } elseif ($rev == $REV) { + $form->addCheckbox('rev2[]')->val($rev)->attr('checked', 'checked'); + } elseif (page_exists($this->id, $rev)) { + $form->addCheckbox('rev2[]')->val($rev); + } else { + $form->addCheckbox('')->val($rev)->attr('disabled', 'disabled'); + } + $form->addHTML(' '); + + $html = implode(' ', [ + $RevInfo->showEditDate(true), // edit date and time + $RevInfo->showIconCompareWithCurrent(), // link to diff view icon + $RevInfo->showFileName(), // name of page or media + $RevInfo->showEditSummary(), // edit summary + $RevInfo->showEditor(), // editor info + $RevInfo->showSizechange(), // size change indicator + $RevInfo->showCurrentIndicator(), // current indicator (only when k=1) + ]); + $form->addHTML($html); + $form->addTagClose('div'); + $form->addTagClose('li'); + } + $form->addTagClose('ul'); // end of revision list + + // show button for diff view + $form->addButton('do[diff]', $lang['diff2'])->attr('type', 'submit'); + + $form->addTagClose('div'); // close div class=no + + echo $form->toHTML('Revisions'); + + // provide navigation for paginated revision list (of pages and/or media files) + echo $this->navigation($first, $hasNext, static fn($n) => ['do' => 'revisions', 'first' => $n]); + } +} diff --git a/inc/Ui/PageView.php b/inc/Ui/PageView.php new file mode 100644 index 0000000..504fad0 --- /dev/null +++ b/inc/Ui/PageView.php @@ -0,0 +1,84 @@ +text = $text; + } + + /** + * Show a wiki page + * + * @return void + * @author Andreas Gohr + * + * @triggers HTML_SHOWREV_OUTPUT + */ + public function show() + { + global $ID; + global $REV; + global $HIGH; + global $INFO; + global $DATE_AT; + + //disable section editing for old revisions or in preview + if ($this->text !== null || $REV) { + $secedit = false; + } else { + $secedit = true; + } + + if ($this->text !== null) { + //PreviewHeader + echo '
    '; + + // print intro for preview + echo p_locale_xhtml('preview'); + echo '
    '; + $html = html_secedit(p_render('xhtml', p_get_instructions($this->text), $info), $secedit); + if ($INFO['prependTOC']) $html = tpl_toc(true) . $html; + echo $html; + echo '
    '; + echo '
    '; + } else { + if ($REV || $DATE_AT) { + // print intro for old revisions + $data = ['rev' => &$REV, 'date_at' => &$DATE_AT]; + Event::createAndTrigger('HTML_SHOWREV_OUTPUT', $data, [$this, '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; + } + } + + /** + * Show a revision warning + * + * @author Szymon Olewniczak + */ + public function showrev() + { + echo p_locale_xhtml('showrev'); + } +} diff --git a/inc/Ui/Recent.php b/inc/Ui/Recent.php new file mode 100644 index 0000000..bf9b469 --- /dev/null +++ b/inc/Ui/Recent.php @@ -0,0 +1,229 @@ +first = $first; + $this->show_changes = $show_changes; + } + + /** + * Display recent changes + * + * @return void + * @author Matthias Grimm + * @author Ben Coburn + * @author Kate Arzamastseva + * @author Satoshi Sahara + * + * @author Andreas Gohr + */ + public function show() + { + global $conf, $lang; + global $ID; + + // get recent items, and set correct pagination parameters (first, hasNext) + $first = $this->first; + $hasNext = false; + $recents = $this->getRecents($first, $hasNext); + + // print intro + echo p_locale_xhtml('recent'); + + if (getNS($ID) != '') { + echo '

    ' + . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) + . '

    '; + } + + // create the form + $form = new Form(['id' => 'dw__recent', 'method' => 'GET', 'action' => wl($ID), 'class' => 'changes']); + $form->addTagOpen('div')->addClass('no'); + $form->setHiddenField('sectok', null); + $form->setHiddenField('do', 'recent'); + $form->setHiddenField('id', $ID); + + // show dropdown selector, whether include not only recent pages but also recent media files? + if ($conf['mediarevisions']) { + $this->addRecentItemSelector($form); + } + + // start listing of recent items + $form->addTagOpen('ul'); + foreach ($recents as $recent) { + // check possible external edition for current page or media + $this->checkCurrentRevision($recent); + + $RevInfo = new RevisionInfo($recent); + $RevInfo->isCurrent(true); + $class = ($RevInfo->val('type') === DOKU_CHANGE_TYPE_MINOR_EDIT) ? 'minor' : ''; + $form->addTagOpen('li')->addClass($class); + $form->addTagOpen('div')->addClass('li'); + $html = implode(' ', [ + $RevInfo->showFileIcon(), // filetype icon + $RevInfo->showEditDate(), // edit date and time + $RevInfo->showIconCompareWithPrevious(), // link to diff view icon + $RevInfo->showIconRevisions(), // link to revisions icon + $RevInfo->showFileName(), // name of page or media + $RevInfo->showEditSummary(), // edit summary + $RevInfo->showEditor(), // editor info + $RevInfo->showSizechange(), // size change indicator + ]); + $form->addHTML($html); + $form->addTagClose('div'); + $form->addTagClose('li'); + } + $form->addTagClose('ul'); + + $form->addTagClose('div'); // close div class=no + + // provide navigation for paginated recent list (of pages and/or media files) + $form->addHTML($this->htmlNavigation($first, $hasNext)); + + echo $form->toHTML('Recent'); + } + + /** + * Get recent items, and set correct pagination parameters (first, hasNext) + * + * @param int $first + * @param bool $hasNext + * @return array recent items to be shown in a paginated list + * + * @see also dokuwiki\Changelog::getRevisionInfo() + */ + protected function getRecents(&$first, &$hasNext) + { + global $ID, $conf; + + $flags = 0; + if ($this->show_changes == 'mediafiles' && $conf['mediarevisions']) { + $flags = RECENTS_MEDIA_CHANGES; + } elseif ($this->show_changes == 'pages') { + $flags = 0; + } elseif ($conf['mediarevisions']) { + $flags = RECENTS_MEDIA_PAGES_MIXED; + } + + /* 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. + */ + $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 + } + return $recents; + } + + /** + * Check possible external deletion for current page or media + * + * To keep sort order in the recent list, we ignore externally modification. + * It is not possible to know when external deletion had happened, + * $info['date'] is to be incremented 1 second when such deletion detected. + */ + protected function checkCurrentRevision(array &$info) + { + if ($info['mode'] == RevisionInfo::MODE_PAGE) { + $changelog = new PageChangelog($info['id']); + } else { + $changelog = new MediaChangelog($info['id']); + } + if (!$changelog->isCurrentRevision($info['date'])) { + $currentRevInfo = $changelog->getCurrentRevisionInfo(); + if ($currentRevInfo['type'] == DOKU_CHANGE_TYPE_DELETE) { + // the page or media file was externally deleted, updated info because the link is already red + // externally created and edited not updated because sorting by date is not worth so much changes + $info = array_merge($info, $currentRevInfo); + } + } + unset($changelog); + } + + /** + * Navigation buttons for Pagination (prev/next) + * + * @param int $first + * @param bool $hasNext + * @return string html + */ + protected function htmlNavigation($first, $hasNext) + { + global $conf, $lang; + + $last = $first + $conf['recent']; + $html = ''; + return $html; + } + + /** + * Add dropdown selector of item types to the form instance + * + * @param Form $form + * @return void + */ + protected function addRecentItemSelector(Form $form) + { + global $lang; + + $form->addTagOpen('div')->addClass('changeType'); + $options = [ + 'pages' => $lang['pages_changes'], + 'mediafiles' => $lang['media_changes'], + 'both' => $lang['both_changes'] + ]; + $form->addDropdown('show_changes', $options, $lang['changes_type']) + ->val($this->show_changes)->addClass('quickselect'); + $form->addButton('do[recent]', $lang['btn_apply'])->attr('type', 'submit'); + $form->addTagClose('div'); + } +} diff --git a/inc/Ui/Revisions.php b/inc/Ui/Revisions.php new file mode 100644 index 0000000..d231be2 --- /dev/null +++ b/inc/Ui/Revisions.php @@ -0,0 +1,113 @@ +id = $id; + $this->setChangeLog(); + } + + /** + * set class property changelog + */ + abstract protected function setChangeLog(); + + /** + * Get revisions, and set correct pagination parameters (first, hasNext) + * + * @param int $first + * @param bool $hasNext + * @return array revisions to be shown in a paginated list + * @see also https://www.dokuwiki.org/devel:changelog + */ + protected function getRevisions(&$first, &$hasNext) + { + global $conf; + + $changelog =& $this->changelog; + $revisions = []; + + $currentRevInfo = $changelog->getCurrentRevisionInfo(); + if (!$currentRevInfo) return $revisions; + + $num = $conf['recent']; + + /* 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 also Ui\Recent::getRecents() + */ + $revlist = $changelog->getRevisions($first, $num + 1); + if (count($revlist) == 0 && $first > -1) { + // resets to zero if $first requested a too high number + $first = -1; + return $this->getRevisions($first, $hasNext); + } + + // decide if this is the last page or is there another one + $hasNext = false; + if (count($revlist) > $num) { + $hasNext = true; + array_pop($revlist); // remove one additional log entry + } + + // append each revision info array to the revisions + foreach ($revlist as $rev) { + $revisions[] = $changelog->getRevisionInfo($rev); + } + return $revisions; + } + + /** + * Navigation buttons for Pagination (prev/next) + * + * @param int $first + * @param bool $hasNext + * @param callable $callback returns array of hidden fields for the form button + * @return string html + */ + protected function navigation($first, $hasNext, $callback) + { + global $conf; + + $html = ''; + return $html; + } +} diff --git a/inc/Ui/Search.php b/inc/Ui/Search.php new file mode 100644 index 0000000..62a2540 --- /dev/null +++ b/inc/Ui/Search.php @@ -0,0 +1,625 @@ + 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 = $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(); + + return $searchForm->toHTML('Search'); + } + + /** + * 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(static fn($term) => trim($term, '*'), $this->parsedQuery['and']), + 'not' => array_map(static fn($term) => trim($term, '*'), $this->parsedQuery['not']), + ], + 'starts' => [ + 'label' => $lang['search_starts_with'], + 'and' => array_map(static fn($term) => trim($term, '*') . '*', $this->parsedQuery['and']), + 'not' => array_map(static fn($term) => trim($term, '*') . '*', $this->parsedQuery['not']), + ], + 'ends' => [ + 'label' => $lang['search_ends_with'], + 'and' => array_map(static fn($term) => '*' . trim($term, '*'), $this->parsedQuery['and']), + 'not' => array_map(static fn($term) => '*' . trim($term, '*'), $this->parsedQuery['not']), + ], + 'contains' => [ + 'label' => $lang['search_contains'], + 'and' => array_map(static fn($term) => '*' . trim($term, '*') . '*', $this->parsedQuery['and']), + 'not' => array_map(static fn($term) => '*' . 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 ? " ($count)" : ''); + + 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]; + } + Sort::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); + } + return str_replace( + ['@QUERY@', '@SEARCH@', '@CREATEPAGEINFO@'], + [hsc(rawurlencode($query)), hsc($query), $pagecreateinfo], + $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']); // already strtolowered + if ($cleanedQuery === PhpString::strtolower($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 = '
    '; + $html .= '

    ' . $lang['quickhits'] . ':

    '; + $html .= '
      '; + foreach (array_keys($data) as $id) { + $name = null; + if (!useHeading('navigation') && $ns = getNS($id)) { + $name = shorten(noNS($id), ' (' . $ns . ')', 30); + } + $link = html_wikilink(':' . $id, $name); + $eventData = [ + 'listItemContent' => [$link], + 'page' => $id, + ]; + Event::createAndTrigger('SEARCH_RESULT_PAGELOOKUP', $eventData); + $html .= '
    • ' . implode('', $eventData['listItemContent']) . '
    • '; + } + $html .= '
    '; + //clear float (see http://www.complexspiral.com/publications/containing-floats/) + $html .= '
    '; + $html .= '
    '; + + 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 '
    ' . $lang['nothingfound'] . '
    '; + } + + $html = '
    '; + $html .= '

    ' . $lang['search_fullresults'] . ':

    '; + + $html .= '
    '; + $num = 0; + $position = 0; + + foreach ($data as $id => $cnt) { + ++$position; + $resultLink = html_wikilink(':' . $id, null, $highlight); + + $resultHeader = [$resultLink]; + + + $restrictQueryToNSLink = $this->restrictQueryToNSLink(getNS($id)); + if ($restrictQueryToNSLink) { + $resultHeader[] = $restrictQueryToNSLink; + } + + $resultBody = []; + $mtime = filemtime(wikiFN($id)); + $lastMod = '' . $lang['lastmod'] . ' '; + $lastMod .= ''; + $resultBody['meta'] = $lastMod; + if ($cnt !== 0) { + $num++; + $hits = '' . $cnt . ' ' . $lang['hits'] . ', '; + $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, + ]; + Event::createAndTrigger('SEARCH_RESULT_FULLPAGE', $eventData); + $html .= '
    '; + $html .= '
    ' . implode(' ', $eventData['resultHeader']) . '
    '; + foreach ($eventData['resultBody'] as $class => $htmlContent) { + $html .= "
    $htmlContent
    "; + } + $html .= '
    '; + } + $html .= '
    '; + + $html .= '
    '; + + 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/inc/Ui/SearchState.php b/inc/Ui/SearchState.php new file mode 100644 index 0000000..7b28ae3 --- /dev/null +++ b/inc/Ui/SearchState.php @@ -0,0 +1,141 @@ +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 "$label"; + } +} diff --git a/inc/Ui/Subscribe.php b/inc/Ui/Subscribe.php new file mode 100644 index 0000000..9495937 --- /dev/null +++ b/inc/Ui/Subscribe.php @@ -0,0 +1,116 @@ + + * + */ + public function show() + { + global $INPUT; + global $INFO; + global $ID; + global $lang; + global $conf; + $stime_days = $conf['subscribe_time'] / 60 / 60 / 24; + + // print intro + echo p_locale_xhtml('subscr_form'); + + // list up current subscriptions + echo '

    ' . $lang['subscr_m_current_header'] . '

    '; + echo '
    '; + if ($INFO['subscribed'] === false) { + echo '

    ' . $lang['subscr_m_not_subscribed'] . '

    '; + } else { + echo '
      '; + foreach ($INFO['subscribed'] as $sub) { + echo '
    • '; + if ($sub['target'] !== $ID) { + echo '' . hsc(prettyprint_id($sub['target'])) . ''; + } else { + echo '' . hsc(prettyprint_id($sub['target'])) . ''; + } + $sstl = sprintf($lang['subscr_style_' . $sub['style']], $stime_days); + if (!$sstl) $sstl = hsc($sub['style']); + echo ' (' . $sstl . ') '; + + echo '' . $lang['subscr_m_unsubscribe'] . + '
    • '; + } + echo '
    '; + } + echo '
    '; + + // Add new subscription form + echo '

    ' . $lang['subscr_m_new_header'] . '

    '; + echo '
    '; + $ns = getNS($ID) . ':'; + $targets = [ + $ID => '' . prettyprint_id($ID) . '', + $ns => '' . prettyprint_id($ns) . '', + ]; + $styles = [ + 'every' => $lang['subscr_style_every'], + 'digest' => sprintf($lang['subscr_style_digest'], $stime_days), + 'list' => sprintf($lang['subscr_style_list'], $stime_days), + ]; + + // create the form + $form = new Form(['id' => 'subscribe__form']); + $form->addTagOpen('div')->addClass('no'); + $form->setHiddenField('id', $ID); + $form->setHiddenField('do', 'subscribe'); + $form->setHiddenField('sub_action', 'subscribe'); + + $form->addFieldsetOpen($lang['subscr_m_subscribe']); + + $value = (array_key_exists($INPUT->post->str('sub_target'), $targets)) ? + $INPUT->str('sub_target') : key($targets); + foreach ($targets as $val => $label) { + $data = ($value === $val) ? ['checked' => 'checked'] : []; + $form->addRadioButton('sub_target', $label)->val($val)->attrs($data); + } + $form->addFieldsetClose(); + + $form->addFieldsetOpen($lang['subscr_m_receive']); + + $value = (array_key_exists($INPUT->post->str('sub_style'), $styles)) ? + $INPUT->str('sub_style') : key($styles); + foreach ($styles as $val => $label) { + $data = ($value === $val) ? ['checked' => 'checked'] : []; + $form->addRadioButton('sub_style', $label)->val($val)->attrs($data); + } + $form->addFieldsetClose(); + + $form->addButton('do[subscribe]', $lang['subscr_m_subscribe'])->attr('type', 'submit'); + $form->addTagClose('div'); + + echo $form->toHTML('Subscribe'); + + echo '
    '; + } +} diff --git a/inc/Ui/Ui.php b/inc/Ui/Ui.php new file mode 100644 index 0000000..703e8e8 --- /dev/null +++ b/inc/Ui/Ui.php @@ -0,0 +1,20 @@ + + * + */ + public function show() + { + /** @var AuthPlugin $auth */ + global $auth; + global $INFO; + global $INPUT; + + $userinfo = [ + 'user' => $_SERVER['REMOTE_USER'], + 'name' => $INPUT->post->str('fullname', $INFO['userinfo']['name'], true), + 'mail' => $INPUT->post->str('email', $INFO['userinfo']['mail'], true), + + ]; + + echo p_locale_xhtml('updateprofile'); + echo '
    '; + + echo $this->updateProfileForm($userinfo)->toHTML('UpdateProfile'); + echo $this->tokenForm($userinfo['user'])->toHTML(); + if ($auth->canDo('delUser') && actionOK('profile_delete')) { + $this->deleteProfileForm()->toHTML('ProfileDelete'); + } + + echo '
    '; + } + + /** + * Add the password confirmation field to the form if configured + * + * @param Form $form + * @return void + */ + protected function addPasswordConfirmation(Form $form) + { + global $lang; + global $conf; + + if (!$conf['profileconfirm']) return; + $form->addHTML("
    \n"); + $attr = ['size' => '50', 'required' => 'required']; + $input = $form->addPasswordInput('oldpass', $lang['oldpass'])->attrs($attr) + ->addClass('edit'); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + } + + /** + * Create the profile form + * + * @return Form + */ + protected function updateProfileForm($userinfo) + { + global $lang; + /** @var AuthPlugin $auth */ + global $auth; + + $form = new Form(['id' => 'dw__register']); + $form->addTagOpen('div')->addClass('no'); + $form->addFieldsetOpen($lang['profile']); + $form->setHiddenField('do', 'profile'); + $form->setHiddenField('save', '1'); + + $attr = ['size' => '50', 'disabled' => 'disabled']; + $input = $form->addTextInput('login', $lang['user']) + ->attrs($attr) + ->addClass('edit') + ->val($userinfo['user']); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + + $attr = ['size' => '50']; + if (!$auth->canDo('modName')) $attr['disabled'] = 'disabled'; + $input = $form->addTextInput('fullname', $lang['fullname']) + ->attrs($attr) + ->addClass('edit') + ->val($userinfo['name']); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + + $attr = ['type' => 'email', 'size' => '50']; + if (!$auth->canDo('modMail')) $attr['disabled'] = 'disabled'; + $input = $form->addTextInput('email', $lang['email']) + ->attrs($attr) + ->addClass('edit') + ->val($userinfo['mail']); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + + if ($auth->canDo('modPass')) { + $attr = ['size' => '50']; + $input = $form->addPasswordInput('newpass', $lang['newpass'])->attrs($attr)->addClass('edit'); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + + $input = $form->addPasswordInput('passchk', $lang['passchk'])->attrs($attr)->addClass('edit'); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + } + + $this->addPasswordConfirmation($form); + + $form->addButton('', $lang['btn_save'])->attr('type', 'submit'); + $form->addButton('', $lang['btn_reset'])->attr('type', 'reset'); + + $form->addFieldsetClose(); + $form->addTagClose('div'); + + return $form; + } + + /** + * Create the profile delete form + * + * @return Form + */ + protected function deleteProfileForm() + { + global $lang; + + $form = new Form(['id' => 'dw__profiledelete']); + $form->addTagOpen('div')->addClass('no'); + $form->addFieldsetOpen($lang['profdeleteuser']); + $form->setHiddenField('do', 'profile_delete'); + $form->setHiddenField('delete', '1'); + + $form->addCheckbox('confirm_delete', $lang['profconfdelete']) + ->attrs(['required' => 'required']) + ->id('dw__confirmdelete') + ->val('1'); + + $this->addPasswordConfirmation($form); + + $form->addButton('', $lang['btn_deleteuser'])->attr('type', 'submit'); + $form->addFieldsetClose(); + $form->addTagClose('div'); + return $form; + } + + /** + * Get the authentication token form + * + * @param string $user + * @return Form + */ + protected function tokenForm($user) + { + global $lang; + + $token = JWT::fromUser($user); + + $form = new Form(['id' => 'dw__profiletoken', 'action' => wl(), 'method' => 'POST']); + $form->setHiddenField('do', 'authtoken'); + $form->setHiddenField('id', 'ID'); + $form->addFieldsetOpen($lang['proftokenlegend']); + $form->addHTML('

    ' . $lang['proftokeninfo'] . '

    '); + $form->addHTML('

    ' . $token->getToken() . '

    '); + $form->addButton('regen', $lang['proftokengenerate']); + $form->addFieldsetClose(); + + return $form; + } +} diff --git a/inc/Ui/UserRegister.php b/inc/Ui/UserRegister.php new file mode 100644 index 0000000..7f719b3 --- /dev/null +++ b/inc/Ui/UserRegister.php @@ -0,0 +1,73 @@ + + * + */ + public function show() + { + global $lang; + global $conf; + global $INPUT; + + $base_attrs = ['size' => '50', 'required' => 'required']; + $email_attrs = $base_attrs + ['type' => 'email']; + + // print intro + echo p_locale_xhtml('register'); + echo '
    '; + + // create the login form + $form = new Form(['id' => 'dw__register']); + $form->addTagOpen('div')->addClass('no'); + $form->addFieldsetOpen($lang['btn_register']); + $form->setHiddenField('do', 'register'); + $form->setHiddenField('save', '1'); + + $input = $form->addTextInput('login', $lang['user'])->attrs($base_attrs)->addClass('edit') + ->val($INPUT->post->str('login')); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + + if (!$conf['autopasswd']) { + $input = $form->addPasswordInput('pass', $lang['pass'])->attrs($base_attrs)->addClass('edit'); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + $input = $form->addPasswordInput('passchk', $lang['passchk'])->attrs($base_attrs)->addClass('edit'); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + } + + $input = $form->addTextInput('fullname', $lang['fullname'])->attrs($base_attrs)->addClass('edit') + ->val($INPUT->post->str('fullname')); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + + $input = $form->addTextInput('email', $lang['email'])->attrs($email_attrs)->addClass('edit') + ->val($INPUT->post->str('email')); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + + $form->addButton('', $lang['btn_register'])->attr('type', 'submit'); + $form->addFieldsetClose(); + $form->addTagClose('div'); + + echo $form->toHTML('Register'); + + echo '
    '; + } +} diff --git a/inc/Ui/UserResendPwd.php b/inc/Ui/UserResendPwd.php new file mode 100644 index 0000000..62f9afe --- /dev/null +++ b/inc/Ui/UserResendPwd.php @@ -0,0 +1,99 @@ + + * + * @author Benoit Chesneau + */ + public function show() + { + global $conf; + global $INPUT; + + $token = preg_replace('/[^a-f0-9]+/', '', $INPUT->str('pwauth')); + + // print intro + echo p_locale_xhtml('resetpwd'); + echo '
    '; + + if (!$conf['autopasswd'] && $token) { + $form = $this->formSetNewPassword($token); + } else { + $form = $this->formResendPassword(); + } + + echo $form->toHTML('ResendPwd'); + + echo '
    '; + } + + /** + * create a form ui to set new password + * + * @params string $token cleaned pwauth request variable + * @return Form + */ + protected function formSetNewPassword($token) + { + global $lang; + + // create the form + $form = new Form(['id' => 'dw__resendpwd']); + $form->addTagOpen('div')->addClass('no'); + $form->addFieldsetOpen($lang['btn_resendpwd']); + $form->setHiddenField('token', $token); + $form->setHiddenField('do', 'resendpwd'); + + $input = $form->addPasswordInput('pass', $lang['pass'])->attr('size', '50')->addClass('edit'); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + $input = $form->addPasswordInput('passchk', $lang['passchk'])->attr('size', '50')->addClass('edit'); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + $form->addButton('', $lang['btn_resendpwd'])->attr('type', 'submit'); + $form->addFieldsetClose(); + $form->addTagClose('div'); + return $form; + } + + /** + * create a form ui to request new password + * + * @return Form + */ + protected function formResendPassword() + { + global $lang; + + // create the form + $form = new Form(['id' => 'dw__resendpwd']); + $form->addTagOpen('div')->addClass('no'); + $form->addFieldsetOpen($lang['btn_resendpwd']); + $form->setHiddenField('do', 'resendpwd'); + $form->setHiddenField('save', '1'); + $form->addHTML("
    \n"); + + $input = $form->addTextInput('login', $lang['user'])->addClass('edit'); + $input->getLabel()->attr('class', 'block'); + $form->addHTML("
    \n"); + $form->addHTML("
    \n"); + $form->addButton('', $lang['btn_resendpwd'])->attr('type', 'submit'); + $form->addFieldsetClose(); + $form->addTagClose('div'); + return $form; + } +} diff --git a/inc/Utf8/Asian.php b/inc/Utf8/Asian.php new file mode 100644 index 0000000..7540659 --- /dev/null +++ b/inc/Utf8/Asian.php @@ -0,0 +1,98 @@ + 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 + ']' . + + '|' . + + '[' . // 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}' . + ']?' . + ')'; + + + /** + * Check if the given term contains Asian word characters + * + * @param string $term + * @return bool + */ + public static function isAsianWords($term) + { + return (bool)preg_match('/' . self::REGEXP . '/u', $term); + } + + /** + * Surround all Asian words in the given text with the given separator + * + * @param string $text Original text containing asian words + * @param string $sep the separator to use + * @return string Text with separated asian words + */ + public static function separateAsianWords($text, $sep = ' ') + { + // handle asian chars as single words (may fail on older PHP version) + $asia = @preg_replace('/(' . self::REGEXP . ')/u', $sep . '\1' . $sep, $text); + if (!is_null($asia)) $text = $asia; // recover from regexp falure + + return $text; + } + + /** + * Split the given text into separate parts + * + * Each part is either a non-asian string, or a single asian word + * + * @param string $term + * @return string[] + */ + public static function splitAsianWords($term) + { + return preg_split('/(' . self::REGEXP . '+)/u', $term, -1, PREG_SPLIT_DELIM_CAPTURE | PREG_SPLIT_NO_EMPTY); + } +} diff --git a/inc/Utf8/Clean.php b/inc/Utf8/Clean.php new file mode 100644 index 0000000..434da70 --- /dev/null +++ b/inc/Utf8/Clean.php @@ -0,0 +1,203 @@ + + * + * @param string $str + * @return bool + */ + public static function isASCII($str) + { + return (preg_match('/(?:[^\x00-\x7F])/', $str) !== 1); + } + + /** + * Tries to detect if a string is in Unicode encoding + * + * @author + * @link http://php.net/manual/en/function.utf8-encode.php + * + * @param string $str + * @return bool + */ + public static function isUtf8($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; + } + + /** + * Strips all high byte chars + * + * Returns a pure ASCII7 string + * + * @author Andreas Gohr + * + * @param string $str + * @return string + */ + public static function strip($str) + { + $ascii = ''; + $len = strlen($str); + for ($i = 0; $i < $len; $i++) { + if (ord($str[$i]) < 128) { + $ascii .= $str[$i]; + } + } + return $ascii; + } + + /** + * 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 + * + * @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 + */ + public static function stripspecials($string, $repl = '', $additional = '') + { + static $specials = null; + if ($specials === null) { + $specials = preg_quote(Table::specialChars(), '/'); + } + + return preg_replace('/[' . $additional . '\x00-\x19' . $specials . ']/u', $repl, $string); + } + + /** + * 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 + * @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 + */ + public static function replaceBadBytes($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])); + } + return ob_get_clean(); + } + + + /** + * 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 + * + * @param string $string + * @param int $case + * @return string + */ + public static function deaccent($string, $case = 0) + { + if ($case <= 0) { + $string = strtr($string, Table::lowerAccents()); + } + if ($case >= 0) { + $string = strtr($string, Table::upperAccents()); + } + return $string; + } + + /** + * Romanize a non-latin string + * + * @author Andreas Gohr + * + * @param string $string + * @return string + */ + public static function romanize($string) + { + if (self::isASCII($string)) return $string; //nothing to do + + return strtr($string, Table::romanization()); + } + + /** + * adjust a byte index into a utf8 string to a utf8 character boundary + * + * @author chris smith + * + * @param string $str utf8 character string + * @param int $i byte index into $str + * @param bool $next 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 + */ + public static function 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; + } +} diff --git a/inc/Utf8/Conversion.php b/inc/Utf8/Conversion.php new file mode 100644 index 0000000..acde3fb --- /dev/null +++ b/inc/Utf8/Conversion.php @@ -0,0 +1,158 @@ + + * @author + * @link http://php.net/manual/en/function.utf8-decode.php + * + * @param string $str + * @param bool $all Encode non-utf8 char to HTML as well + * @return string + */ + public static function toHtml($str, $all = false) + { + $ret = ''; + foreach (Unicode::fromUtf8($str) as $cp) { + if ($cp < 0x80 && !$all) { + $ret .= chr($cp); + } elseif ($cp < 0x100) { + $ret .= "&#$cp;"; + } else { + $ret .= '&#x' . dechex($cp) . ';'; + } + } + return $ret; + } + + /** + * 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 & < etc. + * are handled as well. Avoids the problem that would occur if you + * had to decode "&#38;&amp;#38;" + * + * unhtmlspecialchars(\dokuwiki\Utf8\Conversion::fromHtml($s)) -> "&&" + * \dokuwiki\Utf8\Conversion::fromHtml(unhtmlspecialchars($s)) -> "&&#38;" + * what it should be -> "&&#38;" + * + * @author Tom N Harris + * + * @param string $str UTF-8 encoded string + * @param boolean $entities decode name entities in addtition to numeric ones + * @return string UTF-8 encoded string with numeric (and named) entities replaced. + */ + public static function fromHtml($str, $entities = false) + { + if (!$entities) { + return preg_replace_callback( + '/(&#([Xx])?([0-9A-Za-z]+);)/m', + [self::class, 'decodeNumericEntity'], + $str + ); + } + + return preg_replace_callback( + '/&(#)?([Xx])?([0-9A-Za-z]+);/m', + [self::class, 'decodeAnyEntity'], + $str + ); + } + + /** + * Decodes any HTML entity to it's correct UTF-8 char equivalent + * + * @param string $ent An entity + * @return string + */ + protected static function decodeAnyEntity($ent) + { + // create the named entity lookup table + static $table = null; + if ($table === null) { + $table = get_html_translation_table(HTML_ENTITIES); + $table = array_flip($table); + $table = array_map( + static fn($c) => Unicode::toUtf8([ord($c)]), + $table + ); + } + + if ($ent[1] === '#') { + return self::decodeNumericEntity($ent); + } + + if (array_key_exists($ent[0], $table)) { + return $table[$ent[0]]; + } + + return $ent[0]; + } + + /** + * Decodes numeric HTML entities to their correct UTF-8 characters + * + * @param $ent string A numeric entity + * @return string|false + */ + protected static function decodeNumericEntity($ent) + { + switch ($ent[2]) { + case 'X': + case 'x': + $cp = hexdec($ent[3]); + break; + default: + $cp = (int) $ent[3]; + break; + } + return Unicode::toUtf8([$cp]); + } + + /** + * 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 + */ + public static function toUtf16be($str, $bom = false) + { + $out = $bom ? "\xFE\xFF" : ''; + if (UTF8_MBSTRING) { + return $out . mb_convert_encoding($str, 'UTF-16BE', 'UTF-8'); + } + + $uni = Unicode::fromUtf8($str); + foreach ($uni as $cp) { + $out .= pack('n', $cp); + } + return $out; + } + + /** + * 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 + */ + public static function fromUtf16be($str) + { + $uni = unpack('n*', $str); + return Unicode::toUtf8($uni); + } +} diff --git a/inc/Utf8/PhpString.php b/inc/Utf8/PhpString.php new file mode 100644 index 0000000..9237f87 --- /dev/null +++ b/inc/Utf8/PhpString.php @@ -0,0 +1,373 @@ + + * @see strlen() + */ + public static function strlen($string) + { + if (UTF8_MBSTRING) { + return mb_strlen($string, 'UTF-8'); + } + + if (function_exists('iconv_strlen')) { + return iconv_strlen($string, 'UTF-8'); + } + + // utf8_decode is deprecated + if (function_exists('utf8_decode')) { + return strlen(utf8_decode($string)); + } + + return strlen($string); + } + + /** + * UTF-8 aware alternative to substr + * + * Return part of a string given character offset (and optionally length) + * + * @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 + * @author Harry Fuecks + * @author Chris Smith + * + */ + public static function substr($str, $offset, $length = null) + { + if (UTF8_MBSTRING) { + if ($length === null) { + return mb_substr($str, $offset); + } + + 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 ($length !== null) $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 = self::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 ($length === null) { + $length_pattern = '(.*)$'; // the rest of the string + } else { + if (!isset($strlen)) $strlen = self::strlen($str); // see notes + if ($offset > $strlen) return ''; // another trivial case + + if ($length > 0) { + // reduce any length that would go past the end of the string + $length = min($strlen - $offset, $length); + $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 . '})'; + } elseif ($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]; + } + + // phpcs:disable PSR1.Methods.CamelCapsMethodName.NotCamelCaps + /** + * Unicode aware replacement for 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 + * @see substr_replace() + * + * @author Andreas Gohr + */ + public static function substr_replace($string, $replacement, $start, $length = 0) + { + $ret = ''; + if ($start > 0) $ret .= self::substr($string, 0, $start); + $ret .= $replacement; + $ret .= self::substr($string, $start + $length); + return $ret; + } + // phpcs:enable PSR1.Methods.CamelCapsMethodName.NotCamelCaps + + /** + * Unicode aware replacement for ltrim() + * + * @param string $str + * @param string $charlist + * @return string + * @see ltrim() + * + * @author Andreas Gohr + */ + public static function 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); + } + + /** + * Unicode aware replacement for rtrim() + * + * @param string $str + * @param string $charlist + * @return string + * @see rtrim() + * + * @author Andreas Gohr + */ + public static function 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); + } + + /** + * Unicode aware replacement for trim() + * + * @param string $str + * @param string $charlist + * @return string + * @see trim() + * + * @author Andreas Gohr + */ + public static function trim($str, $charlist = '') + { + if ($charlist === '') return trim($str); + + return self::ltrim(self::rtrim($str, $charlist), $charlist); + } + + /** + * This is a unicode aware replacement for strtolower() + * + * Uses mb_string extension if available + * + * @param string $string + * @return string + * @see \dokuwiki\Utf8\PhpString::strtoupper() + * + * @author Leo Feyer + * @see strtolower() + */ + public static function strtolower($string) + { + if ($string === null) return ''; // pre-8.1 behaviour + if (UTF8_MBSTRING) { + if (class_exists('Normalizer', $autoload = false)) { + return \Normalizer::normalize(mb_strtolower($string, 'utf-8')); + } + return (mb_strtolower($string, 'utf-8')); + } + return strtr($string, Table::upperCaseToLowerCase()); + } + + /** + * This is a unicode aware replacement for strtoupper() + * + * Uses mb_string extension if available + * + * @param string $string + * @return string + * @see \dokuwiki\Utf8\PhpString::strtoupper() + * + * @author Leo Feyer + * @see strtoupper() + */ + public static function strtoupper($string) + { + if (UTF8_MBSTRING) return mb_strtoupper($string, 'utf-8'); + + return strtr($string, Table::lowerCaseToUpperCase()); + } + + + /** + * UTF-8 aware alternative to ucfirst + * Make a string's first character uppercase + * + * @param string $str + * @return string with first character as upper case (if applicable) + * @author Harry Fuecks + * + */ + public static function ucfirst($str) + { + switch (self::strlen($str)) { + case 0: + return ''; + case 1: + return self::strtoupper($str); + default: + preg_match('/^(.{1})(.*)$/us', $str, $matches); + return self::strtoupper($matches[1]) . $matches[2]; + } + } + + /** + * UTF-8 aware alternative to ucwords + * Uppercase the first character of each word in a string + * + * @param string $str + * @return string with first char of each word uppercase + * @author Harry Fuecks + * @see http://php.net/ucwords + * + */ + public static function 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, + function ($matches) { + $leadingws = $matches[2]; + $ucfirst = self::strtoupper($matches[3]); + $ucword = self::substr_replace(ltrim($matches[0]), $ucfirst, 0, 1); + return $leadingws . $ucword; + }, + $str + ); + } + + /** + * This is an Unicode aware replacement for strpos + * + * @param string $haystack + * @param string $needle + * @param integer $offset + * @return integer + * @author Leo Feyer + * @see strpos() + * + */ + public static function strpos($haystack, $needle, $offset = 0) + { + $comp = 0; + $length = null; + + while ($length === null || $length < $offset) { + $pos = strpos($haystack, $needle, $offset + $comp); + + if ($pos === false) + return false; + + $length = self::strlen(substr($haystack, 0, $pos)); + + if ($length < $offset) + $comp = $pos - $length; + } + + return $length; + } +} diff --git a/inc/Utf8/Sort.php b/inc/Utf8/Sort.php new file mode 100644 index 0000000..9f066b0 --- /dev/null +++ b/inc/Utf8/Sort.php @@ -0,0 +1,180 @@ + + * @author Andreas Gohr + */ +class Sort +{ + /** @var \Collator[] language specific collators, usually only one */ + protected static $collators = []; + + /** @var bool should the intl extension be used if available? For testing only */ + protected static $useIntl = true; + + /** + * Initialization of a collator using $conf['lang'] as the locale. + * The initialization is done only once. + * The collation takes "natural ordering" into account, that is, "page 2" is before "page 10". + * + * @return \Collator Returns a configured collator or null if the collator cannot be created. + * + * @author Moisés Braga Ribeiro + */ + protected static function getCollator() + { + global $conf; + $lc = $conf['lang']; + + // check if intl extension is available + if (!self::$useIntl || !class_exists('\Collator')) { + return null; + } + + // load collator if not available yet + if (!isset(self::$collators[$lc])) { + $collator = \Collator::create($lc); + if (!isset($collator)) return null; // check needed as stated in the docs + $collator->setAttribute(\Collator::NUMERIC_COLLATION, \Collator::ON); + Logger::getInstance(Logger::LOG_DEBUG)->log( + 'Collator created with locale "' . $lc . '": numeric collation on, ' . + 'valid locale "' . $collator->getLocale(\Locale::VALID_LOCALE) . '", ' . + 'actual locale "' . $collator->getLocale(\Locale::ACTUAL_LOCALE) . '"', + null, + __FILE__, + __LINE__ + ); + self::$collators[$lc] = $collator; + } + + return self::$collators[$lc]; + } + + /** + * Enable or disable the use of the "intl" extension collator. + * This is used for testing and should not be used in normal code. + * + * @param bool $use + * + * @author Andreas Gohr + */ + public static function useIntl($use = true) + { + self::$useIntl = $use; + } + + /** + * Drop-in replacement for strcmp(), strcasecmp(), strnatcmp() and strnatcasecmp(). + * It uses a collator-based comparison, or strnatcasecmp() as a fallback. + * + * @param string $str1 The first string. + * @param string $str2 The second string. + * @return int Returns < 0 if $str1 is less than $str2; > 0 if $str1 is greater than $str2, and 0 if they are equal. + * + * @author Moisés Braga Ribeiro + */ + public static function strcmp($str1, $str2) + { + $collator = self::getCollator(); + if (isset($collator)) { + return $collator->compare($str1, $str2); + } else { + return strnatcasecmp($str1, $str2); + } + } + + /** + * Drop-in replacement for sort(). + * It uses a collator-based sort, or sort() with flags SORT_NATURAL and SORT_FLAG_CASE as a fallback. + * + * @param array $array The input array. + * @return bool Returns true on success or false on failure. + * + * @author Moisés Braga Ribeiro + */ + public static function sort(&$array) + { + $collator = self::getCollator(); + if (isset($collator)) { + return $collator->sort($array); + } else { + return sort($array, SORT_NATURAL | SORT_FLAG_CASE); + } + } + + /** + * Drop-in replacement for ksort(). + * It uses a collator-based sort, or ksort() with flags SORT_NATURAL and SORT_FLAG_CASE as a fallback. + * + * @param array $array The input array. + * @return bool Returns true on success or false on failure. + * + * @author Moisés Braga Ribeiro + */ + public static function ksort(&$array) + { + $collator = self::getCollator(); + if (isset($collator)) { + return uksort($array, [$collator, 'compare']); + } else { + return ksort($array, SORT_NATURAL | SORT_FLAG_CASE); + } + } + + /** + * Drop-in replacement for asort(), natsort() and natcasesort(). + * It uses a collator-based sort, or asort() with flags SORT_NATURAL and SORT_FLAG_CASE as a fallback. + * + * @param array $array The input array. + * @return bool Returns true on success or false on failure. + * + * @author Moisés Braga Ribeiro + */ + public static function asort(&$array) + { + $collator = self::getCollator(); + if (isset($collator)) { + return $collator->asort($array); + } else { + return asort($array, SORT_NATURAL | SORT_FLAG_CASE); + } + } + + /** + * Drop-in replacement for asort(), natsort() and natcasesort() when the parameter is an array of filenames. + * Filenames may not be equal to page names, depending on the setting in $conf['fnencode'], + * so the correct behavior is to sort page names and reflect this sorting in the filename array. + * + * @param array $array The input array. + * @return bool Returns true on success or false on failure. + * + * @author Moisés Braga Ribeiro + * @author Andreas Gohr + */ + public static function asortFN(&$array) + { + $collator = self::getCollator(); + return uasort($array, function ($fn1, $fn2) use ($collator) { + if (isset($collator)) { + return $collator->compare(utf8_decodeFN($fn1), utf8_decodeFN($fn2)); + } else { + return strnatcasecmp(utf8_decodeFN($fn1), utf8_decodeFN($fn2)); + } + }); + } +} diff --git a/inc/Utf8/Table.php b/inc/Utf8/Table.php new file mode 100644 index 0000000..f618c69 --- /dev/null +++ b/inc/Utf8/Table.php @@ -0,0 +1,92 @@ + 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 + * @author Harry Fuecks + * @see unicode_to_utf8 + * @link http://hsivonen.iki.fi/php-utf8/ + * @link http://sourceforge.net/projects/phputf8/ + * @todo break into less complex chunks + * @todo use exceptions instead of user errors + * + * @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 + */ + public static function fromUtf8($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 = []; + + $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; + } elseif (0xC0 === (0xE0 & $in)) { + // First octet of 2 octet sequence + $mUcs4 = $in; + $mUcs4 = ($mUcs4 & 0x1F) << 6; + $mState = 1; + $mBytes = 2; + } elseif (0xE0 === (0xF0 & $in)) { + // First octet of 3 octet sequence + $mUcs4 = $in; + $mUcs4 = ($mUcs4 & 0x0F) << 12; + $mState = 2; + $mBytes = 3; + } elseif (0xF0 === (0xF8 & $in)) { + // First octet of 4 octet sequence + $mUcs4 = $in; + $mUcs4 = ($mUcs4 & 0x07) << 18; + $mState = 3; + $mBytes = 4; + } elseif (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; + } elseif (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; + } + } elseif (0x80 === (0xC0 & $in)) { + // When mState is non-zero, we expect a continuation of the multi-octet + // sequence + // 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; + } + + /** + * 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 + * @author Harry Fuecks + * @see utf8_to_unicode + * @link http://hsivonen.iki.fi/php-utf8/ + * @link http://sourceforge.net/projects/phputf8/ + * @todo use exceptions instead of user errors + */ + public static function toUtf8($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]); + } elseif ($arr[$k] <= 0x07ff) { + # 2 byte sequence + echo chr(0xc0 | ($arr[$k] >> 6)); + echo chr(0x80 | ($arr[$k] & 0x003f)); + } elseif ($arr[$k] == 0xFEFF) { + # Byte order mark (skip) + // nop -- zap the BOM + } elseif ($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; + } + } elseif ($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)); + } elseif ($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; + } + } + + return ob_get_clean(); + } +} diff --git a/inc/Utf8/tables/case.php b/inc/Utf8/tables/case.php new file mode 100644 index 0000000..ca5b480 --- /dev/null +++ b/inc/Utf8/tables/case.php @@ -0,0 +1,661 @@ + + */ + +return [ + 'A' => 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', + 'À' => 'à', + 'Á' => 'á', + 'Â' => 'â', + 'Ã' => 'ã', + 'Ä' => 'ä', + 'Å' => 'å', + 'Æ' => 'æ', + 'Ç' => 'ç', + 'È' => 'è', + 'É' => 'é', + 'Ê' => 'ê', + 'Ë' => 'ë', + 'Ì' => 'ì', + 'Í' => 'í', + 'Î' => 'î', + 'Ï' => 'ï', + 'Ð' => 'ð', + 'Ñ' => 'ñ', + 'Ò' => 'ò', + 'Ó' => 'ó', + 'Ô' => 'ô', + 'Õ' => 'õ', + 'Ö' => 'ö', + 'Ø' => 'ø', + 'Ù' => 'ù', + 'Ú' => 'ú', + 'Û' => 'û', + 'Ü' => 'ü', + 'Ý' => 'ý', + 'Þ' => 'þ', + 'Ā' => 'ā', + 'Ă' => 'ă', + 'Ą' => 'ą', + 'Ć' => 'ć', + 'Ĉ' => 'ĉ', + 'Ċ' => 'ċ', + 'Č' => 'č', + 'Ď' => 'ď', + 'Đ' => 'đ', + 'Ē' => 'ē', + 'Ĕ' => 'ĕ', + 'Ė' => 'ė', + 'Ę' => 'ę', + 'Ě' => 'ě', + 'Ĝ' => 'ĝ', + 'Ğ' => 'ğ', + 'Ġ' => 'ġ', + 'Ģ' => 'ģ', + 'Ĥ' => 'ĥ', + 'Ħ' => 'ħ', + 'Ĩ' => 'ĩ', + 'Ī' => 'ī', + 'Ĭ' => 'ĭ', + 'Į' => 'į', + 'IJ' => 'ij', + 'Ĵ' => 'ĵ', + 'Ķ' => 'ķ', + 'Ĺ' => 'ĺ', + 'Ļ' => 'ļ', + 'Ľ' => 'ľ', + 'Ŀ' => 'ŀ', + 'Ł' => 'ł', + 'Ń' => 'ń', + 'Ņ' => 'ņ', + 'Ň' => 'ň', + 'Ŋ' => 'ŋ', + 'Ō' => 'ō', + 'Ŏ' => 'ŏ', + 'Ő' => 'ő', + 'Œ' => 'œ', + 'Ŕ' => 'ŕ', + 'Ŗ' => 'ŗ', + 'Ř' => 'ř', + 'Ś' => 'ś', + 'Ŝ' => 'ŝ', + 'Ş' => 'ş', + 'Š' => 'š', + 'Ţ' => 'ţ', + 'Ť' => 'ť', + 'Ŧ' => 'ŧ', + 'Ũ' => 'ũ', + 'Ū' => 'ū', + 'Ŭ' => 'ŭ', + 'Ů' => 'ů', + 'Ű' => 'ű', + 'Ų' => 'ų', + 'Ŵ' => 'ŵ', + 'Ŷ' => 'ŷ', + 'Ÿ' => 'ÿ', + 'Ź' => 'ź', + 'Ż' => 'ż', + 'Ž' => 'ž', + 'Ɓ' => 'ɓ', + 'Ƃ' => 'ƃ', + 'Ƅ' => 'ƅ', + 'Ɔ' => 'ɔ', + 'Ƈ' => 'ƈ', + 'Ɖ' => 'ɖ', + 'Ɗ' => 'ɗ', + 'Ƌ' => 'ƌ', + 'Ǝ' => 'ǝ', + 'Ə' => 'ə', + 'Ɛ' => 'ɛ', + 'Ƒ' => 'ƒ', + 'Ɣ' => 'ɣ', + 'Ɩ' => 'ɩ', + 'Ɨ' => 'ɨ', + 'Ƙ' => 'ƙ', + 'Ɯ' => 'ɯ', + 'Ɲ' => 'ɲ', + 'Ɵ' => 'ɵ', + 'Ơ' => 'ơ', + 'Ƣ' => 'ƣ', + 'Ƥ' => 'ƥ', + 'Ʀ' => 'ʀ', + 'Ƨ' => 'ƨ', + 'Ʃ' => 'ʃ', + 'Ƭ' => 'ƭ', + 'Ʈ' => 'ʈ', + 'Ư' => 'ư', + 'Ʊ' => 'ʊ', + 'Ʋ' => 'ʋ', + 'Ƴ' => 'ƴ', + 'Ƶ' => 'ƶ', + 'Ʒ' => 'ʒ', + 'Ƹ' => 'ƹ', + 'Ƽ' => 'ƽ', + 'Dž' => 'dž', + 'Lj' => 'lj', + 'Nj' => 'nj', + 'Ǎ' => 'ǎ', + 'Ǐ' => 'ǐ', + 'Ǒ' => 'ǒ', + 'Ǔ' => 'ǔ', + 'Ǖ' => 'ǖ', + 'Ǘ' => 'ǘ', + 'Ǚ' => 'ǚ', + 'Ǜ' => 'ǜ', + 'Ǟ' => 'ǟ', + 'Ǡ' => 'ǡ', + 'Ǣ' => 'ǣ', + 'Ǥ' => 'ǥ', + 'Ǧ' => 'ǧ', + 'Ǩ' => 'ǩ', + 'Ǫ' => 'ǫ', + 'Ǭ' => 'ǭ', + 'Ǯ' => 'ǯ', + 'Dz' => 'dz', + 'Ǵ' => 'ǵ', + 'Ƕ' => 'ƕ', + 'Ƿ' => 'ƿ', + 'Ǹ' => 'ǹ', + 'Ǻ' => 'ǻ', + 'Ǽ' => 'ǽ', + 'Ǿ' => 'ǿ', + 'Ȁ' => 'ȁ', + 'Ȃ' => 'ȃ', + 'Ȅ' => 'ȅ', + 'Ȇ' => 'ȇ', + 'Ȉ' => 'ȉ', + 'Ȋ' => 'ȋ', + 'Ȍ' => 'ȍ', + 'Ȏ' => 'ȏ', + 'Ȑ' => 'ȑ', + 'Ȓ' => 'ȓ', + 'Ȕ' => 'ȕ', + 'Ȗ' => 'ȗ', + 'Ș' => 'ș', + 'Ț' => 'ț', + 'Ȝ' => 'ȝ', + 'Ȟ' => 'ȟ', + 'Ƞ' => 'ƞ', + 'Ȣ' => 'ȣ', + 'Ȥ' => 'ȥ', + 'Ȧ' => 'ȧ', + 'Ȩ' => 'ȩ', + 'Ȫ' => 'ȫ', + 'Ȭ' => 'ȭ', + 'Ȯ' => 'ȯ', + 'Ȱ' => 'ȱ', + 'Ȳ' => 'ȳ', + 'Ά' => 'ά', + 'Έ' => 'έ', + 'Ή' => 'ή', + 'Ί' => 'ί', + 'Ό' => 'ό', + 'Ύ' => 'ύ', + 'Ώ' => 'ώ', + 'Α' => 'α', + 'Β' => 'β', + 'Γ' => 'γ', + 'Δ' => 'δ', + 'Ε' => 'ε', + 'Ζ' => 'ζ', + 'Η' => 'η', + 'Θ' => 'θ', + 'Ι' => 'ι', + 'Κ' => 'κ', + 'Λ' => 'λ', + 'Μ' => 'μ', + 'Ν' => 'ν', + 'Ξ' => 'ξ', + 'Ο' => 'ο', + 'Π' => 'π', + 'Ρ' => 'ρ', + 'Σ' => 'σ', + 'Τ' => 'τ', + 'Υ' => 'υ', + 'Φ' => 'φ', + 'Χ' => 'χ', + 'Ψ' => 'ψ', + 'Ω' => 'ω', + 'Ϊ' => 'ϊ', + 'Ϋ' => 'ϋ', + 'Ϙ' => 'ϙ', + 'Ϛ' => 'ϛ', + 'Ϝ' => 'ϝ', + 'Ϟ' => 'ϟ', + 'Ϡ' => 'ϡ', + 'Ϣ' => 'ϣ', + 'Ϥ' => 'ϥ', + 'Ϧ' => 'ϧ', + 'Ϩ' => 'ϩ', + 'Ϫ' => 'ϫ', + 'Ϭ' => 'ϭ', + 'Ϯ' => 'ϯ', + 'Ѐ' => 'ѐ', + 'Ё' => 'ё', + 'Ђ' => 'ђ', + 'Ѓ' => 'ѓ', + 'Є' => 'є', + 'Ѕ' => 'ѕ', + 'І' => 'і', + 'Ї' => 'ї', + 'Ј' => 'ј', + 'Љ' => 'љ', + 'Њ' => 'њ', + 'Ћ' => 'ћ', + 'Ќ' => 'ќ', + 'Ѝ' => 'ѝ', + 'Ў' => 'ў', + 'Џ' => 'џ', + 'А' => 'а', + 'Б' => 'б', + 'В' => 'в', + 'Г' => 'г', + 'Д' => 'д', + 'Е' => 'е', + 'Ж' => 'ж', + 'З' => 'з', + 'И' => 'и', + 'Й' => 'й', + 'К' => 'к', + 'Л' => 'л', + 'М' => 'м', + 'Н' => 'н', + 'О' => 'о', + 'П' => 'п', + 'Р' => 'р', + 'С' => 'с', + 'Т' => 'т', + 'У' => 'у', + 'Ф' => 'ф', + 'Х' => 'х', + 'Ц' => 'ц', + 'Ч' => 'ч', + 'Ш' => 'ш', + 'Щ' => 'щ', + 'Ъ' => 'ъ', + 'Ы' => 'ы', + 'Ь' => 'ь', + 'Э' => 'э', + 'Ю' => 'ю', + 'Я' => 'я', + 'Ѡ' => 'ѡ', + 'Ѣ' => 'ѣ', + 'Ѥ' => 'ѥ', + 'Ѧ' => 'ѧ', + 'Ѩ' => 'ѩ', + 'Ѫ' => 'ѫ', + 'Ѭ' => 'ѭ', + 'Ѯ' => 'ѯ', + 'Ѱ' => 'ѱ', + 'Ѳ' => 'ѳ', + 'Ѵ' => 'ѵ', + 'Ѷ' => 'ѷ', + 'Ѹ' => 'ѹ', + 'Ѻ' => 'ѻ', + 'Ѽ' => 'ѽ', + 'Ѿ' => 'ѿ', + 'Ҁ' => 'ҁ', + 'Ҋ' => 'ҋ', + 'Ҍ' => 'ҍ', + 'Ҏ' => 'ҏ', + 'Ґ' => 'ґ', + 'Ғ' => 'ғ', + 'Ҕ' => 'ҕ', + 'Җ' => 'җ', + 'Ҙ' => 'ҙ', + 'Қ' => 'қ', + 'Ҝ' => 'ҝ', + 'Ҟ' => 'ҟ', + 'Ҡ' => 'ҡ', + 'Ң' => 'ң', + 'Ҥ' => 'ҥ', + 'Ҧ' => 'ҧ', + 'Ҩ' => 'ҩ', + 'Ҫ' => 'ҫ', + 'Ҭ' => 'ҭ', + 'Ү' => 'ү', + 'Ұ' => 'ұ', + 'Ҳ' => 'ҳ', + 'Ҵ' => 'ҵ', + 'Ҷ' => 'ҷ', + 'Ҹ' => 'ҹ', + 'Һ' => 'һ', + 'Ҽ' => 'ҽ', + 'Ҿ' => 'ҿ', + 'Ӂ' => 'ӂ', + 'Ӄ' => 'ӄ', + 'Ӆ' => 'ӆ', + 'Ӈ' => 'ӈ', + 'Ӊ' => 'ӊ', + 'Ӌ' => 'ӌ', + 'Ӎ' => 'ӎ', + 'Ӑ' => 'ӑ', + 'Ӓ' => 'ӓ', + 'Ӕ' => 'ӕ', + 'Ӗ' => 'ӗ', + 'Ә' => 'ә', + 'Ӛ' => 'ӛ', + 'Ӝ' => 'ӝ', + 'Ӟ' => 'ӟ', + 'Ӡ' => 'ӡ', + 'Ӣ' => 'ӣ', + 'Ӥ' => 'ӥ', + 'Ӧ' => 'ӧ', + 'Ө' => 'ө', + 'Ӫ' => 'ӫ', + 'Ӭ' => 'ӭ', + 'Ӯ' => 'ӯ', + 'Ӱ' => 'ӱ', + 'Ӳ' => 'ӳ', + 'Ӵ' => 'ӵ', + 'Ӹ' => 'ӹ', + 'Ԁ' => 'ԁ', + 'Ԃ' => 'ԃ', + 'Ԅ' => 'ԅ', + 'Ԇ' => 'ԇ', + 'Ԉ' => 'ԉ', + 'Ԋ' => 'ԋ', + 'Ԍ' => 'ԍ', + 'Ԏ' => 'ԏ', + 'Ա' => 'ա', + 'Բ' => 'բ', + 'Գ' => 'գ', + 'Դ' => 'դ', + 'Ե' => 'ե', + 'Զ' => 'զ', + 'Է' => 'է', + 'Ը' => 'ը', + 'Թ' => 'թ', + 'Ժ' => 'ժ', + 'Ի' => 'ի', + 'Լ' => 'լ', + 'Խ' => 'խ', + 'Ծ' => 'ծ', + 'Կ' => 'կ', + 'Հ' => 'հ', + 'Ձ' => 'ձ', + 'Ղ' => 'ղ', + 'Ճ' => 'ճ', + 'Մ' => 'մ', + 'Յ' => 'յ', + 'Ն' => 'ն', + 'Շ' => 'շ', + 'Ո' => 'ո', + 'Չ' => 'չ', + 'Պ' => 'պ', + 'Ջ' => 'ջ', + 'Ռ' => 'ռ', + 'Ս' => 'ս', + 'Վ' => 'վ', + 'Տ' => 'տ', + 'Ր' => 'ր', + 'Ց' => 'ց', + 'Ւ' => 'ւ', + 'Փ' => 'փ', + 'Ք' => 'ք', + 'Օ' => 'օ', + 'Ֆ' => 'ֆ', + 'Ḁ' => 'ḁ', + 'Ḃ' => 'ḃ', + 'Ḅ' => 'ḅ', + 'Ḇ' => 'ḇ', + 'Ḉ' => 'ḉ', + 'Ḋ' => 'ḋ', + 'Ḍ' => 'ḍ', + 'Ḏ' => 'ḏ', + 'Ḑ' => 'ḑ', + 'Ḓ' => 'ḓ', + 'Ḕ' => 'ḕ', + 'Ḗ' => 'ḗ', + 'Ḙ' => 'ḙ', + 'Ḛ' => 'ḛ', + 'Ḝ' => 'ḝ', + 'Ḟ' => 'ḟ', + 'Ḡ' => 'ḡ', + 'Ḣ' => 'ḣ', + 'Ḥ' => 'ḥ', + 'Ḧ' => 'ḧ', + 'Ḩ' => 'ḩ', + 'Ḫ' => 'ḫ', + 'Ḭ' => 'ḭ', + 'Ḯ' => 'ḯ', + 'Ḱ' => 'ḱ', + 'Ḳ' => 'ḳ', + 'Ḵ' => 'ḵ', + 'Ḷ' => 'ḷ', + 'Ḹ' => 'ḹ', + 'Ḻ' => 'ḻ', + 'Ḽ' => 'ḽ', + 'Ḿ' => 'ḿ', + 'Ṁ' => 'ṁ', + 'Ṃ' => 'ṃ', + 'Ṅ' => 'ṅ', + 'Ṇ' => 'ṇ', + 'Ṉ' => 'ṉ', + 'Ṋ' => 'ṋ', + 'Ṍ' => 'ṍ', + 'Ṏ' => 'ṏ', + 'Ṑ' => 'ṑ', + 'Ṓ' => 'ṓ', + 'Ṕ' => 'ṕ', + 'Ṗ' => 'ṗ', + 'Ṙ' => 'ṙ', + 'Ṛ' => 'ṛ', + 'Ṝ' => 'ṝ', + 'Ṟ' => 'ṟ', + 'Ṡ' => 'ṡ', + 'Ṣ' => 'ṣ', + 'Ṥ' => 'ṥ', + 'Ṧ' => 'ṧ', + 'Ṩ' => 'ṩ', + 'Ṫ' => 'ṫ', + 'Ṭ' => 'ṭ', + 'Ṯ' => 'ṯ', + 'Ṱ' => 'ṱ', + 'Ṳ' => 'ṳ', + 'Ṵ' => 'ṵ', + 'Ṷ' => 'ṷ', + 'Ṹ' => 'ṹ', + 'Ṻ' => 'ṻ', + 'Ṽ' => 'ṽ', + 'Ṿ' => 'ṿ', + 'Ẁ' => 'ẁ', + 'Ẃ' => 'ẃ', + 'Ẅ' => 'ẅ', + 'Ẇ' => 'ẇ', + 'Ẉ' => 'ẉ', + 'Ẋ' => 'ẋ', + 'Ẍ' => 'ẍ', + 'Ẏ' => 'ẏ', + 'Ẑ' => 'ẑ', + 'Ẓ' => 'ẓ', + 'Ẕ' => 'ẕ', + 'Ạ' => 'ạ', + 'Ả' => 'ả', + 'Ấ' => 'ấ', + 'Ầ' => 'ầ', + 'Ẩ' => 'ẩ', + 'Ẫ' => 'ẫ', + 'Ậ' => 'ậ', + 'Ắ' => 'ắ', + 'Ằ' => 'ằ', + 'Ẳ' => 'ẳ', + 'Ẵ' => 'ẵ', + 'Ặ' => 'ặ', + 'Ẹ' => 'ẹ', + 'Ẻ' => 'ẻ', + 'Ẽ' => 'ẽ', + 'Ế' => 'ế', + 'Ề' => 'ề', + 'Ể' => 'ể', + 'Ễ' => 'ễ', + 'Ệ' => 'ệ', + 'Ỉ' => 'ỉ', + 'Ị' => 'ị', + 'Ọ' => 'ọ', + 'Ỏ' => 'ỏ', + 'Ố' => 'ố', + 'Ồ' => 'ồ', + 'Ổ' => 'ổ', + 'Ỗ' => 'ỗ', + 'Ộ' => 'ộ', + 'Ớ' => 'ớ', + 'Ờ' => 'ờ', + 'Ở' => 'ở', + 'Ỡ' => 'ỡ', + 'Ợ' => 'ợ', + 'Ụ' => 'ụ', + 'Ủ' => 'ủ', + 'Ứ' => 'ứ', + 'Ừ' => 'ừ', + 'Ử' => 'ử', + 'Ữ' => 'ữ', + 'Ự' => 'ự', + 'Ỳ' => 'ỳ', + 'Ỵ' => 'ỵ', + 'Ỷ' => 'ỷ', + 'Ỹ' => 'ỹ', + 'Ἀ' => 'ἀ', + 'Ἁ' => 'ἁ', + 'Ἂ' => 'ἂ', + 'Ἃ' => 'ἃ', + 'Ἄ' => 'ἄ', + 'Ἅ' => 'ἅ', + 'Ἆ' => 'ἆ', + 'Ἇ' => 'ἇ', + 'Ἐ' => 'ἐ', + 'Ἑ' => 'ἑ', + 'Ἒ' => 'ἒ', + 'Ἓ' => 'ἓ', + 'Ἔ' => 'ἔ', + 'Ἕ' => 'ἕ', + 'Ἡ' => 'ἡ', + 'Ἢ' => 'ἢ', + 'Ἣ' => 'ἣ', + 'Ἤ' => 'ἤ', + 'Ἥ' => 'ἥ', + 'Ἦ' => 'ἦ', + 'Ἧ' => 'ἧ', + 'Ἰ' => 'ἰ', + 'Ἱ' => 'ἱ', + 'Ἲ' => 'ἲ', + 'Ἳ' => 'ἳ', + 'Ἴ' => 'ἴ', + 'Ἵ' => 'ἵ', + 'Ἶ' => 'ἶ', + 'Ἷ' => 'ἷ', + 'Ὀ' => 'ὀ', + 'Ὁ' => 'ὁ', + 'Ὂ' => 'ὂ', + 'Ὃ' => 'ὃ', + 'Ὄ' => 'ὄ', + 'Ὅ' => 'ὅ', + 'Ὑ' => 'ὑ', + 'Ὓ' => 'ὓ', + 'Ὕ' => 'ὕ', + 'Ὗ' => 'ὗ', + 'Ὡ' => 'ὡ', + 'Ὢ' => 'ὢ', + 'Ὣ' => 'ὣ', + 'Ὤ' => 'ὤ', + 'Ὥ' => 'ὥ', + 'Ὦ' => 'ὦ', + 'Ὧ' => 'ὧ', + 'ᾈ' => 'ᾀ', + 'ᾉ' => 'ᾁ', + 'ᾊ' => 'ᾂ', + 'ᾋ' => 'ᾃ', + 'ᾌ' => 'ᾄ', + 'ᾍ' => 'ᾅ', + 'ᾎ' => 'ᾆ', + 'ᾏ' => 'ᾇ', + 'ᾘ' => 'ᾐ', + 'ᾙ' => 'ᾑ', + 'ᾚ' => 'ᾒ', + 'ᾛ' => 'ᾓ', + 'ᾜ' => 'ᾔ', + 'ᾝ' => 'ᾕ', + 'ᾞ' => 'ᾖ', + 'ᾟ' => 'ᾗ', + 'ᾩ' => 'ᾡ', + 'ᾪ' => 'ᾢ', + 'ᾫ' => 'ᾣ', + 'ᾬ' => 'ᾤ', + 'ᾭ' => 'ᾥ', + 'ᾮ' => 'ᾦ', + 'ᾯ' => 'ᾧ', + 'Ᾰ' => 'ᾰ', + 'Ᾱ' => 'ᾱ', + 'Ὰ' => 'ὰ', + 'ᾼ' => 'ᾳ', + 'Ὲ' => 'ὲ', + 'Ὴ' => 'ὴ', + 'ῌ' => 'ῃ', + 'Ῐ' => 'ῐ', + 'Ῑ' => 'ῑ', + 'Ὶ' => 'ὶ', + 'Ῡ' => 'ῡ', + 'Ὺ' => 'ὺ', + 'Ῥ' => 'ῥ', + 'Ὸ' => 'ὸ', + 'Ὼ' => 'ὼ', + 'ῼ' => 'ῳ', + 'A' => 'a', + 'B' => 'b', + 'C' => 'c', + 'D' => 'd', + 'E' => 'e', + 'F' => 'f', + 'G' => 'g', + 'H' => 'h', + 'I' => 'i', + 'J' => 'j', + 'K' => 'k', + 'L' => 'l', + 'M' => 'm', + 'N' => 'n', + 'O' => 'o', + 'P' => 'p', + 'Q' => 'q', + 'R' => 'r', + 'S' => 's', + 'T' => 't', + 'U' => 'u', + 'V' => 'v', + 'W' => 'w', + 'X' => 'x', + 'Y' => 'y', + 'Z' => 'z', +]; diff --git a/inc/Utf8/tables/loweraccents.php b/inc/Utf8/tables/loweraccents.php new file mode 100644 index 0000000..74cbff3 --- /dev/null +++ b/inc/Utf8/tables/loweraccents.php @@ -0,0 +1,119 @@ + + * @see \dokuwiki\Utf8\Clean::deaccent() + */ + +return [ + 'á' => 'a', + 'à' => 'a', + 'ă' => 'a', + 'â' => 'a', + 'å' => 'a', + 'ä' => 'ae', + 'ã' => 'a', + 'ą' => 'a', + 'ā' => 'a', + 'æ' => 'ae', + 'ḃ' => 'b', + 'ć' => 'c', + 'ĉ' => 'c', + 'č' => 'c', + 'ċ' => 'c', + 'ç' => 'c', + 'ď' => 'd', + 'ḋ' => 'd', + 'đ' => 'd', + 'ð' => 'dh', + 'é' => 'e', + 'è' => 'e', + 'ĕ' => 'e', + 'ê' => 'e', + 'ě' => 'e', + 'ë' => 'e', + 'ė' => 'e', + 'ę' => 'e', + 'ē' => 'e', + 'ḟ' => 'f', + 'ƒ' => 'f', + 'ğ' => 'g', + 'ĝ' => 'g', + 'ġ' => 'g', + 'ģ' => 'g', + 'ĥ' => 'h', + 'ħ' => 'h', + 'í' => 'i', + 'ì' => 'i', + 'î' => 'i', + 'ï' => 'i', + 'ĩ' => 'i', + 'į' => 'i', + 'ī' => 'i', + 'ı' => 'i', + 'ĵ' => 'j', + 'ķ' => 'k', + 'ĺ' => 'l', + 'ľ' => 'l', + 'ļ' => 'l', + 'ł' => 'l', + 'ṁ' => 'm', + 'ń' => 'n', + 'ň' => 'n', + 'ñ' => 'n', + 'ņ' => 'n', + 'ó' => 'o', + 'ò' => 'o', + 'ô' => 'o', + 'ö' => 'oe', + 'ő' => 'o', + 'õ' => 'o', + 'ø' => 'o', + 'ō' => 'o', + 'ơ' => 'o', + 'ṗ' => 'p', + 'ŕ' => 'r', + 'ř' => 'r', + 'ŗ' => 'r', + 'ś' => 's', + 'ŝ' => 's', + 'š' => 's', + 'ṡ' => 's', + 'ş' => 's', + 'ș' => 's', + 'ß' => 'ss', + 'ť' => 't', + 'ṫ' => 't', + 'ţ' => 't', + 'ț' => 't', + 'ŧ' => 't', + 'ú' => 'u', + 'ù' => 'u', + 'ŭ' => 'u', + 'û' => 'u', + 'ů' => 'u', + 'ü' => 'ue', + 'ű' => 'u', + 'ũ' => 'u', + 'ų' => 'u', + 'ū' => 'u', + 'ư' => 'u', + 'ẃ' => 'w', + 'ẁ' => 'w', + 'ŵ' => 'w', + 'ẅ' => 'w', + 'ý' => 'y', + 'ỳ' => 'y', + 'ŷ' => 'y', + 'ÿ' => 'y', + 'ź' => 'z', + 'ž' => 'z', + 'ż' => 'z', + 'þ' => 'th', + 'µ' => 'u', +]; diff --git a/inc/Utf8/tables/romanization.php b/inc/Utf8/tables/romanization.php new file mode 100644 index 0000000..e0da453 --- /dev/null +++ b/inc/Utf8/tables/romanization.php @@ -0,0 +1,1479 @@ + + * @author Vitaly Blokhin + * @author Bisqwit + * @author Arthit Suriyawongkul + * @author Denis Scheither + * @author Eivind Morland + * @link http://www.uconv.com/translit.htm + * @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 + */ + +return [ + // 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 + 'っびゃ' => 'bbya', + 'っびぇ' => 'bbye', + 'っびぃ' => 'bbyi', + 'っびょ' => 'bbyo', + 'っびゅ' => 'bbyu', + 'っぴゃ' => 'ppya', + 'っぴぇ' => 'ppye', + 'っぴぃ' => 'ppyi', + 'っぴょ' => 'ppyo', + 'っぴゅ' => 'ppyu', + 'っちゃ' => 'ccha', + 'っちぇ' => 'cche', + 'っちょ' => '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', + 'っしょ' => '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', + 'ちょ' => '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', + 'しょ' => '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', + 'ッショー' => 'sshoo', + 'ッシュー' => 'sshuu', + 'ッチャー' => 'cchaa', + 'ッチェー' => 'cchee', + 'ッチョー' => 'cchoo', + 'ッチュー' => 'cchuu', + 'ッティー' => 'ttii', + 'ッヂィー' => 'ddii', + + // 3 character syllables - doubled vowels + 'ファー' => 'faa', + 'フォー' => 'foo', + 'フャー' => 'fyaa', + 'フェー' => 'fee', + 'フィー' => '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', + 'ショー' => 'shoo', + 'シュー' => 'shuu', + 'ジャー' => 'jaa', + 'ジェー' => 'jee', + 'ジョー' => 'joo', + 'ジュー' => 'juu', + 'スァー' => 'swaa', + 'スェー' => 'swee', + 'スィー' => 'swii', + 'スォー' => 'swoo', + 'スゥー' => 'swuu', + 'デァー' => 'daa', + 'デェー' => 'dee', + 'ディー' => 'dii', + 'デォー' => 'doo', + 'デゥー' => 'duu', + 'チャー' => 'chaa', + 'チェー' => 'chee', + 'チョー' => 'choo', + 'チュー' => 'chuu', + 'ヂャー' => 'dyaa', + 'ヂェー' => 'dyee', + 'ヂョー' => 'dyoo', + 'ヂュー' => 'dyuu', + 'ツャー' => 'tsaa', + 'ツェー' => 'tsee', + 'ツィー' => 'tsii', + 'ツョー' => 'tsoo', + 'トァー' => 'twaa', + 'トェー' => 'twee', + 'トィー' => 'twii', + 'トォー' => 'twoo', + 'トゥー' => 'twuu', + 'ドァー' => 'dwaa', + 'ドェー' => 'dwee', + 'ドィー' => 'dwii', + 'ドォー' => 'dwoo', + 'ドゥー' => 'dwuu', + 'ウァー' => 'whaa', + 'ウォー' => 'whoo', + 'ウゥー' => 'whuu', + 'ヴャー' => 'vyaa', + 'ヴョー' => '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', + 'ッショ' => 'ssho', + 'ッシュ' => 'sshu', + 'ッチャ' => 'ccha', + 'ッチェ' => 'cche', + 'ッチョ' => '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', + 'フォ' => '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', + 'チョ' => 'cho', + 'チュ' => 'chu', + // 'ヂャ'=>'dya', + // 'ヂェ'=>'dye', + // 'ヂィ'=>'dyi', + // 'ヂョ'=>'dyo', + // 'ヂュ'=>'dyu', + 'ツャ' => 'tsa', + 'ツェ' => 'tse', + 'ツィ' => 'tsi', + 'ツョ' => 'tso', + 'トァ' => 'twa', + 'トェ' => 'twe', + 'トィ' => 'twi', + 'トォ' => 'two', + 'トゥ' => 'twu', + 'ドァ' => 'dwa', + 'ドェ' => 'dwe', + 'ドィ' => 'dwi', + 'ドォ' => 'dwo', + 'ドゥ' => 'dwu', + 'ウァ' => 'wha', + 'ウォ' => 'who', + 'ウゥ' => 'whu', + 'ヴャ' => 'vya', + 'ヴョ' => '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" + 'Α' => 'a', + 'Ά' => 'a', + 'Β' => 'b', + 'Γ' => 'g', + 'Δ' => 'd', + 'Ε' => 'e', + 'Έ' => 'e', + 'Ζ' => 'z', + 'Η' => 'i', + 'Ή' => 'i', + 'Θ' => 'th', + 'Ι' => 'i', + 'Ί' => 'i', + 'Ϊ' => 'i', + 'ΐ' => 'i', + 'Κ' => 'k', + 'Λ' => 'l', + 'Μ' => 'm', + 'Ν' => 'n', + 'Ξ' => 'x', + 'Ο' => 'o', + 'Ό' => 'o', + 'Π' => 'p', + 'Ρ' => 'r', + 'Σ' => 's', + 'Τ' => 't', + 'Υ' => 'y', + 'Ύ' => 'y', + 'Ϋ' => 'y', + 'ΰ' => 'y', + 'Φ' => 'f', + 'Χ' => 'ch', + 'Ψ' => 'ps', + 'Ω' => 'o', + 'Ώ' => 'o', + 'α' => 'a', + 'ά' => 'a', + 'β' => 'b', + 'γ' => 'g', + 'δ' => 'd', + 'ε' => 'e', + 'έ' => 'e', + 'ζ' => 'z', + 'η' => 'i', + 'ή' => 'i', + 'θ' => 'th', + 'ι' => 'i', + 'ί' => 'i', + 'ϊ' => 'i', + 'κ' => 'k', + 'λ' => 'l', + 'μ' => 'm', + 'ν' => 'n', + 'ξ' => 'x', + 'ο' => 'o', + 'ό' => 'o', + 'π' => 'p', + 'ρ' => 'r', + 'σ' => 's', + 'ς' => 's', + 'τ' => 't', + 'υ' => 'y', + 'ύ' => 'y', + 'ϋ' => 'y', + 'φ' => 'f', + 'χ' => 'ch', + 'ψ' => 'ps', + 'ω' => 'o', + 'ώ' => 'o', + + // 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', + 'ึ' => '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', +]; diff --git a/inc/Utf8/tables/specials.php b/inc/Utf8/tables/specials.php new file mode 100644 index 0000000..2f9c146 --- /dev/null +++ b/inc/Utf8/tables/specials.php @@ -0,0 +1,617 @@ + + * @see \dokuwiki\Utf8\Clean::stripspecials() + */ + +return [ + 0x1a, //  + 0x1b, //  + 0x1c, //  + 0x1d, //  + 0x1e, //  + 0x1f, //  + 0x20, // + 0x21, // ! + 0x22, // " + 0x23, // # + 0x24, // $ + 0x25, // % + 0x26, // & + 0x27, // ' + 0x28, // ( + 0x29, // ) + 0x2b, // + + 0x2c, // , + 0x2f, // / + 0x3b, // ; + 0x3c, // < + 0x3d, // = + 0x3e, // > + 0x3f, // ? + 0x40, // @ + 0x5b, // [ + 0x5c, // \ + 0x5d, // ] + 0x5e, // ^ + 0x60, // ` + 0x7b, // { + 0x7c, // | + 0x7d, // } + 0x7e, // ~ + 0x7f, //  + 0x80, // € + 0x81, //  + 0x82, // ‚ + 0x83, // ƒ + 0x84, // „ + 0x85, // … + 0x86, // † + 0x87, // ‡ + 0x88, // ˆ + 0x89, // ‰ + 0x8a, // Š + 0x8b, // ‹ + 0x8c, // Œ + 0x8d, //  + 0x8e, // Ž + 0x8f, //  + 0x90, //  + 0x91, // ‘ + 0x92, // ’ + 0x93, // “ + 0x94, // ” + 0x95, // • + 0x96, // – + 0x97, // — + 0x98, // ˜ + 0x99, // ™ + 0x9a, // š + 0x9b, // › + 0x9c, // œ + 0x9d, //  + 0x9e, // ž + 0x9f, // Ÿ + 0xa0, //   + 0xa1, // ¡ + 0xa2, // ¢ + 0xa3, // £ + 0xa4, // ¤ + 0xa5, // ¥ + 0xa6, // ¦ + 0xa7, // § + 0xa8, // ¨ + 0xa9, // © + 0xaa, // ª + 0xab, // « + 0xac, // ¬ + 0xad, // ­ + 0xae, // ® + 0xaf, // ¯ + 0xb0, // ° + 0xb1, // ± + 0xb2, // ² + 0xb3, // ³ + 0xb4, // ´ + 0xb5, // µ + 0xb6, // ¶ + 0xb7, // · + 0xb8, // ¸ + 0xb9, // ¹ + 0xba, // º + 0xbb, // » + 0xbc, // ¼ + 0xbd, // ½ + 0xbe, // ¾ + 0xbf, // ¿ + 0xd7, // × + 0xf7, // ÷ + 0x2c7, // ˇ + 0x2d8, // ˘ + 0x2d9, // ˙ + 0x2da, // ˚ + 0x2db, // ˛ + 0x2dc, // ˜ + 0x2dd, // ˝ + 0x300, // ̀ + 0x301, // ́ + 0x303, // ̃ + 0x309, // ̉ + 0x323, // ̣ + 0x384, // ΄ + 0x385, // ΅ + 0x387, // · + 0x5b0, // ְ + 0x5b1, // ֱ + 0x5b2, // ֲ + 0x5b3, // ֳ + 0x5b4, // ִ + 0x5b5, // ֵ + 0x5b6, // ֶ + 0x5b7, // ַ + 0x5b8, // ָ + 0x5b9, // ֹ + 0x5bb, // ֻ + 0x5bc, // ּ + 0x5bd, // ֽ + 0x5be, // ־ + 0x5bf, // ֿ + 0x5c0, // ׀ + 0x5c1, // ׁ + 0x5c2, // ׂ + 0x5c3, // ׃ + 0x5f3, // ׳ + 0x5f4, // ״ + 0x60c, // ، + 0x61b, // ؛ + 0x61f, // ؟ + 0x640, // ـ + 0x64b, // ً + 0x64c, // ٌ + 0x64d, // ٍ + 0x64e, // َ + 0x64f, // ُ + 0x650, // ِ + 0x651, // ّ + 0x652, // ْ + 0x66a, // ٪ + 0xe3f, // ฿ + 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, // ○ + 0x1d6fc, // 𝛼 + 0x1d6fd, // 𝛽 + 0x1d6fe, // 𝛾 + 0x1d6ff, // 𝛿 + 0x1d700, // 𝜀 + 0x1d701, // 𝜁 + 0x1d702, // 𝜂 + 0x1d703, // 𝜃 + 0x1d704, // 𝜄 + 0x1d705, // 𝜅 + 0x1d706, // 𝜆 + 0x1d707, // 𝜇 + 0x1d708, // 𝜈 + 0x1d709, // 𝜉 + 0x1d70a, // 𝜊 + 0x1d70b, // 𝜋 + 0x1d70c, // 𝜌 + 0x1d70d, // 𝜍 + 0x1d70e, // 𝜎 + 0x1d70f, // 𝜏 + 0x1d710, // 𝜐 + 0x1d711, // 𝜑 + 0x1d712, // 𝜒 + 0x1d713, // 𝜓 + 0x1d714, // 𝜔 + 0x1d715, // 𝜕 + 0x1d716, // 𝜖 + 0x1d717, // 𝜗 + 0x1d718, // 𝜘 + 0x1d719, // 𝜙 + 0x1d71a, // 𝜚 + 0x1d71b, // 𝜛 + 0xc2a0, // 슠 + 0xe28087, // + 0xe280af, // + 0xe281a0, // + 0xefbbbf, // +]; diff --git a/inc/Utf8/tables/upperaccents.php b/inc/Utf8/tables/upperaccents.php new file mode 100644 index 0000000..facda0c --- /dev/null +++ b/inc/Utf8/tables/upperaccents.php @@ -0,0 +1,116 @@ + + * @see \dokuwiki\Utf8\Clean::deaccent() + */ + +return [ + 'Á' => 'A', + 'À' => 'A', + 'Ă' => 'A', + 'Â' => 'A', + 'Å' => 'A', + 'Ä' => 'Ae', + 'Ã' => 'A', + 'Ą' => 'A', + 'Ā' => 'A', + 'Æ' => 'Ae', + 'Ḃ' => 'B', + 'Ć' => 'C', + 'Ĉ' => 'C', + 'Č' => 'C', + 'Ċ' => 'C', + 'Ç' => 'C', + 'Ď' => 'D', + 'Ḋ' => 'D', + 'Đ' => 'D', + 'Ð' => 'Dh', + 'É' => 'E', + 'È' => 'E', + 'Ĕ' => 'E', + 'Ê' => 'E', + 'Ě' => 'E', + 'Ë' => 'E', + 'Ė' => 'E', + 'Ę' => 'E', + 'Ē' => 'E', + 'Ḟ' => 'F', + 'Ƒ' => 'F', + 'Ğ' => 'G', + 'Ĝ' => 'G', + 'Ġ' => 'G', + 'Ģ' => 'G', + 'Ĥ' => 'H', + 'Ħ' => 'H', + 'Í' => 'I', + 'Ì' => 'I', + 'Î' => 'I', + 'Ï' => 'I', + 'Ĩ' => 'I', + 'Į' => 'I', + 'Ī' => 'I', + 'Ĵ' => 'J', + 'Ķ' => 'K', + 'Ĺ' => 'L', + 'Ľ' => 'L', + 'Ļ' => 'L', + 'Ł' => 'L', + 'Ṁ' => 'M', + 'Ń' => 'N', + 'Ň' => 'N', + 'Ñ' => 'N', + 'Ņ' => 'N', + 'Ó' => 'O', + 'Ò' => 'O', + 'Ô' => 'O', + 'Ö' => 'Oe', + 'Ő' => 'O', + 'Õ' => 'O', + 'Ø' => 'O', + 'Ō' => 'O', + 'Ơ' => 'O', + 'Ṗ' => 'P', + 'Ŕ' => 'R', + 'Ř' => 'R', + 'Ŗ' => 'R', + 'Ś' => 'S', + 'Ŝ' => 'S', + 'Š' => 'S', + 'Ṡ' => 'S', + 'Ş' => 'S', + 'Ș' => 'S', + 'Ť' => 'T', + 'Ṫ' => 'T', + 'Ţ' => 'T', + 'Ț' => 'T', + 'Ŧ' => 'T', + 'Ú' => 'U', + 'Ù' => 'U', + 'Ŭ' => 'U', + 'Û' => 'U', + 'Ů' => 'U', + 'Ü' => 'Ue', + 'Ű' => 'U', + 'Ũ' => 'U', + 'Ų' => 'U', + 'Ū' => 'U', + 'Ư' => 'U', + 'Ẃ' => 'W', + 'Ẁ' => 'W', + 'Ŵ' => 'W', + 'Ẅ' => 'W', + 'Ý' => 'Y', + 'Ỳ' => 'Y', + 'Ŷ' => 'Y', + 'Ÿ' => 'Y', + 'Ź' => 'Z', + 'Ž' => 'Z', + 'Ż' => 'Z', + 'Þ' => 'Th', +]; diff --git a/inc/actions.php b/inc/actions.php new file mode 100644 index 0000000..03a874f --- /dev/null +++ b/inc/actions.php @@ -0,0 +1,72 @@ + + */ + +use dokuwiki\ActionRouter; +use dokuwiki\Extension\Event; + +/** + * All action processing starts here + */ +function act_dispatch() +{ + // always initialize on first dispatch (test request may dispatch mutliple times on one request) + $router = ActionRouter::getInstance(true); + + $headers = ['Content-Type: text/html; charset=utf-8']; + Event::createAndTrigger('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 + * + * @param array|string $act + * @return string + */ +function act_clean($act) +{ + // check if the action was given as array key + if (is_array($act)) { + [$act] = array_keys($act); + } + + // no action given + if ($act === null) return 'show'; + + //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/inc/auth.php b/inc/auth.php new file mode 100644 index 0000000..eb02249 --- /dev/null +++ b/inc/auth.php @@ -0,0 +1,1401 @@ + + */ + +use dokuwiki\ErrorHandler; +use dokuwiki\JWT; +use dokuwiki\Utf8\PhpString; +use dokuwiki\Extension\AuthPlugin; +use dokuwiki\Extension\Event; +use dokuwiki\Extension\PluginController; +use dokuwiki\PassHash; +use dokuwiki\Subscriptions\RegistrationSubscriptionSender; +use phpseclib3\Crypt\AES; +use phpseclib3\Crypt\Common\SymmetricKey; +use phpseclib3\Exception\BadDecryptionException; + +/** + * 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 AuthPlugin $auth */ + global $auth; + /* @var Input $INPUT */ + global $INPUT; + global $AUTH_ACL; + global $lang; + /* @var PluginController $plugin_controller */ + global $plugin_controller; + $AUTH_ACL = []; + + 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 (!$auth instanceof AuthPlugin) { + msg($lang['authtempfail'], -1); + return false; + } + + if ($auth->success == false) { + // degrade to unauthenticated user + $auth = null; + 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); + + // Populate Basic Auth user/password from Authorization header + // Note: with FastCGI, data is in REDIRECT_HTTP_AUTHORIZATION instead of HTTP_AUTHORIZATION + $header = $INPUT->server->str('HTTP_AUTHORIZATION') ?: $INPUT->server->str('REDIRECT_HTTP_AUTHORIZATION'); + if (preg_match('~^Basic ([a-z\d/+]*={0,2})$~i', $header, $matches)) { + $userpass = explode(':', base64_decode($matches[1])); + [$_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']] = $userpass; + } + + // if no credentials were given try to use HTTP auth (for SSO) + if (!$INPUT->str('u') && empty($_COOKIE[DOKU_COOKIE]) && !empty($INPUT->server->str('PHP_AUTH_USER'))) { + $INPUT->set('u', $INPUT->server->str('PHP_AUTH_USER')); + $INPUT->set('p', $INPUT->server->str('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 (!auth_tokenlogin()) { + $ok = null; + + if ($auth instanceof AuthPlugin && $auth->canDo('external')) { + $ok = $auth->trustExternal($INPUT->str('u'), $INPUT->str('p'), $INPUT->bool('r')); + } + + if ($ok === null) { + // external trust mechanism not in place, or returns no result, + // then attempt auth_login + $evdata = [ + 'user' => $INPUT->str('u'), + 'password' => $INPUT->str('p'), + 'sticky' => $INPUT->bool('r'), + 'silent' => $INPUT->bool('http_credentials') + ]; + Event::createAndTrigger('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 + * + * @return array + */ +function auth_loadACL() +{ + global $config_cascade; + global $USERINFO; + /* @var Input $INPUT */ + global $INPUT; + + if (!is_readable($config_cascade['acl']['default'])) return []; + + $acl = file($config_cascade['acl']['default']); + + $out = []; + foreach ($acl as $line) { + $line = trim($line); + if (empty($line) || ($line[0] == '#')) continue; // skip blank lines & comments + [$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) + if (isset($USERINFO['grps'])) { + 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; +} + +/** + * Try a token login + * + * @return bool true if token login succeeded + */ +function auth_tokenlogin() +{ + global $USERINFO; + global $INPUT; + /** @var DokuWiki_Auth_Plugin $auth */ + global $auth; + if (!$auth) return false; + + // see if header has token + $header = ''; + if (function_exists('getallheaders')) { + // Authorization headers are not in $_SERVER for mod_php + $headers = array_change_key_case(getallheaders()); + if (isset($headers['authorization'])) $header = $headers['authorization']; + } else { + $header = $INPUT->server->str('HTTP_AUTHORIZATION'); + } + if (!$header) return false; + [$type, $token] = sexplode(' ', $header, 2); + if ($type !== 'Bearer') return false; + + // check token + try { + $authtoken = JWT::validate($token); + } catch (Exception $e) { + msg(hsc($e->getMessage()), -1); + return false; + } + + // fetch user info from backend + $user = $authtoken->getUser(); + $USERINFO = $auth->getUserData($user); + if (!$USERINFO) return false; + + // the code is correct, set up user + $INPUT->server->set('REMOTE_USER', $user); + $_SESSION[DOKU_COOKIE]['auth']['user'] = $user; + $_SESSION[DOKU_COOKIE]['auth']['pass'] = 'nope'; + $_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO; + + return true; +} + +/** + * Event hook callback for AUTH_LOGIN_CHECK + * + * @param array $evdata + * @return bool + * @throws Exception + */ +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. + * + * @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 + * @throws Exception + * + * @author Andreas Gohr + */ +function auth_login($user, $pass, $sticky = false, $silent = false) +{ + global $USERINFO; + global $conf; + global $lang; + /* @var AuthPlugin $auth */ + global $auth; + /* @var Input $INPUT */ + global $INPUT; + + if (!$auth instanceof AuthPlugin) 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 + [$user, $sticky, $pass] = auth_getCookie(); + if ($user && $pass) { + // we got a cookie - see if we can trust it + + // get session info + if (isset($_SESSION[DOKU_COOKIE])) { + $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 + * + * @return string a SHA256 sum of various browser headers + */ +function auth_browseruid() +{ + /* @var Input $INPUT */ + global $INPUT; + + $ip = clientIP(true); + // convert IP string to packed binary representation + $pip = inet_pton($ip); + + $uid = implode("\n", [ + $INPUT->server->str('HTTP_USER_AGENT'), + $INPUT->server->str('HTTP_ACCEPT_LANGUAGE'), + substr($pip, 0, strlen($pip) / 2), // use half of the IP address (works for both IPv4 and IPv6) + ]); + return hash('sha256', $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. + * + * @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 + * @throws Exception + * + * @author Andreas Gohr + */ +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. + * + * @param int $length number of bytes + * @return string cryptographically secure random bytes + * @throws Exception + * + * @author Niklas Keller + */ +function auth_randombytes($length) +{ + return random_bytes($length); +} + +/** + * Cryptographically secure random number generator. + * + * @param int $min + * @param int $max + * @return int + * @throws Exception + * + * @author Niklas Keller + */ +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 + * @throws Exception + */ +function auth_encrypt($data, $secret) +{ + $iv = auth_randombytes(16); + $cipher = new AES('cbc'); + $cipher->setPassword($secret, 'pbkdf2', 'sha1', 'phpseclib'); + $cipher->setIV($iv); + + /* + 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|null The decrypted data + */ +function auth_decrypt($ciphertext, $secret) +{ + $iv = substr($ciphertext, 0, 16); + $cipher = new AES('cbc'); + $cipher->setPassword($secret, 'pbkdf2', 'sha1', 'phpseclib'); + $cipher->setIV($iv); + + try { + return $cipher->decrypt(substr($ciphertext, 16)); + } catch (BadDecryptionException $e) { + ErrorHandler::logException($e); + return null; + } +} + +/** + * Log out the current user + * + * This clears all authentication data and thus log the user + * off. It also clears session data. + * + * @author Andreas Gohr + * + * @param bool $keepbc - when true, the breadcrumb data is not cleared + */ +function auth_logoff($keepbc = false) +{ + global $conf; + global $USERINFO; + /* @var AuthPlugin $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, '', [ + 'expires' => time() - 600000, + 'path' => $cookieDir, + 'secure' => ($conf['securecookie'] && is_ssl()), + 'httponly' => true, + 'samesite' => $conf['samesitecookie'] ?: null, // null means browser default + ]); + + if ($auth instanceof AuthPlugin) { + $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 + * + * @param string $user Username + * @param array $groups List of groups the user is in + * @param bool $adminonly when true checks if user is admin + * @param bool $recache set to true to refresh the cache + * @return bool + * @see auth_isadmin + * + * @author Andreas Gohr + */ +function auth_ismanager($user = null, $groups = null, $adminonly = false, $recache = false) +{ + global $conf; + global $USERINFO; + /* @var AuthPlugin $auth */ + global $auth; + /* @var Input $INPUT */ + global $INPUT; + + + if (!$auth instanceof AuthPlugin) 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)) { + // checking the logged in user, or another one? + if ($USERINFO && $user === $INPUT->server->str('REMOTE_USER')) { + $groups = (array) $USERINFO['grps']; + } else { + $groups = $auth->getUserData($user); + $groups = $groups ? $groups['grps'] : []; + } + } + + // prefer cached result + static $cache = []; + $cachekey = serialize([$user, $adminonly, $groups]); + if (!isset($cache[$cachekey]) || $recache) { + // check superuser match + $ok = auth_isMember($conf['superuser'], $user, $groups); + + // check managers + if (!$ok && !$adminonly) { + $ok = auth_isMember($conf['manager'], $user, $groups); + } + + $cache[$cachekey] = $ok; + } + + return $cache[$cachekey]; +} + +/** + * Check if a user is admin + * + * Alias to auth_ismanager with adminonly=true + * + * The info is available through $INFO['isadmin'], too + * + * @param string $user Username + * @param array $groups List of groups the user is in + * @param bool $recache set to true to refresh the cache + * @return bool + * @author Andreas Gohr + * @see auth_ismanager() + * + */ +function auth_isadmin($user = null, $groups = null, $recache = false) +{ + return auth_ismanager($user, $groups, true, $recache); +} + +/** + * 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 AuthPlugin $auth */ + global $auth; + if (!$auth instanceof AuthPlugin) return false; + + // clean user and groups + if (!$auth->isCaseSensitive()) { + $user = PhpString::strtolower($user); + $groups = array_map([PhpString::class, 'strtolower'], $groups); + } + $user = $auth->cleanUser($user); + $groups = array_map([$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 = PhpString::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 + * + * @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'), is_array($USERINFO) ? $USERINFO['grps'] : []); +} + +/** + * Returns the maximum rights a user has for the given ID or its namespace + * + * @author Andreas Gohr + * + * @triggers AUTH_ACL_CHECK + * @param string $id page ID (needs to be resolved and cleaned) + * @param string $user Username + * @param array|null $groups Array of groups the user is in + * @return int permission level + */ +function auth_aclcheck($id, $user, $groups) +{ + $data = [ + 'id' => $id ?? '', + 'user' => $user, + 'groups' => $groups + ]; + + return Event::createAndTrigger('AUTH_ACL_CHECK', $data, 'auth_aclcheck_cb'); +} + +/** + * default ACL check method + * + * DO NOT CALL DIRECTLY, use auth_aclcheck() instead + * + * @author Andreas Gohr + * + * @param array $data event data + * @return int permission level + */ +function auth_aclcheck_cb($data) +{ + $id =& $data['id']; + $user =& $data['user']; + $groups =& $data['groups']; + + global $conf; + global $AUTH_ACL; + /* @var AuthPlugin $auth */ + global $auth; + + // if no ACL is used always return upload rights + if (!$conf['useacl']) return AUTH_UPLOAD; + if (!$auth instanceof AuthPlugin) return AUTH_NONE; + if (!is_array($AUTH_ACL)) return AUTH_NONE; + + //make sure groups is an array + if (!is_array($groups)) $groups = []; + + //if user is superuser or in superusergroup return 255 (acl_admin) + if (auth_isadmin($user, $groups)) { + return AUTH_ADMIN; + } + + if (!$auth->isCaseSensitive()) { + $user = PhpString::strtolower($user); + $groups = array_map([PhpString::class, 'strtolower'], $groups); + } + $user = auth_nameencode($auth->cleanUser($user)); + $groups = array_map([$auth, 'cleanGroup'], $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] = PhpString::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] = PhpString::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 + * @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 + * + * @param string $foruser username for which the password is generated + * @return string pronouncable password + * @throws Exception + * + * @link http://www.phpbuilder.com/annotate/message.php3?id=1014451 + * @triggers AUTH_PASSWORD_GENERATE + * + * @author Andreas Gohr + */ +function auth_pwgen($foruser = '') +{ + $data = [ + 'password' => '', + 'foruser' => $foruser + ]; + + $evt = new 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'] .= $s[auth_random(0, strlen($s) - 1)] . auth_random(10, 99); + } + $evt->advise_after(); + + return $data['password']; +} + +/** + * Sends a password to the given user + * + * @author Andreas Gohr + * + * @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 AuthPlugin $auth */ + global $auth; + if (!$auth instanceof AuthPlugin) return false; + + $user = $auth->cleanUser($user); + $userinfo = $auth->getUserData($user, false); + + if (!$userinfo['mail']) return false; + + $text = rawLocale('password'); + $trep = [ + 'FULLNAME' => $userinfo['name'], + 'LOGIN' => $user, + 'PASSWORD' => $password + ]; + + $mail = new Mailer(); + $mail->to($mail->getCleanName($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 + * + * @return bool true on success, false on any error + * @throws Exception + * + * @author Andreas Gohr + */ +function register() +{ + global $lang; + global $conf; + /* @var AuthPlugin $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', [$login, $pass, $fullname, $email])) { + msg($lang['regfail'], -1); + return false; + } + + // send notification about the new user + $subscription = new RegistrationSubscriptionSender(); + $subscription->sendRegister($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 + * + * @throws Exception + * + * @author Christopher Smith + */ +function updateprofile() +{ + global $conf; + global $lang; + /* @var AuthPlugin $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 = []; + $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 ($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', [$INPUT->server->str('REMOTE_USER'), &$changes])) { + msg($lang['proffail'], -1); + return false; + } + + if (array_key_exists('pass', $changes) && $changes['pass']) { + // update cookie and session with the changed data + [/* 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 AuthPlugin $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 = []; + $deleted[] = $INPUT->server->str('REMOTE_USER'); + if ($auth->triggerUserMod('delete', [$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 + * + * @return bool true on success, false on any error + * @throws Exception + * + * @author Andreas Gohr + * @author Benoit Chesneau + * @author Chris Smith + */ +function act_resendpwd() +{ + global $lang; + global $conf; + /* @var AuthPlugin $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, 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', [$user, ['pass' => $pass]])) { + msg($lang['proffail'], -1); + return false; + } + } else { // autogenerate the password and send by mail + $pass = auth_pwgen($user); + if (!$auth->triggerUserMod('modify', [$user, ['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, 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('', ['do' => 'resendpwd', 'pwauth' => $token], true, '&'); + + io_saveFile($tfile, $user); + + $text = rawLocale('pwconfirm'); + $trep = ['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 + * + * @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 + * + * @param string $clear The clear text password + * @param string $crypt The hash to compare with + * @return bool true if both match + * @throws Exception + * + * @author Andreas Gohr + */ +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 AuthPlugin $auth */ + global $auth; + global $USERINFO; + + if (!$auth instanceof AuthPlugin) 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, [ + 'expires' => $time, + 'path' => $cookieDir, + 'secure' => ($conf['securecookie'] && is_ssl()), + 'httponly' => true, + 'samesite' => $conf['samesitecookie'] ?: null, // null means browser default + ]); + + // 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 [null, null, null]; + } + [$user, $sticky, $pass] = sexplode('|', $_COOKIE[DOKU_COOKIE], 3, ''); + $sticky = (bool) $sticky; + $pass = base64_decode($pass); + $user = base64_decode($user); + return [$user, $sticky, $pass]; +} + +//Setup VIM: ex: et ts=2 : diff --git a/inc/cache.php b/inc/cache.php new file mode 100644 index 0000000..2a4bee3 --- /dev/null +++ b/inc/cache.php @@ -0,0 +1,58 @@ + + */ + +use dokuwiki\ChangeLog\MediaChangeLog; +use dokuwiki\ChangeLog\ChangeLog; +use dokuwiki\ChangeLog\RevisionInfo; +use dokuwiki\File\PageFile; + +/** + * parses a changelog line into it's components + * + * @param string $line changelog line + * @return array|bool parsed line or false + * + * @author Ben Coburn + * + * @deprecated 2023-09-25 + */ +function parseChangelogLine($line) +{ + dbg_deprecated('see ' . ChangeLog::class . '::parseLogLine()'); + return ChangeLog::parseLogLine($line); +} + +/** + * Adds an entry to the changelog and saves the metadata for the page + * + * Note: timestamp of the change might not be unique especially after very quick + * repeated edits (e.g. change checkbox via do plugin) + * + * @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 (timestamp) 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 + * @author Esther Brunner + * @author Ben Coburn + * @deprecated 2021-11-28 + */ +function addLogEntry( + $date, + $id, + $type = DOKU_CHANGE_TYPE_EDIT, + $summary = '', + $extra = '', + $flags = null, + $sizechange = null +) { + // no more used in DokuWiki core, but left for third-party plugins + dbg_deprecated('see ' . PageFile::class . '::saveWikiText()'); + + /** @var Input $INPUT */ + global $INPUT; + + // check for special flags as keys + if (!is_array($flags)) $flags = []; + $flagExternalEdit = isset($flags['ExternalEdit']); + + $id = cleanid($id); + + if (!$date) $date = time(); //use current time if none supplied + $remote = ($flagExternalEdit) ? '127.0.0.1' : clientIP(true); + $user = ($flagExternalEdit) ? '' : $INPUT->server->str('REMOTE_USER'); + $sizechange = ($sizechange === null) ? '' : (int)$sizechange; + + // update changelog file and get the added entry that is also to be stored in metadata + $pageFile = new PageFile($id); + $logEntry = $pageFile->changelog->addLogEntry([ + 'date' => $date, + 'ip' => $remote, + 'type' => $type, + 'id' => $id, + 'user' => $user, + 'sum' => $summary, + 'extra' => $extra, + 'sizechange' => $sizechange, + ]); + + // update metadata + $pageFile->updateMetadata($logEntry); +} + +/** + * Adds an entry to the media changelog + * + * @author Michael Hamann + * @author Andreas Gohr + * @author Esther Brunner + * @author Ben Coburn + * + * @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 (timestamp) 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 +) { + /** @var Input $INPUT */ + global $INPUT; + + // check for special flags as keys + if (!is_array($flags)) $flags = []; + $flagExternalEdit = isset($flags['ExternalEdit']); + + $id = cleanid($id); + + if (!$date) $date = time(); //use current time if none supplied + $remote = ($flagExternalEdit) ? '127.0.0.1' : clientIP(true); + $user = ($flagExternalEdit) ? '' : $INPUT->server->str('REMOTE_USER'); + $sizechange = ($sizechange === null) ? '' : (int)$sizechange; + + // update changelog file and get the added entry + (new MediaChangeLog($id, 1024))->addLogEntry([ + 'date' => $date, + 'ip' => $remote, + 'type' => $type, + 'id' => $id, + 'user' => $user, + 'sum' => $summary, + 'extra' => $extra, + 'sizechange' => $sizechange, + ]); +} + +/** + * 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_ONLY_CREATION - only include new created pages and media + * 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 + * @author Kate Arzamastseva + */ +function getRecents($first, $num, $ns = '', $flags = 0) +{ + global $conf; + $recent = []; + $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']) ?: []; + } + if (!is_array($lines)) { + $lines = []; + } + $lines_position = count($lines) - 1; + $media_lines_position = 0; + $media_lines = []; + + if ($flags & RECENTS_MEDIA_PAGES_MIXED) { + $media_lines = @file($conf['media_changelog']) ?: []; + if (!is_array($media_lines)) { + $media_lines = []; + } + $media_lines_position = count($media_lines) - 1; + } + + $seen = []; // caches seen lines, _handleRecentLogLine() skips them + + // handle lines + while ($lines_position >= 0 || (($flags & RECENTS_MEDIA_PAGES_MIXED) && $media_lines_position >= 0)) { + if (empty($rec) && $lines_position >= 0) { + $rec = _handleRecentLogLine(@$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 = _handleRecentLogLine( + @$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['mode'] = RevisionInfo::MODE_MEDIA; + $media_rec = false; + } else { + $lines_position--; + $x = $rec; + if ($flags & RECENTS_MEDIA_CHANGES) { + $x['mode'] = RevisionInfo::MODE_MEDIA; + } else { + $x['mode'] = RevisionInfo::MODE_PAGE; + } + $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_ONLY_CREATION - only include new created pages and media + * 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 + * @author Ben Coburn + */ +function getRecentsSince($from, $to = null, $ns = '', $flags = 0) +{ + global $conf; + $recent = []; + + 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 = []; // caches seen lines, _handleRecentLogLine() skips them + + foreach ($lines as $line) { + $rec = _handleRecentLogLine($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 + * Parse a line and checks whether it should be included + * + * don't call directly + * + * @see getRecents() + * @author Andreas Gohr + * @author Ben Coburn + * + * @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 _handleRecentLogLine($line, $ns, $flags, &$seen) +{ + if (empty($line)) return false; //skip empty lines + + // split the line into parts + $recent = ChangeLog::parseLogLine($line); + if ($recent === false) return false; + + // skip seen ones + if (isset($seen[$recent['id']])) return false; + + // skip changes, of only new items are requested + if ($recent['type'] !== DOKU_CHANGE_TYPE_CREATE && ($flags & RECENTS_ONLY_CREATION)) 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 existence + if ($flags & RECENTS_SKIP_DELETED) { + $fn = (($flags & RECENTS_MEDIA_CHANGES) ? mediaFN($recent['id']) : wikiFN($recent['id'])); + if (!file_exists($fn)) return false; + } + + return $recent; +} diff --git a/inc/common.php b/inc/common.php new file mode 100644 index 0000000..167cadd --- /dev/null +++ b/inc/common.php @@ -0,0 +1,2038 @@ + + */ + +use dokuwiki\PassHash; +use dokuwiki\Draft; +use dokuwiki\Utf8\Clean; +use dokuwiki\Utf8\PhpString; +use dokuwiki\Utf8\Conversion; +use dokuwiki\Cache\CacheRenderer; +use dokuwiki\ChangeLog\PageChangeLog; +use dokuwiki\File\PageFile; +use dokuwiki\Subscriptions\PageSubscriptionSender; +use dokuwiki\Subscriptions\SubscriberManager; +use dokuwiki\Extension\AuthPlugin; +use dokuwiki\Extension\Event; + +/** + * Wrapper around htmlspecialchars() + * + * @author Andreas Gohr + * @see htmlspecialchars() + * + * @param string $string the string being converted + * @return string converted string + */ +function hsc($string) +{ + return htmlspecialchars($string, ENT_QUOTES | ENT_SUBSTITUTE | ENT_HTML401, 'UTF-8'); +} + +/** + * A safer explode for fixed length lists + * + * This works just like explode(), but will always return the wanted number of elements. + * If the $input string does not contain enough elements, the missing elements will be + * filled up with the $default value. If the input string contains more elements, the last + * one will NOT be split up and will still contain $separator + * + * @param string $separator The boundary string + * @param string $string The input string + * @param int $limit The number of expected elements + * @param mixed $default The value to use when filling up missing elements + * @see explode + * @return array + */ +function sexplode($separator, $string, $limit, $default = null) +{ + return array_pad(explode($separator, $string, $limit), $limit, $default); +} + +/** + * 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 $in === []; + if ($in === "\0") return true; + if ($trim && trim($in) === '') return true; + if (strlen($in) > 0) return false; + return empty($in); +} + +/** + * strips control characters (<32) from the given string + * + * @author Andreas Gohr + * + * @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 + * @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 + * + * @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 = '
    ' . "\n"; + if ($print) echo $ret; + return $ret; +} + +/** + * Determine basic information for a request of $id + * + * @author Andreas Gohr + * @author Chris Smith + * + * @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 = []; + $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 (empty($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. + * + * @return array with info about current document + * @throws Exception + * + * @author Andreas Gohr + */ +function pageinfo() +{ + global $ID; + global $REV; + global $RANGE; + global $lang; + + $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; + + $subManager = new SubscriberManager(); + $info['subscribed'] = $subManager->userSubscription(); + + $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); + } elseif (!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, ['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, ['last_change' => $revinfo]); + } + + if ($revinfo !== false) { + $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']. + + $info['editor'] = $revinfo['user'] ?: $revinfo['ip']; + } else { + $info['ip'] = null; + $info['user'] = null; + $info['sum'] = null; + $info['editor'] = null; + } + + // draft + $draft = new Draft($ID, $info['client']); + if ($draft->isDraftAvailable()) { + $info['draft'] = $draft->getDraftFilename(); + } + + 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'] = isset($INFO) ? (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 = '&') +{ + $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 $skipEmptyStrings skip empty string values? + * @return string + */ +function buildAttributes($params, $skipEmptyStrings = false) +{ + $url = ''; + $white = false; + foreach ($params as $key => $val) { + if ($key[0] == '_') continue; + if ($val === '' && $skipEmptyStrings) continue; + if ($white) $url .= ' '; + + $url .= $key . '="'; + $url .= hsc($val); + $url .= '"'; + $white = true; + } + return $url; +} + +/** + * This builds the breadcrumb trail and returns it as array + * + * @author Andreas Gohr + * + * @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; + global $INFO; + + //first visit? + $crumbs = $_SESSION[DOKU_COOKIE]['bc'] ?? []; + //we only save on show and existing visible readable wiki documents + $file = wikiFN($ID); + if ($ACT != 'show' || $INFO['perm'] < AUTH_READ || 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/dokuwiki/dokuwiki/pull/84 and + * https://github.com/dokuwiki/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 + * + * @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; + + $id = (string) $id; + + if ($conf['useslash'] && $conf['userewrite']) { + $id = strtr($id, ':', '/'); + } elseif ( + str_starts_with(strtoupper(PHP_OS), '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 + * + * @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 = '&') +{ + 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 + * @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 = '&') +{ + 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 = '&', $abs = false) +{ + global $conf; + $isexternalimage = media_isexternal($id); + if (!$isexternalimage) { + $id = cleanID($id); + } + + if (is_array($more)) { + // add token for resized images + $w = $more['w'] ?? null; + $h = $more['h'] ?? null; + if ($w || $h || $isexternalimage) { + $more['tok'] = media_get_token($id, $w, $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 = []; + if (preg_match_all('/\b(w|h)=(\d*)\b/', $more, $matches, PREG_SET_ORDER) || $isexternalimage) { + $resize = ['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'; + } + } elseif ($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; + } elseif ($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 + * + * @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 + * @author Michael Klier + * + * @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 + // phpcs:disable Generic.Files.LineLength.TooLong + $text = preg_replace( + '!(\b)(www\.[\w.:?\-;,]+?\.[\w.:?\-;,]+?[\w/\#~:.?+=&%@\!\-.:?\-;,]+?)([.:?\-;,]*[^\w/\#~:.?+=&%@\!\-.:?\-;,])!i', + '\1http://\2 \2\3', + $text + ); + // phpcs:enable + + $wordblocks = getWordblocks(); + // 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 = []; + // 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('#(' . implode('|', $re) . ')#si', $text, $matches)) { + // prepare event data + $data = []; + $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 = static fn() => true; + return Event::createAndTrigger('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 + * + * @param boolean $single If set only a single IP is returned + * @return string + */ +function clientIP($single = false) +{ + /* @var Input $INPUT */ + global $INPUT, $conf; + + $ip = []; + $ip[] = $INPUT->server->str('REMOTE_ADDR'); + if ($INPUT->server->str('HTTP_X_FORWARDED_FOR')) { + $ip = array_merge($ip, explode(',', str_replace(' ', '', $INPUT->server->str('HTTP_X_FORWARDED_FOR')))); + } + if ($INPUT->server->str('HTTP_X_REAL_IP')) { + $ip = array_merge($ip, explode(',', str_replace(' ', '', $INPUT->server->str('HTTP_X_REAL_IP')))); + } + + // remove any non-IP stuff + $cnt = count($ip); + for ($i = 0; $i < $cnt; $i++) { + if (filter_var($ip[$i], FILTER_VALIDATE_IP) === false) { + unset($ip[$i]); + } + } + $ip = array_values(array_unique($ip)); + if ($ip === [] || !$ip[0]) $ip[0] = '0.0.0.0'; // for some strange reason we don't have a IP + + if (!$single) return implode(',', $ip); + + // skip trusted local addresses + foreach ($ip as $i) { + if (!empty($conf['trustedproxy']) && preg_match('/' . $conf['trustedproxy'] . '/', $i)) { + continue; + } else { + return $i; + } + } + + // still here? just use the last address + // this case all ips in the list are trusted + return $ip[count($ip) - 1]; +} + +/** + * 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 + * + * @deprecated 2018-04-27 you probably want media queries instead anyway + * @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 = implode( + '|', + [ + '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 + * + * @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 = []; + $ips = explode(',', $ips); + + if (is_array($ips)) { + foreach ($ips as $ip) { + $hosts[] = gethostbyaddr(trim($ip)); + } + return implode(',', $hosts); + } else { + return gethostbyaddr(trim($ips)); + } +} + +/** + * Checks if a given page is currently locked. + * + * removes stale lockfiles + * + * @author Andreas Gohr + * + * @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 + [$ip, $session] = sexplode("\n", io_readFile($lock), 2); + if ($ip == $INPUT->server->str('REMOTE_USER') || (session_id() && $session === session_id())) { + return false; + } + + return $ip; +} + +/** + * Lock a page for editing + * + * @author Andreas Gohr + * + * @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 + * + * @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)) { + @[$ip, $session] = explode("\n", io_readFile($lock)); + if ($ip == $INPUT->server->str('REMOTE_USER') || $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 + * + * @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 (!Clean::isUtf8($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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 = [ + '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, + ]; + + $evt = new 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 + * + * @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( + [ + '@ID@', + '@NS@', + '@CURNS@', + '@!CURNS@', + '@!!CURNS@', + '@!CURNS!@', + '@FILE@', + '@!FILE@', + '@!FILE!@', + '@PAGE@', + '@!PAGE@', + '@!!PAGE@', + '@!PAGE!@', + '@USER@', + '@NAME@', + '@MAIL@', + '@DATE@' + ], + [ + $id, + getNS($id), + curNS($id), + PhpString::ucfirst(curNS($id)), + PhpString::ucwords(curNS($id)), + PhpString::strtoupper(curNS($id)), + $file, + PhpString::ucfirst($file), + PhpString::strtoupper($file), + $page, + PhpString::ucfirst($page), + PhpString::ucwords($page), + PhpString::strtoupper($page), + $INPUT->server->str('REMOTE_USER'), + $USERINFO ? $USERINFO['name'] : '', + $USERINFO ? $USERINFO['mail'] : '', + $conf['dformat'] + ], + $tpl + ); + + // we need the callback to work around strftime's char limit + $tpl = preg_replace_callback( + '/%./', + static fn($m) => dformat(null, $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 + * + * @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 + [$from, $to] = sexplode('-', $range, 2); + // Make range zero-based, use defaults if marker is missing + $from = $from ? $from - 1 : (0); + $to = $to ? $to - 1 : (strlen($text)); + + $slices = []; + $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 + * + * @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 !== '' && !str_ends_with($pre, "\n") && + !str_starts_with($text, "\n") + ) { + $pre .= "\n"; + } + if ( + $suf !== '' && !str_ends_with($text, "\n") && + !str_starts_with($suf, "\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 + * @deprecated 2021-11-28 + */ +function detectExternalEdit($id) +{ + dbg_deprecated(PageFile::class . '::detectExternalEdit()'); + (new PageFile($id))->detectExternalEdit(); +} + +/** + * Saves a wikitext by calling io_writeWikiPage. + * Also directs changelog and attic updates. + * + * @author Andreas Gohr + * @author Ben Coburn + * + * @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) +{ + + // get COMMON_WIKIPAGE_SAVE event data + $data = (new PageFile($id))->saveWikiText($text, $summary, $minor); + if (!$data) return; // save was cancelled (for no changes or by a plugin) + + // send notify mails + ['oldRevision' => $rev, 'newRevision' => $new_rev, 'summary' => $summary] = $data; + notify($id, 'admin', $rev, $summary, $minor, $new_rev); + notify($id, 'subscribers', $rev, $summary, $minor, $new_rev); + + // 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 CacheRenderer($page, wikiFN($page), 'xhtml'); + $cache->removeCache(); + } + } +} + +/** + * moves the current version to the attic and returns its revision date + * + * @author Andreas Gohr + * + * @param string $id page id + * @return int|string revision timestamp + * @deprecated 2021-11-28 + */ +function saveOldRevision($id) +{ + dbg_deprecated(PageFile::class . '::saveOldRevision()'); + return (new PageFile($id))->saveOldRevision(); +} + +/** + * 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 + * @param int|string $current_rev New page revision + * @return bool + * + * @author Andreas Gohr + */ +function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = [], $current_rev = false) +{ + 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 = ['id' => $id, 'addresslist' => '', 'self' => false, 'replacements' => $replace]; + Event::createAndTrigger( + 'COMMON_NOTIFY_ADDRESSLIST', + $data, + [new SubscriberManager(), 'notifyAddresses'] + ); + $to = $data['addresslist']; + if (empty($to)) return false; + $tpl = 'subscr_single'; + } else { + return false; //just to be safe + } + + // prepare content + $subscription = new PageSubscriptionSender(); + return $subscription->sendPageDiff($to, $tpl, $id, $rev, $summary, $current_rev); +} + +/** + * extracts the query from a search engine referrer + * + * @author Andreas Gohr + * @author Todd Augsburger + * + * @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 (!array_key_exists('host', $url)) return ''; + if (!preg_match('/(google|bing|yahoo|ask|duckduckgo|babylon|aol|yandex)/', $url['host'])) return ''; + + $query = []; + if (!array_key_exists('query', $url)) return ''; + parse_str($url['query'], $query); + + $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 ''; + // ignore if query includes a full URL + if (strpos($q, '//') !== false) 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 + * @author Aidan Lister + * @version 1.0.0 + */ +function filesize_h($size, $dec = 1) +{ + $sizes = ['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 + * + * @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 + * + * @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 + * @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 + * @author Christopher Smith + * + * @param string $email email address + * @return string + */ +function obfuscate($email) +{ + global $conf; + + switch ($conf['mailguard']) { + case 'visible': + $obfuscate = ['@' => ' [at] ', '.' => ' [dot] ', '-' => ' [dash] ']; + return strtr($email, $obfuscate); + + case 'hex': + return Conversion::toHtml($email, true); + + case 'none': + default: + return $email; + } +} + +/** + * Removes quoting backslashes + * + * @author Andreas Gohr + * + * @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 + * + * On 32 bit systems values >= 2GB will fail! + * + * -1 (infinite size) will be reported as -1 + * + * @link https://www.php.net/manual/en/faq.using.php#faq.using.shorthandbytes + * @param string $value PHP size shorthand + * @return int + */ +function php_to_byte($value) +{ + switch (strtoupper(substr($value, -1))) { + case 'G': + $ret = (int) substr($value, 0, -1) * 1024 * 1024 * 1024; + break; + case 'M': + $ret = (int) substr($value, 0, -1) * 1024 * 1024; + break; + case 'K': + $ret = (int) substr($value, 0, -1) * 1024; + break; + default: + $ret = (int) $value; + 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 -= PhpString::strlen($keep); + if ($max < $min) return $keep; + $len = PhpString::strlen($short); + if ($len <= $max) return $keep . $short; + $half = floor($max / 2); + return $keep . + PhpString::substr($short, 0, $half - 1) . + $char . + PhpString::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 + */ +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 AuthPlugin $auth */ + global $auth; + /** @var Input $INPUT */ + global $INPUT; + + // prepare initial event data + $data = [ + 'username' => $username, // the unique user name + 'name' => '', + 'link' => [ + //setting 'link' to false disables linking + 'target' => '', + 'pre' => '', + 'suf' => '', + 'style' => '', + 'more' => '', + 'url' => '', + 'title' => '', + 'class' => '', + ], + 'userlink' => '', // formatted user name as will be returned + 'textonly' => $textonly, + ]; + if ($username === null) { + $data['username'] = $username = $INPUT->server->str('REMOTE_USER'); + if ($textonly) { + $data['name'] = $INFO['userinfo']['name'] . ' (' . $INPUT->server->str('REMOTE_USER') . ')'; + } else { + $data['name'] = '' . hsc($INFO['userinfo']['name']) . ' ' . + '(' . hsc($INPUT->server->str('REMOTE_USER')) . ')'; + } + } + + $evt = new Event('COMMON_USER_LINK', $data); + if ($evt->advise_before(true)) { + if (empty($data['name'])) { + if ($auth instanceof AuthPlugin) { + $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'], ['email_link', 'username_link'])) { + if (!isset($info) && $auth instanceof AuthPlugin) { + $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 + * + * @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 = []; + $try[] = 'lib/images/license/' . $type . '/' . $conf['license'] . '.png'; + $try[] = 'lib/images/license/' . $type . '/' . $conf['license'] . '.gif'; + if (str_starts_with($conf['license'], '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 + * @author Andreas Gohr + * + * @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 = 1_048_576) +{ + $limit = trim(ini_get('memory_limit')); + if (empty($limit)) return true; // no limit set! + if ($limit == -1) return true; // unlimited + + // 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 + * + * @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 + */ +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); + + // due to #2721 there might be duplicate entries, + // so we read from the end + for ($i = $cnt - 2; $i >= 0; $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 !== false && ($orig !== $val)) { + $parts = explode('#', $_COOKIE['DOKU_PREFS']); + $cnt = count($parts); + // urlencode $pref for the comparison + $enc_pref = rawurlencode($pref); + $seen = false; + for ($i = 0; $i < $cnt; $i += 2) { + if ($parts[$i] === $enc_pref) { + if (!$seen) { + if ($val !== false) { + $parts[$i + 1] = rawurlencode($val ?? ''); + } else { + unset($parts[$i]); + unset($parts[$i + 1]); + } + $seen = true; + } else { + // no break because we want to remove duplicate entries + unset($parts[$i]); + unset($parts[$i + 1]); + } + } + } + $cookieVal = implode('#', $parts); + } elseif ($orig === false && $val !== false) { + $cookieVal = (isset($_COOKIE['DOKU_PREFS']) ? $_COOKIE['DOKU_PREFS'] . '#' : '') . + rawurlencode($pref) . '#' . rawurlencode($val); + } + + $cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir']; + if (defined('DOKU_UNITTEST')) { + $_COOKIE['DOKU_PREFS'] = $cookieVal; + } else { + setcookie('DOKU_PREFS', $cookieVal, [ + 'expires' => time() + 365 * 24 * 3600, + 'path' => $cookieDir, + 'secure' => ($conf['securecookie'] && is_ssl()), + 'samesite' => 'Lax' + ]); + } +} + +/** + * 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('//i', '', $content); // doc type + $content = preg_replace('/>\s+<', $content); // newlines between tags + $content = trim($content); + if (!str_starts_with($content, ' [ + 'default' => [DOKU_CONF . 'dokuwiki.php'], + 'local' => [DOKU_CONF . 'local.php'], + 'protected' => [DOKU_CONF . 'local.protected.php'] + ], + 'acronyms' => [ + 'default' => [DOKU_CONF . 'acronyms.conf'], + 'local' => [DOKU_CONF . 'acronyms.local.conf'] + ], + 'entities' => [ + 'default' => [DOKU_CONF . 'entities.conf'], + 'local' => [DOKU_CONF . 'entities.local.conf'] + ], + 'interwiki' => [ + 'default' => [DOKU_CONF . 'interwiki.conf'], + 'local' => [DOKU_CONF . 'interwiki.local.conf'] + ], + 'license' => [ + 'default' => [DOKU_CONF . 'license.php'], + 'local' => [DOKU_CONF . 'license.local.php'] + ], + 'manifest' => [ + 'default' => [DOKU_CONF . 'manifest.json'], + 'local' => [DOKU_CONF . 'manifest.local.json'] + ], + 'mediameta' => [ + 'default' => [DOKU_CONF . 'mediameta.php'], + 'local' => [DOKU_CONF . 'mediameta.local.php'] + ], + 'mime' => [ + 'default' => [DOKU_CONF . 'mime.conf'], + 'local' => [DOKU_CONF . 'mime.local.conf'] + ], + 'scheme' => [ + 'default' => [DOKU_CONF . 'scheme.conf'], + 'local' => [DOKU_CONF . 'scheme.local.conf'] + ], + 'smileys' => [ + 'default' => [DOKU_CONF . 'smileys.conf'], + 'local' => [DOKU_CONF . 'smileys.local.conf'] + ], + 'wordblock' => [ + 'default' => [DOKU_CONF . 'wordblock.conf'], + 'local' => [DOKU_CONF . 'wordblock.local.conf'] + ], + 'userstyle' => [ + 'screen' => [DOKU_CONF . 'userstyle.css', DOKU_CONF . 'userstyle.less'], + 'print' => [DOKU_CONF . 'userprint.css', DOKU_CONF . 'userprint.less'], + 'feed' => [DOKU_CONF . 'userfeed.css', DOKU_CONF . 'userfeed.less'], + 'all' => [DOKU_CONF . 'userall.css', DOKU_CONF . 'userall.less'] + ], + 'userscript' => [ + 'default' => [DOKU_CONF . 'userscript.js'] + ], + 'styleini' => [ + 'default' => [DOKU_INC . 'lib/tpl/%TEMPLATE%/' . 'style.ini'], + 'local' => [DOKU_CONF . 'tpl/%TEMPLATE%/' . 'style.ini'] + ], + 'acl' => [ + 'default' => DOKU_CONF . 'acl.auth.php' + ], + 'plainauth.users' => [ + 'default' => DOKU_CONF . 'users.auth.php', + 'protected' => '' + ], + 'plugins' => [ + 'default' => [DOKU_CONF . 'plugins.php'], + 'local' => [DOKU_CONF . 'plugins.local.php'], + 'protected' => [DOKU_CONF . 'plugins.required.php', DOKU_CONF . 'plugins.protected.php'] + ], + 'lang' => [ + 'core' => [DOKU_CONF . 'lang/'], + 'plugin' => [DOKU_CONF . 'plugin_lang/'], + 'template' => [DOKU_CONF . 'template_lang/'] + ] + ], + $config_cascade +); diff --git a/inc/confutils.php b/inc/confutils.php new file mode 100644 index 0000000..6be7a1a --- /dev/null +++ b/inc/confutils.php @@ -0,0 +1,502 @@ + + */ + +/* + * line prefix used to negate single value config items + * (scheme.conf & stopwords.conf), e.g. + * !gopher + */ + +use dokuwiki\Extension\AuthPlugin; +use dokuwiki\Extension\Event; + +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 + * + * @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 [false, false, false]; + } + $ext = strtolower(substr($file, $ext + 1)); + if (!isset($mtypes[$ext])) { + if ($knownonly) { + return [false, false, false]; + } else { + return [$ext, 'application/octet-stream', true]; + } + } + if ($mtypes[$ext][0] == '!') { + return [$ext, substr($mtypes[$ext], 1), true]; + } else { + return [$ext, $mtypes[$ext], false]; + } +} + +/** + * returns a hash of mimetypes + * + * @author Andreas Gohr + */ +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 + */ +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 + */ +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 + */ +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 + */ +function getInterwiki() +{ + static $wikis = null; + if (!$wikis) { + $wikis = retrieveConfig('interwiki', 'confToHash', [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 = []; + $lines = file(DOKU_INC . 'lib/scripts/jquery/versions'); + foreach ($lines as $line) { + $line = trim(preg_replace('/#.*$/', '', $line)); + if ($line === '') continue; + [$key, $val] = sexplode('=', $line, 2, ''); + $key = trim($key); + $val = trim($val); + $versions[$key] = $val; + } + + $src = []; + $data = ['versions' => $versions, 'src' => &$src]; + $event = new Event('CONFUTIL_CDN_SELECT', $data); + if ($event->advise_before()) { + if (!$conf['jquerycdn']) { + $jqmod = md5(implode('-', $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/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/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 + * @author Andreas Gohr + * @author Gina Haeussge + * + * @param array $lines + * @param bool $lower + * + * @return array + */ +function linesToHash($lines, $lower = false) +{ + $conf = []; + // remove BOM + if (isset($lines[0]) && str_starts_with($lines[0], pack('CCC', 0xef, 0xbb, 0xbf))) + $lines[0] = substr($lines[0], 3); + foreach ($lines as $line) { + //ignore comments (except escaped ones) + $line = preg_replace('/(? + * @author Andreas Gohr + * @author Gina Haeussge + * + * @param string $file + * @param bool $lower + * + * @return array + */ +function confToHash($file, $lower = false) +{ + $conf = []; + $lines = @file($file); + if (!$lines) return $conf; + + return linesToHash($lines, $lower); +} + +/** + * Read a json config file into an array + * + * @param string $file + * @return array + * @throws JsonException + */ +function jsonToArray($file) +{ + $json = file_get_contents($file); + + $conf = json_decode($json, true, 512, JSON_THROW_ON_ERROR); + + if ($conf === null) { + return []; + } + + return $conf; +} + +/** + * Retrieve the requested configuration information + * + * @author Chris Smith + * + * @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 = []; + + $combined = []; + if (!is_array($config_cascade[$type])) trigger_error('Missing config cascade for "' . $type . '"', E_USER_WARNING); + foreach (['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([$file], $params)); + $combined = $combine($combined, $config); + } + } + } + + return $combined; +} + +/** + * Include the requested configuration information + * + * @author Chris Smith + * + * @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 = []; + + if (!is_array($config_cascade[$type])) trigger_error('Missing config cascade for "' . $type . '"', E_USER_WARNING); + foreach (['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 + * @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 AuthPlugin $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']) || !$auth instanceof AuthPlugin + || !$auth->canDo('addUser') + ) { + $disabled[] = 'register'; + } + if ( + (isset($conf['resendpasswd']) && !$conf['resendpasswd']) || !$auth instanceof AuthPlugin + || !$auth->canDo('modPass') + ) { + $disabled[] = 'resendpwd'; + } + if ((isset($conf['subscribers']) && !$conf['subscribers']) || !$auth instanceof AuthPlugin) { + $disabled[] = 'subscribe'; + } + if (!$auth instanceof AuthPlugin || !$auth->canDo('Profile')) { + $disabled[] = 'profile'; + } + if (!$auth instanceof AuthPlugin || !$auth->canDo('delUser')) { + $disabled[] = 'profile_delete'; + } + if (!$auth instanceof AuthPlugin) { + $disabled[] = 'login'; + } + if (!$auth instanceof AuthPlugin || !$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 + * + * @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 = []; + } + } + + 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 '' . base64_encode($str); + case 'uuencode': + return '' . 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 '': + return base64_decode(substr($str, 3)); + case '': + 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 (str_starts_with($val, 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/inc/defines.php b/inc/defines.php new file mode 100644 index 0000000..a084891 --- /dev/null +++ b/inc/defines.php @@ -0,0 +1,80 @@ +use = $use; + } + + /** + * Encode given structure to JSON + * + * @param mixed $var + * @return string + * @deprecated 2018-07-27 + */ + public function encode($var) + { + dbg_deprecated('json_encode'); + return json_encode($var); + } + + /** + * Alias for encode() + * @param $var + * @return string + * @deprecated 2018-07-27 + */ + public function enc($var) { + return $this->encode($var); + } + + /** + * Decode given string from JSON + * + * @param string $str + * @return mixed + * @deprecated 2018-07-27 + */ + public function decode($str) + { + dbg_deprecated('json_encode'); + return json_decode($str, ($this->use == JSON_LOOSE_TYPE)); + } + + /** + * Alias for decode + * + * @param $str + * @return mixed + * @deprecated 2018-07-27 + */ + public function dec($str) { + return $this->decode($str); + } +} + +/** + * @inheritdoc + * @deprecated 2019-02-19 + */ +class Input extends \dokuwiki\Input\Input { + /** + * @inheritdoc + * @deprecated 2019-02-19 + */ + public function __construct() + { + dbg_deprecated(\dokuwiki\Input\Input::class); + parent::__construct(); + } +} + +/** + * @inheritdoc + * @deprecated 2019-02-19 + */ +class PostInput extends \dokuwiki\Input\Post { + /** + * @inheritdoc + * @deprecated 2019-02-19 + */ + public function __construct() + { + dbg_deprecated(\dokuwiki\Input\Post::class); + parent::__construct(); + } +} + +/** + * @inheritdoc + * @deprecated 2019-02-19 + */ +class GetInput extends \dokuwiki\Input\Get { + /** + * @inheritdoc + * @deprecated 2019-02-19 + */ + public function __construct() + { + dbg_deprecated(\dokuwiki\Input\Get::class); + parent::__construct(); + } +} + +/** + * @inheritdoc + * @deprecated 2019-02-19 + */ +class ServerInput extends \dokuwiki\Input\Server { + /** + * @inheritdoc + * @deprecated 2019-02-19 + */ + public function __construct() + { + dbg_deprecated(\dokuwiki\Input\Server::class); + parent::__construct(); + } +} + +/** + * @inheritdoc + * @deprecated 2019-03-06 + */ +class PassHash extends \dokuwiki\PassHash { + /** + * @inheritdoc + * @deprecated 2019-03-06 + */ + public function __construct() + { + dbg_deprecated(\dokuwiki\PassHash::class); + } +} + +/** + * @deprecated since 2019-03-17 use \dokuwiki\HTTP\HTTPClientException instead! + */ +class HTTPClientException extends \dokuwiki\HTTP\HTTPClientException { + + /** + * @inheritdoc + * @deprecated 2019-03-17 + */ + public function __construct($message = '', $code = 0, $previous = null) + { + DebugHelper::dbgDeprecatedFunction(dokuwiki\HTTP\HTTPClientException::class); + parent::__construct($message, $code, $previous); + } +} + +/** + * @deprecated since 2019-03-17 use \dokuwiki\HTTP\HTTPClient instead! + */ +class HTTPClient extends \dokuwiki\HTTP\HTTPClient { + + /** + * @inheritdoc + * @deprecated 2019-03-17 + */ + public function __construct() + { + DebugHelper::dbgDeprecatedFunction(dokuwiki\HTTP\HTTPClient::class); + parent::__construct(); + } +} + +/** + * @deprecated since 2019-03-17 use \dokuwiki\HTTP\DokuHTTPClient instead! + */ +class DokuHTTPClient extends \dokuwiki\HTTP\DokuHTTPClient +{ + + /** + * @inheritdoc + * @deprecated 2019-03-17 + */ + public function __construct() + { + DebugHelper::dbgDeprecatedFunction(dokuwiki\HTTP\DokuHTTPClient::class); + parent::__construct(); + } +} + +/** + * 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 + * @deprecated 2018-06-15 + */ +function trigger_event($name, &$data, $action=null, $canPreventDefault=true) { + dbg_deprecated('\dokuwiki\Extension\Event::createAndTrigger'); + return \dokuwiki\Extension\Event::createAndTrigger($name, $data, $action, $canPreventDefault); +} + +/** + * @inheritdoc + * @deprecated 2018-06-15 + */ +class Doku_Plugin_Controller extends \dokuwiki\Extension\PluginController { + /** @inheritdoc */ + public function __construct() + { + dbg_deprecated(\dokuwiki\Extension\PluginController::class); + parent::__construct(); + } +} + + +/** + * Class for handling (email) subscriptions + * + * @author Adrian Lang + * @author Andreas Gohr + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * + * @deprecated 2019-04-22 Use the classes in the \dokuwiki\Subscriptions namespace instead! + */ +class Subscription { + + /** + * Check if subscription system is enabled + * + * @return bool + * + * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::isenabled + */ + public function isenabled() { + DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::isenabled'); + $subscriberManager = new SubscriberManager(); + return $subscriberManager->isenabled(); + } + + /** + * Recursively search for matching subscriptions + * + * This function searches all relevant subscription files for a page or + * namespace. + * + * @author Adrian Lang + * + * @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 + * + * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::subscribers + */ + public function subscribers($page, $user = null, $style = null, $data = null) { + DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::subscribers'); + $manager = new SubscriberManager(); + return $manager->subscribers($page, $user, $style, $data); + } + + /** + * 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 + * + * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::add + */ + public function add($id, $user, $style, $data = '') { + DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::add'); + $manager = new SubscriberManager(); + return $manager->add($id, $user, $style, $data); + } + + /** + * 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 + * + * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::remove + */ + public function remove($id, $user = null, $style = null, $data = null) { + DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::remove'); + $manager = new SubscriberManager(); + return $manager->remove($id, $user, $style, $data); + } + + /** + * 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|false + * @author Adrian Lang + * + * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::userSubscription + */ + public function user_subscription($id = '', $user = '') { + DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::userSubscription'); + $manager = new SubscriberManager(); + return $manager->userSubscription($id, $user); + } + + /** + * 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 + * + * @deprecated 2019-04-20 \dokuwiki\Subscriptions\BulkSubscriptionSender::sendBulk + */ + public function send_bulk($page) { + DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\BulkSubscriptionSender::sendBulk'); + $subscriptionSender = new BulkSubscriptionSender(); + return $subscriptionSender->sendBulk($page); + } + + /** + * 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 + * + * @deprecated 2019-04-20 \dokuwiki\Subscriptions\PageSubscriptionSender::sendPageDiff + */ + public function send_diff($subscriber_mail, $template, $id, $rev = null, $summary = '') { + DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\PageSubscriptionSender::sendPageDiff'); + $subscriptionSender = new PageSubscriptionSender(); + return $subscriptionSender->sendPageDiff($subscriber_mail, $template, $id, $rev, $summary); + } + + /** + * 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 + * + * @deprecated 2019-04-20 \dokuwiki\Subscriptions\MediaSubscriptionSender::sendMediaDiff + */ + public function send_media_diff($subscriber_mail, $template, $id, $rev = false) { + DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\MediaSubscriptionSender::sendMediaDiff'); + $subscriptionSender = new MediaSubscriptionSender(); + return $subscriptionSender->sendMediaDiff($subscriber_mail, $template, $id, $rev); + } + + /** + * Send a notify mail on new registration + * + * @author Andreas Gohr + * + * @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 + * + * @deprecated 2019-04-20 \dokuwiki\Subscriptions\RegistrationSubscriptionSender::sendRegister + */ + public function send_register($login, $fullname, $email) { + DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\RegistrationSubscriptionSender::sendRegister'); + $subscriptionSender = new RegistrationSubscriptionSender(); + return $subscriptionSender->sendRegister($login, $fullname, $email); + } + + + /** + * Default callback for COMMON_NOTIFY_ADDRESSLIST + * + * Aggregates all email addresses of user who have subscribed the given page with 'every' style + * + * @author Steven Danz + * @author Adrian Lang + * + * @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) + * + * @deprecated 2019-04-20 \dokuwiki\Subscriptions\SubscriberManager::notifyAddresses + */ + public function notifyaddresses(&$data) { + DebugHelper::dbgDeprecatedFunction('\dokuwiki\Subscriptions\SubscriberManager::notifyAddresses'); + $manager = new SubscriberManager(); + $manager->notifyAddresses($data); + } +} + +/** + * @deprecated 2019-12-29 use \dokuwiki\Search\Indexer + */ +class Doku_Indexer extends \dokuwiki\Search\Indexer {}; + +/** + * @deprecated since 2021-11-11 use \dokuwiki\Remote\IXR\Client instead! + */ +class IXR_Client extends \dokuwiki\Remote\IXR\Client +{ + /** + * @inheritdoc + * @deprecated 2021-11-11 + */ + public function __construct($server, $path = false, $port = 80, $timeout = 15, $timeout_io = null) + { + DebugHelper::dbgDeprecatedFunction(dokuwiki\Remote\IXR\Client::class); + parent::__construct($server, $path, $port, $timeout, $timeout_io); + } +} +/** + * @deprecated since 2021-11-11 use \IXR\Client\ClientMulticall instead! + */ +class IXR_ClientMulticall extends \IXR\Client\ClientMulticall +{ + /** + * @inheritdoc + * @deprecated 2021-11-11 + */ + public function __construct($server, $path = false, $port = 80) + { + DebugHelper::dbgDeprecatedFunction(IXR\Client\ClientMulticall::class); + parent::__construct($server, $path, $port); + } +} +/** + * @deprecated since 2021-11-11 use \IXR\Server\Server instead! + */ +class IXR_Server extends \IXR\Server\Server +{ + /** + * @inheritdoc + * @deprecated 2021-11-11 + */ + public function __construct($callbacks = false, $data = false, $wait = false) + { + DebugHelper::dbgDeprecatedFunction(IXR\Server\Server::class); + parent::__construct($callbacks, $data, $wait); + } +} +/** + * @deprecated since 2021-11-11 use \IXR\Server\IntrospectionServer instead! + */ +class IXR_IntrospectionServer extends \IXR\Server\IntrospectionServer +{ + /** + * @inheritdoc + * @deprecated 2021-11-11 + */ + public function __construct() + { + DebugHelper::dbgDeprecatedFunction(IXR\Server\IntrospectionServer::class); + parent::__construct(); + } +} +/** + * @deprecated since 2021-11-11 use \IXR\Request\Request instead! + */ +class IXR_Request extends \IXR\Request\Request +{ + /** + * @inheritdoc + * @deprecated 2021-11-11 + */ + public function __construct($method, $args) + { + DebugHelper::dbgDeprecatedFunction(IXR\Request\Request::class); + parent::__construct($method, $args); + } +} +/** + * @deprecated since 2021-11-11 use \IXR\Message\Message instead! + */ +class IXR_Message extends IXR\Message\Message +{ + /** + * @inheritdoc + * @deprecated 2021-11-11 + */ + public function __construct($message) + { + DebugHelper::dbgDeprecatedFunction(IXR\Message\Message::class); + parent::__construct($message); + } +} +/** + * @deprecated since 2021-11-11 use \IXR\Message\Error instead! + */ +class IXR_Error extends \IXR\Message\Error +{ + /** + * @inheritdoc + * @deprecated 2021-11-11 + */ + public function __construct($code, $message) + { + DebugHelper::dbgDeprecatedFunction(IXR\Message\Error::class); + parent::__construct($code, $message); + } +} +/** + * @deprecated since 2021-11-11 use \IXR\DataType\Date instead! + */ +class IXR_Date extends \IXR\DataType\Date +{ + /** + * @inheritdoc + * @deprecated 2021-11-11 + */ + public function __construct($time) + { + DebugHelper::dbgDeprecatedFunction(IXR\DataType\Date::class); + parent::__construct($time); + } +} +/** + * @deprecated since 2021-11-11 use \IXR\DataType\Base64 instead! + */ +class IXR_Base64 extends \IXR\DataType\Base64 +{ + /** + * @inheritdoc + * @deprecated 2021-11-11 + */ + public function __construct($data) + { + DebugHelper::dbgDeprecatedFunction(IXR\DataType\Base64::class); + parent::__construct($data); + } +} +/** + * @deprecated since 2021-11-11 use \IXR\DataType\Value instead! + */ +class IXR_Value extends \IXR\DataType\Value +{ + /** + * @inheritdoc + * @deprecated 2021-11-11 + */ + public function __construct($data, $type = null) + { + DebugHelper::dbgDeprecatedFunction(IXR\DataType\Value::class); + parent::__construct($data, $type); + } +} + +/** + * print a newline terminated string + * + * You can give an indention as optional parameter + * + * @author Andreas Gohr + * + * @param string $string line of text + * @param int $indent number of spaces indention + * @deprecated 2023-08-31 use echo instead + */ +function ptln($string, $indent = 0) +{ + DebugHelper::dbgDeprecatedFunction('echo'); + echo str_repeat(' ', $indent) . "$string\n"; +} diff --git a/inc/farm.php b/inc/farm.php new file mode 100644 index 0000000..fd1e2e1 --- /dev/null +++ b/inc/farm.php @@ -0,0 +1,158 @@ +/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 + * @author Michael Klier + * @author Christopher Smith + * @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, the fallback is the same as DOKU_INC would be (if it was set already) +if (!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', fullpath(__DIR__ . '/../') . '/'); +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($_GET['animal']) || ('cli' == PHP_SAPI && isset($_SERVER['animal']))) { + $mode = isset($_GET['animal']) ? 'htaccess' : 'cli'; + $animal = $mode == 'htaccess' ? $_GET['animal'] : $_SERVER['animal']; + if (isset($_GET['animal'])) { + // now unset the parameter to not leak into new queries + // code by @splitbrain from farmer plugin + unset($_GET['animal']); + $params = []; + parse_str($_SERVER['QUERY_STRING'], $params); + if (isset($params['animal'])) unset($params['animal']); + $_SERVER['QUERY_STRING'] = http_build_query($params); + } + // 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_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 = [ + 'main' => [ + 'default' => [DOKU_INC . 'conf/dokuwiki.php'], + 'local' => [DOKU_CONF . 'local.php'], + 'protected' => [DOKU_CONF . 'local.protected.php'] + ], + 'acronyms' => [ + 'default' => [DOKU_INC . 'conf/acronyms.conf'], + 'local' => [DOKU_CONF . 'acronyms.local.conf'] + ], + 'entities' => [ + 'default' => [DOKU_INC . 'conf/entities.conf'], + 'local' => [DOKU_CONF . 'entities.local.conf'] + ], + 'interwiki' => [ + 'default' => [DOKU_INC . 'conf/interwiki.conf'], + 'local' => [DOKU_CONF . 'interwiki.local.conf'] + ], + 'license' => [ + 'default' => [DOKU_INC . 'conf/license.php'], + 'local' => [DOKU_CONF . 'license.local.php'] + ], + 'mediameta' => [ + 'default' => [DOKU_INC . 'conf/mediameta.php'], + 'local' => [DOKU_CONF . 'mediameta.local.php'] + ], + 'mime' => [ + 'default' => [DOKU_INC . 'conf/mime.conf'], + 'local' => [DOKU_CONF . 'mime.local.conf'] + ], + 'scheme' => [ + 'default' => [DOKU_INC . 'conf/scheme.conf'], + 'local' => [DOKU_CONF . 'scheme.local.conf'] + ], + 'smileys' => [ + 'default' => [DOKU_INC . 'conf/smileys.conf'], + 'local' => [DOKU_CONF . 'smileys.local.conf'] + ], + 'wordblock' => [ + 'default' => [DOKU_INC . 'conf/wordblock.conf'], + 'local' => [DOKU_CONF . 'wordblock.local.conf'] + ], + 'acl' => [ + 'default' => DOKU_CONF . 'acl.auth.php' + ], + 'plainauth.users' => [ + 'default' => DOKU_CONF . 'users.auth.php' + ], + 'plugins' => [ + // needed since Angua + 'default' => [DOKU_INC . 'conf/plugins.php'], + 'local' => [DOKU_CONF . 'plugins.local.php'], + 'protected' => [DOKU_INC . 'conf/plugins.required.php', DOKU_CONF . 'plugins.protected.php'], + ], + 'userstyle' => [ + 'screen' => [DOKU_CONF . 'userstyle.css', DOKU_CONF . 'userstyle.less'], + 'print' => [DOKU_CONF . 'userprint.css', DOKU_CONF . 'userprint.less'], + 'feed' => [DOKU_CONF . 'userfeed.css', DOKU_CONF . 'userfeed.less'], + 'all' => [DOKU_CONF . 'userall.css', DOKU_CONF . 'userall.less'] + ], + 'userscript' => [ + 'default' => [DOKU_CONF . 'userscript.js'] + ] +]; diff --git a/inc/fetch.functions.php b/inc/fetch.functions.php new file mode 100644 index 0000000..d7acd24 --- /dev/null +++ b/inc/fetch.functions.php @@ -0,0 +1,208 @@ + + * @author Ben Coburn + * @author Gerry Weissbach + * + */ +function sendFile($file, $mime, $dl, $cache, $public = false, $orig = null, $csp = []) +{ + global $conf; + // send mime headers + header("Content-Type: $mime"); + + // send security policy if given + if (!empty($csp)) Headers::contentSecurityPolicy($csp); + + // calculate cache times + if ($cache == -1) { + $maxage = max($conf['cachetime'], 3600); // cachetime or one hour + $expires = time() + $maxage; + } elseif ($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', + PhpString::basename($orig) + ) . ';'); + } else { + header('Content-Disposition: inline;' . rfc2231_encode( + 'filename', + PhpString::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); + echo "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 + * @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]/', + static fn($match) => 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 + * + * @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 [412, 'Precondition Failed']; + } + //handle external images + if (str_starts_with($MIME, 'image/')) $file = media_get_from_URL($media, $EXT, $CACHE); + if (!$file) { + //download failed - redirect to original URL + return [302, $media]; + } + } else { + $media = cleanID($media); + if (empty($media)) { + return [400, 'Bad request']; + } + // check token for resized images + if (($width || $height) && media_get_token($media, $width, $height) !== $INPUT->str('tok')) { + return [412, 'Precondition Failed']; + } + + //check permissions (namespace only) + if (auth_quickaclcheck(getNS($media) . ':X') < AUTH_READ) { + return [403, 'Forbidden']; + } + $file = mediaFN($media, $rev); + } + + //check file existance + if (!file_exists($file)) { + return [404, 'Not Found']; + } + + return [200, null]; +} + +/** + * Returns the wanted cachetime in seconds + * + * Resolves named constants + * + * @author Andreas Gohr + * + * @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/inc/form.php b/inc/form.php new file mode 100644 index 0000000..670d204 --- /dev/null +++ b/inc/form.php @@ -0,0 +1,1147 @@ + + */ + +// phpcs:disable Squiz.Classes.ValidClassName.NotCamelCaps +// phpcs:disable PSR2.Classes.PropertyDeclaration.Underscore + + +/** + * 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. + * + * Please note that even though this class is technically deprecated (use dokuwiki\Form instead), + * it is still widely used in the core and the related form events. Until those have been rewritten, + * this will continue to be used + * + * @deprecated 2019-07-14 + * @author Tom N Harris + */ +class Doku_Form +{ + // Form id attribute + public $params = array(); + + // Draw a border around form fields. + // Adds
    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 + */ + public 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
    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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + * + * @return string html of the form + */ + public function getForm() + { + global $lang; + $form = ''; + $this->params['accept-charset'] = $lang['encoding']; + $form .= '
    params, false) . '>
    ' . 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 .= '
    ' . DOKU_LF; + + return $form; + } + + /** + * Print the assembled form + * + * wraps around getForm() + */ + public 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 + */ + + public 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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + */ +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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @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 + * + * @param array $attrs attributes + * @return string html of tag + */ +function form_closetag($attrs) +{ + return ''; +} + +/** + * form_openfieldset + * + * Print the HTML for an opening fieldset tag. + * Uses the '_legend' key. + * Attributes are passed to buildAttributes() + * + * @author Tom N Harris + * + * @param array $attrs attributes + * @return string html + */ +function form_openfieldset($attrs) +{ + $s = '
    '; + if (!is_null($attrs['_legend'])) $s .= '' . $attrs['_legend'] . ''; + return $s; +} + +/** + * form_closefieldset + * + * Print the HTML for a closing fieldset tag. + * There are no attributes. + * + * @author Tom N Harris + * + * @return string html + */ +function form_closefieldset() +{ + return '
    '; +} + +/** + * 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 + * + * @param array $attrs attributes + * @return string html + */ +function form_hidden($attrs) +{ + return ''; +} + +/** + * 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 + * + * @param array $attrs attributes + * @return string html + */ +function form_wikitext($attrs) +{ + // mandatory attributes + unset($attrs['name']); + unset($attrs['id']); + return ''; +} + +/** + * 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 + * + * @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 ''; +} + +/** + * 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 + * + * @param array $attrs attributes + * @return string html + */ +function form_field($attrs) +{ + $s = ''; + $s .= ' '; + if (preg_match('/(^| )block($| )/', $attrs['_class'])) + $s .= '
    '; + 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 + * + * @param array $attrs attributes + * @return string html + */ +function form_fieldright($attrs) +{ + $s = ''; + $s .= ' ' . $attrs['_text'] . ''; + if (preg_match('/(^| )block($| )/', $attrs['_class'])) + $s .= '
    '; + 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 + * + * @param array $attrs attributes + * @return string html + */ +function form_textfield($attrs) +{ + // mandatory attributes + unset($attrs['type']); + $s = ' '; + $s .= ''; + if (preg_match('/(^| )block($| )/', $attrs['_class'])) + $s .= '
    '; + 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 + * + * @param array $attrs attributes + * @return string html + */ +function form_passwordfield($attrs) +{ + // mandatory attributes + unset($attrs['type']); + $s = ' '; + $s .= ''; + if (preg_match('/(^| )block($| )/', $attrs['_class'])) + $s .= '
    '; + 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 + * + * @param array $attrs attributes + * @return string html + */ +function form_filefield($attrs) +{ + $s = ' '; + $s .= ' + * + * @param array $attrs attributes + * @return string html + */ +function form_checkboxfield($attrs) +{ + // mandatory attributes + unset($attrs['type']); + $s = ''; + $attrs['value'] = $attrs['value'][0]; + } + $s .= ''; + $s .= ' ' . $attrs['_text'] . ''; + if (preg_match('/(^| )block($| )/', $attrs['_class'])) + $s .= '
    '; + 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 + * + * @param array $attrs attributes + * @return string html + */ +function form_radiofield($attrs) +{ + // mandatory attributes + unset($attrs['type']); + $s = ''; + $s .= ' ' . $attrs['_text'] . ''; + if (preg_match('/(^| )block($| )/', $attrs['_class'])) + $s .= '
    '; + 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 + * + * @param array $attrs attributes + * @return string html + */ +function form_menufield($attrs) +{ + $attrs['size'] = '1'; + $s = ''; + $s .= ' '; + if (preg_match('/(^| )block($| )/', $attrs['_class'])) + $s .= '
    '; + 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 + * + * @param array $attrs attributes + * @return string html + */ +function form_listboxfield($attrs) +{ + $s = ' '; + $s .= ''; + if (preg_match('/(^| )block($| )/', $attrs['_class'])) + $s .= '
    '; + return $s; +} diff --git a/inc/fulltext.php b/inc/fulltext.php new file mode 100644 index 0000000..4453d40 --- /dev/null +++ b/inc/fulltext.php @@ -0,0 +1,1000 @@ + + */ + +use dokuwiki\Utf8\Asian; +use dokuwiki\Search\Indexer; +use dokuwiki\Extension\Event; +use dokuwiki\Utf8\Clean; +use dokuwiki\Utf8\PhpString; +use dokuwiki\Utf8\Sort; + +/** + * 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 mtime after this date, accepts timestap or strtotime arguments + * @param int|string $before only show results with mtime 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 Event::createAndTrigger('SEARCH_QUERY_FULLPAGE', $data, '_ft_pageSearch'); +} + +/** + * Returns a list of matching documents for the given query + * + * @author Andreas Gohr + * @author Kazutaka Miyasaka + * + * @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 []; + + // lookup all words found in the query + $lookup = $Indexer->lookup($q['words']); + + // get all pages in this dokuwiki site (!: includes nonexistent pages) + $pages_all = []; + foreach ($Indexer->getPages() as $id) { + $pages_all[$id] = 0; // base: 0 hit + } + + // process the query + $stack = []; + foreach ($q['parsed_ary'] as $token) { + switch (substr($token, 0, 3)) { + case 'W+:': + case 'W-:': + case 'W_:': // word + $word = substr($token, 3); + if (isset($lookup[$word])) { + $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 = []; + foreach (array_keys($pages) as $id) { + $evdata = [ + 'id' => $id, + 'phrase' => $phrase, + 'text' => rawWiki($id) + ]; + $evt = new Event('FULLTEXT_PHRASE_MATCH', $evdata); + if ($evt->advise_before() && $evt->result !== true) { + $text = PhpString::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 = []; + 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 + $pages = array_splice($stack, -2); + if ($pages === []) { + break; + } + $stack[] = ft_resultCombine($pages); + break; + case 'OR': // or operation + $pages = array_splice($stack, -2); + if ($pages === []) { + break; + } + $stack[] = ft_resultUnite($pages); + break; + case 'NOT': // not operation (unary) + $pages = array_pop($stack); + $stack[] = ft_resultComplement([$pages_all, $pages]); + break; + } + } + $docs = array_pop($stack); + + if (empty($docs)) return []; + + // 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 + uksort($docs, 'ft_pagesorter'); + 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 ($result === []) return $result; + + // check ACL permissions + foreach (array_keys($result) as $idx) { + if ( + (!$ignore_perms && ( + isHiddenPage($result[$idx]) || auth_quickaclcheck($result[$idx]) < AUTH_READ + )) || !page_exists($result[$idx], '', false) + ) { + unset($result[$idx]); + } + } + + Sort::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 ($result === []) return $result; + + // check ACL permissions + foreach (array_keys($result) as $idx) { + if ( + (!$ignore_perms && ( + isHiddenPage($result[$idx]) || auth_quickaclcheck($result[$idx]) < AUTH_READ + )) || !page_exists($result[$idx], '', false) + ) { + unset($result[$idx]); + } + } + + Sort::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 + * @author Adrian Lang + * + * @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 mtime after this date, accepts timestap or strtotime arguments + * @param int|string $before only show results with mtime 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 Event::createAndTrigger('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']); + } + if (count($parsedQuery['notns']) > 0) { + $notns = cleanID($parsedQuery['notns'][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 = []; + 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]); + } + } + } + if (isset($notns)) { + foreach (array_keys($pages) as $p_id) { + if (strpos($p_id, $notns) === 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 mtime after this date, accepts timestap or strtotime arguments + * @param int|string $before only returns results with mtime 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 (array_keys($results) as $id) { + $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) +{ + if (Clean::isASCII($search)) { + $pos = stripos($title, $search); + } else { + $pos = PhpString::strpos( + PhpString::strtolower($title), + PhpString::strtolower($search) + ); + } + + return $pos !== 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 Sort::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 + * @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 = [ + 'id' => $id, + 'text' => &$text, + 'highlight' => &$highlight, + 'snippet' => '' + ]; + + $evt = new Event('FULLTEXT_SNIPPET_CREATE', $evdata); + if ($evt->advise_before()) { + $match = []; + $snippets = []; + $utf8_offset = 0; + $offset = 0; + $end = 0; + $len = PhpString::strlen($text); + + // build a regexp from the phrases to highlight + $re1 = '(' . + implode( + '|', + 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) { + } elseif (preg_match('/' . $re3 . '/iu', $text, $match, PREG_OFFSET_CAPTURE, $offset)) { + } elseif (preg_match('/' . $re2 . '/iu', $text, $match, PREG_OFFSET_CAPTURE, $offset)) { + } elseif (preg_match('/' . $re1 . '/iu', $text, $match, PREG_OFFSET_CAPTURE, $offset)) { + } else { + break; + } + + [$str, $idx] = $match[0]; + + // convert $idx (a byte offset) into a utf8 character offset + $utf8_idx = PhpString::strlen(substr($text, 0, $idx)); + $utf8_len = PhpString::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 = 50; + $post = 50; + } elseif ($pre > 50) { + $pre = min($pre, 100 - $post); + } elseif ($post > 50) { + $post = min($post, 100 - $pre); + } elseif ($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 = [$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] .= PhpString::substr($text, $append, $end - $append); + } else { + $snippets[] = PhpString::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(PhpString::substr($text, $utf8_idx, $utf8_len)); + $offset = Clean::correctIdx($text, $offset); + } + + $m = "\1"; + $snippets = preg_replace('/' . $re1 . '/iu', $m . '$1' . $m, $snippets); + $snippet = preg_replace( + '/' . $m . '([^' . $m . ']*?)' . $m . '/iu', + '$1', + hsc(implode('... ', $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 (Asian::isAsianWords($term)) return $term; + + if (UTF8_PROPERTYSUPPORT) { + // unicode word boundaries + // see http://stackoverflow.com/a/2449017/172068 + $BL = '(? 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 + */ +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 + */ +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 + * @author Kazutaka Miyasaka + * + * @param 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', + PhpString::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 = []; + $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 = []; + $ope_stack = []; + $ope_precedence = [')' => 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(['OP', 'CP'], ['(', ')'], $token); + $parsed_ary[] = $token_decoded; + } + } + $parsed_ary = array_values([...$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 = []; + $q['query'] = $query; + $q['parsed_str'] = $parsed_query; + $q['parsed_ary'] = $parsed_ary; + + foreach ($q['parsed_ary'] as $token) { + if (strlen($token) < 3 || $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 (['words', 'phrases', 'highlight', 'ns', 'notns', 'and', 'not'] as $key) { + $q[$key] = empty($q[$key]) ? [] : 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 + * + * @param 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 = Asian::splitAsianWords($term); + foreach ($words as $word) { + $phrase_mode = $phrase_mode ? true : Asian::isAsianWords($word); + $parsed .= ft_termParser($Indexer, $word, false, $phrase_mode); + } + } else { + $term_noparen = str_replace(['(', ')'], ' ', $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(['(', ')'], ['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 ($not !== []) { + $query .= ' -' . implode(' -', $not); + } + + if ($phrases !== []) { + $query .= ' "' . implode('" "', $phrases) . '"'; + } + + if ($ns !== []) { + $query .= ' @' . implode(' @', $ns); + } + + if ($notns !== []) { + $query .= ' ^' . implode(' ^', $notns); + } + + return $query; +} + +//Setup VIM: ex: et ts=4 : diff --git a/inc/html.php b/inc/html.php new file mode 100644 index 0000000..9b76643 --- /dev/null +++ b/inc/html.php @@ -0,0 +1,1069 @@ + + */ + +use dokuwiki\Ui\MediaRevisions; +use dokuwiki\Form\Form; +use dokuwiki\Action\Denied; +use dokuwiki\Action\Locked; +use dokuwiki\ChangeLog\PageChangeLog; +use dokuwiki\Extension\AuthPlugin; +use dokuwiki\Extension\Event; +use dokuwiki\Ui\Backlinks; +use dokuwiki\Ui\Editor; +use dokuwiki\Ui\Index; +use dokuwiki\Ui\Login; +use dokuwiki\Ui\PageConflict; +use dokuwiki\Ui\PageDiff; +use dokuwiki\Ui\PageDraft; +use dokuwiki\Ui\PageRevisions; +use dokuwiki\Ui\PageView; +use dokuwiki\Ui\Recent; +use dokuwiki\Ui\UserProfile; +use dokuwiki\Ui\UserRegister; +use dokuwiki\Ui\UserResendPwd; +use dokuwiki\Utf8\Clean; + +if (!defined('SEC_EDIT_PATTERN')) { + define('SEC_EDIT_PATTERN', '##'); +} + + +/** + * Convenience function to quickly build a wikilink + * + * @author Andreas Gohr + * @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 + * + * @param bool $svg Whether to show svg icons in the register and resendpwd links or not + * @deprecated 2020-07-18 + */ +function html_login($svg = false) +{ + dbg_deprecated(Login::class . '::show()'); + (new Login($svg))->show(); +} + + +/** + * Denied page content + * + * @deprecated 2020-07-18 not called anymore, see inc/Action/Denied::tplContent() + */ +function html_denied() +{ + dbg_deprecated(Denied::class . '::showBanner()'); + (new Denied())->showBanner(); +} + +/** + * inserts section edit buttons if wanted or removes the markers + * + * @author Andreas Gohr + * + * @param string $text + * @param bool $show show section edit buttons? + * @return string + */ +function html_secedit($text, $show = true) +{ + global $INFO; + + if ((isset($INFO) && !$INFO['writable']) || !$show || (isset($INFO) && $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 + * + * @param array $matches matches with regexp + * @return string + * @triggers HTML_SECEDIT_BUTTON + */ +function html_secedit_button($matches) +{ + $json = htmlspecialchars_decode($matches[1], ENT_QUOTES); + + try { + $data = json_decode($json, true, 512, JSON_THROW_ON_ERROR); + } catch (JsonException $e) { + return ''; + } + $data['target'] = strtolower($data['target']); + $data['hid'] = strtolower($data['hid'] ?? ''); + + return Event::createAndTrigger( + 'HTML_SECEDIT_BUTTON', + $data, + 'html_secedit_get_button' + ); +} + +/** + * prints a section editing button + * used as default action form HTML_SECEDIT_BUTTON + * + * @author Adrian Lang + * + * @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']); + + $params = array_merge( + ['do' => 'edit', 'rev' => $INFO['lastmod'], 'summary' => '[' . $name . '] '], + $data + ); + + $html = '
    '; + $html .= html_btn('secedit', $ID, '', $params, 'post', $name); + $html .= '
    '; + return $html; +} + +/** + * Just the back to top button (in its own form) + * + * @author Andreas Gohr + * + * @return string html + */ +function html_topbtn() +{ + global $lang; + + return '' + . ''; +} + +/** + * Displays a button (using its own form) + * If tooltip exists, the access key tooltip is replaced. + * + * @author Andreas Gohr + * + * @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]; + + //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; + } + + $html = '
    '; + + if (is_array($params)) { + foreach ($params as $key => $val) { + $html .= ''; + } + } + + $tip = empty($tooltip) ? hsc($label) : hsc($tooltip); + + $html .= ''; + $html .= '
    '; + + return $html; +} +/** + * show a revision warning + * + * @author Szymon Olewniczak + * @deprecated 2020-07-18 + */ +function html_showrev() +{ + dbg_deprecated(PageView::class . '::showrev()'); +} + +/** + * Show a wiki page + * + * @author Andreas Gohr + * + * @param null|string $txt wiki text or null for showing $ID + * @deprecated 2020-07-18 + */ +function html_show($txt = null) +{ + dbg_deprecated(PageView::class . '::show()'); + (new PageView($txt))->show(); +} + +/** + * ask the user about how to handle an exisiting draft + * + * @author Andreas Gohr + * @deprecated 2020-07-18 + */ +function html_draft() +{ + dbg_deprecated(PageDraft::class . '::show()'); + (new PageDraft())->show(); +} + +/** + * Highlights searchqueries in HTML code + * + * @author Andreas Gohr + * @author Harry Fuecks + * + * @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 = implode('|', $phrases); + + if ($regex === '') return $html; + if (!Clean::isUtf8($regex)) return $html; + + return @preg_replace_callback("/((<[^>]*)|$regex)/ui", function ($match) { + $hlight = unslash($match[0]); + if (!isset($match[2])) { + $hlight = '' . $hlight . ''; + } + return $hlight; + }, $html); +} + +/** + * Display error on locked pages + * + * @author Andreas Gohr + * @deprecated 2020-07-18 not called anymore, see inc/Action/Locked::tplContent() + */ +function html_locked() +{ + dbg_deprecated(Locked::class . '::showBanner()'); + (new Locked())->showBanner(); +} + +/** + * list old revisions + * + * @author Andreas Gohr + * @author Ben Coburn + * @author Kate Arzamastseva + * + * @param int $first skip the first n changelog lines + * @param string $media_id id of media, or empty for current page + * @deprecated 2020-07-18 + */ +function html_revisions($first = -1, $media_id = '') +{ + dbg_deprecated(PageRevisions::class . '::show()'); + if ($media_id) { + (new MediaRevisions($media_id))->show($first); + } else { + global $INFO; + (new PageRevisions($INFO['id']))->show($first); + } +} + +/** + * display recent changes + * + * @author Andreas Gohr + * @author Matthias Grimm + * @author Ben Coburn + * @author Kate Arzamastseva + * + * @param int $first + * @param string $show_changes + * @deprecated 2020-07-18 + */ +function html_recent($first = 0, $show_changes = 'both') +{ + dbg_deprecated(Recent::class . '::show()'); + (new Recent($first, $show_changes))->show(); +} + +/** + * Display page index + * + * @author Andreas Gohr + * + * @param string $ns + * @deprecated 2020-07-18 + */ +function html_index($ns) +{ + dbg_deprecated(Index::class . '::show()'); + (new Index($ns))->show(); +} + +/** + * Index tree item formatter for html_buildlist() + * + * User function for html_buildlist() + * + * @author Andreas Gohr + * + * @param array $item + * @return string + * @deprecated 2020-07-18 + */ +function html_list_index($item) +{ + dbg_deprecated(Index::class . '::formatListItem()'); + return (new Index())->formatListItem($item); +} + +/** + * Index list item formatter for html_buildlist() + * + * This user function is used in html_buildlist to build the + *
  • tags for namespaces when displaying the page index + * it gives different classes to opened or closed "folders" + * + * @author Andreas Gohr + * + * @param array $item + * @return string html + * @deprecated 2020-07-18 + */ +function html_li_index($item) +{ + dbg_deprecated(Index::class . '::tagListItem()'); + return (new Index())->tagListItem($item); +} + +/** + * Default list item formatter for html_buildlist() + * + * @author Andreas Gohr + * + * @param array $item + * @return string html + * @deprecated 2020-07-18 + */ +function html_li_default($item) +{ + return '
  • '; +} + +/** + * 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
  • 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 + * + * @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 (optional) callback to the opening li tag + * @param bool $forcewrapper (optional) 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 = null, $forcewrapper = false) +{ + if ($data === []) { + return ''; + } + + $firstElement = reset($data); + $start_level = $firstElement['level']; + $level = $start_level; + $html = ''; + $open = 0; + + // set callback function to build the
  • tag, formerly defined as html_li_default() + if (!is_callable($lifunc)) { + $lifunc = static fn($item) => '
  • '; + } + + foreach ($data as $item) { + if ($item['level'] > $level) { + //open new list + for ($i = 0; $i < ($item['level'] - $level); $i++) { + if ($i) $html .= '
  • '; + $html .= "\n" . '
      ' . "\n"; + $open++; + } + $level = $item['level']; + } elseif ($item['level'] < $level) { + //close last item + $html .= '' . "\n"; + while ($level > $item['level'] && $open > 0) { + //close higher lists + $html .= '
    ' . "\n" . '
  • ' . "\n"; + $level--; + $open--; + } + } elseif ($html !== '') { + //close previous item + $html .= '' . "\n"; + } + + //print item + $html .= call_user_func($lifunc, $item); + $html .= '
    '; + + $html .= call_user_func($func, $item); + $html .= '
    '; + } + + //close remaining items and lists + $html .= '' . "\n"; + while ($open-- > 0) { + $html .= '' . "\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) + $html = "\n" . '
      ' . "\n" . $html . '
    ' . "\n"; + } + + return $html; +} + +/** + * display backlinks + * + * @author Andreas Gohr + * @author Michael Klier + * @deprecated 2020-07-18 + */ +function html_backlinks() +{ + dbg_deprecated(Backlinks::class . '::show()'); + (new Backlinks())->show(); +} + +/** + * 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 + * @deprecated 2020-07-18 + */ +function html_diff_head($l_rev, $r_rev, $id = null, $media = false, $inline = false) +{ + dbg_deprecated('see ' . PageDiff::class . '::buildDiffHead()'); + return ['', '', '', '']; +} + +/** + * Show diff + * between current page version and provided $text + * or between the revisions provided via GET or POST + * + * @author Andreas Gohr + * @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) + * @deprecated 2020-07-18 + */ +function html_diff($text = '', $intro = true, $type = null) +{ + dbg_deprecated(PageDiff::class . '::show()'); + global $INFO; + (new PageDiff($INFO['id']))->compareWith($text)->preference([ + 'showIntro' => $intro, + 'difftype' => $type, + ])->show(); +} + +/** + * 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 + * @deprecated 2020-07-18 + */ +function html_diff_navigation($pagelog, $type, $l_rev, $r_rev) +{ + dbg_deprecated('see ' . PageDiff::class . '::buildRevisionsNavigation()'); + return ['', '']; +} + +/** + * 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 + * @deprecated 2020-07-18 + */ +function html_diff_navigationlink($difftype, $linktype, $lrev, $rrev = null) +{ + dbg_deprecated('see ' . PageDiff::class . '::diffViewlink()'); + return ''; +} + +/** + * Insert soft breaks in diff html + * + * @param string $diffhtml + * @return string + * @deprecated 2020-07-18 + */ +function html_insert_softbreaks($diffhtml) +{ + dbg_deprecated(PageDiff::class . '::insertSoftbreaks()'); + return (new PageDiff())->insertSoftbreaks($diffhtml); +} + +/** + * show warning on conflict detection + * + * @author Andreas Gohr + * + * @param string $text + * @param string $summary + * @deprecated 2020-07-18 + */ +function html_conflict($text, $summary) +{ + dbg_deprecated(PageConflict::class . '::show()'); + (new PageConflict($text, $summary))->show(); +} + +/** + * Prints the global message array + * + * @author Andreas Gohr + */ +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 = []; + foreach ($MSG as $msg) { + $hash = md5($msg['msg']); + if (isset($shown[$hash])) continue; // skip double messages + if (info_msg_allowed($msg)) { + echo '
    '; + echo $msg['msg']; + echo '
    '; + } + $shown[$hash] = 1; + } + + unset($GLOBALS['MSG']); +} + +/** + * Prints the registration form + * + * @author Andreas Gohr + * @deprecated 2020-07-18 + */ +function html_register() +{ + dbg_deprecated(UserRegister::class . '::show()'); + (new UserRegister())->show(); +} + +/** + * Print the update profile form + * + * @author Christopher Smith + * @author Andreas Gohr + * @deprecated 2020-07-18 + */ +function html_updateprofile() +{ + dbg_deprecated(UserProfile::class . '::show()'); + (new UserProfile())->show(); +} + +/** + * Preprocess edit form data + * + * @author Andreas Gohr + * + * @deprecated 2020-07-18 + */ +function html_edit() +{ + dbg_deprecated(Editor::class . '::show()'); + (new Editor())->show(); +} + +/** + * Display the default edit form + * + * Is the default action for HTML_EDIT_FORMSELECTION. + * + * @param array $param + * @deprecated 2020-07-18 + */ +function html_edit_form($param) +{ + dbg_deprecated(Editor::class . '::addTextarea()'); + (new Editor())->addTextarea($param); +} + +/** + * prints some debug info + * + * @author Andreas Gohr + */ +function html_debug() +{ + global $conf; + global $lang; + /** @var AuthPlugin $auth */ + global $auth; + global $INFO; + + //remove sensitive data + $cnf = $conf; + debug_guard($cnf); + $nfo = $INFO; + debug_guard($nfo); + $ses = $_SESSION; + debug_guard($ses); + + echo ''; + + echo '

    When reporting bugs please send all the following '; + echo 'output as a mail to andi@splitbrain.org '; + echo 'The best way to do this is to save this page in your browser

    '; + + echo '$INFO:
    ';
    +    print_r($nfo);
    +    echo '
    '; + + echo '$_SERVER:
    ';
    +    print_r($_SERVER);
    +    echo '
    '; + + echo '$conf:
    ';
    +    print_r($cnf);
    +    echo '
    '; + + echo 'DOKU_BASE:
    ';
    +    echo DOKU_BASE;
    +    echo '
    '; + + echo 'abs DOKU_BASE:
    ';
    +    echo DOKU_URL;
    +    echo '
    '; + + echo 'rel DOKU_BASE:
    ';
    +    echo dirname($_SERVER['PHP_SELF']) . '/';
    +    echo '
    '; + + echo 'PHP Version:
    ';
    +    echo phpversion();
    +    echo '
    '; + + echo 'locale:
    ';
    +    echo setlocale(LC_ALL, 0);
    +    echo '
    '; + + echo 'encoding:
    ';
    +    echo $lang['encoding'];
    +    echo '
    '; + + if ($auth instanceof AuthPlugin) { + echo 'Auth backend capabilities:
    ';
    +        foreach ($auth->getCapabilities() as $cando) {
    +            echo '   ' . str_pad($cando, 16) . ' => ' . (int)$auth->canDo($cando) . DOKU_LF;
    +        }
    +        echo '
    '; + } + + echo '$_SESSION:
    ';
    +    print_r($ses);
    +    echo '
    '; + + echo 'Environment:
    ';
    +    print_r($_ENV);
    +    echo '
    '; + + echo 'PHP settings:
    ';
    +    $inis = ini_get_all();
    +    print_r($inis);
    +    echo '
    '; + + if (function_exists('apache_get_version')) { + $apache = []; + $apache['version'] = apache_get_version(); + + if (function_exists('apache_get_modules')) { + $apache['modules'] = apache_get_modules(); + } + echo 'Apache
    ';
    +        print_r($apache);
    +        echo '
    '; + } + + echo ''; +} + +/** + * Form to request a new password for an existing account + * + * @author Benoit Chesneau + * @author Andreas Gohr + * @deprecated 2020-07-18 + */ +function html_resendpwd() +{ + dbg_deprecated(UserResendPwd::class . '::show()'); + (new UserResendPwd())->show(); +} + +/** + * Return the TOC rendered to XHTML + * + * @author Andreas Gohr + * + * @param array $toc + * @return string html + */ +function html_TOC($toc) +{ + if ($toc === []) return ''; + global $lang; + $out = '' . DOKU_LF; + $out .= '
    ' . DOKU_LF; + $out .= '

    '; + $out .= $lang['toc']; + $out .= '

    ' . DOKU_LF; + $out .= '
    ' . DOKU_LF; + $out .= html_buildlist($toc, 'toc', 'html_list_toc', null, true); + $out .= '
    ' . DOKU_LF . '
    ' . DOKU_LF; + $out .= '' . 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 '' . hsc($item['title']) . ''; +} + +/** + * 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 [ + '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 + * + * @param string $name The name of the form + * @param Doku_Form $form The form + * @return void + * @deprecated 2020-07-18 + */ +function html_form($name, $form) +{ + dbg_deprecated('use dokuwiki\Form\Form instead of Doku_Form'); + // Safety check in case the caller forgets. + $form->endFieldset(); + Event::createAndTrigger('HTML_' . strtoupper($name) . 'FORM_OUTPUT', $form, 'html_form_output', false); +} + +/** + * Form print function. + * Just calls printForm() on the form object. + * + * @param Doku_Form $form The form + * @return void + * @deprecated 2020-07-18 + */ +function html_form_output($form) +{ + dbg_deprecated('use ' . Form::class . '::toHTML()'); + $form->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 + * @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 array $flashvars - parameters to be passed in the flashvar parameter + * @param array $atts - additional attributes for the 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 = []; + $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 .= '' . NL; + $out .= '' . NL; + $out .= '' . NL; + $out .= '' . NL; + + // print params + if (is_array($params)) foreach ($params as $key => $val) { + $out .= ' ' . NL; + } + + // add flashvars + if (is_array($flashvars)) { + $out .= ' ' . NL; + } + + // alternative content + if ($alt) { + $out .= $alt . NL; + } else { + $out .= $lang['noflash'] . NL; + } + + // finish + $out .= '' . NL; + $out .= '' . NL; + + return $out; +} + +/** + * Prints HTML code for the given tab structure + * + * @param array $tabs tab structure + * @param string $current_tab the current tab id + * @return void + */ +function html_tabs($tabs, $current_tab = null) +{ + echo '
      ' . NL; + + foreach ($tabs as $id => $tab) { + html_tab($tab['href'], $tab['caption'], $id === $current_tab); + } + + echo '
    ' . NL; +} + +/** + * Prints a single tab + * + * @author Kate Arzamastseva + * @author Adrian Lang + * + * @param string $href - tab href + * @param string $caption - tab caption + * @param boolean $selected - is tab selected + * @return void + */ + +function html_tab($href, $caption, $selected = false) +{ + $tab = '
  • '; + if ($selected) { + $tab .= ''; + } else { + $tab .= ''; + } + $tab .= hsc($caption) + . '' + . '
  • ' . NL; + echo $tab; +} + +/** + * Display size change + * + * @param int $sizechange - size of change in Bytes + * @param Doku_Form $form - (optional) form to add elements to + * @return void|string + */ +function html_sizechange($sizechange, $form = null) +{ + 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; + } + if (!isset($form)) { + return '' . $value . ''; + } else { // Doku_Form + $form->addElement(form_makeOpenTag('span', ['class' => $class])); + $form->addElement($value); + $form->addElement(form_makeCloseTag('span')); + } + } +} diff --git a/inc/httputils.php b/inc/httputils.php new file mode 100644 index 0000000..40b8236 --- /dev/null +++ b/inc/httputils.php @@ -0,0 +1,349 @@ + + */ + +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 + * + * @param int $timestamp lastmodified time of the cache file + * @returns void or exits with previously header() commands executed + * @link http://simonwillison.net/2003/Apr/23/conditionalGet/ + * + * @author Simon Willison + */ +function http_conditionalRequest($timestamp) +{ + global $INPUT; + + // 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_modified_since = $INPUT->server->filter('stripslashes')->str('HTTP_IF_MODIFIED_SINCE', false); + $if_none_match = $INPUT->server->filter('stripslashes')->str('HTTP_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 + * + * @param string $file absolute path of file to send + * @returns void or exits with previous header() commands executed + * @author Chris Smith + * + */ +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 + */ +function http_rangeRequest($fh, $size, $mime) +{ + global $INPUT; + + $ranges = []; + $isrange = false; + + header('Accept-Ranges: bytes'); + + if (!$INPUT->server->has('HTTP_RANGE')) { + // no range requested - send the whole file + $ranges[] = [0, $size, $size]; + } else { + $t = explode('=', $INPUT->server->str('HTTP_RANGE')); + if (!$t[0] == 'bytes') { + // we only understand byte ranges - send the whole file + $ranges[] = [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'); + echo 'Bad Range Request!'; + exit; + } + $len = $end - $start + 1; + $ranges[] = [$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++) { + [$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 + echo 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 + * + * @param string $uncompressed_file + * @return bool + * @author Chris Smith + * + */ +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'); + echo gzencode($content, 9, FORCE_GZIP); + } else { + echo $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 = '') +{ + global $INPUT; + + static $stati = [ + 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 = $INPUT->server->str('SERVER_PROTOCOL', false); + + if (str_starts_with(PHP_SAPI, 'cgi') || defined('SIMPLE_TEST')) { + header("Status: {$code} {$text}", true); + } elseif ($server_protocol == 'HTTP/1.1' || $server_protocol == 'HTTP/1.0') { + header($server_protocol . " {$code} {$text}", true, $code); + } else { + header("HTTP/1.1 {$code} {$text}", true, $code); + } +} diff --git a/inc/indexer.php b/inc/indexer.php new file mode 100644 index 0000000..07436fb --- /dev/null +++ b/inc/indexer.php @@ -0,0 +1,382 @@ + + * @author Tom N Harris + */ + +use dokuwiki\Utf8\Clean; +use dokuwiki\Extension\Event; +use dokuwiki\Search\Indexer; + +// 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); + +/** + * 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 + * @author Michael Hamann + * + * @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 = ['dokuwiki' => $version]; + Event::createAndTrigger('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 + * + * @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; +} + +/** + * Create an instance of the indexer. + * + * @return Indexer an Indexer + * + * @author Tom N Harris + */ +function idx_get_indexer() +{ + static $Indexer; + if (!isset($Indexer)) { + $Indexer = new Indexer(); + } + return $Indexer; +} + +/** + * Returns words that will be ignored. + * + * @return array list of stop words + * + * @author Tom N Harris + */ +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 = []; + } + } + 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 + */ +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) echo "Indexer: $page does not exist, ignoring" . DOKU_LF; + return false; + } + $Indexer = idx_get_indexer(); + $result = $Indexer->deletePage($page); + if ($result === "locked") { + if ($verbose) echo "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) echo "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) echo "Indexer: locked" . DOKU_LF; + return false; + } + @unlink($idxtag); + } + if ($verbose) echo "Indexer: index disabled for $page" . DOKU_LF; + return $result; + } + + $Indexer = idx_get_indexer(); + $pid = $Indexer->getPID($page); + if ($pid === false) { + if ($verbose) echo "Indexer: getting the PID failed for $page" . DOKU_LF; + return false; + } + $body = ''; + $metadata = []; + $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'] = []; + + if (($media = p_get_metadata($page, 'relation media', METADATA_RENDER_UNLIMITED)) !== null) + $metadata['relation_media'] = array_keys($media); + else $metadata['relation_media'] = []; + + $data = ['page' => $page, 'body' => $body, 'metadata' => $metadata, 'pid' => $pid]; + $evt = new 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) echo "Indexer: locked" . DOKU_LF; + return false; + } + + if ($result) { + $result = $Indexer->addMetaKeys($page, $metadata); + if ($result === "locked") { + if ($verbose) echo "Indexer: locked" . DOKU_LF; + return false; + } + } + + if ($result) + io_saveFile(metaFN($page, '.indexed'), idx_get_version()); + if ($verbose) { + echo "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 + * + * @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 []; + 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 + * + * @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 = []; + foreach ($lengths as $length) { + $idx[] = (int)$length; + } + return $idx; + } + } + $docache = true; + } + + if ($conf['readdircache'] == 0 || $docache) { + $dir = @opendir($conf['indexdir']); + if ($dir === false) + return []; + $idx = []; + while (($f = readdir($dir)) !== false) { + if (str_starts_with($f, 'i') && str_ends_with($f, '.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 []; +} + +/** + * 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 + * + * @param array|int $filter + * @return array + */ +function idx_indexLengths($filter) +{ + global $conf; + $idx = []; + if (is_array($filter)) { + // testing if index files exist only + $path = $conf['indexdir'] . "/i"; + foreach (array_keys($filter) as $key) { + if (file_exists($path . $key . '.idx')) + $idx[] = $key; + } + } else { + $lengths = idx_listIndexLengths(); + foreach ($lengths as $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 + * + * @param string $name + * @return string + */ +function idx_cleanName($name) +{ + $name = Clean::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/inc/infoutils.php b/inc/infoutils.php new file mode 100644 index 0000000..cba972f --- /dev/null +++ b/inc/infoutils.php @@ -0,0 +1,592 @@ + + */ + +use dokuwiki\Extension\AuthPlugin; +use dokuwiki\Extension\Event; +use dokuwiki\Utf8\PhpString; +use dokuwiki\Debug\DebugHelper; +use dokuwiki\HTTP\DokuHTTPClient; +use dokuwiki\Logger; + +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 + */ +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 = !str_starts_with(DOKU_MESSAGEURL, 'https'); + + // check if new messages needs to be fetched + if ($lm < time() - (60 * 60 * 24) || $lm < @filemtime(DOKU_INC . DOKU_SCRIPT)) { + @touch($cf); + Logger::debug( + sprintf( + 'checkUpdateMessages(): downloading messages to %s%s', + $cf, + $is_http ? ' (without SSL)' : ' (with SSL)' + ) + ); + $http = new DokuHTTPClient(); + $http->timeout = 12; + $resp = $http->get(DOKU_MESSAGEURL . $updateVersion); + if (is_string($resp) && ($resp == '' || str_ends_with(trim($resp), '%'))) { + // 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 { + Logger::debug("checkUpdateMessages(): unexpected HTTP response received", $http->error); + } + } else { + Logger::debug("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 + */ +function getVersionData() +{ + $version = []; + //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'; + + // First try to get date and commit hash by calling Git + if (function_exists('shell_exec')) { + $commitInfo = shell_exec("git log -1 --pretty=format:'%h %cd' --date=short"); + if ($commitInfo) { + [$version['sha'], $date] = explode(' ', $commitInfo); + $version['date'] = hsc($date); + return $version; + } + } + + // we cannot use git on the shell -- let's do it manually! + if (file_exists(DOKU_INC . '.git/HEAD')) { + $headCommit = trim(file_get_contents(DOKU_INC . '.git/HEAD')); + if (strpos($headCommit, 'ref: ') === 0) { + // it is something like `ref: refs/heads/master` + $headCommit = substr($headCommit, 5); + $pathToHead = DOKU_INC . '.git/' . $headCommit; + if (file_exists($pathToHead)) { + $headCommit = trim(file_get_contents($pathToHead)); + } else { + $packedRefs = file_get_contents(DOKU_INC . '.git/packed-refs'); + if (!preg_match("~([[:xdigit:]]+) $headCommit~", $packedRefs, $matches)) { + # ref not found in pack file + return $version; + } + $headCommit = $matches[1]; + } + } + // At this point $headCommit is a SHA + $version['sha'] = $headCommit; + + // Get commit date from Git object + $subDir = substr($headCommit, 0, 2); + $fileName = substr($headCommit, 2); + $gitCommitObject = DOKU_INC . ".git/objects/$subDir/$fileName"; + if (file_exists($gitCommitObject) && function_exists('zlib_decode')) { + $commit = zlib_decode(file_get_contents($gitCommitObject)); + $committerLine = explode("\n", $commit)[3]; + $committerData = explode(' ', $committerLine); + end($committerData); + $ts = prev($committerData); + if ($ts && $date = date('Y-m-d', $ts)) { + $version['date'] = $date; + } + } + } + } else { + global $updateVersion; + $version['date'] = 'update version ' . $updateVersion; + $version['type'] = 'snapshot?'; + } + return $version; +} + +/** + * Return DokuWiki's version + * + * This returns the version in the form "Type Date (SHA)". Where type is either + * "Release" or "Git" and date is the date of the release or the date of the + * last commit. SHA is the short SHA of the last commit - this is only added on + * git checkouts. + * + * If no version can be determined "snapshot? update version XX" is returned. + * Where XX represents the update version number set in doku.php. + * + * @author Anika Henke + * @return string The version string e.g. "Release 2023-04-04a" + */ +function getVersion() +{ + $version = getVersionData(); + $sha = empty($version['sha']) ? '' : ' (' . $version['sha'] . ')'; + return $version['type'] . ' ' . $version['date'] . $sha; +} + +/** + * Run a few sanity checks + * + * @author Andreas Gohr + */ +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(), '7.4.0', '<')) { + msg('Your PHP version is too old (' . phpversion() . ' vs. 7.4+ needed)', -1); + } else { + msg('PHP version ' . phpversion(), 1); + } + } elseif (version_compare(phpversion(), '7.4.0', '<')) { + msg('Your PHP version is too old', -1); + } + + $mem = php_to_byte(ini_get('memory_limit')); + if ($mem) { + if ($mem === -1) { + msg('PHP memory is unlimited', 1); + } elseif ($mem < 16_777_216) { + msg('PHP is limited to less than 16MB RAM (' . filesize_h($mem) . '). + Increase memory_limit in php.ini', -1); + } elseif ($mem < 20_971_520) { + msg('PHP is limited to less than 20MB RAM (' . filesize_h($mem) . '), + you might encounter problems with bigger pages. Increase memory_limit in php.ini', -1); + } elseif ($mem < 33_554_432) { + msg('PHP is limited to less than 32MB RAM (' . filesize_h($mem) . '), + but that should be enough in most cases. If not, increase memory_limit in php.ini', 0); + } else { + msg('More than 32MB RAM (' . filesize_h($mem) . ') available.', 1); + } + } + + if (is_writable($conf['changelog'])) { + msg('Changelog is writable', 1); + } elseif (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); + } elseif (file_exists($conf['changelog'] . '_importing')) { + msg('Importing old changelog now.', 0); + } elseif (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 ' . hsc($loc) . ' 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 (!empty($INFO['userinfo']['name'])) { + msg(sprintf( + "You are currently logged in as %s (%s)", + $INPUT->server->str('REMOTE_USER'), + $INFO['userinfo']['name'] + ), 0); + msg('You are part of the groups ' . implode(', ', $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 (file_exists($INFO['filepath']) && is_writable($INFO['filepath'])) { + msg('The current page is writable by the webserver', 1); + } elseif (!file_exists($INFO['filepath']) && is_writable(dirname($INFO['filepath']))) { + msg('The current page can be created by the webserver', 1); + } else { + msg('The current page is not writable by the webserver', -1); + } + + if ($INFO['writable']) { + msg('The current page is writable by you', 1); + } else { + msg('The current page is not writable by you', -1); + } + + // 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 + faq:searchindex + 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 + faq:searchindex + 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('https://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"); + } + } +} + +/** + * Display a message to the user + * + * If HTTP headers were not sent yet the message is added + * to the global message array else it's printed directly + * using html_msgarea() + * + * Triggers INFOUTIL_MSG_SHOW + * + * @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 + * @see html_msgarea() + */ +function msg($message, $lvl = 0, $line = '', $file = '', $allow = MSG_PUBLIC) +{ + global $MSG, $MSG_shown; + static $errors = [ + -1 => 'error', + 0 => 'info', + 1 => 'success', + 2 => 'notify', + ]; + + $msgdata = [ + 'msg' => $message, + 'lvl' => $errors[$lvl], + 'allow' => $allow, + 'line' => $line, + 'file' => $file, + ]; + + $evt = new Event('INFOUTIL_MSG_SHOW', $msgdata); + if ($evt->advise_before()) { + /* Show msg normally - event could suppress message show */ + if ($msgdata['line'] || $msgdata['file']) { + $basename = PhpString::basename($msgdata['file']); + $msgdata['msg'] .= ' [' . $basename . ':' . $msgdata['line'] . ']'; + } + + if (!isset($MSG)) $MSG = []; + $MSG[] = $msgdata; + if (isset($MSG_shown) || headers_sent()) { + if (function_exists('html_msgarea')) { + html_msgarea(); + } else { + echo "ERROR(" . $msgdata['lvl'] . ") " . $msgdata['msg'] . "\n"; + } + unset($GLOBALS['MSG']); + } + } + $evt->advise_after(); + unset($evt); +} + +/** + * Determine whether the current user is allowed to view the message + * in the $msg data structure + * + * @param array $msg 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 (!$auth instanceof AuthPlugin) 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']; + } +} + +/** + * print debug messages + * + * little function to print the content of a var + * + * @param string $msg + * @param bool $hidden + * + * @author Andreas Gohr + */ +function dbg($msg, $hidden = false) +{ + if ($hidden) { + echo ""; + } else { + echo '
    ';
    +        echo hsc(print_r($msg, true));
    +        echo '
    '; + } +} + +/** + * Print info to debug log file + * + * @param string $msg + * @param string $header + * + * @author Andreas Gohr + * @deprecated 2020-08-13 + */ +function dbglog($msg, $header = '') +{ + dbg_deprecated('\\dokuwiki\\Logger'); + + // was the msg as single line string? use it as header + if ($header === '' && is_string($msg) && strpos($msg, "\n") === false) { + $header = $msg; + $msg = ''; + } + + Logger::getInstance(Logger::LOG_DEBUG)->log( + $header, + $msg + ); +} + +/** + * Log accesses to deprecated fucntions to the debug log + * + * @param string $alternative The function or method that should be used instead + * @triggers INFO_DEPRECATION_LOG + */ +function dbg_deprecated($alternative = '') +{ + DebugHelper::dbgDeprecatedFunction($alternative, 2); +} + +/** + * Print a reversed, prettyprinted backtrace + * + * @author Gary Owen + */ +function dbg_backtrace() +{ + // Get backtrace + $backtrace = debug_backtrace(); + + // Unset call to debug_print_backtrace + array_shift($backtrace); + + // Iterate backtrace + $calls = []; + $depth = count($backtrace) - 1; + foreach ($backtrace as $i => $call) { + if (isset($call['file'])) { + $location = $call['file'] . ':' . ($call['line'] ?? '0'); + } else { + $location = '[anonymous]'; + } + if (isset($call['class'])) { + $function = $call['class'] . $call['type'] . $call['function']; + } else { + $function = $call['function']; + } + + $params = []; + 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[] = '"' . $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 + * + * @param array $data + * + * @author Andreas Gohr + */ +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/inc/init.php b/inc/init.php new file mode 100644 index 0000000..8556889 --- /dev/null +++ b/inc/init.php @@ -0,0 +1,663 @@ + DOKU_SESSION_LIFETIME, + 'path' => DOKU_SESSION_PATH, + 'domain' => DOKU_SESSION_DOMAIN, + 'secure' => ($conf['securecookie'] && is_ssl()), + 'httponly' => true, + 'samesite' => 'Lax', + ]); + + // 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 = [ + 'datadir' => 'pages', + 'olddir' => 'attic', + 'mediadir' => 'media', + 'mediaolddir' => 'media_attic', + 'metadir' => 'meta', + 'mediametadir' => 'media_meta', + 'cachedir' => 'cache', + 'indexdir' => 'index', + 'lockdir' => 'locks', + 'tmpdir' => 'tmp', + 'logdir' => 'log', + ]; + + foreach ($paths as $c => $p) { + $path = empty($conf[$c]) ? $conf['savedir'] . '/' . $p : $conf[$c]; + $conf[$c] = init_path($path); + if (empty($conf[$c])) { + $path = fullpath($path); + 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 run the + installer?"); + } + } + + // path to old changelog only needed for upgrading + $conf['changelog_old'] = init_path( + $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 = []; + + //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 = [$conf['indexdir'] . '/page.idx']; + + foreach ($files as $file) { + if (!file_exists($file)) { + $fh = @fopen($file, 'a'); + if ($fh) { + fclose($fh); + if ($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 + * + * @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']); + + $conf['fperm'] = false; + $conf['dperm'] = false; + + // 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 directory creation + // and set the dperm param if it's not what we want. + $auto_dmode = 0777 & ~$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 + * + * @param null|bool $abs Return an absolute URL? (null defaults to $conf['canonical']) + * + * @return string + */ +function getBaseURL($abs = null) +{ + global $conf; + + $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, but we assume it's in the root + } + + $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 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'])) { + if ( + (!empty($conf['trustedproxy'])) && isset($_SERVER['HTTP_X_FORWARDED_HOST']) + && preg_match('/' . $conf['trustedproxy'] . '/', $_SERVER['REMOTE_ADDR']) + ) { + $cur_host = $_SERVER['HTTP_X_FORWARDED_HOST']; + } else { + $cur_host = $_SERVER['HTTP_HOST']; + } + $parsed_host = parse_url('http://' . $cur_host); + $host = $parsed_host['host'] ?? ''; + $port = $parsed_host['port'] ?? ''; + } elseif (isset($_SERVER['SERVER_NAME'])) { + $parsed_host = parse_url('http://' . $_SERVER['SERVER_NAME']); + $host = $parsed_host['host'] ?? ''; + $port = $parsed_host['port'] ?? ''; + } else { + $host = php_uname('n'); + $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() +{ + global $conf; + + // check if we are behind a reverse proxy + if ( + (!empty($conf['trustedproxy'])) && isset($_SERVER['HTTP_X_FORWARDED_PROTO']) + && preg_match('/' . $conf['trustedproxy'] . '/', $_SERVER['REMOTE_ADDR']) + && ($_SERVER['HTTP_X_FORWARDED_PROTO'] == 'https') + ) { + return true; + } + + if (preg_match('/^(|off|false|disabled)$/i', $_SERVER['HTTPS'] ?? 'off')) { + return false; + } + + return true; +} + +/** + * checks it is windows OS + * @return bool + */ +function isWindows() +{ + return strtoupper(substr(PHP_OS, 0, 3)) === 'WIN'; +} + +/** + * print a nice message even if no styles are loaded yet. + * + * @param integer|string $msg + */ +function nice_die($msg) +{ + echo<< + +DokuWiki Setup Error + +
    +

    DokuWiki Setup Error

    +

    $msg

    +
    + + +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 + * @author + * @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 = (isWindows() || !empty($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]; + } elseif (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 = []; + foreach ($path as $p) { + if ($p === '' || $p === '.') continue; + if ($p === '..') { + array_pop($newpath); + continue; + } + $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/inc/io.php b/inc/io.php new file mode 100644 index 0000000..da42d41 --- /dev/null +++ b/inc/io.php @@ -0,0 +1,834 @@ + + */ + +use dokuwiki\Utf8\PhpString; +use dokuwiki\HTTP\DokuHTTPClient; +use dokuwiki\Extension\Event; + +/** + * 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. + * + * @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 + * @author Ben Coburn + */ +function io_sweepNS($id, $basedir = 'datadir') +{ + global $conf; + $types = ['datadir' => 'pages', 'mediadir' => 'media']; + $ns_type = ($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 = [$id, $ns_type]; + $delone = true; // we deleted at least one dir + Event::createAndTrigger('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. + * + * @param string $file filename + * @param string $id page id + * @param bool|int|string $rev revision timestamp + * @return string + * + * @author Ben Coburn + */ +function io_readWikiPage($file, $id, $rev = false) +{ + if (empty($rev)) { + $rev = false; + } + $data = [[$file, true], getNS($id), noNS($id), $rev]; + return Event::createAndTrigger('IO_WIKIPAGE_READ', $data, '_io_readWikiPage_action', false); +} + +/** + * Callback adapter for io_readFile(). + * + * @param array $data event data + * @return string + * + * @author Ben Coburn + */ +function _io_readWikiPage_action($data) +{ + if (is_array($data) && is_array($data[0]) && count($data[0]) === 2) { + return 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! + * + * + * @param string $file filename + * @param bool $clean + * @return string|bool the file contents or false on error + * + * @author Andreas Gohr + */ +function io_readFile($file, $clean = true) +{ + $ret = ''; + if (file_exists($file)) { + if (str_ends_with($file, '.gz')) { + if (!DOKU_HAS_GZIP) return false; + $ret = gzfile($file); + if (is_array($ret)) { + $ret = implode('', $ret); + } + } elseif (str_ends_with($file, '.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 + * + * @param string $file filename + * @param bool $array return array of lines + * @return string|array|bool content or false on error + * + * @author marcel senf + * @author Andreas Gohr + */ +function bzfile($file, $array = false) +{ + $bz = bzopen($file, "r"); + if ($bz === false) return false; + + if ($array) { + $lines = []; + } + $str = ''; + while (!feof($bz)) { + //8192 seems to be the maximum buffersize? + $buffer = bzread($bz, 8192); + if (($buffer === false) || (bzerrno($bz) !== 0)) { + return false; + } + $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. + * + * @param string $file filename + * @param string $content + * @param string $id page id + * @param int|bool|string $rev timestamp of revision + * @return bool + * + * @author Ben Coburn + */ +function io_writeWikiPage($file, $content, $id, $rev = false) +{ + if (empty($rev)) { + $rev = false; + } + if ($rev === false) { + io_createNamespace($id); // create namespaces as needed + } + $data = [[$file, $content, false], getNS($id), noNS($id), $rev]; + return Event::createAndTrigger('IO_WIKIPAGE_WRITE', $data, '_io_writeWikiPage_action', false); +} + +/** + * Callback adapter for io_saveFile(). + * + * @param array $data event data + * @return bool + * + * @author Ben Coburn + */ +function _io_writeWikiPage_action($data) +{ + if (is_array($data) && is_array($data[0]) && count($data[0]) === 3) { + $ok = 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. + * + * @param string $file filename path to file + * @param string $content + * @param bool $append + * @return bool true on success, otherwise false + * + * @author Andreas Gohr + */ +function _io_saveFile($file, $content, $append) +{ + global $conf; + $mode = ($append) ? 'ab' : 'wb'; + $fileexists = file_exists($file); + + if (str_ends_with($file, '.gz')) { + if (!DOKU_HAS_GZIP) return false; + $fh = @gzopen($file, $mode . '9'); + if (!$fh) return false; + gzwrite($fh, $content); + gzclose($fh); + } elseif (str_ends_with($file, '.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 && $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 + * + * @param string $file filename path to file + * @param string $content + * @param bool $append + * @return bool true on success, otherwise false + * + * @author Andreas Gohr + */ +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 + * + * @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 + * + * @author Steven Danz + * @author Christopher Smith + * @author Patrick Brown + */ +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 (str_ends_with($file, '.gz')) { + if (!DOKU_HAS_GZIP) return false; + $lines = gzfile($file); + } elseif (str_ends_with($file, '.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++; + } + } + } elseif ($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, implode('', $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 + * + * @param string $file filename + * @param string $badline exact linematch to remove + * @param bool $regex use regexp? + * @return bool true on success + * + * @author Patrick Brown + */ +function io_deleteFromFile($file, $badline, $regex = false) +{ + return io_replaceInFile($file, $badline, '', $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 + * + * @param string $file filename + * + * @author Andreas Gohr + */ +function io_lock($file) +{ + global $conf; + + $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); + if ($locked) { + if ($conf['dperm']) { + chmod($lockDir, $conf['dperm']); + } + break; + } + usleep(50); + } while ($locked === false); +} + +/** + * Unlocks a file + * + * @param string $file filename + * + * @author Andreas Gohr + */ +function io_unlock($file) +{ + global $conf; + + $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. + * + * @param string $id page id + * @param string $ns_type 'pages' or 'media' + * + * @author Ben Coburn + */ +function io_createNamespace($id, $ns_type = 'pages') +{ + // verify ns_type + $types = ['pages' => 'wikiFN', 'media' => 'mediaFN']; + if (!isset($types[$ns_type])) { + trigger_error('Bad $ns_type parameter for io_createNamespace().'); + return; + } + // make event list + $missing = []; + $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 = [$ns, $ns_type]; + Event::createAndTrigger('IO_NAMESPACE_CREATED', $data); + } +} + +/** + * Create the directory needed for the given file + * + * @param string $file file name + * + * @author Andreas Gohr + */ +function io_makeFileDir($file) +{ + $dir = dirname($file); + if (!@is_dir($dir)) { + if (!io_mkdir_p($dir)) { + msg("Creating directory $dir failed", -1); + } + } +} + +/** + * Creates a directory hierachy. + * + * @param string $target filename + * @return bool + * + * @link http://php.net/manual/en/function.mkdir.php + * @author + * @author Andreas Gohr + */ +function io_mkdir_p($target) +{ + global $conf; + if (@is_dir($target) || empty($target)) return true; // best case check first + if (file_exists($target) && !is_dir($target)) return false; + //recursion + if (io_mkdir_p(substr($target, 0, strrpos($target, '/')))) { + $ret = @mkdir($target); // crawl back up & create dir tree + if ($ret && !empty($conf['dperm'])) { + chmod($target, $conf['dperm']); + } + return $ret; + } + return false; +} + +/** + * Recursively delete a directory + * + * @param string $path + * @param bool $removefiles defaults to false which will delete empty directories only + * @return bool + * + * @author Andreas Gohr + */ +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 = []; + $files = []; + 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"; + } elseif ($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); + } elseif ($removefiles) { + return @unlink($path); + } + return false; +} + +/** + * Creates a unique temporary directory and returns + * its path. + * + * @return false|string path to new directory or false + * @throws Exception + * + * @author Michael Klier + */ +function io_mktmpdir() +{ + global $conf; + + $base = $conf['tmpdir']; + $dir = md5(uniqid(random_int(0, mt_getrandmax()), 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 + * + * @param string $url url to download + * @param string $file path to file or directory where to save + * @param bool $useAttachment 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 + * + * @author Andreas Gohr + * @author Chris Smith + */ +function io_download($url, $file, $useAttachment = false, $defaultName = '', $maxSize = 2_097_152) +{ + 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 = []; + if ( + is_string($content_disposition) && + preg_match('/attachment;\s*filename\s*=\s*"([^"]*)"/i', $content_disposition, $match) + ) { + $name = PhpString::basename($match[1]); + } + } + + if (!$name) { + if (!$defaultName) return false; + $name = $defaultName; + } + + $file .= $name; + } + + $fileexists = file_exists($file); + $fp = @fopen($file, "w"); + if (!$fp) return false; + fwrite($fp, $data); + fclose($fp); + if (!$fileexists && $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. + * + * @param string $cmd + * @param string $input input pipe + * @param string $output output pipe + * @return int exit code from process + * + * @author Tom N Harris + */ +function io_exec($cmd, $input, &$output) +{ + $descspec = [ + 0 => ["pipe", "r"], + 1 => ["pipe", "w"], + 2 => ["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. + * + * @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 + * + * @author Andreas Gohr + */ +function io_grep($file, $pattern, $max = 0, $backref = false) +{ + $fh = @fopen($file, 'r'); + if (!$fh) return false; + $matches = []; + + $cnt = 0; + $line = ''; + while (!feof($fh)) { + $line .= fgets($fh, 4096); // read full line + if (!str_ends_with($line, "\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 + * + * @param string $file filename path to file + * @return int size of file + * + * @author Gerrit Uitslag + */ +function io_getSizeFile($file) +{ + if (!file_exists($file)) return 0; + + if (str_ends_with($file, '.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); + } elseif (str_ends_with($file, '.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/inc/lang/af/jquery.ui.datepicker.js b/inc/lang/af/jquery.ui.datepicker.js new file mode 100644 index 0000000..d239561 --- /dev/null +++ b/inc/lang/af/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Afrikaans initialisation for the jQuery UI date picker plugin. */ +/* Written by Renier Pretorius. */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/af/lang.php b/inc/lang/af/lang.php new file mode 100644 index 0000000..f719647 --- /dev/null +++ b/inc/lang/af/lang.php @@ -0,0 +1,68 @@ +%s is nie beskibaar nie. Miskien is dit af gehaal.'; diff --git a/inc/lang/ar/admin.txt b/inc/lang/ar/admin.txt new file mode 100644 index 0000000..83994ad --- /dev/null +++ b/inc/lang/ar/admin.txt @@ -0,0 +1,3 @@ +====== الأدارة ====== + +قائمة بالمهام الإدارية المتاحة فى دوكو ويكي. diff --git a/inc/lang/ar/adminplugins.txt b/inc/lang/ar/adminplugins.txt new file mode 100644 index 0000000..44790a0 --- /dev/null +++ b/inc/lang/ar/adminplugins.txt @@ -0,0 +1 @@ +===== إضافات إضافية ===== \ No newline at end of file diff --git a/inc/lang/ar/backlinks.txt b/inc/lang/ar/backlinks.txt new file mode 100644 index 0000000..8c1cd24 --- /dev/null +++ b/inc/lang/ar/backlinks.txt @@ -0,0 +1,3 @@ +====== إرتباطات ====== + +هذه قائمة بالصفحات المرتبطة بالصفحة الحالية. diff --git a/inc/lang/ar/conflict.txt b/inc/lang/ar/conflict.txt new file mode 100644 index 0000000..eabed03 --- /dev/null +++ b/inc/lang/ar/conflict.txt @@ -0,0 +1,5 @@ +====== يوجد نسخة أحدث ====== + +يوجد نسخة أحدث من هذه الصفحة. يحدث هذا عندما يحرر مشترك آخر الصفحة أثناء تعديلك لها. + +افحص الاختلافات جيداً، ثم حدد أية نسخة تحفظ. بالضغط على "حفظ" ستحفظ نسختك. أما بالضغط على "إلغاء" فستحافظ على النسخة الحالية. diff --git a/inc/lang/ar/denied.txt b/inc/lang/ar/denied.txt new file mode 100644 index 0000000..45baea0 --- /dev/null +++ b/inc/lang/ar/denied.txt @@ -0,0 +1,3 @@ +====== لا صلاحيات ====== + +عذرا، ليس مصرح لك الاستمرار diff --git a/inc/lang/ar/diff.txt b/inc/lang/ar/diff.txt new file mode 100644 index 0000000..b9ca6ec --- /dev/null +++ b/inc/lang/ar/diff.txt @@ -0,0 +1,3 @@ +====== اختلافات ====== + +عرض الاختلافات بين النسخة المختارة و النسخة الحالية من الصفحة. diff --git a/inc/lang/ar/draft.txt b/inc/lang/ar/draft.txt new file mode 100644 index 0000000..50c07f2 --- /dev/null +++ b/inc/lang/ar/draft.txt @@ -0,0 +1,5 @@ +====== وجدت مسوّدة ====== + +إن تعديلك لهذه الصفحة في المرة الماضية لم يتم بشكل صحيح، حفظت دوكو ويكي آلياً مسوّدة من عملك الأخير الذي يمكنك استخدامه الآن لمتابعة التعديل. فيما يلي البيانات التي حفظت من المرة الماضية. + +يرجى أن تقرر إن كنت تريد //استعادة// عملك السابق أو //حذف// المسوّدة أو //إلغاء// عملية التحرير. diff --git a/inc/lang/ar/edit.txt b/inc/lang/ar/edit.txt new file mode 100644 index 0000000..27e7dc1 --- /dev/null +++ b/inc/lang/ar/edit.txt @@ -0,0 +1 @@ +حرر هذه الصفحة ثم اضغط على "حفظ". انظر [[wiki:syntax|دليل الصياغة]] لمعرفة صيغة الويكي. يرجى تعديل الصفحة فقط إذا كنت ستحسنها. إذا رغبت فى اختبار شيء ما، تعلم الخطوات الأولى فى [[playground:playground|الملعب]]. diff --git a/inc/lang/ar/editrev.txt b/inc/lang/ar/editrev.txt new file mode 100644 index 0000000..f9b5c31 --- /dev/null +++ b/inc/lang/ar/editrev.txt @@ -0,0 +1,2 @@ +**لقد حملت نسخة قديمة من الصفحة!** إذا حفظتها، سيتم إنشاء نسخة جديدة بهذه المعلومات. +---- diff --git a/inc/lang/ar/index.txt b/inc/lang/ar/index.txt new file mode 100644 index 0000000..1d9701d --- /dev/null +++ b/inc/lang/ar/index.txt @@ -0,0 +1,3 @@ +====== فهرس ====== + +هذا فهرس لجميع الصفحات مرتبة حسب [[doku>ar:namespaces|namespaces]]. diff --git a/inc/lang/ar/install.html b/inc/lang/ar/install.html new file mode 100644 index 0000000..db200b8 --- /dev/null +++ b/inc/lang/ar/install.html @@ -0,0 +1,7 @@ +

    تساعد هذه الصفحة في التثبيت والإعداد الأوليين ل دوكو ويكي. مزيد من المعلومات عن هذا المثبت في صفحة التوثيق الخاصة به.

    + +

    دوكو ويكي تستخدم ملفات عادية لتخزين الصفحات و المعلومات المرتبطة بها (مثل. الصور , وفهارس البحث, والنسخ القديمة, إلخ). لكي تعمل بنجاح دوكو ويكي يجب ان يكون لديها اذن بالكتابة على المجلدات التي تحوي هذه الملفات. هذا المثبت غير قادر على اعداد اذونات المجلدات. عادة يجب عمل هذا مباشرة باستخدام أمر في محث الاوامر أو إن كنت تستخدم استضافة، عن طريقة FTP في لوحة تحكم الاستضافة (مثل. cPanel).

    + +

    سيُعد هذا المثبت اعدادات دوكو ويكي ل ACL, الذي سيسمح للمدير بالولوج و الوصول لقائمة إدارة دوكو ويكي لتثبيت الإضافات، وإدارة المستخدمين، و التحكم بالوصول لصفحات الويكي، وتعديل الاعدادات. ليس مطلوبا لأجل عمل دوكو ويكي, لكنه سيجعل دوكو ويكي أسهل على المدير.

    + +

    المستخدمين الخبراء و المستخدمين مع متطلبات خاصة عليهم استخدام هذا الرابط لتفاصيل تتعلق ب توجيهات التثبيت و ضبط الإعدادات.

    diff --git a/inc/lang/ar/jquery.ui.datepicker.js b/inc/lang/ar/jquery.ui.datepicker.js new file mode 100644 index 0000000..0776841 --- /dev/null +++ b/inc/lang/ar/jquery.ui.datepicker.js @@ -0,0 +1,42 @@ +/* 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 ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.ar = { + closeText: "إغلاق", + prevText: "السابق", + nextText: "التالي", + 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/inc/lang/ar/lang.php b/inc/lang/ar/lang.php new file mode 100644 index 0000000..47e9c3f --- /dev/null +++ b/inc/lang/ar/lang.php @@ -0,0 +1,381 @@ + + * @author Khalid + * @author Mostafa Hussein + * @author Yaman Hokan + * @author Usama Akkad + * @author Ahmad Abd-Elghany + * @author alhajr + * @author Mohamed Belhsine + */ +$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['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'] = 'الروابط لمجلدات مشاركة وندز تعمل فقط مع متصفح مايكروسفت 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['js']['data_insecure'] = 'تحذير: يبدو أن دليل البيانات الخاص بك غير مؤمن بشكل صحيح. يرجى القراءة عن Web Access Security في DokuWiki. '; +$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'] = 'أنا أرغب في حذف حسابي من هذه الموسوعة.
    +هذا الحدث غير ممكن.'; +$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['allowedmime'] = 'قائمة امتدادات الملفات المسموح بها'; +$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['unknowndate'] = 'تاريخ غير معروف'; +$lang['noflash'] = 'تحتاج إلىملحق فلاش أدوبي لعرض هذا المحتوى.'; +$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'] = 'لأسباب أمنية هذا البرنامج سيعمل فقط مع تنصيب دوكو ويكي جديد و غير معدّل. +يجب أن تعيد فك ضغط الملفات مرة أخرى من المكتبة المضغوطة، أو راجع تعليمات تنصيب دوكو ويكي '; +$lang['i_funcna'] = 'دالة PHP التالية غير متوفرة. +%s +قد يكون مزود خدمة الاستفادة قد حجبها لسبب ما.'; +$lang['i_disabled'] = 'تم تعطيله من قبل مزود الخدمة الخاص بك.'; +$lang['i_funcnmail'] = 'ملاحظة: وظيفة بريد PHP غير متوفرة. %s إذا ظل غير متوفر ، فيمكنك تثبيت المكون الإضافي smtp. '; +$lang['i_phpver'] = 'نسخة PHP التي لديك هي +%s +وهي أقل من النسخة المطلوبة +%s +عليك تحديث نسخة PHP'; +$lang['i_mbfuncoverload'] = 'يجب ايقاف تشغيل mbstring.func_overload في ملف php.ini لتشغيل دوكوويكي.'; +$lang['i_urandom'] = 'لا يمكن ل DokuWiki إنشاء أرقام آمنة مشفرة لملفات تعريف الارتباط. قد ترغب في التحقق من إعدادات open_basedir الخاصة بك في php.ini للوصول المناسب إلى /dev/urandom.'; +$lang['i_permfail'] = 'إن %s غير قابل للكتابة بواسطة دوكو ويكي، عليك تعديل إعدادات الصلاحيات لهذا المجلد!'; +$lang['i_confexists'] = 'إن %s موجود أصلاً'; +$lang['i_writeerr'] = 'لا يمكن إنشاء %s، عليك التأكد من صلاحيات الملف أو المجلد وإنشاء الملف يدوياً.'; +$lang['i_badhash'] = 'الملف dokuwiki.php غير مصنف أو قد تم تعديله +(hash=%s)'; +$lang['i_badval'] = 'القيمة %s غير شرعية أو فارغة'; +$lang['i_success'] = 'الإعدادات تمت بنجاح، يرجى حذف الملف install.php الآن. +ثم تابع إلى دوكو ويكي الجديدة'; +$lang['i_failure'] = 'بعض الأخطاء حدثت أثنا كتابة ملفات الإعدادات، عليك تعديلها يدوياً قبل أن تستطيع استخدام دوكو ويكي الجديدة'; +$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'] = 'انت تراقب حاليا التغييرات داخل نطاق %s. يمكنك أيضا عرض أحدث تغييرات الويكي كلها.'; +$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['email_fail'] = 'بريد PHP () مفقود أو معطل. لم يتم إرسال البريد الإلكتروني التالي: '; +$lang['currentns'] = 'مساحة الاسم الحالية'; +$lang['searchresult'] = 'نتيجة البحث'; +$lang['plainhtml'] = 'نص HTML غير منسق'; +$lang['wikimarkup'] = 'علامات الوكي'; +$lang['page_nonexist_rev'] = 'الصفحة غير موجودة في %s. تم إنشاؤه لاحقا في %s.'; +$lang['unable_to_parse_date'] = 'غير قادر على التحليل عند المعلمة "%s".'; +$lang['email_signature_text'] = 'أنشئت هذه الرسالة من دوكو ويكي في +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = 'ملف السجل كبير جدا. تم تخطي الأسطر السابقة!'; +$lang['log_file_failed_to_open'] = 'فشل فتح ملف السجل.'; +$lang['log_file_failed_to_read'] = 'حدث خطأ أثناء قراءة السجل.'; diff --git a/inc/lang/ar/locked.txt b/inc/lang/ar/locked.txt new file mode 100644 index 0000000..48fa61a --- /dev/null +++ b/inc/lang/ar/locked.txt @@ -0,0 +1,3 @@ +====== الصفحة مقفلة ====== + +هذه الصفحة مقفلة للتحرير بواسطة مستخدم أخر. عليك أن تنتظر حتى ينتهى من تعديلاتة أو تتنتهى مدة القفل. diff --git a/inc/lang/ar/login.txt b/inc/lang/ar/login.txt new file mode 100644 index 0000000..00ffccd --- /dev/null +++ b/inc/lang/ar/login.txt @@ -0,0 +1,3 @@ +====== دخول ====== + +أنت لست مسجل دخولك. أدخل بيانات تسجيلك للدخول. يجب أن يكون مسموح للمتصفح بأستخدام الكوكي. diff --git a/inc/lang/ar/mailtext.txt b/inc/lang/ar/mailtext.txt new file mode 100644 index 0000000..132e36e --- /dev/null +++ b/inc/lang/ar/mailtext.txt @@ -0,0 +1,12 @@ +تم تغيير أو أضافة صفحة فى دوكو ويكي. اليك التفاصيل: + +التاريخ : @DATE@ +المتصفح : @BROWSER@ +عنوان الـIP : @IPADDRESS@ +أسم الجهاز : @HOSTNAME@ +النسخة القديمة: @OLDPAGE@ +النسخة الجديدة: @NEWPAGE@ +ملخص التحرير: @SUMMARY@ +مستخدم : @USER@ + +@DIFF@ diff --git a/inc/lang/ar/mailwrap.html b/inc/lang/ar/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/ar/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/ar/newpage.txt b/inc/lang/ar/newpage.txt new file mode 100644 index 0000000..ecaa7fa --- /dev/null +++ b/inc/lang/ar/newpage.txt @@ -0,0 +1,3 @@ +====== لا يوجد هذا الموضوع بعد ====== + +لقد تابعت رابط لموضوع غير متواجد بعد. يمكنك إنشائة بالضعط على زر "انشيء هذه الصفحة". diff --git a/inc/lang/ar/norev.txt b/inc/lang/ar/norev.txt new file mode 100644 index 0000000..2aa2330 --- /dev/null +++ b/inc/lang/ar/norev.txt @@ -0,0 +1,3 @@ +====== لا توجد تلك النسخة ====== + +النسخة المختارة ليست موجودة. أسبخدم زر "نسخ قديمة" لعرض قائمة بالنسخ القديمة من هذه الصفحة. diff --git a/inc/lang/ar/onceexisted.txt b/inc/lang/ar/onceexisted.txt new file mode 100644 index 0000000..27c28f5 --- /dev/null +++ b/inc/lang/ar/onceexisted.txt @@ -0,0 +1,2 @@ +======= هذه الصفحة لم تعد موجودة ====== +لقد اتبعت رابطا إلى صفحة لم تعد موجودة. يمكنك التحقق من قائمة ** المراجعات القديمة ** لمعرفة متى ولماذا تم حذفها أو الوصول إلى المراجعات القديمة أو استعادتها. \ No newline at end of file diff --git a/inc/lang/ar/password.txt b/inc/lang/ar/password.txt new file mode 100644 index 0000000..2489800 --- /dev/null +++ b/inc/lang/ar/password.txt @@ -0,0 +1,6 @@ +أهلاً @FULLNAME@! + +ها هى معلومات المستخدم لـ @TITLE@ الموجودة على العنوان @DOKUWIKIURL@ + +أسم المستخدم : @LOGIN@ +كلمة السر : @PASSWORD@ diff --git a/inc/lang/ar/preview.txt b/inc/lang/ar/preview.txt new file mode 100644 index 0000000..c537e6b --- /dev/null +++ b/inc/lang/ar/preview.txt @@ -0,0 +1,3 @@ +====== عرض التعديلات ====== + +هذا عرض لما سيصبح علية نص الصفحة. تذكر أن التعديلات **لم تحفظ** بعد! diff --git a/inc/lang/ar/pwconfirm.txt b/inc/lang/ar/pwconfirm.txt new file mode 100644 index 0000000..f9e88fa --- /dev/null +++ b/inc/lang/ar/pwconfirm.txt @@ -0,0 +1,9 @@ +مرحبا @FULLNAME@ + +شخص ما طلب كلمة سر جديدة لـحسابك @TITLE@ في @DOKUWIKIURL@ + +إذا لم تكن قد طلبت كلمة سر جديدة رجاء قم بتجاهل هذه الرسالة . + +لتأكيد أنك أنت قمت بطلب كلمة السر الجديدة . نرجو منك الضغط على الرابط في الأسفل . + +@CONFIRM@ diff --git a/inc/lang/ar/read.txt b/inc/lang/ar/read.txt new file mode 100644 index 0000000..27a9304 --- /dev/null +++ b/inc/lang/ar/read.txt @@ -0,0 +1 @@ +هذه الصفحة للقراءة فقط. يمكنك تصفح مصدرها، ولكن لا يمكنك تعديلها. إن كنت تتعتفد أن هناك خطأ ما خاطب المدير. diff --git a/inc/lang/ar/recent.txt b/inc/lang/ar/recent.txt new file mode 100644 index 0000000..567c7d9 --- /dev/null +++ b/inc/lang/ar/recent.txt @@ -0,0 +1,3 @@ +====== احدث التغييرات ====== + +تم تعديل الصفحات التالية حديثا: diff --git a/inc/lang/ar/register.txt b/inc/lang/ar/register.txt new file mode 100644 index 0000000..10a7fa2 --- /dev/null +++ b/inc/lang/ar/register.txt @@ -0,0 +1,3 @@ +====== سجل كمستخدم جديد ====== + +املئ البيانات التالية لتسجيل حساب جديد على الويكي. تأكد من كتابة **بريد إلكتروني صحيح** - سترسل إليك كلمة سر جديدة. اسم الدخول يجب أن يكون [[doku>pagename|أسم صفحة]] صحيح. diff --git a/inc/lang/ar/registermail.txt b/inc/lang/ar/registermail.txt new file mode 100644 index 0000000..7c1cae0 --- /dev/null +++ b/inc/lang/ar/registermail.txt @@ -0,0 +1,10 @@ +سجل مستخدم جديد. هذه هي التفاصيل: + +اسم المستخدم : @NEWUSER@ +الاسم الكامل : @NEWNAME@ +البريد: @NEWEMAIL@ + +التاريخ : @DATE@ +المتصفح : @BROWSER@ +عنوان-IP: @IPADDRESS@ +اسم المضيف: @HOSTNAME@ diff --git a/inc/lang/ar/resendpwd.txt b/inc/lang/ar/resendpwd.txt new file mode 100644 index 0000000..6ba748a --- /dev/null +++ b/inc/lang/ar/resendpwd.txt @@ -0,0 +1,3 @@ +==== إرسال كلمة سر جديدة ==== + +رجاء اكتب اسم المستخدم في الاستمارة الموجودة في الأسفل ليتم طلب رقم سري جديد لحسابك في هذا الويكي . سيرسل رابط لتأكيد طلبك إلى بريدك الإلكتروني المسجل. diff --git a/inc/lang/ar/resetpwd.txt b/inc/lang/ar/resetpwd.txt new file mode 100644 index 0000000..2bbd4a2 --- /dev/null +++ b/inc/lang/ar/resetpwd.txt @@ -0,0 +1,3 @@ +====== اضبط كلمة سر جديدة ====== + +أدخل كلمة سر جديدة لحسابك في هذه الويكي. diff --git a/inc/lang/ar/revisions.txt b/inc/lang/ar/revisions.txt new file mode 100644 index 0000000..35a0bfc --- /dev/null +++ b/inc/lang/ar/revisions.txt @@ -0,0 +1,3 @@ +====== النسخ القديمة ====== + +النسخ القديمة للصفحة الحالية. لإستعادة نسخة قديمة: أخترها من المعروض، ثم إضغط على زر "عدل هذه الصفحة" و أحفظها. diff --git a/inc/lang/ar/searchpage.txt b/inc/lang/ar/searchpage.txt new file mode 100644 index 0000000..5401225 --- /dev/null +++ b/inc/lang/ar/searchpage.txt @@ -0,0 +1,3 @@ +====== بحث ====== + +نتائج البحث . @CREATEPAGEINFO@ diff --git a/inc/lang/ar/showrev.txt b/inc/lang/ar/showrev.txt new file mode 100644 index 0000000..8ec11ec --- /dev/null +++ b/inc/lang/ar/showrev.txt @@ -0,0 +1,2 @@ +**هذه نسخة قديمة من الصفحة!** +---- diff --git a/inc/lang/ar/stopwords.txt b/inc/lang/ar/stopwords.txt new file mode 100644 index 0000000..1a88598 --- /dev/null +++ b/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/inc/lang/ar/subscr_digest.txt b/inc/lang/ar/subscr_digest.txt new file mode 100644 index 0000000..58256f5 --- /dev/null +++ b/inc/lang/ar/subscr_digest.txt @@ -0,0 +1,16 @@ +مرحبا! + +تغيرت الصفحة @PAGE@ في ويكي @TITLE@. +هذه هي التغيرات: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +النسخة القديمة: @OLDPAGE@ +النسخة الحديثة: @NEWPAGE@ + +لإلغاء تنبيه الصفحة, لج الويكي في +@DOKUWIKIURL@ ثم زُر +@SUBSCRIBE@ +وألغ اشتراكك من الصفحات أو النظاقات diff --git a/inc/lang/ar/subscr_form.txt b/inc/lang/ar/subscr_form.txt new file mode 100644 index 0000000..919d256 --- /dev/null +++ b/inc/lang/ar/subscr_form.txt @@ -0,0 +1,3 @@ +====== إدارة الإشتراكات ====== + +تمكنك هذه الصفحة من إدارة اشتراكاتك للصفحة و النطاق الحاليين. \ No newline at end of file diff --git a/inc/lang/ar/subscr_list.txt b/inc/lang/ar/subscr_list.txt new file mode 100644 index 0000000..681fed2 --- /dev/null +++ b/inc/lang/ar/subscr_list.txt @@ -0,0 +1,13 @@ +مرحبا! + +صفحات في النطاق @PAGE@ في ويكي @TITLE@ غُيرت. +هذه هي الصفحات المتغيرة: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +لإلغاء إشعارات الصفحة, لُج الويكي في +@DOKUWIKIURL@ ثم زُر +@SUBSCRIBE@ +ثم ألغ اشتراك تغييرات الصفحة و/أو النطاق. diff --git a/inc/lang/ar/subscr_single.txt b/inc/lang/ar/subscr_single.txt new file mode 100644 index 0000000..6ac7d21 --- /dev/null +++ b/inc/lang/ar/subscr_single.txt @@ -0,0 +1,19 @@ +مرحبا! + +الصفحة @PAGE@ في ويكي @TITLE@ تغيرت. +هذه هي التغييرات: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +التاريخ : @DATE@ +المستخدم : @USER@ +ملخص التحرير: @SUMMARY@ +الاصدار القديم: @OLDPAGE@ +الاصدار الحديث: @NEWPAGE@ + +لإلغاء إشعارات الصفحة,لُج الويكي في +@DOKUWIKIURL@ ثم زُر +@SUBSCRIBE@ +وألغ الاشتراك من تغييرات الصفحة و/أو النطاق. diff --git a/inc/lang/ar/updateprofile.txt b/inc/lang/ar/updateprofile.txt new file mode 100644 index 0000000..a3c56c5 --- /dev/null +++ b/inc/lang/ar/updateprofile.txt @@ -0,0 +1,3 @@ +==== تحديث بيانات حسابك ==== + +عليك فقط أن تكمل كتابة الحقول التي تريد أن تغيرها . لا تستطيع تغيير اسم المستخدم . diff --git a/inc/lang/ar/uploadmail.txt b/inc/lang/ar/uploadmail.txt new file mode 100644 index 0000000..bc61e6e --- /dev/null +++ b/inc/lang/ar/uploadmail.txt @@ -0,0 +1,10 @@ +رُفع ملف إلى دوكو ويكي خاصتك. هذه هي التفاصيل: + +الملف : @MEDIA@ +التاريخ : @DATE@ +المستعرض : @BROWSER@ +عنوان-IP: @IPADDRESS@ +اسم المضيف: @HOSTNAME@ +الحجم : @SIZE@ +نوع MIME : @MIME@ +المستخدم: @USER@ diff --git a/inc/lang/az/admin.txt b/inc/lang/az/admin.txt new file mode 100644 index 0000000..5bf09ee --- /dev/null +++ b/inc/lang/az/admin.txt @@ -0,0 +1,3 @@ +====== İdarəetmə ====== + +Aşağıda Dokuwiki-də mümkün olan administrativ əməliyyatların siyahısı göstərilib. diff --git a/inc/lang/az/adminplugins.txt b/inc/lang/az/adminplugins.txt new file mode 100644 index 0000000..62b1f87 --- /dev/null +++ b/inc/lang/az/adminplugins.txt @@ -0,0 +1 @@ +===== Əlavə Plugin-lər ===== diff --git a/inc/lang/az/backlinks.txt b/inc/lang/az/backlinks.txt new file mode 100644 index 0000000..3c5a93b --- /dev/null +++ b/inc/lang/az/backlinks.txt @@ -0,0 +1,3 @@ +====== Əks linklər ====== + +Bu, bu səhifəyə link saxlayan səhifələrin siyahısıdır. diff --git a/inc/lang/az/conflict.txt b/inc/lang/az/conflict.txt new file mode 100644 index 0000000..908be09 --- /dev/null +++ b/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/inc/lang/az/denied.txt b/inc/lang/az/denied.txt new file mode 100644 index 0000000..c6fddb6 --- /dev/null +++ b/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/inc/lang/az/diff.txt b/inc/lang/az/diff.txt new file mode 100644 index 0000000..200dd23 --- /dev/null +++ b/inc/lang/az/diff.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/az/draft.txt b/inc/lang/az/draft.txt new file mode 100644 index 0000000..65c743d --- /dev/null +++ b/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/inc/lang/az/edit.txt b/inc/lang/az/edit.txt new file mode 100644 index 0000000..7ce6630 --- /dev/null +++ b/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/inc/lang/az/editrev.txt b/inc/lang/az/editrev.txt new file mode 100644 index 0000000..8e98d2f --- /dev/null +++ b/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/inc/lang/az/index.txt b/inc/lang/az/index.txt new file mode 100644 index 0000000..116dd7d --- /dev/null +++ b/inc/lang/az/index.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/az/install.html b/inc/lang/az/install.html new file mode 100644 index 0000000..d8382b1 --- /dev/null +++ b/inc/lang/az/install.html @@ -0,0 +1,7 @@ +

    Bu səhifə Sizə DokuWiki-ni quraşdırmaqa kömək etmək üçündür. Quraşdırma haqqına əlavə məlumatı onun dokumentasiya səhifəsində var.

    + +

    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 lazımdır. 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.

    + +

    Quraşdırma proqramı sizin DokuWiki-nizdə haqlar kontrolu siyahısını (ACL) 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.

    + +

    Təcrübəli istifadəçilər və xüsusi tələbləri olan istifadəçilərə əlavə məlumat üçün quraşdırılma prosesikonfiqurasiya parametrləri link-lərinə muraciyət etməsk tövsiyyə olunur.

    diff --git a/inc/lang/az/jquery.ui.datepicker.js b/inc/lang/az/jquery.ui.datepicker.js new file mode 100644 index 0000000..8d59547 --- /dev/null +++ b/inc/lang/az/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Azerbaijani (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Jamil Najafov (necefov33@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.az = { + closeText: "Bağla", + prevText: "Geri", + nextText: "İrəli", + 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/inc/lang/az/lang.php b/inc/lang/az/lang.php new file mode 100644 index 0000000..da4836e --- /dev/null +++ b/inc/lang/az/lang.php @@ -0,0 +1,231 @@ + + * @author Elchin + */ +$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 Adobe Flash Plugin 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 DokuWiki-nin tam quraşdırma instruksiyasına müraciyət etməlisiniz'; +$lang['i_funcna'] = 'PHP-nin %s 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ı (%s) tələb olunan versiyadan aşagıdır (%s). Quraşdırılmış PHP-nin versiyasını yeniləyin.'; +$lang['i_permfail'] = '%s DokuWiki-yə yazı üçün bağlıdır. Bu qovluğun giriş haqlarını yoxlamaq lazımdır!'; +$lang['i_confexists'] = '%s artıq mövcuddur'; +$lang['i_writeerr'] = '%s 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=%s)'; +$lang['i_badval'] = '%s - səhv ya boş qiymətdir'; +$lang['i_success'] = 'Konfiqurasiya uğurla başa çatdı. İndi siz install.php faylını silə bilərsiniz. + Yeni DokuWiki-nizə xoş gəlmişsiniz!'; +$lang['i_failure'] = 'Konfiqurasiya fayllarına məlumat yazan zaman səhvlər tapıldı. Yəgin ki, yeni DokuWiki-nizi 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'] = '%s namespace-də baş vermiş dəyışıklərə baxırsınız. Siz həmçinin wiki-də bu yaxında baş vermiş bütün dəyişiklərə 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/inc/lang/az/locked.txt b/inc/lang/az/locked.txt new file mode 100644 index 0000000..8ab9344 --- /dev/null +++ b/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/inc/lang/az/login.txt b/inc/lang/az/login.txt new file mode 100644 index 0000000..a70a3f3 --- /dev/null +++ b/inc/lang/az/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/az/mailtext.txt b/inc/lang/az/mailtext.txt new file mode 100644 index 0000000..97cb68d --- /dev/null +++ b/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/inc/lang/az/newpage.txt b/inc/lang/az/newpage.txt new file mode 100644 index 0000000..1c7ea95 --- /dev/null +++ b/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/inc/lang/az/norev.txt b/inc/lang/az/norev.txt new file mode 100644 index 0000000..42a5e25 --- /dev/null +++ b/inc/lang/az/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/az/password.txt b/inc/lang/az/password.txt new file mode 100644 index 0000000..6424161 --- /dev/null +++ b/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/inc/lang/az/preview.txt b/inc/lang/az/preview.txt new file mode 100644 index 0000000..377c1ba --- /dev/null +++ b/inc/lang/az/preview.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/az/pwconfirm.txt b/inc/lang/az/pwconfirm.txt new file mode 100644 index 0000000..582124a --- /dev/null +++ b/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/inc/lang/az/read.txt b/inc/lang/az/read.txt new file mode 100644 index 0000000..216b2f3 --- /dev/null +++ b/inc/lang/az/read.txt @@ -0,0 +1 @@ +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/inc/lang/az/recent.txt b/inc/lang/az/recent.txt new file mode 100644 index 0000000..da07b70 --- /dev/null +++ b/inc/lang/az/recent.txt @@ -0,0 +1,3 @@ +====== Son dəyişiklər ====== + +Bu səhifələr yaxında dəyismişdirlər: diff --git a/inc/lang/az/register.txt b/inc/lang/az/register.txt new file mode 100644 index 0000000..eb6386f --- /dev/null +++ b/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/inc/lang/az/registermail.txt b/inc/lang/az/registermail.txt new file mode 100644 index 0000000..b080e9b --- /dev/null +++ b/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/inc/lang/az/resendpwd.txt b/inc/lang/az/resendpwd.txt new file mode 100644 index 0000000..cc28617 --- /dev/null +++ b/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/inc/lang/az/revisions.txt b/inc/lang/az/revisions.txt new file mode 100644 index 0000000..7164a99 --- /dev/null +++ b/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/inc/lang/az/searchpage.txt b/inc/lang/az/searchpage.txt new file mode 100644 index 0000000..c6ff57d --- /dev/null +++ b/inc/lang/az/searchpage.txt @@ -0,0 +1,3 @@ +====== Axtarış ====== + +Qarşınızda - axtarışın nəticələridir. @CREATEPAGEINFO@ diff --git a/inc/lang/az/showrev.txt b/inc/lang/az/showrev.txt new file mode 100644 index 0000000..dd39870 --- /dev/null +++ b/inc/lang/az/showrev.txt @@ -0,0 +1,2 @@ +**Bu - sənədin köhnə versiyasıdır!** +---- diff --git a/inc/lang/az/stopwords.txt b/inc/lang/az/stopwords.txt new file mode 100644 index 0000000..9c91fb3 --- /dev/null +++ b/inc/lang/az/stopwords.txt @@ -0,0 +1,65 @@ +# 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 +www diff --git a/inc/lang/az/updateprofile.txt b/inc/lang/az/updateprofile.txt new file mode 100644 index 0000000..3fbc457 --- /dev/null +++ b/inc/lang/az/updateprofile.txt @@ -0,0 +1,3 @@ +====== Profili yenilə ====== + +İstədiyiniz xanaları dəyiştirin. İstifadəşi adı dəyiştirilə bilməz. diff --git a/inc/lang/az/uploadmail.txt b/inc/lang/az/uploadmail.txt new file mode 100644 index 0000000..88103fd --- /dev/null +++ b/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/inc/lang/be/admin.txt b/inc/lang/be/admin.txt new file mode 100644 index 0000000..130d5f2 --- /dev/null +++ b/inc/lang/be/admin.txt @@ -0,0 +1,3 @@ +====== Кіраванне ====== + +Ніжэй вы зможаце знайсці спіс адміністрацыйных аперацый, даступных у «ДокуВікі». diff --git a/inc/lang/be/adminplugins.txt b/inc/lang/be/adminplugins.txt new file mode 100644 index 0000000..c5aa5d7 --- /dev/null +++ b/inc/lang/be/adminplugins.txt @@ -0,0 +1 @@ +===== Дадатковыя ўбудовы ===== \ No newline at end of file diff --git a/inc/lang/be/backlinks.txt b/inc/lang/be/backlinks.txt new file mode 100644 index 0000000..b4978a8 --- /dev/null +++ b/inc/lang/be/backlinks.txt @@ -0,0 +1,3 @@ +====== Зваротныя спасылкі ====== + +Гэта спіс старонак, якія спасылаюцца на дадзеную старонку. diff --git a/inc/lang/be/conflict.txt b/inc/lang/be/conflict.txt new file mode 100644 index 0000000..f0df9fd --- /dev/null +++ b/inc/lang/be/conflict.txt @@ -0,0 +1,5 @@ +====== Існуе больш новая версія ====== + +Існуе больш новая версія дакумента, які вы рэдагавалі. Такое здараецца, калі іншы карыстальнік змяніў дакумент, пакуль вы рабілі тое ж самае. + +Уважліва вывучыце адрозненні, прыведзеныя ніжэй, і вырашыце, якую версію пакінуць. Калі вы вылучыце «Захаваць», то ваша версія будзе захавана. Націснуўшы на кнопку «Адмяніць», вы пакінеце дадзеную версію. diff --git a/inc/lang/be/denied.txt b/inc/lang/be/denied.txt new file mode 100644 index 0000000..b53628b --- /dev/null +++ b/inc/lang/be/denied.txt @@ -0,0 +1,3 @@ +====== Доступ забаронены ====== + +Прабачце, у вас не хапае правоў для гэтага дзеяння. diff --git a/inc/lang/be/diff.txt b/inc/lang/be/diff.txt new file mode 100644 index 0000000..824d0e9 --- /dev/null +++ b/inc/lang/be/diff.txt @@ -0,0 +1,3 @@ +====== Адрозненні ====== + +Тут паказаны адрозненні паміж двума версіямі гэтай старонкі. diff --git a/inc/lang/be/draft.txt b/inc/lang/be/draft.txt new file mode 100644 index 0000000..dfce0ae --- /dev/null +++ b/inc/lang/be/draft.txt @@ -0,0 +1,5 @@ +====== Знойдзены чарнавік ====== + +Апошні раз рэдагаванне гэтай старонкі не было карэктна завершана. Падчас вашай працы быў аўтаматычна захаваны чарнавік, які вы зараз можаце аднавіць і працягнуць перапыненую праўку. Ніжэй вы бачыце аўтаматычна захаваную версію. + +Калі ласка, вырашыце, ці вы хочаце //аднавіць// страчаную версію, //выдаліць// чарнавік, або //адмяніць// рэдагаванне. diff --git a/inc/lang/be/edit.txt b/inc/lang/be/edit.txt new file mode 100644 index 0000000..b9c4473 --- /dev/null +++ b/inc/lang/be/edit.txt @@ -0,0 +1 @@ +Адрэдагуйце старонку і націсніце «Захаваць». Прачытайце [[wiki:syntax|старонку дапамогі]] для азнаямлення з сінтаксісам вікі. Калі ласка, рэдагуйце толькі ў тым выпадку, калі плануеце **палепшыць** змесціва. Калі вы проста хочаце патэставаць што-небудзь, скарыстайцеся адмысловай старонкай: [[playground:playground]]. diff --git a/inc/lang/be/editrev.txt b/inc/lang/be/editrev.txt new file mode 100644 index 0000000..1e4afba --- /dev/null +++ b/inc/lang/be/editrev.txt @@ -0,0 +1,2 @@ +**Вы загрузілі старую рэвізію дакумента!** Захаваўшы яе, вы створыце новую дадзеную версію з гэтым змесцівам. +---- diff --git a/inc/lang/be/index.txt b/inc/lang/be/index.txt new file mode 100644 index 0000000..4a4f039 --- /dev/null +++ b/inc/lang/be/index.txt @@ -0,0 +1,3 @@ +====== Змест ====== + +Перад вамі спіс даступных старонак, спарадкаваны па [[doku>namespaces|прасторах імёнаў]]. diff --git a/inc/lang/be/install.html b/inc/lang/be/install.html new file mode 100644 index 0000000..6644f8b --- /dev/null +++ b/inc/lang/be/install.html @@ -0,0 +1,7 @@ +

    Гэтая старонка прызначана дапамагчы ў першапачатковай ўсталёўцы і канфігурацыі «ДокуВики». Дадатковая інфармацыя аб праграме ўстаноўкі даступная на яе старонцы дакументацыі.

    + +

    «ДокуВики» выкарыстоўвае звычайныя файлы для захоўвання старонак і дадатковай інфармацыі (напрыклад, малюнкаў, пошукавага індэкса, папярэдніх версій старонкі, і г. д.). Для паспяховай працы «ДокуВики» неабходны доступ на запіс да дырэкторый з гэтымі файламі. Дадзеная праграма ўсталявання не можа самастойна змяняць сістэмныя правы доступу да дырэкторый. Звычайна гэта робіцца непасрэдна з каманднага радка (shell), або, калі вы выкарыстоўваеце аддалены хостынг, праз FTP або панэль кіравання свайго хостынгу (напрыклад, cPanel).

    + +

    Праграма ўстаноўкі ўключыць выкарыстанне спісаў кантролю доступу (ACL) у вашай «ДокуВики». Гэта дазволіць адміністратара, пасля аўтарызацыі ў «ДокуВики», выкарыстоўваць спецыяльнае меню для ўстаноўкі убудоў, кіравання карыстальнікамі і доступам да старонак вікі, а таксама для налады канфігурацыйных параметраў. Спісы кантролю доступу не абавязковыя для працы «ДокуВики», аднак яны дазваляюць спрасціць кіраванне вашай «ДокуВики».

    + +

    Дасведчаным карыстальнікам і карыстальнікам са спецыяльнымі патрабаваннямі да ўстаноўцы рэкамендуецца звярнуцца па наступных спасылках для ўдакладнення падрабязнасьцяў працэсу ўстаноўкі і параметраў канфігурацыі.

    diff --git a/inc/lang/be/jquery.ui.datepicker.js b/inc/lang/be/jquery.ui.datepicker.js new file mode 100644 index 0000000..125ed0f --- /dev/null +++ b/inc/lang/be/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Belarusian initialisation for the jQuery UI date picker plugin. */ +/* Written by Pavel Selitskas */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.be = { + 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.be ); + +return datepicker.regional.be; + +} ); diff --git a/inc/lang/be/lang.php b/inc/lang/be/lang.php new file mode 100644 index 0000000..2c016d1 --- /dev/null +++ b/inc/lang/be/lang.php @@ -0,0 +1,357 @@ + + */ +$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'] = 'Я хачу, каб выдаліць свой рахунак з гэтай вікі.
    Гэта дзеянне незваротна.'; +$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'] = 'Для прагляду змесціва гэтага патрабуецца Adobe Flash Plugin.'; +$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'] = 'З меркаванняў бяспекі гэтая праграма запускаецца толькі на новай, нязменным ўсталёўцы «Докувики». + Вам трэба альбо зноўку распакаваць запампаваны пакет ўстаноўкі, альбо звярнуцца да поўнай +інструкцыі па ўсталёўцы «Докувики»'; +$lang['i_funcna'] = 'Функцыя PHP %s недаступная. Можа быць, яна па якой-то прычыне заблакаваная вашым хостэрам?'; +$lang['i_phpver'] = 'Ваша версія PHP (%s) ніжэй патрабаванай (%s). Вам неабходна абнавіць ўсталяваную версію PHP.'; +$lang['i_mbfuncoverload'] = 'Для запуску «Докувики» неабходна адключыць параметр mbstring.func_overload ў php.ini'; +$lang['i_permfail'] = '%s недаступная для запісу «Докувики». Вам неабходна выправіць правы доступу для гэтай дырэкторыі!'; +$lang['i_confexists'] = '%s, ужо існуе.'; +$lang['i_writeerr'] = 'Не ўдалося стварыць %s. Вам неабходна праверыць сістэмныя правы доступу да файла і дырэкторый, і стварыць файл ўручную. '; +$lang['i_badhash'] = 'dokuwiki.php не распазнаны або зменены (hash=%s)'; +$lang['i_badval'] = '%s — недапушчальнае або пустое значэнне'; +$lang['i_success'] = 'Канфігурацыя прайшла паспяхова. Цяпер вы можаце выдаліць файл install.php. Пераходзіце да +сваёй новай «Докувики».'; +$lang['i_failure'] = 'Пры запісу ў файлы канфігурацыі былі выяўленыя памылкі. Магчыма, вам прыйдзецца выправіць іх уручную, перш чым вы зможаце выкарыстоўваць сваю новую «Докувики».'; +$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'] = 'Вы праглядаеце змены ў прасторы імёнаў %s. Вы можаце таксама праглядзець нядаўнія змены ва ўсёй вікі.'; +$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. Яна была створана %s.'; +$lang['unable_to_parse_date'] = 'Немагчыма апрацаваць параметр "%s".'; +$lang['email_signature_text'] = 'Гэты ліст створана «Докувики» з сайта +@DOKUWIKIURL@'; diff --git a/inc/lang/be/locked.txt b/inc/lang/be/locked.txt new file mode 100644 index 0000000..69c2ee7 --- /dev/null +++ b/inc/lang/be/locked.txt @@ -0,0 +1,3 @@ +====== Старонка заблакаваная ====== + +Гэтая старонка ў дадзены момант заблякаваная для рэдагавання іншым карыстальнікам. Вам давядзецца пачакаць, пакуль гэты карыстальнік скончыць рэдагаванне або скончыцца час блакавання. diff --git a/inc/lang/be/login.txt b/inc/lang/be/login.txt new file mode 100644 index 0000000..541a699 --- /dev/null +++ b/inc/lang/be/login.txt @@ -0,0 +1,3 @@ +====== Аўтарызацыя ====== + +У дадзены момант вы не ў сістэме. Авторизируйтесь пры дапамозе наступнай формы. //Заўвагу:// для працы ў вас павінны быць уключаны куки (cookies). diff --git a/inc/lang/be/mailtext.txt b/inc/lang/be/mailtext.txt new file mode 100644 index 0000000..7707333 --- /dev/null +++ b/inc/lang/be/mailtext.txt @@ -0,0 +1,12 @@ +У вашай вікі была дададзеная або зменена старонка. Падрабязнасці: + +Дата: @DATE@ +Браўзэр: @BROWSER@ +IP-адрас: @IPADDRESS@ +Хост: @HOSTNAME@ +Старая версія: @OLDPAGE@ +Новая версія: @NEWPAGE@ +Зводка змяненняў: @SUMMARY@ +Карыстальнік: @USER@ + +@DIFF@ diff --git a/inc/lang/be/newpage.txt b/inc/lang/be/newpage.txt new file mode 100644 index 0000000..eca0728 --- /dev/null +++ b/inc/lang/be/newpage.txt @@ -0,0 +1,3 @@ +====== Гэтая старонка яшчэ не існуе ====== + +Вы перайшлі па спасылцы на тэму, для якой яшчэ не створана старонка. Калі дазваляюць вашы правы доступу, вы можаце стварыць яе, націснуўшы на кнопку **Стварыць старонку**. diff --git a/inc/lang/be/norev.txt b/inc/lang/be/norev.txt new file mode 100644 index 0000000..95b9aef --- /dev/null +++ b/inc/lang/be/norev.txt @@ -0,0 +1,3 @@ +====== Такой версіі не існуе ====== + +Паказаная версія старонкі не існуе. Націсніце на кнопку «Гісторыя старонкі», каб атрымаць спіс даступных папярэдніх версій гэтага дакумента. diff --git a/inc/lang/be/password.txt b/inc/lang/be/password.txt new file mode 100644 index 0000000..57ad82a --- /dev/null +++ b/inc/lang/be/password.txt @@ -0,0 +1,6 @@ +Добры дзень, @FULLNAME@! + +Вашы дадзеныя для @TITLE@ (@DOKUWIKIURL@) + +Лагін: @LOGIN@ +Пароль: @PASSWORD@ diff --git a/inc/lang/be/preview.txt b/inc/lang/be/preview.txt new file mode 100644 index 0000000..30c198f --- /dev/null +++ b/inc/lang/be/preview.txt @@ -0,0 +1,3 @@ +====== Прагляд ====== + +Тут паказана, як ваш тэкст будзе выглядаць. **Увага: тэкст яшчэ не захаваны**! diff --git a/inc/lang/be/pwconfirm.txt b/inc/lang/be/pwconfirm.txt new file mode 100644 index 0000000..1469d2c --- /dev/null +++ b/inc/lang/be/pwconfirm.txt @@ -0,0 +1,9 @@ +Добры дзень, @FULLNAME@. + +Хто-то запрасіў новы пароль для ўваходу ў @TITLE@ па адрасе @DOKUWIKIURL@ + +Калі вы не запытвалі новы пароль, проста праігнаруйце гэты ліст. + +Для пацверджання, што запыт быў сапраўды зроблены вамі, калі ласка, перайдзіце па наступнай спасылцы. + +@CONFIRM@ diff --git a/inc/lang/be/read.txt b/inc/lang/be/read.txt new file mode 100644 index 0000000..fe29bd5 --- /dev/null +++ b/inc/lang/be/read.txt @@ -0,0 +1 @@ +Гэтая старонка толькі для чытання. Вы можаце паглядзець яе зыходны тэкст, але не можаце яго змяніць. Паведаміце адміністратару, калі лічыце, што гэта няправільна. diff --git a/inc/lang/be/recent.txt b/inc/lang/be/recent.txt new file mode 100644 index 0000000..50805f3 --- /dev/null +++ b/inc/lang/be/recent.txt @@ -0,0 +1,3 @@ +====== Нядаўнія змены ====== + +Наступныя старонкі былі нядаўна зменены: diff --git a/inc/lang/be/register.txt b/inc/lang/be/register.txt new file mode 100644 index 0000000..a7cdd87 --- /dev/null +++ b/inc/lang/be/register.txt @@ -0,0 +1,3 @@ +====== Рэгістрацыя новага карыстальніка ====== + +Для рэгістрацыі ў вікі запоўніце ўсе палі ніжэй. Звярніце ўвагу на **правільнасць адрасы электроннай пошты** — туды будзе высланы пароль у тым выпадку, калі вас не просяць самастойна ўвесці яго тут. Лагін павінен задавальняць абмежаванням для [[doku>ru:pagename|ідэнтыфікатара старонкі]]. diff --git a/inc/lang/be/registermail.txt b/inc/lang/be/registermail.txt new file mode 100644 index 0000000..15bd810 --- /dev/null +++ b/inc/lang/be/registermail.txt @@ -0,0 +1,10 @@ +Быў зарэгістраваны новы карыстальнік. Падрабязнасці: + +Лагін: @NEWUSER@ +Поўнае імя: @NEWNAME@ +Эл. адрас: @NEWEMAIL@ + +Дата: @DATE@ +Браўзэр: @BROWSER@ +Адрас IP: @IPADDRESS@ +Хост: @HOSTNAME@ diff --git a/inc/lang/be/resendpwd.txt b/inc/lang/be/resendpwd.txt new file mode 100644 index 0000000..fd9e6a0 --- /dev/null +++ b/inc/lang/be/resendpwd.txt @@ -0,0 +1,3 @@ +====== Выслаць новы пароль ====== + +Для атрымання новага пароля калі ласка, увядзіце ваш лагін. Ваш новы пароль будзе адпраўлены па адрасе электроннай пошты, зарэгістраванаму на ваша імя. diff --git a/inc/lang/be/resetpwd.txt b/inc/lang/be/resetpwd.txt new file mode 100644 index 0000000..8b12fd8 --- /dev/null +++ b/inc/lang/be/resetpwd.txt @@ -0,0 +1,3 @@ +====== Ўстаноўка новага пароля ====== + +Калі ласка, увядзіце новы пароль для вашага ўліковага запісу ў гэтай вікі. diff --git a/inc/lang/be/revisions.txt b/inc/lang/be/revisions.txt new file mode 100644 index 0000000..818bd7f --- /dev/null +++ b/inc/lang/be/revisions.txt @@ -0,0 +1,3 @@ +====== Гісторыя старонкі ====== + +Перад вамі гісторыя правак бягучага дакумента. Каб вярнуцца да адной з папярэдніх версій, абярыце патрэбную, націсніце «Рэдагаваць старонку» і захавайце яе. diff --git a/inc/lang/be/searchpage.txt b/inc/lang/be/searchpage.txt new file mode 100644 index 0000000..0c20b48 --- /dev/null +++ b/inc/lang/be/searchpage.txt @@ -0,0 +1,3 @@ +====== Пошук ====== + +Перад вамі вынікі пошуку. @CREATEPAGEINFO@ diff --git a/inc/lang/be/showrev.txt b/inc/lang/be/showrev.txt new file mode 100644 index 0000000..60ee85b --- /dev/null +++ b/inc/lang/be/showrev.txt @@ -0,0 +1,2 @@ +**Гэта старая версія дакумента!** +---- diff --git a/inc/lang/be/stopwords.txt b/inc/lang/be/stopwords.txt new file mode 100644 index 0000000..694e8e5 --- /dev/null +++ b/inc/lang/be/stopwords.txt @@ -0,0 +1,80 @@ +# Гэта сьпіс словаў, якія индексатор ігнаруе, па адным слове ў радку +# Пры рэдагаванні гэтага файла абавязкова выкарыстоўвайце заканчэння радкоў UNIX (толькі newline) +# Не трэба ўключаць словы карацей 3 сімвалаў - яны ігнаруюцца ў любым выпадку +адзін +адна +амаль +больш +будзе +была +было +быццам +быць +вядома +гэтага +гэтай +гэты +добра +жизня +жыццё +заўсёды +здаецца +зноў +зрэшты +зусім +казала +казаў +калі +ледзь +лепш +менш +можа +можна +мяне +нават +навошта +нарэшце +небудзь +нельга +ніколі +нічога +паміж +пасля +перад +потым +праз +раптам +сабе +сваю +свая +сваё +свой +сказала +сказаць +сказаў +сябе +сёння +таго +тады +такая +такое +такой +таксама +таму +толькі +трэба +усяго +усіх +хоць +хіба +цябе +цяпер +чаго +часам +шмат +якая +якое +ёсць +іншая +іншы +www diff --git a/inc/lang/be/subscr_digest.txt b/inc/lang/be/subscr_digest.txt new file mode 100644 index 0000000..0a81d19 --- /dev/null +++ b/inc/lang/be/subscr_digest.txt @@ -0,0 +1,12 @@ +Прывітанне! + +Старонка @PAGE@ у вікі @TITLE@ змянілася. Спіс змен: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Старая версія: @OLDPAGE@ +Новая версія: @NEWPAGE@ + +Каб адпісацца ад апавяшчэнняў аб зменах, ўвайдзіце ў вікі @DOKUWIKIURL@ ў раздзел @SUBSCRIBE@ і адмяніце падпіску на старонку і/або прастору імёнаў. diff --git a/inc/lang/be/subscr_form.txt b/inc/lang/be/subscr_form.txt new file mode 100644 index 0000000..93732da --- /dev/null +++ b/inc/lang/be/subscr_form.txt @@ -0,0 +1,3 @@ +====== Кіраванне падпіскамі ====== + +Тут вы можаце кіраваць падпіскамі для дадзенай старонкі і прасторы імёнаў. diff --git a/inc/lang/be/subscr_list.txt b/inc/lang/be/subscr_list.txt new file mode 100644 index 0000000..1cc646b --- /dev/null +++ b/inc/lang/be/subscr_list.txt @@ -0,0 +1,9 @@ +Прывітанне! + +Старонкі ў прасторы імёнаў @PAGE@ у вікі @TITLE@ былі змененыя. Спіс новых старонак: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Каб адпісацца ад апавяшчэнняў аб зменах, ўвайдзіце ў вікі @DOKUWIKIURL@ ў раздзел @SUBSCRIBE@ і адмяніце падпіску на старонку і/або прастору імёнаў. diff --git a/inc/lang/be/subscr_single.txt b/inc/lang/be/subscr_single.txt new file mode 100644 index 0000000..70c4a4d --- /dev/null +++ b/inc/lang/be/subscr_single.txt @@ -0,0 +1,16 @@ +Прывітанне! + +Старонка @PAGE@ у вікі @TITLE@ змянілася. +Спіс змен: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Дата: @DATE@ +Аўтар: @USER@ +Заўвага: @SUMMARY@ +Старая версія: @OLDPAGE@ +Новая версія: @NEWPAGE@ + +Каб адпісацца ад апавяшчэнняў аб зменах, ўвайдзіце ў вікі @DOKUWIKIURL@ ў раздзел @SUBSCRIBE@ і адмяніце падпіску на старонку і/або прастору імёнаў. diff --git a/inc/lang/be/updateprofile.txt b/inc/lang/be/updateprofile.txt new file mode 100644 index 0000000..6f767d1 --- /dev/null +++ b/inc/lang/be/updateprofile.txt @@ -0,0 +1,3 @@ +====== Абнавіць профіль ====== + +Неабходна запоўніць толькі тыя палі, якія вы хочаце змяніць. Ваш лагін не можа быць зменены. diff --git a/inc/lang/be/uploadmail.txt b/inc/lang/be/uploadmail.txt new file mode 100644 index 0000000..7703045 --- /dev/null +++ b/inc/lang/be/uploadmail.txt @@ -0,0 +1,11 @@ +У вашу вікі быў запампаваны файл. Падрабязная інфармацыя: + +Файл: @MEDIA@ +Старая версія: @OLD@ +Дата: @DATE@ +Браўзэр: @BROWSER@ +Адрас IP: @IPADDRESS@ +Хост: @HOSTNAME@ +Памер: @SIZE@ +Тып MIME: @MIME@ +Карыстальнік: @USER@ diff --git a/inc/lang/bg/admin.txt b/inc/lang/bg/admin.txt new file mode 100644 index 0000000..3f0a73a --- /dev/null +++ b/inc/lang/bg/admin.txt @@ -0,0 +1,3 @@ +====== Администриране ====== + +Отдолу ще намерите списъка с администраторските задачи в DokuWiki. diff --git a/inc/lang/bg/adminplugins.txt b/inc/lang/bg/adminplugins.txt new file mode 100644 index 0000000..df24b05 --- /dev/null +++ b/inc/lang/bg/adminplugins.txt @@ -0,0 +1 @@ +===== Допълнителни приставки ===== \ No newline at end of file diff --git a/inc/lang/bg/backlinks.txt b/inc/lang/bg/backlinks.txt new file mode 100644 index 0000000..e501614 --- /dev/null +++ b/inc/lang/bg/backlinks.txt @@ -0,0 +1,3 @@ +====== Какво сочи насам ====== + +Това е списък на страниците, които препращат обратно към текущата страница. diff --git a/inc/lang/bg/conflict.txt b/inc/lang/bg/conflict.txt new file mode 100644 index 0000000..af6f86e --- /dev/null +++ b/inc/lang/bg/conflict.txt @@ -0,0 +1,5 @@ +====== Съществува по-нова версия ====== + +Съществува по-нова версия на документа, който сте редактирали. Това се случва когато друг потребител е променил документа докато сте го редактирали. + +Разгледайте внимателно разликите, след това решете коя версия да бъде запазена. Ако натиснете ''Запис'', ще бъде запазена вашата версия. Натиснете ли ''Отказ'', ще бъде запазена текущата версия. diff --git a/inc/lang/bg/denied.txt b/inc/lang/bg/denied.txt new file mode 100644 index 0000000..7010090 --- /dev/null +++ b/inc/lang/bg/denied.txt @@ -0,0 +1,3 @@ +====== Отказан достъп ====== + +Нямате достатъчно права, за да продължите. diff --git a/inc/lang/bg/diff.txt b/inc/lang/bg/diff.txt new file mode 100644 index 0000000..a22031e --- /dev/null +++ b/inc/lang/bg/diff.txt @@ -0,0 +1,3 @@ +====== Разлики ====== + +Тук са показани разликите между избраната и текущата версия на страницата. diff --git a/inc/lang/bg/draft.txt b/inc/lang/bg/draft.txt new file mode 100644 index 0000000..2869cc8 --- /dev/null +++ b/inc/lang/bg/draft.txt @@ -0,0 +1,5 @@ +====== Намерена чернова ====== + +Последната редакционна сесия на страницата не е завършена правилно. Dokuwiki автоматично запазва чернова по време на редактирането, която можете да ползвате сега, за да продължите работата си. Отдолу може да видите данните, които бяха запазени от последната сесия. + +Моля решете, дали искате да //възстановите// последната си редакционна сесия, //изтриете// автоматично запазената чернова или //откажете// редакцията. diff --git a/inc/lang/bg/edit.txt b/inc/lang/bg/edit.txt new file mode 100644 index 0000000..2fa1599 --- /dev/null +++ b/inc/lang/bg/edit.txt @@ -0,0 +1 @@ +Редактирайте и натиснете ''Запис''. За информация относно ползвания синтаксис прочетете [[wiki:syntax]]. Моля, редактирайте само когато може да **подобрите** съдържанието. Ако ще пробвате разни неща, може да експериментирате в [[playground:playground|пясъчника]]. diff --git a/inc/lang/bg/editrev.txt b/inc/lang/bg/editrev.txt new file mode 100644 index 0000000..ba97f25 --- /dev/null +++ b/inc/lang/bg/editrev.txt @@ -0,0 +1,2 @@ +**Заредена е стара версия на документа!** Ако я запазите, ще създадете нова версия с текущите данни. +---- diff --git a/inc/lang/bg/index.txt b/inc/lang/bg/index.txt new file mode 100644 index 0000000..b92583d --- /dev/null +++ b/inc/lang/bg/index.txt @@ -0,0 +1,3 @@ +====== Индекс ====== + +Това е списък на всички налични страници подредени по [[doku>namespaces|именни пространства]]. diff --git a/inc/lang/bg/install.html b/inc/lang/bg/install.html new file mode 100644 index 0000000..9dcba6b --- /dev/null +++ b/inc/lang/bg/install.html @@ -0,0 +1,7 @@ +

    Страницата помага при инсталиране за първи път и настройване на Dokuwiki. Повече информация за инсталатора ще намерите в документацията му.

    + +

    Dokuwiki ползва обикновени файлове за съхраняване на страниците и информацията свързана с тях (примерно картинки, търсения, стари версии, и др.). За да функционира нормално DokuWiki трябва да има право за писане в директориите, които съдържат тези файлове. Инсталаторът не може да настройва правата на директориите. Вие трябва да направите това директно от командният ред или ако ползвате хостинг през FTP или контролния панела на хоста (примерно cPanel).

    + +

    Инсталаторът ще настрои вашата DokuWiki конфигурация на ACL, което ще позволи на администратора да се впише и ползва администраторското меню в DokuWiki за инсталиране на приставки, контрол на потребителите, управление на достъпа до страниците и промяна на останалите настройки. Това не е необходимо за функционирането на DokuWiki, но прави администрирането по-лесно.

    + +

    Опитните потребители и потребителите със специални изисквания към настройките имат на разположение допълнителна информация относно инсталирането и настройването.

    diff --git a/inc/lang/bg/jquery.ui.datepicker.js b/inc/lang/bg/jquery.ui.datepicker.js new file mode 100644 index 0000000..c771b3b --- /dev/null +++ b/inc/lang/bg/jquery.ui.datepicker.js @@ -0,0 +1,41 @@ +/* Bulgarian initialisation for the jQuery UI date picker plugin. */ +/* Written by Stoyan Kyosev (http://svest.org). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.bg = { + closeText: "затвори", + prevText: "назад", + nextText: "напред", + nextBigText: ">>", + 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/inc/lang/bg/lang.php b/inc/lang/bg/lang.php new file mode 100644 index 0000000..8daeb8a --- /dev/null +++ b/inc/lang/bg/lang.php @@ -0,0 +1,349 @@ + + * @author Salif Mehmed + * @author Nikolay Vladimirov + * @author Viktor Usunov + * @author Kiril + * @author Ivan Peltekov + */ +$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['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.
    Можете да копирате и поставите връзката.'; +$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_any_time'] = 'по всяко време'; +$lang['search_past_7_days'] = 'миналата седмица'; +$lang['search_past_month'] = 'миналия месец'; +$lang['search_past_year'] = 'миналата година'; +$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.
    Веднъж изтрит, профилът не може да бъде възстановен!'; +$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['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'] = 'Необходим е Adobe Flash Plugin за изобразяване на съдържанието.'; +$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'] = 'Поради мерки за сигурност инсталаторът работи само с нови и непроменени инсталационни файлове. + Трябва да разархивирате отново файловете от сваления архив или да се посъветвате с Инструкциите за инсталиране на Dokuwiki.'; +$lang['i_funcna'] = 'PHP функцията %s не е достъпна. Може би е забранена от доставчика на хостинг.'; +$lang['i_phpver'] = 'Инсталираната версия %s на PHP е по-стара от необходимата %s. Актуализирайте PHP инсталацията.'; +$lang['i_mbfuncoverload'] = 'Необходимо е да изключите mbstring.func_overload в php.ini за да може DokuWiki да стартира.'; +$lang['i_permfail'] = '%s не е достъпна за писане от DokuWiki. Трябва да промените правата за достъп до директорията!'; +$lang['i_confexists'] = '%s вече съществува'; +$lang['i_writeerr'] = '%s не можа да бъде създаден. Трябва да проверите правата за достъп до директорията/файла и да създадете файла ръчно.'; +$lang['i_badhash'] = 'Файлът dokuwiki.php не може да бъде разпознат или е променен (hash=%s)'; +$lang['i_badval'] = '%s - непозволена или празна стойност'; +$lang['i_success'] = 'Настройването приключи успешно. Вече можете да изтриете файла install.php. Продължете към Вашето новата инсталация на DokuWiki.'; +$lang['i_failure'] = 'Възникнаха грешки при записването на файловете с настройки. Вероятно ще се наложи да ги поправите ръчно, + за да можете да ползвате Вашето ново DokuWiki.'; +$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'] = 'В момента преглеждате промените в именно пространство %s. Може да прегледате и промените в цялото Wiki.'; +$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['email_fail'] = 'PHP mail() липсва или деактивиран. Следният имейл не беше изпратен:'; +$lang['currentns'] = 'Текущо именно пространство'; +$lang['searchresult'] = 'Резултати от търсенето'; +$lang['plainhtml'] = 'Обикновен HTML'; +$lang['email_signature_text'] = 'Писмото е генерирано от DokuWiki на адрес +@DOKUWIKIURL@'; diff --git a/inc/lang/bg/locked.txt b/inc/lang/bg/locked.txt new file mode 100644 index 0000000..7cdfba7 --- /dev/null +++ b/inc/lang/bg/locked.txt @@ -0,0 +1,3 @@ +====== Страницата е заключена ====== + +В момента страницата е заключена за редактиране от друг потребител. Трябва да изчакате потребителя да приключи с редактирането на страницата или автоматичното отключване на страницата. diff --git a/inc/lang/bg/login.txt b/inc/lang/bg/login.txt new file mode 100644 index 0000000..e5061c3 --- /dev/null +++ b/inc/lang/bg/login.txt @@ -0,0 +1,3 @@ +====== Вписване ====== + +Не сте се вписали! Въведете данните си за удостоверяване отдолу, за да го направите. Бисквитките (cookies) трябва да са включени. diff --git a/inc/lang/bg/mailtext.txt b/inc/lang/bg/mailtext.txt new file mode 100644 index 0000000..60cffed --- /dev/null +++ b/inc/lang/bg/mailtext.txt @@ -0,0 +1,12 @@ +Страница в DokuWiki е добавена или променена. Ето детайлите: + +Дата : @DATE@ +Браузър : @BROWSER@ +IP адрес : @IPADDRESS@ +Име на хоста : @HOSTNAME@ +Стара версия: @OLDPAGE@ +Нова версия: @NEWPAGE@ +Обобщение: @SUMMARY@ +Потребител : @USER@ + +@DIFF@ diff --git a/inc/lang/bg/mailwrap.html b/inc/lang/bg/mailwrap.html new file mode 100644 index 0000000..7df0cdc --- /dev/null +++ b/inc/lang/bg/mailwrap.html @@ -0,0 +1,13 @@ + + + @TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + diff --git a/inc/lang/bg/newpage.txt b/inc/lang/bg/newpage.txt new file mode 100644 index 0000000..89b94b3 --- /dev/null +++ b/inc/lang/bg/newpage.txt @@ -0,0 +1,3 @@ +====== Несъществуваща тема ====== + +Последвали сте препратка към тема, която не съществува. Ако правата ви позволяват, може да я създадете чрез бутона **Създаване на страница**. diff --git a/inc/lang/bg/norev.txt b/inc/lang/bg/norev.txt new file mode 100644 index 0000000..6d2e947 --- /dev/null +++ b/inc/lang/bg/norev.txt @@ -0,0 +1,3 @@ +====== Няма такава версия ====== + +Избраната версия не съществува. Натиснете бутона ''История'' за отваряне на списъка със стари версии на документа. diff --git a/inc/lang/bg/onceexisted.txt b/inc/lang/bg/onceexisted.txt new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/inc/lang/bg/onceexisted.txt @@ -0,0 +1 @@ + diff --git a/inc/lang/bg/password.txt b/inc/lang/bg/password.txt new file mode 100644 index 0000000..77fa48b --- /dev/null +++ b/inc/lang/bg/password.txt @@ -0,0 +1,6 @@ +Здравейте @FULLNAME@! + +Вашите потребителски данни за @TITLE@ на @DOKUWIKIURL@ + +Потребител : @LOGIN@ +Парола : @PASSWORD@ diff --git a/inc/lang/bg/preview.txt b/inc/lang/bg/preview.txt new file mode 100644 index 0000000..90e5184 --- /dev/null +++ b/inc/lang/bg/preview.txt @@ -0,0 +1,3 @@ +====== Преглед ====== + +Ето как ще изглежда страницата. **Текста все още не е запазен**! diff --git a/inc/lang/bg/pwconfirm.txt b/inc/lang/bg/pwconfirm.txt new file mode 100644 index 0000000..d2bfd6a --- /dev/null +++ b/inc/lang/bg/pwconfirm.txt @@ -0,0 +1,9 @@ +Здравейте @FULLNAME@! + +Някой е поискал нова парола за потребител @TITLE@ на @DOKUWIKIURL@ + +Ако не сте поискали нова парола, тогава просто игнорирайте това писмо. + +За да потвърдите, че искането е наистина от вас, моля ползвайте следния линк: + +@CONFIRM@ diff --git a/inc/lang/bg/read.txt b/inc/lang/bg/read.txt new file mode 100644 index 0000000..c4af24e --- /dev/null +++ b/inc/lang/bg/read.txt @@ -0,0 +1 @@ +Страницата е само за четене. Може да разглеждате кода, но не и да го променяте. Обърнете се съм администратора, ако смятате, че това не е редно. diff --git a/inc/lang/bg/recent.txt b/inc/lang/bg/recent.txt new file mode 100644 index 0000000..d435493 --- /dev/null +++ b/inc/lang/bg/recent.txt @@ -0,0 +1,3 @@ +====== Скорошни промени ====== + +Следните страници са били променени наскоро: diff --git a/inc/lang/bg/register.txt b/inc/lang/bg/register.txt new file mode 100644 index 0000000..0754f2c --- /dev/null +++ b/inc/lang/bg/register.txt @@ -0,0 +1,3 @@ +====== Регистриране като нов потребител ====== + +Моля, попълнете всичките полета отдолу, за да бъде създаден нов профил. Уверете се, че въведеният **имейл адрес е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]]. diff --git a/inc/lang/bg/registermail.txt b/inc/lang/bg/registermail.txt new file mode 100644 index 0000000..3c555f5 --- /dev/null +++ b/inc/lang/bg/registermail.txt @@ -0,0 +1,10 @@ +Регистриран е нов потребител. Ето детайлите: + +Потребител : @NEWUSER@ +Пълно име : @NEWNAME@ +E. поща : @NEWEMAIL@ + +Дата : @DATE@ +Браузър : @BROWSER@ +IP адрес : @IPADDRESS@ +Име на хоста : @HOSTNAME@ diff --git a/inc/lang/bg/resendpwd.txt b/inc/lang/bg/resendpwd.txt new file mode 100644 index 0000000..19dffc0 --- /dev/null +++ b/inc/lang/bg/resendpwd.txt @@ -0,0 +1,3 @@ +====== Пращане на нова парола ====== + +Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. Чрез имейл ще получите линк, с който да потвърдите. diff --git a/inc/lang/bg/resetpwd.txt b/inc/lang/bg/resetpwd.txt new file mode 100644 index 0000000..754adb6 --- /dev/null +++ b/inc/lang/bg/resetpwd.txt @@ -0,0 +1,3 @@ +====== Задаване на нова парола ====== + +Моля, въведете нова парола за вашия акаунт в Wiki страницата. diff --git a/inc/lang/bg/revisions.txt b/inc/lang/bg/revisions.txt new file mode 100644 index 0000000..6f3e2d0 --- /dev/null +++ b/inc/lang/bg/revisions.txt @@ -0,0 +1,3 @@ +====== Стари версии====== + +Това са старите версии на документа. За да възстановите стара версия, изберете я долу, натиснете ''Редактиране'' и я запазете. diff --git a/inc/lang/bg/searchpage.txt b/inc/lang/bg/searchpage.txt new file mode 100644 index 0000000..ee5e204 --- /dev/null +++ b/inc/lang/bg/searchpage.txt @@ -0,0 +1,3 @@ +====== Търсене ====== + +Резултата от търсенето ще намерите по-долу. @CREATEPAGEINFO@ diff --git a/inc/lang/bg/showrev.txt b/inc/lang/bg/showrev.txt new file mode 100644 index 0000000..a3848f8 --- /dev/null +++ b/inc/lang/bg/showrev.txt @@ -0,0 +1,2 @@ +**Това е стара версия на документа!** +---- diff --git a/inc/lang/bg/stopwords.txt b/inc/lang/bg/stopwords.txt new file mode 100644 index 0000000..03fd137 --- /dev/null +++ b/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/inc/lang/bg/subscr_digest.txt b/inc/lang/bg/subscr_digest.txt new file mode 100644 index 0000000..8f8cfea --- /dev/null +++ b/inc/lang/bg/subscr_digest.txt @@ -0,0 +1,15 @@ +Здравейте! + +Страницата @PAGE@ в @TITLE@ wiki е променена. +Промените са по-долу: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Стара версия: @OLDPAGE@ +Нова версия: @NEWPAGE@ + +Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите +@SUBSCRIBE@ +и да прекратите абонамента за промени по страницата или именното пространство. diff --git a/inc/lang/bg/subscr_form.txt b/inc/lang/bg/subscr_form.txt new file mode 100644 index 0000000..e32a5ec --- /dev/null +++ b/inc/lang/bg/subscr_form.txt @@ -0,0 +1,3 @@ +====== Диспечер на абонаменти ====== + +Страницата ви позволява да управлявате текущите си абонаменти за страници и именни пространства. \ No newline at end of file diff --git a/inc/lang/bg/subscr_list.txt b/inc/lang/bg/subscr_list.txt new file mode 100644 index 0000000..1e2b981 --- /dev/null +++ b/inc/lang/bg/subscr_list.txt @@ -0,0 +1,12 @@ +Здравейте! + +Променени са страници от именното пространство @PAGE@ от @TITLE@ wiki. +Ето променените страници: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите +@SUBSCRIBE@ +и да прекратите абонамента за промени по страницата или именното пространство. diff --git a/inc/lang/bg/subscr_single.txt b/inc/lang/bg/subscr_single.txt new file mode 100644 index 0000000..36b2df3 --- /dev/null +++ b/inc/lang/bg/subscr_single.txt @@ -0,0 +1,18 @@ +Здравейте! + +Страницата @PAGE@ в @TITLE@ wiki е променена. +Промените са по-долу: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Дата : @DATE@ +Потребител : @USER@ +Обобщение: @SUMMARY@ +Стара версия: @OLDPAGE@ +Нова версия: @NEWPAGE@ + +Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите +@SUBSCRIBE@ +и да прекратите абонамента за промени по страницата или именното пространство. diff --git a/inc/lang/bg/updateprofile.txt b/inc/lang/bg/updateprofile.txt new file mode 100644 index 0000000..6113f0d --- /dev/null +++ b/inc/lang/bg/updateprofile.txt @@ -0,0 +1,3 @@ +====== Обновете профила си ====== + +Трябва само да допълните полетата, които искате да промените. Потребителското не може да бъде променяно. diff --git a/inc/lang/bg/uploadmail.txt b/inc/lang/bg/uploadmail.txt new file mode 100644 index 0000000..0c14437 --- /dev/null +++ b/inc/lang/bg/uploadmail.txt @@ -0,0 +1,10 @@ +Качен е файл на вашето DokuWiki. Ето детайлите + +Файл : @MEDIA@ +Дата : @DATE@ +Браузър : @BROWSER@ +IP адрес : @IPADDRESS@ +Име на хоста : @HOSTNAME@ +Размер : @SIZE@ +MIME тип : @MIME@ +Потребител : @USER@ diff --git a/inc/lang/bn/admin.txt b/inc/lang/bn/admin.txt new file mode 100644 index 0000000..6b8dd94 --- /dev/null +++ b/inc/lang/bn/admin.txt @@ -0,0 +1,3 @@ +====== প্রশাসন ====== + +আপনি DokuWiki পাওয়া প্রশাসনিক কাজগুলো একটি তালিকা পেতে পারেন নীচে. diff --git a/inc/lang/bn/adminplugins.txt b/inc/lang/bn/adminplugins.txt new file mode 100644 index 0000000..c491ff9 --- /dev/null +++ b/inc/lang/bn/adminplugins.txt @@ -0,0 +1 @@ +===== অতিরিক্ত প্লাগইন ===== \ No newline at end of file diff --git a/inc/lang/bn/backlinks.txt b/inc/lang/bn/backlinks.txt new file mode 100644 index 0000000..3e455c9 --- /dev/null +++ b/inc/lang/bn/backlinks.txt @@ -0,0 +1,3 @@ +====== ব্যাকলিঙ্কগুলি ====== + +এই বর্তমান পৃষ্ঠায় ফিরে সংযোগ আছে বলে মনে হচ্ছে যে পেজের একটি তালিকা. diff --git a/inc/lang/bn/conflict.txt b/inc/lang/bn/conflict.txt new file mode 100644 index 0000000..684b5e6 --- /dev/null +++ b/inc/lang/bn/conflict.txt @@ -0,0 +1,5 @@ +====== একটি নতুন সংস্করণ উপস্থিত ====== + +আপনি সম্পাদিত ডকুমেন্টের একটি নতুন সংস্করণ বিদ্যমান. আপনি এটি সম্পাদনা যখন অন্য ব্যবহারকারীর নথি পরিবর্তিত যখন এটি হয়. + +পুঙ্খানুপুঙ্খভাবে নিচে দেখানো পার্থক্য পরীক্ষা, তারপর রাখা যা সংস্করণে ঠিক. আপনি "সংরক্ষণ" চয়ন, আপনার সংস্করণ সংরক্ষিত হবে অথবা বর্তমান সংস্করণ রাখা ''বাতিল'' হিট করুন. diff --git a/inc/lang/bn/denied.txt b/inc/lang/bn/denied.txt new file mode 100644 index 0000000..34249a2 --- /dev/null +++ b/inc/lang/bn/denied.txt @@ -0,0 +1,3 @@ +====== অনুমতি অস্বীকার ===== + +দুঃখিত, আপনি কি এগিয়ে যেতে যথেষ্ট অধিকার নেই. diff --git a/inc/lang/bn/diff.txt b/inc/lang/bn/diff.txt new file mode 100644 index 0000000..420c239 --- /dev/null +++ b/inc/lang/bn/diff.txt @@ -0,0 +1,3 @@ +====== পার্থক্য ====== + +এর মানে আপনি পৃষ্ঠার দুটি সংস্করণের মধ্যে পার্থক্য দেখায়. diff --git a/inc/lang/bn/draft.txt b/inc/lang/bn/draft.txt new file mode 100644 index 0000000..7d089f8 --- /dev/null +++ b/inc/lang/bn/draft.txt @@ -0,0 +1,5 @@ +====== খসড়া ফাইল ====== পাওয়া + +এই পৃষ্ঠাতে আপনার সর্বশেষ সম্পাদনা সময় সঠিকভাবে সম্পন্ন করা হয় নি. DokuWiki স্বয়ংক্রিয়ভাবে আপনি এখন আপনার সম্পাদনা চালিয়ে যেতে ব্যবহার করতে পারেন যা আপনার কাজ করার সময় একটি খসড়া সংরক্ষিত. আপনি আপনার শেষ সময় থেকে সংরক্ষিত ছিল যে তথ্য দেখতে পারেন নিচে. + +আপনি / /ফিরাইয়া আনা / / আপনার হারিয়ে সম্পাদনা সময়, / / মুছে দিন / / স্বতঃসংরক্ষিত খসড়া অথবা / / বাতিল / / সম্পাদনা প্রক্রিয়া পুনরুদ্ধার করতে চান তা স্থির করুন. diff --git a/inc/lang/bn/edit.txt b/inc/lang/bn/edit.txt new file mode 100644 index 0000000..c29b20a --- /dev/null +++ b/inc/lang/bn/edit.txt @@ -0,0 +1 @@ +পাতা সম্পাদনা করুন এবং ''সংরক্ষণ'' আঘাত. দেখুন [[wiki:syntax]] উইকি সিনট্যাক্স জন্য. আপনি এটি **উন্নত** করতে পারেন শুধুমাত্র যদি পাতাটি সম্পাদনা করুন. আপনি কিছু কিছু বিষয় পরীক্ষা আপনার প্রথম পদক্ষেপ করা শিখতে চান [[playground:playground|খেলার মাঠ]]. diff --git a/inc/lang/bn/editrev.txt b/inc/lang/bn/editrev.txt new file mode 100644 index 0000000..17eed55 --- /dev/null +++ b/inc/lang/bn/editrev.txt @@ -0,0 +1,2 @@ +**আপনি নথির একটি পুরোনো সংস্করণ লোড করেছেন!** যদি আপনি এটি সংরক্ষণ করেন, আপনি এই তথ্য দিয়ে একটি নতুন সংস্করণ তৈরি করবে. +---- diff --git a/inc/lang/bn/index.txt b/inc/lang/bn/index.txt new file mode 100644 index 0000000..346cb9c --- /dev/null +++ b/inc/lang/bn/index.txt @@ -0,0 +1,3 @@ +====== সাইটম্যাপ ====== + +এই দ্বারা আদেশ সমস্ত উপলব্ধ পৃষ্ঠাগুলি উপর একটি সাইট ম্যাপ হল [[Doku> নামব্যবধান | নামব্যবধান]]. diff --git a/inc/lang/bn/lang.php b/inc/lang/bn/lang.php new file mode 100644 index 0000000..fb32325 --- /dev/null +++ b/inc/lang/bn/lang.php @@ -0,0 +1,228 @@ + + * @author Foysol + * @author ninetailz + * @author Khan M. B. Asad + */ +$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['search_fullresults'] = 'পূর্ণলেখা ফলাফল'; +$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['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'] = 'আমি এই উইকি থেকে আমার অ্যাকাউন্ট অপসারণ করতে ইচ্ছুক.
    এই ক্রিয়াটি পূর্বাবস্থায় ফেরানো যায় না.'; +$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['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://get.adobe.com/flashplayer"> অ্যাডোবি ফ্ল্যাশ প্লাগইন এই সামগ্রী প্রদর্শন করার জন্য প্রয়োজন হয়.'; +$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/inc/lang/ca-valencia/admin.txt b/inc/lang/ca-valencia/admin.txt new file mode 100644 index 0000000..f2b4347 --- /dev/null +++ b/inc/lang/ca-valencia/admin.txt @@ -0,0 +1,3 @@ +====== Administració ====== + +Baix pot trobar una llista de tasques administratives disponibles en DokuWiki. diff --git a/inc/lang/ca-valencia/adminplugins.txt b/inc/lang/ca-valencia/adminplugins.txt new file mode 100644 index 0000000..010701e --- /dev/null +++ b/inc/lang/ca-valencia/adminplugins.txt @@ -0,0 +1 @@ +===== Plugins adicionals ===== diff --git a/inc/lang/ca-valencia/backlinks.txt b/inc/lang/ca-valencia/backlinks.txt new file mode 100644 index 0000000..bd7fde8 --- /dev/null +++ b/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/inc/lang/ca-valencia/conflict.txt b/inc/lang/ca-valencia/conflict.txt new file mode 100644 index 0000000..2eb1faf --- /dev/null +++ b/inc/lang/ca-valencia/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/ca-valencia/denied.txt b/inc/lang/ca-valencia/denied.txt new file mode 100644 index 0000000..90688ac --- /dev/null +++ b/inc/lang/ca-valencia/denied.txt @@ -0,0 +1,3 @@ +====== Permís denegat ====== + +Disculpe, pero no té permís per a continuar. diff --git a/inc/lang/ca-valencia/diff.txt b/inc/lang/ca-valencia/diff.txt new file mode 100644 index 0000000..96eb31c --- /dev/null +++ b/inc/lang/ca-valencia/diff.txt @@ -0,0 +1,3 @@ +====== Diferències ====== + +Ací es mostren les diferències entre dos versions de la pàgina. diff --git a/inc/lang/ca-valencia/draft.txt b/inc/lang/ca-valencia/draft.txt new file mode 100644 index 0000000..1436dd9 --- /dev/null +++ b/inc/lang/ca-valencia/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/ca-valencia/edit.txt b/inc/lang/ca-valencia/edit.txt new file mode 100644 index 0000000..cdfa125 --- /dev/null +++ b/inc/lang/ca-valencia/edit.txt @@ -0,0 +1 @@ +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/inc/lang/ca-valencia/editrev.txt b/inc/lang/ca-valencia/editrev.txt new file mode 100644 index 0000000..54feb3b --- /dev/null +++ b/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/inc/lang/ca-valencia/index.txt b/inc/lang/ca-valencia/index.txt new file mode 100644 index 0000000..969f1d4 --- /dev/null +++ b/inc/lang/ca-valencia/index.txt @@ -0,0 +1,3 @@ +====== Índex ====== + +Un índex de totes les pàgines disponibles ordenades per [[doku>ca:namespaces|espais de noms]]. diff --git a/inc/lang/ca-valencia/install.html b/inc/lang/ca-valencia/install.html new file mode 100644 index 0000000..85b3e12 --- /dev/null +++ b/inc/lang/ca-valencia/install.html @@ -0,0 +1,7 @@ +

    Esta pàgina l'ajudarà en la primera instalació i configuració de Dokuwiki. N'hi ha més informació de l'instalador disponible en la pàgina de documentació.

    + +

    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 deu 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).

    + +

    L'instali·lador configurarà ACL 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ó.

    + +

    Els usuaris experimentats o en necessitats especials de configuració deuen utilitzar estos vínculs per a informació referent a instruccions d'instalació i ajusts de configuració.

    diff --git a/inc/lang/ca-valencia/lang.php b/inc/lang/ca-valencia/lang.php new file mode 100644 index 0000000..6cefa25 --- /dev/null +++ b/inc/lang/ca-valencia/lang.php @@ -0,0 +1,223 @@ + + * @author Bernat Arlandis + * + */ +$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 plúgin d\'Adobe Flash 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 +instruccions d\'instalació de Dokuwiki completes'; +$lang['i_funcna'] = 'La funció de PHP %s 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 %s és menor que +la %s que es necessita. Necessita actualitzar PHP.'; +$lang['i_permfail'] = 'DokuWiki no pot escriure en %s. ¡Necessita arreglar els permissos d\'este directori!'; +$lang['i_confexists'] = '%s ya existix'; +$lang['i_writeerr'] = 'No es pot crear %s. Haurà de comprovar els permissos del directori/archiu i crear manualment l\'arxiu.'; +$lang['i_badhash'] = 'dokuwiki.php substituït o modificat (hash=%s)'; +$lang['i_badval'] = '%s - valor illegal o buit'; +$lang['i_success'] = 'La configuració ha finalisat correctament. Ya pot borrar l\'arxiu install.php. Passe al +nou DokuWiki.'; +$lang['i_failure'] = 'Han aparegut alguns erros escrivint els archius de configuració. Deurà arreglar-los manualment abans de que +puga utilisar el nou DokuWiki.'; +$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 %s. També pot vore els canvis recents en el wiki sancer.'; +$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/inc/lang/ca-valencia/locked.txt b/inc/lang/ca-valencia/locked.txt new file mode 100644 index 0000000..bdb2bdf --- /dev/null +++ b/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/inc/lang/ca-valencia/login.txt b/inc/lang/ca-valencia/login.txt new file mode 100644 index 0000000..fb58a7c --- /dev/null +++ b/inc/lang/ca-valencia/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ca-valencia/mailtext.txt b/inc/lang/ca-valencia/mailtext.txt new file mode 100644 index 0000000..b9de236 --- /dev/null +++ b/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/inc/lang/ca-valencia/newpage.txt b/inc/lang/ca-valencia/newpage.txt new file mode 100644 index 0000000..9ca2534 --- /dev/null +++ b/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/inc/lang/ca-valencia/norev.txt b/inc/lang/ca-valencia/norev.txt new file mode 100644 index 0000000..d3239bd --- /dev/null +++ b/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. diff --git a/inc/lang/ca-valencia/password.txt b/inc/lang/ca-valencia/password.txt new file mode 100644 index 0000000..d9a781e --- /dev/null +++ b/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/inc/lang/ca-valencia/preview.txt b/inc/lang/ca-valencia/preview.txt new file mode 100644 index 0000000..1a3439b --- /dev/null +++ b/inc/lang/ca-valencia/preview.txt @@ -0,0 +1,3 @@ +====== Previsualisació ====== + +Açò es una previsualització per a vore cóm quedarà la pàgina. **Recorde que encara no està guardada**! diff --git a/inc/lang/ca-valencia/pwconfirm.txt b/inc/lang/ca-valencia/pwconfirm.txt new file mode 100644 index 0000000..2c10050 --- /dev/null +++ b/inc/lang/ca-valencia/pwconfirm.txt @@ -0,0 +1,9 @@ +¡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/inc/lang/ca-valencia/read.txt b/inc/lang/ca-valencia/read.txt new file mode 100644 index 0000000..1095141 --- /dev/null +++ b/inc/lang/ca-valencia/read.txt @@ -0,0 +1 @@ +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/inc/lang/ca-valencia/recent.txt b/inc/lang/ca-valencia/recent.txt new file mode 100644 index 0000000..9425a32 --- /dev/null +++ b/inc/lang/ca-valencia/recent.txt @@ -0,0 +1,3 @@ +====== Canvis recents ====== + +Les següents pàgines han canviat recentment: diff --git a/inc/lang/ca-valencia/register.txt b/inc/lang/ca-valencia/register.txt new file mode 100644 index 0000000..27da895 --- /dev/null +++ b/inc/lang/ca-valencia/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ca-valencia/registermail.txt b/inc/lang/ca-valencia/registermail.txt new file mode 100644 index 0000000..02f2c1a --- /dev/null +++ b/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/inc/lang/ca-valencia/resendpwd.txt b/inc/lang/ca-valencia/resendpwd.txt new file mode 100644 index 0000000..bf620b0 --- /dev/null +++ b/inc/lang/ca-valencia/resendpwd.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ca-valencia/revisions.txt b/inc/lang/ca-valencia/revisions.txt new file mode 100644 index 0000000..3cdf0d4 --- /dev/null +++ b/inc/lang/ca-valencia/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ca-valencia/searchpage.txt b/inc/lang/ca-valencia/searchpage.txt new file mode 100644 index 0000000..3bb250f --- /dev/null +++ b/inc/lang/ca-valencia/searchpage.txt @@ -0,0 +1,3 @@ +====== Buscar ====== + +Pot vore els resultats de la busca ací baix. @CREATEPAGEINFO@ diff --git a/inc/lang/ca-valencia/showrev.txt b/inc/lang/ca-valencia/showrev.txt new file mode 100644 index 0000000..86f2822 --- /dev/null +++ b/inc/lang/ca-valencia/showrev.txt @@ -0,0 +1,2 @@ +**¡Açò és una versió antiga del document!** +---- diff --git a/inc/lang/ca-valencia/stopwords.txt b/inc/lang/ca-valencia/stopwords.txt new file mode 100644 index 0000000..5579686 --- /dev/null +++ b/inc/lang/ca-valencia/stopwords.txt @@ -0,0 +1,74 @@ +# 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é +www diff --git a/inc/lang/ca-valencia/updateprofile.txt b/inc/lang/ca-valencia/updateprofile.txt new file mode 100644 index 0000000..9aa6222 --- /dev/null +++ b/inc/lang/ca-valencia/updateprofile.txt @@ -0,0 +1,3 @@ +====== Actualise el seu perfil ====== + +Només deu completar els camps que vol canviar. No es pot canviar el nom d'usuari. diff --git a/inc/lang/ca-valencia/uploadmail.txt b/inc/lang/ca-valencia/uploadmail.txt new file mode 100644 index 0000000..a67397d --- /dev/null +++ b/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/inc/lang/ca/admin.txt b/inc/lang/ca/admin.txt new file mode 100644 index 0000000..9344cad --- /dev/null +++ b/inc/lang/ca/admin.txt @@ -0,0 +1,3 @@ +====== Administració ====== + +Heus ací una llista de les tasques administratives disponibles en DokuWiki. diff --git a/inc/lang/ca/adminplugins.txt b/inc/lang/ca/adminplugins.txt new file mode 100644 index 0000000..9ea165c --- /dev/null +++ b/inc/lang/ca/adminplugins.txt @@ -0,0 +1 @@ +===== Connectors addicionals ===== \ No newline at end of file diff --git a/inc/lang/ca/backlinks.txt b/inc/lang/ca/backlinks.txt new file mode 100644 index 0000000..663288e --- /dev/null +++ b/inc/lang/ca/backlinks.txt @@ -0,0 +1,3 @@ +====== Enllaços ====== + +Heus ací una llista de pàgines enllaçades amb la pàgina actual. diff --git a/inc/lang/ca/conflict.txt b/inc/lang/ca/conflict.txt new file mode 100644 index 0000000..d1e23c5 --- /dev/null +++ b/inc/lang/ca/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/ca/denied.txt b/inc/lang/ca/denied.txt new file mode 100644 index 0000000..38be219 --- /dev/null +++ b/inc/lang/ca/denied.txt @@ -0,0 +1,3 @@ +====== Permís denegat ====== + +No teniu prou drets per continuar. diff --git a/inc/lang/ca/diff.txt b/inc/lang/ca/diff.txt new file mode 100644 index 0000000..f591116 --- /dev/null +++ b/inc/lang/ca/diff.txt @@ -0,0 +1,3 @@ +====== Diferències ====== + +Ací es mostren les diferències entre la revisió seleccionada i la versió actual de la pàgina. diff --git a/inc/lang/ca/draft.txt b/inc/lang/ca/draft.txt new file mode 100644 index 0000000..535e57f --- /dev/null +++ b/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ó. diff --git a/inc/lang/ca/edit.txt b/inc/lang/ca/edit.txt new file mode 100644 index 0000000..bbe5ae6 --- /dev/null +++ b/inc/lang/ca/edit.txt @@ -0,0 +1 @@ +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/inc/lang/ca/editrev.txt b/inc/lang/ca/editrev.txt new file mode 100644 index 0000000..b2f304c --- /dev/null +++ b/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/inc/lang/ca/index.txt b/inc/lang/ca/index.txt new file mode 100644 index 0000000..e2a70ad --- /dev/null +++ b/inc/lang/ca/index.txt @@ -0,0 +1,3 @@ +====== Índex ====== + +Heus ací un índex de totes les pàgines disponibles, ordenades per [[doku>ca:namespaces|espais]]. diff --git a/inc/lang/ca/install.html b/inc/lang/ca/install.html new file mode 100644 index 0000000..659e07a --- /dev/null +++ b/inc/lang/ca/install.html @@ -0,0 +1,7 @@ +

    Aquesta pàgina us ajuda a fer la primera instal·lació i la configuració de Dokuwiki. Hi ha més informació sobre aquest instal·lador en la seva pàgina de documentació.

    + +

    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 necessita 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).

    + +

    Aquest instal·lador configurarà el vostre DokuWiki per a ACL, 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.

    + +

    Els usuaris experts o els que tinguin requeriments específics poden utilitzar els enllaços següents per a obtenir més detalls sobre instruccions d'instal·lació i paràmetres de configuració.

    diff --git a/inc/lang/ca/jquery.ui.datepicker.js b/inc/lang/ca/jquery.ui.datepicker.js new file mode 100644 index 0000000..bca86de --- /dev/null +++ b/inc/lang/ca/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Inicialització en català per a l'extensió 'UI date picker' per jQuery. */ +/* Writers: (joan.leon@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/ca/lang.php b/inc/lang/ca/lang.php new file mode 100644 index 0000000..d9cdd8b --- /dev/null +++ b/inc/lang/ca/lang.php @@ -0,0 +1,373 @@ + + * @author Marc Zulet + * @author Joan + * @author David Surroca + * @author Adolfo Jayme Barrientos + * @author Carles Bellver + * @author daniel + * @author Eduard Díaz + * @author controlonline.net + * @author Pauet + * @author Àngel Pérez Beroy + */ +$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 el codi font'; +$lang['btn_show'] = 'Mostra la 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'] = 'Gestor multimèdia'; +$lang['btn_deleteuser'] = 'Suprimeix el meu 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'] = 'Contrasenya nova'; +$lang['oldpass'] = 'Confirmeu la contrasenya actual'; +$lang['passchk'] = 'una altra vegada'; +$lang['remember'] = 'Recorda’m'; +$lang['fullname'] = 'Nom complet'; +$lang['email'] = 'Adreça electrònica'; +$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['searchcreatepage'] = 'Si no heu trobat el que cercàveu, podeu crear o editar la pàgina %s, el nom de la qual deriva de la vostra consulta.'; +$lang['search_fullresults'] = 'Resultats de text complet'; +$lang['js']['search_toggle_tools'] = 'Commuta les eines de cerca'; +$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['js']['data_insecure'] = 'ADVERTÈNCIA: Sembla que el vostre directori de dades no està degudament protegit. Si us plau, llegiu sobre Seguretat de l\'Accés Web a DokuWiki.'; +$lang['search_exact_match'] = 'Coincidència exacta'; +$lang['search_starts_with'] = 'Comença per'; +$lang['search_ends_with'] = 'Termina per'; +$lang['search_contains'] = 'Conté'; +$lang['search_custom_match'] = 'Personalitzat'; +$lang['search_any_ns'] = 'Qualsevol espai de noms'; +$lang['search_any_time'] = 'Qualsevol temps'; +$lang['search_past_7_days'] = 'La setmana passada'; +$lang['search_past_month'] = 'El mes passat'; +$lang['search_past_year'] = 'L’any passat'; +$lang['search_sort_by_hits'] = 'Ordena per visites'; +$lang['search_sort_by_mtime'] = 'Ordena per darrera modificació'; +$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.
    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['allowedmime'] = 'Llista d\'extensions permeses'; +$lang['lockedby'] = 'Actualment blocat per:'; +$lang['lockexpire'] = 'Venciment del blocatge:'; +$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['unknowndate'] = 'Data desconeguda'; +$lang['noflash'] = 'Per a visualitzar aquest contingut necessiteu el connector d\'Adobe Flash.'; +$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'] = 'pàgines canviades a l’espai 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 instruccions d\'instal·lació de Dokuwiki completes'; +$lang['i_funcna'] = 'La funció PHP %s no està disponible. Potser el vostre proveïdor de serveis l\'ha inhabilitada per alguna raó'; +$lang['i_disabled'] = 'El vostre proveïdor l\'ha desactivat.'; +$lang['i_funcnmail'] = 'Nota: La funció de correu PHP no està disponible. %s Si es manté no disponible, podeu instal·lar el connector smtp.'; +$lang['i_phpver'] = 'La vostra versió de PHP %s és inferior a la requerida %s. 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_urandom'] = 'DokuWiki no pot crear números criptogràficament segurs per a les galetes. És possible que vulgueu comprovar la vostra configuració d\'open_basedir al php.ini per un accés correcte a /dev/urandom.'; +$lang['i_permfail'] = 'DokuWiki no pot escriure %s. Heu d\'arreglar els permisos d\'aquest directori'; +$lang['i_confexists'] = '%s ja existeix'; +$lang['i_writeerr'] = 'No es pot crear %s. Comproveu els permisos del directori i/o del fitxer i creeu el fitxer manualment.'; +$lang['i_badhash'] = 'dokuwiki.php no reconegut o modificat (hash=%s)'; +$lang['i_badval'] = '%s - valor il·legal o buit'; +$lang['i_success'] = 'La configuració s\'ha acabat amb èxit. Ara podeu suprimir el fitxer install.php. Aneu al vostre nou DokuWiki.'; +$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 vostre nou DokuWiki.'; +$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 %s. També podeu veure els canvis recents de tot el wiki.'; +$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['email_fail'] = 'Falta el correu PHP () o està desactivat. No s\'ha enviat el correu electrònic següent:'; +$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 %s.'; +$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@'; +$lang['log_file_too_large'] = 'Fitxer de log massa gran. Linies anteriors ignorades!'; diff --git a/inc/lang/ca/locked.txt b/inc/lang/ca/locked.txt new file mode 100644 index 0000000..93487c2 --- /dev/null +++ b/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/inc/lang/ca/login.txt b/inc/lang/ca/login.txt new file mode 100644 index 0000000..579d422 --- /dev/null +++ b/inc/lang/ca/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ca/mailtext.txt b/inc/lang/ca/mailtext.txt new file mode 100644 index 0000000..dd7f0c5 --- /dev/null +++ b/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/inc/lang/ca/mailwrap.html b/inc/lang/ca/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/ca/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/ca/newpage.txt b/inc/lang/ca/newpage.txt new file mode 100644 index 0000000..6f2c0a8 --- /dev/null +++ b/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/inc/lang/ca/norev.txt b/inc/lang/ca/norev.txt new file mode 100644 index 0000000..7c999fc --- /dev/null +++ b/inc/lang/ca/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ca/onceexisted.txt b/inc/lang/ca/onceexisted.txt new file mode 100644 index 0000000..f49230a --- /dev/null +++ b/inc/lang/ca/onceexisted.txt @@ -0,0 +1,3 @@ +======= Aquesta pàgina ja no existeix ====== + +Heu seguit un enllaç a una pàgina que ja no existeix. Podeu consultar la llista de **old revisions** per veure quan i per què es va suprimir, accedir a les revisions antigues o restaurar-la. diff --git a/inc/lang/ca/password.txt b/inc/lang/ca/password.txt new file mode 100644 index 0000000..d4bd9f9 --- /dev/null +++ b/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/inc/lang/ca/preview.txt b/inc/lang/ca/preview.txt new file mode 100644 index 0000000..d9b8088 --- /dev/null +++ b/inc/lang/ca/preview.txt @@ -0,0 +1,3 @@ +====== Previsualització ====== + +Heus ací una previsualització del vostre text. **Recordeu que encara no l'heu desat**! diff --git a/inc/lang/ca/pwconfirm.txt b/inc/lang/ca/pwconfirm.txt new file mode 100644 index 0000000..38c9dd1 --- /dev/null +++ b/inc/lang/ca/pwconfirm.txt @@ -0,0 +1,9 @@ +¡Hola @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/inc/lang/ca/read.txt b/inc/lang/ca/read.txt new file mode 100644 index 0000000..46c65f6 --- /dev/null +++ b/inc/lang/ca/read.txt @@ -0,0 +1 @@ +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/inc/lang/ca/recent.txt b/inc/lang/ca/recent.txt new file mode 100644 index 0000000..3ee00ee --- /dev/null +++ b/inc/lang/ca/recent.txt @@ -0,0 +1,3 @@ +====== Canvis recents ====== + +Les pàgines següents s'han modificat recentment: diff --git a/inc/lang/ca/register.txt b/inc/lang/ca/register.txt new file mode 100644 index 0000000..2fe375f --- /dev/null +++ b/inc/lang/ca/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ca/registermail.txt b/inc/lang/ca/registermail.txt new file mode 100644 index 0000000..a15351a --- /dev/null +++ b/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/inc/lang/ca/resendpwd.txt b/inc/lang/ca/resendpwd.txt new file mode 100644 index 0000000..04e9304 --- /dev/null +++ b/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. diff --git a/inc/lang/ca/resetpwd.txt b/inc/lang/ca/resetpwd.txt new file mode 100644 index 0000000..4f2797b --- /dev/null +++ b/inc/lang/ca/resetpwd.txt @@ -0,0 +1,3 @@ +===== Establiu una nova contrasenya ===== + +Introdueixi una nova contrasenya pel seu compte a aquest wiki. diff --git a/inc/lang/ca/revisions.txt b/inc/lang/ca/revisions.txt new file mode 100644 index 0000000..9fe6b4b --- /dev/null +++ b/inc/lang/ca/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ca/searchpage.txt b/inc/lang/ca/searchpage.txt new file mode 100644 index 0000000..7c8465b --- /dev/null +++ b/inc/lang/ca/searchpage.txt @@ -0,0 +1,3 @@ +====== Cerca ====== + +Heus ací els resultats de la cerca. @CREATEPAGEINFO@ diff --git a/inc/lang/ca/showrev.txt b/inc/lang/ca/showrev.txt new file mode 100644 index 0000000..b141182 --- /dev/null +++ b/inc/lang/ca/showrev.txt @@ -0,0 +1,2 @@ +**Aquesta és una revisió antiga del document** +---- diff --git a/inc/lang/ca/stopwords.txt b/inc/lang/ca/stopwords.txt new file mode 100644 index 0000000..73abf4a --- /dev/null +++ b/inc/lang/ca/stopwords.txt @@ -0,0 +1,107 @@ +# 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 +www diff --git a/inc/lang/ca/subscr_digest.txt b/inc/lang/ca/subscr_digest.txt new file mode 100644 index 0000000..c5666d2 --- /dev/null +++ b/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/inc/lang/ca/subscr_form.txt b/inc/lang/ca/subscr_form.txt new file mode 100644 index 0000000..3c63ce6 --- /dev/null +++ b/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/inc/lang/ca/subscr_list.txt b/inc/lang/ca/subscr_list.txt new file mode 100644 index 0000000..56b9ee9 --- /dev/null +++ b/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/inc/lang/ca/subscr_single.txt b/inc/lang/ca/subscr_single.txt new file mode 100644 index 0000000..a1711f2 --- /dev/null +++ b/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/inc/lang/ca/updateprofile.txt b/inc/lang/ca/updateprofile.txt new file mode 100644 index 0000000..680a20b --- /dev/null +++ b/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. diff --git a/inc/lang/ca/uploadmail.txt b/inc/lang/ca/uploadmail.txt new file mode 100644 index 0000000..01b7648 --- /dev/null +++ b/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/inc/lang/ckb/admin.txt b/inc/lang/ckb/admin.txt new file mode 100644 index 0000000..78b3003 --- /dev/null +++ b/inc/lang/ckb/admin.txt @@ -0,0 +1,3 @@ +====== بەڕێوەبرایەتی====== + +لێرە پێرستێک لە ئەرکەکانی بەرێوەبەری دۆکوویکی دیبینن \ No newline at end of file diff --git a/inc/lang/ckb/adminplugins.txt b/inc/lang/ckb/adminplugins.txt new file mode 100644 index 0000000..f554923 --- /dev/null +++ b/inc/lang/ckb/adminplugins.txt @@ -0,0 +1 @@ +=====زیادکراوەکان ===== \ No newline at end of file diff --git a/inc/lang/ckb/backlinks.txt b/inc/lang/ckb/backlinks.txt new file mode 100644 index 0000000..594f311 --- /dev/null +++ b/inc/lang/ckb/backlinks.txt @@ -0,0 +1,3 @@ +====== پەیوەندی گڕاوە ====== + +لێرە پێرستێک لە پەڕەکان کە لکاوەن بەم پەڕە دەبینن \ No newline at end of file diff --git a/inc/lang/ckb/conflict.txt b/inc/lang/ckb/conflict.txt new file mode 100644 index 0000000..8f0f7a2 --- /dev/null +++ b/inc/lang/ckb/conflict.txt @@ -0,0 +1,4 @@ +====== وشانێکی نوێ لە بەردەستە ====== +وشانیک لە بابەتەکانی ئێوە کە دەستکاریتان کردووە هەیە +ئەم ڕووداوە کاتیک ڕوودەدا کە بەکارهێنێرەک کاتێک ئێوە دەستکاریتان دەکرد بابەتی گۆڕدراوە. +جیاوازییەکانی خوارەوە هەڵسەنگێنن و بزانن کام وشان بهێڵنەوە، گەر دوکمەی"پاشکەوت" کرتە بکەن وشانی ئێوە پاشکەوت دەکرێت، گەریش دوکمەی"هەڵوەشاندن" کرتە بکەن وشانی ئێستا دەمێنێتەوە \ No newline at end of file diff --git a/inc/lang/ckb/denied.txt b/inc/lang/ckb/denied.txt new file mode 100644 index 0000000..cbe7b6e --- /dev/null +++ b/inc/lang/ckb/denied.txt @@ -0,0 +1,2 @@ +====== دەستپێگەیشتن رێگەی پێنەدراوە ====== +بەداخەوە بۆ ئەم پەڕە رێگەتان پێنەدراوە \ No newline at end of file diff --git a/inc/lang/ckb/diff.txt b/inc/lang/ckb/diff.txt new file mode 100644 index 0000000..70f31ea --- /dev/null +++ b/inc/lang/ckb/diff.txt @@ -0,0 +1,3 @@ +====== جیاوازییەکان====== + +جیاوازی دوو وشان لەم پەڕە دەبینن \ No newline at end of file diff --git a/inc/lang/ckb/draft.txt b/inc/lang/ckb/draft.txt new file mode 100644 index 0000000..be09204 --- /dev/null +++ b/inc/lang/ckb/draft.txt @@ -0,0 +1,4 @@ +====== ڕەشنووس دۆزرایەوە ====== +دوا دانیشتنی دەستکاریکردنت لەسەر ئەم لاپەڕەیە بە دروستی تەواو نەکرا. DokuWiki بە شێوەیەکی خۆکار ڕەشنووسێکی هەڵگرت لە کاتی کارەکەت کە لەوانەیە ئێستا بەکاری بهێنیت بۆ بەردەوام بوون لە بژارکردنەکەت. لە خوارەوە دەتوانیت ئەو داتایە ببینیت کە هەڵگیراوە لە دوا دانیشتنی خۆت. + +تکایە بڕیار بدە ئەگەر دەتەوێت //recover// دانیشتنی گۆڕانکاری لەدەست چووت، //سڕینەوە// ڕەشنووسی پاشەکەوتکراوی خۆکار یان//هەڵوەشانەوە//پرۆسەی بژارکردن. \ No newline at end of file diff --git a/inc/lang/ckb/edit.txt b/inc/lang/ckb/edit.txt new file mode 100644 index 0000000..f675c25 --- /dev/null +++ b/inc/lang/ckb/edit.txt @@ -0,0 +1 @@ +دەستکاری پەڕەکە بکە و لێیبدە ''هەڵگرتن'. بڕوانە [[wiki:syntax]] بۆ ڕستەسازی ویکی. تکایە دەستکاری لاپەڕەکە بکە تەنها ئەگەر بتوانیت **باشتری بکەیت** ئەگەر دەتەوێت هەندێک شت تاقی بکەیتەوە، فێربە کە یەکەم هەنگاوت لە شوێنی یاریگا:شوێنی یاری[[playground:playground|playground]]. \ No newline at end of file diff --git a/inc/lang/ckb/editrev.txt b/inc/lang/ckb/editrev.txt new file mode 100644 index 0000000..4136075 --- /dev/null +++ b/inc/lang/ckb/editrev.txt @@ -0,0 +1 @@ +**ئێوە وشانێکی کۆنە دەبینن!** گەر ئەم وشانە پاشکەوت بکەن، ئێوە وشانێکی نوێ بەم ناوەڕۆکەتان دروستکردووە! \ No newline at end of file diff --git a/inc/lang/ckb/index.txt b/inc/lang/ckb/index.txt new file mode 100644 index 0000000..b82bc57 --- /dev/null +++ b/inc/lang/ckb/index.txt @@ -0,0 +1,3 @@ +====== نەخشەی ماڵپەڕ====== + +ئەم پەڕە بریتییە لە تەواو پەڕەکانی هەبووە بە ڕیزبەندی [[doku>namespaces|بۆشایی ناوەکان]] ــە. \ No newline at end of file diff --git a/inc/lang/ckb/lang.php b/inc/lang/ckb/lang.php new file mode 100644 index 0000000..6458b2d --- /dev/null +++ b/inc/lang/ckb/lang.php @@ -0,0 +1,364 @@ + + * @author Wrya + */ +$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['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 تەنها لە 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['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'] = 'من دەمەوێت ئەژمێرەکەم لەم ویکییە لاببەم.
    ئەم کردارە ناتوانرێت هەڵوەشرێتەوە.'; +$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['allowedmime'] = 'لیستی درێژکراوەکانی فایلی ڕێگەپێدراو'; +$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'] = 'زیادکراوەی ئادۆبی فلاش پێویستە بۆ نیشاندانی ئەم ناوەڕۆکە.'; +$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'] = 'سەلماندنی بەکارهێنەر بە شێوەیەکی کاتی بەردەست نیە. ئەگەر ئەم دۆخە بەردەوام بوو، تکایە ویکی بەڕێوەبەرەکەت ی خۆت ی پێ ڕابێ.'; +$lang['i_chooselang'] = 'زمانەکەت هەڵبژێرە'; +$lang['i_installer'] = 'دامەزراندنی دۆکوویکی'; +$lang['i_wikiname'] = 'ناوی ویکی'; +$lang['i_enableacl'] = 'بەتواناکردنی ACL (پێشنیارکراوە)'; +$lang['i_superuser'] = 'سوپەربەکارهێنەر'; +$lang['i_problems'] = 'دامەزرێنەرەکە هەندێک کێشەی دۆزیەوە، کە لە خوارەوە ئاماژەی بۆ کراوە. ناتوانیت بەردەوام بیت هەتا چاکیان نەکەیت.'; +$lang['i_modified'] = 'لەبەر هۆکاری ئەمنی ئەم سکریپتە تەنها بە دامەزراندنی دۆکوویکی نوێ و نەگۆڕ کار دەکات. + پێویستە یان فایلەکان لە پاکێجی داگیراوەوە دەربهینەوه یان ڕاوێژ بە تەواوبوون بکەیت + Dokuwiki install instructions'; +$lang['i_funcna'] = 'پێڕەوی PHP %s بەردەست نییە. لەوانەیە دابینکاری میوانداریکردنەکەت لەبەر چەند هۆکارێک ناچالاک ی بکات؟'; +$lang['i_disabled'] = 'لە کارخراوە لەلایەن دابینکارەکەتەوە.'; +$lang['i_funcnmail'] = 'تێبینی: ئەرکی پۆستی PHP بەردەست نییە. %s ئەگەر بەردەست نەمایەوە، دەتوانیت smtp plugin.'; +$lang['i_phpver'] = 'وەشانی PHPی تۆ %s کەمترە لە %s. پێویستە دامەزراندنی PHP ەکەت بەرز بکەیتەوە.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload لە php.ini بۆ کارپێکردنی DokuWiki لە کارخراوە.'; +$lang['i_urandom'] = 'DokuWiki ناتوانێت ژمارە پارێزراوە نهێنیەکان بۆ کۆکیەکان دروست بکات. لەوانەیە بتەوێت سەیری ڕێکخستنەکانت بکەیت open_basedir php.ini بۆ گونجاو /dev/urandom .'; +$lang['i_permfail'] = '%s لە لایەن DokuWiki ەوە دەستکاری ناکرێت. پێویستە ڕێکبەندەکانی ڕێپێدان لەم دایەرێکتەرییە چاک بکەیت!'; +$lang['i_confexists'] = '%s پێشتر هەیە'; +$lang['i_writeerr'] = 'ناتوانێت %s دروست . پێویستە ڕێپێدانەکانی دایەرێکتۆری/فایل بپشکنی و فایلەکە بە دەستی دروست بکەیت.'; +$lang['i_badhash'] = 'dokuwiki.phpی نەناسراو یان هەموارکراو (hash=%s)'; +$lang['i_badval'] = '%s - بەهای نایاسایی یان بەتاڵ'; +$lang['i_success'] = 'شێوەپێدانەکە بە سەرکەوتوویی تەواو بوو. دەتوانیت ئێستا فایلی install.php بسڕیتەوە. بەردەوام بە لە +DokuWikiی نوێ.'; +$lang['i_failure'] = 'هەندێک هەڵە ڕوویدا لەکاتی نوسینی فایلەکانی شێوەپێدان. لەوانەیە پێویست ت بە چاککردنەوەیان بێت بە دەستی پێش + دەتوانیت DokuWikiی نوێت .'; +$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'] = 'تۆ ئێستا سەیری گۆڕانکاریەکانی ناو %s بۆشایی ناو. هەروەها دەتوانیت بینینی گۆڕانکاریەکانی ئەم دواییەی هەموو ویکی .'; +$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['email_fail'] = 'پۆستی PHP() ون بووە یان ناچالاککراوە. ئەم ئیمەیڵە نەنێردراوە: '; +$lang['currentns'] = 'بۆشایی ناوی ئێستا'; +$lang['searchresult'] = 'ئەنجامی گەڕان'; +$lang['plainhtml'] = 'HTML ی سادە'; +$lang['wikimarkup'] = 'نیشانەی ویکی'; +$lang['page_nonexist_rev'] = 'پەڕە لە %s بوونی نییە. دواتر دروست کرا لە %s.'; +$lang['unable_to_parse_date'] = 'ناتوانێت شیبکاتەوە لە پارامیتەر "%s".'; +$lang['email_signature_text'] = 'ئەم پۆستە لەلایەن دۆکوویکی دروست کراوە لە +@DOKUWIKIURL @'; diff --git a/inc/lang/ckb/locked.txt b/inc/lang/ckb/locked.txt new file mode 100644 index 0000000..d8af47e --- /dev/null +++ b/inc/lang/ckb/locked.txt @@ -0,0 +1,2 @@ +====== پەڕە قوفڵ کراوە ====== +ئەم لاپەڕەیە لە ئێستادا داخراوە بۆ دەستکاریکردن لەلایەن بەکارهێنەرێکی ترەوە. پێویستە چاوەڕێ بیت تا ئەم بەکارهێنەرە دەستکاری تەواو دەکات یان قوفڵەکە بەسەردەچێت. \ No newline at end of file diff --git a/inc/lang/ckb/login.txt b/inc/lang/ckb/login.txt new file mode 100644 index 0000000..6329a91 --- /dev/null +++ b/inc/lang/ckb/login.txt @@ -0,0 +1,2 @@ +====== چوونەژوورەوە ====== +تۆ لە ئێستادا نەچویتە ژوورەوە!خشتەکانی خوارەوە بە دروستی پڕ بکەرەوە. پێویستە کۆکیزەکانت بەتوانا بکرێت بۆ چوونە ژوورەوە. \ No newline at end of file diff --git a/inc/lang/ckb/mailtext.txt b/inc/lang/ckb/mailtext.txt new file mode 100644 index 0000000..eb0854e --- /dev/null +++ b/inc/lang/ckb/mailtext.txt @@ -0,0 +1,15 @@ +لاپەڕەیەک لە DokuWiki ی تۆ زیادکرا یان گۆڕا. وردەکارییەکان لێرەن: + +وێبگەڕ : @BROWSER@ +ناونیشانی IP : @IPADDRESS@ +ناوی خانەخوێ : @HOSTNAME@ +پێداچوونەوەی کۆن : @OLDPAGE@ +پێداچوونەوەی نوێ : @NEWPAGE@ +بەرواری پێداچوونەوەی نوێ: @DATE@ +بژارکردنی پوختە : @SUMMARY@ +بەکارهێنەر : @USER@ + +لەوانەیە گۆڕانکاری نوێتر لە دوای ئەم پێداچوونەوەیە بکرێت. ئەگەر ئەمە +ڕوو دەدات، نامەیەک لە سەرەوەی لاپەڕەی ڕێڤ پیشان دەدرێت. + +@DIFF@ \ No newline at end of file diff --git a/inc/lang/ckb/newpage.txt b/inc/lang/ckb/newpage.txt new file mode 100644 index 0000000..c8b262a --- /dev/null +++ b/inc/lang/ckb/newpage.txt @@ -0,0 +1,2 @@ +====== ئەم بابەتە هێشتا بوونی نییە ====== +تۆ دوای لینکێک کەوتی بۆ بابەتێک کە تا ئێستا بوونی نییە. ئەگەر ڕێ پێدانەکان ڕێ پێدان, تۆ لەوانەیە دروست کردن بە کرتە کردن لەسەر **دروستکردنی ئەم پەڕەیە**. \ No newline at end of file diff --git a/inc/lang/ckb/norev.txt b/inc/lang/ckb/norev.txt new file mode 100644 index 0000000..cd37f8e --- /dev/null +++ b/inc/lang/ckb/norev.txt @@ -0,0 +1,2 @@ +====== هیچ پێداچوونەوەیەکی لەم جۆرە نیە ====== +پێداچوونەوەی دیاریکراو بوونی نییە. کرتە بکە لەسەر "پێداچوونەوە کۆنەکان" بۆ لیستی پێداچوونەوە کۆنەکانی ئەم دۆکیومێنتە. \ No newline at end of file diff --git a/inc/lang/ckb/onceexisted.txt b/inc/lang/ckb/onceexisted.txt new file mode 100644 index 0000000..52f120a --- /dev/null +++ b/inc/lang/ckb/onceexisted.txt @@ -0,0 +1,2 @@ +====== ئەم پەڕەیە چیتر بوونی نیە ===== +تۆ بەدوادا چویت بۆ لینکێک بۆ لاپەڕەیەک کە چیتر بوونی نیە. دەتوانیت لیستی بپشکنی بۆ بینینی کەی و بۆچی سڕاوەتەوە، دەستگەیشتن بە پێداچوونەوە کۆنەکان یان گەڕاندنەوەی. \ No newline at end of file diff --git a/inc/lang/ckb/password.txt b/inc/lang/ckb/password.txt new file mode 100644 index 0000000..fd9fff4 --- /dev/null +++ b/inc/lang/ckb/password.txt @@ -0,0 +1,6 @@ +سڵاو @FULLNAME@! + +ئەمە بەکارهێنەرداتای تۆیە بۆ @TITLE@ لە @DOKUWIKIURL@ + +چوونەژوورەوە : @LOGIN@ +نهێنوشە : @PASSWORD@ \ No newline at end of file diff --git a/inc/lang/ckb/preview.txt b/inc/lang/ckb/preview.txt new file mode 100644 index 0000000..4edea97 --- /dev/null +++ b/inc/lang/ckb/preview.txt @@ -0,0 +1,3 @@ +======پێشبینین ===== + +ئەمە پێشبینینی ئەو شتەیە کە دەقەکەت لە چی دەچێت. ** بەبیرت بێت : هێشتا نەپارێزراوە ** ! \ No newline at end of file diff --git a/inc/lang/ckb/pwconfirm.txt b/inc/lang/ckb/pwconfirm.txt new file mode 100644 index 0000000..c4c6f95 --- /dev/null +++ b/inc/lang/ckb/pwconfirm.txt @@ -0,0 +1,9 @@ +سڵاو @FULLNAME@! + +کەسێک داوای نهێنوشەی نوێی کرد بۆ چوونەژوورەوەت @TITLE@ لە @DOKUWIKIURL@ + +ئەگەر نهێنوشەی نوێت داوا نەکردووه، تەنها ئەم ئیمەیڵە پشتگوێ بخە. + +بۆ دڵنیابوون لەوەی کە داواکاریەکە بە ڕاستی لەلایەن تۆوە نێردراوە تکایە ئەم لینکە بەکاربهێنە. + +@CONFIRM@ \ No newline at end of file diff --git a/inc/lang/ckb/read.txt b/inc/lang/ckb/read.txt new file mode 100644 index 0000000..3947064 --- /dev/null +++ b/inc/lang/ckb/read.txt @@ -0,0 +1 @@ +ئەم لاپەڕەیە تەنها دەخوێنرێتەوە. دەتوانیت سەرچاوەکە نیشان بدەی، بەڵام نابیگۆڕیت. پرسیار لە بەڕێوەبەرەکەت بکە ئەگەر وا دەزانی ئەمە هەڵەیە. \ No newline at end of file diff --git a/inc/lang/ckb/recent.txt b/inc/lang/ckb/recent.txt new file mode 100644 index 0000000..22bdf5e --- /dev/null +++ b/inc/lang/ckb/recent.txt @@ -0,0 +1,3 @@ +====== گۆڕانکاریەکانی ئەم دواییە ====== + +ئەم پەڕانەی خوارەوە بەم دواییە گۆڕدران: \ No newline at end of file diff --git a/inc/lang/ckb/register.txt b/inc/lang/ckb/register.txt new file mode 100644 index 0000000..27e451b --- /dev/null +++ b/inc/lang/ckb/register.txt @@ -0,0 +1,2 @@ +====== تۆمارکردن وەک بەکارهێنەرێکی نوێ ====== +پڕکردنەوە لە هەموو زانیاریەکانی خوارەوە بۆ دروستکردنی ئەژمێرێکی نوێ لەم ویکییە. دڵنیابە لەوەی کە ناونیشانی ئیمەیلی **دروست دابین دەکەیت** - ئەگەر داوات لێ نەکراوە کە نهێنوشەیەک لێرە تێبکەیت، نوێیەک دەنێردرێت بۆ ئەو ناونیشانە. ناوی چوونەژوورەوە دەبێت دروست بێت .doku>pagename|pagename!!. \ No newline at end of file diff --git a/inc/lang/ckb/registermail.txt b/inc/lang/ckb/registermail.txt new file mode 100644 index 0000000..1cc3998 --- /dev/null +++ b/inc/lang/ckb/registermail.txt @@ -0,0 +1,10 @@ +بەکارهێنەرێکی نوێ تۆمارکرا. وردەکارییەکان لێرەن: + +ناوی بەکارهێنەر : @NEWUSER@ +ناوی تەواو : @NEWNAME@ +ئیمەیڵ : @NEWEMAIL@ + +بەروار : @DATE@ +وێبگەڕ : @BROWSER@ +ئای پی-ناونیشان: @IPADDRESS@ +ناوی خانەخوێ : @HOSTNAME@ \ No newline at end of file diff --git a/inc/lang/ckb/resendpwd.txt b/inc/lang/ckb/resendpwd.txt new file mode 100644 index 0000000..e6f1fb0 --- /dev/null +++ b/inc/lang/ckb/resendpwd.txt @@ -0,0 +1,2 @@ +===== ناردنی تێپەڕوشەی نوێ ====== +تکایە ناوی بەکارهێنەرەکەت بنووسە لەم فۆرمەی خوارەوە بۆ داواکردنی نهێنوشەی نوێ بۆ ئەژمێرەکەت لەم ویکییە. لینکی دڵنیاکردنەوە دەنێردرێت بۆ ناونیشانی ئیمەیڵە تۆمارکراوەکەت. \ No newline at end of file diff --git a/inc/lang/ckb/resetpwd.txt b/inc/lang/ckb/resetpwd.txt new file mode 100644 index 0000000..45c5d7b --- /dev/null +++ b/inc/lang/ckb/resetpwd.txt @@ -0,0 +1,2 @@ +========== دانانی تێپەڕوشەی نوێ ===== +تکایە پاسۆردێکی نوێ بۆ ئەژمێرەکەت لەم ویکییە تێبنووسە. \ No newline at end of file diff --git a/inc/lang/ckb/revisions.txt b/inc/lang/ckb/revisions.txt new file mode 100644 index 0000000..7a1586b --- /dev/null +++ b/inc/lang/ckb/revisions.txt @@ -0,0 +1,2 @@ +====== پێداچوونەوە کۆنەکان ====== +ئەمانە پێداچوونەوەی کۆنتری دۆکیومێنتی ئێستان. بۆ ئەوەی بیگەرمەوە بۆ پێداچوونەوەیەکی کۆن، لە خوارەوە دەستنیشانی بکە، گرتە بکە لە ''ئیدیتی ئەم لاپەڕەیە'' بکە و تۆماری بکە. \ No newline at end of file diff --git a/inc/lang/ckb/searchpage.txt b/inc/lang/ckb/searchpage.txt new file mode 100644 index 0000000..9fdadb7 --- /dev/null +++ b/inc/lang/ckb/searchpage.txt @@ -0,0 +1,2 @@ +====== گەڕان====== +دەتوانیت ئەنجامەکانی گەڕانەکەت لە خوارەوە بدۆزیتەوە. @CREATEPAGEINFO@ \ No newline at end of file diff --git a/inc/lang/ckb/showrev.txt b/inc/lang/ckb/showrev.txt new file mode 100644 index 0000000..583ca12 --- /dev/null +++ b/inc/lang/ckb/showrev.txt @@ -0,0 +1,2 @@ +**ئەمە پێداچوونەوەیەکی کۆنی دۆکیومێنتەکە!** +---- \ No newline at end of file diff --git a/inc/lang/ckb/stopwords.txt b/inc/lang/ckb/stopwords.txt new file mode 100644 index 0000000..38d3460 --- /dev/null +++ b/inc/lang/ckb/stopwords.txt @@ -0,0 +1,39 @@ +# ئەمە لیستێکە لە وشەکان کە پێڕستکار پشتگوێی دەخرێن، یەک وشە بۆ هەر هێڵێک +# کاتێک ئەم فایلە بژار دەکەیت دڵنیابە لە بەکارهێنانی کۆتاییەکانی هێڵی UNIX (تاک هێڵی نوێ) +پێویست ناکات وشەکان کورتتر لە 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/inc/lang/ckb/subscr_digest.txt b/inc/lang/ckb/subscr_digest.txt new file mode 100644 index 0000000..b718ea5 --- /dev/null +++ b/inc/lang/ckb/subscr_digest.txt @@ -0,0 +1,16 @@ +سڵاو! + +پەڕەکە @PAGE@ لە @TITLE@ ویکلیک گۆڕا. +گۆڕانکاریەکان لێرەن: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +پێداچوونەوەی کۆن: @OLDPAGE@ +پێداچوونەوەی نوێ: @NEWPAGE@ + +بۆ بەتاڵکردنەوەی ئاگانامەکانی لاپەڕە، بچۆ ناو ویکی لە +@DOKUWIKIURL@ پاشان سەردانی بکە +@SUBSCRIBE@ +وە گۆڕینی لاپەڕە و/یان بۆشایی ناو. \ No newline at end of file diff --git a/inc/lang/ckb/subscr_form.txt b/inc/lang/ckb/subscr_form.txt new file mode 100644 index 0000000..d8bd22f --- /dev/null +++ b/inc/lang/ckb/subscr_form.txt @@ -0,0 +1,2 @@ +====== بەڕێوەبردنی ئابوونە ====== +ئەم پەڕەیە ڕێگەت پێدەدات بەشداریەکانت بەڕێوە ببەیت بۆ ئەم لاپەڕەیە و بۆشایی ناو. \ No newline at end of file diff --git a/inc/lang/ckb/subscr_list.txt b/inc/lang/ckb/subscr_list.txt new file mode 100644 index 0000000..fc6d825 --- /dev/null +++ b/inc/lang/ckb/subscr_list.txt @@ -0,0 +1,13 @@ +سڵاو! + +پەڕەکان لە بۆشایی @PAGE@ لە @TITLE@ ویکلیک گۆڕا. +ئەمانە پەڕە گۆڕاوەکانن: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +بۆ بەتاڵکردنەوەی ئاگانامەکانی لاپەڕە، بچۆ ناو ویکی لە +@DOKUWIKIURL@ پاشان سەردانی بکە +@SUBSCRIBE@ +وە گۆڕینی لاپەڕە و/یان بۆشایی ناو. \ No newline at end of file diff --git a/inc/lang/ckb/subscr_single.txt b/inc/lang/ckb/subscr_single.txt new file mode 100644 index 0000000..350def7 --- /dev/null +++ b/inc/lang/ckb/subscr_single.txt @@ -0,0 +1,19 @@ +سڵاو! + +پەڕەکە @PAGE@ لە @TITLE@ ویکلیک گۆڕا. +گۆڕانکاریەکان لێرەن: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +بەکارهێنەر : @USER@ +بژارکردنی پوختە : @SUMMARY@ +پێداچوونەوەی کۆن : @OLDPAGE@ +پێداچوونەوەی نوێ : @NEWPAGE@ +بەرواری پێداچوونەوەی نوێ: @DATE@ + +بۆ بەتاڵکردنەوەی ئاگانامەکانی لاپەڕە، بچۆ ناو ویکی لە +@DOKUWIKIURL@ پاشان سەردانی بکە +@SUBSCRIBE@ +وە گۆڕینی لاپەڕە و/یان بۆشایی ناو. \ No newline at end of file diff --git a/inc/lang/ckb/updateprofile.txt b/inc/lang/ckb/updateprofile.txt new file mode 100644 index 0000000..becb3fc --- /dev/null +++ b/inc/lang/ckb/updateprofile.txt @@ -0,0 +1,2 @@ +===== نوێکردنەوەی پرۆفایلی هەژمارەکەت====== +تۆ تەنها پێویستیت بە تەواوکردنی ئەو خانانە هەیە کە دەتەوێت بیگۆڕیت. لەوانەیە ناوی بەکارهێنەرت نەگۆڕیت. \ No newline at end of file diff --git a/inc/lang/ckb/uploadmail.txt b/inc/lang/ckb/uploadmail.txt new file mode 100644 index 0000000..957b367 --- /dev/null +++ b/inc/lang/ckb/uploadmail.txt @@ -0,0 +1,11 @@ +فایلێک بارکرا بۆ DokuWikiی خۆت. وردەکارییەکان لێرەن: + +فایل : @MEDIA@ +پێداچوونەوەی کۆن: @OLD@ +بەروار : @DATE@ +وێبگەڕ : @BROWSER@ +ئای پی-ناونیشان: @IPADDRESS@ +ناوی خانەخوێ : @HOSTNAME@ +قەبارە : @SIZE@ +جۆری MIME : @MIME@ +بەکارهێنەر : @USER@ \ No newline at end of file diff --git a/inc/lang/cs/admin.txt b/inc/lang/cs/admin.txt new file mode 100644 index 0000000..698c0e6 --- /dev/null +++ b/inc/lang/cs/admin.txt @@ -0,0 +1,3 @@ +====== Správa ====== + +Zde najdete možnosti správy a nastavení DokuWiki. diff --git a/inc/lang/cs/adminplugins.txt b/inc/lang/cs/adminplugins.txt new file mode 100644 index 0000000..88e547a --- /dev/null +++ b/inc/lang/cs/adminplugins.txt @@ -0,0 +1 @@ +===== Další zásuvné moduly ===== \ No newline at end of file diff --git a/inc/lang/cs/backlinks.txt b/inc/lang/cs/backlinks.txt new file mode 100644 index 0000000..59430ee --- /dev/null +++ b/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/inc/lang/cs/conflict.txt b/inc/lang/cs/conflict.txt new file mode 100644 index 0000000..b332a47 --- /dev/null +++ b/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/inc/lang/cs/denied.txt b/inc/lang/cs/denied.txt new file mode 100644 index 0000000..29524e5 --- /dev/null +++ b/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/inc/lang/cs/diff.txt b/inc/lang/cs/diff.txt new file mode 100644 index 0000000..87a9238 --- /dev/null +++ b/inc/lang/cs/diff.txt @@ -0,0 +1,3 @@ +====== Rozdíly ====== + +Zde můžete vidět rozdíly mezi vybranou verzí a aktuální verzí dané stránky. diff --git a/inc/lang/cs/draft.txt b/inc/lang/cs/draft.txt new file mode 100644 index 0000000..ebdfb8d --- /dev/null +++ b/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/inc/lang/cs/edit.txt b/inc/lang/cs/edit.txt new file mode 100644 index 0000000..1a135ae --- /dev/null +++ b/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/inc/lang/cs/editrev.txt b/inc/lang/cs/editrev.txt new file mode 100644 index 0000000..44f0bc6 --- /dev/null +++ b/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/inc/lang/cs/index.txt b/inc/lang/cs/index.txt new file mode 100644 index 0000000..f14979b --- /dev/null +++ b/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>cs:namespaces|jmenných prostorů]]. diff --git a/inc/lang/cs/install.html b/inc/lang/cs/install.html new file mode 100644 index 0000000..2eeb777 --- /dev/null +++ b/inc/lang/cs/install.html @@ -0,0 +1,7 @@ +

    Tato stránka vám pomůže při první instalaci a konfiguraci Dokuwiki. Více informací o tomto instalátoru naleznete v jeho vlastní dokumentaci.

    + +

    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 musí 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).

    + +

    Tento instalátor nastaví ACL (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.

    + +

    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ě instalace a nastavení DokuWiki.

    diff --git a/inc/lang/cs/jquery.ui.datepicker.js b/inc/lang/cs/jquery.ui.datepicker.js new file mode 100644 index 0000000..6e5552c --- /dev/null +++ b/inc/lang/cs/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Czech initialisation for the jQuery UI date picker plugin. */ +/* Written by Tomas Muller (tomas@tomas-muller.net). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.cs = { + closeText: "Zavřít", + prevText: "Dříve", + nextText: "Později", + 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/inc/lang/cs/lang.php b/inc/lang/cs/lang.php new file mode 100644 index 0000000..d78ab89 --- /dev/null +++ b/inc/lang/cs/lang.php @@ -0,0 +1,389 @@ + + * @author Petr Kajzar + * @author Aleksandr Selivanov + * @author Robert Surý + * @author Martin Hořínek + * @author Jonáš Dyba + * @author Bohumir Zamecnik + * @author Tomas Valenta + * @author Zbynek Krivka + * @author Marek Sacha + * @author Lefty + * @author Vojta Beran + * @author Jakub A. Těšínský (j@kub.cz) + * @author mkucera66 + * @author Zbyněk Křivka + * @author Petr Klíma + * @author Radovan Buroň + * @author Viktor Zavadil + * @author Jaroslav Lichtblau + * @author Turkislav + * @author Daniel Slováček + * @author Pavel Krupička + */ +$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['searchcreatepage'] = 'Pokud jste nenašli to, co jste hledali, můžete vytvořit nebo upravit stránku %s, pojmenovanou podle vašeho dotazu.'; +$lang['search_fullresults'] = 'Fulltextové výsledky'; +$lang['js']['search_toggle_tools'] = 'Zobrazit/skrýt vyhledávací nástroje'; +$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['js']['data_insecure'] = 'UPOZORNĚNÍ: Zdá se, že váš datový adresář není správně zabezpečen. Prosím, přečtěte si o zabezpečení přístupu v DokuWiki.'; +$lang['search_exact_match'] = 'Přesná shoda'; +$lang['search_starts_with'] = 'Začíná s'; +$lang['search_ends_with'] = 'Končí s'; +$lang['search_contains'] = 'Obsahuje'; +$lang['search_custom_match'] = 'Vlastní'; +$lang['search_any_ns'] = 'Jakýkoliv jmenný prostor'; +$lang['search_any_time'] = 'Jakýkoliv čas'; +$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_hits'] = 'Řadit podle shody'; +$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í e-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.
    Tato akce je nevratná.'; +$lang['profconfdeletemissing'] = 'Potvrzovací tlačítko nezaškrtnuto'; +$lang['proffail'] = 'Uživatelský profil nebyl aktualizován.'; +$lang['proftokenlegend'] = 'Ověřovací token'; +$lang['proftokengenerate'] = 'Resetovat token'; +$lang['proftokeninfo'] = 'Ověřovací token lze použít k tomu, aby se aplikace třetích stran mohly přihlásit a jednat vaším jménem. Resetováním tokenu dojde ke zneplatnění starého tokenu a odhlášení všech aplikací, které používaly předchozí token.'; +$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['allowedmime'] = 'Seznam povolených přípon souboru'; +$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['unknowndate'] = 'Neznámé datum'; +$lang['noflash'] = 'Pro přehrání obsahu potřebujete Adobe Flash Plugin.'; +$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'] = 'přejít 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 instrukce pro instalaci DokuWiki.'; +$lang['i_funcna'] = 'PHP funkce %s není dostupná. Váš webhosting ji možná z nějakého důvodu vypnul.'; +$lang['i_disabled'] = 'Bylo zakázáno vaším poskytovatelem.'; +$lang['i_funcnmail'] = 'Poznámka: Funkce mail() není v PHP dostupná. %s Pokud tento problém přetrvává, zkuste nainstalovat smtp plugin.'; +$lang['i_phpver'] = 'Verze vaší instalace PHP %s je nižší než požadovaná %s. 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_urandom'] = 'DokuWiki nemůže vytvořit kryptograficky bezpečná čísla pro cookies. Zkuste zkontrolovat nastavení open_basedir v php.ini, zda máte přistup k /dev/urandom .'; +$lang['i_permfail'] = 'DokuWiki nemůže zapisovat do %s. Budete muset opravit práva k tomuto adresáři.'; +$lang['i_confexists'] = '%s již existuje'; +$lang['i_writeerr'] = 'Nelze vytvořit %s. 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=%s) nebyl rozpoznán nebo byl upraven'; +$lang['i_badval'] = '%s - neplatná nebo prázdná hodnota'; +$lang['i_success'] = 'Konfigurace byla úspěšně dokončena. Nyní můžete smazat soubor install.php. Pokračujte do své nové DokuWiki.'; +$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 své nové DokuWiki.'; +$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 %s. Také si můžete zobrazit změny v celé wiki.'; +$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'] = 'Miniatury'; +$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['email_fail'] = 'Funkce mail() v PHP chybí nebo je zakázána. Tato e-mailová zpráva nebyla odeslána:'; +$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 %s.'; +$lang['unable_to_parse_date'] = 'Nelze rozebrat parametr "%s".'; +$lang['email_signature_text'] = 'Tento e-mail byl automaticky vygenerován systémem DokuWiki +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = 'Soubor protokolu je příliš velký. Předchozí řádky byly přeskočeny!'; +$lang['log_file_failed_to_open'] = 'Soubor protokolu se nepodařilo otevřít.'; +$lang['log_file_failed_to_read'] = 'Během čtení protokolu došlo k chybě.'; diff --git a/inc/lang/cs/locked.txt b/inc/lang/cs/locked.txt new file mode 100644 index 0000000..23fd943 --- /dev/null +++ b/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/inc/lang/cs/login.txt b/inc/lang/cs/login.txt new file mode 100644 index 0000000..a44ae59 --- /dev/null +++ b/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/inc/lang/cs/mailtext.txt b/inc/lang/cs/mailtext.txt new file mode 100644 index 0000000..8036ebe --- /dev/null +++ b/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/inc/lang/cs/mailwrap.html b/inc/lang/cs/mailwrap.html new file mode 100644 index 0000000..f15ec06 --- /dev/null +++ b/inc/lang/cs/mailwrap.html @@ -0,0 +1,13 @@ + + + @TITLE@ + + + + + @HTMLBODY@ + +

    + @EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/cs/newpage.txt b/inc/lang/cs/newpage.txt new file mode 100644 index 0000000..31166eb --- /dev/null +++ b/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/inc/lang/cs/norev.txt b/inc/lang/cs/norev.txt new file mode 100644 index 0000000..f601f58 --- /dev/null +++ b/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/inc/lang/cs/onceexisted.txt b/inc/lang/cs/onceexisted.txt new file mode 100644 index 0000000..d05010f --- /dev/null +++ b/inc/lang/cs/onceexisted.txt @@ -0,0 +1,3 @@ +======= Tato stránka již neexistuje ====== + +Sledovali jste odkaz na stránku, která již neexistuje. Můžete zkontrolovat seznam **old revisions** a zjistit, kdy a proč byl odstraněn, přistoupit ke starým revizím nebo jej obnovit. diff --git a/inc/lang/cs/password.txt b/inc/lang/cs/password.txt new file mode 100644 index 0000000..6b7c682 --- /dev/null +++ b/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/inc/lang/cs/preview.txt b/inc/lang/cs/preview.txt new file mode 100644 index 0000000..a11a205 --- /dev/null +++ b/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/inc/lang/cs/pwconfirm.txt b/inc/lang/cs/pwconfirm.txt new file mode 100644 index 0000000..2605b48 --- /dev/null +++ b/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/inc/lang/cs/read.txt b/inc/lang/cs/read.txt new file mode 100644 index 0000000..d5b2d73 --- /dev/null +++ b/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/inc/lang/cs/recent.txt b/inc/lang/cs/recent.txt new file mode 100644 index 0000000..e0c3693 --- /dev/null +++ b/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/inc/lang/cs/register.txt b/inc/lang/cs/register.txt new file mode 100644 index 0000000..b0d6bb1 --- /dev/null +++ b/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/inc/lang/cs/registermail.txt b/inc/lang/cs/registermail.txt new file mode 100644 index 0000000..3c449bc --- /dev/null +++ b/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/inc/lang/cs/resendpwd.txt b/inc/lang/cs/resendpwd.txt new file mode 100644 index 0000000..0820f28 --- /dev/null +++ b/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/inc/lang/cs/resetpwd.txt b/inc/lang/cs/resetpwd.txt new file mode 100644 index 0000000..7e640d8 --- /dev/null +++ b/inc/lang/cs/resetpwd.txt @@ -0,0 +1,3 @@ +====== Nastavení nového hesla ====== + +Zadejte prosím nové heslo pro váš účet. diff --git a/inc/lang/cs/revisions.txt b/inc/lang/cs/revisions.txt new file mode 100644 index 0000000..e3744b7 --- /dev/null +++ b/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/inc/lang/cs/searchpage.txt b/inc/lang/cs/searchpage.txt new file mode 100644 index 0000000..19b82d1 --- /dev/null +++ b/inc/lang/cs/searchpage.txt @@ -0,0 +1,3 @@ +====== Vyhledávání ====== + +Výsledky hledání můžete vidět níže. @CREATEPAGEINFO@ diff --git a/inc/lang/cs/showrev.txt b/inc/lang/cs/showrev.txt new file mode 100644 index 0000000..971f836 --- /dev/null +++ b/inc/lang/cs/showrev.txt @@ -0,0 +1,2 @@ +**Toto je starší verze dokumentu!** +---- diff --git a/inc/lang/cs/stopwords.txt b/inc/lang/cs/stopwords.txt new file mode 100644 index 0000000..d658a93 --- /dev/null +++ b/inc/lang/cs/stopwords.txt @@ -0,0 +1,945 @@ +# 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 +www +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/inc/lang/cs/subscr_digest.txt b/inc/lang/cs/subscr_digest.txt new file mode 100644 index 0000000..2ed7bf7 --- /dev/null +++ b/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/inc/lang/cs/subscr_form.txt b/inc/lang/cs/subscr_form.txt new file mode 100644 index 0000000..d051b64 --- /dev/null +++ b/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/inc/lang/cs/subscr_list.txt b/inc/lang/cs/subscr_list.txt new file mode 100644 index 0000000..d769988 --- /dev/null +++ b/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/inc/lang/cs/subscr_single.txt b/inc/lang/cs/subscr_single.txt new file mode 100644 index 0000000..83d45b6 --- /dev/null +++ b/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/inc/lang/cs/updateprofile.txt b/inc/lang/cs/updateprofile.txt new file mode 100644 index 0000000..787fe1a --- /dev/null +++ b/inc/lang/cs/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/cs/uploadmail.txt b/inc/lang/cs/uploadmail.txt new file mode 100644 index 0000000..090167d --- /dev/null +++ b/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/inc/lang/cy/admin.txt b/inc/lang/cy/admin.txt new file mode 100644 index 0000000..85eb7ac --- /dev/null +++ b/inc/lang/cy/admin.txt @@ -0,0 +1,3 @@ +====== Gweinyddu ====== + +Gallwch chi ddarganfod rhestr o dasgau gweinyddol ar gael mewn DokuWiki, isod. diff --git a/inc/lang/cy/adminplugins.txt b/inc/lang/cy/adminplugins.txt new file mode 100644 index 0000000..ff21264 --- /dev/null +++ b/inc/lang/cy/adminplugins.txt @@ -0,0 +1,2 @@ +===== Ategion Ychwanegol ===== + diff --git a/inc/lang/cy/backlinks.txt b/inc/lang/cy/backlinks.txt new file mode 100644 index 0000000..7405b0e --- /dev/null +++ b/inc/lang/cy/backlinks.txt @@ -0,0 +1,3 @@ +====== Olgysylltiadau ====== + +Dyma restr o dudalennau sy'n ymddangos eu bod nhw'n cysylltu'n ôl i'r dudalen gyfredol. diff --git a/inc/lang/cy/conflict.txt b/inc/lang/cy/conflict.txt new file mode 100644 index 0000000..4adeff7 --- /dev/null +++ b/inc/lang/cy/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/cy/denied.txt b/inc/lang/cy/denied.txt new file mode 100644 index 0000000..f7ce869 --- /dev/null +++ b/inc/lang/cy/denied.txt @@ -0,0 +1,3 @@ +====== Gwrthodwyd Hawl ====== + +Sori, 'sdim hawliau digonol 'da chi i barhau. diff --git a/inc/lang/cy/diff.txt b/inc/lang/cy/diff.txt new file mode 100644 index 0000000..9080939 --- /dev/null +++ b/inc/lang/cy/diff.txt @@ -0,0 +1,3 @@ +====== Gwahaniaethau ====== + +Mae hwn yn dangos y gwahaniaethau rhwng dau fersiwn y dudalen. diff --git a/inc/lang/cy/draft.txt b/inc/lang/cy/draft.txt new file mode 100644 index 0000000..6074ceb --- /dev/null +++ b/inc/lang/cy/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/cy/edit.txt b/inc/lang/cy/edit.txt new file mode 100644 index 0000000..d3adfdd --- /dev/null +++ b/inc/lang/cy/edit.txt @@ -0,0 +1 @@ +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/inc/lang/cy/editrev.txt b/inc/lang/cy/editrev.txt new file mode 100644 index 0000000..5d32e9a --- /dev/null +++ b/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/inc/lang/cy/index.txt b/inc/lang/cy/index.txt new file mode 100644 index 0000000..17ce110 --- /dev/null +++ b/inc/lang/cy/index.txt @@ -0,0 +1,3 @@ +====== Map safle ====== + +Dyma fap safle o bob tudalen sydd ar gael, wedi'u trefnu gan [[doku>namespaces|namespaces]]. diff --git a/inc/lang/cy/install.html b/inc/lang/cy/install.html new file mode 100644 index 0000000..7862804 --- /dev/null +++ b/inc/lang/cy/install.html @@ -0,0 +1,7 @@ +

    Mae'r dudalen hon yn eich helpu chi i arsefydlu am y tro cyntaf a gyda ffurfweddu Dokuwiki. Mae mwy o wybodaeth ar yr arsefydlwr hwn ar dudalen ddogfennaeth ei hun.

    + +

    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 rhaid 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).

    + +

    Bydd yr arsefydlwr hwn yn gosod eich ffurfwedd DokuWiki ar gyfer ACL, sydd yn ei dro yn caniatá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.

    + +

    Dylai defnyddwyr profiadol neu'r rheiny gydag anghenion gosodiad rrbennig special ddefnyddio'r dolenni hyn am wybodaeth parthed canllawiau arsefydlu and gosodiadau ffurfwedd.

    diff --git a/inc/lang/cy/jquery.ui.datepicker.js b/inc/lang/cy/jquery.ui.datepicker.js new file mode 100644 index 0000000..942c24f --- /dev/null +++ b/inc/lang/cy/jquery.ui.datepicker.js @@ -0,0 +1,48 @@ +/* Welsh/UK initialisation for the jQuery UI date picker plugin. */ +/* Written by William Griffiths. */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/cy/lang.php b/inc/lang/cy/lang.php new file mode 100644 index 0000000..7cdfe2b --- /dev/null +++ b/inc/lang/cy/lang.php @@ -0,0 +1,372 @@ + + * @author Anika Henke + * @author Matthias Grimm + * @author Matthias Schulte + * @author Alan Davies + */ +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '“'; //“ +$lang['doublequoteclosing'] = '”'; //” +$lang['singlequoteopening'] = '‘'; //‘ +$lang['singlequoteclosing'] = '’'; //’ +$lang['apostrophe'] = '’'; //’ + +$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.
    \'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 Ategyn Adobe Flash 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 + canllawiau arsefydylu Dokuwiki cyfan'; +$lang['i_funcna'] = 'Swyddogaeth PHP %s ddim ar gael. Posib bod eich gwesteiwr wedi\'i hanalluogi am ryw reswm?'; +$lang['i_phpver'] = 'Mae\'ch fersiwn PHP %s yn is na\'r hyn sydd ei angen %s. 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 %s. Mae angen newid gosodiadau hawliau ar gyfer y ffolder hwn!'; +$lang['i_confexists'] = 'Mae %s eisoes yn bodoli'; +$lang['i_writeerr'] = 'Methu creu %s. 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=%s)'; +$lang['i_badval'] = '%s - gwerth anghyfreithlon neu wag'; +$lang['i_success'] = 'Gorffennodd y ffurfwedd yn llwyddiannus. Gallwch chi ddileu\'r ffeil install.php nawr. Ewch + i\'ch DokuWiki newydd.'; +$lang['i_failure'] = 'Ymddangosodd gwallau wrth ysgrifennu\'r ffeiliau ffurfwedd. Bydd angen i chi eu cywiro + nhw gan law cyn gallwch chi ddefnyddio\'ch DokuWiki newydd.'; +$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 %s. Gallwch chi hefyd weld y newidiadau diweddar ar gyfer y wici cyfan.'; //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 %s.'; +$lang['unable_to_parse_date'] = 'Methu dosbarthu ar baramedr "%s".'; +//Setup VIM: ex: et ts=2 : diff --git a/inc/lang/cy/locked.txt b/inc/lang/cy/locked.txt new file mode 100644 index 0000000..4c7865d --- /dev/null +++ b/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/inc/lang/cy/login.txt b/inc/lang/cy/login.txt new file mode 100644 index 0000000..4142d84 --- /dev/null +++ b/inc/lang/cy/login.txt @@ -0,0 +1,3 @@ +====== Mewngofnodi ====== + +'Dych chi heb fewngofnodi! Rhowch eich manylion mewngofnodi isod. Mae angen galluogi cwcis er mwyn mewngofnodi. diff --git a/inc/lang/cy/mailtext.txt b/inc/lang/cy/mailtext.txt new file mode 100644 index 0000000..2746233 --- /dev/null +++ b/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/inc/lang/cy/mailwrap.html b/inc/lang/cy/mailwrap.html new file mode 100644 index 0000000..c634fad --- /dev/null +++ b/inc/lang/cy/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + diff --git a/inc/lang/cy/newpage.txt b/inc/lang/cy/newpage.txt new file mode 100644 index 0000000..a0978df --- /dev/null +++ b/inc/lang/cy/newpage.txt @@ -0,0 +1,3 @@ +====== '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/inc/lang/cy/norev.txt b/inc/lang/cy/norev.txt new file mode 100644 index 0000000..cd11b04 --- /dev/null +++ b/inc/lang/cy/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/cy/password.txt b/inc/lang/cy/password.txt new file mode 100644 index 0000000..da0678e --- /dev/null +++ b/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/inc/lang/cy/preview.txt b/inc/lang/cy/preview.txt new file mode 100644 index 0000000..10ad6a1 --- /dev/null +++ b/inc/lang/cy/preview.txt @@ -0,0 +1,3 @@ +====== Rhagolwg ====== + +Dyma ragolwg o sut fydd eich testun yn edrych. **Cofiwch: 'Dyw e heb ei gadw 'to**! diff --git a/inc/lang/cy/pwconfirm.txt b/inc/lang/cy/pwconfirm.txt new file mode 100644 index 0000000..9e26d3e --- /dev/null +++ b/inc/lang/cy/pwconfirm.txt @@ -0,0 +1,9 @@ +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@ diff --git a/inc/lang/cy/read.txt b/inc/lang/cy/read.txt new file mode 100644 index 0000000..d44ce09 --- /dev/null +++ b/inc/lang/cy/read.txt @@ -0,0 +1 @@ +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/inc/lang/cy/recent.txt b/inc/lang/cy/recent.txt new file mode 100644 index 0000000..408be51 --- /dev/null +++ b/inc/lang/cy/recent.txt @@ -0,0 +1,3 @@ +====== Newidiadau Diweddar ====== + +Cafodd y tudalennau canlynol eu newid yn ddiweddar: diff --git a/inc/lang/cy/register.txt b/inc/lang/cy/register.txt new file mode 100644 index 0000000..806a65a --- /dev/null +++ b/inc/lang/cy/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/cy/registermail.txt b/inc/lang/cy/registermail.txt new file mode 100644 index 0000000..0cb2b4f --- /dev/null +++ b/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/inc/lang/cy/resendpwd.txt b/inc/lang/cy/resendpwd.txt new file mode 100644 index 0000000..64324be --- /dev/null +++ b/inc/lang/cy/resendpwd.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/cy/resetpwd.txt b/inc/lang/cy/resetpwd.txt new file mode 100644 index 0000000..922bb97 --- /dev/null +++ b/inc/lang/cy/resetpwd.txt @@ -0,0 +1,3 @@ +====== Gosod cyfrinair newydd ====== + +Rhowch gyfrinair newydd i'ch cyfrif ar y wici hwn. diff --git a/inc/lang/cy/revisions.txt b/inc/lang/cy/revisions.txt new file mode 100644 index 0000000..b18fef7 --- /dev/null +++ b/inc/lang/cy/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/cy/searchpage.txt b/inc/lang/cy/searchpage.txt new file mode 100644 index 0000000..0967dc6 --- /dev/null +++ b/inc/lang/cy/searchpage.txt @@ -0,0 +1,3 @@ +====== Chwilio ====== + +Gallwch chi ddarganfod canlyniadau eich chwiliad isod. @CREATEPAGEINFO@ diff --git a/inc/lang/cy/showrev.txt b/inc/lang/cy/showrev.txt new file mode 100644 index 0000000..6cc9d6c --- /dev/null +++ b/inc/lang/cy/showrev.txt @@ -0,0 +1,2 @@ +**Dyma hen adolygiad y ddogfen!** +---- diff --git a/inc/lang/cy/stopwords.txt b/inc/lang/cy/stopwords.txt new file mode 100644 index 0000000..742e9a3 --- /dev/null +++ b/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 diff --git a/inc/lang/cy/subscr_digest.txt b/inc/lang/cy/subscr_digest.txt new file mode 100644 index 0000000..611e057 --- /dev/null +++ b/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/inc/lang/cy/subscr_form.txt b/inc/lang/cy/subscr_form.txt new file mode 100644 index 0000000..47d1a17 --- /dev/null +++ b/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/inc/lang/cy/subscr_list.txt b/inc/lang/cy/subscr_list.txt new file mode 100644 index 0000000..592f290 --- /dev/null +++ b/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/inc/lang/cy/subscr_single.txt b/inc/lang/cy/subscr_single.txt new file mode 100644 index 0000000..2a774eb --- /dev/null +++ b/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/inc/lang/cy/updateprofile.txt b/inc/lang/cy/updateprofile.txt new file mode 100644 index 0000000..8f5e3f2 --- /dev/null +++ b/inc/lang/cy/updateprofile.txt @@ -0,0 +1,3 @@ +====== Diweddaru proffil eich cyfrif ====== + +Newidiwch y meysydd rydych chi amm newid yn unig. 'Sdim modd i chi newid eich defnyddair. diff --git a/inc/lang/cy/uploadmail.txt b/inc/lang/cy/uploadmail.txt new file mode 100644 index 0000000..8102232 --- /dev/null +++ b/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/inc/lang/da/admin.txt b/inc/lang/da/admin.txt new file mode 100644 index 0000000..01093fb --- /dev/null +++ b/inc/lang/da/admin.txt @@ -0,0 +1,3 @@ +====== Administration ====== + +Nedenfor kan du finde en række administrative værktøjer. diff --git a/inc/lang/da/adminplugins.txt b/inc/lang/da/adminplugins.txt new file mode 100644 index 0000000..2a3d687 --- /dev/null +++ b/inc/lang/da/adminplugins.txt @@ -0,0 +1 @@ +===== Yderligere udvidelser ===== \ No newline at end of file diff --git a/inc/lang/da/backlinks.txt b/inc/lang/da/backlinks.txt new file mode 100644 index 0000000..c6f7e90 --- /dev/null +++ b/inc/lang/da/backlinks.txt @@ -0,0 +1,3 @@ +====== Henvisninger bagud ====== + +Dette er en liste over alle de dokumenter der henviser tilbage til det nuværende dokument. diff --git a/inc/lang/da/conflict.txt b/inc/lang/da/conflict.txt new file mode 100644 index 0000000..fc38cee --- /dev/null +++ b/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/inc/lang/da/denied.txt b/inc/lang/da/denied.txt new file mode 100644 index 0000000..217d893 --- /dev/null +++ b/inc/lang/da/denied.txt @@ -0,0 +1,3 @@ +====== Adgang nægtet ====== + +Du har ikke rettigheder til at fortsætte. diff --git a/inc/lang/da/diff.txt b/inc/lang/da/diff.txt new file mode 100644 index 0000000..9ca1f7f --- /dev/null +++ b/inc/lang/da/diff.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/da/draft.txt b/inc/lang/da/draft.txt new file mode 100644 index 0000000..105fed7 --- /dev/null +++ b/inc/lang/da/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/da/edit.txt b/inc/lang/da/edit.txt new file mode 100644 index 0000000..41c4108 --- /dev/null +++ b/inc/lang/da/edit.txt @@ -0,0 +1 @@ +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/inc/lang/da/editrev.txt b/inc/lang/da/editrev.txt new file mode 100644 index 0000000..46db558 --- /dev/null +++ b/inc/lang/da/editrev.txt @@ -0,0 +1,2 @@ +**Du har hentet en gammel revision af dette dokument!** Hvis du gemmer dokumentet vil du overskrive den nuværende revision med denne udgave. +---- diff --git a/inc/lang/da/index.txt b/inc/lang/da/index.txt new file mode 100644 index 0000000..f0fae97 --- /dev/null +++ b/inc/lang/da/index.txt @@ -0,0 +1,3 @@ +====== Indeks ====== + +Dette er en oversigt over alle tilgængelige dokumenter, sorteret efter [[doku>da:namespaces|navnerum]]. diff --git a/inc/lang/da/install.html b/inc/lang/da/install.html new file mode 100644 index 0000000..6ea2b5a --- /dev/null +++ b/inc/lang/da/install.html @@ -0,0 +1,7 @@ +

    Denne side hjælper til første-gangs installation og konfiguration af Dokuwiki. Mere information om denne installer er tilgængelig på dens egen dokumentations side.

    + +

    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 skal 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).

    + +

    Denne installer vil opsætte din DokuWiki konfiguration for ACL, 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.

    + +

    Erfarne brugere og brugere med specielle opsætningskrav burde bruge disse henvisninger for detaljer vedrørende installations instruktioner og konfigurations indstillinger.

    diff --git a/inc/lang/da/jquery.ui.datepicker.js b/inc/lang/da/jquery.ui.datepicker.js new file mode 100644 index 0000000..d2de755 --- /dev/null +++ b/inc/lang/da/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Danish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jan Christensen ( deletestuff@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.da = { + closeText: "Luk", + prevText: "Forrige", + nextText: "Næste", + currentText: "I dag", + 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/inc/lang/da/lang.php b/inc/lang/da/lang.php new file mode 100644 index 0000000..5ab8f99 --- /dev/null +++ b/inc/lang/da/lang.php @@ -0,0 +1,377 @@ + + * @author Kenneth Schack Banner + * @author Jon Theil Nielsen + * @author koeppe + * @author Jon Bendtsen + * @author Lars Næsbye Christensen + * @author Kalle Sommer Nielsen + * @author Esben Laursen + * @author Harith + * @author Daniel Ejsing-Duun + * @author Erik Bjørn Pedersen + * @author rasmus + * @author Mikael Lyngvig + * @author Soren Birk + * @author Jens Hyllegaard + * @author soer9648 + * @author Søren Birk + */ +$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 revisioner'; +$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 brugerkonto'; +$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 adresse'; +$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['searchcreatepage'] = 'Hvis du ikke fandt hvad du ledte efter, kan du oprette eller redigere siden %s, opkaldt efter din forespørgsel.'; +$lang['search_fullresults'] = 'Fuld-tekst resultater'; +$lang['js']['search_toggle_tools'] = 'Vis/skjul søgeværktøjer'; +$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['search_exact_match'] = 'Præcist match'; +$lang['search_starts_with'] = 'Starter med'; +$lang['search_ends_with'] = 'Slutter med'; +$lang['search_contains'] = 'Indeholder'; +$lang['search_custom_match'] = 'Brugerdefineret'; +$lang['search_any_ns'] = 'Ethvert navnerum'; +$lang['search_any_time'] = 'Når som helst'; +$lang['search_past_7_days'] = 'Seneste uge'; +$lang['search_past_month'] = 'Seneste måned'; +$lang['search_past_year'] = 'Seneste år'; +$lang['search_sort_by_hits'] = 'Sorter efter visninger'; +$lang['search_sort_by_mtime'] = 'Sorter efter ændringsdato'; +$lang['regmissing'] = 'Du skal udfylde alle felter.'; +$lang['reguexists'] = 'Dette brugernavn er allerede i brug.'; +$lang['regsuccess'] = 'Du er nu oprettet som bruger. Din 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, prøv venligst igen.'; +$lang['regpwmail'] = 'Din adgangskode til DokuWiki'; +$lang['reghere'] = 'Har du ikke en brugerkonto? Opret en nu'; +$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 brugerkonto'; +$lang['profdeleted'] = 'Din brugerkonto er blevet slettet fra denne wiki'; +$lang['profconfdelete'] = 'Jeg ønsker at slette min brugerkonto fra denne wiki.
    Denne handling kan ikke fortrydes.'; +$lang['profconfdeletemissing'] = 'Afkrydsningsfelt til bekræftelse er ikke markeret'; +$lang['proffail'] = 'Brugerprofilen blev ikke opdateret.'; +$lang['pwdforget'] = 'Har du glemt din 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['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 revision'; +$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 revision gendannet (%s)'; +$lang['external_edit'] = 'ekstern redigering'; +$lang['summary'] = 'Resumé af ændrigner'; +$lang['noflash'] = 'Du skal installere Adobe Flash Player 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'] = 'Sidepanel'; +$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 +DokuWiki installations instruktioner'; +$lang['i_funcna'] = 'PHP funtionen %s er ikke tilgængelig. Måske har din udbyder slået det fra af en eller anden grund?'; +$lang['i_disabled'] = 'Det er blevet slået fra af din udbyder.'; +$lang['i_funcnmail'] = 'Bemærk: PHP mail funktionen er ikke tilgængelig. %s Hvis den forbliver utilgængelig, kan du installere SMTP udvidelsen.'; +$lang['i_phpver'] = 'Din PHP version %s er mindre en den nødvendige %s. 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_urandom'] = 'DokuWiki kan ikke oprette kryptografisk sikre numre til cookies. Du bør måske kontrollere dine open_basedir indstillinger i php.ini for korrekt /dev/urandom adgang.'; +$lang['i_permfail'] = 'DokuWiki kan ikke skrive til %s. Du er nød til at rette tilladelses indstillingerne for denne mappe!'; +$lang['i_confexists'] = '%s eksisterer allerede'; +$lang['i_writeerr'] = 'Kunne ikke oprette %s. Du bliver nød til at tjekke mappe/fil- tilladelserne og oprette filen manuelt.'; +$lang['i_badhash'] = 'uigenkendelig eller modificeret dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - ulovlig eller tom værdi'; +$lang['i_success'] = 'Konfigurationen fulførtedes med success. Du kan nu slette install.php filen. Fortsætte til din nye DokuWiki.'; +$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 din nye DokuWiki.'; +$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 %s navnerummet. Du kan også se de sidste ændringer for hele wiki siden '; +$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['email_fail'] = 'PHP mail() mangler eller er slået fra. Den følgende mail blev ikke sendt:'; +$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 %s.'; +$lang['unable_to_parse_date'] = 'Kan ikke fortolke parameteren "%s".'; +$lang['email_signature_text'] = 'Denne e-mail blev genereret af DokuWiki på +@DOKUWIKIURL@'; diff --git a/inc/lang/da/locked.txt b/inc/lang/da/locked.txt new file mode 100644 index 0000000..74b677d --- /dev/null +++ b/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/inc/lang/da/login.txt b/inc/lang/da/login.txt new file mode 100644 index 0000000..039bb0a --- /dev/null +++ b/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/inc/lang/da/mailtext.txt b/inc/lang/da/mailtext.txt new file mode 100644 index 0000000..bea9cd3 --- /dev/null +++ b/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/inc/lang/da/mailwrap.html b/inc/lang/da/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/da/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/da/newpage.txt b/inc/lang/da/newpage.txt new file mode 100644 index 0000000..1f23c84 --- /dev/null +++ b/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/inc/lang/da/norev.txt b/inc/lang/da/norev.txt new file mode 100644 index 0000000..a30fa11 --- /dev/null +++ b/inc/lang/da/norev.txt @@ -0,0 +1,3 @@ +====== Den valgte revision findes ikke ====== + +Den valgte revision af dokumentet findes ikke. Tryk på knappen **''[Gamle revisioner]''** for at se en liste af gamle revisioner af dette dokument. diff --git a/inc/lang/da/onceexisted.txt b/inc/lang/da/onceexisted.txt new file mode 100644 index 0000000..7159de6 --- /dev/null +++ b/inc/lang/da/onceexisted.txt @@ -0,0 +1,3 @@ +======= Denne side findes ikke længere ====== + +Du har fulgt et link til en side der ikke længere eksisterer. Du kan kigge i listen over **gamle revisioner** for at se hvorfor/hvornår siden blev slettet, samt tilgå gamle revisioner eller gendanne siden. diff --git a/inc/lang/da/password.txt b/inc/lang/da/password.txt new file mode 100644 index 0000000..5bf30c0 --- /dev/null +++ b/inc/lang/da/password.txt @@ -0,0 +1,6 @@ +Hej @FULLNAME@! + +Her er dine brugeroplysninger til @TITLE@ på @DOKUWIKIURL@ + +Brugernavn: @LOGIN@ +Adgangskode: @PASSWORD@ diff --git a/inc/lang/da/preview.txt b/inc/lang/da/preview.txt new file mode 100644 index 0000000..92910d1 --- /dev/null +++ b/inc/lang/da/preview.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/da/pwconfirm.txt b/inc/lang/da/pwconfirm.txt new file mode 100644 index 0000000..1804430 --- /dev/null +++ b/inc/lang/da/pwconfirm.txt @@ -0,0 +1,9 @@ +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 den følgende henvisning. + +@CONFIRM@ diff --git a/inc/lang/da/read.txt b/inc/lang/da/read.txt new file mode 100644 index 0000000..f4a19a5 --- /dev/null +++ b/inc/lang/da/read.txt @@ -0,0 +1 @@ +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/inc/lang/da/recent.txt b/inc/lang/da/recent.txt new file mode 100644 index 0000000..c8c77ae --- /dev/null +++ b/inc/lang/da/recent.txt @@ -0,0 +1,3 @@ +====== Nye ændringer ====== + +Følgende dokumenter er blevet ændret for nylig: diff --git a/inc/lang/da/register.txt b/inc/lang/da/register.txt new file mode 100644 index 0000000..998d960 --- /dev/null +++ b/inc/lang/da/register.txt @@ -0,0 +1,3 @@ +====== Opret en wiki-konto ====== + +Udfyld nedenstånde skema for at oprette en brugerkonto i denne wiki. Sørg for at bruge en **gyldig e-mail adresse** - din adgangskode bliver sendt til dig. Dit brugernavn skal være et gyldigt [[doku>da:pagename|sidenavn]]. diff --git a/inc/lang/da/registermail.txt b/inc/lang/da/registermail.txt new file mode 100644 index 0000000..6a3b056 --- /dev/null +++ b/inc/lang/da/registermail.txt @@ -0,0 +1,10 @@ +En ny bruger er bæevet oprettet. Her er detaljerne: + +Brugernavn : @NEWUSER@ +Navn : @NEWNAME@ +E-mail : @NEWEMAIL@ + +Dato : @DATE@ +Browser : @BROWSER@ +IP-adresse : @IPADDRESS@ +Værtsnavn : @HOSTNAME@ diff --git a/inc/lang/da/resendpwd.txt b/inc/lang/da/resendpwd.txt new file mode 100644 index 0000000..e015d58 --- /dev/null +++ b/inc/lang/da/resendpwd.txt @@ -0,0 +1,3 @@ +====== Send ny adgangskode ====== + +Udfyld alle nedenstående felter for at få tilsendt en ny adgangskode til denne wiki. Din nye adgangskode vil blive sendt til den angivne e-mail adresse. Brugernavnet bør være dit wiki brugernavn. diff --git a/inc/lang/da/resetpwd.txt b/inc/lang/da/resetpwd.txt new file mode 100644 index 0000000..3cd8481 --- /dev/null +++ b/inc/lang/da/resetpwd.txt @@ -0,0 +1,3 @@ +====== Vælg ny adgangskode ====== + +Indtast venligst en ny adgangskode til din brugerkonto på denne wiki. diff --git a/inc/lang/da/revisions.txt b/inc/lang/da/revisions.txt new file mode 100644 index 0000000..396f5e1 --- /dev/null +++ b/inc/lang/da/revisions.txt @@ -0,0 +1,3 @@ +====== Gamle revisioner ====== + +Her er de gamle revisioner af dette dokument. Du kan vende tilbage til en tidligere revision af dokumentet ved at vælge den nedenfor, trykke på knappen **''[Rediger dette dokument]''**, og til sidst gemme dokumentet. diff --git a/inc/lang/da/searchpage.txt b/inc/lang/da/searchpage.txt new file mode 100644 index 0000000..05c269b --- /dev/null +++ b/inc/lang/da/searchpage.txt @@ -0,0 +1,3 @@ +====== Søgning ====== + +Du kan se resultaterne af din søgning nedenunder. @CREATEPAGEINFO@ diff --git a/inc/lang/da/showrev.txt b/inc/lang/da/showrev.txt new file mode 100644 index 0000000..bac17c7 --- /dev/null +++ b/inc/lang/da/showrev.txt @@ -0,0 +1,2 @@ +**Dette er en gammel revision af dokumentet!** +---- diff --git a/inc/lang/da/stopwords.txt b/inc/lang/da/stopwords.txt new file mode 100644 index 0000000..cd27cb9 --- /dev/null +++ b/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 diff --git a/inc/lang/da/subscr_digest.txt b/inc/lang/da/subscr_digest.txt new file mode 100644 index 0000000..74ac67a --- /dev/null +++ b/inc/lang/da/subscr_digest.txt @@ -0,0 +1,14 @@ +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, log ind på wikien på +@DOKUWIKIURL@ og besøg @SUBSCRIBE@ for at afmelde side og/eller navneområde ændringer. diff --git a/inc/lang/da/subscr_form.txt b/inc/lang/da/subscr_form.txt new file mode 100644 index 0000000..9de6565 --- /dev/null +++ b/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/inc/lang/da/subscr_list.txt b/inc/lang/da/subscr_list.txt new file mode 100644 index 0000000..62f8f66 --- /dev/null +++ b/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/inc/lang/da/subscr_single.txt b/inc/lang/da/subscr_single.txt new file mode 100644 index 0000000..8894b63 --- /dev/null +++ b/inc/lang/da/subscr_single.txt @@ -0,0 +1,17 @@ +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 stoppe notifikationer om sideændringer, log ind på wikien på +@DOKUWIKIURL@ og besøg @SUBSCRIBE@ for at afmelde side og/eller navneområde ændringer.. diff --git a/inc/lang/da/updateprofile.txt b/inc/lang/da/updateprofile.txt new file mode 100644 index 0000000..67d138a --- /dev/null +++ b/inc/lang/da/updateprofile.txt @@ -0,0 +1,3 @@ +====== Opdater din brugerkonto ====== + +Du behøver kun at udfylde de felter du ønsker at ændre. Du kan ikke ændre dit brugernavn. diff --git a/inc/lang/da/uploadmail.txt b/inc/lang/da/uploadmail.txt new file mode 100644 index 0000000..e45b89a --- /dev/null +++ b/inc/lang/da/uploadmail.txt @@ -0,0 +1,11 @@ +En fil blev overført til din DokuWiki. Her er detaljerne: + +Fil : @MEDIA@ +Gammel revision: @OLD@ +Dato : @DATE@ +Browser : @BROWSER@ +IP-adresse : @IPADDRESS@ +Værtsnavn : @HOSTNAME@ +Størrelse : @SIZE@ +MIME Type : @MIME@ +Bruger : @USER@ diff --git a/inc/lang/de-informal/admin.txt b/inc/lang/de-informal/admin.txt new file mode 100644 index 0000000..aa5f00a --- /dev/null +++ b/inc/lang/de-informal/admin.txt @@ -0,0 +1,3 @@ +====== Administration ====== + +Folgende administrative Aufgaben stehen in DokuWiki zur Verfügung. diff --git a/inc/lang/de-informal/adminplugins.txt b/inc/lang/de-informal/adminplugins.txt new file mode 100644 index 0000000..a0ae21f --- /dev/null +++ b/inc/lang/de-informal/adminplugins.txt @@ -0,0 +1 @@ +===== Zusätzliche Plugins ===== \ No newline at end of file diff --git a/inc/lang/de-informal/backlinks.txt b/inc/lang/de-informal/backlinks.txt new file mode 100644 index 0000000..ba97010 --- /dev/null +++ b/inc/lang/de-informal/backlinks.txt @@ -0,0 +1,3 @@ +====== Backlinks ====== + +Dies ist eine Liste der Seiten, die zur aktuellen Seite rückverlinken. diff --git a/inc/lang/de-informal/conflict.txt b/inc/lang/de-informal/conflict.txt new file mode 100644 index 0000000..9dbb657 --- /dev/null +++ b/inc/lang/de-informal/conflict.txt @@ -0,0 +1,5 @@ +====== Eine neuere Version existiert ====== + +Eine neuere Version des aktuell in Bearbeitung befindlichen Dokuments existiert. Das heißt, ein anderer Nutzer hat zur gleichen Zeit an derselben Seite gearbeitet und sie 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/inc/lang/de-informal/denied.txt b/inc/lang/de-informal/denied.txt new file mode 100644 index 0000000..30f1adb --- /dev/null +++ b/inc/lang/de-informal/denied.txt @@ -0,0 +1,3 @@ +====== Zugang verweigert ====== + +Du hast nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. diff --git a/inc/lang/de-informal/diff.txt b/inc/lang/de-informal/diff.txt new file mode 100644 index 0000000..246a24e --- /dev/null +++ b/inc/lang/de-informal/diff.txt @@ -0,0 +1,3 @@ +====== Unterschiede ====== + +Hier werden die Unterschiede zwischen zwei Versionen der Seite angezeigt. diff --git a/inc/lang/de-informal/draft.txt b/inc/lang/de-informal/draft.txt new file mode 100644 index 0000000..ba373a6 --- /dev/null +++ b/inc/lang/de-informal/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/de-informal/edit.txt b/inc/lang/de-informal/edit.txt new file mode 100644 index 0000000..c13106f --- /dev/null +++ b/inc/lang/de-informal/edit.txt @@ -0,0 +1 @@ +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/inc/lang/de-informal/editrev.txt b/inc/lang/de-informal/editrev.txt new file mode 100644 index 0000000..40a8b72 --- /dev/null +++ b/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. +---- diff --git a/inc/lang/de-informal/index.txt b/inc/lang/de-informal/index.txt new file mode 100644 index 0000000..5509bff --- /dev/null +++ b/inc/lang/de-informal/index.txt @@ -0,0 +1,3 @@ +====== Übersicht ====== + +Dies ist eine Übersicht über alle vorhandenen Seiten und [[doku>namespaces|Namensräume]]. diff --git a/inc/lang/de-informal/install.html b/inc/lang/de-informal/install.html new file mode 100644 index 0000000..0b65fc7 --- /dev/null +++ b/inc/lang/de-informal/install.html @@ -0,0 +1,7 @@ +

    Diese Seite hilft dir bei der Erstinstallation und Konfiguration von DokuWiki. Zusätzliche Informationen zu diesem Installationsskript findest du auf der entsprechenden Hilfe-Seite (en).

    + +

    DokuWiki verwendet normale Dateien für das Speichern von Wikiseiten und anderen Informationen (Bilder, Suchindizes, alte Versionen usw.). Um DokuWiki betreiben zu können, muss 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.

    + +

    Dieses Skript hilft dir beim ersten Einrichten des Zugangsschutzes (ACL) 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.

    + +

    Erfahrene Anwender oder Benutzer mit speziellen Konfigurationsbedürfnissen sollten die folgenden Links nutzen, um sich über Installation und Konfiguration zu informieren.

    diff --git a/inc/lang/de-informal/jquery.ui.datepicker.js b/inc/lang/de-informal/jquery.ui.datepicker.js new file mode 100644 index 0000000..8a08ebf --- /dev/null +++ b/inc/lang/de-informal/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.de = { + closeText: "Schließen", + prevText: "Zurück", + nextText: "Vor", + 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/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php new file mode 100644 index 0000000..261dc8c --- /dev/null +++ b/inc/lang/de-informal/lang.php @@ -0,0 +1,382 @@ + + * @author MaWi + * @author lp + * @author Martin + * @author F. Mueller-Donath + * @author Andreas Gohr + * @author Christof + * @author Anika Henke + * @author Esther Brunner + * @author Matthias Grimm + * @author Michael Klier + * @author Leo Moll + * @author Florian Anderiasch + * @author Robin Kluth + * @author Arne Pelka + * @author Alexander Fischer + * @author Juergen Schwarzer + * @author Marcel Metz + * @author Matthias Schulte + * @author Christian Wichmann + * @author Pierre Corell + * @author Frank Loizzi + * @author Volker Bödker + * @author Janosch + * @author rnck + */ +$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'] = 'Quelltext anzeigen'; +$lang['btn_show'] = 'Seite anzeigen'; +$lang['btn_create'] = 'Seite anlegen'; +$lang['btn_search'] = 'Suchen'; +$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'] = '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'] = 'Neues Passwort festlegen'; +$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 automatisch gesichert am'; +$lang['nosecedit'] = 'Diese Seite wurde inzwischen geändert. Weil deshalb ein oder mehrere Abschnitte veraltet sind, wurde die Seite komplett neu geladen.'; +$lang['searchcreatepage'] = 'Falls der gesuchte Begriff nicht gefunden wurde, kannst du die nach deiner Anfrage benannte Seite %s umgehend neu 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, 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'] = 'Bild in kleiner Auflösung'; +$lang['js']['mediamedium'] = 'Bild in mittlerer Auflösung'; +$lang['js']['medialarge'] = 'Bild in hoher Auflösung'; +$lang['js']['mediaoriginal'] = 'Originalauflösung'; +$lang['js']['medialnk'] = 'Link zur Detailseite'; +$lang['js']['mediadirect'] = 'Direkter Link zum Original'; +$lang['js']['medianolnk'] = 'Kein Link'; +$lang['js']['medianolink'] = 'Bild nicht verlinken'; +$lang['js']['medialeft'] = 'Bild linksbündig ausrichten.'; +$lang['js']['mediaright'] = 'Bild rechtsbündig ausrichten.'; +$lang['js']['mediacenter'] = 'Bild horizontal zentriert ausrichten'; +$lang['js']['medianoalign'] = 'Bild ohne bestimmte Ausrichtung lassen'; +$lang['js']['nosmblinks'] = 'Das Verlinken von Windows-Freigaben funktioniert nur im Microsoft Internet-Explorer.\nDer Link kann jedoch zum Einfügen kopiert 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['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 Namensräume'; +$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'] = '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.
    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['allowedmime'] = 'Liste der erlaubten Dateiendungen'; +$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. 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 Adobe Flash Plugin 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'] = 'Zugriffskontrolle (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 Dokuwiki-Installationsanleitung konsultieren.'; +$lang['i_funcna'] = 'Die PHP-Funktion %s ist nicht verfügbar. Unter Umständen wurde sie von deinem Hoster deaktiviert?'; +$lang['i_disabled'] = 'Es wurde von deinem Provider deaktiviert.'; +$lang['i_funcnmail'] = 'Hinweis: Die PHP-Funktion "mail()" ist nicht verfügbar. %s Alternativ kansnt du das SMTP-Plugin installieren.'; +$lang['i_phpver'] = 'Deine PHP-Version %s ist niedriger als die benötigte Version %s. Bitte aktualisiere deine PHP-Installation.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload muss in php.in deaktiviert werden um DokuWiki auszuführen.'; +$lang['i_urandom'] = 'DokuWiki kann keine kryptografisch sicheren Werte für Cookies generieren. Möglicherweise möchtest du die "open_basedir"-Einstellungen in der zutreffenden php.ini auf korrekten Zugriff auf / dev/urandom überprüfen.'; +$lang['i_permfail'] = '%s ist nicht durch DokuWiki beschreibbar. Du musst die Berechtigungen dieses Ordners ändern!'; +$lang['i_confexists'] = '%s existiert bereits'; +$lang['i_writeerr'] = '%s 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=%s)'; +$lang['i_badval'] = '%s - unerlaubter oder leerer Wert'; +$lang['i_success'] = 'Die Konfiguration wurde erfolgreich abgeschlossen. Du kannst jetzt die install.php löschen. Dein neues DokuWiki 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 neues DokuWiki nutzen kannst.'; +$lang['i_policy'] = 'Anfangseinstellungen der Zugriffskontrolle (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 %s. Du kannst auch die Änderungen im gesamten Wiki sehen.'; +$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 %s.'; +$lang['media_upload'] = 'In den %s Namensraum hochladen.'; +$lang['media_search'] = 'Im Namensraum %s 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['email_fail'] = 'PHP-Funktion "mail ()" fehlt oder ist deaktiviert. Die folgende E-Mail wurde nicht gesendet:'; +$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: %s.'; +$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/inc/lang/de-informal/locked.txt b/inc/lang/de-informal/locked.txt new file mode 100644 index 0000000..2c757bd --- /dev/null +++ b/inc/lang/de-informal/locked.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de-informal/login.txt b/inc/lang/de-informal/login.txt new file mode 100644 index 0000000..480eded --- /dev/null +++ b/inc/lang/de-informal/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de-informal/mailtext.txt b/inc/lang/de-informal/mailtext.txt new file mode 100644 index 0000000..127b481 --- /dev/null +++ b/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/inc/lang/de-informal/mailwrap.html b/inc/lang/de-informal/mailwrap.html new file mode 100644 index 0000000..7df0cdc --- /dev/null +++ b/inc/lang/de-informal/mailwrap.html @@ -0,0 +1,13 @@ + + + @TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + diff --git a/inc/lang/de-informal/newpage.txt b/inc/lang/de-informal/newpage.txt new file mode 100644 index 0000000..f10e434 --- /dev/null +++ b/inc/lang/de-informal/newpage.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de-informal/norev.txt b/inc/lang/de-informal/norev.txt new file mode 100644 index 0000000..20e8d82 --- /dev/null +++ b/inc/lang/de-informal/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de-informal/onceexisted.txt b/inc/lang/de-informal/onceexisted.txt new file mode 100644 index 0000000..aeca64c --- /dev/null +++ b/inc/lang/de-informal/onceexisted.txt @@ -0,0 +1,3 @@ +======= Diese Seite existiert nicht mehr ====== + +Du bist einem Link zu einer Seite gefolgt, den es nicht mehr gibt. Um zu sehen, wann und warum diese Seite gelöscht bzw. um ältere Versionen zu besichtigen oder zu laden, besuche **Alte Revisionen**. diff --git a/inc/lang/de-informal/password.txt b/inc/lang/de-informal/password.txt new file mode 100644 index 0000000..e99fc53 --- /dev/null +++ b/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/inc/lang/de-informal/preview.txt b/inc/lang/de-informal/preview.txt new file mode 100644 index 0000000..28bbd1e --- /dev/null +++ b/inc/lang/de-informal/preview.txt @@ -0,0 +1,3 @@ +====== Vorschau ====== + +So wird dein Text später aussehen. **Achtung: Der Text wurde noch nicht gespeichert**! diff --git a/inc/lang/de-informal/pwconfirm.txt b/inc/lang/de-informal/pwconfirm.txt new file mode 100644 index 0000000..e48ad83 --- /dev/null +++ b/inc/lang/de-informal/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/de-informal/read.txt b/inc/lang/de-informal/read.txt new file mode 100644 index 0000000..5ef26e5 --- /dev/null +++ b/inc/lang/de-informal/read.txt @@ -0,0 +1 @@ +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/inc/lang/de-informal/recent.txt b/inc/lang/de-informal/recent.txt new file mode 100644 index 0000000..0022b21 --- /dev/null +++ b/inc/lang/de-informal/recent.txt @@ -0,0 +1,3 @@ +====== Letzte Änderungen ====== + +Die folgenden Seiten wurden zuletzt geändert: diff --git a/inc/lang/de-informal/register.txt b/inc/lang/de-informal/register.txt new file mode 100644 index 0000000..a10d3da --- /dev/null +++ b/inc/lang/de-informal/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de-informal/registermail.txt b/inc/lang/de-informal/registermail.txt new file mode 100644 index 0000000..e19fb8f --- /dev/null +++ b/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/inc/lang/de-informal/resendpwd.txt b/inc/lang/de-informal/resendpwd.txt new file mode 100644 index 0000000..a0a7142 --- /dev/null +++ b/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/inc/lang/de-informal/resetpwd.txt b/inc/lang/de-informal/resetpwd.txt new file mode 100644 index 0000000..62186fc --- /dev/null +++ b/inc/lang/de-informal/resetpwd.txt @@ -0,0 +1,3 @@ +====== Neues Passwort setzen ====== + +Bitte gib ein neues Passwort für deinen Wiki-Zugang ein. diff --git a/inc/lang/de-informal/revisions.txt b/inc/lang/de-informal/revisions.txt new file mode 100644 index 0000000..5a6af9f --- /dev/null +++ b/inc/lang/de-informal/revisions.txt @@ -0,0 +1,3 @@ +====== Ä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/inc/lang/de-informal/searchpage.txt b/inc/lang/de-informal/searchpage.txt new file mode 100644 index 0000000..8e1e7a9 --- /dev/null +++ b/inc/lang/de-informal/searchpage.txt @@ -0,0 +1,3 @@ +====== Suche ====== + +Unten sind die Ergebnisse deiner Suche gelistet. @CREATEPAGEINFO@ diff --git a/inc/lang/de-informal/showrev.txt b/inc/lang/de-informal/showrev.txt new file mode 100644 index 0000000..65f53c9 --- /dev/null +++ b/inc/lang/de-informal/showrev.txt @@ -0,0 +1,2 @@ +**Dies ist eine alte Version des Dokuments!** +---- diff --git a/inc/lang/de-informal/stopwords.txt b/inc/lang/de-informal/stopwords.txt new file mode 100644 index 0000000..609591d --- /dev/null +++ b/inc/lang/de-informal/stopwords.txt @@ -0,0 +1,126 @@ +# 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 +www +zum +zur +über diff --git a/inc/lang/de-informal/subscr_digest.txt b/inc/lang/de-informal/subscr_digest.txt new file mode 100644 index 0000000..1e29137 --- /dev/null +++ b/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/inc/lang/de-informal/subscr_form.txt b/inc/lang/de-informal/subscr_form.txt new file mode 100644 index 0000000..7bf74f2 --- /dev/null +++ b/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/inc/lang/de-informal/subscr_list.txt b/inc/lang/de-informal/subscr_list.txt new file mode 100644 index 0000000..0bc7a6a --- /dev/null +++ b/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/inc/lang/de-informal/subscr_single.txt b/inc/lang/de-informal/subscr_single.txt new file mode 100644 index 0000000..7ab02cc --- /dev/null +++ b/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/inc/lang/de-informal/updateprofile.txt b/inc/lang/de-informal/updateprofile.txt new file mode 100644 index 0000000..e9a58a0 --- /dev/null +++ b/inc/lang/de-informal/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de-informal/uploadmail.txt b/inc/lang/de-informal/uploadmail.txt new file mode 100644 index 0000000..d608cd5 --- /dev/null +++ b/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/inc/lang/de/admin.txt b/inc/lang/de/admin.txt new file mode 100644 index 0000000..8fd7e33 --- /dev/null +++ b/inc/lang/de/admin.txt @@ -0,0 +1,3 @@ +====== Administration ====== + +Folgende administrative Aufgaben stehen in DokuWiki zur Verfügung: diff --git a/inc/lang/de/adminplugins.txt b/inc/lang/de/adminplugins.txt new file mode 100644 index 0000000..d3bfd09 --- /dev/null +++ b/inc/lang/de/adminplugins.txt @@ -0,0 +1 @@ +===== Weitere Plugins ===== \ No newline at end of file diff --git a/inc/lang/de/backlinks.txt b/inc/lang/de/backlinks.txt new file mode 100644 index 0000000..b510b8a --- /dev/null +++ b/inc/lang/de/backlinks.txt @@ -0,0 +1,3 @@ +====== Links hierher ====== + +Dies ist eine Liste der Seiten, welche zurück zur momentanen Seite führen. diff --git a/inc/lang/de/conflict.txt b/inc/lang/de/conflict.txt new file mode 100644 index 0000000..0d7cefd --- /dev/null +++ b/inc/lang/de/conflict.txt @@ -0,0 +1,5 @@ +====== Es gibt eine neuere Version ====== + +Es existiert eine neuere Version des aktuell in Bearbeitung befindlichen Dokumentes. Das heißt, jemand hat parallel an derselben 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/inc/lang/de/denied.txt b/inc/lang/de/denied.txt new file mode 100644 index 0000000..1965ed9 --- /dev/null +++ b/inc/lang/de/denied.txt @@ -0,0 +1,3 @@ +====== Zugang verweigert ====== + +Sie haben nicht die erforderliche Berechtigung, um diese Aktion durchzuführen. diff --git a/inc/lang/de/diff.txt b/inc/lang/de/diff.txt new file mode 100644 index 0000000..58890ac --- /dev/null +++ b/inc/lang/de/diff.txt @@ -0,0 +1,3 @@ +====== Unterschiede ====== + +Hier werden die Unterschiede zwischen zwei Versionen angezeigt. diff --git a/inc/lang/de/draft.txt b/inc/lang/de/draft.txt new file mode 100644 index 0000000..8cf9eb6 --- /dev/null +++ b/inc/lang/de/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/de/edit.txt b/inc/lang/de/edit.txt new file mode 100644 index 0000000..df01486 --- /dev/null +++ b/inc/lang/de/edit.txt @@ -0,0 +1 @@ +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/inc/lang/de/editrev.txt b/inc/lang/de/editrev.txt new file mode 100644 index 0000000..40a8b72 --- /dev/null +++ b/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. +---- diff --git a/inc/lang/de/index.txt b/inc/lang/de/index.txt new file mode 100644 index 0000000..28718f2 --- /dev/null +++ b/inc/lang/de/index.txt @@ -0,0 +1,3 @@ +====== Übersicht ====== + +Dies ist eine Übersicht über alle vorhandenen Seiten und [[doku>de:namespaces|Namensräume]]. diff --git a/inc/lang/de/install.html b/inc/lang/de/install.html new file mode 100644 index 0000000..6ad10c3 --- /dev/null +++ b/inc/lang/de/install.html @@ -0,0 +1,7 @@ +

    Diese Seite hilft Ihnen bei der Erstinstallation und Konfiguration von DokuWiki. Zusätzliche Informationen zu diesem Installationsskript finden Sie auf der entsprechenden Hilfe Seite.

    + +

    DokuWiki verwendet normale Dateien für das Speichern von Wikiseiten und anderen Informationen (Bilder, Suchindizes, alte Versionen usw.). Um DokuWiki betreiben zu können, muss 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.

    + +

    Dieses Skript hilft Ihnen beim ersten Einrichten des Zugangsschutzes (ACL) 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.

    + +

    Erfahrene Anwender oder Benutzer mit speziellen Konfigurationsbedürfnissen sollten die folgenden Links nutzen, um sich über Installation und Konfiguration zu informieren.

    diff --git a/inc/lang/de/jquery.ui.datepicker.js b/inc/lang/de/jquery.ui.datepicker.js new file mode 100644 index 0000000..8a08ebf --- /dev/null +++ b/inc/lang/de/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* German initialisation for the jQuery UI date picker plugin. */ +/* Written by Milian Wolff (mail@milianw.de). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.de = { + closeText: "Schließen", + prevText: "Zurück", + nextText: "Vor", + 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/inc/lang/de/lang.php b/inc/lang/de/lang.php new file mode 100644 index 0000000..119a9ef --- /dev/null +++ b/inc/lang/de/lang.php @@ -0,0 +1,406 @@ + + * @author Kurt Singer + * @author Robert Riebisch + * @author Andreas Gohr + * @author Markus Glaser + * @author Axel Schwarzer + * @author Eric Haberstroh + * @author C!own77 + * @author Anonymous + * @author Michaelsy + * @author Benjamin Molitor + * @author Alex Beck + * @author Jürgen Fredriksson + * @author Sebastian Engel + * @author Karl_de_Hall + * @author Michael Bohn + * @author Joel Strasser + * @author Joerg + * @author Christof + * @author Anika Henke + * @author Esther Brunner + * @author Matthias Grimm + * @author Michael Klier + * @author Leo Moll + * @author Florian Anderiasch + * @author Robin Kluth + * @author Arne Pelka + * @author Dirk Einecke + * @author Blitzi94 + * @author Robert Bogenschneider + * @author Niels Lange + * @author Christian Wichmann + * @author Matthias Schulte + * @author Paul Lachewsky + * @author Pierre Corell + * @author Mateng Schimmerlos + * @author Benedikt Fey + * @author Simon + * @author Hoisl + * @author Marcel Eickhoff + * @author Pascal Schröder + * @author Hendrik Diel + * @author Marco Hofmann + * @author Hella Breitkopf + */ +$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['js']['data_insecure'] = 'WARNUNG: Es scheint, als wäre Ihr Datenverzeichnis nicht ausreichend geschützt. Bitte informieren Sie sich zur Sicherheit von Webzugriffen in DokuWiki'; +$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 Namensräume'; +$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.
    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['allowedmime'] = 'Liste der erlaubten Dateiendungen'; +$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['unknowndate'] = 'Unbekanntes Datum'; +$lang['noflash'] = 'Das Adobe Flash Plugin 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 Dokuwiki-Installationsanleitung konsultieren.'; +$lang['i_funcna'] = 'Die PHP-Funktion %s ist nicht verfügbar. Unter Umständen wurde sie von Ihrem Hoster deaktiviert?'; +$lang['i_disabled'] = 'Es wurde von Ihrem Provider deaktiviert.'; +$lang['i_funcnmail'] = 'Hinweis: Die PHP-Funktion "mail()" ist nicht verfügbar. %s Alternativ können Sie das SMTP-Plugin installieren.'; +$lang['i_phpver'] = 'Ihre PHP-Version %s ist niedriger als die benötigte Version %s. Bitte aktualisieren Sie Ihre PHP-Installation.'; +$lang['i_mbfuncoverload'] = 'Um DokuWiki zu starten muss mbstring.func_overload in php.ini ausgeschaltet sein.'; +$lang['i_urandom'] = 'DokuWiki kann keine kryptografisch sicheren Werte für Cookies generieren. Möglicherweise möchten Sie Ihre "open_basedir"-Einstellungen in der zutreffenden php.ini auf korrekten Zugriff auf / dev/urandom überprüfen.'; +$lang['i_permfail'] = '%s ist nicht durch DokuWiki beschreibbar. Sie müssen die Berechtigungen dieses Ordners ändern!'; +$lang['i_confexists'] = '%s existiert bereits'; +$lang['i_writeerr'] = '%s 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=%s)'; +$lang['i_badval'] = '%s - unerlaubter oder leerer Wert'; +$lang['i_success'] = 'Die Konfiguration wurde erfolgreich abgeschlossen. Sie können jetzt die install.php löschen. Ihr neues DokuWiki 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 neues DokuWiki 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 %s. Sie können auch die Änderungen im gesamten Wiki sehen.'; +$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 %s Namensraum hochladen.'; +$lang['media_search'] = 'Im Namensraum %s 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['email_fail'] = 'PHP-Funktion "mail ()" fehlt oder ist deaktiviert. Die folgende E-Mail wurde nicht gesendet:'; +$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 %s'; +$lang['unable_to_parse_date'] = 'Parameter "%s" kann nicht geparsed werden.'; +$lang['email_signature_text'] = 'Diese E-Mail wurde erzeugt vom DokuWiki unter +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = 'Protokolldatei (Log file) zu groß. Vorherige Zeilen wurden übersprungen!'; +$lang['log_file_failed_to_open'] = 'Protokolldatei (Log file) konnte nicht geöffnet werden.'; +$lang['log_file_failed_to_read'] = 'Beim Lesen des Protokolls ist ein Fehler aufgetreten.'; diff --git a/inc/lang/de/locked.txt b/inc/lang/de/locked.txt new file mode 100644 index 0000000..58b8997 --- /dev/null +++ b/inc/lang/de/locked.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de/login.txt b/inc/lang/de/login.txt new file mode 100644 index 0000000..349dcd8 --- /dev/null +++ b/inc/lang/de/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de/mailtext.txt b/inc/lang/de/mailtext.txt new file mode 100644 index 0000000..5968a70 --- /dev/null +++ b/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/inc/lang/de/mailwrap.html b/inc/lang/de/mailwrap.html new file mode 100644 index 0000000..7df0cdc --- /dev/null +++ b/inc/lang/de/mailwrap.html @@ -0,0 +1,13 @@ + + + @TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + diff --git a/inc/lang/de/newpage.txt b/inc/lang/de/newpage.txt new file mode 100644 index 0000000..020f704 --- /dev/null +++ b/inc/lang/de/newpage.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de/norev.txt b/inc/lang/de/norev.txt new file mode 100644 index 0000000..75eb5e3 --- /dev/null +++ b/inc/lang/de/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de/onceexisted.txt b/inc/lang/de/onceexisted.txt new file mode 100644 index 0000000..0841470 --- /dev/null +++ b/inc/lang/de/onceexisted.txt @@ -0,0 +1,3 @@ +======= Diese Seite existiert nicht mehr ====== + +Sie sind einem Link zu einer Seite gefolgt, die es nicht mehr gibt. Um zu sehen, wann und wieso sie gelöscht wurde, um auf ältere Versionen zuzugreifen oder sie wiederherzustellen, können Sie die Liste **älterer Versionen** überprüfen. diff --git a/inc/lang/de/password.txt b/inc/lang/de/password.txt new file mode 100644 index 0000000..e6ab83c --- /dev/null +++ b/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/inc/lang/de/preview.txt b/inc/lang/de/preview.txt new file mode 100644 index 0000000..c8789d1 --- /dev/null +++ b/inc/lang/de/preview.txt @@ -0,0 +1,3 @@ +====== Vorschau ====== + +So wird Ihr Text später aussehen. Achtung: Der Text wurde noch **nicht gespeichert**! diff --git a/inc/lang/de/pwconfirm.txt b/inc/lang/de/pwconfirm.txt new file mode 100644 index 0000000..59954ca --- /dev/null +++ b/inc/lang/de/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/de/read.txt b/inc/lang/de/read.txt new file mode 100644 index 0000000..b531025 --- /dev/null +++ b/inc/lang/de/read.txt @@ -0,0 +1 @@ +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/inc/lang/de/recent.txt b/inc/lang/de/recent.txt new file mode 100644 index 0000000..0022b21 --- /dev/null +++ b/inc/lang/de/recent.txt @@ -0,0 +1,3 @@ +====== Letzte Änderungen ====== + +Die folgenden Seiten wurden zuletzt geändert: diff --git a/inc/lang/de/register.txt b/inc/lang/de/register.txt new file mode 100644 index 0000000..b14a070 --- /dev/null +++ b/inc/lang/de/register.txt @@ -0,0 +1,3 @@ +====== 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. [[doku>de:pagename]] diff --git a/inc/lang/de/registermail.txt b/inc/lang/de/registermail.txt new file mode 100644 index 0000000..e19fb8f --- /dev/null +++ b/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/inc/lang/de/resendpwd.txt b/inc/lang/de/resendpwd.txt new file mode 100644 index 0000000..a63fd5d --- /dev/null +++ b/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/inc/lang/de/resetpwd.txt b/inc/lang/de/resetpwd.txt new file mode 100644 index 0000000..1d228c7 --- /dev/null +++ b/inc/lang/de/resetpwd.txt @@ -0,0 +1,3 @@ +====== Neues Passwort setzen ====== + +Bitte geben Sie ein neues Passwort für Ihren Wiki-Zugang ein. diff --git a/inc/lang/de/revisions.txt b/inc/lang/de/revisions.txt new file mode 100644 index 0000000..cfbfcd3 --- /dev/null +++ b/inc/lang/de/revisions.txt @@ -0,0 +1,3 @@ +====== Ä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/inc/lang/de/searchpage.txt b/inc/lang/de/searchpage.txt new file mode 100644 index 0000000..19fe84b --- /dev/null +++ b/inc/lang/de/searchpage.txt @@ -0,0 +1,3 @@ +====== Suche ====== + +Unten sind die Ergebnisse Ihrer Suche gelistet. @CREATEPAGEINFO@ diff --git a/inc/lang/de/showrev.txt b/inc/lang/de/showrev.txt new file mode 100644 index 0000000..65f53c9 --- /dev/null +++ b/inc/lang/de/showrev.txt @@ -0,0 +1,2 @@ +**Dies ist eine alte Version des Dokuments!** +---- diff --git a/inc/lang/de/stopwords.txt b/inc/lang/de/stopwords.txt new file mode 100644 index 0000000..9b52e2a --- /dev/null +++ b/inc/lang/de/stopwords.txt @@ -0,0 +1,126 @@ +# 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 +www +zum +zur +über diff --git a/inc/lang/de/subscr_digest.txt b/inc/lang/de/subscr_digest.txt new file mode 100644 index 0000000..75d9236 --- /dev/null +++ b/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/inc/lang/de/subscr_form.txt b/inc/lang/de/subscr_form.txt new file mode 100644 index 0000000..4ba6afb --- /dev/null +++ b/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/inc/lang/de/subscr_list.txt b/inc/lang/de/subscr_list.txt new file mode 100644 index 0000000..1b2331a --- /dev/null +++ b/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/inc/lang/de/subscr_single.txt b/inc/lang/de/subscr_single.txt new file mode 100644 index 0000000..087ad5a --- /dev/null +++ b/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/inc/lang/de/updateprofile.txt b/inc/lang/de/updateprofile.txt new file mode 100644 index 0000000..b361ea2 --- /dev/null +++ b/inc/lang/de/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/de/uploadmail.txt b/inc/lang/de/uploadmail.txt new file mode 100644 index 0000000..3646bcc --- /dev/null +++ b/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/inc/lang/el/admin.txt b/inc/lang/el/admin.txt new file mode 100644 index 0000000..729004b --- /dev/null +++ b/inc/lang/el/admin.txt @@ -0,0 +1,3 @@ +====== Διαχείριση ====== + +Παρακάτω μπορείτε να βρείτε μια λίστα με τις λειτουργίες διαχείρισης στο DokuWiki diff --git a/inc/lang/el/adminplugins.txt b/inc/lang/el/adminplugins.txt new file mode 100644 index 0000000..ef1a285 --- /dev/null +++ b/inc/lang/el/adminplugins.txt @@ -0,0 +1 @@ +===== Πρόσθετα ===== \ No newline at end of file diff --git a/inc/lang/el/backlinks.txt b/inc/lang/el/backlinks.txt new file mode 100644 index 0000000..95e5eb0 --- /dev/null +++ b/inc/lang/el/backlinks.txt @@ -0,0 +1,3 @@ +====== Σύνδεσμοι προς την τρέχουσα σελίδα ====== + +Οι παρακάτω σελίδες περιέχουν συνδέσμους προς την τρέχουσα σελίδα. diff --git a/inc/lang/el/conflict.txt b/inc/lang/el/conflict.txt new file mode 100644 index 0000000..402ed1d --- /dev/null +++ b/inc/lang/el/conflict.txt @@ -0,0 +1,5 @@ +====== Υπάρχει μία νεώτερη έκδοση αυτής της σελίδας ====== + +Υπάρχει μία νεώτερη έκδοση της σελίδας που τρoποποιήσατε. Αυτό συμβαίνει εάν κάποιος άλλος χρήστης τροποποίησε την ίδια σελίδα ενώ την επεξεργαζόσασταν και εσείς. + +Ελέγξτε προσεκτικά τις διαφορές που παρουσιάζονται παρακάτω και έπειτα αποφασίστε ποια έκδοση θα κρατήσετε. Εάν επιλέξετε ''Αποθήκευση'', η δική σας έκδοση θα αποθηκευτεί. Εάν επιλέξετε ''Ακύρωση'', η νεώτερη έκδοση θα διατηρηθεί ως τρέχουσα. diff --git a/inc/lang/el/denied.txt b/inc/lang/el/denied.txt new file mode 100644 index 0000000..d45133d --- /dev/null +++ b/inc/lang/el/denied.txt @@ -0,0 +1,3 @@ +====== Μη επιτρεπτή ενέργεια ====== + +Συγγνώμη, αλλά δεν έχετε επαρκή δικαιώματα για την συγκεκριμένη ενέργεια. diff --git a/inc/lang/el/diff.txt b/inc/lang/el/diff.txt new file mode 100644 index 0000000..dde065b --- /dev/null +++ b/inc/lang/el/diff.txt @@ -0,0 +1,3 @@ +====== Σύγκριση εκδόσεων ====== + +Εδώ βλέπετε τις διαφορές μεταξύ της επιλεγμένης έκδοσης και της τρέχουσας έκδοσης της σελίδας. diff --git a/inc/lang/el/draft.txt b/inc/lang/el/draft.txt new file mode 100644 index 0000000..1deff22 --- /dev/null +++ b/inc/lang/el/draft.txt @@ -0,0 +1,5 @@ +====== Βρέθηκε μία αυτόματα αποθηκευμένη σελίδα ====== + +Η τελευταία τροποποίηση αυτής της σελίδας δεν ολοκληρώθηκε επιτυχώς. Η εφαρμογή αποθήκευσε αυτόματα μία εκδοχή της σελίδας την ώρα που την επεξεργαζόσασταν και μπορείτε να την χρησιμοποιήσετε για να συνεχίσετε την εργασία σας. Παρακάτω φαίνεται αυτή η πιο πρόσφατη αυτόματα αποθηκευμένη σελίδα. + +Μπορείτε να //επαναφέρετε// αυτή την αυτόματα αποθηκευμένη σελίδα ως τρέχουσα, να την //διαγράψετε// ή να //ακυρώσετε// τη διαδικασία τροποποίησης της τρέχουσας σελίδας. diff --git a/inc/lang/el/edit.txt b/inc/lang/el/edit.txt new file mode 100644 index 0000000..4d1b4df --- /dev/null +++ b/inc/lang/el/edit.txt @@ -0,0 +1 @@ +Τροποποιήστε την σελίδα **μόνο** εάν μπορείτε να την **βελτιώσετε**. Για να κάνετε δοκιμές με ασφάλεια ή να εξοικειωθείτε με το περιβάλλον χρησιμοποιήστε το [[playground:playground|playground]]. Αφού τροποποιήστε την σελίδα επιλέξτε ''Αποθήκευση''. Δείτε τις [[wiki:syntax|οδηγίες]] για την σωστή σύνταξη. diff --git a/inc/lang/el/editrev.txt b/inc/lang/el/editrev.txt new file mode 100644 index 0000000..11b688b --- /dev/null +++ b/inc/lang/el/editrev.txt @@ -0,0 +1,2 @@ +**Φορτώσατε μια παλαιότερη έκδοση της σελίδας!** Εάν την αποθηκεύσετε, θα αντικαταστήσει την τρέχουσα έκδοση. +---- diff --git a/inc/lang/el/index.txt b/inc/lang/el/index.txt new file mode 100644 index 0000000..ad8a9d2 --- /dev/null +++ b/inc/lang/el/index.txt @@ -0,0 +1,3 @@ +====== Κατάλογος ====== + +Εδώ βλέπετε τον κατάλογο όλων των διαθέσιμων σελίδων, ταξινομημένες κατά [[doku>el:namespaces|φακέλους]]. diff --git a/inc/lang/el/install.html b/inc/lang/el/install.html new file mode 100644 index 0000000..8ad496d --- /dev/null +++ b/inc/lang/el/install.html @@ -0,0 +1,7 @@ +

    Αυτή η σελίδα περιέχει πληροφορίες που βοηθούν στην αρχική εγκατάσταση και ρύθμιση της εφαρμογής Dokuwiki. Περισσότερες πληροφορίες υπάρχουν στη σελίδα τεκμηρίωσης του οδηγού εγκατάστασης.

    + +

    Η εφαρμογή DokuWiki χρησιμοποιεί απλά αρχεία για να αποθηκεύει τις σελίδες wiki καθώς και πληροφορίες που σχετίζονται με αυτές (π.χ. εικόνες, καταλόγους αναζήτησης, παλαιότερες εκδόσεις σελίδων, κλπ). Για να λειτουργεί σωστά η εφαρμογή DokuWiki πρέπει να έχει δικαιώματα εγγραφής στους φακέλους που φιλοξενούν αυτά τα αρχεία. Ο οδηγός εγκατάστασης δεν έχει την δυνατότητα να παραχωρήσει αυτά τα δικαιώματα εγγραφής στους σχετικούς φακέλους. Ο κανονικός τρόπος για να γίνει αυτό είναι είτε απευθείας σε περιβάλλον γραμμής εντολών ή, εάν δεν έχετε τέτοια πρόσβαση, μέσω FTP ή του πίνακα ελέγχου του περιβάλλοντος φιλοξενίας (π.χ. cPanel).

    + +

    Ο οδηγός εγκατάστασης θα ρυθμίσει την εφαρμογή DokuWiki ώστε να χρησιμοποιεί ACL, με τρόπο ώστε ο διαχειριστής να έχει δυνατότητα εισόδου και πρόσβαση στο μενού διαχείρισης της εφαρμογής για εγκατάσταση επεκτάσεων, διαχείριση χρηστών, διαχείριση δικαιωμάτων πρόσβασης στις διάφορες σελίδες και αλλαγή των ρυθμίσεων. Αυτό δεν είναι απαραίτητο για να λειτουργήσει η εφαρμογή, αλλά κάνει την διαχείρισή της ευκολότερη.

    + +

    Οι έμπειροι χρήστες και οι χρήστες με ειδικές απαιτήσεις μπορούν να επισκεφθούν τις σελίδες που περιέχουν λεπτομερείς οδηγίες εγκατάστασης και πληροφορίες για τις ρυθμίσεις.

    diff --git a/inc/lang/el/jquery.ui.datepicker.js b/inc/lang/el/jquery.ui.datepicker.js new file mode 100644 index 0000000..054a5e2 --- /dev/null +++ b/inc/lang/el/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Greek (el) initialisation for the jQuery UI date picker plugin. */ +/* Written by Alex Cicovic (http://www.alexcicovic.com) */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/el/lang.php b/inc/lang/el/lang.php new file mode 100644 index 0000000..c2abc03 --- /dev/null +++ b/inc/lang/el/lang.php @@ -0,0 +1,367 @@ + + * @author Katerina Katapodi + * @author Thanos Massias + * @author Αθανάσιος Νταής + * @author Konstantinos Koryllos + * @author George Petsagourakis + * @author Petros Vidalis + * @author Vasileios Karavasilis + * @author Constantinos Xanthopoulos + * @author chris taklis + * @author cross + * @author Zacharias Sdregas + */ +$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['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 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['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'] = 'Ο λογαριασμός δημιουργήθηκε και ο κωδικός εστάλει με 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.
    Αυτή η επιλογή δεν μπορεί να αναιρεθεί.'; +$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['rssfailed'] = 'Παρουσιάστηκε κάποιο σφάλμα κατά την ανάγνωση αυτού του feed: '; +$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['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'] = 'Το Adobe Flash Plugin απαιτείται για την προβολή αυτού του στοιχείου.'; +$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. +Πρέπει είτε να κάνετε νέα εγκατάσταση, χρησιμοποιώντας το αρχικό πακέτο εγκατάστασης, ή να συμβουλευτείτε τις οδηγίες εγκατάστασης της εφαρμογής.'; +$lang['i_funcna'] = 'Η λειτουργία %s της PHP δεν είναι διαθέσιμη. Πιθανόν να είναι απενεργοποιημένη στις ρυθμίσεις έναρξης της PHP'; +$lang['i_phpver'] = 'Η έκδοση %s της PHP που έχετε είναι παλαιότερη της απαιτούμενης %s. Πρέπει να αναβαθμίσετε την PHP.'; +$lang['i_mbfuncoverload'] = 'Για να εκτελεστεί το Dokuwiki πρέπει να απενεργοποιήσετε τη ρύθμιση mbstring.func_overload στο αρχείο php.ini'; +$lang['i_permfail'] = 'Ο φάκελος %s δεν είναι εγγράψιμος από την εφαρμογή DokuWiki. Πρέπει να διορθώσετε τα δικαιώματα πρόσβασης αυτού του φακέλου!'; +$lang['i_confexists'] = '%s υπάρχει ήδη'; +$lang['i_writeerr'] = 'Δεν είναι δυνατή η δημιουργία του %s. Πρέπει να διορθώσετε τα δικαιώματα πρόσβασης αυτού του φακέλου/αρχείου και να δημιουργήσετε το αρχείο χειροκίνητα!'; +$lang['i_badhash'] = 'Μη αναγνωρίσιμο ή τροποποιημένο αρχείο dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - λάθος ή ανύπαρκτη τιμή'; +$lang['i_success'] = 'Η εγκατάσταση ολοκληρώθηκε επιτυχώς. Μπορείτε πλέον να διαγράψετε το αρχείο install.php. Συνεχίστε στο νέο σας DokuWiki.'; +$lang['i_failure'] = 'Εμφανίστηκαν κάποια προβλήματα στη διαδικασία ανανέωσης των αρχείων ρυθμίσεων. Πιθανόν να χρειάζεται να τα τροποποιήσετε χειροκίνητα ώστε να μπορείτε να χρησιμοποιήσετε το νέο σας DokuWiki.'; +$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'] = 'Βλέπετε τις αλλαγές εντός του φακέλου %s. Μπορείτε επίσης να δείτε τις πρόσφατες αλλαγές σε όλο το wiki.'; +$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'] = 'Φόρτωση στο %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 Markup'; +$lang['page_nonexist_rev'] = 'Δεν υπήρξε σελίδα στο %s. Δημιουργήθηκε στη συνέχεια στο %s,.'; +$lang['unable_to_parse_date'] = 'Δεν μπόρεσε να περάσει στην παράμετρο \'\'%s\'\'.'; +$lang['email_signature_text'] = 'Αυτό το e-mail δημιουργήθηκε αυτόματα από την εφαρμογή DokuWiki στην διεύθυνση +@DOKUWIKIURL@'; diff --git a/inc/lang/el/locked.txt b/inc/lang/el/locked.txt new file mode 100644 index 0000000..20ffeb7 --- /dev/null +++ b/inc/lang/el/locked.txt @@ -0,0 +1,4 @@ +====== Κλειδωμένη σελίδα ====== + +Αυτή η σελίδα είναι προς το παρόν δεσμευμένη για τροποποίηση από άλλον χρήστη. +Θα πρέπει να περιμένετε μέχρι ο συγκεκριμένος χρήστης να σταματήσει να την επεξεργάζεται ή να εκπνεύσει το χρονικό όριο για το σχετικό κλείδωμα. diff --git a/inc/lang/el/login.txt b/inc/lang/el/login.txt new file mode 100644 index 0000000..4a9a60f --- /dev/null +++ b/inc/lang/el/login.txt @@ -0,0 +1,3 @@ +====== Σύνδεση χρήστη ====== + +Αυτή την στιγμή δεν έχετε συνδεθεί ως χρήστης! Για να συνδεθείτε, εισάγετε τα στοιχεία σας στην παρακάτω φόρμα. Πρέπει να έχετε ενεργοποιήσει τα cookies στο πρόγραμμα περιήγηση σας. diff --git a/inc/lang/el/mailtext.txt b/inc/lang/el/mailtext.txt new file mode 100644 index 0000000..cc2a22f --- /dev/null +++ b/inc/lang/el/mailtext.txt @@ -0,0 +1,13 @@ +Μία σελίδα προστέθηκε ή τροποποιήθηκε στο DokuWiki σας. +Αυτά είναι τα αντίστοιχα στοιχεία: + +Ημερομηνία : @DATE@ +Φυλλομετρητής : @BROWSER@ +IP-Διεύθυνση : @IPADDRESS@ +Όνομα υπολογιστή: @HOSTNAME@ +Παλιά έκδοση : @OLDPAGE@ +Νέα έκδοση : @NEWPAGE@ +Σύνοψη : @SUMMARY@ +Χρήστης : @USER@ + +@DIFF@ diff --git a/inc/lang/el/mailwrap.html b/inc/lang/el/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/el/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/el/newpage.txt b/inc/lang/el/newpage.txt new file mode 100644 index 0000000..6d9c955 --- /dev/null +++ b/inc/lang/el/newpage.txt @@ -0,0 +1,3 @@ +====== Αυτή η σελίδα δεν υπάρχει ακόμη ====== + +Η σελίδα που ζητάτε δεν υπάρχει ακόμη. Aν όμως έχετε επαρκή δικαιώματα, μπορείτε να την δημιουργήσετε επιλέγοντας **Δημιουργία σελίδας**. diff --git a/inc/lang/el/norev.txt b/inc/lang/el/norev.txt new file mode 100644 index 0000000..87d24ed --- /dev/null +++ b/inc/lang/el/norev.txt @@ -0,0 +1,3 @@ +====== Αυτή η έκδοση δεν υπάρχει ====== + +Η έκδοση που αναζητήσατε δεν υπάρχει. Μπορείτε να δείτε λίστα με τις παλαιότερες εκδόσεις της τρέχουσας σελίδας πατώντας ''Παλαιότερες εκδόσεις σελίδας''. diff --git a/inc/lang/el/onceexisted.txt b/inc/lang/el/onceexisted.txt new file mode 100644 index 0000000..46c3816 --- /dev/null +++ b/inc/lang/el/onceexisted.txt @@ -0,0 +1,2 @@ +Αυτή η σελίδα δεν υπάρχει πια +Ακολουθήσατε έναν σύνδεσμο σε μια σελίδα που δεν υπάρχει πια. Μπορείτε να ελέγξετε την λίστα στο **old revisions** για να δείτε αν και γιατί αφαιρέθηκε, να πάτε σε παλαιότερους ελέγχους ή να την ανανεώσετε. diff --git a/inc/lang/el/password.txt b/inc/lang/el/password.txt new file mode 100644 index 0000000..c664cb0 --- /dev/null +++ b/inc/lang/el/password.txt @@ -0,0 +1,6 @@ +@FULLNAME@!, γειά σας. + +Αυτά είναι τα στοιχεία εισόδου για το @TITLE@ στο @DOKUWIKIURL@ + +Όνομα : @LOGIN@ +Συνθηματικό : @PASSWORD@ diff --git a/inc/lang/el/preview.txt b/inc/lang/el/preview.txt new file mode 100644 index 0000000..8369fad --- /dev/null +++ b/inc/lang/el/preview.txt @@ -0,0 +1,3 @@ +====== Προεπισκόπηση ====== + +Αυτή είναι μια προεπισκόπηση του πως θα δείχνει η σελίδα. **Υπενθύμιση: Οι αλλαγές σας δεν έχουν αποθηκευθεί ακόμη**! diff --git a/inc/lang/el/pwconfirm.txt b/inc/lang/el/pwconfirm.txt new file mode 100644 index 0000000..3b6cf0e --- /dev/null +++ b/inc/lang/el/pwconfirm.txt @@ -0,0 +1,9 @@ +Γεια σας @FULLNAME@! + +Κάποιος ζήτησε τη δημιουργία νέου συνθηματικού για τον λογαριασμό @TITLE@ που διατηρείτε στο @DOKUWIKIURL@ + +Αν δεν ζητήσατε εσείς την δημιουργία νέου συνθηματικού απλά αγνοήστε αυτό το e-mail. + +Αν όντως εσείς ζητήσατε την δημιουργία νέου συνθηματικού, ακολουθήστε τον παρακάτω σύνδεσμο για να το επιβεβαιώσετε. + +@CONFIRM@ diff --git a/inc/lang/el/read.txt b/inc/lang/el/read.txt new file mode 100644 index 0000000..a620ab5 --- /dev/null +++ b/inc/lang/el/read.txt @@ -0,0 +1,2 @@ +Μπορείτε να διαβάσετε αυτή την σελίδα αλλά δεν μπορείτε να την τροποποιήσετε. +Αν πιστεύετε ότι αυτό δεν είναι σωστό, απευθυνθείτε στον διαχειριστή της εφαρμογής. diff --git a/inc/lang/el/recent.txt b/inc/lang/el/recent.txt new file mode 100644 index 0000000..78c74a6 --- /dev/null +++ b/inc/lang/el/recent.txt @@ -0,0 +1,3 @@ +====== Πρόσφατες αλλαγές ====== + +Οι παρακάτω σελίδες τροποποιήθηκαν πρόσφατα: diff --git a/inc/lang/el/register.txt b/inc/lang/el/register.txt new file mode 100644 index 0000000..d34c544 --- /dev/null +++ b/inc/lang/el/register.txt @@ -0,0 +1,3 @@ +====== Εγγραφή νέου χρήστη ====== + +Συμπληρώστε όλα τα παρακάτω πεδία για να δημιουργήσετε ένα νέο λογαριασμό σε αυτό το wiki. Πρέπει να δώσετε μια **υπαρκτή e-mail διεύθυνση** - ο κωδικός σας θα σας αποσταλεί σε αυτήν. Το όνομα χρήστη θα πρέπει να πληρεί τις ίδιες απαιτήσεις ονόματος που ισχύουν και για τους [[doku>el:pagename|φακέλους]]. diff --git a/inc/lang/el/registermail.txt b/inc/lang/el/registermail.txt new file mode 100644 index 0000000..5266fc1 --- /dev/null +++ b/inc/lang/el/registermail.txt @@ -0,0 +1,10 @@ +Ένας νέος χρήστης εγγράφηκε. Ορίστε οι λεπτομέρειες: + +Χρήστης : @NEWUSER@ +Όνομα : @NEWNAME@ +e-mail : @NEWEMAIL@ + +Ημερομηνία : @DATE@ +Φυλλομετρητής : @BROWSER@ +IP-Διεύθυνση : @IPADDRESS@ +Όνομα υπολογιστή: @HOSTNAME@ diff --git a/inc/lang/el/resendpwd.txt b/inc/lang/el/resendpwd.txt new file mode 100644 index 0000000..8d82f60 --- /dev/null +++ b/inc/lang/el/resendpwd.txt @@ -0,0 +1,3 @@ +====== Αποστολή νέου κωδικού ====== + +Συμπληρώστε όλα τα παρακάτω πεδία για να λάβετε ένα νέο κωδικό για τον λογαριασμό σας σε αυτό το wiki. Ο νέος κωδικός σας θα σταλεί στην e-mail διεύθυνση που έχετε ήδη δηλώσει. Το όνομα πρέπει να είναι αυτό που ισχύει για τον λογαριασμό σας σε αυτό το wiki. diff --git a/inc/lang/el/resetpwd.txt b/inc/lang/el/resetpwd.txt new file mode 100644 index 0000000..cbb1c42 --- /dev/null +++ b/inc/lang/el/resetpwd.txt @@ -0,0 +1,3 @@ +====== Εισάγετε νέο κωδικό πρόσβασης ====== + +Παρακαλούμε, εισάγετε έναν νέο κωδικό πρόσβασης για τον λογαριασμό σας. diff --git a/inc/lang/el/revisions.txt b/inc/lang/el/revisions.txt new file mode 100644 index 0000000..955fa17 --- /dev/null +++ b/inc/lang/el/revisions.txt @@ -0,0 +1,8 @@ +====== Παλαιότερες εκδόσεις σελίδας ====== + +Οι παρακάτω είναι παλαιότερες εκδόσεις της τρέχουσας σελίδας. +Εάν θέλετε να αντικαταστήσετε την τρέχουσα σελίδα με κάποια από τις παλαιότερες εκδόσεις της κάντε τα παρακάτω: + * επιλέξτε την σχετική έκδοση + * επιλέξτε ''Τροποποίηση σελίδας'' + * κάνετε τυχόν αλλαγές + * αποθηκεύστε την diff --git a/inc/lang/el/searchpage.txt b/inc/lang/el/searchpage.txt new file mode 100644 index 0000000..bee13de --- /dev/null +++ b/inc/lang/el/searchpage.txt @@ -0,0 +1,3 @@ +====== Αναζήτηση ====== + +Τα αποτελέσματα της αναζήτησής σας. @CREATEPAGEINFO@ diff --git a/inc/lang/el/showrev.txt b/inc/lang/el/showrev.txt new file mode 100644 index 0000000..a6ba3f9 --- /dev/null +++ b/inc/lang/el/showrev.txt @@ -0,0 +1,2 @@ +**Βλέπετε μια παλαιότερη έκδοση της σελίδας!** +---- diff --git a/inc/lang/el/stopwords.txt b/inc/lang/el/stopwords.txt new file mode 100644 index 0000000..29caa1a --- /dev/null +++ b/inc/lang/el/stopwords.txt @@ -0,0 +1,104 @@ +# 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 +και +ήταν +το +ενός +να +πολύ +του +όμως +η +κατά +της +αυτή +με +όταν +που +μέσα +την +οποίο +από +πως +για +έτσι +τα +στους +είναι +μέσω +των +όλα +σε +καθώς +ο +αυτά +οι +προς +στο +ένας +θα +πριν +τη +μου +στην +όχι +τον +χωρίς +τους +επίσης +δεν +μεταξύ +τις +μέχρι +ένα +έναν +μια +μιας +ότι +αφού +ή +ακόμα +στη +όπου +στα +είχε +μας +δηλαδή +αλλά +τρόπος +στον +όσο +στις +ακόμη +αυτό +τόσο +όπως +έχουμε +αν +ώστε +μπορεί +αυτές +μετά +γιατί +σας +πάνω +δύο +τότε +τι +τώρα +ως +κάτι +κάθε +άλλο +πρέπει +μην +πιο +εδώ +οποία +είτε +μόνο +μη +ενώ +www diff --git a/inc/lang/el/subscr_digest.txt b/inc/lang/el/subscr_digest.txt new file mode 100644 index 0000000..5ee54d3 --- /dev/null +++ b/inc/lang/el/subscr_digest.txt @@ -0,0 +1,16 @@ +Χαίρετε! + +Η σελίδα @PAGE@ στο @TITLE@ άλλαξε. +Ορίστε οι αλλαγές: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Παλιά έκδοση: @OLDPAGE@ +Νέα έκδοση: @NEWPAGE@ + +Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε +στο wiki στην διεύθυνση @DOKUWIKIURL@ +και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@ +και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου. diff --git a/inc/lang/el/subscr_form.txt b/inc/lang/el/subscr_form.txt new file mode 100644 index 0000000..c21a29a --- /dev/null +++ b/inc/lang/el/subscr_form.txt @@ -0,0 +1,3 @@ +====== Διαχείριση Εγγραφών σε Ειδοποιήσεις ====== + +Εδώ μπορείτε να διαχειριστείτε τις εγγραφές σας στις ειδοποιήσεις για αλλαγές στην τρέχουσα σελίδα και φάκελο. \ No newline at end of file diff --git a/inc/lang/el/subscr_list.txt b/inc/lang/el/subscr_list.txt new file mode 100644 index 0000000..11ebf15 --- /dev/null +++ b/inc/lang/el/subscr_list.txt @@ -0,0 +1,16 @@ +Χαίρετε! + +Η σελίδα @PAGE@ στο @TITLE@ άλλαξε. + +Κάποιες σελίδες στον φάκελο @PAGE@ του wiki +@TITLE@ έχουν αλλάξει. +Ορίστε οι αλλαγμένες σελίδες: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε στο wiki +στην διεύθυνση @DOKUWIKIURL@ +και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@ +και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου. diff --git a/inc/lang/el/subscr_single.txt b/inc/lang/el/subscr_single.txt new file mode 100644 index 0000000..b67631c --- /dev/null +++ b/inc/lang/el/subscr_single.txt @@ -0,0 +1,18 @@ +Χαίρετε! + +Η σελίδα @PAGE@ στο @TITLE@ άλλαξε. +Ορίστε οι αλλαγές: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- +Ημερομηνία : @DATE@ +Χρήστης : @USER@ +Περίληψη αλλαγών: @SUMMARY@ +Παλιά έκδοση: @OLDPAGE@ +Νέα έκδοση: @NEWPAGE@ + +Για να σταματήσουν αυτές οι ειδοποιήσεις συνδεθείτε στο wiki +στην διεύθυνση @DOKUWIKIURL@ +και στην συνέχεια επισκεφθείτε το @SUBSCRIBE@ +και διαγραφείτε από τις ειδοποιήσεις της σελίδας ή του φακέλου. diff --git a/inc/lang/el/updateprofile.txt b/inc/lang/el/updateprofile.txt new file mode 100644 index 0000000..ccb9596 --- /dev/null +++ b/inc/lang/el/updateprofile.txt @@ -0,0 +1,3 @@ +====== Τροποποίηση προφίλ ====== + +Τροποποιήστε **μόνο** τα πεδία που θέλετε να αλλάξετε. Δεν μπορείτε να αλλάξετε το πεδίο ''Όνομα''. diff --git a/inc/lang/el/uploadmail.txt b/inc/lang/el/uploadmail.txt new file mode 100644 index 0000000..c9cfca9 --- /dev/null +++ b/inc/lang/el/uploadmail.txt @@ -0,0 +1,11 @@ +Ένα αρχείο φορτώθηκε στο DokuWiki σας. +Αυτά είναι τα αντίστοιχα στοιχεία: + +Αρχείο : @MEDIA@ +Ημερομηνία : @DATE@ +Φυλλομετρητής : @BROWSER@ +IP-Διεύθυνση : @IPADDRESS@ +Όνομα υπολογιστή: @HOSTNAME@ +Μέγεθος : @SIZE@ +MIME Type : @MIME@ +Χρήστης : @USER@ diff --git a/inc/lang/en/admin.txt b/inc/lang/en/admin.txt new file mode 100644 index 0000000..8998ca9 --- /dev/null +++ b/inc/lang/en/admin.txt @@ -0,0 +1,3 @@ +====== Administration ====== + +Below you can find a list of administrative tasks available in DokuWiki. diff --git a/inc/lang/en/adminplugins.txt b/inc/lang/en/adminplugins.txt new file mode 100644 index 0000000..3ec46cf --- /dev/null +++ b/inc/lang/en/adminplugins.txt @@ -0,0 +1,2 @@ +===== Additional Plugins ===== + diff --git a/inc/lang/en/backlinks.txt b/inc/lang/en/backlinks.txt new file mode 100644 index 0000000..55514bf --- /dev/null +++ b/inc/lang/en/backlinks.txt @@ -0,0 +1,3 @@ +====== Backlinks ====== + +This is a list of pages that seem to link back to the current page. diff --git a/inc/lang/en/conflict.txt b/inc/lang/en/conflict.txt new file mode 100644 index 0000000..2586a2a --- /dev/null +++ b/inc/lang/en/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/en/denied.txt b/inc/lang/en/denied.txt new file mode 100644 index 0000000..e6fade4 --- /dev/null +++ b/inc/lang/en/denied.txt @@ -0,0 +1,3 @@ +====== Permission Denied ====== + +Sorry, you don't have enough rights to continue. diff --git a/inc/lang/en/diff.txt b/inc/lang/en/diff.txt new file mode 100644 index 0000000..46f0b34 --- /dev/null +++ b/inc/lang/en/diff.txt @@ -0,0 +1,3 @@ +====== Differences ====== + +This shows you the differences between two versions of the page. diff --git a/inc/lang/en/draft.txt b/inc/lang/en/draft.txt new file mode 100644 index 0000000..b6a930a --- /dev/null +++ b/inc/lang/en/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/en/edit.txt b/inc/lang/en/edit.txt new file mode 100644 index 0000000..0f395b5 --- /dev/null +++ b/inc/lang/en/edit.txt @@ -0,0 +1 @@ +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/inc/lang/en/editrev.txt b/inc/lang/en/editrev.txt new file mode 100644 index 0000000..638216b --- /dev/null +++ b/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/inc/lang/en/index.txt b/inc/lang/en/index.txt new file mode 100644 index 0000000..dced649 --- /dev/null +++ b/inc/lang/en/index.txt @@ -0,0 +1,3 @@ +====== Sitemap ====== + +This is a sitemap over all available pages ordered by [[doku>namespaces|namespaces]]. diff --git a/inc/lang/en/install.html b/inc/lang/en/install.html new file mode 100644 index 0000000..fa6b99a --- /dev/null +++ b/inc/lang/en/install.html @@ -0,0 +1,7 @@ +

    This page assists in the first time installation and configuration of Dokuwiki. More info on this installer is available on it's own documentation page.

    + +

    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 must 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).

    + +

    This installer will setup your DokuWiki configuration for ACL, 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.

    + +

    Experienced users or users with special setup requirements should use these links for details concerning installation instructions and configuration settings.

    diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php new file mode 100644 index 0000000..4eb4d2e --- /dev/null +++ b/inc/lang/en/lang.php @@ -0,0 +1,405 @@ + + * @author Anika Henke + * @author Matthias Grimm + * @author Matthias Schulte + */ +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '“'; //“ +$lang['doublequoteclosing'] = '”'; //” +$lang['singlequoteopening'] = '‘'; //‘ +$lang['singlequoteclosing'] = '’'; //’ +$lang['apostrophe'] = '’'; //’ + +$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.
    This action can not be undone.'; +$lang['profconfdeletemissing'] = 'Confirmation check box not ticked'; +$lang['proffail'] = 'User profile was not updated.'; + + +$lang['proftokenlegend'] = 'Authentication Token'; +$lang['proftokengenerate'] = 'Reset Token'; +$lang['proftokeninfo'] = 'The Authentication Token can be used to let 3rd party applications to log in and act on your behalf. Resetting the token will invalidate the old one and log out all applications that used the previous token.'; + +$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['allowedmime'] = 'List of allowed file extensions'; +$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['js']['data_insecure'] = 'WARNING: It seems your data directory is not properly secured. Please read about Web Access Security in DokuWiki.'; + +$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['unknowndate'] = 'Unknown date'; +$lang['noflash'] = 'The Adobe Flash Plugin 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 + Dokuwiki installation instructions'; +$lang['i_funcna'] = 'PHP function %s is not available. Maybe your hosting provider disabled it for some reason?'; +$lang['i_disabled'] = 'It has been disabled by your provider.'; +$lang['i_funcnmail'] = 'Note: The PHP mail function is not available. %s' . + ' If it remains unavailable, you may install the smtp plugin.'; +$lang['i_phpver'] = 'Your PHP version %s is lower than the needed %s. You need to upgrade your PHP install.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload must be disabled in php.ini to run DokuWiki.'; +$lang['i_urandom'] = 'DokuWiki cannot create cryptographically secure numbers for cookies. You may want to check your open_basedir settings in php.ini for proper /dev/urandom access.'; +$lang['i_permfail'] = '%s is not writable by DokuWiki. You need to fix the permission settings of this directory!'; +$lang['i_confexists'] = '%s already exists'; +$lang['i_writeerr'] = 'Unable to create %s. You will need to check directory/file permissions and create the file manually.'; +$lang['i_badhash'] = 'unrecognised or modified dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - illegal or empty value'; +$lang['i_success'] = 'The configuration was finished successfully. You may delete the install.php file now. Continue to + your new DokuWiki.'; +$lang['i_failure'] = 'Some errors occurred while writing the configuration files. You may need to fix them manually before + you can use your new DokuWiki.'; +$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 %s namespace. You can also view the recent changes of the whole wiki.'; +$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['email_fail'] = 'PHP mail() missing or disabled. The following email was not sent: '; +$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 %s.'; +$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 + +$lang['log_file_too_large'] = 'Log file too large. Previous lines skipped!'; +$lang['log_file_failed_to_open'] = 'Failed to open log file.'; +$lang['log_file_failed_to_read'] = 'An error occurred while reading the log.'; diff --git a/inc/lang/en/locked.txt b/inc/lang/en/locked.txt new file mode 100644 index 0000000..af6347a --- /dev/null +++ b/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/inc/lang/en/login.txt b/inc/lang/en/login.txt new file mode 100644 index 0000000..151bf7f --- /dev/null +++ b/inc/lang/en/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/en/mailtext.txt b/inc/lang/en/mailtext.txt new file mode 100644 index 0000000..eac4035 --- /dev/null +++ b/inc/lang/en/mailtext.txt @@ -0,0 +1,15 @@ +A page in your DokuWiki was added or changed. Here are the details: + +Browser : @BROWSER@ +IP Address : @IPADDRESS@ +Hostname : @HOSTNAME@ +Old Revision : @OLDPAGE@ +New Revision : @NEWPAGE@ +Date of New Revision: @DATE@ +Edit Summary : @SUMMARY@ +User : @USER@ + +There may be newer changes after this revision. If this +happens, a message will be shown on the top of the rev page. + +@DIFF@ diff --git a/inc/lang/en/mailwrap.html b/inc/lang/en/mailwrap.html new file mode 100644 index 0000000..7df0cdc --- /dev/null +++ b/inc/lang/en/mailwrap.html @@ -0,0 +1,13 @@ + + + @TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + diff --git a/inc/lang/en/newpage.txt b/inc/lang/en/newpage.txt new file mode 100644 index 0000000..c9ae6e6 --- /dev/null +++ b/inc/lang/en/newpage.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/en/norev.txt b/inc/lang/en/norev.txt new file mode 100644 index 0000000..b24c792 --- /dev/null +++ b/inc/lang/en/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/en/onceexisted.txt b/inc/lang/en/onceexisted.txt new file mode 100644 index 0000000..a1d6cef --- /dev/null +++ b/inc/lang/en/onceexisted.txt @@ -0,0 +1,3 @@ +======= This page does not exist anymore ====== + +You've followed a link to a page that no longer exists. You can check the list of **Old revisions** to see when and why it was deleted, access old revisions or restore it. diff --git a/inc/lang/en/password.txt b/inc/lang/en/password.txt new file mode 100644 index 0000000..0a0dfb5 --- /dev/null +++ b/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/inc/lang/en/preview.txt b/inc/lang/en/preview.txt new file mode 100644 index 0000000..6727056 --- /dev/null +++ b/inc/lang/en/preview.txt @@ -0,0 +1,3 @@ +====== Preview ====== + +This is a preview of what your text will look like. **Remember: It is not saved yet**! diff --git a/inc/lang/en/pwconfirm.txt b/inc/lang/en/pwconfirm.txt new file mode 100644 index 0000000..44bdeb4 --- /dev/null +++ b/inc/lang/en/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/en/read.txt b/inc/lang/en/read.txt new file mode 100644 index 0000000..6e2af13 --- /dev/null +++ b/inc/lang/en/read.txt @@ -0,0 +1 @@ +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/inc/lang/en/recent.txt b/inc/lang/en/recent.txt new file mode 100644 index 0000000..0f9a7f6 --- /dev/null +++ b/inc/lang/en/recent.txt @@ -0,0 +1,3 @@ +====== Recent Changes ====== + +The following pages were changed recently: diff --git a/inc/lang/en/register.txt b/inc/lang/en/register.txt new file mode 100644 index 0000000..7778402 --- /dev/null +++ b/inc/lang/en/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/en/registermail.txt b/inc/lang/en/registermail.txt new file mode 100644 index 0000000..5517ca1 --- /dev/null +++ b/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/inc/lang/en/resendpwd.txt b/inc/lang/en/resendpwd.txt new file mode 100644 index 0000000..2696fe4 --- /dev/null +++ b/inc/lang/en/resendpwd.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/en/resetpwd.txt b/inc/lang/en/resetpwd.txt new file mode 100644 index 0000000..5f59f0f --- /dev/null +++ b/inc/lang/en/resetpwd.txt @@ -0,0 +1,3 @@ +====== Set new password ====== + +Please enter a new password for your account in this wiki. diff --git a/inc/lang/en/revisions.txt b/inc/lang/en/revisions.txt new file mode 100644 index 0000000..90b036a --- /dev/null +++ b/inc/lang/en/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/en/searchpage.txt b/inc/lang/en/searchpage.txt new file mode 100644 index 0000000..0cd0160 --- /dev/null +++ b/inc/lang/en/searchpage.txt @@ -0,0 +1,3 @@ +====== Search ====== + +You can find the results of your search below. @CREATEPAGEINFO@ diff --git a/inc/lang/en/showrev.txt b/inc/lang/en/showrev.txt new file mode 100644 index 0000000..3608de3 --- /dev/null +++ b/inc/lang/en/showrev.txt @@ -0,0 +1,2 @@ +**This is an old revision of the document!** +---- diff --git a/inc/lang/en/stopwords.txt b/inc/lang/en/stopwords.txt new file mode 100644 index 0000000..afc3016 --- /dev/null +++ b/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/inc/lang/en/subscr_digest.txt b/inc/lang/en/subscr_digest.txt new file mode 100644 index 0000000..cc42e08 --- /dev/null +++ b/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/inc/lang/en/subscr_form.txt b/inc/lang/en/subscr_form.txt new file mode 100644 index 0000000..d606508 --- /dev/null +++ b/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/inc/lang/en/subscr_list.txt b/inc/lang/en/subscr_list.txt new file mode 100644 index 0000000..dcf8000 --- /dev/null +++ b/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/inc/lang/en/subscr_single.txt b/inc/lang/en/subscr_single.txt new file mode 100644 index 0000000..046b994 --- /dev/null +++ b/inc/lang/en/subscr_single.txt @@ -0,0 +1,19 @@ +Hello! + +The page @PAGE@ in the @TITLE@ wiki changed. +Here are the changes: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +User : @USER@ +Edit Summary : @SUMMARY@ +Old Revision : @OLDPAGE@ +New Revision : @NEWPAGE@ +Date of New Revision: @DATE@ + +To cancel the page notifications, log into the wiki at +@DOKUWIKIURL@ then visit +@SUBSCRIBE@ +and unsubscribe page and/or namespace changes. diff --git a/inc/lang/en/updateprofile.txt b/inc/lang/en/updateprofile.txt new file mode 100644 index 0000000..73e53aa --- /dev/null +++ b/inc/lang/en/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/en/uploadmail.txt b/inc/lang/en/uploadmail.txt new file mode 100644 index 0000000..dca8e33 --- /dev/null +++ b/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/inc/lang/eo/admin.txt b/inc/lang/eo/admin.txt new file mode 100644 index 0000000..4b3cf0c --- /dev/null +++ b/inc/lang/eo/admin.txt @@ -0,0 +1,3 @@ +====== Administrado ====== + +Sube vi trovas liston de administraj taskoj haveblaj en DokuWiki. diff --git a/inc/lang/eo/adminplugins.txt b/inc/lang/eo/adminplugins.txt new file mode 100644 index 0000000..bb7e782 --- /dev/null +++ b/inc/lang/eo/adminplugins.txt @@ -0,0 +1 @@ +===== Aldonaj kromaĵoj ===== \ No newline at end of file diff --git a/inc/lang/eo/backlinks.txt b/inc/lang/eo/backlinks.txt new file mode 100644 index 0000000..d3c1f51 --- /dev/null +++ b/inc/lang/eo/backlinks.txt @@ -0,0 +1,3 @@ +====== Retroligiloj ====== + +Ĉi tiu listo montras paĝojn, kiuj referencas al la aktuala paĝo. diff --git a/inc/lang/eo/conflict.txt b/inc/lang/eo/conflict.txt new file mode 100644 index 0000000..cd01929 --- /dev/null +++ b/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/inc/lang/eo/denied.txt b/inc/lang/eo/denied.txt new file mode 100644 index 0000000..2b41f21 --- /dev/null +++ b/inc/lang/eo/denied.txt @@ -0,0 +1,3 @@ +====== Aliro malpermesita ====== + +Vi ne havas sufiĉajn rajtojn daŭrigi. diff --git a/inc/lang/eo/diff.txt b/inc/lang/eo/diff.txt new file mode 100644 index 0000000..86ec56e --- /dev/null +++ b/inc/lang/eo/diff.txt @@ -0,0 +1,3 @@ +====== Diferencoj ====== + +Tio montras diferencojn inter du versioj de la paĝo. diff --git a/inc/lang/eo/draft.txt b/inc/lang/eo/draft.txt new file mode 100644 index 0000000..57526f3 --- /dev/null +++ b/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/inc/lang/eo/edit.txt b/inc/lang/eo/edit.txt new file mode 100644 index 0000000..ccc8a61 --- /dev/null +++ b/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/inc/lang/eo/editrev.txt b/inc/lang/eo/editrev.txt new file mode 100644 index 0000000..2e1406b --- /dev/null +++ b/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/inc/lang/eo/index.txt b/inc/lang/eo/index.txt new file mode 100644 index 0000000..534e608 --- /dev/null +++ b/inc/lang/eo/index.txt @@ -0,0 +1,3 @@ +====== Enhavo ====== + +Tio ĉi estas indekso pri ĉiuj disponeblaj paĝoj ordigitaj laŭ [[doku>eo:namespaces|nomspacoj]]. diff --git a/inc/lang/eo/install.html b/inc/lang/eo/install.html new file mode 100644 index 0000000..b12a2ac --- /dev/null +++ b/inc/lang/eo/install.html @@ -0,0 +1,7 @@ +

    Tiu ĉi paĝo helpas en la unua instalo kaj agordado de DokuWiki. Pli da informo pri tiu instalilo disponeblas en ĝia propra dokumentada paĝo.

    + +

    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 devas 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).

    + +

    Tiu ĉi instalilo difinos vian DokuWiki-an agordadon por ACL, 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.

    + +

    Spertuloj aŭ uzantoj kiuj bezonas specialajn agordrimedojn uzu tiujn ligilojn por havi pli detalojn pri instaladaj instrukcioj kaj agordadaj difinoj.

    diff --git a/inc/lang/eo/jquery.ui.datepicker.js b/inc/lang/eo/jquery.ui.datepicker.js new file mode 100644 index 0000000..08aa96e --- /dev/null +++ b/inc/lang/eo/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Esperanto initialisation for the jQuery UI date picker plugin. */ +/* Written by Olivier M. (olivierweb@ifrance.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.eo = { + closeText: "Fermi", + prevText: "Anta", + nextText: "Sekv", + 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/inc/lang/eo/lang.php b/inc/lang/eo/lang.php new file mode 100644 index 0000000..39ea892 --- /dev/null +++ b/inc/lang/eo/lang.php @@ -0,0 +1,368 @@ + + * @author Erik Bjørn Pedersen + * @author Florian + * @author Kristjan SCHMIDT + * @author Antono Vasiljev + * @author Felipe Castro + * @author Robert Bogenschneider + */ +$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['searchcreatepage'] = 'Se vi ne trovis kion vi serĉantis, vi povas krei aŭ redakti la paĝo %s, nomita laŭ via serĉo.'; +$lang['search_fullresults'] = 'Plentekstaj rezultoj'; +$lang['js']['search_toggle_tools'] = 'Ŝalti serĉilojn'; +$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['js']['data_insecure'] = 'AVERTO: Ŝajnas, ke via datuma dosierujo ne estas ĝuste sekurigita. Legu pri Sekureco de Reta Aliro en DokuWiki.'; +$lang['search_exact_match'] = 'Ekzakta kongruo'; +$lang['search_starts_with'] = 'Komenciĝas per'; +$lang['search_ends_with'] = 'Finiĝas per'; +$lang['search_contains'] = 'Enhavas'; +$lang['search_custom_match'] = 'Propra'; +$lang['search_any_ns'] = 'Ajn nomspaco'; +$lang['search_any_time'] = 'Ajn tempo'; +$lang['search_past_7_days'] = 'Pasinta semajno'; +$lang['search_past_month'] = 'Pasinta monato'; +$lang['search_past_year'] = 'Pasinta jaro'; +$lang['search_sort_by_hits'] = 'Ordigi per fururaĵoj'; +$lang['search_sort_by_mtime'] = 'Ordigi per laste modifita'; +$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.
    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['allowedmime'] = 'Listo de permesitaj dosiersufiksoj'; +$lang['lockedby'] = 'Nune ŝlosita de:'; +$lang['lockexpire'] = 'Ŝlosado ĉesos je:'; +$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['unknowndate'] = 'Nekonata dato'; +$lang['noflash'] = 'La Adobe Flash Plugin 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 %s ne estas uzebla. Eble via retprovizanto ial malpermesis tion?'; +$lang['i_disabled'] = 'Ĝi estis malŝaltita de via provizanto.'; +$lang['i_funcnmail'] = 'Noto: La PHP-poŝta funkcio ne disponeblas. %s Se ĝi restas neatingebla, vi povas instali la SMTP-kromaĵon.'; +$lang['i_phpver'] = 'La versio de la PHP %s estas pli malnova ol la bezonata %s. Vi bezonas ĝisdatigi la PHP-an instalon.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload devas esti malŝaltita en php.ini por ruli DokuWiki.'; +$lang['i_urandom'] = 'DokuWiki ne povas krei kriptografie sekurajn nombrojn por kuketoj. Vi eble volas kontroli viajn open_basedir-agordojn en php.ini por taŭga aliro /dev/urandom.'; +$lang['i_permfail'] = '%s ne estas skribebla por DokuWiki. Vi devas redifini la permes-atributojn de tiu ĉi dosierujo!'; +$lang['i_confexists'] = '%s jam ekzistas'; +$lang['i_writeerr'] = 'Ne eblas krei "%s". 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=%s)'; +$lang['i_badval'] = '%s - malvalida aŭ malplena valoro'; +$lang['i_success'] = 'La agordado sukcese kompletiĝis. Vi povas forigi la dosieron nun. Pluiru al via nova DokuWiki.'; +$lang['i_failure'] = 'Kelkaj eraroj okazis dum la konservo de la agordaj dosieroj. Vi devas senpere korekti ilin antaŭ ol vi povos uzi vian novan DokuWiki-on. '; +$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 %s. Vi povas ankaŭ vidi la freŝajn ŝanĝojn de la tuta vikio.'; +$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 %s.'; +$lang['media_search'] = 'Serĉi en la nomspaco %s.'; +$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['media_acl_warning'] = 'Ĉi tiu listo eble ne estas kompleta pro ACL-limigoj kaj kaŝitaj paĝoj.'; +$lang['email_fail'] = 'PHP mail() mankas aŭ estas alŝaltita. La jena retmesaĝo ne estis sendita:'; +$lang['currentns'] = 'Aktuala nomspaco'; +$lang['searchresult'] = 'Serĉrezulto'; +$lang['plainhtml'] = 'Plena HTML'; +$lang['wikimarkup'] = 'Vikiteksto'; +$lang['page_nonexist_rev'] = 'Paĝo ne ekzistis al %s. Ĝi do sekve estis kreita al %s.'; +$lang['unable_to_parse_date'] = 'Neebla sintakse analizi la parametro "%s".'; +$lang['email_signature_text'] = 'Tiu ĉi mesaĝo kreiĝis de DokuWiki ĉe +@DOKUWIKIURL@'; diff --git a/inc/lang/eo/locked.txt b/inc/lang/eo/locked.txt new file mode 100644 index 0000000..abdc059 --- /dev/null +++ b/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/inc/lang/eo/login.txt b/inc/lang/eo/login.txt new file mode 100644 index 0000000..7920dd4 --- /dev/null +++ b/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. diff --git a/inc/lang/eo/mailtext.txt b/inc/lang/eo/mailtext.txt new file mode 100644 index 0000000..6c5b80c --- /dev/null +++ b/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/inc/lang/eo/mailwrap.html b/inc/lang/eo/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/eo/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/eo/newpage.txt b/inc/lang/eo/newpage.txt new file mode 100644 index 0000000..66f0a86 --- /dev/null +++ b/inc/lang/eo/newpage.txt @@ -0,0 +1,3 @@ +====== Ĉ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/inc/lang/eo/norev.txt b/inc/lang/eo/norev.txt new file mode 100644 index 0000000..e951a55 --- /dev/null +++ b/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/inc/lang/eo/onceexisted.txt b/inc/lang/eo/onceexisted.txt new file mode 100644 index 0000000..1485c0c --- /dev/null +++ b/inc/lang/eo/onceexisted.txt @@ -0,0 +1,3 @@ +======= Ĉi tiu paĝo ne plu ekzistas ====== + +Vi sekvis ligon al paĝo ne plu ekzistanta. Vi povas kontroli la liston de **malnovaj revizioj** por vidi kiam kaj kial oni ĝin forigis, aliri malnovajn reviziojn aŭ restarigi la paĝon. diff --git a/inc/lang/eo/password.txt b/inc/lang/eo/password.txt new file mode 100644 index 0000000..6995ec5 --- /dev/null +++ b/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/inc/lang/eo/preview.txt b/inc/lang/eo/preview.txt new file mode 100644 index 0000000..f510f4d --- /dev/null +++ b/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/inc/lang/eo/pwconfirm.txt b/inc/lang/eo/pwconfirm.txt new file mode 100644 index 0000000..3f198b0 --- /dev/null +++ b/inc/lang/eo/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/eo/read.txt b/inc/lang/eo/read.txt new file mode 100644 index 0000000..949004b --- /dev/null +++ b/inc/lang/eo/read.txt @@ -0,0 +1 @@ +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/inc/lang/eo/recent.txt b/inc/lang/eo/recent.txt new file mode 100644 index 0000000..2454ea6 --- /dev/null +++ b/inc/lang/eo/recent.txt @@ -0,0 +1,3 @@ +====== Freŝaj Ŝanĝoj ====== + +Jenaj paĝoj ŝanĝiĝis antaŭ nelonge: diff --git a/inc/lang/eo/register.txt b/inc/lang/eo/register.txt new file mode 100644 index 0000000..85e69c5 --- /dev/null +++ b/inc/lang/eo/register.txt @@ -0,0 +1,3 @@ +====== Registriĝi ====== + +Entajpu necesajn informojn por enregistriĝi. Certiĝu ke via retpoŝta adreso estas vera, ĉar ni sendos al ĝi vian pasvorton. [[doku>eo:pagename]] diff --git a/inc/lang/eo/registermail.txt b/inc/lang/eo/registermail.txt new file mode 100644 index 0000000..b9c3870 --- /dev/null +++ b/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/inc/lang/eo/resendpwd.txt b/inc/lang/eo/resendpwd.txt new file mode 100644 index 0000000..556477a --- /dev/null +++ b/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/inc/lang/eo/resetpwd.txt b/inc/lang/eo/resetpwd.txt new file mode 100644 index 0000000..61fd06c --- /dev/null +++ b/inc/lang/eo/resetpwd.txt @@ -0,0 +1,3 @@ +====== Difini novan pasvorton ====== + +Bonvolu indiki novan pasvorton por via konto en tiu ĉi vikio. diff --git a/inc/lang/eo/revisions.txt b/inc/lang/eo/revisions.txt new file mode 100644 index 0000000..01a9c3f --- /dev/null +++ b/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. diff --git a/inc/lang/eo/searchpage.txt b/inc/lang/eo/searchpage.txt new file mode 100644 index 0000000..3461816 --- /dev/null +++ b/inc/lang/eo/searchpage.txt @@ -0,0 +1,3 @@ +====== Serĉo ====== + +Sube estas rezultoj de serĉo en la retejo. @CREATEPAGEINFO@ diff --git a/inc/lang/eo/showrev.txt b/inc/lang/eo/showrev.txt new file mode 100644 index 0000000..3ece4f2 --- /dev/null +++ b/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/inc/lang/eo/stopwords.txt b/inc/lang/eo/stopwords.txt new file mode 100644 index 0000000..d27c569 --- /dev/null +++ b/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/inc/lang/eo/subscr_digest.txt b/inc/lang/eo/subscr_digest.txt new file mode 100644 index 0000000..7e5310a --- /dev/null +++ b/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/inc/lang/eo/subscr_form.txt b/inc/lang/eo/subscr_form.txt new file mode 100644 index 0000000..259b210 --- /dev/null +++ b/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/inc/lang/eo/subscr_list.txt b/inc/lang/eo/subscr_list.txt new file mode 100644 index 0000000..ed0c809 --- /dev/null +++ b/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/inc/lang/eo/subscr_single.txt b/inc/lang/eo/subscr_single.txt new file mode 100644 index 0000000..56d489c --- /dev/null +++ b/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/inc/lang/eo/updateprofile.txt b/inc/lang/eo/updateprofile.txt new file mode 100644 index 0000000..4b52ff2 --- /dev/null +++ b/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/inc/lang/eo/uploadmail.txt b/inc/lang/eo/uploadmail.txt new file mode 100644 index 0000000..6268824 --- /dev/null +++ b/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/inc/lang/es/admin.txt b/inc/lang/es/admin.txt new file mode 100644 index 0000000..320b1c5 --- /dev/null +++ b/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/inc/lang/es/adminplugins.txt b/inc/lang/es/adminplugins.txt new file mode 100644 index 0000000..9b85b1f --- /dev/null +++ b/inc/lang/es/adminplugins.txt @@ -0,0 +1 @@ +===== Complementos adicionales ===== \ No newline at end of file diff --git a/inc/lang/es/backlinks.txt b/inc/lang/es/backlinks.txt new file mode 100644 index 0000000..c72270b --- /dev/null +++ b/inc/lang/es/backlinks.txt @@ -0,0 +1,3 @@ +====== Referencias ====== + +Esta es una lista de páginas que parecen hacer referencia a la página actual. diff --git a/inc/lang/es/conflict.txt b/inc/lang/es/conflict.txt new file mode 100644 index 0000000..4c22c0a --- /dev/null +++ b/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. diff --git a/inc/lang/es/denied.txt b/inc/lang/es/denied.txt new file mode 100644 index 0000000..e8d8e03 --- /dev/null +++ b/inc/lang/es/denied.txt @@ -0,0 +1,3 @@ +====== Permiso Denegado ====== + +Lo siento, no tienes suficientes permisos para continuar. diff --git a/inc/lang/es/diff.txt b/inc/lang/es/diff.txt new file mode 100644 index 0000000..ba94b2e --- /dev/null +++ b/inc/lang/es/diff.txt @@ -0,0 +1,3 @@ +====== Diferencias ====== + +Muestra las diferencias entre dos versiones de la página. diff --git a/inc/lang/es/draft.txt b/inc/lang/es/draft.txt new file mode 100644 index 0000000..c3b868c --- /dev/null +++ b/inc/lang/es/draft.txt @@ -0,0 +1,5 @@ +====== Fichero borrador encontrado ====== + +Tu última sesión de edición en esta página no se completó correctamente. DokuWiki guardó automáticamente un borrador mientras trabajabas; puedes utilizar el borrador para continuar editándolo. Abajo se ven los datos que fueron guardados en tu última sesión. + +Por favor decide si deseas //recuperar// tu sesión perdida, //eliminar// el borrador guardado automáticamente o //cancelar// el proceso de edición. diff --git a/inc/lang/es/edit.txt b/inc/lang/es/edit.txt new file mode 100644 index 0000000..071aabf --- /dev/null +++ b/inc/lang/es/edit.txt @@ -0,0 +1 @@ +Edita la página y pulsa ''Guardar''. Ve a [[wiki:syntax]] para ver la sintaxis del Wiki. Por favor edita 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/inc/lang/es/editrev.txt b/inc/lang/es/editrev.txt new file mode 100644 index 0000000..6978ac7 --- /dev/null +++ b/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. +---- diff --git a/inc/lang/es/index.txt b/inc/lang/es/index.txt new file mode 100644 index 0000000..6f5673a --- /dev/null +++ b/inc/lang/es/index.txt @@ -0,0 +1,3 @@ +====== Índice ====== + +Este es un índice de todas las páginas disponibles ordenado por [[doku>es:namespaces|espacios de nombres]]. diff --git a/inc/lang/es/install.html b/inc/lang/es/install.html new file mode 100644 index 0000000..4381db1 --- /dev/null +++ b/inc/lang/es/install.html @@ -0,0 +1,7 @@ +

    Esta página lo asiste en la primera vez que instala y configura Dokuwiki. Más información sobre este instalador está disponible en la página de documentación.

    + +

    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 debe 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).

    + +

    Este instalador configurará una ACL, 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.

    + +

    Usuarios experimentados o usuarios con requerimientos especiales deben usar estos enlaces para detalles concernientes a instrucciones de instalación y configuración.

    diff --git a/inc/lang/es/jquery.ui.datepicker.js b/inc/lang/es/jquery.ui.datepicker.js new file mode 100644 index 0000000..dbb1f0a --- /dev/null +++ b/inc/lang/es/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Inicialización en español para la extensión 'UI date picker' para jQuery. */ +/* Traducido por Vester (xvester@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.es = { + closeText: "Cerrar", + prevText: "Ant", + nextText: "Sig", + 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/inc/lang/es/lang.php b/inc/lang/es/lang.php new file mode 100644 index 0000000..4b3cb5a --- /dev/null +++ b/inc/lang/es/lang.php @@ -0,0 +1,408 @@ + + * @author Guillermo Romero + * @author Luna Frax + * @author Domingo Redal + * @author Liliana + * @author Alex Cachinero + * @author WIRESLINKEA + * @author Zigor Astarbe + * @author Adrián Ariza + * @author Gabiel Molina + * @author Paco Avila + * @author Bernardo Arlandis Mañó + * @author Miguel Pagano + * @author Oscar M. Lage + * @author Gabriel Castillo + * @author oliver + * @author Enrico Nicoletto + * @author Manuel Meco + * @author Jordan Mero + * @author Felipe Martinez + * @author Javier Aranda + * @author Zerial + * @author Marvin Ortega + * @author Daniel Castro Alvarado + * @author Fernando J. Gómez + * @author Victor Castelan + * @author Mauro Javier Giamberardino + * @author emezeta + * @author Oscar Ciudad + * @author Ruben Figols + * @author Gerardo Zamudio + * @author Mercè López + * @author monica + * @author Antonio Bueno + * @author Juan De La Cruz + * @author Fernando + * @author Eloy + * @author Antonio Castilla + * @author Jonathan Hernández + * @author pokesakura + * @author Álvaro Iradier + * @author Alejandro Nunez + * @author Mauricio Segura + * @author solohazlo + * @author Romano + * @author David Roy + * @author Enny Rodriguez + */ +$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 econtraste lo que estabas buscando, puedes crear o editar la página %s, nombrada después de tu 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 usa 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['js']['data_insecure'] = 'ADVERTENCIA: Parece que su directorio de datos no está debidamente protegido. Por favor, lea sobre Seguridad de acceso web en DokuWiki.'; +$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.
    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['allowedmime'] = 'Lista de extensiones de archivo permitidas'; +$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['unknowndate'] = 'Fecha desconocida'; +$lang['noflash'] = 'Para mostrar este contenido es necesario el Plugin Adobe Flash.'; +$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 instrucciones de instalación de Dokuwiki completas.'; +$lang['i_funcna'] = 'La función de PHP %s no está disponible. ¿Tal vez su proveedor de hosting la ha deshabilitado por alguna razón?'; +$lang['i_disabled'] = 'Ha sido deshabilitado por su proveedor.'; +$lang['i_funcnmail'] = 'Nota: La función de PHP mail() no está disponible. %s si no está disponible, puede instalar el complemento smtp.'; +$lang['i_phpver'] = 'Su versión de PHP %s es menor que la necesaria %s. 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_urandom'] = 'DokuWiki no puede crear números criptográficamente seguros para las cookies. Es posible que desee verificar la configuración de open_basedir en php.ini para obtener el acceso apropiado a /dev/urandom.'; +$lang['i_permfail'] = 'DokuWili no puede escribir %s. ¡Es necesario establecer correctamente los permisos de este directorio!'; +$lang['i_confexists'] = '%s ya existe'; +$lang['i_writeerr'] = 'Imposible crear %s. 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=%s)'; +$lang['i_badval'] = '%s - valor ilegal o vacío'; +$lang['i_success'] = 'La configuración ha concluido correctamente. Ahora puede eliminar el archivo install.php. Visite su nuevo DokuWiki.'; +$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 su nuevo DokuWiki.'; +$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 %s. También puedes ver los cambios recientes en el wiki completo.'; +$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['email_fail'] = 'La función de PHP mail() falta o está deshabilitada. No se envió el siguiente correo electrónico:'; +$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 %s.'; +$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/inc/lang/es/locked.txt b/inc/lang/es/locked.txt new file mode 100644 index 0000000..c1028ff --- /dev/null +++ b/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. diff --git a/inc/lang/es/login.txt b/inc/lang/es/login.txt new file mode 100644 index 0000000..a8d9be7 --- /dev/null +++ b/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/inc/lang/es/mailtext.txt b/inc/lang/es/mailtext.txt new file mode 100644 index 0000000..e74d3eb --- /dev/null +++ b/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/inc/lang/es/mailwrap.html b/inc/lang/es/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/es/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/es/newpage.txt b/inc/lang/es/newpage.txt new file mode 100644 index 0000000..98abee6 --- /dev/null +++ b/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/inc/lang/es/norev.txt b/inc/lang/es/norev.txt new file mode 100644 index 0000000..4bb7646 --- /dev/null +++ b/inc/lang/es/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/es/onceexisted.txt b/inc/lang/es/onceexisted.txt new file mode 100644 index 0000000..a74c804 --- /dev/null +++ b/inc/lang/es/onceexisted.txt @@ -0,0 +1,3 @@ +====== Esta página ya no está disponible ====== + +Has seguido un enlace a una página que ya no está disponible. Se puede averiguar el listado de **revisiones antiguas** para comprobar cuando y por qué ha sido borrada, acceder a revisiones antiguas, o restaurarla. diff --git a/inc/lang/es/password.txt b/inc/lang/es/password.txt new file mode 100644 index 0000000..64bded4 --- /dev/null +++ b/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/inc/lang/es/preview.txt b/inc/lang/es/preview.txt new file mode 100644 index 0000000..dead888 --- /dev/null +++ b/inc/lang/es/preview.txt @@ -0,0 +1,3 @@ +====== Previsualización ====== + +Esto es una previsualización de cómo aparecerá tu texto. **Recuerda: no está guardado todavía**! diff --git a/inc/lang/es/pwconfirm.txt b/inc/lang/es/pwconfirm.txt new file mode 100644 index 0000000..a99153c --- /dev/null +++ b/inc/lang/es/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/es/read.txt b/inc/lang/es/read.txt new file mode 100644 index 0000000..461b745 --- /dev/null +++ b/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/inc/lang/es/recent.txt b/inc/lang/es/recent.txt new file mode 100644 index 0000000..3e10cf4 --- /dev/null +++ b/inc/lang/es/recent.txt @@ -0,0 +1,3 @@ +====== Cambios Recientes ====== + +Las siguientes páginas han sido modificadas recientemente: diff --git a/inc/lang/es/register.txt b/inc/lang/es/register.txt new file mode 100644 index 0000000..843f95b --- /dev/null +++ b/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>es:pagename|pagename]]. diff --git a/inc/lang/es/registermail.txt b/inc/lang/es/registermail.txt new file mode 100644 index 0000000..b9208a1 --- /dev/null +++ b/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/inc/lang/es/resendpwd.txt b/inc/lang/es/resendpwd.txt new file mode 100644 index 0000000..1d74e79 --- /dev/null +++ b/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/inc/lang/es/resetpwd.txt b/inc/lang/es/resetpwd.txt new file mode 100644 index 0000000..76e6b4a --- /dev/null +++ b/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. diff --git a/inc/lang/es/revisions.txt b/inc/lang/es/revisions.txt new file mode 100644 index 0000000..2c44612 --- /dev/null +++ b/inc/lang/es/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/es/searchpage.txt b/inc/lang/es/searchpage.txt new file mode 100644 index 0000000..4d70109 --- /dev/null +++ b/inc/lang/es/searchpage.txt @@ -0,0 +1,3 @@ +====== Búsqueda ====== + +Puedes encontrar los resultados de tu búsqueda abajo. @CREATEPAGEINFO@ diff --git a/inc/lang/es/showrev.txt b/inc/lang/es/showrev.txt new file mode 100644 index 0000000..c84bbc0 --- /dev/null +++ b/inc/lang/es/showrev.txt @@ -0,0 +1,2 @@ +**¡Esta es una revisión vieja del documento!** +---- diff --git a/inc/lang/es/stopwords.txt b/inc/lang/es/stopwords.txt new file mode 100644 index 0000000..db095a7 --- /dev/null +++ b/inc/lang/es/stopwords.txt @@ -0,0 +1,172 @@ +# 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/ +algún +alguna +algunas +alguno +algunos +ambos +ampleamos +ante +antes +aquel +aquellas +aquellos +aqui +arriba +atras +bajo +bastante +bien +cada +cierta +ciertas +cierto +ciertos +como +con +conseguimos +conseguir +consigo +consigue +consiguen +consigues +cual +cuando +dentro +desde +donde +dos +ellas +ellos +empleais +emplean +emplear +empleas +empleo +encima +entonces +entre +era +eramos +eran +eras +eres +esta +estaba +estado +estais +estamos +estan +estoy +fin +fue +fueron +fui +fuimos +gueno +hace +haceis +hacemos +hacen +hacer +haces +hago +incluso +intenta +intentais +intentamos +intentan +intentar +intentas +intento +largo +las +los +mientras +mio +modo +muchos +muy +nos +nosotros +otro +para +pero +podeis +podemos +poder +podria +podriais +podriamos +podrian +podrias +por +porque +primero +puede +pueden +puedo +qué +quien +sabe +sabeis +sabemos +saben +saber +sabes +ser +siendo +sin +sobre +sois +solamente +solo +somos +soy +sus +también +teneis +tenemos +tener +tengo +tiempo +tiene +tienen +todo +trabaja +trabajais +trabajamos +trabajan +trabajar +trabajas +trabajo +tras +tuyo +ultimo +una +unas +uno +unos +usa +usais +usamos +usan +usar +usas +uso +va +vais +valor +vamos +van +vaya +verdad +verdadera +verdadero +vosotras +vosotros +voy +www diff --git a/inc/lang/es/subscr_digest.txt b/inc/lang/es/subscr_digest.txt new file mode 100644 index 0000000..5bb5012 --- /dev/null +++ b/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/inc/lang/es/subscr_form.txt b/inc/lang/es/subscr_form.txt new file mode 100644 index 0000000..3a8143c --- /dev/null +++ b/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/inc/lang/es/subscr_list.txt b/inc/lang/es/subscr_list.txt new file mode 100644 index 0000000..4c58a2d --- /dev/null +++ b/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/inc/lang/es/subscr_single.txt b/inc/lang/es/subscr_single.txt new file mode 100644 index 0000000..a974cc9 --- /dev/null +++ b/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/inc/lang/es/updateprofile.txt b/inc/lang/es/updateprofile.txt new file mode 100644 index 0000000..822e558 --- /dev/null +++ b/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/inc/lang/es/uploadmail.txt b/inc/lang/es/uploadmail.txt new file mode 100644 index 0000000..eb1c5df --- /dev/null +++ b/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/inc/lang/et/admin.txt b/inc/lang/et/admin.txt new file mode 100644 index 0000000..93882cc --- /dev/null +++ b/inc/lang/et/admin.txt @@ -0,0 +1,3 @@ +====== Administreerimine ====== + +Alljärgnevalt leiate nimekirja administratiivsetest tegevustest, mida DokuWiki võimaldab. diff --git a/inc/lang/et/adminplugins.txt b/inc/lang/et/adminplugins.txt new file mode 100644 index 0000000..ee3ffb0 --- /dev/null +++ b/inc/lang/et/adminplugins.txt @@ -0,0 +1 @@ +===== Täiendavad laiendused ===== \ No newline at end of file diff --git a/inc/lang/et/backlinks.txt b/inc/lang/et/backlinks.txt new file mode 100644 index 0000000..5635565 --- /dev/null +++ b/inc/lang/et/backlinks.txt @@ -0,0 +1,3 @@ +====== Siia lehele lingiga haagitud lehed ====== + +Nimekiri nendest lehtedest, kuskohalt Sa lingi abil siia lehele saad. diff --git a/inc/lang/et/conflict.txt b/inc/lang/et/conflict.txt new file mode 100644 index 0000000..c0de3dc --- /dev/null +++ b/inc/lang/et/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/et/denied.txt b/inc/lang/et/denied.txt new file mode 100644 index 0000000..600f3be --- /dev/null +++ b/inc/lang/et/denied.txt @@ -0,0 +1,3 @@ +====== Sul pole ligipääsuluba ====== + +Kahju küll, aga sinu tublidusest ei piisa, et edasi liikuda. diff --git a/inc/lang/et/diff.txt b/inc/lang/et/diff.txt new file mode 100644 index 0000000..400fb95 --- /dev/null +++ b/inc/lang/et/diff.txt @@ -0,0 +1,3 @@ +====== Erinevused ====== + +Siin näed erinevusi valitud versiooni ja hetkel kehtiva lehekülje vahel. diff --git a/inc/lang/et/draft.txt b/inc/lang/et/draft.txt new file mode 100644 index 0000000..18eb167 --- /dev/null +++ b/inc/lang/et/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/et/edit.txt b/inc/lang/et/edit.txt new file mode 100644 index 0000000..f9d6801 --- /dev/null +++ b/inc/lang/et/edit.txt @@ -0,0 +1 @@ +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/inc/lang/et/editrev.txt b/inc/lang/et/editrev.txt new file mode 100644 index 0000000..27ad5de --- /dev/null +++ b/inc/lang/et/editrev.txt @@ -0,0 +1,2 @@ +**Sa oled omale tõmmanud selle dokumendi vana versiooni!** Kui Sa selle salvestad sünnib nende andmetega uus versioon. +---- diff --git a/inc/lang/et/index.txt b/inc/lang/et/index.txt new file mode 100644 index 0000000..fec211d --- /dev/null +++ b/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/inc/lang/et/jquery.ui.datepicker.js b/inc/lang/et/jquery.ui.datepicker.js new file mode 100644 index 0000000..11d5857 --- /dev/null +++ b/inc/lang/et/jquery.ui.datepicker.js @@ -0,0 +1,48 @@ +/* Estonian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mart Sõmermaa (mrts.pydev at gmail com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/et/lang.php b/inc/lang/et/lang.php new file mode 100644 index 0000000..827598e --- /dev/null +++ b/inc/lang/et/lang.php @@ -0,0 +1,348 @@ + + * @author Oliver S6ro + * @author Aari Juhanson + * @author Kaiko Kaur + * @author kristian.kankainen + * @author Rivo Zängov + * @author Janar Leas + */ +$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['btn_img_backto'] = 'Tagasi %s'; +$lang['btn_mediaManager'] = 'Näita meediahalduris'; +$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['search_fullresults'] = 'Täistekstiotsingu tulemused'; +$lang['js']['search_toggle_tools'] = 'Lülita Otsimise Tööriistu'; +$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['search_exact_match'] = 'Täpne vaste'; +$lang['search_starts_with'] = 'Algab'; +$lang['search_ends_with'] = 'Lõpeb'; +$lang['search_contains'] = 'Sisaldab'; +$lang['search_custom_match'] = 'Valikuline'; +$lang['search_any_ns'] = 'Suvaline nimeruum'; +$lang['search_any_time'] = 'Suvaline aeg'; +$lang['search_past_7_days'] = 'Viimasel nädalal'; +$lang['search_past_month'] = 'Viimasel kuul'; +$lang['search_past_year'] = 'Viimasel aastal'; +$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.
    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['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 Adobe Flash Laiendus.'; +$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['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['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 Dokuwiki installeerimis juhendit'; +$lang['i_funcna'] = 'PHP funktsiooni %s ei ole olemas.võibolla sinu serveri hooldaja on selle mingil põhjusel keelanud?'; +$lang['i_phpver'] = 'Sinu PHP versioon %s on vanem nõutavast %s. Pead oma paigaldatud PHP-d uuendama.'; +$lang['i_permfail'] = 'Dokuwiki ei saa kirjutada faili %s. Kontrolli serveris failide õigused üle.'; +$lang['i_confexists'] = '%s on juba olemas'; +$lang['i_writeerr'] = 'Faili %s ei lubata tekitada. Kontrolli kataloogi ja faili õigusi.'; +$lang['i_badhash'] = 'Tundmatu või muutunud dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - 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 uue DokuWiki täitmist.'; +$lang['i_failure'] = 'Konfiguratsiooni faili kirjutamisel esines vigu. Võimalik, et pead need käsitsi parandama enne uue DokuWiki 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 %s muudatusi. Võid uurida ka kogu selle wiki 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/inc/lang/et/locked.txt b/inc/lang/et/locked.txt new file mode 100644 index 0000000..0fd2743 --- /dev/null +++ b/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/inc/lang/et/login.txt b/inc/lang/et/login.txt new file mode 100644 index 0000000..3e746cd --- /dev/null +++ b/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/inc/lang/et/mailtext.txt b/inc/lang/et/mailtext.txt new file mode 100644 index 0000000..f1a6202 --- /dev/null +++ b/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/inc/lang/et/newpage.txt b/inc/lang/et/newpage.txt new file mode 100644 index 0000000..e439366 --- /dev/null +++ b/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/inc/lang/et/norev.txt b/inc/lang/et/norev.txt new file mode 100644 index 0000000..d126d23 --- /dev/null +++ b/inc/lang/et/norev.txt @@ -0,0 +1,3 @@ +====== Sellist versiooni pole ====== + +Sellist versiooni ei ole olemas. Selle dokumendi eelmiste versioonide nägemiseks klõpsa ''Eelmised versioonid'' nupul. diff --git a/inc/lang/et/password.txt b/inc/lang/et/password.txt new file mode 100644 index 0000000..9d75bb8 --- /dev/null +++ b/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/inc/lang/et/preview.txt b/inc/lang/et/preview.txt new file mode 100644 index 0000000..a1699c1 --- /dev/null +++ b/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/inc/lang/et/pwconfirm.txt b/inc/lang/et/pwconfirm.txt new file mode 100644 index 0000000..1e7b65b --- /dev/null +++ b/inc/lang/et/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/et/read.txt b/inc/lang/et/read.txt new file mode 100644 index 0000000..8ca3695 --- /dev/null +++ b/inc/lang/et/read.txt @@ -0,0 +1 @@ +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/inc/lang/et/recent.txt b/inc/lang/et/recent.txt new file mode 100644 index 0000000..4166986 --- /dev/null +++ b/inc/lang/et/recent.txt @@ -0,0 +1,3 @@ +====== Viimased muutused ====== + +Viimati muudeti alljärgnevaid lehti: diff --git a/inc/lang/et/register.txt b/inc/lang/et/register.txt new file mode 100644 index 0000000..ae9bf6a --- /dev/null +++ b/inc/lang/et/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/et/registermail.txt b/inc/lang/et/registermail.txt new file mode 100644 index 0000000..3b78963 --- /dev/null +++ b/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/inc/lang/et/resendpwd.txt b/inc/lang/et/resendpwd.txt new file mode 100644 index 0000000..c06e1c0 --- /dev/null +++ b/inc/lang/et/resendpwd.txt @@ -0,0 +1,3 @@ +====== Saada uus parool ====== + +Palun sisesta oma kasutaja nimi, et saada uut parooli. Soovi kinnitamiseks saadame Sinu meilile lingi. diff --git a/inc/lang/et/resetpwd.txt b/inc/lang/et/resetpwd.txt new file mode 100644 index 0000000..81660a1 --- /dev/null +++ b/inc/lang/et/resetpwd.txt @@ -0,0 +1,3 @@ +====== Sea uus salasõna ====== + +Sisesta oma selle wiki kasutajale uus salasõna diff --git a/inc/lang/et/revisions.txt b/inc/lang/et/revisions.txt new file mode 100644 index 0000000..f8dc742 --- /dev/null +++ b/inc/lang/et/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/et/searchpage.txt b/inc/lang/et/searchpage.txt new file mode 100644 index 0000000..5dbb48b --- /dev/null +++ b/inc/lang/et/searchpage.txt @@ -0,0 +1,3 @@ +====== Otsi ====== + +Leiad vasted oma otsingule. @CREATEPAGEINFO@ diff --git a/inc/lang/et/showrev.txt b/inc/lang/et/showrev.txt new file mode 100644 index 0000000..ef73d74 --- /dev/null +++ b/inc/lang/et/showrev.txt @@ -0,0 +1,2 @@ +**See on dokumendi vana versioon!** +---- diff --git a/inc/lang/et/stopwords.txt b/inc/lang/et/stopwords.txt new file mode 100644 index 0000000..5dda5f7 --- /dev/null +++ b/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/inc/lang/et/subscr_digest.txt b/inc/lang/et/subscr_digest.txt new file mode 100644 index 0000000..d382912 --- /dev/null +++ b/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/inc/lang/et/subscr_form.txt b/inc/lang/et/subscr_form.txt new file mode 100644 index 0000000..61a005b --- /dev/null +++ b/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/inc/lang/et/subscr_list.txt b/inc/lang/et/subscr_list.txt new file mode 100644 index 0000000..ec32a6b --- /dev/null +++ b/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/inc/lang/et/subscr_single.txt b/inc/lang/et/subscr_single.txt new file mode 100644 index 0000000..02069a6 --- /dev/null +++ b/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/inc/lang/et/updateprofile.txt b/inc/lang/et/updateprofile.txt new file mode 100644 index 0000000..e02429d --- /dev/null +++ b/inc/lang/et/updateprofile.txt @@ -0,0 +1,3 @@ +====== Uuenda oma kasutaja infot ====== + +Täida ainult need väljad, mida tahad uuendada. Uuendada ei saa kasutajanime. diff --git a/inc/lang/et/uploadmail.txt b/inc/lang/et/uploadmail.txt new file mode 100644 index 0000000..2c21926 --- /dev/null +++ b/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/inc/lang/eu/admin.txt b/inc/lang/eu/admin.txt new file mode 100644 index 0000000..1367326 --- /dev/null +++ b/inc/lang/eu/admin.txt @@ -0,0 +1,3 @@ +====== Kudeaketa ====== + +Jarraian wikia kudeatzeko erabilgarri dauden tresnak aurki ditzakezu. diff --git a/inc/lang/eu/adminplugins.txt b/inc/lang/eu/adminplugins.txt new file mode 100644 index 0000000..20709bf --- /dev/null +++ b/inc/lang/eu/adminplugins.txt @@ -0,0 +1 @@ +===== Plugin Gehigarriak ===== \ No newline at end of file diff --git a/inc/lang/eu/backlinks.txt b/inc/lang/eu/backlinks.txt new file mode 100644 index 0000000..76d5cd4 --- /dev/null +++ b/inc/lang/eu/backlinks.txt @@ -0,0 +1,3 @@ +====== Itzulera Estekak ====== + +Orri honetara bueltan estekatzen dutela diruditen orrien lista bat da honakoa. diff --git a/inc/lang/eu/conflict.txt b/inc/lang/eu/conflict.txt new file mode 100644 index 0000000..c9c614a --- /dev/null +++ b/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. diff --git a/inc/lang/eu/denied.txt b/inc/lang/eu/denied.txt new file mode 100644 index 0000000..7ceddea --- /dev/null +++ b/inc/lang/eu/denied.txt @@ -0,0 +1,3 @@ +====== Ez duzu baimenik ====== + +Barkatu, ez duzu baimenik orri hau ikusteko. diff --git a/inc/lang/eu/diff.txt b/inc/lang/eu/diff.txt new file mode 100644 index 0000000..f79fa5f --- /dev/null +++ b/inc/lang/eu/diff.txt @@ -0,0 +1,3 @@ +====== Aldaketak ====== + +Aukeratutako bertsioaren eta egungo bertsioaren arteko aldaketak aurkezten ditu. diff --git a/inc/lang/eu/draft.txt b/inc/lang/eu/draft.txt new file mode 100644 index 0000000..1e48e44 --- /dev/null +++ b/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. diff --git a/inc/lang/eu/edit.txt b/inc/lang/eu/edit.txt new file mode 100644 index 0000000..c117731 --- /dev/null +++ b/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/inc/lang/eu/editrev.txt b/inc/lang/eu/editrev.txt new file mode 100644 index 0000000..920cd89 --- /dev/null +++ b/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/inc/lang/eu/index.txt b/inc/lang/eu/index.txt new file mode 100644 index 0000000..7b439a8 --- /dev/null +++ b/inc/lang/eu/index.txt @@ -0,0 +1,3 @@ +====== Aurkibidea ====== + +[[doku>namespaces|namespaces]] bitartez ordenatutako aurkibidea da hau. diff --git a/inc/lang/eu/install.html b/inc/lang/eu/install.html new file mode 100644 index 0000000..bbbfb1f --- /dev/null +++ b/inc/lang/eu/install.html @@ -0,0 +1,7 @@ +

    Orri honek Dokuwiki-ren lehenengo instalazioan eta konfigurazioan gidatzen du. Instalatzaile honen informazio gehiago eskuragarri dago bere dokumentazio orrian.

    + +

    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 behar 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).

    + +

    Instalatzaile honek zure DokiWikiren konfigurazioa ezarriko du AKLrentzat, 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.

    + +

    Esperientziadun erabiltzaileek edo ezarpen behar bereziak dituzten erabiltzaileek honako estekak erabili beharko lituzkete xehetasun gehiago lortzeko instalazio azalpenen inguruan eta konfigurazio ezarpenen inguruan.

    diff --git a/inc/lang/eu/jquery.ui.datepicker.js b/inc/lang/eu/jquery.ui.datepicker.js new file mode 100644 index 0000000..0de057c --- /dev/null +++ b/inc/lang/eu/jquery.ui.datepicker.js @@ -0,0 +1,39 @@ +/* Karrikas-ek itzulia (karrikas@karrikas.com) */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.eu = { + closeText: "Egina", + prevText: "Aur", + nextText: "Hur", + 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/inc/lang/eu/lang.php b/inc/lang/eu/lang.php new file mode 100644 index 0000000..ef6fd6e --- /dev/null +++ b/inc/lang/eu/lang.php @@ -0,0 +1,339 @@ + + * @author Inko Illarramendi + * @author Zigor Astarbe + * @author Yadav Gowda + * @author Osoitz + */ +$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.
    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'] = 'Adobe Flash Plugin 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 DokuWikiren instalazio azalpenak osorik irakurri beharko zenituzke.'; +$lang['i_funcna'] = 'PHP %s funtzioa ez dago erabilgarri. Agian zure hosting hornitzaileak arrazoiren batengatik ezgaituko zuen?'; +$lang['i_phpver'] = 'Zure PHP %s bertsioa behar den %s bertsioa baino zaharragoa da. PHP instalazioa eguneratu beharra daukazu.'; +$lang['i_permfail'] = 'DokuWiki ez da %s idazteko gai. Direktorio honen baimenen konfigurazioa konpondu behar duzu!'; +$lang['i_confexists'] = '%s lehendik existitzen da'; +$lang['i_writeerr'] = 'Ezin da %s sortu. Direktorioaren/fitxategiaren baimenak egiaztatu eta sortu fitxategia eskuz.'; +$lang['i_badhash'] = 'aldatutakoa edo ezezaguna den dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - balioa arauen aurka edo hutsa'; +$lang['i_success'] = 'Konfigurazioa arrakastaz amaitu da. Orain, install.php fitxategia ezabatu dezakezu. Jarraitu ezazu zure DokuWiki berrian.'; +$lang['i_failure'] = 'Akats batzuk gertatu dira konfigurazio fitxategiak idazterakoan. Hauek eskuz konpondu beharra izan dezakezu zure DokuWiki berria 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 %s izen-espazioaren barneko aldaketak ikusten ari zara. Wiki osoaren azken aldaketak 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 %s helbidean.'; +$lang['email_signature_text'] = 'Email hau DokuWiki erabiliz sortu da +@DOKUWIKIURL@'; diff --git a/inc/lang/eu/locked.txt b/inc/lang/eu/locked.txt new file mode 100644 index 0000000..dc29e51 --- /dev/null +++ b/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/inc/lang/eu/login.txt b/inc/lang/eu/login.txt new file mode 100644 index 0000000..7375999 --- /dev/null +++ b/inc/lang/eu/login.txt @@ -0,0 +1,3 @@ +====== Login ====== + +Ez duzu sesiorik hasi! Sar ezazu zure erabiltzaile izena eta pasahitza. Gogoratu coockie-ak baimenduta izan behar dituzula. diff --git a/inc/lang/eu/mailtext.txt b/inc/lang/eu/mailtext.txt new file mode 100644 index 0000000..ad0ff2f --- /dev/null +++ b/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/inc/lang/eu/mailwrap.html b/inc/lang/eu/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/eu/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/eu/newpage.txt b/inc/lang/eu/newpage.txt new file mode 100644 index 0000000..782c980 --- /dev/null +++ b/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/inc/lang/eu/norev.txt b/inc/lang/eu/norev.txt new file mode 100644 index 0000000..7d9cc60 --- /dev/null +++ b/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/inc/lang/eu/password.txt b/inc/lang/eu/password.txt new file mode 100644 index 0000000..a9c079f --- /dev/null +++ b/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/inc/lang/eu/preview.txt b/inc/lang/eu/preview.txt new file mode 100644 index 0000000..fbd5e17 --- /dev/null +++ b/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/inc/lang/eu/pwconfirm.txt b/inc/lang/eu/pwconfirm.txt new file mode 100644 index 0000000..ee4e4f8 --- /dev/null +++ b/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/inc/lang/eu/read.txt b/inc/lang/eu/read.txt new file mode 100644 index 0000000..f7ed7b0 --- /dev/null +++ b/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/inc/lang/eu/recent.txt b/inc/lang/eu/recent.txt new file mode 100644 index 0000000..4ab5482 --- /dev/null +++ b/inc/lang/eu/recent.txt @@ -0,0 +1,3 @@ +====== Azken Aldaketak ====== + +Ondorengo orriak aldatu berriak izan dira: diff --git a/inc/lang/eu/register.txt b/inc/lang/eu/register.txt new file mode 100644 index 0000000..3bfdc1e --- /dev/null +++ b/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. diff --git a/inc/lang/eu/registermail.txt b/inc/lang/eu/registermail.txt new file mode 100644 index 0000000..a2897e6 --- /dev/null +++ b/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/inc/lang/eu/resendpwd.txt b/inc/lang/eu/resendpwd.txt new file mode 100644 index 0000000..2d59e8c --- /dev/null +++ b/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. diff --git a/inc/lang/eu/resetpwd.txt b/inc/lang/eu/resetpwd.txt new file mode 100644 index 0000000..70f43a7 --- /dev/null +++ b/inc/lang/eu/resetpwd.txt @@ -0,0 +1,3 @@ + ====== Pasahitza berria ezarri ====== + +Mesedez wiki honetako zure pasahitza berria sartu. diff --git a/inc/lang/eu/revisions.txt b/inc/lang/eu/revisions.txt new file mode 100644 index 0000000..203cb7e --- /dev/null +++ b/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/inc/lang/eu/searchpage.txt b/inc/lang/eu/searchpage.txt new file mode 100644 index 0000000..a4a0a2b --- /dev/null +++ b/inc/lang/eu/searchpage.txt @@ -0,0 +1,3 @@ +====== Bilaketa ====== + +Emaitzak ondorengo aurkiketan bilatu ditzakezu. @CREATEPAGEINFO@ diff --git a/inc/lang/eu/showrev.txt b/inc/lang/eu/showrev.txt new file mode 100644 index 0000000..ad1b360 --- /dev/null +++ b/inc/lang/eu/showrev.txt @@ -0,0 +1,2 @@ +**Hau dokumentuaren bertsio zahar bat da!** +---- diff --git a/inc/lang/eu/stopwords.txt b/inc/lang/eu/stopwords.txt new file mode 100644 index 0000000..3eb3103 --- /dev/null +++ b/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 diff --git a/inc/lang/eu/subscr_digest.txt b/inc/lang/eu/subscr_digest.txt new file mode 100644 index 0000000..d4c32d7 --- /dev/null +++ b/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/inc/lang/eu/subscr_form.txt b/inc/lang/eu/subscr_form.txt new file mode 100644 index 0000000..02a1178 --- /dev/null +++ b/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/inc/lang/eu/subscr_list.txt b/inc/lang/eu/subscr_list.txt new file mode 100644 index 0000000..10037c3 --- /dev/null +++ b/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/inc/lang/eu/subscr_single.txt b/inc/lang/eu/subscr_single.txt new file mode 100644 index 0000000..13b1787 --- /dev/null +++ b/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/inc/lang/eu/updateprofile.txt b/inc/lang/eu/updateprofile.txt new file mode 100644 index 0000000..588108c --- /dev/null +++ b/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. diff --git a/inc/lang/eu/uploadmail.txt b/inc/lang/eu/uploadmail.txt new file mode 100644 index 0000000..7b685e0 --- /dev/null +++ b/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/inc/lang/fa/admin.txt b/inc/lang/fa/admin.txt new file mode 100644 index 0000000..6fcaf1b --- /dev/null +++ b/inc/lang/fa/admin.txt @@ -0,0 +1,3 @@ +====== مدیریت ====== + +در اینجا فهرستی از وظیفه‌های مدیریتی موجود در داکو ویکی را مشاهده می‌کنید. diff --git a/inc/lang/fa/adminplugins.txt b/inc/lang/fa/adminplugins.txt new file mode 100644 index 0000000..7b5e7f8 --- /dev/null +++ b/inc/lang/fa/adminplugins.txt @@ -0,0 +1 @@ +===== افزونه‌ها ===== \ No newline at end of file diff --git a/inc/lang/fa/backlinks.txt b/inc/lang/fa/backlinks.txt new file mode 100644 index 0000000..572fc3f --- /dev/null +++ b/inc/lang/fa/backlinks.txt @@ -0,0 +1,3 @@ +====== پیوندهای بازگشتی ====== + +در این‌جا فهرستی از برگه‌هایی که به این برگه پیوند داده‌اند را مشاهده می‌کنید. diff --git a/inc/lang/fa/conflict.txt b/inc/lang/fa/conflict.txt new file mode 100644 index 0000000..27f51eb --- /dev/null +++ b/inc/lang/fa/conflict.txt @@ -0,0 +1,5 @@ +====== یک نگارش جدید وجود دارد ====== + +این نگارش جدید از مطلبی که ویرایش کرده‌اید وجود دارد. این اتفاق زمانی رخ می‌دهد که یک کاربر دیگر زمانی که شما ویرایش می‌کرده‌اید، ان را تغییر داده است. + +تفاوت‌های زیر را بررسی کنید، و تصمیم بگیرید که کدام نگارش حفظ شود. اگر دکمه‌ی «ذخیره» را بفشارید، نسخه‌ی شما ذخیره می‌شود و اگر دکمه‌ی «لغو» را بفشارید، نسخه‌ی کنونی حفظ خواهد شد. diff --git a/inc/lang/fa/denied.txt b/inc/lang/fa/denied.txt new file mode 100644 index 0000000..cbb12f3 --- /dev/null +++ b/inc/lang/fa/denied.txt @@ -0,0 +1,3 @@ +====== دسترسی ممکن نیست ====== + +متأسفم، شما اجازهٔ دسترسی به این صفحه را ندارید. diff --git a/inc/lang/fa/diff.txt b/inc/lang/fa/diff.txt new file mode 100644 index 0000000..d2b90f7 --- /dev/null +++ b/inc/lang/fa/diff.txt @@ -0,0 +1,3 @@ +====== تفاوت‌ها ====== + +تفاوت دو نسخهٔ متفاوت از صفحه را مشاهده می‌کنید. diff --git a/inc/lang/fa/draft.txt b/inc/lang/fa/draft.txt new file mode 100644 index 0000000..5189853 --- /dev/null +++ b/inc/lang/fa/draft.txt @@ -0,0 +1,5 @@ +====== فایل چرک‌نویس یافت شد ====== + +آخرین ویرایش شما با موفقیت به پایان نرسیده. دوکوویکی به طور خودکار چرک‌نویسی از صفحه‌ی شما ذخیره می‌کند که شما می‌توانید آن را کامل کنید. در زیر مقادیر موجود در چرک‌نویس را مشاهده می‌کنید. + +خواهشمندیم تصمیم بگیرید که می‌خواهید چرک‌نویس را //بازیابی//، یا آن را //حذف// کنید و یا ویرایش را //لغو// نمایید. diff --git a/inc/lang/fa/edit.txt b/inc/lang/fa/edit.txt new file mode 100644 index 0000000..5e7b244 --- /dev/null +++ b/inc/lang/fa/edit.txt @@ -0,0 +1 @@ +این صفحه را ویرایش کنید و کلید «ذخیره» را فشار دهید. صفحه [[wiki:syntax|قوانین نگارشی]] را برای روش نگارش ویکی مشاهده کنید. خواهشمندیم فقط در صورتی این صفحه را ویرایش کنید که توانایی **بهبود بخشیدن** به آن را دارید. اگر تصمیم دارید چیزی را تست کنید یا اولین قدم‌های‌تان را در نگارش ویکی بردارید، به [[playground:playground|زمین بازی]] بروید. diff --git a/inc/lang/fa/editrev.txt b/inc/lang/fa/editrev.txt new file mode 100644 index 0000000..fa9a0bf --- /dev/null +++ b/inc/lang/fa/editrev.txt @@ -0,0 +1,2 @@ +**شما یک نگارش قدیمی را مشاهده می‌کنید!** اگر این نگارش را ذخیره کنید، شما یک نگارش جدید با این محتویات ایجاد کرده‌اید! +---- diff --git a/inc/lang/fa/index.txt b/inc/lang/fa/index.txt new file mode 100644 index 0000000..5b5aa7d --- /dev/null +++ b/inc/lang/fa/index.txt @@ -0,0 +1,3 @@ +====== نقشه‌ی سایت ====== + +این صفحه حاوی فهرست تمامی صفحات موجود به ترتیب [[doku>namespaces|فضای‌نام‌ها]] است. diff --git a/inc/lang/fa/install.html b/inc/lang/fa/install.html new file mode 100644 index 0000000..0ce8a5d --- /dev/null +++ b/inc/lang/fa/install.html @@ -0,0 +1,7 @@ +

    این صفحه به شما در نصب و تنظیم Dokuwiki کمک می‌کند. اطلاعات بیشتری در این مورد را می‌توانید در بخش راهنما مشاهده کنید.

    + +

    DokuWiki از فایل‌های معمولی برای ذخیره‌ی صفحات ویکی و اطلاعات مربوط به آن‌ها استفاده می‌کند (مثل تصاویر، فهرست‌های جستجو، نگارش‌های پیشین و غیره). برای نصب موفقیت آمیز DokuWiki باید دسترسی نوشتن برای شاخه‌های این فایل‌ها داشته باشید. این کار باید توسط دستورات خط فرمان و یا دسترسی FTP و یا از طریق کنترل پنل خدمات میزبانی‌تون انجام شود.

    + +

    این برنامه دسترسی‌های DokuWiki را برای شما تنظیم خواهد کرد، به این معنی که مدیر سیستم می‌تواند به صفحه‌ی مدیران وارد شود، افزونه نصب کنید، کاربران را مدیریت کند، دسترسی به صفحات ویکی را مدیریت کند و یا تنظیمات را تغییر دهد.

    + +

    برای اطلاعات بیشتر در مورد نصب می‌توانید از این پیوند‌ها استفاده کنید روش نصب و تنظیمات پیکربندی.

    diff --git a/inc/lang/fa/jquery.ui.datepicker.js b/inc/lang/fa/jquery.ui.datepicker.js new file mode 100644 index 0000000..ac30752 --- /dev/null +++ b/inc/lang/fa/jquery.ui.datepicker.js @@ -0,0 +1,76 @@ +/* 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 ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.fa = { + closeText: "بستن", + prevText: "قبلی", + nextText: "بعدی", + 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/inc/lang/fa/lang.php b/inc/lang/fa/lang.php new file mode 100644 index 0000000..c908c6e --- /dev/null +++ b/inc/lang/fa/lang.php @@ -0,0 +1,379 @@ + + * @author علیرضا ایوز + * @author Masoud Sadrnezhaad + * @author behrad eslamifar + * @author Omid Mottaghi + * @author Mohammad Reza Shoaei + * @author Milad DZand + * @author AmirH Hassaneini + * @author mehrdad + * @author reza_khn + * @author Hamid + * @author Mohamad Mehdi Habibi + * @author Mohammad Sadegh + * @author Omid Hezaveh + * @author Mohmmad Razavi + * @author sam01 + */ +$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['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 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['js']['data_insecure'] = 'هشدار: به نظر می رسد فهرست اطلاعات شما به درستی ایمن نشده است. لطفاً درباره Web Access Security in DokuWiki بخوانید.'; +$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'] = 'گذرواژه‌ی DokuWiki شما'; +$lang['reghere'] = 'شما هنوز حسابی در اینجا ندارید؟ یکی ایجاد کنید'; +$lang['profna'] = 'این ویکی اجازه ویرایش پروفایل را نمی‌دهد'; +$lang['profnochange'] = 'تغییری صورت نگرفت.'; +$lang['profnoempty'] = 'نام و آدرس ایمیل باید پر شود.'; +$lang['profchanged'] = 'پروفایل کاربر با موفقیت به روز شد.'; +$lang['profnodelete'] = 'این ویکی از حذف کاربران پشتیبانی نمی‌کند'; +$lang['profdeleteuser'] = 'حذف حساب کاربری'; +$lang['profdeleted'] = 'حساب کاربری شما از این ویکی حذف گردیده است'; +$lang['profconfdelete'] = 'می‌خواهم حساب کاربری من از این ویکی حذف شود.
    این عمل قابل برگشت نیست.'; +$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['allowedmime'] = 'لیست پسوندهای مجاز فایل'; +$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'] = 'برای نمایش محتویات افزونه‌ی فلش مورد نیاز است.'; +$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'] = 'به دلایل امنیتی، این اسکریپت فقط با نصب تازه و بدون تغییر دوکوویکی کار خواهد کرد. شما باید دوباره فایل فشرده را باز کنید راهنمای نصب DokuWiki را بررسی کنید.'; +$lang['i_funcna'] = 'تابع %s در پی‌اچ‌پی موجود نیست. ممکن است شرکت خدمات وب شما آن را مسدود کرده باشد.'; +$lang['i_disabled'] = 'توسط ارائه دهنده شما غیرفعال شده است.'; +$lang['i_funcnmail'] = 'توجه: PHP mail function در دسترس نیست. %s اگر در دسترس نیست، می‌توانید افزونه smtp را نصب کنید.'; +$lang['i_phpver'] = 'نگارش پی‌اچ‌پی %s پایین‌تر از نگارش مورد نیاز، یعنی %s است. خواهشمندیم به روز رسانی کنید.'; +$lang['i_mbfuncoverload'] = 'برای اجرای دوکوویکی باید mbstring.func_overload را در php.ini غیرفعال کنید.'; +$lang['i_permfail'] = 'شاخه‌ی %s قابلیت نوشتن ندارد. شما باید دسترسی‌های این شاخه را تنظیم کنید!'; +$lang['i_confexists'] = '%s پیش‌تر موجود است'; +$lang['i_writeerr'] = 'توانایی ایجاد %s نیست. شما باید دسترسی‌های شاخه یا فایل را بررسی کنید و فایل را به طور دستی ایجاد کنید.'; +$lang['i_badhash'] = 'فایل dokuwiki.php غیرقابل تشخیص بوده یا تغییر کرده است (hash=%s)'; +$lang['i_badval'] = '%s - غیرقانونی و یا مقادیر تهی'; +$lang['i_success'] = 'تنظیمات با موفقیت به پایان رسید. بهتر است فایل install.php را حذف کنید. برای ادامه این‌جا کلیک کنید.'; +$lang['i_failure'] = 'مشکلاتی در زمان نوشتن فایل تنظیمات پیش آمده است. شما باید این مشکلات را پیش از استفاده از DokuWiki برطرف کنید.'; +$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'] = 'شما هم‌اکنون تغییرات فضای‌نام %s را مشاهده می‌کنید. شما هم‌چنین می‌توانید تغییرات اخیر در کل ویکی را مشاهده نمایید.'; +$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['email_fail'] = 'PHP Mail() یافت نشد یا غیرفعال است. ایمیل زیر ارسال نشد:'; +$lang['currentns'] = 'فضای نام جاری'; +$lang['searchresult'] = 'نتیجه‌ی جستجو'; +$lang['plainhtml'] = 'HTML ساده'; +$lang['wikimarkup'] = 'نشانه‌گذاری ویکی'; +$lang['page_nonexist_rev'] = 'صفحه %s وجود نداشت. این صفحه معاقباً در%s ایجاد شد.'; +$lang['unable_to_parse_date'] = 'امکان تجزیه و تحلیل پارامتر «%s» وجود ندارد.'; +$lang['email_signature_text'] = 'این ایمیل توسط دوکوویکی تولید شده است +@DOKUWIKIURL@'; + +$lang['log_file_too_large'] = 'فایل ثبت وقوعات (لاگ) بسیار بزرگ است. خطوط قبلی نادیده گرفته شده است!'; +$lang['log_file_failed_to_open'] = 'باز کردن فایل وقایع (لاگ) با خطا مواجه شد'; +$lang['log_file_failed_to_read'] = 'هنگام خواندن فایل خطایی روی داد.'; diff --git a/inc/lang/fa/locked.txt b/inc/lang/fa/locked.txt new file mode 100644 index 0000000..a2ebc7c --- /dev/null +++ b/inc/lang/fa/locked.txt @@ -0,0 +1,3 @@ +====== قفل شده است ====== + +این صفحه توسط یک کاربر دیگر، برای ویرایش، قفل شده است. شما باید تا پایان ویرایش این کاربر یا منقضی شدن قفل صبر کنید. diff --git a/inc/lang/fa/login.txt b/inc/lang/fa/login.txt new file mode 100644 index 0000000..9eff85a --- /dev/null +++ b/inc/lang/fa/login.txt @@ -0,0 +1,3 @@ +====== ورود ====== + +شما وارد سایت نشده‌اید! موارد زیر را تایپ کنید تا وارد شوید. برای ورود، نیاز دارید که کوکی‌های مرورگر فعال باشد. diff --git a/inc/lang/fa/mailtext.txt b/inc/lang/fa/mailtext.txt new file mode 100644 index 0000000..b51be6b --- /dev/null +++ b/inc/lang/fa/mailtext.txt @@ -0,0 +1,12 @@ +یک صفحه در ویکی افزوده شده یا تغییر کرده، اطلاعات آن را می‌توانید در زیر بینید: + +تاریخ: @DATE@ +مرورگر: @BROWSER@ +آدرس IP: @IPADDRESS@ +نام هوست: @HOSTNAME@ +نگارش پیشین: @OLDPAGE@ +نگارش نو: @NEWPAGE@ +خلاصه ویرایش: @SUMMARY@ +کاربر: @USER@ + +@DIFF@ diff --git a/inc/lang/fa/mailwrap.html b/inc/lang/fa/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/fa/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/fa/newpage.txt b/inc/lang/fa/newpage.txt new file mode 100644 index 0000000..6af3c77 --- /dev/null +++ b/inc/lang/fa/newpage.txt @@ -0,0 +1,3 @@ +====== این صفحه وجود ندارد ====== + +شما به این صفحه که وجود ندارد رسیده‌اید. اگر دسترسی‌ها به شما اجازه می‌دهند، می‌توانید این صفحه را با کلیلک کردن روی دکمه‌ی «ساخت این صفحه» ایجاد کنید. diff --git a/inc/lang/fa/norev.txt b/inc/lang/fa/norev.txt new file mode 100644 index 0000000..9ca400a --- /dev/null +++ b/inc/lang/fa/norev.txt @@ -0,0 +1,3 @@ +====== نگارشی یافت نشد ====== + +نگارش مورد نظر یافت نشد. از دکمه‌ی «نگارش‌های پیشین» برای مشاهده‌ی نگارش‌های پیشین این صفحه استفاده کنید. diff --git a/inc/lang/fa/onceexisted.txt b/inc/lang/fa/onceexisted.txt new file mode 100644 index 0000000..90eada4 --- /dev/null +++ b/inc/lang/fa/onceexisted.txt @@ -0,0 +1,3 @@ +======= این صفحه دیگر وجود ندارد ====== + +شما پیوندی را به صفحه ای که دیگر وجود ندارد دنبال کرده اید. می‌توانید فهرست **نسخه‌های قدیمی** را بررسی کنید تا ببینید چه زمانی و چرا حذف شده است، به نسخه‌های قدیمی دسترسی داشته باشید یا آن را بازیابی کنید. diff --git a/inc/lang/fa/password.txt b/inc/lang/fa/password.txt new file mode 100644 index 0000000..86e7289 --- /dev/null +++ b/inc/lang/fa/password.txt @@ -0,0 +1,6 @@ +سلام @FULLNAME@! + +اطلاعات شخصی شما با عنوان @TITLE@ در @DOKUWIKIURL@ در ادامه آمده است: + +نام کاربری: @LOGIN@ +گذرواژه: @PASSWORD@ diff --git a/inc/lang/fa/preview.txt b/inc/lang/fa/preview.txt new file mode 100644 index 0000000..bc656b9 --- /dev/null +++ b/inc/lang/fa/preview.txt @@ -0,0 +1,3 @@ +====== پیش‌نمایش ====== + +این پیش‌نمایش متن شماست. به یاد داشته باشید که این متن هنوز **ذخیره نشده‌است**! diff --git a/inc/lang/fa/pwconfirm.txt b/inc/lang/fa/pwconfirm.txt new file mode 100644 index 0000000..e97b612 --- /dev/null +++ b/inc/lang/fa/pwconfirm.txt @@ -0,0 +1,9 @@ +سلام @FULLNAME@! + +یک نفر با عنوان @TITLE@ برای ورود به @DOKUWIKIURL@ درخواست گذرواژه‌ای جدید کرده است: + +اگر شما چنین درخواستی نداده‌اید، به این ایمیل توجه نکنید. + +اگر این درخواست توسط شما داده شده است، برای تایید روی لینک زیر کلیک کنید. + +@CONFIRM@ diff --git a/inc/lang/fa/read.txt b/inc/lang/fa/read.txt new file mode 100644 index 0000000..6d7cb66 --- /dev/null +++ b/inc/lang/fa/read.txt @@ -0,0 +1 @@ +این صفحه فقط خواندنی است. شما می‌توانید متن صفحه را مشاهده کنید، اما نمی‌توانید آن را تغییر دهید. اگر فکر می‌کنید که مشکلی رخ داده است، مدیر ویکی را در جریان بگذارید. diff --git a/inc/lang/fa/recent.txt b/inc/lang/fa/recent.txt new file mode 100644 index 0000000..e2e9005 --- /dev/null +++ b/inc/lang/fa/recent.txt @@ -0,0 +1,3 @@ +====== تغییرات اخیر ====== + +این صفحه‌ها به تازگی تغییر کرده‌اند: diff --git a/inc/lang/fa/register.txt b/inc/lang/fa/register.txt new file mode 100644 index 0000000..2412478 --- /dev/null +++ b/inc/lang/fa/register.txt @@ -0,0 +1,3 @@ +====== ثبت نام ====== + +تمامی فیلدها را پر کنید و اطمینان پیدا کنید که ایمیل معتبر وارد کرده‌اید - اگر شما گذرواژه‌ای وارد نکردید، یک مقدار جدید برای‌تان ارسال خواهد شد. نام کاربری شما باید یک [[doku>pagename|صفحه‌ی]] معتبر باشد. diff --git a/inc/lang/fa/registermail.txt b/inc/lang/fa/registermail.txt new file mode 100644 index 0000000..f69460f --- /dev/null +++ b/inc/lang/fa/registermail.txt @@ -0,0 +1,10 @@ +یک کاربر تازه با مشخصات زیر عضو ویکی شده است: + +نام کاربری: @NEWUSER@ +اسم کامل: @NEWNAME@ +ایمیل: @NEWEMAIL@ + +تاریخ: @DATE@ +مرورگر: @BROWSER@ +آدرس IP: @IPADDRESS@ +نام هوست: @HOSTNAME@ diff --git a/inc/lang/fa/resendpwd.txt b/inc/lang/fa/resendpwd.txt new file mode 100644 index 0000000..991c4fb --- /dev/null +++ b/inc/lang/fa/resendpwd.txt @@ -0,0 +1,3 @@ +====== ارسال گذرواژه‌ی جدید ====== + +خواهش‌مندیم نام کاربری خود را در فرم زیر بنویسید تا گذرواژه‌ی جدید برای‌تان ارسال شود. یک پیوند تاییدیه برای ایمیل ثبت شده ارسال می‌شود. diff --git a/inc/lang/fa/resetpwd.txt b/inc/lang/fa/resetpwd.txt new file mode 100644 index 0000000..e442192 --- /dev/null +++ b/inc/lang/fa/resetpwd.txt @@ -0,0 +1,3 @@ +====== تعیین کلمه عبور جدید ====== + +لطفاً یک کلمه عبور جدید برای حساب کاربری خود در این ویکی ایجاد کنید. diff --git a/inc/lang/fa/revisions.txt b/inc/lang/fa/revisions.txt new file mode 100644 index 0000000..5eb1f03 --- /dev/null +++ b/inc/lang/fa/revisions.txt @@ -0,0 +1,3 @@ +====== نگارش‌های پیشین ====== + +در اینجا نگارش‌های پیشین این صفحه را مشاهده می‌کنید. برای بازگشتن به آن‌ها، آن را انتخاب کنید و کلید «ویرایش این صفحه» را انتخاب کنید و سپس ذخیره نمایید. diff --git a/inc/lang/fa/searchpage.txt b/inc/lang/fa/searchpage.txt new file mode 100644 index 0000000..fad8c90 --- /dev/null +++ b/inc/lang/fa/searchpage.txt @@ -0,0 +1,3 @@ +====== جستجو ====== + +نتایج جستجو در زیر آمده است. @CREATEPAGEINFO@ diff --git a/inc/lang/fa/showrev.txt b/inc/lang/fa/showrev.txt new file mode 100644 index 0000000..b878a22 --- /dev/null +++ b/inc/lang/fa/showrev.txt @@ -0,0 +1,2 @@ +**این یک نگارش قدیمی از این مطلب است!** +---- diff --git a/inc/lang/fa/stopwords.txt b/inc/lang/fa/stopwords.txt new file mode 100644 index 0000000..f4c0d8d --- /dev/null +++ b/inc/lang/fa/stopwords.txt @@ -0,0 +1,446 @@ +# 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 +من +تو +او +ما +شما +آنها +ایشان +ایشون +از +و +را +ای +یا +باید +شاید +چرا +چون +چگونه +چه +اگر +الان +سلام +ممنون +موفق +باشید +باش +باشند +باشی +باشم +باشد +است +نیست +شد +شدن +شدند +شدیم +شدید +درباره +یک +دو +سه +چهار +پنج +شش +هفت +هشت +ده +در +هست +هستم +هستی +هستیم +هستید +هستند +برای +این +آن +اون +روی +رو +بود +بودم +بودی +بودیم +بودید +بودند +کجا +کی +با +کس +کسی +پیرامون +نزدیک +بالا +پایین +بالای +بالاتر +موافق +مطابق +طبق +برطبق +همان +سر +درمیان +عرض +طرف +عملا +واقعا +بعد +قبل +جستجو +سپس +دوباره +رفتم +رفتی +رفت +رفتیم +رفتید +رفتند +بای +اوه +آه +اه +برابر +بااینکه +همواره +همیشه +پیوسته +وقت +هزار +دیگر +جدا +شخص +کدام +هیچگونه +بهرحال +هرچیز +هیچکار +درهرصورت +پدیدار +درک +باشه +جنوب +ضبط +حوالی +نزدیکی +چنانچه +بطوریکه +هنگامیکه +مثال +مانند +پرسیدن +جویا +خواهش +خواستن +انجمن +کنار +پیک +بیرون +خارج +مرتبا +آغاز +پایان +آمد +امد +به +زیرا +چونکه +آمدن +بودن +درخور +بوده +پیش +پس +قبلا +راحت +مقدم +کار +برو +بیا +باور +گمان +بمیر +چپ +راست +شمال +غرب +شرق +دور +گذشته +آینده +بهتر +بهترین +بدترین +عظیم +کوچک +نیک +بدتر +خوب +بد +زشت +میان +هردو +هم +یکی +کوتاه +بلند +مختصر +حکم +اما +ولی +لیکن +حز +مگر +فقط +بدون +محض +بخش +بدست +وسیله +درجه +اول +دوم +سوم +چهارم +پنجم +ششم +هفتم +هشتم +نهم +دهم +امکان +داشتن +داشتیم +داشتی +داشتند +داشتید +سبب +علت +موجب +هدف +صفر +محتوی +دارا +شامل +نیا +چیز +نرو +مسیر +روش +جهت +دقیقا +درطی +درضمن +بسرعت +رایج +جاری +طورقطعی +شرح +کرد +انجام +عدد +غیر +بریم +کاملا +قلم +آب +سایه +مساوی +صاف +هموار +حتی +جفت +هرگز +درست +کامل +چنین +دومین +سومین +چهارمین +پنجمین +ششمین +هشتمین +نهمین +دهمین +برید +رفتن +راه +درود +خداحافظ +حاجی +واقع +سخت +آسان +مشکل +اینجا +آنجا +خودش +هنوز +بلافاصله +نگاه +نگه +آخر +اخر +عمرا +کمترین +کوچکترین +اقل +مثل +شکل +نظر +چندین +زیاد +احتمالا +متوسط +یعنی +اساسا +عالی +وای +خودم +خودت +خودمان +خودمون +اسم +نام +آره +حال +حالا +اینک +خیلی +بارها +بسیار +کن +وسط +ممکن +راستی +فعلا +صحیح +واقعی +گفت +گفتم +گفتیم +امثال +آنکه +مهم +جدی +چنان +چندان +زیادی +بعضی +گاهگاهی +زود +بزودی +بگیر +ببر +بردن +گیرنده +تا +تشکر +سپاس +ان +آنان +بکلی +تماما +بنا +همدیگر +جلو +معمولا +مقدار +موقع +اونجا +آیا +که +بچه +حاضر +میخواستم +بلی +خیر +فوروم +خواهم +داره +نداره +داری +همون +میبینم +اینجوریه +بهش +هستن +امضام +اولی +دومی +سومی +چهارمی +بگذار +بکنه +امروز +صدمین +همش +همگی +هوا +اعلام +اخرین +خودشون +حد +شده +اینکه +خب +یه +اینجوری +گاه +گهگاه +گاهی +گهگدار +گهگداری +ها +میشه +کمی +راجبه +توضیح +بدی +راجع +می +شه +روز +کنی +اصلا +www diff --git a/inc/lang/fa/subscr_digest.txt b/inc/lang/fa/subscr_digest.txt new file mode 100644 index 0000000..c5ac515 --- /dev/null +++ b/inc/lang/fa/subscr_digest.txt @@ -0,0 +1,13 @@ +سلام، + +صفحه‌ی @PAGE@ با عنوان @TITLE@ در ویکی تغییر کرد. +تغییرات عبارت است از: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +نگارش پیشین: @OLDPAGE@ +نگارش نو: @NEWPAGE@ + +برای از بین بردن آگاهی‌های این صفحه، از طریق آدرس @DOKUWIKIURL@ وارد ویکی شده و صفحه‌ی @SUBSCRIBE@ را مرور کنید و عضویت خود را از صفحه یا فضای‌نام پاک کنید. diff --git a/inc/lang/fa/subscr_form.txt b/inc/lang/fa/subscr_form.txt new file mode 100644 index 0000000..39764d0 --- /dev/null +++ b/inc/lang/fa/subscr_form.txt @@ -0,0 +1,3 @@ +====== مدیریت عضویت‌ها ====== + +این صفحه به شما امکان مدیریت عضویت‌تان را برای این صفحه یا فضای‌نام می‌دهد. \ No newline at end of file diff --git a/inc/lang/fa/subscr_list.txt b/inc/lang/fa/subscr_list.txt new file mode 100644 index 0000000..6970997 --- /dev/null +++ b/inc/lang/fa/subscr_list.txt @@ -0,0 +1,13 @@ +سلام، + +صفحه‌های فضای‌نام @PAGE@ با عنوان @TITLE@ در ویکی تغییر کرد. +تغییرات عبارت است از: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +نگارش پیشین: @OLDPAGE@ +نگارش نو: @NEWPAGE@ + +برای از بین بردن آگاهی‌های این صفحه، از طریق آدرس @DOKUWIKIURL@ وارد ویکی شده و صفحه‌ی @SUBSCRIBE@ را مرور کنید و عضویت خود را از صفحه یا فضای‌نام پاک کنید. diff --git a/inc/lang/fa/subscr_single.txt b/inc/lang/fa/subscr_single.txt new file mode 100644 index 0000000..75ffb24 --- /dev/null +++ b/inc/lang/fa/subscr_single.txt @@ -0,0 +1,16 @@ +سلام، + +صفحه‌ی @PAGE@ با عنوان @TITLE@ در ویکی تغییر کرد. +تغییرات عبارت است از: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +تاریخ : @DATE@ +نام‌کاربری: @USER@ +خلاصه ویرایش: @SUMMARY@ +نگارش پیشین: @OLDPAGE@ +نگارش نو: @NEWPAGE@ + +برای از بین بردن آگاهی‌های این صفحه، از طریق آدرس @DOKUWIKIURL@ وارد ویکی شده و صفحه‌ی @NEWPAGE@ را مرور کنید و عضویت خود را از صفحه یا فضای‌نام پاک کنید. diff --git a/inc/lang/fa/updateprofile.txt b/inc/lang/fa/updateprofile.txt new file mode 100644 index 0000000..8606898 --- /dev/null +++ b/inc/lang/fa/updateprofile.txt @@ -0,0 +1,3 @@ +====== به روز رسانی پروفایل ====== + +شما می‌توانید مقادیر زیر را تغییر دهید. diff --git a/inc/lang/fa/uploadmail.txt b/inc/lang/fa/uploadmail.txt new file mode 100644 index 0000000..e9218b6 --- /dev/null +++ b/inc/lang/fa/uploadmail.txt @@ -0,0 +1,10 @@ +یک فایل به ویکی ارسال شد: + +فایل: @MEDIA@ +تاریخ: @DATE@ +مرورگر: @BROWSER@ +آدرس IP: @IPADDRESS@ +نام هوست: @HOSTNAME@ +اندازه: @SIZE@ +MIME: @MIME@ +کاربر: @USER@ diff --git a/inc/lang/fi/admin.txt b/inc/lang/fi/admin.txt new file mode 100644 index 0000000..b57b608 --- /dev/null +++ b/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/inc/lang/fi/adminplugins.txt b/inc/lang/fi/adminplugins.txt new file mode 100644 index 0000000..fa3571e --- /dev/null +++ b/inc/lang/fi/adminplugins.txt @@ -0,0 +1 @@ +===== Muita liitännäisiä ===== \ No newline at end of file diff --git a/inc/lang/fi/backlinks.txt b/inc/lang/fi/backlinks.txt new file mode 100644 index 0000000..b84e465 --- /dev/null +++ b/inc/lang/fi/backlinks.txt @@ -0,0 +1,3 @@ +====== Linkitykset ====== + +Tässä lista tälle sivuille linkittävistä sivuista. diff --git a/inc/lang/fi/conflict.txt b/inc/lang/fi/conflict.txt new file mode 100644 index 0000000..be788a1 --- /dev/null +++ b/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/inc/lang/fi/denied.txt b/inc/lang/fi/denied.txt new file mode 100644 index 0000000..f642715 --- /dev/null +++ b/inc/lang/fi/denied.txt @@ -0,0 +1,3 @@ +====== Lupa evätty ====== + +Sinulla ei ole tarpeeksi valtuuksia jatkaa. diff --git a/inc/lang/fi/diff.txt b/inc/lang/fi/diff.txt new file mode 100644 index 0000000..fbf62b7 --- /dev/null +++ b/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/inc/lang/fi/draft.txt b/inc/lang/fi/draft.txt new file mode 100644 index 0000000..2e4a1ee --- /dev/null +++ b/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. diff --git a/inc/lang/fi/edit.txt b/inc/lang/fi/edit.txt new file mode 100644 index 0000000..81b7714 --- /dev/null +++ b/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/inc/lang/fi/editrev.txt b/inc/lang/fi/editrev.txt new file mode 100644 index 0000000..fd4d9a3 --- /dev/null +++ b/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/inc/lang/fi/index.txt b/inc/lang/fi/index.txt new file mode 100644 index 0000000..9086e22 --- /dev/null +++ b/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/inc/lang/fi/install.html b/inc/lang/fi/install.html new file mode 100644 index 0000000..74be322 --- /dev/null +++ b/inc/lang/fi/install.html @@ -0,0 +1,7 @@ +

    Tämä sivu avustaa Dokuwikin ensiasennuksessa ja asetuksissa. Lisätietoa asennusohjelmasta löytyy ohjelman dokumentaatiosta.

    + +

    DokuWiki käyttää tavallisia tiedostoja wiki-sivujen, sekä muiden niihin liittyvien tietojen kuten kuvien, hakuindeksien, versionhallinnan jne. tallentamiseen. Toimiakseen oikein DokuWikillä täytyy 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).

    + +

    Asennusohjelma määrittelee DokuWikin käyttöoikeudet (ACL), 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ä.

    + +

    Kokeneille käyttäjille tai käyttäjille joilla on erityisvaatimuksia asennukselle löytyy lisätietoa asennuksesta sekä asetuksista.

    diff --git a/inc/lang/fi/jquery.ui.datepicker.js b/inc/lang/fi/jquery.ui.datepicker.js new file mode 100644 index 0000000..d355e9e --- /dev/null +++ b/inc/lang/fi/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Finnish initialisation for the jQuery UI date picker plugin. */ +/* Written by Harri Kilpiö (harrikilpio@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.fi = { + closeText: "Sulje", + prevText: "Edellinen", + nextText: "Seuraava", + 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/inc/lang/fi/lang.php b/inc/lang/fi/lang.php new file mode 100644 index 0000000..541311c --- /dev/null +++ b/inc/lang/fi/lang.php @@ -0,0 +1,345 @@ + + * @author Tuomo Hartikainen + * @author Petteri + * @author Matti Pöllä + * @author Otto Vainio + * @author Teemu Mattila + * @author Sami Olmari + * @author Rami Lehti + * @author Jussi Takala + * @author Wiki Doku + */ +$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['searchcreatepage'] = 'Jos et löytänyt etsimääsi, voit luoda tai muokata sivua %s, joka on nimetty kyselysi mukaan.'; +$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['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ä.
    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['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 Adobe Flash-liitännäisen 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 Dokuwikin asennusohje (englanniksi)'; +$lang['i_funcna'] = 'PHP:n funktio %s ei ole käytettävissä. Palveluntarjoajasi on saattanut poistaa sen jostain syystä.'; +$lang['i_phpver'] = 'Käyttämäsi PHP-ohjelmiston versio %s on pienempi, kuin tarvitaan %s. 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'] = '%s ei ole DokuWikin kirjoitettavissa. Muokkaa hakemiston oikeuksia!'; +$lang['i_confexists'] = '%s on jo olemassa'; +$lang['i_writeerr'] = '%sn luonti epäonnistui. Tarkista hakemiston/tiedoston oikeudet ja luo tiedosto käsin.'; +$lang['i_badhash'] = 'tunnistamaton tai muokattu dokuwiki.php (tarkistussumma=%s)'; +$lang['i_badval'] = '%s - väärä tai tyhjä arvo'; +$lang['i_success'] = 'Kokoonpano tehty onnistuneesti. Voit poistaa install.php tiedoston. Jatka uuteen DokuWikiisi.'; +$lang['i_failure'] = 'Joitain virheitä tapahtui kirjoitettaessa vaadittavia tiedostoja. Sinun pitää korjata ne käsin ennen kuin voit käyttää uutta DokuWikiäsi.'; +$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 %s sisällä. Voit myös katsoa muutoksia koko wikissä'; +$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ä %s nimiavaruuteen'; +$lang['media_search'] = 'Etsi %s 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/inc/lang/fi/locked.txt b/inc/lang/fi/locked.txt new file mode 100644 index 0000000..3a48ff8 --- /dev/null +++ b/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/inc/lang/fi/login.txt b/inc/lang/fi/login.txt new file mode 100644 index 0000000..efba262 --- /dev/null +++ b/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/inc/lang/fi/mailtext.txt b/inc/lang/fi/mailtext.txt new file mode 100644 index 0000000..015b3c3 --- /dev/null +++ b/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/inc/lang/fi/mailwrap.html b/inc/lang/fi/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/fi/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/fi/newpage.txt b/inc/lang/fi/newpage.txt new file mode 100644 index 0000000..29e6786 --- /dev/null +++ b/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/inc/lang/fi/norev.txt b/inc/lang/fi/norev.txt new file mode 100644 index 0000000..a5138cf --- /dev/null +++ b/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/inc/lang/fi/password.txt b/inc/lang/fi/password.txt new file mode 100644 index 0000000..e088166 --- /dev/null +++ b/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/inc/lang/fi/preview.txt b/inc/lang/fi/preview.txt new file mode 100644 index 0000000..c5586e8 --- /dev/null +++ b/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/inc/lang/fi/pwconfirm.txt b/inc/lang/fi/pwconfirm.txt new file mode 100644 index 0000000..de6780c --- /dev/null +++ b/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/inc/lang/fi/read.txt b/inc/lang/fi/read.txt new file mode 100644 index 0000000..eb43802 --- /dev/null +++ b/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/inc/lang/fi/recent.txt b/inc/lang/fi/recent.txt new file mode 100644 index 0000000..4ab1234 --- /dev/null +++ b/inc/lang/fi/recent.txt @@ -0,0 +1,3 @@ +====== Viimeiset muutokset ====== + +Seuraavat sivut ovat muuttuneet viime aikoina: diff --git a/inc/lang/fi/register.txt b/inc/lang/fi/register.txt new file mode 100644 index 0000000..cf7a625 --- /dev/null +++ b/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/inc/lang/fi/registermail.txt b/inc/lang/fi/registermail.txt new file mode 100644 index 0000000..07c35be --- /dev/null +++ b/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/inc/lang/fi/resendpwd.txt b/inc/lang/fi/resendpwd.txt new file mode 100644 index 0000000..5a567b0 --- /dev/null +++ b/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/inc/lang/fi/resetpwd.txt b/inc/lang/fi/resetpwd.txt new file mode 100644 index 0000000..074c529 --- /dev/null +++ b/inc/lang/fi/resetpwd.txt @@ -0,0 +1,3 @@ +====== Aseta salasana ====== + +Anna uusi salasanasi tässä wikissä. diff --git a/inc/lang/fi/revisions.txt b/inc/lang/fi/revisions.txt new file mode 100644 index 0000000..a48cd33 --- /dev/null +++ b/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/inc/lang/fi/searchpage.txt b/inc/lang/fi/searchpage.txt new file mode 100644 index 0000000..0243441 --- /dev/null +++ b/inc/lang/fi/searchpage.txt @@ -0,0 +1,3 @@ +====== Etsi ====== + +Löydät etsinnän tulokset alta. @CREATEPAGEINFO@ diff --git a/inc/lang/fi/showrev.txt b/inc/lang/fi/showrev.txt new file mode 100644 index 0000000..243f8d0 --- /dev/null +++ b/inc/lang/fi/showrev.txt @@ -0,0 +1,2 @@ +**Tämä on vanha versio dokumentista!** +---- diff --git a/inc/lang/fi/stopwords.txt b/inc/lang/fi/stopwords.txt new file mode 100644 index 0000000..85c1fab --- /dev/null +++ b/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/ +com +eli +oli +sinä +sinun +tai +www diff --git a/inc/lang/fi/subscr_digest.txt b/inc/lang/fi/subscr_digest.txt new file mode 100644 index 0000000..e395e07 --- /dev/null +++ b/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/inc/lang/fi/subscr_form.txt b/inc/lang/fi/subscr_form.txt new file mode 100644 index 0000000..70f2fde --- /dev/null +++ b/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/inc/lang/fi/subscr_list.txt b/inc/lang/fi/subscr_list.txt new file mode 100644 index 0000000..255f123 --- /dev/null +++ b/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/inc/lang/fi/subscr_single.txt b/inc/lang/fi/subscr_single.txt new file mode 100644 index 0000000..f373ff3 --- /dev/null +++ b/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/inc/lang/fi/updateprofile.txt b/inc/lang/fi/updateprofile.txt new file mode 100644 index 0000000..e7e3621 --- /dev/null +++ b/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. diff --git a/inc/lang/fi/uploadmail.txt b/inc/lang/fi/uploadmail.txt new file mode 100644 index 0000000..e7b9abf --- /dev/null +++ b/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/inc/lang/fo/admin.txt b/inc/lang/fo/admin.txt new file mode 100644 index 0000000..fce45bd --- /dev/null +++ b/inc/lang/fo/admin.txt @@ -0,0 +1,3 @@ +====== Fyrisiting ====== + +Niðanfyri kanst tú finna eina røð av amboðum til fyrisiting. diff --git a/inc/lang/fo/backlinks.txt b/inc/lang/fo/backlinks.txt new file mode 100644 index 0000000..5c79e05 --- /dev/null +++ b/inc/lang/fo/backlinks.txt @@ -0,0 +1,3 @@ +====== Ávísing afturúr ====== + +Hetta er ein listi yvur øll tey skjøl sum vísa aftur á tað núverandi skjali. diff --git a/inc/lang/fo/conflict.txt b/inc/lang/fo/conflict.txt new file mode 100644 index 0000000..df3fe52 --- /dev/null +++ b/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/inc/lang/fo/denied.txt b/inc/lang/fo/denied.txt new file mode 100644 index 0000000..056822b --- /dev/null +++ b/inc/lang/fo/denied.txt @@ -0,0 +1,3 @@ +====== Atgongd nokta! ====== + +Tú hevur ikki rættindi til at halda áfram. diff --git a/inc/lang/fo/diff.txt b/inc/lang/fo/diff.txt new file mode 100644 index 0000000..b199844 --- /dev/null +++ b/inc/lang/fo/diff.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/fo/edit.txt b/inc/lang/fo/edit.txt new file mode 100644 index 0000000..a5d7764 --- /dev/null +++ b/inc/lang/fo/edit.txt @@ -0,0 +1 @@ +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/inc/lang/fo/editrev.txt b/inc/lang/fo/editrev.txt new file mode 100644 index 0000000..274d423 --- /dev/null +++ b/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/inc/lang/fo/index.txt b/inc/lang/fo/index.txt new file mode 100644 index 0000000..640edfb --- /dev/null +++ b/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/inc/lang/fo/jquery.ui.datepicker.js b/inc/lang/fo/jquery.ui.datepicker.js new file mode 100644 index 0000000..d2ec9d7 --- /dev/null +++ b/inc/lang/fo/jquery.ui.datepicker.js @@ -0,0 +1,48 @@ +/* Faroese initialisation for the jQuery UI date picker plugin */ +/* Written by Sverri Mohr Olsen, sverrimo@gmail.com */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.fo = { + closeText: "Lat aftur", + prevText: "Fyrra", + nextText: "Næsta", + 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/inc/lang/fo/lang.php b/inc/lang/fo/lang.php new file mode 100644 index 0000000..9b078d3 --- /dev/null +++ b/inc/lang/fo/lang.php @@ -0,0 +1,170 @@ + + * @author Einar Petersen + */ +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '"'; +$lang['doublequoteclosing'] = '"'; +$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/inc/lang/fo/locked.txt b/inc/lang/fo/locked.txt new file mode 100644 index 0000000..2e65a06 --- /dev/null +++ b/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/inc/lang/fo/login.txt b/inc/lang/fo/login.txt new file mode 100644 index 0000000..31a4c54 --- /dev/null +++ b/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/inc/lang/fo/mailtext.txt b/inc/lang/fo/mailtext.txt new file mode 100644 index 0000000..331edfe --- /dev/null +++ b/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/inc/lang/fo/newpage.txt b/inc/lang/fo/newpage.txt new file mode 100644 index 0000000..22e33a6 --- /dev/null +++ b/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/inc/lang/fo/norev.txt b/inc/lang/fo/norev.txt new file mode 100644 index 0000000..d9600c6 --- /dev/null +++ b/inc/lang/fo/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/fo/password.txt b/inc/lang/fo/password.txt new file mode 100644 index 0000000..df8b6e7 --- /dev/null +++ b/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/inc/lang/fo/preview.txt b/inc/lang/fo/preview.txt new file mode 100644 index 0000000..67912bc --- /dev/null +++ b/inc/lang/fo/preview.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/fo/read.txt b/inc/lang/fo/read.txt new file mode 100644 index 0000000..c3a288d --- /dev/null +++ b/inc/lang/fo/read.txt @@ -0,0 +1 @@ +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/inc/lang/fo/recent.txt b/inc/lang/fo/recent.txt new file mode 100644 index 0000000..203c151 --- /dev/null +++ b/inc/lang/fo/recent.txt @@ -0,0 +1,3 @@ +====== Nýggjar broytingar ====== + +Fylgjandi skjøl er broytt nýliga: diff --git a/inc/lang/fo/register.txt b/inc/lang/fo/register.txt new file mode 100644 index 0000000..236c814 --- /dev/null +++ b/inc/lang/fo/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/fo/resendpwd.txt b/inc/lang/fo/resendpwd.txt new file mode 100644 index 0000000..450202c --- /dev/null +++ b/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/inc/lang/fo/revisions.txt b/inc/lang/fo/revisions.txt new file mode 100644 index 0000000..dcd845c --- /dev/null +++ b/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/inc/lang/fo/searchpage.txt b/inc/lang/fo/searchpage.txt new file mode 100644 index 0000000..7b519f2 --- /dev/null +++ b/inc/lang/fo/searchpage.txt @@ -0,0 +1,3 @@ +====== Leiting ====== + +Tú kanst síggja úrslitini av tíni leiting niðanfyri. @CREATEPAGEINFO@ diff --git a/inc/lang/fo/showrev.txt b/inc/lang/fo/showrev.txt new file mode 100644 index 0000000..515f80a --- /dev/null +++ b/inc/lang/fo/showrev.txt @@ -0,0 +1,2 @@ +**Hetta er ein gomul útgáva av skjalinum!** +---- diff --git a/inc/lang/fo/stopwords.txt b/inc/lang/fo/stopwords.txt new file mode 100644 index 0000000..44effc4 --- /dev/null +++ b/inc/lang/fo/stopwords.txt @@ -0,0 +1,88 @@ +# 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 +www diff --git a/inc/lang/fo/subscr_digest.txt b/inc/lang/fo/subscr_digest.txt new file mode 100644 index 0000000..ff76e53 --- /dev/null +++ b/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/inc/lang/fo/updateprofile.txt b/inc/lang/fo/updateprofile.txt new file mode 100644 index 0000000..10ee40d --- /dev/null +++ b/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/inc/lang/fr/admin.txt b/inc/lang/fr/admin.txt new file mode 100644 index 0000000..eeeb231 --- /dev/null +++ b/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/inc/lang/fr/adminplugins.txt b/inc/lang/fr/adminplugins.txt new file mode 100644 index 0000000..36c84a1 --- /dev/null +++ b/inc/lang/fr/adminplugins.txt @@ -0,0 +1 @@ +===== Extensions supplémentaires ===== \ No newline at end of file diff --git a/inc/lang/fr/backlinks.txt b/inc/lang/fr/backlinks.txt new file mode 100644 index 0000000..4013f25 --- /dev/null +++ b/inc/lang/fr/backlinks.txt @@ -0,0 +1,3 @@ +====== Pages pointant sur la page en cours ====== + +Ceci est la liste des pages qui semblent pointer sur la page actuelle. diff --git a/inc/lang/fr/conflict.txt b/inc/lang/fr/conflict.txt new file mode 100644 index 0000000..56db68f --- /dev/null +++ b/inc/lang/fr/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/fr/denied.txt b/inc/lang/fr/denied.txt new file mode 100644 index 0000000..0976c8e --- /dev/null +++ b/inc/lang/fr/denied.txt @@ -0,0 +1,3 @@ +====== Autorisation refusée ====== + +Désolé, vous n'avez pas suffisamment d'autorisations pour poursuivre. diff --git a/inc/lang/fr/diff.txt b/inc/lang/fr/diff.txt new file mode 100644 index 0000000..c758142 --- /dev/null +++ b/inc/lang/fr/diff.txt @@ -0,0 +1,3 @@ +====== Différences ====== + +Ci-dessous, les différences entre deux révisions de la page. \ No newline at end of file diff --git a/inc/lang/fr/draft.txt b/inc/lang/fr/draft.txt new file mode 100644 index 0000000..2af8404 --- /dev/null +++ b/inc/lang/fr/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/fr/edit.txt b/inc/lang/fr/edit.txt new file mode 100644 index 0000000..fa84818 --- /dev/null +++ b/inc/lang/fr/edit.txt @@ -0,0 +1 @@ +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/inc/lang/fr/editrev.txt b/inc/lang/fr/editrev.txt new file mode 100644 index 0000000..d3fa366 --- /dev/null +++ b/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/inc/lang/fr/index.txt b/inc/lang/fr/index.txt new file mode 100644 index 0000000..e31883a --- /dev/null +++ b/inc/lang/fr/index.txt @@ -0,0 +1,3 @@ +====== Plan du site ====== + +Voici un plan du site de toutes les pages disponibles, triées par [[doku>fr:namespaces|catégories]]. diff --git a/inc/lang/fr/install.html b/inc/lang/fr/install.html new file mode 100644 index 0000000..a13a5ac --- /dev/null +++ b/inc/lang/fr/install.html @@ -0,0 +1,32 @@ +

    Cette page vous assiste dans l'installation et la configuration +de DokuWiki. Pour plus d'informations +sur cet installateur, reportez-vous à sa page de documentation.

    + +

    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 doit +avoir accès en écriture aux différents dossiers qui contiennent ces +fichiers. Cet installateur n'est pas capable de modifier les +autorisations sur les dossiers. Cette opération doit-être effectuée +directement depuis votre ligne de commande shell, ou, si vous êtes +hébergé, via FTP ou votre panneau de contrôle (par exemple +cPanel, Plesk, ...).

    + +

    Cet installateur va paramétrer votre instance de DokuWiki pour +utiliser des listes de contrôle d'accès +(ACL). Ces ACL permettront +à leur tour la connexion avec un identifiant administrateur ayant +accès au menu d'administration pour ajouter des extensions, gérer +les utilisateurs, gérer les accès aux pages du wiki et modifier les +paramètres de configuration. Ceci n'est pas nécessaire pour que +DokuWiki fonctionne, cependant, cela le rendra plus facile à +administrer.

    + +

    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 instructions d'installation +et les paramètres de +configuration.

    diff --git a/inc/lang/fr/jquery.ui.datepicker.js b/inc/lang/fr/jquery.ui.datepicker.js new file mode 100644 index 0000000..42b582b --- /dev/null +++ b/inc/lang/fr/jquery.ui.datepicker.js @@ -0,0 +1,42 @@ +/* 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 */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/fr/lang.php b/inc/lang/fr/lang.php new file mode 100644 index 0000000..9a9c4a3 --- /dev/null +++ b/inc/lang/fr/lang.php @@ -0,0 +1,408 @@ + + * @author Jérémy Just + * @author Olivier Humbert + * @author Philippe Verbeke + * @author Nicolas Friedli + * @author Pierre Henriot + * @author PaliPalo + * @author Laurent Ponthieu + * @author Damien Regad + * @author Michael Bohn + * @author Sébastien Bauer + * @author Antoine Fixary + * @author cumulus + * @author Gwenn Gueguen + * @author Guy Brand + * @author Fabien Chabreuil + * @author Stéphane Chamberland + * @author Delassaux Julien + * @author Maurice A. LeBlanc + * @author stephane.gully + * @author Guillaume Turri + * @author Erik Pedersen + * @author olivier duperray + * @author Vincent Feltz + * @author Philippe Bajoit + * @author Florian Gaub + * @author Samuel Dorsaz + * @author Johan Guilbaud + * @author Yannick Aure + * @author Olivier DUVAL + * @author Anael Mobilia + * @author Bruno Veilleux + * @author Emmanuel + * @author Jérôme Brandt + * @author Wild + * @author ggallon + * @author David VANTYGHEM + * @author Caillot + * @author YoBoY + * @author james + * @author Pietroni + * @author Floriang + * @author Eric + */ +$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'] = 'Nom d\'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 complet'; +$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['js']['data_insecure'] = 'ATTENTION : votre dossier de données ne semble pas correctement sécurisé. Veuillez lire Sécurité de l\'accès web (en français) ou Web Access Security in DokuWiki (en anglais).'; +$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'] = 'N\'importe quelle 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 pas pu être créé.'; +$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.
    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['proftokenlegend'] = 'Jeton d\'authentification'; +$lang['proftokengenerate'] = 'Réinitialiser le jeton'; +$lang['proftokeninfo'] = 'Le jeton d\'authentification permet à des applications tierces de se connecter et d\'agir en votre nom. Le réinitialiser invalide le précédent jeton et déconnecte toutes les applications qui l\'utilisent.'; +$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 vient d\'être envoyé 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['allowedmime'] = 'Liste des extensions de fichier autorisées'; +$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 est ignoré.'; +$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 & drop)'; +$lang['mediaextchange'] = 'Extension du fichier modifiée de .%s en .%s !'; +$lang['reference'] = 'Utilisé sur'; +$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'] = 'de'; +$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['unknowndate'] = 'Date inconnue'; +$lang['noflash'] = 'L\'extension Adobe Flash 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 à %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 à %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 instructions d\'installation de DokuWiki'; +$lang['i_funcna'] = 'La fonction PHP %s n\'est pas disponible. Peut-être que votre hébergeur web l\'a désactivée ?'; +$lang['i_disabled'] = 'Elle a été désactivée par votre hébergeur'; +$lang['i_funcnmail'] = 'Note : La fonction PHP mail n\'est pas disponible. %s Si vous ne pouvez pas l\'activer, vous pourriez installer le greffon smtp.'; +$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_urandom'] = 'DokuWiki ne peut créer de nombres cryptographiquement sûrs pour les cookies. Vous voudrez peut-être vérifier que le réglage open_basedir dans php.ini permet l\'accès à /dev/urandom.'; +$lang['i_permfail'] = '%s n\'est pas accessible en écriture pour DokuWiki. Vous devez corriger les autorisations de ce dossier !'; +$lang['i_confexists'] = '%s existe déjà'; +$lang['i_writeerr'] = 'Impossible de créer %s. Vous devez vérifier les autorisations des dossiers/fichiers et créer le fichier manuellement.'; +$lang['i_badhash'] = 'dokuwiki.php non reconnu ou modifié (hash=%s)'; +$lang['i_badval'] = '%s - 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 votre nouveau DokuWiki.'; +$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 votre nouveau DokuWiki.'; +$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 %s. Vous pouvez également afficher les derniers changements sur l\'ensemble du wiki.'; +$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['email_fail'] = 'La fonction PHP mail() est absente ou désactivée. Le message suivant n’est pas parti :'; +$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 %s.'; +$lang['unable_to_parse_date'] = 'Impossible d\'analyser le paramètre temporel at "%s".'; +$lang['email_signature_text'] = 'Courriel envoyé par DokuWiki depuis +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = 'Fichier journal trop grand. Lignes précédentes sautées !'; +$lang['log_file_failed_to_open'] = 'Impossible d\'ouvrir le fichier journal.'; +$lang['log_file_failed_to_read'] = 'Une erreur s\'est produite lors de la lecture du journal.'; diff --git a/inc/lang/fr/locked.txt b/inc/lang/fr/locked.txt new file mode 100644 index 0000000..fe88b57 --- /dev/null +++ b/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/inc/lang/fr/login.txt b/inc/lang/fr/login.txt new file mode 100644 index 0000000..c8d40c8 --- /dev/null +++ b/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/inc/lang/fr/mailtext.txt b/inc/lang/fr/mailtext.txt new file mode 100644 index 0000000..a4aa8d8 --- /dev/null +++ b/inc/lang/fr/mailtext.txt @@ -0,0 +1,13 @@ +Une page dans votre wiki a changé ou été 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/inc/lang/fr/mailwrap.html b/inc/lang/fr/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/fr/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/fr/newpage.txt b/inc/lang/fr/newpage.txt new file mode 100644 index 0000000..667061a --- /dev/null +++ b/inc/lang/fr/newpage.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/fr/norev.txt b/inc/lang/fr/norev.txt new file mode 100644 index 0000000..822efff --- /dev/null +++ b/inc/lang/fr/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/fr/onceexisted.txt b/inc/lang/fr/onceexisted.txt new file mode 100644 index 0000000..76f30b6 --- /dev/null +++ b/inc/lang/fr/onceexisted.txt @@ -0,0 +1,3 @@ +======= Cette page n'existe plus ====== + +Vous avez suivi un lien vers une page qui n'existe plus. Vous pouvez afficher la liste des **anciennes revisions** pour voir quand et pourquoi la page a été supprimée, pour accéder à ses anciennes révisions ou pour la restaurer. diff --git a/inc/lang/fr/password.txt b/inc/lang/fr/password.txt new file mode 100644 index 0000000..5823724 --- /dev/null +++ b/inc/lang/fr/password.txt @@ -0,0 +1,7 @@ +Bonjour @FULLNAME@ ! + +Voici vos identifiants pour @TITLE@ sur +@DOKUWIKIURL@ + +Utilisateur : @LOGIN@ +Mot de passe : @PASSWORD@ diff --git a/inc/lang/fr/preview.txt b/inc/lang/fr/preview.txt new file mode 100644 index 0000000..00f09e2 --- /dev/null +++ b/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/inc/lang/fr/pwconfirm.txt b/inc/lang/fr/pwconfirm.txt new file mode 100644 index 0000000..18434eb --- /dev/null +++ b/inc/lang/fr/pwconfirm.txt @@ -0,0 +1,12 @@ +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, veuillez suivre +le lien ci-dessous. + +@CONFIRM@ diff --git a/inc/lang/fr/read.txt b/inc/lang/fr/read.txt new file mode 100644 index 0000000..c818445 --- /dev/null +++ b/inc/lang/fr/read.txt @@ -0,0 +1 @@ +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/inc/lang/fr/recent.txt b/inc/lang/fr/recent.txt new file mode 100644 index 0000000..77ec119 --- /dev/null +++ b/inc/lang/fr/recent.txt @@ -0,0 +1,3 @@ +====== Derniers changements ====== + +Voici la liste des pages modifiées récemment : diff --git a/inc/lang/fr/register.txt b/inc/lang/fr/register.txt new file mode 100644 index 0000000..213664c --- /dev/null +++ b/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** - si vous n'avez pas à saisir un mot de passe ici, il vous sera expédié par courriel à cette adresse. Le nom d'utilisateur doit être un [[doku>fr:pagename|nom de page]] valide. diff --git a/inc/lang/fr/registermail.txt b/inc/lang/fr/registermail.txt new file mode 100644 index 0000000..bbf7ed3 --- /dev/null +++ b/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 : @BROWSER@ +Adresse IP : @IPADDRESS@ +Nom d'hôte : @HOSTNAME@ diff --git a/inc/lang/fr/resendpwd.txt b/inc/lang/fr/resendpwd.txt new file mode 100644 index 0000000..d0cef5d --- /dev/null +++ b/inc/lang/fr/resendpwd.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/fr/resetpwd.txt b/inc/lang/fr/resetpwd.txt new file mode 100644 index 0000000..105625d --- /dev/null +++ b/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. diff --git a/inc/lang/fr/revisions.txt b/inc/lang/fr/revisions.txt new file mode 100644 index 0000000..7f45db5 --- /dev/null +++ b/inc/lang/fr/revisions.txt @@ -0,0 +1,3 @@ +====== Anciennes révisions ====== + +Voici les anciennes révisions de la page en cours. Pour les comparer, sélectionnez-les avec les cases à options. Pour revenir à une ancienne révision, affichez-la en cliquant sur son nom, puis cliquez sur le bouton « Modifier cette page » et enregistrez-la. \ No newline at end of file diff --git a/inc/lang/fr/searchpage.txt b/inc/lang/fr/searchpage.txt new file mode 100644 index 0000000..1301b0c --- /dev/null +++ b/inc/lang/fr/searchpage.txt @@ -0,0 +1,3 @@ +====== Recherche ====== + +Voici les résultats de votre recherche. @CREATEPAGEINFO@ diff --git a/inc/lang/fr/showrev.txt b/inc/lang/fr/showrev.txt new file mode 100644 index 0000000..2e36199 --- /dev/null +++ b/inc/lang/fr/showrev.txt @@ -0,0 +1,2 @@ +**Ceci est une ancienne révision du document !** +---- diff --git a/inc/lang/fr/stopwords.txt b/inc/lang/fr/stopwords.txt new file mode 100644 index 0000000..d86d769 --- /dev/null +++ b/inc/lang/fr/stopwords.txt @@ -0,0 +1,113 @@ +# 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 +www +ça +étaient +état +étions +été +être diff --git a/inc/lang/fr/subscr_digest.txt b/inc/lang/fr/subscr_digest.txt new file mode 100644 index 0000000..fa64b22 --- /dev/null +++ b/inc/lang/fr/subscr_digest.txt @@ -0,0 +1,16 @@ +Bonjour, + +La page « @PAGE@ » dans le wiki « @TITLE@ » a changé. +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/inc/lang/fr/subscr_form.txt b/inc/lang/fr/subscr_form.txt new file mode 100644 index 0000000..f14832e --- /dev/null +++ b/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/inc/lang/fr/subscr_list.txt b/inc/lang/fr/subscr_list.txt new file mode 100644 index 0000000..f34fa52 --- /dev/null +++ b/inc/lang/fr/subscr_list.txt @@ -0,0 +1,13 @@ +Bonjour, + +Des pages de la catégorie « @PAGE@ » du wiki « @TITLE@ » ont +changé. 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/inc/lang/fr/subscr_single.txt b/inc/lang/fr/subscr_single.txt new file mode 100644 index 0000000..d101fab --- /dev/null +++ b/inc/lang/fr/subscr_single.txt @@ -0,0 +1,19 @@ +Bonjour, + +La page « @PAGE@ » dans le wiki « @TITLE@ » a changé. +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/inc/lang/fr/updateprofile.txt b/inc/lang/fr/updateprofile.txt new file mode 100644 index 0000000..326a989 --- /dev/null +++ b/inc/lang/fr/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/fr/uploadmail.txt b/inc/lang/fr/uploadmail.txt new file mode 100644 index 0000000..37273d9 --- /dev/null +++ b/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/inc/lang/fy/admin.txt b/inc/lang/fy/admin.txt new file mode 100644 index 0000000..e99bdea --- /dev/null +++ b/inc/lang/fy/admin.txt @@ -0,0 +1,3 @@ +====== Administraasje ====== + +Hjirûnder kinst in list fyne fan beskikbare administratieve taken yn DokuWiki \ No newline at end of file diff --git a/inc/lang/gl/admin.txt b/inc/lang/gl/admin.txt new file mode 100644 index 0000000..25cb329 --- /dev/null +++ b/inc/lang/gl/admin.txt @@ -0,0 +1,3 @@ +====== Administración ====== + +De seguido podes atopar unha lista de tarefas administrativas dispoñíbeis no DokuWiki. diff --git a/inc/lang/gl/adminplugins.txt b/inc/lang/gl/adminplugins.txt new file mode 100644 index 0000000..e52172e --- /dev/null +++ b/inc/lang/gl/adminplugins.txt @@ -0,0 +1 @@ +===== Extensións adicionais ===== \ No newline at end of file diff --git a/inc/lang/gl/backlinks.txt b/inc/lang/gl/backlinks.txt new file mode 100644 index 0000000..10ed0d5 --- /dev/null +++ b/inc/lang/gl/backlinks.txt @@ -0,0 +1,3 @@ +====== Ligazóns entrantes ====== + +Isto é unha listaxe de páxinas que semellan ligar coa páxina actual. diff --git a/inc/lang/gl/conflict.txt b/inc/lang/gl/conflict.txt new file mode 100644 index 0000000..f3e9858 --- /dev/null +++ b/inc/lang/gl/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/gl/denied.txt b/inc/lang/gl/denied.txt new file mode 100644 index 0000000..df5b3d2 --- /dev/null +++ b/inc/lang/gl/denied.txt @@ -0,0 +1,3 @@ +====== Permiso Denegado ====== + +Sentímolo, mais non tes permisos de abondo para continuares. diff --git a/inc/lang/gl/diff.txt b/inc/lang/gl/diff.txt new file mode 100644 index 0000000..087d880 --- /dev/null +++ b/inc/lang/gl/diff.txt @@ -0,0 +1,3 @@ +====== Diferenzas ====== + +Isto amosa as diferenzas entre a revisión seleccionada e a versión actual da páxina. diff --git a/inc/lang/gl/draft.txt b/inc/lang/gl/draft.txt new file mode 100644 index 0000000..c360e14 --- /dev/null +++ b/inc/lang/gl/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/gl/edit.txt b/inc/lang/gl/edit.txt new file mode 100644 index 0000000..ff7b6f1 --- /dev/null +++ b/inc/lang/gl/edit.txt @@ -0,0 +1 @@ +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/inc/lang/gl/editrev.txt b/inc/lang/gl/editrev.txt new file mode 100644 index 0000000..d6a0490 --- /dev/null +++ b/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/inc/lang/gl/index.txt b/inc/lang/gl/index.txt new file mode 100644 index 0000000..c7f81e0 --- /dev/null +++ b/inc/lang/gl/index.txt @@ -0,0 +1,3 @@ +====== Índice ====== + +Isto é un índice de todas as páxinas dispoñíbeis, ordenadas por [[doku>namespaces|nomes de espazo]]. diff --git a/inc/lang/gl/install.html b/inc/lang/gl/install.html new file mode 100644 index 0000000..e422c74 --- /dev/null +++ b/inc/lang/gl/install.html @@ -0,0 +1,7 @@ +

    Esta páxina é unha axuda na primeira vez que se instala e configura o Dokuwiki. Se queres máis información verbo deste instalador está dispoñible na súa propia páxina de documentación.

    + +

    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 precisa 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).

    + +

    Este instalador configurará o teu DokuWiki para o uso da ACL, 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.

    + +

    Os usuarios expertos ou con requisitos especiais de configuración poden visitar as seguintes ligazóns para obter pormenores relativos ás instruccións de instalación e á configuración.

    diff --git a/inc/lang/gl/jquery.ui.datepicker.js b/inc/lang/gl/jquery.ui.datepicker.js new file mode 100644 index 0000000..27abb02 --- /dev/null +++ b/inc/lang/gl/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Galician localization for 'UI date picker' jQuery extension. */ +/* Translated by Jorge Barreiro . */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.gl = { + closeText: "Pechar", + prevText: "Ant", + nextText: "Seg", + 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/inc/lang/gl/lang.php b/inc/lang/gl/lang.php new file mode 100644 index 0000000..a88c0d7 --- /dev/null +++ b/inc/lang/gl/lang.php @@ -0,0 +1,318 @@ + + * @author Oscar M. Lage + * @author Rodrigo Rega + */ +$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 Extensión Adobe Flash 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 + instruccións completas de instalación do Dokuwiki'; +$lang['i_funcna'] = 'A función %s 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 %s do PHP é inferior á %s precisa. Debes actualizar a túa instalación do PHP.'; +$lang['i_permfail'] = '%s non é escribíbel polo DokuWiki. Debes corrixir a configuración de permisos deste directorio!'; +$lang['i_confexists'] = '%s xa existe'; +$lang['i_writeerr'] = 'Non se puido crear %s. 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=%s)'; +$lang['i_badval'] = '%s - ilegal ou valor baleiro'; +$lang['i_success'] = 'A configuración rematou correctamente. Agora podes eliminar o arquivo install.php. Continúa deica o + teu novo DokuWiki.'; +$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 o teu novo DokuWiki.'; +$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 %s. Tamén podes ver os trocos recentes no Wiki enteiro.'; +$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/inc/lang/gl/locked.txt b/inc/lang/gl/locked.txt new file mode 100644 index 0000000..90f9ab0 --- /dev/null +++ b/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/inc/lang/gl/login.txt b/inc/lang/gl/login.txt new file mode 100644 index 0000000..c6c46b5 --- /dev/null +++ b/inc/lang/gl/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/gl/mailtext.txt b/inc/lang/gl/mailtext.txt new file mode 100644 index 0000000..bf102e1 --- /dev/null +++ b/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/inc/lang/gl/mailwrap.html b/inc/lang/gl/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/gl/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/gl/newpage.txt b/inc/lang/gl/newpage.txt new file mode 100644 index 0000000..10c84aa --- /dev/null +++ b/inc/lang/gl/newpage.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/gl/norev.txt b/inc/lang/gl/norev.txt new file mode 100644 index 0000000..eed1118 --- /dev/null +++ b/inc/lang/gl/norev.txt @@ -0,0 +1,3 @@ +======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/inc/lang/gl/password.txt b/inc/lang/gl/password.txt new file mode 100644 index 0000000..36f8562 --- /dev/null +++ b/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/inc/lang/gl/preview.txt b/inc/lang/gl/preview.txt new file mode 100644 index 0000000..6d4a283 --- /dev/null +++ b/inc/lang/gl/preview.txt @@ -0,0 +1,3 @@ +====== Previsualización ====== + +Isto é unha previsualización de como aparecerá o teu texto. **Lembra: Non está gardado aínda**! diff --git a/inc/lang/gl/pwconfirm.txt b/inc/lang/gl/pwconfirm.txt new file mode 100644 index 0000000..c8005bf --- /dev/null +++ b/inc/lang/gl/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/gl/read.txt b/inc/lang/gl/read.txt new file mode 100644 index 0000000..a4ec3a5 --- /dev/null +++ b/inc/lang/gl/read.txt @@ -0,0 +1 @@ +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/inc/lang/gl/recent.txt b/inc/lang/gl/recent.txt new file mode 100644 index 0000000..1cd6c3b --- /dev/null +++ b/inc/lang/gl/recent.txt @@ -0,0 +1,3 @@ +====== Trocos Recentes ====== + +As seguintes páxinas foron mudadas recentemente: diff --git a/inc/lang/gl/register.txt b/inc/lang/gl/register.txt new file mode 100644 index 0000000..99422dd --- /dev/null +++ b/inc/lang/gl/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/gl/registermail.txt b/inc/lang/gl/registermail.txt new file mode 100644 index 0000000..aad8481 --- /dev/null +++ b/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/inc/lang/gl/resendpwd.txt b/inc/lang/gl/resendpwd.txt new file mode 100644 index 0000000..0ee2d6c --- /dev/null +++ b/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/inc/lang/gl/resetpwd.txt b/inc/lang/gl/resetpwd.txt new file mode 100644 index 0000000..558f9e5 --- /dev/null +++ b/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. diff --git a/inc/lang/gl/revisions.txt b/inc/lang/gl/revisions.txt new file mode 100644 index 0000000..488cda7 --- /dev/null +++ b/inc/lang/gl/revisions.txt @@ -0,0 +1,3 @@ +======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/inc/lang/gl/searchpage.txt b/inc/lang/gl/searchpage.txt new file mode 100644 index 0000000..053db98 --- /dev/null +++ b/inc/lang/gl/searchpage.txt @@ -0,0 +1,3 @@ +====== Procura ====== + +Podes atopar os resultados da túa procura a continuación. @CREATEPAGEINFO@ diff --git a/inc/lang/gl/showrev.txt b/inc/lang/gl/showrev.txt new file mode 100644 index 0000000..88fb0c3 --- /dev/null +++ b/inc/lang/gl/showrev.txt @@ -0,0 +1,2 @@ +**Esta é unha revisión antiga do documento!** +---- diff --git a/inc/lang/gl/stopwords.txt b/inc/lang/gl/stopwords.txt new file mode 100644 index 0000000..3813aaa --- /dev/null +++ b/inc/lang/gl/stopwords.txt @@ -0,0 +1,693 @@ +# 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 +www +xeito +xeitos +xente +xerais +xeral +xunto +zona diff --git a/inc/lang/gl/subscr_digest.txt b/inc/lang/gl/subscr_digest.txt new file mode 100644 index 0000000..275a7d5 --- /dev/null +++ b/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/inc/lang/gl/subscr_form.txt b/inc/lang/gl/subscr_form.txt new file mode 100644 index 0000000..e8a6fe6 --- /dev/null +++ b/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/inc/lang/gl/subscr_list.txt b/inc/lang/gl/subscr_list.txt new file mode 100644 index 0000000..8ee1a7a --- /dev/null +++ b/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/inc/lang/gl/subscr_single.txt b/inc/lang/gl/subscr_single.txt new file mode 100644 index 0000000..b30c817 --- /dev/null +++ b/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/inc/lang/gl/updateprofile.txt b/inc/lang/gl/updateprofile.txt new file mode 100644 index 0000000..adc8e24 --- /dev/null +++ b/inc/lang/gl/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/gl/uploadmail.txt b/inc/lang/gl/uploadmail.txt new file mode 100644 index 0000000..c01bc7d --- /dev/null +++ b/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/inc/lang/he/admin.txt b/inc/lang/he/admin.txt new file mode 100644 index 0000000..6a166d9 --- /dev/null +++ b/inc/lang/he/admin.txt @@ -0,0 +1,3 @@ +====== ניהול ====== + +ניתן למצוא מטה רשימה של משימות ניהול זמינות ב-DokuWiki. diff --git a/inc/lang/he/adminplugins.txt b/inc/lang/he/adminplugins.txt new file mode 100644 index 0000000..a7a6471 --- /dev/null +++ b/inc/lang/he/adminplugins.txt @@ -0,0 +1 @@ +===== תוספים נוספים ===== \ No newline at end of file diff --git a/inc/lang/he/backlinks.txt b/inc/lang/he/backlinks.txt new file mode 100644 index 0000000..dfcdd22 --- /dev/null +++ b/inc/lang/he/backlinks.txt @@ -0,0 +1,3 @@ +====== קישורים לאחור ====== + +זוהי רשימת דפים אשר נראה כי הם מקשרים לדף ממנו הגעת. diff --git a/inc/lang/he/conflict.txt b/inc/lang/he/conflict.txt new file mode 100644 index 0000000..8b46d18 --- /dev/null +++ b/inc/lang/he/conflict.txt @@ -0,0 +1,5 @@ +====== קיימת גרסה עדכנית יותר של הקובץ ====== + +ישנה גרסה עדכנית יותר של המסמך. מצב כזה קורה כאשר משתמש אחר שינה את המסמך בזמן שערכת אותו. + +מומלץ לעיין בהבדלים המופיעים להלן ולאחר מכן להחליט איזו גרסה כדאי לשמור. לחיצה על הכפתור "שמירה" תשמור את הגרסה שערכת. לחיצה על הכפתור "ביטול" תשמור את הגרסה הקיימת. diff --git a/inc/lang/he/denied.txt b/inc/lang/he/denied.txt new file mode 100644 index 0000000..a64b1f2 --- /dev/null +++ b/inc/lang/he/denied.txt @@ -0,0 +1,3 @@ +====== הרשאה נדחתה ====== + +אנו מצטערים אך אין לך הרשאות מתאימות כדי להמשיך. diff --git a/inc/lang/he/diff.txt b/inc/lang/he/diff.txt new file mode 100644 index 0000000..c779086 --- /dev/null +++ b/inc/lang/he/diff.txt @@ -0,0 +1,3 @@ +====== הבדלים ====== + +כאן מוצגים ההבדלים בין הגרסה שנבחרה והגרסה הנוכחית של הדף. diff --git a/inc/lang/he/draft.txt b/inc/lang/he/draft.txt new file mode 100644 index 0000000..5699fe8 --- /dev/null +++ b/inc/lang/he/draft.txt @@ -0,0 +1,5 @@ +====== נמצא קובץ טיוטה ====== + +העריכה האחרונה שבוצעה לדף זה לא הושלמה כראוי. DokuWiki שמר באופן אוטומטי טיוטה של העבודה ובאפשרותך להשתמש בה כדי להמשיך את העריכה. ניתן לראות להלן את הנתונים שנשמרו מהפעם הקודמת. + +באפשרותך לבחור ב//שחזור הטיוטה// של אותה עריכה //מחיקת הטיוטה// או //ביטול// העריכה כליל. diff --git a/inc/lang/he/edit.txt b/inc/lang/he/edit.txt new file mode 100644 index 0000000..74b3cef --- /dev/null +++ b/inc/lang/he/edit.txt @@ -0,0 +1 @@ +עריכת הדף ולחיצה על הלחצן "שמירה" תעדכן את תוכנו. מומלץ לעיין בדף ה[[wiki:syntax|תחביר]] כדי להכיר את כללי תחביר הוויקי. נא לערוך את הדף רק אם הדבר נעשה כדי **לשפר** אותו. אם העריכה היא לצורך התנסות מומלץ לבקר ב[[playground:playground|ארגז החול]]. diff --git a/inc/lang/he/editrev.txt b/inc/lang/he/editrev.txt new file mode 100644 index 0000000..ad5121f --- /dev/null +++ b/inc/lang/he/editrev.txt @@ -0,0 +1,2 @@ +**הדף שנפתח הוא גרסה ישנה של המסמך!** לחיצה על הלחצן "שמירה" תשחזר את המסמך לגרסה המוצגת כעת. +---- diff --git a/inc/lang/he/index.txt b/inc/lang/he/index.txt new file mode 100644 index 0000000..f98e1f4 --- /dev/null +++ b/inc/lang/he/index.txt @@ -0,0 +1,3 @@ +====== מפת אתר ====== + +זהו קובץ מפת אתר הנמצא מעל לכל הדפים המאורגנים ב[[doku>namespace|מתחמים]]. diff --git a/inc/lang/he/install.html b/inc/lang/he/install.html new file mode 100644 index 0000000..66e3844 --- /dev/null +++ b/inc/lang/he/install.html @@ -0,0 +1,7 @@ +

    דף זה מסייע בהליכי ההתקנה וההגדרה הראשוניים של Dokuwiki. מידע נוסף על תכנית התקנה זו זמין בדף התיעוד שלו.

    + +

    DokuWiki עושה שימוש בקבצים רגילים לשמירת דפי ויקי ומידע נוסף הקשור לדפים אלו (לדוגמה: תמונות, רשימות חיפוש, גרסאות קודמות וכו׳). לצורך תפקוד תקין DokuWiki חייב גישה לכתיבה לתיקיות המכילות קבצים אלו. תכנית התקנה זו אינה יכולה להגדיר הרשאות לתיקיות. פעולה זו צריכה בד״כ להתבצע ישירות משורת הפקודה או במקרה שנעשה שימוש בשרת מארח דרך FTP או מנשק הניהול של המארח (cPanell לדוגמה).

    + +

    מתקין זה יגדיר את תצורת ה־ACL ב-DokuWiki שלך , זה בתורו מאפשר גישת מנהל לתפריט הניהול של DokuWiki כדי להתקין הרחבות, לנהל משתמשים, לנהל גישות לדפי ויקי ושינויים בהגדרות התצורה. אין הוא הכרחי לתפקוד DokuWiki אך הוא יהפוך את Dokuwiki לפשוט יותר לניהול.

    + +

    על משתמשים מנוסים או כאלו עם דרישות מיוחדות להתקנה להשתמש בקישורים אלו לפרטים בנוגע להוראות התקנה ו הגדרות תצורה.

    diff --git a/inc/lang/he/jquery.ui.datepicker.js b/inc/lang/he/jquery.ui.datepicker.js new file mode 100644 index 0000000..fbe3c40 --- /dev/null +++ b/inc/lang/he/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Hebrew initialisation for the UI Datepicker extension. */ +/* Written by Amir Hardon (ahardon at gmail dot com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.he = { + closeText: "סגור", + prevText: "הקודם", + nextText: "הבא", + 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/inc/lang/he/lang.php b/inc/lang/he/lang.php new file mode 100644 index 0000000..95619e7 --- /dev/null +++ b/inc/lang/he/lang.php @@ -0,0 +1,353 @@ + + * @author גיא שפר + * @author Denis Simakov + * @author Dotan Kamber + * @author Moshe Kaplan + * @author Yaron Yogev + * @author Yaron Shahrabani + * @author Roy Zahor + * @author alex + * @author matt carroll + * @author tomer + * @author itsho + * @author Menashe Tomer + * @author sagi + */ +$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'] = 'ברצוני להסיר את החשבון שלי מוויקי זה.
    לא ניתן לבטל פעולה זו.'; +$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'] = 'תוסף פלאש לדפדפן נדרש כדי להציג תוכן זה.'; +$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 חדשה שלא עברה כל שינוי. + עליך לחלץ שנית את הקבצים מהחבילה שהורדה או להיעזר בדף + Dokuwiki installation instructions'; +$lang['i_funcna'] = 'פונקציית ה-PHP‏ %s אינה זמינה. יתכן כי מארח האתר חסם אותה מסיבה כלשהי?'; +$lang['i_phpver'] = 'גרסת PHP שלך %s נמוכה מ %s הצורך. אתה צריך לשדרג PHP שלך להתקין.'; +$lang['i_mbfuncoverload'] = 'יש לבטל את mbstring.func_overload בphp.ini בכדי להריץ את DokuWiki'; +$lang['i_permfail'] = '%s אינה ניתנת לכתיבה על ידי DokuWiki. עליך לשנות הרשאות תיקייה זו!'; +$lang['i_confexists'] = '%s כבר קיים'; +$lang['i_writeerr'] = 'אין אפשרות ליצור את %s. נא לבדוק את הרשאות הקובץ/תיקייה וליצור את הקובץ ידנית.'; +$lang['i_badhash'] = 'הקובץ Dokuwiki.php אינו מזוהה או שעבר שינויים (hash=%s)'; +$lang['i_badval'] = '%s - הערך אינו חוקי או ריק'; +$lang['i_success'] = 'תהליך ההגדרה הסתיים בהצלחה. כעת ניתן למחוק את הקובץ install.php ולהמשיך אל ה־DokuWiki החדש שלך.'; +$lang['i_failure'] = 'מספר שגיאות אירעו בעת כתיבת קובצי התצורה. יתכן כי יהיה צורך לתקנם ידנית לפני שניתן יהיה להשתמש ב־DokuWiki החדש שלך.'; +$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'] = 'נכון לעכשיו מתנהל על ידיך מעקב אחר מרחב השם %s. כמו כן, באפשרותך לצפות בשינויים האחרונים בוויקי כולו.'; +$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. העמוד נוצר במקום זאת ב%s.'; +$lang['unable_to_parse_date'] = 'לא ניתן לפענח פרמטר "%s".'; +$lang['email_signature_text'] = 'הודעת דוא״ל זו נוצרה על ידי ה־DokuWiki הזמין בכתובת +@DOKUWIKIURL@'; diff --git a/inc/lang/he/locked.txt b/inc/lang/he/locked.txt new file mode 100644 index 0000000..307874a --- /dev/null +++ b/inc/lang/he/locked.txt @@ -0,0 +1,3 @@ +====== דף נעול ====== + +דף זה נעול כרגע לעריכה על ידי משתמש אחר. עליך להמתין עד שהמשתמש יסיים את העריכה או עד שהנעילה תפוג. diff --git a/inc/lang/he/login.txt b/inc/lang/he/login.txt new file mode 100644 index 0000000..5a575f1 --- /dev/null +++ b/inc/lang/he/login.txt @@ -0,0 +1,3 @@ +====== כניסה ====== + +אינך ברשומות המערכת כרגע! יש להזין את נתוני ההזדהות מטה לכניסה. יש לאפשר עוגיות (cookies) כדי להכנס. diff --git a/inc/lang/he/mailtext.txt b/inc/lang/he/mailtext.txt new file mode 100644 index 0000000..f33760e --- /dev/null +++ b/inc/lang/he/mailtext.txt @@ -0,0 +1,12 @@ +דף בDokuWiki נוסף או שונה. להלן הפרטים: + +תאריך : @DATE@ +דפדפן : @BROWSER@ +כתובת ה־IP‏ : @IPADDRESS@ +שם המארח : @HOSTNAME@ +המהדורה הישנה: @OLDPAGE@ +המהדורה החדשה: @NEWPAGE@ +תקציר העריכה: @SUMMARY@ +משתמש : @USER@ + +@DIFF@ diff --git a/inc/lang/he/newpage.txt b/inc/lang/he/newpage.txt new file mode 100644 index 0000000..68a5388 --- /dev/null +++ b/inc/lang/he/newpage.txt @@ -0,0 +1,3 @@ +====== דף זה עדיין לא קיים ====== + +הדף אליו הגעת עדיין לא קיים. לחיצה על הכפתור **יצירת דף** תצור אותו. diff --git a/inc/lang/he/norev.txt b/inc/lang/he/norev.txt new file mode 100644 index 0000000..916682f --- /dev/null +++ b/inc/lang/he/norev.txt @@ -0,0 +1,3 @@ +====== גרסה לא קיימת ====== + +הגרסה שהוזנה אינה קיימת. נא להשתמש בכפתור ''גרסאות קודמות'' להצגת רשימת הגרסאות של מסמך זה. diff --git a/inc/lang/he/password.txt b/inc/lang/he/password.txt new file mode 100644 index 0000000..bfa29b6 --- /dev/null +++ b/inc/lang/he/password.txt @@ -0,0 +1,6 @@ +שלום @FULLNAME@! + +הנה נתוני המשתמש שלך עבור @TITLE@ ב־@DOKUWIKIURL@ + +שם כניסה : @LOGIN@ +ססמה : @PASSWORD@ diff --git a/inc/lang/he/preview.txt b/inc/lang/he/preview.txt new file mode 100644 index 0000000..06d0a40 --- /dev/null +++ b/inc/lang/he/preview.txt @@ -0,0 +1,3 @@ +====== תצוגה מקדימה ====== + +זו תצוגה מקדימה של הדף לעתיד. להזכירך: **הדף עדיין לא נשמר**! diff --git a/inc/lang/he/pwconfirm.txt b/inc/lang/he/pwconfirm.txt new file mode 100644 index 0000000..3fa786c --- /dev/null +++ b/inc/lang/he/pwconfirm.txt @@ -0,0 +1,9 @@ +שלום @FULLNAME@! + +מישהו ביקש ססמה חדשה עבור שם הכניסה שלך לוויקי @TITLE@ בכתובת @DOKUWIKIURL@ + +אם לא ביקשת ססמה חדשה באפשרותך פשוט להתעלם מהודעת דוא״ל זו. + +כדי לאשר שהבקשה באמת נשלחה על ידך עליך השתמש בקישור הבא. + +@CONFIRM@ diff --git a/inc/lang/he/read.txt b/inc/lang/he/read.txt new file mode 100644 index 0000000..2d747ba --- /dev/null +++ b/inc/lang/he/read.txt @@ -0,0 +1 @@ +דף זה הוא דף לקריאה בלבד. ניתן לצפות בקוד המקור שלו, אך לא ניתן לערוך אותו. ניתן לפנות למנהל הוויקי אם לדעתך נפלה טעות. diff --git a/inc/lang/he/recent.txt b/inc/lang/he/recent.txt new file mode 100644 index 0000000..0c9bf15 --- /dev/null +++ b/inc/lang/he/recent.txt @@ -0,0 +1,3 @@ +====== שינויים אחרונים ====== + +הדפים הבאים עברו שינויים לאחרונה: diff --git a/inc/lang/he/register.txt b/inc/lang/he/register.txt new file mode 100644 index 0000000..c4dfad7 --- /dev/null +++ b/inc/lang/he/register.txt @@ -0,0 +1,3 @@ +====== הרשמה כמשתמש חדש ====== + +יש למלא את כל המידע להלן כדי ליצור חשבון חדש בוויקי זה. עליך לוודא כי הזנת **כתובת דוא״ל תקפה**- ססמתך החדשה תשלח לכתובת זו. על שם המשתמש להיות [[hdoku>ויקי:שם דף|שם דף]] תקף. diff --git a/inc/lang/he/registermail.txt b/inc/lang/he/registermail.txt new file mode 100644 index 0000000..2216cb3 --- /dev/null +++ b/inc/lang/he/registermail.txt @@ -0,0 +1,10 @@ +משתמש חדש נרשם. להלן הפרטים: + +שם משתמש : @NEWUSER@ +שם מלא : @NEWNAME@ +דוא״ל : @NEWEMAIL@ + +תאריך : @DATE@ +דפדפן : @BROWSER@ +כתובת IP‏ : @IPADDRESS@ +שם המארח : @HOSTNAME@ diff --git a/inc/lang/he/resendpwd.txt b/inc/lang/he/resendpwd.txt new file mode 100644 index 0000000..e885e4d --- /dev/null +++ b/inc/lang/he/resendpwd.txt @@ -0,0 +1,3 @@ +====== שליחת ססמה חדשה ====== + +יש להזין את שם המשתמש בטופס מטה ולבקש ססמה חדשה לחשבון שלך בוויקי זה. הקישור לאימות יישלח לכתובת הדוא״ל באמצעותה נרשמת. diff --git a/inc/lang/he/resetpwd.txt b/inc/lang/he/resetpwd.txt new file mode 100644 index 0000000..d049c6f --- /dev/null +++ b/inc/lang/he/resetpwd.txt @@ -0,0 +1,3 @@ +====== קבע סיסמה חדשה ====== + +אנא הכנס סיסמה חדשה לחשבון שלך בויקי זה. diff --git a/inc/lang/he/revisions.txt b/inc/lang/he/revisions.txt new file mode 100644 index 0000000..6987fbb --- /dev/null +++ b/inc/lang/he/revisions.txt @@ -0,0 +1,3 @@ +====== גרסאות ישנות ====== + +אלה גרסאות מוקדמות יותר של המסמך הנוכחי. כדי לשחזר גרסה מוקדמת יותר יש ללחוץ על הכפתור ''עריכה'' ולשמור את הדף. diff --git a/inc/lang/he/searchpage.txt b/inc/lang/he/searchpage.txt new file mode 100644 index 0000000..51903d9 --- /dev/null +++ b/inc/lang/he/searchpage.txt @@ -0,0 +1,3 @@ +====== חיפוש ====== + +ניתן לראות את תוצאות החיפוש למטה. @CREATEPAGEINFO@ diff --git a/inc/lang/he/showrev.txt b/inc/lang/he/showrev.txt new file mode 100644 index 0000000..2f73550 --- /dev/null +++ b/inc/lang/he/showrev.txt @@ -0,0 +1,2 @@ +**זו גרסה ישנה של המסמך!** לחיצה על כותרת המסמך תציג את גרסתו הנוכחית. +---- diff --git a/inc/lang/he/stopwords.txt b/inc/lang/he/stopwords.txt new file mode 100644 index 0000000..ca85eb2 --- /dev/null +++ b/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/inc/lang/he/subscr_digest.txt b/inc/lang/he/subscr_digest.txt new file mode 100644 index 0000000..5548a70 --- /dev/null +++ b/inc/lang/he/subscr_digest.txt @@ -0,0 +1,16 @@ +שלום! + +הדף @PAGE@ שבאתר הוויקי @TITLE@ השתנה. +להלן השינויים: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +המהדורה הישנה: @OLDPAGE@ +המהדורה החדשה: @NEWPAGE@ + +כדי לבטל את ההתרעות לשינויי העמוד, יש להיכנס לאתר הוויקי בכתובת +@DOKUWIKIURL@ ואז לבקר באגף +@SUBSCRIBE@ +ולבטל את המינוי לשינויים בדף ו/או במרחב השם. diff --git a/inc/lang/he/subscr_single.txt b/inc/lang/he/subscr_single.txt new file mode 100644 index 0000000..c2ddb72 --- /dev/null +++ b/inc/lang/he/subscr_single.txt @@ -0,0 +1,18 @@ +שלום! + +הדף @PAGE@ באתר הוויקי @TITLE@ השתנה. + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +תאריך : @DATE@ +משתמש : @USER@ +תקציר העריכה: @SUMMARY@ +המהדורה הישנה: @OLDPAGE@ +המהדורה החדשה: @NEWPAGE@ + +לביטול התרעות בנוגע לעמוד, יש להיכנס לאתר הוויקי בכתובת +@DOKUWIKIURL@ ואז לבקר בדף +@SUBSCRIBE@ +ולבטל את המינוי לקבלת שינויים בדף ו/או במרחב השם. diff --git a/inc/lang/he/updateprofile.txt b/inc/lang/he/updateprofile.txt new file mode 100644 index 0000000..6b680a6 --- /dev/null +++ b/inc/lang/he/updateprofile.txt @@ -0,0 +1,3 @@ +====== עידכון פרטי חשבונך ====== + +אין צורך למלא מעבר לפרטים המיועדים לשינוי. לא ניתן לשנות את שם המשתמש. diff --git a/inc/lang/he/uploadmail.txt b/inc/lang/he/uploadmail.txt new file mode 100644 index 0000000..9c06f13 --- /dev/null +++ b/inc/lang/he/uploadmail.txt @@ -0,0 +1,10 @@ +קובץ הועלה אל הדוקוויקי שלך. הנה פרטיו: + +קובץ : @MEDIA@ +תאריך : @DATE@ +דפדפן : @BROWSER@ +כתובת IP : @IPADDRESS@ +מארח : @HOSTNAME@ +גודל : @SIZE@ +סיווג : @MIME@ +משתמש : @USER@ diff --git a/inc/lang/hi/diff.txt b/inc/lang/hi/diff.txt new file mode 100644 index 0000000..ec5ca3b --- /dev/null +++ b/inc/lang/hi/diff.txt @@ -0,0 +1,3 @@ +======असमानता====== + +यह आपको पृष्ठ के दो संस्करणों के बीच असमानता को दर्शाता है. diff --git a/inc/lang/hi/jquery.ui.datepicker.js b/inc/lang/hi/jquery.ui.datepicker.js new file mode 100644 index 0000000..e3b72e5 --- /dev/null +++ b/inc/lang/hi/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Hindi initialisation for the jQuery UI date picker plugin. */ +/* Written by Michael Dawart. */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/hi/lang.php b/inc/lang/hi/lang.php new file mode 100644 index 0000000..79bc0a1 --- /dev/null +++ b/inc/lang/hi/lang.php @@ -0,0 +1,116 @@ + + * @author yndesai@gmail.com + * @author Santosh Joshi + */ +$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/inc/lang/hr/admin.txt b/inc/lang/hr/admin.txt new file mode 100644 index 0000000..eaf4d78 --- /dev/null +++ b/inc/lang/hr/admin.txt @@ -0,0 +1,3 @@ +====== Administracija ====== + +Slijedi popis svih administracijskih poslova koji su trenutno dostupni. diff --git a/inc/lang/hr/adminplugins.txt b/inc/lang/hr/adminplugins.txt new file mode 100644 index 0000000..5a7656d --- /dev/null +++ b/inc/lang/hr/adminplugins.txt @@ -0,0 +1 @@ +===== Dodatni dodatci ===== \ No newline at end of file diff --git a/inc/lang/hr/backlinks.txt b/inc/lang/hr/backlinks.txt new file mode 100644 index 0000000..0583891 --- /dev/null +++ b/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/inc/lang/hr/conflict.txt b/inc/lang/hr/conflict.txt new file mode 100644 index 0000000..82fdd33 --- /dev/null +++ b/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/inc/lang/hr/denied.txt b/inc/lang/hr/denied.txt new file mode 100644 index 0000000..910cdb5 --- /dev/null +++ b/inc/lang/hr/denied.txt @@ -0,0 +1,3 @@ +====== Niste ovlašteni ====== + +Nemate potrebne ovlasti za nastavak. diff --git a/inc/lang/hr/diff.txt b/inc/lang/hr/diff.txt new file mode 100644 index 0000000..8211643 --- /dev/null +++ b/inc/lang/hr/diff.txt @@ -0,0 +1,3 @@ +====== Razlike ====== + +Slijede razlike između dviju inačica stranice. diff --git a/inc/lang/hr/draft.txt b/inc/lang/hr/draft.txt new file mode 100644 index 0000000..a25d532 --- /dev/null +++ b/inc/lang/hr/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/hr/edit.txt b/inc/lang/hr/edit.txt new file mode 100644 index 0000000..7ed55d5 --- /dev/null +++ b/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/inc/lang/hr/editrev.txt b/inc/lang/hr/editrev.txt new file mode 100644 index 0000000..517e0a6 --- /dev/null +++ b/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. +---- diff --git a/inc/lang/hr/index.txt b/inc/lang/hr/index.txt new file mode 100644 index 0000000..4395994 --- /dev/null +++ b/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/inc/lang/hr/jquery.ui.datepicker.js b/inc/lang/hr/jquery.ui.datepicker.js new file mode 100644 index 0000000..2898d5c --- /dev/null +++ b/inc/lang/hr/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Croatian i18n for the jQuery UI date picker plugin. */ +/* Written by Vjekoslav Nesek. */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.hr = { + closeText: "Zatvori", + prevText: "Prethodno", + nextText: "Sljedeći", + 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/inc/lang/hr/lang.php b/inc/lang/hr/lang.php new file mode 100644 index 0000000..7ea944c --- /dev/null +++ b/inc/lang/hr/lang.php @@ -0,0 +1,359 @@ + + * @author Tomo Krajina + * @author Branko Rihtman + * @author Dražen Odobašić + * @author Dejan Igrec + */ +$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.
    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 Adobe Flash Plugin'; +$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 Uputstvo za postavljanje DokuWiki-a'; +$lang['i_funcna'] = 'PHP funkcija %s nije dostupna. Možda ju je vaš pružatelj hostinga onemogućio iz nekog razloga?'; +$lang['i_phpver'] = 'Vaša PHP inačica %s je niža od potrebne %s. 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'] = '%s nema dozvolu pisanja od strane DokuWiki. Trebate podesiti dozvole pristupa tom direktoriju.'; +$lang['i_confexists'] = '%s već postoji'; +$lang['i_writeerr'] = 'Ne može se kreirati %s. Trebate provjeriti dozvole direktorija/datoteke i kreirati dokument ručno.'; +$lang['i_badhash'] = 'neprepoznat ili promijenjen dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - nedozvoljena ili prazna vrijednost'; +$lang['i_success'] = 'Podešavanje je uspješno završeno. Sada možete obrisati install.php datoteku. Nastavite na vaš novi DokuWiki.'; +$lang['i_failure'] = 'Pojavile su se neke greške prilikom pisanja konfiguracijskih datoteka. Morati ćete ih ručno ispraviti da bi mogli koristiti vaš novi DokuWiki.'; +$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 %s imenskog prostora. Također možete vidjeti zadnje promjene cijelog wiki-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 %s.'; +$lang['unable_to_parse_date'] = 'Ne mogu analizirati parametar "%s".'; +$lang['email_signature_text'] = 'Ovaj email je poslan na +@DOKUWIKIURL@'; diff --git a/inc/lang/hr/locked.txt b/inc/lang/hr/locked.txt new file mode 100644 index 0000000..ff081aa --- /dev/null +++ b/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/inc/lang/hr/login.txt b/inc/lang/hr/login.txt new file mode 100644 index 0000000..216af13 --- /dev/null +++ b/inc/lang/hr/login.txt @@ -0,0 +1,3 @@ +====== Prijava ====== + +Upišite korisničko ime i lozinku da biste se prijavili. diff --git a/inc/lang/hr/mailtext.txt b/inc/lang/hr/mailtext.txt new file mode 100644 index 0000000..1719fd5 --- /dev/null +++ b/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/inc/lang/hr/newpage.txt b/inc/lang/hr/newpage.txt new file mode 100644 index 0000000..5f85ff2 --- /dev/null +++ b/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/inc/lang/hr/norev.txt b/inc/lang/hr/norev.txt new file mode 100644 index 0000000..8c9178e --- /dev/null +++ b/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/inc/lang/hr/password.txt b/inc/lang/hr/password.txt new file mode 100644 index 0000000..76cccbd --- /dev/null +++ b/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/inc/lang/hr/preview.txt b/inc/lang/hr/preview.txt new file mode 100644 index 0000000..ce4a805 --- /dev/null +++ b/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/inc/lang/hr/pwconfirm.txt b/inc/lang/hr/pwconfirm.txt new file mode 100644 index 0000000..506e98e --- /dev/null +++ b/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/inc/lang/hr/read.txt b/inc/lang/hr/read.txt new file mode 100644 index 0000000..691d3e4 --- /dev/null +++ b/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. diff --git a/inc/lang/hr/recent.txt b/inc/lang/hr/recent.txt new file mode 100644 index 0000000..6f8f651 --- /dev/null +++ b/inc/lang/hr/recent.txt @@ -0,0 +1,3 @@ +====== Nedavne izmjene ====== + +Stranice koje su nedavno promijenjene: diff --git a/inc/lang/hr/register.txt b/inc/lang/hr/register.txt new file mode 100644 index 0000000..32a5489 --- /dev/null +++ b/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/inc/lang/hr/registermail.txt b/inc/lang/hr/registermail.txt new file mode 100644 index 0000000..9c556d9 --- /dev/null +++ b/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/inc/lang/hr/resendpwd.txt b/inc/lang/hr/resendpwd.txt new file mode 100644 index 0000000..d5b2e65 --- /dev/null +++ b/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/inc/lang/hr/resetpwd.txt b/inc/lang/hr/resetpwd.txt new file mode 100644 index 0000000..ffb2722 --- /dev/null +++ b/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. diff --git a/inc/lang/hr/revisions.txt b/inc/lang/hr/revisions.txt new file mode 100644 index 0000000..990d50b --- /dev/null +++ b/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/inc/lang/hr/searchpage.txt b/inc/lang/hr/searchpage.txt new file mode 100644 index 0000000..362dd97 --- /dev/null +++ b/inc/lang/hr/searchpage.txt @@ -0,0 +1,3 @@ +====== Pretraživanja ====== + +Možete naći rezultat vaše pretrage u nastavku. @CREATEPAGEINFO@ diff --git a/inc/lang/hr/showrev.txt b/inc/lang/hr/showrev.txt new file mode 100644 index 0000000..86c1a02 --- /dev/null +++ b/inc/lang/hr/showrev.txt @@ -0,0 +1,2 @@ +**Ovo je stara izmjena dokumenta!** +---- diff --git a/inc/lang/hr/stopwords.txt b/inc/lang/hr/stopwords.txt new file mode 100644 index 0000000..5b1bb20 --- /dev/null +++ b/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/inc/lang/hr/subscr_digest.txt b/inc/lang/hr/subscr_digest.txt new file mode 100644 index 0000000..b58836d --- /dev/null +++ b/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/inc/lang/hr/subscr_form.txt b/inc/lang/hr/subscr_form.txt new file mode 100644 index 0000000..95b2cd0 --- /dev/null +++ b/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/inc/lang/hr/subscr_list.txt b/inc/lang/hr/subscr_list.txt new file mode 100644 index 0000000..75a4340 --- /dev/null +++ b/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/inc/lang/hr/subscr_single.txt b/inc/lang/hr/subscr_single.txt new file mode 100644 index 0000000..4c7b329 --- /dev/null +++ b/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/inc/lang/hr/updateprofile.txt b/inc/lang/hr/updateprofile.txt new file mode 100644 index 0000000..8eab906 --- /dev/null +++ b/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/inc/lang/hr/uploadmail.txt b/inc/lang/hr/uploadmail.txt new file mode 100644 index 0000000..f4ab91e --- /dev/null +++ b/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/inc/lang/hu-formal/admin.txt b/inc/lang/hu-formal/admin.txt new file mode 100644 index 0000000..69771f6 --- /dev/null +++ b/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. diff --git a/inc/lang/hu-formal/adminplugins.txt b/inc/lang/hu-formal/adminplugins.txt new file mode 100644 index 0000000..b077521 --- /dev/null +++ b/inc/lang/hu-formal/adminplugins.txt @@ -0,0 +1 @@ +===== További bővítmények ===== \ No newline at end of file diff --git a/inc/lang/hu-formal/backlinks.txt b/inc/lang/hu-formal/backlinks.txt new file mode 100644 index 0000000..b6507a7 --- /dev/null +++ b/inc/lang/hu-formal/backlinks.txt @@ -0,0 +1,3 @@ +====== Hivatkozások ====== + +Mindazon oldalak listája, amelyek az aktuális oldalra hivatkoznak. diff --git a/inc/lang/hu-formal/conflict.txt b/inc/lang/hu-formal/conflict.txt new file mode 100644 index 0000000..ba12d4a --- /dev/null +++ b/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. diff --git a/inc/lang/hu-formal/denied.txt b/inc/lang/hu-formal/denied.txt new file mode 100644 index 0000000..510bcfb --- /dev/null +++ b/inc/lang/hu-formal/denied.txt @@ -0,0 +1,3 @@ +====== Hozzáférés megtadadva ====== + +Sajnáljuk, de nincs joga a folytatáshoz. diff --git a/inc/lang/hu-formal/diff.txt b/inc/lang/hu-formal/diff.txt new file mode 100644 index 0000000..aa430be --- /dev/null +++ b/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. diff --git a/inc/lang/hu-formal/draft.txt b/inc/lang/hu-formal/draft.txt new file mode 100644 index 0000000..a68506d --- /dev/null +++ b/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. diff --git a/inc/lang/hu-formal/edit.txt b/inc/lang/hu-formal/edit.txt new file mode 100644 index 0000000..eaf30bf --- /dev/null +++ b/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. diff --git a/inc/lang/hu-formal/editrev.txt b/inc/lang/hu-formal/editrev.txt new file mode 100644 index 0000000..c8034ea --- /dev/null +++ b/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. +---- diff --git a/inc/lang/hu-formal/index.txt b/inc/lang/hu-formal/index.txt new file mode 100644 index 0000000..ead091f --- /dev/null +++ b/inc/lang/hu-formal/index.txt @@ -0,0 +1,3 @@ +====== Oldaltérkép (tartalom) ====== + +Az összes elérhető oldal [[doku>hu:namespaces|névterek]] szerint rendezett oldaltérképe. diff --git a/inc/lang/hu-formal/lang.php b/inc/lang/hu-formal/lang.php new file mode 100644 index 0000000..66ff893 --- /dev/null +++ b/inc/lang/hu-formal/lang.php @@ -0,0 +1,29 @@ + + */ +$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/inc/lang/hu/admin.txt b/inc/lang/hu/admin.txt new file mode 100644 index 0000000..51b13eb --- /dev/null +++ b/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/inc/lang/hu/adminplugins.txt b/inc/lang/hu/adminplugins.txt new file mode 100644 index 0000000..b077521 --- /dev/null +++ b/inc/lang/hu/adminplugins.txt @@ -0,0 +1 @@ +===== További bővítmények ===== \ No newline at end of file diff --git a/inc/lang/hu/backlinks.txt b/inc/lang/hu/backlinks.txt new file mode 100644 index 0000000..a987d96 --- /dev/null +++ b/inc/lang/hu/backlinks.txt @@ -0,0 +1,3 @@ +====== Hivatkozások ====== + +Ez azoknak az oldalaknak a listája, amelyek erre az oldalra "visszamutatnak" (hivatkoznak). diff --git a/inc/lang/hu/conflict.txt b/inc/lang/hu/conflict.txt new file mode 100644 index 0000000..14a6510 --- /dev/null +++ b/inc/lang/hu/conflict.txt @@ -0,0 +1,5 @@ +====== Ú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/inc/lang/hu/denied.txt b/inc/lang/hu/denied.txt new file mode 100644 index 0000000..ff95c84 --- /dev/null +++ b/inc/lang/hu/denied.txt @@ -0,0 +1,3 @@ +====== Hozzáférés megtagadva ====== + +Sajnáljuk, nincs jogod a folytatáshoz. diff --git a/inc/lang/hu/diff.txt b/inc/lang/hu/diff.txt new file mode 100644 index 0000000..a212f2d --- /dev/null +++ b/inc/lang/hu/diff.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/hu/draft.txt b/inc/lang/hu/draft.txt new file mode 100644 index 0000000..3a08954 --- /dev/null +++ b/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. diff --git a/inc/lang/hu/edit.txt b/inc/lang/hu/edit.txt new file mode 100644 index 0000000..0992723 --- /dev/null +++ b/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/inc/lang/hu/editrev.txt b/inc/lang/hu/editrev.txt new file mode 100644 index 0000000..e17662e --- /dev/null +++ b/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/inc/lang/hu/index.txt b/inc/lang/hu/index.txt new file mode 100644 index 0000000..88154ef --- /dev/null +++ b/inc/lang/hu/index.txt @@ -0,0 +1,3 @@ +====== Áttekintő (index) ====== + +Az összes elérhető oldal áttekintése [[doku>hu:namespaces|névterek]] szerint rendezve. diff --git a/inc/lang/hu/install.html b/inc/lang/hu/install.html new file mode 100644 index 0000000..c8390d3 --- /dev/null +++ b/inc/lang/hu/install.html @@ -0,0 +1,7 @@ +

    Ez az oldal segít a DokuWiki kezdeti beállításában és a konfigurálásban. További információ ezen az oldalon található.

    + +

    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 kell 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.

    + +

    A Beállító Varázsló felkészíti ezt a DokuWikit a hozzáférési listák (ACL-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.

    + +

    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 telepítéssel és konfigurálási lehetőségekkel kapcsolatban.

    diff --git a/inc/lang/hu/jquery.ui.datepicker.js b/inc/lang/hu/jquery.ui.datepicker.js new file mode 100644 index 0000000..3bb86da --- /dev/null +++ b/inc/lang/hu/jquery.ui.datepicker.js @@ -0,0 +1,39 @@ +/* Hungarian initialisation for the jQuery UI date picker plugin. */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/hu/lang.php b/inc/lang/hu/lang.php new file mode 100644 index 0000000..0dd7bf1 --- /dev/null +++ b/inc/lang/hu/lang.php @@ -0,0 +1,375 @@ + + * @author Hamp Gábor + * @author Viktor Horváth + * @author Ziegler Gábor + * @author Sandor TIHANYI + * @author Siaynoq Mage + * @author schilling.janos + * @author Szabó Dávid + * @author Marton Sebok + * @author Serenity87HUN + * @author Marina Vladi + * @author Mátyás Jani + */ +$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['searchcreatepage'] = 'Ha nem találod amit kerestél, létrehozhatod vagy szerkesztheted a %s oldalt, amelyet a keresésed alapján neveztünk el.'; +$lang['search_fullresults'] = 'Teljes szöveg'; +$lang['js']['search_toggle_tools'] = 'Keresőeszközök ki/bekapcsolása'; +$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['search_exact_match'] = 'pontos egyezés'; +$lang['search_starts_with'] = 'Kezdete'; +$lang['search_ends_with'] = 'Vége'; +$lang['search_contains'] = 'Tartalmazza'; +$lang['search_custom_match'] = 'egyéni'; +$lang['search_any_ns'] = 'Bármely névtér'; +$lang['search_any_time'] = 'Bármikor'; +$lang['search_past_7_days'] = 'Elmúlt héten'; +$lang['search_past_month'] = 'Elmúlt hónapban'; +$lang['search_past_year'] = 'Az elmúlt évben'; +$lang['search_sort_by_hits'] = 'találatok szerinti rendezés'; +$lang['search_sort_by_mtime'] = 'Utolsó módosítás időpontja szerint rendezve'; +$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.
    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['allowedmime'] = 'A megengedett fájlkiterjesztések listája'; +$lang['lockedby'] = 'Jelenleg zárolta:'; +$lang['lockexpire'] = 'A zárolás lejár:'; +$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['unknowndate'] = 'Ismeretlen dátum'; +$lang['noflash'] = 'Ennek a tartalomnak a megtekintéséhez Adobe Flash Plugin 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 Dokuwiki telepítési útmutatót.'; +$lang['i_funcna'] = 'A %s PHP funkció nem elérhető. Esetleg a tárhelyszolgáltató letiltotta biztonsági okok miatt?'; +$lang['i_disabled'] = 'A szolgáltató által letiltva.'; +$lang['i_funcnmail'] = 'Megjegyzés: A PHP mail függvény nem érhető el. %s Amennyiben a későbbiekben sem lesz elérhető, érdemes lehet telepíteni az smtp plugint. '; +$lang['i_phpver'] = 'A PHP %s verziója alacsonyabb, mint ami szükséges lenne: %s. 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_urandom'] = 'A DokuWiki nem tud kriptográfiailag biztonságos számokat létrehozni a sütikhez. Érdemes ellenőrizni az open_basedir beállításokat a php.ini-ben a /dev/urandom megfelelő hozzáféréséhez. '; +$lang['i_permfail'] = 'A DokiWiki nem tudja írni a %s könyvtárat. Be kell állítanod ehhez a könyvtárhoz a megfelelő jogosultságokat!'; +$lang['i_confexists'] = '%s már létezik.'; +$lang['i_writeerr'] = 'Nem tudom ezt létrehozni: %s. 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=%s)'; +$lang['i_badval'] = '%s - 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 új DokuWikidet!'; +$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 új DokuWikidet.'; +$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 %s névtér friss változásai látszanak. Megtekinthetők a teljes wiki friss változásai 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['email_fail'] = 'A PHP mail() hiányzik, vagy le van tiltva. Az alábbi e-mail nem lett elküldve:'; +$lang['currentns'] = 'Aktuális névtér'; +$lang['searchresult'] = 'Keresés eredménye'; +$lang['plainhtml'] = 'Sima HTML'; +$lang['wikimarkup'] = 'Wiki-jelölőnyelv'; +$lang['page_nonexist_rev'] = 'A(z) %s oldal nem létezik. Később lett létrehozva a(z) %s helyen.'; +$lang['unable_to_parse_date'] = 'A "%s" paraméter feldolgozása sikertelen.'; +$lang['email_signature_text'] = 'Ezt a levelet a DokuWiki generálta +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = 'Log fájl túl nagy. Korábbi sorok kihagyva!'; +$lang['log_file_failed_to_open'] = 'Nem sikerült a log fájl megnyitása.'; +$lang['log_file_failed_to_read'] = 'Hiba történt a log fájl olvasásakor.'; diff --git a/inc/lang/hu/locked.txt b/inc/lang/hu/locked.txt new file mode 100644 index 0000000..5612e81 --- /dev/null +++ b/inc/lang/hu/locked.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/hu/login.txt b/inc/lang/hu/login.txt new file mode 100644 index 0000000..ce606c0 --- /dev/null +++ b/inc/lang/hu/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/hu/mailtext.txt b/inc/lang/hu/mailtext.txt new file mode 100644 index 0000000..d8d0336 --- /dev/null +++ b/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/inc/lang/hu/mailwrap.html b/inc/lang/hu/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/hu/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/hu/newpage.txt b/inc/lang/hu/newpage.txt new file mode 100644 index 0000000..68c3b7f --- /dev/null +++ b/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. diff --git a/inc/lang/hu/norev.txt b/inc/lang/hu/norev.txt new file mode 100644 index 0000000..ad38c87 --- /dev/null +++ b/inc/lang/hu/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/hu/onceexisted.txt b/inc/lang/hu/onceexisted.txt new file mode 100644 index 0000000..083ce0a --- /dev/null +++ b/inc/lang/hu/onceexisted.txt @@ -0,0 +1,3 @@ +======A keresett oldal már nem létezik====== + +Egy már nem létező oldal linkjére kattintottál. A **old revisions** ben visszakeresheted, hogy mikor és miért szűnt meg az oldal, megnézheted vagy vissza is állíthatsz verzióelőzményeket. diff --git a/inc/lang/hu/password.txt b/inc/lang/hu/password.txt new file mode 100644 index 0000000..49cf69f --- /dev/null +++ b/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/inc/lang/hu/preview.txt b/inc/lang/hu/preview.txt new file mode 100644 index 0000000..050b669 --- /dev/null +++ b/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/inc/lang/hu/pwconfirm.txt b/inc/lang/hu/pwconfirm.txt new file mode 100644 index 0000000..c88c8ec --- /dev/null +++ b/inc/lang/hu/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/hu/read.txt b/inc/lang/hu/read.txt new file mode 100644 index 0000000..223a6fe --- /dev/null +++ b/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/inc/lang/hu/recent.txt b/inc/lang/hu/recent.txt new file mode 100644 index 0000000..85e9f9e --- /dev/null +++ b/inc/lang/hu/recent.txt @@ -0,0 +1,3 @@ +====== Legutóbbi változások ====== + +Az alábbi oldalak változtak legutoljára: diff --git a/inc/lang/hu/register.txt b/inc/lang/hu/register.txt new file mode 100644 index 0000000..0fe5144 --- /dev/null +++ b/inc/lang/hu/register.txt @@ -0,0 +1,3 @@ +====== Ú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>hu:pagename|oldalnév]] kell legyen. diff --git a/inc/lang/hu/registermail.txt b/inc/lang/hu/registermail.txt new file mode 100644 index 0000000..d37d59b --- /dev/null +++ b/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/inc/lang/hu/resendpwd.txt b/inc/lang/hu/resendpwd.txt new file mode 100644 index 0000000..235ce0c --- /dev/null +++ b/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. diff --git a/inc/lang/hu/resetpwd.txt b/inc/lang/hu/resetpwd.txt new file mode 100644 index 0000000..c10cecb --- /dev/null +++ b/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. diff --git a/inc/lang/hu/revisions.txt b/inc/lang/hu/revisions.txt new file mode 100644 index 0000000..3537fd6 --- /dev/null +++ b/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/inc/lang/hu/searchpage.txt b/inc/lang/hu/searchpage.txt new file mode 100644 index 0000000..69a7db5 --- /dev/null +++ b/inc/lang/hu/searchpage.txt @@ -0,0 +1,3 @@ +====== Keresés ====== + +A keresés eredményét lentebb láthatod. @CREATEPAGEINFO@ diff --git a/inc/lang/hu/showrev.txt b/inc/lang/hu/showrev.txt new file mode 100644 index 0000000..2131b4d --- /dev/null +++ b/inc/lang/hu/showrev.txt @@ -0,0 +1,2 @@ +**Ez a dokumentum egy előző változata!** +---- diff --git a/inc/lang/hu/stopwords.txt b/inc/lang/hu/stopwords.txt new file mode 100644 index 0000000..fe72cde --- /dev/null +++ b/inc/lang/hu/stopwords.txt @@ -0,0 +1,40 @@ +# 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 +át +én +és +ön +össze +ő +ők +a +az +be +csak +de +egy +el +fel +hát +hogy +ide +igen +ki +le +lesz +meg +mi +mint +nem +oda +rá +szét +te +ti +vagy +van +vissza +volt +www diff --git a/inc/lang/hu/subscr_digest.txt b/inc/lang/hu/subscr_digest.txt new file mode 100644 index 0000000..874c934 --- /dev/null +++ b/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/inc/lang/hu/subscr_form.txt b/inc/lang/hu/subscr_form.txt new file mode 100644 index 0000000..22fa940 --- /dev/null +++ b/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/inc/lang/hu/subscr_list.txt b/inc/lang/hu/subscr_list.txt new file mode 100644 index 0000000..c87d6dc --- /dev/null +++ b/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/inc/lang/hu/subscr_single.txt b/inc/lang/hu/subscr_single.txt new file mode 100644 index 0000000..8d36def --- /dev/null +++ b/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/inc/lang/hu/updateprofile.txt b/inc/lang/hu/updateprofile.txt new file mode 100644 index 0000000..50df153 --- /dev/null +++ b/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/inc/lang/hu/uploadmail.txt b/inc/lang/hu/uploadmail.txt new file mode 100644 index 0000000..62e0c2e --- /dev/null +++ b/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/inc/lang/hy/admin.txt b/inc/lang/hy/admin.txt new file mode 100644 index 0000000..9b2eea7 --- /dev/null +++ b/inc/lang/hy/admin.txt @@ -0,0 +1,3 @@ +====== Ղեկավարում ====== + +Ստորև կարող ես գտնել ԴոկուՎիքիում հասանելի ղեկավարման առաջադրանքները։ \ No newline at end of file diff --git a/inc/lang/hy/adminplugins.txt b/inc/lang/hy/adminplugins.txt new file mode 100644 index 0000000..253eac2 --- /dev/null +++ b/inc/lang/hy/adminplugins.txt @@ -0,0 +1 @@ +===== Լրացուցիչ հավելումներ ===== \ No newline at end of file diff --git a/inc/lang/hy/backlinks.txt b/inc/lang/hy/backlinks.txt new file mode 100644 index 0000000..b470603 --- /dev/null +++ b/inc/lang/hy/backlinks.txt @@ -0,0 +1 @@ +====== Հետադարձ հղումներ ====== \ No newline at end of file diff --git a/inc/lang/hy/conflict.txt b/inc/lang/hy/conflict.txt new file mode 100644 index 0000000..9b117f2 --- /dev/null +++ b/inc/lang/hy/conflict.txt @@ -0,0 +1,5 @@ +====== Գոյություն ունի նոր տարբերակ ====== + +Գոյություն ունի խմբագրված փաստաթղթի նոր տարբերակ։ Քո խմբագրելու ընթացքում մեկ այլ օգտատեր փոփոխել է այս փաստաթուղթը։ + +Դիտիր ստորև ցուցադրվող տարբերակները և որոշիր, որն ես ցանկանում պահպանել։ Եթե ընտրես «պահել», քո տարբերակը կպահպանվի։ Սեղմիր «չեղարկել»՝ ներկա տարբերակը պահպանելու համար; \ No newline at end of file diff --git a/inc/lang/hy/denied.txt b/inc/lang/hy/denied.txt new file mode 100644 index 0000000..c9ccc72 --- /dev/null +++ b/inc/lang/hy/denied.txt @@ -0,0 +1,3 @@ +====== Չի թույլատրվում ====== + +Ցավոք, դու չունես բավարար իրավունքներ շարունակելու համար։ \ No newline at end of file diff --git a/inc/lang/hy/diff.txt b/inc/lang/hy/diff.txt new file mode 100644 index 0000000..5816dcc --- /dev/null +++ b/inc/lang/hy/diff.txt @@ -0,0 +1,3 @@ +====== Տարբերություններ ====== + +Ցույց է տալիս էջի երկու տարբերակների միջև առկա տարբերությունները։ \ No newline at end of file diff --git a/inc/lang/hy/draft.txt b/inc/lang/hy/draft.txt new file mode 100644 index 0000000..123167a --- /dev/null +++ b/inc/lang/hy/draft.txt @@ -0,0 +1,5 @@ +====== Գտնվել է սևագիր տարբերակ ====== + +Քո նախորդ խմբագրման սեսիան հաջողությամբ չի ավարտվել։ ԴոկուՎիքին քո աշխատանքի ընթացքում ավտոմատ պահպանել է սևագիր տարբերակ, որը դու այժմ կարող ես օգտագործել խմբագրումը շարունակելու համար։ Ստորև կարող ես գտնել վերջին սեսիայից պահպանված տվյալները։ + +Խնդրում ենք, որոշիչ՝ ցանկանում ես //վերականգնել// կորսված խմբագրման սեսիան, //ջնջել// ավտոմատ պահպանված սևագիրը, թե //չեղարկել// խմբագրման գործընթացը։ \ No newline at end of file diff --git a/inc/lang/hy/edit.txt b/inc/lang/hy/edit.txt new file mode 100644 index 0000000..776e3f4 --- /dev/null +++ b/inc/lang/hy/edit.txt @@ -0,0 +1 @@ +Խմբագրիր այս էջը և սեղմիր //Պահել//։ Կարդա [[wiki:syntax]] էջը այս վիքիի շարահյուսությանը ծանոթանալու համար։ Խնդրում ենք խմբագրել այս էջը միայն եթե կարող ես **բարելավել** այն։ Եթե ցանկանում ես փորձարկել, առաջին քայլերդ արա [[playground:playground|խաղահրապարակում]]։ \ No newline at end of file diff --git a/inc/lang/hy/editrev.txt b/inc/lang/hy/editrev.txt new file mode 100644 index 0000000..31d7d0a --- /dev/null +++ b/inc/lang/hy/editrev.txt @@ -0,0 +1,2 @@ +**Դու բեռնել ես այս փաստաթղթի հին տարբերակ։** Եթե պահես այն, այս տվյալներով կստեղծես էջի նոր տարբեակ։ +---- \ No newline at end of file diff --git a/inc/lang/hy/index.txt b/inc/lang/hy/index.txt new file mode 100644 index 0000000..1b21383 --- /dev/null +++ b/inc/lang/hy/index.txt @@ -0,0 +1,3 @@ +====== Կայքի քարտեզ ====== + +Սա բոլոր առկա էջերի քարտեզն է, որը դասավորված է ըստ [[doku>namespaces|անվանատարածքների]]։ \ No newline at end of file diff --git a/inc/lang/hy/jquery.ui.datepicker.js b/inc/lang/hy/jquery.ui.datepicker.js new file mode 100644 index 0000000..7d4da5a --- /dev/null +++ b/inc/lang/hy/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Armenian(UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Levon Zakaryan (levon.zakaryan@gmail.com)*/ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.hy = { + 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.hy ); + +return datepicker.regional.hy; + +} ); diff --git a/inc/lang/hy/lang.php b/inc/lang/hy/lang.php new file mode 100644 index 0000000..0d25348 --- /dev/null +++ b/inc/lang/hy/lang.php @@ -0,0 +1,133 @@ + + */ +$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['searchcreatepage'] = 'Եթե չգտար ինչ փնտրում էին, կարող ես ստեղծել կամ խմբագրել %s էջը, որը համապատասխանում է հարցմանը։'; +$lang['search_fullresults'] = 'Ամբողջական տեքստի արդյունքներ'; +$lang['js']['search_toggle_tools'] = 'Ցուցադրել որոնման գործիքները'; +$lang['js']['notsavedyet'] = 'Չպահպանված փոփոխությունները կկորչեն'; +$lang['js']['searchmedia'] = 'Որոնել նիշքեր'; +$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'] = 'Հղումների օգնական'; +$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_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['regbadpass'] = 'Առաջարկված երկու գաղտնաբառերը միմյանց չեն համապատասխանում, խնդրում ենք, նորից փորձել։'; +$lang['regpwmail'] = 'ԴոկուՎիքիի քո գաղտնաբառը'; +$lang['reghere'] = 'Դեռ հաշիվ չունե՞ս։ Գրանցվի՛ր։'; +$lang['profna'] = 'Այս վիքին չի աջակցում մասնակցային հաշվի փոփոխությունները'; +$lang['profnoempty'] = 'Դատարկ անունը կամ էլեկտրոնային հասցեն չի թույլատրվում։'; +$lang['profchanged'] = 'Մասնակցային հաշիվը հաջողությամբ թարմացվեց'; +$lang['profnodelete'] = 'Այս վիքիում հնարավոր չէ ջնջել օգտատերերին'; +$lang['profdeleteuser'] = 'Ջնջել հաշիվը'; +$lang['profdeleted'] = 'Քո մասնակցային հաշիվը ջնջվեց այս վիքիից'; +$lang['profconfdelete'] = 'Ցանկացնում եմ ջնջել իմ հաշիվը այս վիքիից։
    Այս գործողությունը հնարավոր չէ չեղարկել։'; +$lang['profconfdeletemissing'] = 'Հաստատման վանդակը ընտրված չէ'; diff --git a/inc/lang/ia/admin.txt b/inc/lang/ia/admin.txt new file mode 100644 index 0000000..f81ff31 --- /dev/null +++ b/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/inc/lang/ia/adminplugins.txt b/inc/lang/ia/adminplugins.txt new file mode 100644 index 0000000..ad8f794 --- /dev/null +++ b/inc/lang/ia/adminplugins.txt @@ -0,0 +1 @@ +===== Plug-ins additional ===== \ No newline at end of file diff --git a/inc/lang/ia/backlinks.txt b/inc/lang/ia/backlinks.txt new file mode 100644 index 0000000..14a559a --- /dev/null +++ b/inc/lang/ia/backlinks.txt @@ -0,0 +1,3 @@ +====== Retroligamines ====== + +Isto es un lista de paginas que contine ligamines de retorno al pagina actual. diff --git a/inc/lang/ia/conflict.txt b/inc/lang/ia/conflict.txt new file mode 100644 index 0000000..576cb7e --- /dev/null +++ b/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/inc/lang/ia/denied.txt b/inc/lang/ia/denied.txt new file mode 100644 index 0000000..3d938ab --- /dev/null +++ b/inc/lang/ia/denied.txt @@ -0,0 +1,3 @@ +====== Permission refusate ====== + +Pardono, tu non ha le derectos requisite pro continuar. diff --git a/inc/lang/ia/diff.txt b/inc/lang/ia/diff.txt new file mode 100644 index 0000000..daa94f4 --- /dev/null +++ b/inc/lang/ia/diff.txt @@ -0,0 +1,3 @@ +====== Differentias ====== + +Isto te monstra le differentias inter duo versiones del pagina. diff --git a/inc/lang/ia/draft.txt b/inc/lang/ia/draft.txt new file mode 100644 index 0000000..feed2a8 --- /dev/null +++ b/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. diff --git a/inc/lang/ia/edit.txt b/inc/lang/ia/edit.txt new file mode 100644 index 0000000..5c80bb0 --- /dev/null +++ b/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]]. diff --git a/inc/lang/ia/editrev.txt b/inc/lang/ia/editrev.txt new file mode 100644 index 0000000..b147b55 --- /dev/null +++ b/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. +---- diff --git a/inc/lang/ia/index.txt b/inc/lang/ia/index.txt new file mode 100644 index 0000000..5957cc2 --- /dev/null +++ b/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/inc/lang/ia/install.html b/inc/lang/ia/install.html new file mode 100644 index 0000000..cb8420e --- /dev/null +++ b/inc/lang/ia/install.html @@ -0,0 +1,7 @@ +

    Iste pagina te assiste in le prime installation e configuration de Dokuwiki. Ulterior informationes super iste installator es disponibile in le pagina de documentation de illo.

    + +

    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 debe 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).

    + +

    Iste installator configurara tu installation de DokuWiki pro ACL, 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.

    + +

    Le usatores experte o con exigentias special pro le installation deberea usar iste ligamines pro detalios concernente le instructiones de installation e configurationes.

    diff --git a/inc/lang/ia/lang.php b/inc/lang/ia/lang.php new file mode 100644 index 0000000..38b7a79 --- /dev/null +++ b/inc/lang/ia/lang.php @@ -0,0 +1,261 @@ + + * @author Martijn Dekker + */ +$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 plug-in Flash de Adobe 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 instructiones de installation complete pro altere optiones.'; +$lang['i_funcna'] = 'Le function PHP %s non es disponibile. Pote esser que tu albergo web lo ha disactivate pro un ration o altere.'; +$lang['i_phpver'] = 'Le version de PHP %s es plus ancian que le version requisite %s. Es necessari actualisar le installation de PHP.'; +$lang['i_permfail'] = '%s non permitte le accesso de scriptura a DokuWiki. Tu debe reparar le permissiones de iste directorio!'; +$lang['i_confexists'] = '%s ja existe'; +$lang['i_writeerr'] = 'Impossibile crear %s. Tu debe verificar le permissiones de directorios/files e crear iste file manualmente.'; +$lang['i_badhash'] = 'dokuwiki.php non recognoscite o modificate (hash=%s)'; +$lang['i_badval'] = '%s - valor vacue o invalide'; +$lang['i_success'] = 'Le configuration ha succedite. Tu pote ora deler le file install.php. Continua a +tu nove DokuWiki.'; +$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 tu nove DokuWiki.'; +$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 %s. Tu pote etiam vider le modificationes recente de tote le wiki.'; +$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/inc/lang/ia/locked.txt b/inc/lang/ia/locked.txt new file mode 100644 index 0000000..38c714f --- /dev/null +++ b/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. diff --git a/inc/lang/ia/login.txt b/inc/lang/ia/login.txt new file mode 100644 index 0000000..46a22cb --- /dev/null +++ b/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. diff --git a/inc/lang/ia/mailtext.txt b/inc/lang/ia/mailtext.txt new file mode 100644 index 0000000..ed3eb25 --- /dev/null +++ b/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/inc/lang/ia/newpage.txt b/inc/lang/ia/newpage.txt new file mode 100644 index 0000000..c6e42a0 --- /dev/null +++ b/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**. diff --git a/inc/lang/ia/norev.txt b/inc/lang/ia/norev.txt new file mode 100644 index 0000000..67a6e8d --- /dev/null +++ b/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. diff --git a/inc/lang/ia/password.txt b/inc/lang/ia/password.txt new file mode 100644 index 0000000..bf0e400 --- /dev/null +++ b/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/inc/lang/ia/preview.txt b/inc/lang/ia/preview.txt new file mode 100644 index 0000000..1b5b069 --- /dev/null +++ b/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**! diff --git a/inc/lang/ia/pwconfirm.txt b/inc/lang/ia/pwconfirm.txt new file mode 100644 index 0000000..c194d81 --- /dev/null +++ b/inc/lang/ia/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/ia/read.txt b/inc/lang/ia/read.txt new file mode 100644 index 0000000..bfc9877 --- /dev/null +++ b/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. diff --git a/inc/lang/ia/recent.txt b/inc/lang/ia/recent.txt new file mode 100644 index 0000000..8426bed --- /dev/null +++ b/inc/lang/ia/recent.txt @@ -0,0 +1,3 @@ +====== Modificationes recente ====== + +Le sequente paginas ha essite modificate recentemente: diff --git a/inc/lang/ia/register.txt b/inc/lang/ia/register.txt new file mode 100644 index 0000000..22c4e4a --- /dev/null +++ b/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/inc/lang/ia/registermail.txt b/inc/lang/ia/registermail.txt new file mode 100644 index 0000000..b6fa332 --- /dev/null +++ b/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/inc/lang/ia/resendpwd.txt b/inc/lang/ia/resendpwd.txt new file mode 100644 index 0000000..2b8b3e4 --- /dev/null +++ b/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. diff --git a/inc/lang/ia/revisions.txt b/inc/lang/ia/revisions.txt new file mode 100644 index 0000000..4f89cbe --- /dev/null +++ b/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. diff --git a/inc/lang/ia/searchpage.txt b/inc/lang/ia/searchpage.txt new file mode 100644 index 0000000..06a89f7 --- /dev/null +++ b/inc/lang/ia/searchpage.txt @@ -0,0 +1,3 @@ +====== Recerca ====== + +Le resultatos de tu recerca se trova hic infra. @CREATEPAGEINFO@ diff --git a/inc/lang/ia/showrev.txt b/inc/lang/ia/showrev.txt new file mode 100644 index 0000000..3ac3314 --- /dev/null +++ b/inc/lang/ia/showrev.txt @@ -0,0 +1,2 @@ +**Isto es un version ancian del documento!** +---- diff --git a/inc/lang/ia/stopwords.txt b/inc/lang/ia/stopwords.txt new file mode 100644 index 0000000..e3e5135 --- /dev/null +++ b/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/inc/lang/ia/subscr_digest.txt b/inc/lang/ia/subscr_digest.txt new file mode 100644 index 0000000..b2cac2c --- /dev/null +++ b/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/inc/lang/ia/subscr_form.txt b/inc/lang/ia/subscr_form.txt new file mode 100644 index 0000000..f63a30d --- /dev/null +++ b/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/inc/lang/ia/subscr_list.txt b/inc/lang/ia/subscr_list.txt new file mode 100644 index 0000000..01ff350 --- /dev/null +++ b/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/inc/lang/ia/subscr_single.txt b/inc/lang/ia/subscr_single.txt new file mode 100644 index 0000000..da670ca --- /dev/null +++ b/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/inc/lang/ia/updateprofile.txt b/inc/lang/ia/updateprofile.txt new file mode 100644 index 0000000..ab0928f --- /dev/null +++ b/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. diff --git a/inc/lang/ia/uploadmail.txt b/inc/lang/ia/uploadmail.txt new file mode 100644 index 0000000..c406d4b --- /dev/null +++ b/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/inc/lang/id-ni/lang.php b/inc/lang/id-ni/lang.php new file mode 100644 index 0000000..9bd495c --- /dev/null +++ b/inc/lang/id-ni/lang.php @@ -0,0 +1,76 @@ + + * @author Yustinus Waruwu + */ +$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/inc/lang/id/admin.txt b/inc/lang/id/admin.txt new file mode 100644 index 0000000..21c9a95 --- /dev/null +++ b/inc/lang/id/admin.txt @@ -0,0 +1,3 @@ +====== Administrasi ====== + +Berikut ini adalah daftar pekerjaan administratif yang dapat Anda temukan di DokuWiki. diff --git a/inc/lang/id/adminplugins.txt b/inc/lang/id/adminplugins.txt new file mode 100644 index 0000000..82ddd93 --- /dev/null +++ b/inc/lang/id/adminplugins.txt @@ -0,0 +1 @@ +===== Plugin Tambahan ===== \ No newline at end of file diff --git a/inc/lang/id/backlinks.txt b/inc/lang/id/backlinks.txt new file mode 100644 index 0000000..79c70f3 --- /dev/null +++ b/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/inc/lang/id/conflict.txt b/inc/lang/id/conflict.txt new file mode 100644 index 0000000..0ec08c4 --- /dev/null +++ b/inc/lang/id/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/id/denied.txt b/inc/lang/id/denied.txt new file mode 100644 index 0000000..1a880a1 --- /dev/null +++ b/inc/lang/id/denied.txt @@ -0,0 +1,3 @@ +====== Akses Ditolak ====== + +Maaf, Anda tidak mempunyai hak akses untuk melanjutkan. diff --git a/inc/lang/id/diff.txt b/inc/lang/id/diff.txt new file mode 100644 index 0000000..b71e5b0 --- /dev/null +++ b/inc/lang/id/diff.txt @@ -0,0 +1,3 @@ +====== Perbedaan ====== + +Ini menunjukkan perbedaan antara versi yang terpilih dengan versi yang sedang aktif. diff --git a/inc/lang/id/draft.txt b/inc/lang/id/draft.txt new file mode 100644 index 0000000..d7de145 --- /dev/null +++ b/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/inc/lang/id/edit.txt b/inc/lang/id/edit.txt new file mode 100644 index 0000000..6192749 --- /dev/null +++ b/inc/lang/id/edit.txt @@ -0,0 +1 @@ +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/inc/lang/id/editrev.txt b/inc/lang/id/editrev.txt new file mode 100644 index 0000000..52f3717 --- /dev/null +++ b/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. +---- diff --git a/inc/lang/id/index.txt b/inc/lang/id/index.txt new file mode 100644 index 0000000..71da208 --- /dev/null +++ b/inc/lang/id/index.txt @@ -0,0 +1,3 @@ +====== Index ====== + +Berikut ini adalah index dari keseluruhan halaman yang ada, diurutkan berdasar [[doku>namespaces|namespaces]]. diff --git a/inc/lang/id/install.html b/inc/lang/id/install.html new file mode 100644 index 0000000..e4058b1 --- /dev/null +++ b/inc/lang/id/install.html @@ -0,0 +1,7 @@ +

    Halaman ini membatu Anda dalam proses instalasi dan konfigurasi pertama kali untuk Dokuwiki. Informasi lebih lanjut tentang alat instalasi ini tersedia dalam halaman dokumentasi sendiri.

    + +

    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 harus 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).

    + +

    Alat instalasi ini akan mengatur konfigurasi DokuWiki Anda untuk ACL, 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.

    + +

    Pengguna berpengalaman atau pengguna dengan kebutuhan instalasi khusus silahkan melihat link Panduan Instalasi and Konfigurasi WIki. untuk hal-hal yang berhubungan dengan instalasi dan konfigurasi.

    diff --git a/inc/lang/id/jquery.ui.datepicker.js b/inc/lang/id/jquery.ui.datepicker.js new file mode 100644 index 0000000..17082e9 --- /dev/null +++ b/inc/lang/id/jquery.ui.datepicker.js @@ -0,0 +1,41 @@ +/* Indonesian initialisation for the jQuery UI date picker plugin. */ +/* Written by Deden Fathurahman (dedenf@gmail.com). */ +/* Fixed by Denny Septian Panggabean (xamidimura@gmail.com) */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.id = { + closeText: "Tutup", + prevText: "Mundur", + nextText: "Maju", + 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/inc/lang/id/lang.php b/inc/lang/id/lang.php new file mode 100644 index 0000000..5f99981 --- /dev/null +++ b/inc/lang/id/lang.php @@ -0,0 +1,344 @@ + + * @author NawanP + * @author rusly-id + * @author mubaidillah + * @author Irwan Butar Butar + * @author Yustinus Waruwu + * @author zamroni + * @author umriya afini + * @author Arif Budiman + */ +$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_preview'] = 'Pratayang'; +$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_secedit'] = 'Sunting'; +$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_reset'] = 'Atur ulang'; +$lang['btn_resendpwd'] = 'Atur password baru'; +$lang['btn_draft'] = 'Sunting draf'; +$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['searchcreatepage'] = 'Jika anda tidak menemukan yang anda cari, anda dapat membuat atau mengedit halaman %s, yang dinamai sesuai kueri anda.'; +$lang['search_fullresults'] = 'Hasil teks penuh'; +$lang['js']['search_toggle_tools'] = 'Tombol Alihan Perkakas Telusur'; +$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_diff_portions'] = 'Usap'; +$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['js']['data_insecure'] = 'PERINGATAN: Sepertinya direktori data anda belum diamankan. Silakan baca Keamanan Akses Web di DokuWiki.'; +$lang['search_exact_match'] = 'Tepat sesuai'; +$lang['search_starts_with'] = 'Dimulai dengan'; +$lang['search_ends_with'] = 'Diakhiri dengan'; +$lang['search_contains'] = 'Berisi'; +$lang['search_custom_match'] = 'Kustom'; +$lang['search_any_ns'] = 'Namespace apa saja'; +$lang['search_any_time'] = 'Kapanpun'; +$lang['search_past_7_days'] = 'Pekan lalu'; +$lang['search_past_month'] = 'Bulan lalu'; +$lang['search_past_year'] = 'Tahun lalu'; +$lang['search_sort_by_hits'] = 'Urutkan berdasar hit'; +$lang['search_sort_by_mtime'] = 'Urutkan berdasar perubahan terkini'; +$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['regfail'] = 'Pengguna tidak dapat dibuat.'; +$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['proffail'] = 'Profil pengguna tidak diperbarui.'; +$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['allowedmime'] = 'Daftar ekstensi berkas yang diizinkan'; +$lang['lockedby'] = 'Sedang dikunci oleh:'; +$lang['lockexpire'] = 'Penguncian artikel sampai dengan:'; +$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['hits'] = 'Hit'; +$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['diffbothprevrev'] = 'Kedua sisi revisi sebelumnya'; +$lang['diffbothnextrev'] = 'Kedua sisi revisi setelahnya'; +$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['summary'] = 'Edit ringkasan'; +$lang['noflash'] = 'Adobe Flash Plugin 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_h1'] = 'Tajuk Level 1'; +$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 Dokuwiki installation instructions '; +$lang['i_funcna'] = 'Fungsi PHP %s tidak tersedia. Mungkin dinonaktifkan oleh layanan hosting Anda?'; +$lang['i_phpver'] = 'Versi PHP Anda %s lebih rendah dari yang dibutuhkan %s. Mohon melakukan upgrade.'; +$lang['i_permfail'] = '%s tidak dapat ditulis oleh DokuWiki. Anda harus memperbaiki konfigurasi hak akses untuk direktori tersebut.'; +$lang['i_confexists'] = '%s sudah ada'; +$lang['i_writeerr'] = 'Tidak dapat membuat %s. Anda harus memeriksa konfigurasi hak akses direktori/berkas dan membuatnya secara manual.'; +$lang['i_badhash'] = 'dokuwiki.php tidak dikenal atau sudah diubah (hash=%s)'; +$lang['i_badval'] = '%s - tidak valid atau belum diisi'; +$lang['i_success'] = 'Konfigurasi telah berhasil. Anda boleh menghapus berkas install.php sekarang. Lanjutkan ke DokuWiki baru Anda.'; +$lang['i_failure'] = 'Terdapat beberapa kesalahan dalam menulis berkas konfigurasi. Anda harus memperbaikinnya sendiri sebelum dapat menggunakan DokuWiki baru Anda.'; +$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/inc/lang/id/locked.txt b/inc/lang/id/locked.txt new file mode 100644 index 0000000..8147717 --- /dev/null +++ b/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/inc/lang/id/login.txt b/inc/lang/id/login.txt new file mode 100644 index 0000000..ca91919 --- /dev/null +++ b/inc/lang/id/login.txt @@ -0,0 +1,3 @@ +====== Login ====== + +Anda belum login! Masukkan data autentifikasi dibawah ini untuk masuk log (login). Cookies harus diaktifkan agar bisa login. diff --git a/inc/lang/id/mailtext.txt b/inc/lang/id/mailtext.txt new file mode 100644 index 0000000..df9699e --- /dev/null +++ b/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/inc/lang/id/newpage.txt b/inc/lang/id/newpage.txt new file mode 100644 index 0000000..f2aaa86 --- /dev/null +++ b/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/inc/lang/id/norev.txt b/inc/lang/id/norev.txt new file mode 100644 index 0000000..cd60caf --- /dev/null +++ b/inc/lang/id/norev.txt @@ -0,0 +1,3 @@ +====== Revisi tidak tersedia ====== + +Revisi yang diinginkan tidak ada. Gunakan tombol ''Revisi Lama'' untuk menampilkan daftar revisi lama dari dokumen ini. diff --git a/inc/lang/id/password.txt b/inc/lang/id/password.txt new file mode 100644 index 0000000..285915c --- /dev/null +++ b/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/inc/lang/id/preview.txt b/inc/lang/id/preview.txt new file mode 100644 index 0000000..73a145f --- /dev/null +++ b/inc/lang/id/preview.txt @@ -0,0 +1,3 @@ +====== Preview ====== + +Ini adalah preview tentang bagimana tulisan Anda akan ditampilkan. **Ingat: tulisan ini belum disimpan**! diff --git a/inc/lang/id/pwconfirm.txt b/inc/lang/id/pwconfirm.txt new file mode 100644 index 0000000..a787792 --- /dev/null +++ b/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/inc/lang/id/read.txt b/inc/lang/id/read.txt new file mode 100644 index 0000000..f11d600 --- /dev/null +++ b/inc/lang/id/read.txt @@ -0,0 +1 @@ +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/inc/lang/id/recent.txt b/inc/lang/id/recent.txt new file mode 100644 index 0000000..ef8d461 --- /dev/null +++ b/inc/lang/id/recent.txt @@ -0,0 +1,3 @@ +====== Perubahan ====== + +Berikut ini adalah halaman-halaman yang baru saja diubah: diff --git a/inc/lang/id/register.txt b/inc/lang/id/register.txt new file mode 100644 index 0000000..289da68 --- /dev/null +++ b/inc/lang/id/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/id/registermail.txt b/inc/lang/id/registermail.txt new file mode 100644 index 0000000..5943e35 --- /dev/null +++ b/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/inc/lang/id/resendpwd.txt b/inc/lang/id/resendpwd.txt new file mode 100644 index 0000000..276b292 --- /dev/null +++ b/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/inc/lang/id/resetpwd.txt b/inc/lang/id/resetpwd.txt new file mode 100644 index 0000000..43a0a97 --- /dev/null +++ b/inc/lang/id/resetpwd.txt @@ -0,0 +1,3 @@ +====== Atur sandi baru ====== + +Silakan masukkan sandi baru untuk akun Anda di wiki ini. diff --git a/inc/lang/id/revisions.txt b/inc/lang/id/revisions.txt new file mode 100644 index 0000000..b408b55 --- /dev/null +++ b/inc/lang/id/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/id/searchpage.txt b/inc/lang/id/searchpage.txt new file mode 100644 index 0000000..5a04beb --- /dev/null +++ b/inc/lang/id/searchpage.txt @@ -0,0 +1,3 @@ +====== Pencarian ====== + +Anda dapat menemukan hasil pencarian dibawah ini. @CREATEPAGEINFO@ diff --git a/inc/lang/id/showrev.txt b/inc/lang/id/showrev.txt new file mode 100644 index 0000000..27f0c64 --- /dev/null +++ b/inc/lang/id/showrev.txt @@ -0,0 +1,2 @@ +**Ini adalah dokumen versi lama!** +---- diff --git a/inc/lang/id/stopwords.txt b/inc/lang/id/stopwords.txt new file mode 100644 index 0000000..9b1ca74 --- /dev/null +++ b/inc/lang/id/stopwords.txt @@ -0,0 +1,36 @@ +# 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 +adalah +and +are +com +dan +for +from +how +into +jika +kemudian +lalu +maka +that +the +their +them +this +und +untuk +was +what +when +where +who +will +with +www +yang +you +your diff --git a/inc/lang/id/subscr_digest.txt b/inc/lang/id/subscr_digest.txt new file mode 100644 index 0000000..2a5176b --- /dev/null +++ b/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/inc/lang/id/updateprofile.txt b/inc/lang/id/updateprofile.txt new file mode 100644 index 0000000..b7f71a1 --- /dev/null +++ b/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/inc/lang/id/uploadmail.txt b/inc/lang/id/uploadmail.txt new file mode 100644 index 0000000..bb5f5e8 --- /dev/null +++ b/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/inc/lang/is/adminplugins.txt b/inc/lang/is/adminplugins.txt new file mode 100644 index 0000000..ce7b9d3 --- /dev/null +++ b/inc/lang/is/adminplugins.txt @@ -0,0 +1 @@ +===== Aðrar viðbætur ===== \ No newline at end of file diff --git a/inc/lang/is/diff.txt b/inc/lang/is/diff.txt new file mode 100644 index 0000000..1b94e86 --- /dev/null +++ b/inc/lang/is/diff.txt @@ -0,0 +1,3 @@ +===== Breytingar ===== + +Hér sést hvað hefur breyst á milli útgáfna. diff --git a/inc/lang/is/jquery.ui.datepicker.js b/inc/lang/is/jquery.ui.datepicker.js new file mode 100644 index 0000000..c453fa4 --- /dev/null +++ b/inc/lang/is/jquery.ui.datepicker.js @@ -0,0 +1,48 @@ +/* Icelandic initialisation for the jQuery UI date picker plugin. */ +/* Written by Haukur H. Thorsson (haukur@eskill.is). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.is = { + closeText: "Loka", + prevText: "Fyrri", + nextText: "Næsti ", + 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/inc/lang/is/lang.php b/inc/lang/is/lang.php new file mode 100644 index 0000000..8837f03 --- /dev/null +++ b/inc/lang/is/lang.php @@ -0,0 +1,185 @@ + + * @author Ólafur Gunnlaugsson + * @author Erik Bjørn Pedersen + */ +$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['btn_img_backto'] = 'Aftur til %s'; +$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['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['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['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 Adobe Flash viðbót 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['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/inc/lang/is/login.txt b/inc/lang/is/login.txt new file mode 100644 index 0000000..a8b0d29 --- /dev/null +++ b/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. diff --git a/inc/lang/is/recent.txt b/inc/lang/is/recent.txt new file mode 100644 index 0000000..291cb99 --- /dev/null +++ b/inc/lang/is/recent.txt @@ -0,0 +1,3 @@ +===== Nýlegar Breytingar ===== + +Eftirfarandi síðum hefur nýlega verið breytt: diff --git a/inc/lang/is/resendpwd.txt b/inc/lang/is/resendpwd.txt new file mode 100644 index 0000000..08ad909 --- /dev/null +++ b/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. diff --git a/inc/lang/it/admin.txt b/inc/lang/it/admin.txt new file mode 100644 index 0000000..55e854e --- /dev/null +++ b/inc/lang/it/admin.txt @@ -0,0 +1,3 @@ +====== Amministrazione ====== + +Qui sotto puoi trovare una lista delle possibili azioni amministrative attualmente disponibili in Dokuwiki. diff --git a/inc/lang/it/adminplugins.txt b/inc/lang/it/adminplugins.txt new file mode 100644 index 0000000..4f17d6d --- /dev/null +++ b/inc/lang/it/adminplugins.txt @@ -0,0 +1 @@ +===== Plugin aggiuntivi ===== \ No newline at end of file diff --git a/inc/lang/it/backlinks.txt b/inc/lang/it/backlinks.txt new file mode 100644 index 0000000..1af1359 --- /dev/null +++ b/inc/lang/it/backlinks.txt @@ -0,0 +1,3 @@ +====== Puntano qui ====== + +Questa è una lista delle pagine che sembrano avere un collegamento alla pagina attuale. diff --git a/inc/lang/it/conflict.txt b/inc/lang/it/conflict.txt new file mode 100644 index 0000000..16af3e1 --- /dev/null +++ b/inc/lang/it/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/it/denied.txt b/inc/lang/it/denied.txt new file mode 100644 index 0000000..7ef8722 --- /dev/null +++ b/inc/lang/it/denied.txt @@ -0,0 +1,3 @@ +====== Accesso negato ====== + +Non hai i diritti per continuare. diff --git a/inc/lang/it/diff.txt b/inc/lang/it/diff.txt new file mode 100644 index 0000000..d4d89f1 --- /dev/null +++ b/inc/lang/it/diff.txt @@ -0,0 +1,3 @@ +====== Differenze ====== + +Queste sono le differenze tra la revisione selezionata e la versione attuale della pagina. diff --git a/inc/lang/it/draft.txt b/inc/lang/it/draft.txt new file mode 100644 index 0000000..6468c70 --- /dev/null +++ b/inc/lang/it/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/it/edit.txt b/inc/lang/it/edit.txt new file mode 100644 index 0000000..16aef89 --- /dev/null +++ b/inc/lang/it/edit.txt @@ -0,0 +1 @@ +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/inc/lang/it/editrev.txt b/inc/lang/it/editrev.txt new file mode 100644 index 0000000..bd25505 --- /dev/null +++ b/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. +---- diff --git a/inc/lang/it/index.txt b/inc/lang/it/index.txt new file mode 100644 index 0000000..283f4dc --- /dev/null +++ b/inc/lang/it/index.txt @@ -0,0 +1,3 @@ +====== Indice ====== + +Questo è un indice di tutte le pagine disponibili ordinate per [[doku>it:namespaces|categorie]]. diff --git a/inc/lang/it/install.html b/inc/lang/it/install.html new file mode 100644 index 0000000..f1f27f9 --- /dev/null +++ b/inc/lang/it/install.html @@ -0,0 +1,7 @@ +

    Questa pagina ti assisterà durante l'installazione e la prima configurazione di Dokuwiki. Ulteriori informazioni sulla procedura di installazione sono reperibili nella pagina di documentazione.

    + +

    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 deve 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).

    + +

    Questa procedura di installazione imposterà la configurazione di DokuWiki per l'uso di ACL, 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.

    + +

    Gli utenti esperti o con particolari esigenze di installazione dovrebbero far riferimento ai seguenti link per dettagli sulle istruzioni per l'installazione e sui parametri di configurazione.

    diff --git a/inc/lang/it/jquery.ui.datepicker.js b/inc/lang/it/jquery.ui.datepicker.js new file mode 100644 index 0000000..d1d4980 --- /dev/null +++ b/inc/lang/it/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Italian initialisation for the jQuery UI date picker plugin. */ +/* Written by Antonello Pasella (antonello.pasella@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.it = { + closeText: "Chiudi", + prevText: "Prec", + nextText: "Succ", + 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/inc/lang/it/lang.php b/inc/lang/it/lang.php new file mode 100644 index 0000000..5267c96 --- /dev/null +++ b/inc/lang/it/lang.php @@ -0,0 +1,388 @@ + + * @author Dario + * @author Filippo + * @author Roberto Bellingeri + * @author Eddy + * @author Riccardo + * @author Stefano + * @author damiano + * @author Torpedo + * @author Giorgio Vecchiocattivi + * @author Roberto Bolli [http://www.rbnet.it/] + * @author Silvia Sargentoni + * @author Diego Pierotto + * @author Lorenzo Breda + * @author robocap + * @author Matteo Carnevali + * @author Osman Tekin + * @author Jacopo Corbetta + * @author Matteo Pasotti + * @author Edmondo Di Tucci + * @author Claudio Lanconelli + * @author Mirko + * @author Francesco + * @author Fabio + * @author Maurizio + * @author Paolo + */ +$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['js']['data_insecure'] = 'ATTENZIONE: sembra che la cartella "data" non sia adeguatamente protetta. Vedi Sicurezza Accesso Web in DokuWiki.'; +$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['search_past_7_days'] = 'scorsa settimana'; +$lang['search_past_month'] = 'scorso mese'; +$lang['search_past_year'] = 'scorso anno'; +$lang['search_sort_by_hits'] = 'ordinato per selezione'; +$lang['search_sort_by_mtime'] = 'ordinato per ultima modifica'; +$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.
    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['allowedmime'] = 'Elenco delle estensioni di file consentite'; +$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['unknowndate'] = 'Data sconosciuta'; +$lang['noflash'] = 'E\' necessario il plugin Adobe Flash 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 +istruzioni per l\'installazione di Dokuwiki'; +$lang['i_funcna'] = 'La funzione PHP %s non è disponibile. Forse è stata disabilitata dal tuo provider per qualche motivo?'; +$lang['i_disabled'] = 'E\' stato disabilitato dal tuo provider di servizi.'; +$lang['i_funcnmail'] = 'Nota: La funzione mail PHP non è disponibile. %s Se rimane non disponibile, puoi provare ad installare smtp plugin.'; +$lang['i_phpver'] = 'La versione di PHP %s è inferiore a quella richiesta %s. Devi aggiornare l\'installazione di PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload deve essere disabilitato in php.ini per eseguire DokuWiki.'; +$lang['i_urandom'] = 'DokuWiki non può creare un numero crittograficamente sicuro di cookies. Puoi provare a controllare sulle impostazioni open_basedir su php.ini per un corretto /dev/urandom accesso.'; +$lang['i_permfail'] = 'DokuWiki non può scrivere %s. E\' necessario correggere i permessi per questa directory!'; +$lang['i_confexists'] = '%s esiste già'; +$lang['i_writeerr'] = 'Impossibile creare %s. E\' necessario verificare i permessi della directory o del file oppure creare il file manualmente.'; +$lang['i_badhash'] = 'dokuwiki.php (hash=%s) non riconosciuto o modificato'; +$lang['i_badval'] = '%s - valore vuoto o non valido'; +$lang['i_success'] = 'La configurazione è stata completata correttamente. Ora è possibile eliminare il file install.php. Poi, visita il tuo nuovo DokuWiki.'; +$lang['i_failure'] = 'Si sono verificati errori durante la scrittura dei file di configurazione. Potrebbe essere necessario correggerli manualmente prima di poter utilizzare il tuo nuovo DokuWiki.'; +$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 %s. Puoi anche vedere le modifiche recenti dell\'intero wiki.'; +$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['email_fail'] = 'PHP mail () è assente o disabilitato. La seguente email non è stata inviata:'; +$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 %s.'; +$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/inc/lang/it/locked.txt b/inc/lang/it/locked.txt new file mode 100644 index 0000000..a655ffc --- /dev/null +++ b/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/inc/lang/it/login.txt b/inc/lang/it/login.txt new file mode 100644 index 0000000..1dcb1ff --- /dev/null +++ b/inc/lang/it/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/it/mailtext.txt b/inc/lang/it/mailtext.txt new file mode 100644 index 0000000..3374d37 --- /dev/null +++ b/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/inc/lang/it/mailwrap.html b/inc/lang/it/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/it/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/it/newpage.txt b/inc/lang/it/newpage.txt new file mode 100644 index 0000000..4470f9c --- /dev/null +++ b/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/inc/lang/it/norev.txt b/inc/lang/it/norev.txt new file mode 100644 index 0000000..91ef751 --- /dev/null +++ b/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/inc/lang/it/onceexisted.txt b/inc/lang/it/onceexisted.txt new file mode 100644 index 0000000..28991a5 --- /dev/null +++ b/inc/lang/it/onceexisted.txt @@ -0,0 +1,3 @@ +======= Questa pagina non esiste più ====== + +Hai seguito un link ad una pagina che non esiste più. Puoi controllare la lista delle **vecchie revisioni** per vedere quando e perchè è stata cancellata, accedere alle vecchie revisioni o ripristinarla. diff --git a/inc/lang/it/password.txt b/inc/lang/it/password.txt new file mode 100644 index 0000000..f7ca9e9 --- /dev/null +++ b/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/inc/lang/it/preview.txt b/inc/lang/it/preview.txt new file mode 100644 index 0000000..fa0e097 --- /dev/null +++ b/inc/lang/it/preview.txt @@ -0,0 +1,3 @@ +====== Anteprima ====== + +Questa è un'anteprima di come apparirà il tuo testo. **Attenzione: la pagina non è ancora stata salvata**! diff --git a/inc/lang/it/pwconfirm.txt b/inc/lang/it/pwconfirm.txt new file mode 100644 index 0000000..13a8b45 --- /dev/null +++ b/inc/lang/it/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/it/read.txt b/inc/lang/it/read.txt new file mode 100644 index 0000000..0a72454 --- /dev/null +++ b/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/inc/lang/it/recent.txt b/inc/lang/it/recent.txt new file mode 100644 index 0000000..87f20e8 --- /dev/null +++ b/inc/lang/it/recent.txt @@ -0,0 +1,3 @@ +====== Ultime modifiche ====== + +Queste sono le ultime pagine modificate: diff --git a/inc/lang/it/register.txt b/inc/lang/it/register.txt new file mode 100644 index 0000000..f3dd8b4 --- /dev/null +++ b/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>it:pagename|nomi delle pagine]]. diff --git a/inc/lang/it/registermail.txt b/inc/lang/it/registermail.txt new file mode 100644 index 0000000..77454cd --- /dev/null +++ b/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/inc/lang/it/resendpwd.txt b/inc/lang/it/resendpwd.txt new file mode 100644 index 0000000..54604d7 --- /dev/null +++ b/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/inc/lang/it/resetpwd.txt b/inc/lang/it/resetpwd.txt new file mode 100644 index 0000000..5959b25 --- /dev/null +++ b/inc/lang/it/resetpwd.txt @@ -0,0 +1,3 @@ +====== Impostare la nuova password ====== + +Inserisci perfavore una nuova password per il tuo account su questo wiki. diff --git a/inc/lang/it/revisions.txt b/inc/lang/it/revisions.txt new file mode 100644 index 0000000..19c501b --- /dev/null +++ b/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/inc/lang/it/searchpage.txt b/inc/lang/it/searchpage.txt new file mode 100644 index 0000000..089a089 --- /dev/null +++ b/inc/lang/it/searchpage.txt @@ -0,0 +1,3 @@ +====== Cerca ====== + +Questi sono i risultati della ricerca. @CREATEPAGEINFO@ diff --git a/inc/lang/it/showrev.txt b/inc/lang/it/showrev.txt new file mode 100644 index 0000000..7c184f2 --- /dev/null +++ b/inc/lang/it/showrev.txt @@ -0,0 +1,2 @@ +**Questa è una vecchia versione del documento!** +---- diff --git a/inc/lang/it/stopwords.txt b/inc/lang/it/stopwords.txt new file mode 100644 index 0000000..57d840f --- /dev/null +++ b/inc/lang/it/stopwords.txt @@ -0,0 +1,120 @@ +# 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 +www diff --git a/inc/lang/it/subscr_digest.txt b/inc/lang/it/subscr_digest.txt new file mode 100644 index 0000000..29fd4bc --- /dev/null +++ b/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/inc/lang/it/subscr_form.txt b/inc/lang/it/subscr_form.txt new file mode 100644 index 0000000..54f66e4 --- /dev/null +++ b/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/inc/lang/it/subscr_list.txt b/inc/lang/it/subscr_list.txt new file mode 100644 index 0000000..f870388 --- /dev/null +++ b/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/inc/lang/it/subscr_single.txt b/inc/lang/it/subscr_single.txt new file mode 100644 index 0000000..421a156 --- /dev/null +++ b/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/inc/lang/it/updateprofile.txt b/inc/lang/it/updateprofile.txt new file mode 100644 index 0000000..71157a2 --- /dev/null +++ b/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/inc/lang/it/uploadmail.txt b/inc/lang/it/uploadmail.txt new file mode 100644 index 0000000..4dd7cd4 --- /dev/null +++ b/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/inc/lang/ja/admin.txt b/inc/lang/ja/admin.txt new file mode 100644 index 0000000..9cbc03d --- /dev/null +++ b/inc/lang/ja/admin.txt @@ -0,0 +1,3 @@ +====== 管理者メニュー ====== + +DokuWikiで使用出来る管理タスクの一覧です。 diff --git a/inc/lang/ja/adminplugins.txt b/inc/lang/ja/adminplugins.txt new file mode 100644 index 0000000..1708bbb --- /dev/null +++ b/inc/lang/ja/adminplugins.txt @@ -0,0 +1 @@ +===== 追加プラグイン ===== \ No newline at end of file diff --git a/inc/lang/ja/backlinks.txt b/inc/lang/ja/backlinks.txt new file mode 100644 index 0000000..400bd67 --- /dev/null +++ b/inc/lang/ja/backlinks.txt @@ -0,0 +1,3 @@ +====== バックリンク ====== + +このページにリンクしているページの一覧です。 diff --git a/inc/lang/ja/conflict.txt b/inc/lang/ja/conflict.txt new file mode 100644 index 0000000..5e637ff --- /dev/null +++ b/inc/lang/ja/conflict.txt @@ -0,0 +1,5 @@ +====== 新しいバージョンが存在します ====== + +編集中に他のユーザーがこの文書を更新したため、新しいバージョンの文書が存在します。 + +以下に文書間の差分を表示するので、どちらかの文書を選択してください。''保存'' を選択すると現在編集中の文書が保存されます。''キャンセル'' を選択すると編集中の文書が破棄されます。 diff --git a/inc/lang/ja/denied.txt b/inc/lang/ja/denied.txt new file mode 100644 index 0000000..b212288 --- /dev/null +++ b/inc/lang/ja/denied.txt @@ -0,0 +1,3 @@ +====== アクセスが拒否されました ====== + +申し訳ありませんが、実行する権限がありません。 diff --git a/inc/lang/ja/diff.txt b/inc/lang/ja/diff.txt new file mode 100644 index 0000000..d90edd7 --- /dev/null +++ b/inc/lang/ja/diff.txt @@ -0,0 +1,3 @@ +====== 差分 ====== + +このページの2つのバージョン間の差分を表示します。 diff --git a/inc/lang/ja/draft.txt b/inc/lang/ja/draft.txt new file mode 100644 index 0000000..d5d6084 --- /dev/null +++ b/inc/lang/ja/draft.txt @@ -0,0 +1,5 @@ +====== ドラフトファイルが存在します ====== + +このページに対する最後の編集は正しく終了しませんでした。 その編集作業を引き続き行えるよう、作業中にドラフトを自動保存しました。あなたの最後のセッションを元に保存されたデータを以下に表示しています。 + +この自動的に保存された編集内容を//復元する//か//削除する//か、もしくはこのページの編集を//キャンセル//して下さい。 diff --git a/inc/lang/ja/edit.txt b/inc/lang/ja/edit.txt new file mode 100644 index 0000000..1335157 --- /dev/null +++ b/inc/lang/ja/edit.txt @@ -0,0 +1 @@ +編集して''保存''をクリックしてください。Wikiの構文については [[wiki:syntax]] を参考にしてください。当然のことですが、この文書の質を **向上** させる場合のみ編集してください。もし編集方法や構文を練習したいのであれば [[playground:playground]] を利用してください。 diff --git a/inc/lang/ja/editrev.txt b/inc/lang/ja/editrev.txt new file mode 100644 index 0000000..5168edc --- /dev/null +++ b/inc/lang/ja/editrev.txt @@ -0,0 +1,2 @@ +**文書の過去の版を開いています**。もしこのまま保存すると、この文書が最新となります。 +---- diff --git a/inc/lang/ja/index.txt b/inc/lang/ja/index.txt new file mode 100644 index 0000000..a5515b1 --- /dev/null +++ b/inc/lang/ja/index.txt @@ -0,0 +1,3 @@ +====== サイトマップ ====== + +全ての閲覧可能なページを[[doku>ja:namespaces|名前空間]]順に並べたサイトマップです。 diff --git a/inc/lang/ja/install.html b/inc/lang/ja/install.html new file mode 100644 index 0000000..003cf9a --- /dev/null +++ b/inc/lang/ja/install.html @@ -0,0 +1,7 @@ +

    このページは、Dokuwikiのインストールと初期設定をサポートします。このインストーラーに関する詳細は documentation page を参考にしてください。

    + +

    DokuWikiは、通常のファイルにWikiページの内容と関連する情報(例えば、画像、検索インデックス、古いリビジョンなど)を保存します。そのため、DokuWikiを使用するためには、それらのファイルを保存するディレクトリに書き込みの権限が必ず必要となります。このインストーラーではディレクトリの権限の変更は行えないため、コマンドシェルで権限の変更を直接行うか、ホスティングサービスを利用している場合はそのコントロールパネルもしくはFTPを通して、権限の変更を行ってください。

    + +

    DokuWikiは、プラグイン、ユーザー、Wikiページへのアクセス制限、設定の変更を管理する機能を有しており、その機能を有効にするために必要な ACL の設定が、このインストーラーによって行われます。この管理機能は、DokuWikiを使用する上で必要ではありませんが、DokuWikiの管理を簡単にしてくれます。

    + +

    従来のバージョンを使用しているユーザーや特別なセットアップが必要な場合は、次のリンク先を参考にして下さい (installation instructions, configuration settings)。

    diff --git a/inc/lang/ja/jquery.ui.datepicker.js b/inc/lang/ja/jquery.ui.datepicker.js new file mode 100644 index 0000000..95fa6fd --- /dev/null +++ b/inc/lang/ja/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Japanese initialisation for the jQuery UI date picker plugin. */ +/* Written by Kentaro SATO (kentaro@ranvis.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.ja = { + 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/mm/dd", + firstDay: 0, + isRTL: false, + showMonthAfterYear: true, + yearSuffix: "年" }; +datepicker.setDefaults( datepicker.regional.ja ); + +return datepicker.regional.ja; + +} ); diff --git a/inc/lang/ja/lang.php b/inc/lang/ja/lang.php new file mode 100644 index 0000000..2c00896 --- /dev/null +++ b/inc/lang/ja/lang.php @@ -0,0 +1,373 @@ + + * @author HokkaidoPerson + * @author lempel + * @author Yuji Takenaka + * @author Ikuo Obataya + * @author Daniel Dupriest + * @author Kazutaka Miyasaka + * @author Taisuke Shimamoto + * @author Satoshi Sahara + * @author Hideaki SAWADA + * @author PzF_X + */ +$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 の共有フォルダへリンクは 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['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'] = '1週間以内'; +$lang['search_past_month'] = '1カ月以内'; +$lang['search_past_year'] = '1年以内'; +$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'] = 'このWikiではユーザー情報の変更は出来ません'; +$lang['profnochange'] = '変更点が無かったため,システム側では何も操作を行いませんでした.'; +$lang['profnoempty'] = 'ユーザー名とメールアドレスを入力して下さい.'; +$lang['profchanged'] = 'ユーザー情報は更新されました.'; +$lang['profnodelete'] = 'このWikiではユーザーを削除出来ません'; +$lang['profdeleteuser'] = 'アカウントの削除'; +$lang['profdeleted'] = 'あなたのユーザーアカウントはこのWikiから削除されました.'; +$lang['profconfdelete'] = 'このWikiから自分のアカウントを消去する場合はチェックボックスにチェックを入れて下さい.
    この操作は取消すことができません.'; +$lang['profconfdeletemissing'] = '確認のチェックボックスがチェックされていません.'; +$lang['proffail'] = 'ユーザー情報は更新されませんでした.'; +$lang['pwdforget'] = 'パスワードをお忘れですか?'; +$lang['resendna'] = 'このWikiではパスワードの再発行は出来ません.'; +$lang['resendpwd'] = '新しいパスワードを設定'; +$lang['resendpwdmissing'] = 'お手数ですが,全ての項目を入力して下さい.'; +$lang['resendpwdnouser'] = '恐れ入りますが,入力されたユーザーがデータベース上にありませんでした.'; +$lang['resendpwdbadauth'] = '申し訳ありませんが,この確認コードは有効ではありません.URLが一部のみ切り取られていないかどうか,メール内に記載されたリンクをご確認下さい.'; +$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'] = 'アップロード上限サイズ:1ファイルにつき%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'] = 'このファイルを使用するには次のWiki文法を使用して下さい.'; +$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['unknowndate'] = '不明な日付'; +$lang['noflash'] = 'この内容を表示するには Adobe Flash Plugin が必要です.'; +$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 に対してのみ,このスクリプトは有効です. + ダウンロードしたパッケージを再解凍して使用するか, + Dokuwiki インストールガイドを参考にしてインストールしてください.'; +$lang['i_funcna'] = 'PHPの関数 %s が使用できません.ホスティング会社が何らかの理由で無効にしている可能性があります.'; +$lang['i_disabled'] = 'ご利用のプロバイダにより制限されています.'; +$lang['i_funcnmail'] = '注:PHPの mail 関数が利用不能になっています. %s この状況が続く場合は,smtpプラグインをインストールして解決する事も出来ます.'; +$lang['i_phpver'] = 'PHPのバージョン %s が必要なバージョン %s より以前のものです.PHPのアップグレードが必要です.'; +$lang['i_mbfuncoverload'] = 'DokuWiki を実行する php.ini ファイルの mbstring.func_overload は無効にして下さい.'; +$lang['i_urandom'] = 'DokuWikiは,Cookieに対して暗号的に安全な番号を作成できません./dev/urandomに対する適切なアクセスについて,php.iniの設定 open_basedir を確認する事をお勧めします.'; +$lang['i_permfail'] = '%s に書き込みできません.このディレクトリの権限を確認して下さい.'; +$lang['i_confexists'] = '%s は既に存在します'; +$lang['i_writeerr'] = '%s を作成できません.ディレクトリとファイルの権限を確認し,それらを手動で作成する必要があります.'; +$lang['i_badhash'] = 'dokuwiki.php が認識できないか,編輯されています(hash=%s)'; +$lang['i_badval'] = '%s - 正しくない,もしくは値が空です'; +$lang['i_success'] = '設定ファイルは正しく作成されました.install.phpは,もう削除しても構いません.引き続き,作成したDokuWikiをご利用下さい.'; +$lang['i_failure'] = '設定ファイルの作成中にエラーが発生しました.作成した DokuWikiを使用する前に,それらの問題を手動で修正する必要があります.'; +$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'] = '現在,名前空間 %s 内の変更を閲覧中です.Wiki全体の最近の変更の確認もできます.'; +$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'] = '閲覧権限の無いページや非表示ページは表示されないので,このリストは完全でない場合があります.'; +$lang['email_fail'] = 'PHPの mail() が欠落しているか無効になっています.次のEメールが送信されませんでした.'; +$lang['currentns'] = '現在の名前空間'; +$lang['searchresult'] = '検索結果'; +$lang['plainhtml'] = 'プレーンHTML'; +$lang['wikimarkup'] = 'Wikiマークアップ'; +$lang['page_nonexist_rev'] = '指定ページ %s はありません.このリンク %s から作成できます.'; +$lang['unable_to_parse_date'] = 'パラメータ "%s" を処理できません.'; +$lang['email_signature_text'] = 'このメールは次のDokuWikiより自動的に送信されています. +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = 'ログファイルが大きすぎます.前の行をスキップしました!'; +$lang['log_file_failed_to_open'] = 'ログファイルを開けませんでした.'; +$lang['log_file_failed_to_read'] = 'ログの読み込み中にエラーが発生しました.'; diff --git a/inc/lang/ja/locked.txt b/inc/lang/ja/locked.txt new file mode 100644 index 0000000..d501af4 --- /dev/null +++ b/inc/lang/ja/locked.txt @@ -0,0 +1,3 @@ +====== 文書ロック中 ====== + +この文書は、他のユーザーが編集中のためロックされています。編集が完了するか、ロックの期限が切れるまでお待ち下さい。 diff --git a/inc/lang/ja/login.txt b/inc/lang/ja/login.txt new file mode 100644 index 0000000..34b41fd --- /dev/null +++ b/inc/lang/ja/login.txt @@ -0,0 +1,3 @@ +====== ログイン ====== + +現在ログインしていません。ログインするには、以下にユーザー名とパスワードを入力して下さい(Cookieを有効にする必要があります)。 diff --git a/inc/lang/ja/mailtext.txt b/inc/lang/ja/mailtext.txt new file mode 100644 index 0000000..7ea2636 --- /dev/null +++ b/inc/lang/ja/mailtext.txt @@ -0,0 +1,14 @@ +DokuWiki 内の文書が追加もしくは変更されました。詳細は以下の通りです。 + +ブラウザ     : @BROWSER@ +IPアドレス    : @IPADDRESS@ +ホスト名     : @HOSTNAME@ +前リビジョン   : @OLDPAGE@ +新リビジョン   : @NEWPAGE@ +新リビジョンの日付: @DATE@ +編集の概要    : @SUMMARY@ +ユーザー名    : @USER@ + +この通知の後、新たなリビジョンが追加されている可能性があります。その場合、本リビジョンのページ上部にメッセージが表示されます。 + +@DIFF@ diff --git a/inc/lang/ja/mailwrap.html b/inc/lang/ja/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/ja/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/ja/newpage.txt b/inc/lang/ja/newpage.txt new file mode 100644 index 0000000..deec746 --- /dev/null +++ b/inc/lang/ja/newpage.txt @@ -0,0 +1,3 @@ +====== この項目はまだ存在しません ====== + +この項目はまだ作成されていません。もし、文書作成の権限がある場合は、**文書の作成**をクリックして最初の文書を作成することができます。 diff --git a/inc/lang/ja/norev.txt b/inc/lang/ja/norev.txt new file mode 100644 index 0000000..bb97781 --- /dev/null +++ b/inc/lang/ja/norev.txt @@ -0,0 +1,3 @@ +====== このリビジョンは存在しません ====== + +指定されたリビジョンが存在しません。''以前のリビジョン''をクリックして、この文書の過去の版の一覧を確認してください。 diff --git a/inc/lang/ja/onceexisted.txt b/inc/lang/ja/onceexisted.txt new file mode 100644 index 0000000..3d982ce --- /dev/null +++ b/inc/lang/ja/onceexisted.txt @@ -0,0 +1,3 @@ +====== このページはもう存在しません ====== + +このページは削除されました。**以前のリビジョン**の一覧をチェックして、いつ・なぜ削除されたのか確認したり、過去の版にアクセスしたり、元に戻したり出来ます。 diff --git a/inc/lang/ja/password.txt b/inc/lang/ja/password.txt new file mode 100644 index 0000000..3e527bd --- /dev/null +++ b/inc/lang/ja/password.txt @@ -0,0 +1,6 @@ +こんにちは @FULLNAME@ さん + +@TITLE@(@DOKUWIKIURL@)に登録されたユーザー情報は以下の通りです。 + +ユーザー名 : @LOGIN@ +パスワード : @PASSWORD@ diff --git a/inc/lang/ja/preview.txt b/inc/lang/ja/preview.txt new file mode 100644 index 0000000..c0fe39d --- /dev/null +++ b/inc/lang/ja/preview.txt @@ -0,0 +1,3 @@ +====== プレビュー ====== + +編集中の文書のプレビューです。**まだ保存されていませんのでご注意下さい。** \ No newline at end of file diff --git a/inc/lang/ja/pwconfirm.txt b/inc/lang/ja/pwconfirm.txt new file mode 100644 index 0000000..c53b784 --- /dev/null +++ b/inc/lang/ja/pwconfirm.txt @@ -0,0 +1,9 @@ +こんにちは @FULLNAME@ さん + +@TITLE@(@DOKUWIKIURL@)に新規パスワード発行のリクエストがありました。 + +もしこのリクエストに覚えが無ければ、このメールは無視してください。 + +このリクエストを行った本人であれば、以下のリンクから作業を完了させてください。 + +@CONFIRM@ diff --git a/inc/lang/ja/read.txt b/inc/lang/ja/read.txt new file mode 100644 index 0000000..b48445d --- /dev/null +++ b/inc/lang/ja/read.txt @@ -0,0 +1 @@ +この文書は読取専用です。文書のソースを閲覧することは可能ですが、変更はできません。もし変更したい場合は管理者に連絡してください。 diff --git a/inc/lang/ja/recent.txt b/inc/lang/ja/recent.txt new file mode 100644 index 0000000..69d004e --- /dev/null +++ b/inc/lang/ja/recent.txt @@ -0,0 +1,3 @@ +====== 最近の変更 ====== + +最近更新されたページの一覧です。 diff --git a/inc/lang/ja/register.txt b/inc/lang/ja/register.txt new file mode 100644 index 0000000..ce18920 --- /dev/null +++ b/inc/lang/ja/register.txt @@ -0,0 +1,3 @@ +====== 新規ユーザー登録 ====== + +このWikiのユーザー登録を行うには、以下の情報を全て入力して下さい。 もし以下の項目にパスワードが存在しない場合、パスワードはメールにて送信されますので、 必ず**有効なメールアドレス**を入力してください。 また、ログイン名は[[doku>ja:pagename|ページ名]]の規則に準拠していなければなりません。 diff --git a/inc/lang/ja/registermail.txt b/inc/lang/ja/registermail.txt new file mode 100644 index 0000000..5a24840 --- /dev/null +++ b/inc/lang/ja/registermail.txt @@ -0,0 +1,10 @@ +新しいユーザーが登録されました。ユーザー情報は以下の通りです。 + +ユーザー名  : @NEWUSER@ +フルネーム  : @NEWNAME@ +メールアドレス: @NEWEMAIL@ + +登録日    : @DATE@ +ブラウザ   : @BROWSER@ +IPアドレス  : @IPADDRESS@ +ホスト名   : @HOSTNAME@ diff --git a/inc/lang/ja/resendpwd.txt b/inc/lang/ja/resendpwd.txt new file mode 100644 index 0000000..836ef71 --- /dev/null +++ b/inc/lang/ja/resendpwd.txt @@ -0,0 +1,3 @@ +====== パスワード再発行 ====== + +このWikiで使用する新しいパスワードをリクエストするには、ユーザー名を入力して下さい。 新パスワード発行リクエストの確認メールが、登録されているメールアドレスに送信されます。 diff --git a/inc/lang/ja/resetpwd.txt b/inc/lang/ja/resetpwd.txt new file mode 100644 index 0000000..b28bc37 --- /dev/null +++ b/inc/lang/ja/resetpwd.txt @@ -0,0 +1,3 @@ +====== 新しいパスワードを設定 ====== + +このWikiでお使いのアカウント用の新しいパスワードを入力して下さい。 diff --git a/inc/lang/ja/revisions.txt b/inc/lang/ja/revisions.txt new file mode 100644 index 0000000..5483d43 --- /dev/null +++ b/inc/lang/ja/revisions.txt @@ -0,0 +1,3 @@ +====== 以前のリビジョン ====== + +以下はこの文書の以前の版(リビジョン)です。過去の版から復元するには、復元したい版を選択して、''文書の編集''をクリックし、その後保存してください。 diff --git a/inc/lang/ja/searchpage.txt b/inc/lang/ja/searchpage.txt new file mode 100644 index 0000000..04af74f --- /dev/null +++ b/inc/lang/ja/searchpage.txt @@ -0,0 +1,3 @@ +====== 検索 ====== + +以下に検索結果を表示します。@CREATEPAGEINFO@ diff --git a/inc/lang/ja/showrev.txt b/inc/lang/ja/showrev.txt new file mode 100644 index 0000000..d257b0e --- /dev/null +++ b/inc/lang/ja/showrev.txt @@ -0,0 +1,2 @@ +**文書の過去の版を表示しています。** +---- diff --git a/inc/lang/ja/stopwords.txt b/inc/lang/ja/stopwords.txt new file mode 100644 index 0000000..caa8dcd --- /dev/null +++ b/inc/lang/ja/stopwords.txt @@ -0,0 +1,39 @@ +# 以下は、インデックス作成時に無視する語句のリストです。一行に一単語ずつ記入してください。 +# このファイルを編集する際は、UNIXで用いられる改行コード(LF)を使用してください。 +# 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/inc/lang/ja/subscr_digest.txt b/inc/lang/ja/subscr_digest.txt new file mode 100644 index 0000000..7315b76 --- /dev/null +++ b/inc/lang/ja/subscr_digest.txt @@ -0,0 +1,16 @@ +こんにちは。 + +@TITLE@ 内のページ @PAGE@ に変更がありました。 +変更点は以下の通りです: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +古いリビジョン: @OLDPAGE@ +新しいリビジョン: @NEWPAGE@ + +この通知を解除するには次のウィキへログインし +@DOKUWIKIURL@ +その後、以下のページからページと名前空間の変更に対する購読を解除してください。 +@SUBSCRIBE@ diff --git a/inc/lang/ja/subscr_form.txt b/inc/lang/ja/subscr_form.txt new file mode 100644 index 0000000..5767189 --- /dev/null +++ b/inc/lang/ja/subscr_form.txt @@ -0,0 +1,3 @@ +====== 購読管理 ====== + +このページで、現在のページと名前空間に対する購読を管理することができます。 \ No newline at end of file diff --git a/inc/lang/ja/subscr_list.txt b/inc/lang/ja/subscr_list.txt new file mode 100644 index 0000000..3b841ea --- /dev/null +++ b/inc/lang/ja/subscr_list.txt @@ -0,0 +1,13 @@ +こんにちは。 + +@TITLE@ の 名前空間 @PAGE@ にあるページに変更がありました。 +変更点は以下の通りです: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +この通知を解除するには次のウィキへログインし +@DOKUWIKIURL@ +その後、以下のページからページと名前空間の変更に対する購読を解除してください。 +@SUBSCRIBE@ diff --git a/inc/lang/ja/subscr_single.txt b/inc/lang/ja/subscr_single.txt new file mode 100644 index 0000000..68190bf --- /dev/null +++ b/inc/lang/ja/subscr_single.txt @@ -0,0 +1,19 @@ +こんにちは。 + +@TITLE@ のウィキにあるページ @PAGE@ に変更がありました。 +変更点は以下の通りです: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +ユーザー       : @USER@ +編集の概要      : @SUMMARY@ +古いリビジョン    : @OLDPAGE@ +新しいリビジョン   : @NEWPAGE@ +新しいリビジョンの日付: @DATE@ + +この通知を解除するには次のウィキへログインし +@DOKUWIKIURL@ +その後、以下のページからページと名前空間の変更に対する購読を解除してください。 +@SUBSCRIBE@ diff --git a/inc/lang/ja/updateprofile.txt b/inc/lang/ja/updateprofile.txt new file mode 100644 index 0000000..2109697 --- /dev/null +++ b/inc/lang/ja/updateprofile.txt @@ -0,0 +1,3 @@ +====== アカウント情報更新 ====== + +変更したい項目のみ書き換えて下さい。ユーザー名は変更できません。 diff --git a/inc/lang/ja/uploadmail.txt b/inc/lang/ja/uploadmail.txt new file mode 100644 index 0000000..11fa1a4 --- /dev/null +++ b/inc/lang/ja/uploadmail.txt @@ -0,0 +1,11 @@ +お使いのDokuWikiにファイルがアップロードされました。詳細は以下の通りです。 + +ファイル : @MEDIA@ +古い版  : @OLD@ +日付   : @DATE@ +ブラウザ : @BROWSER@ +IPアドレス: @IPADDRESS@ +ホスト名 : @HOSTNAME@ +サイズ  : @SIZE@ +MIMEタイプ: @MIME@ +ユーザー名: @USER@ diff --git a/inc/lang/ka/admin.txt b/inc/lang/ka/admin.txt new file mode 100644 index 0000000..ff15020 --- /dev/null +++ b/inc/lang/ka/admin.txt @@ -0,0 +1,3 @@ +====== მართვა ====== + +ქვემოთ თქვენ ხედავთ ადმინისტრაციული ოპერაციების სიას «დოკუვიკიში». diff --git a/inc/lang/ka/adminplugins.txt b/inc/lang/ka/adminplugins.txt new file mode 100644 index 0000000..011bfeb --- /dev/null +++ b/inc/lang/ka/adminplugins.txt @@ -0,0 +1 @@ +===== დამატებითი პლაგინები ===== \ No newline at end of file diff --git a/inc/lang/ka/backlinks.txt b/inc/lang/ka/backlinks.txt new file mode 100644 index 0000000..57daed7 --- /dev/null +++ b/inc/lang/ka/backlinks.txt @@ -0,0 +1,3 @@ +====== გადმომისამართება ====== + +გვერდები რომლებიც ანიშნებენ ამ გვერდზე. diff --git a/inc/lang/ka/conflict.txt b/inc/lang/ka/conflict.txt new file mode 100644 index 0000000..2d1fb76 --- /dev/null +++ b/inc/lang/ka/conflict.txt @@ -0,0 +1,5 @@ +====== გამოვიდა უფრო ახალი ვერსია ====== + +არსებობს დოკუმენტის უფრო ახალი ვერსია, რომელიც თქვენ დაარედაქტირეთ. ეს ხდება მაშინ, როდესაც სხვა მომხმარებელი არედაქტირებს დოკუმენტს, სანამ თქვენ აკეთებდით იგივეს. + +ყურადღებით დააკვირდით ქვემოთ მოყვანილ განსხვავებებს, და გადაწყვიტეთ რომელი ვერსია სჯობს. თუ შენახვას დააჭერთ, თქვენი ვერსია შეინახება. diff --git a/inc/lang/ka/denied.txt b/inc/lang/ka/denied.txt new file mode 100644 index 0000000..bb89104 --- /dev/null +++ b/inc/lang/ka/denied.txt @@ -0,0 +1,3 @@ +====== მიუწვდომელია ====== + +თქვენ არ გაქვთ საკმარისი უფლებები. იქნებ ავტორიზაცია დაგავიწყდათ? diff --git a/inc/lang/ka/diff.txt b/inc/lang/ka/diff.txt new file mode 100644 index 0000000..502aef2 --- /dev/null +++ b/inc/lang/ka/diff.txt @@ -0,0 +1,3 @@ +====== განსხვავებები ====== + +ქვემოთ მოყვანილაი განსხვავებები მსგავს გვერდებს შორის. diff --git a/inc/lang/ka/draft.txt b/inc/lang/ka/draft.txt new file mode 100644 index 0000000..0c344d9 --- /dev/null +++ b/inc/lang/ka/draft.txt @@ -0,0 +1,3 @@ +====== ნაპოვნია ჩანაწერი ====== + +გვერდის რედაქტირება არ იყო დამთავრებული. diff --git a/inc/lang/ka/edit.txt b/inc/lang/ka/edit.txt new file mode 100644 index 0000000..3504888 --- /dev/null +++ b/inc/lang/ka/edit.txt @@ -0,0 +1 @@ +დაარედაქტირეთ გვერდი და დააჭირეთ «შენახვას». წაიკითხეთ [[wiki:syntax|FAQ]] ვიკის სინტაქსისთან გასაცნობად. დაარედაქტირეთ გვერდი მხოლოდ იმ შემთხვევაში თუ აპირებთ გვერდის გაუმჯობესებას. თუ თქვენ რამის დატესტვა გინდათ, გამოიყენეთ სპეციალური გვერდი. diff --git a/inc/lang/ka/editrev.txt b/inc/lang/ka/editrev.txt new file mode 100644 index 0000000..17ccff5 --- /dev/null +++ b/inc/lang/ka/editrev.txt @@ -0,0 +1,2 @@ +**თქვენ ატვირთეთ დოკუმენტის ძველი ვერსია** მისი შენახვით თქვენ შექმნით ახალ ვერსიას იგივე შიგთავსით. +---- diff --git a/inc/lang/ka/index.txt b/inc/lang/ka/index.txt new file mode 100644 index 0000000..8c86265 --- /dev/null +++ b/inc/lang/ka/index.txt @@ -0,0 +1,3 @@ +====== სტატიები ====== + +აქ ნაჩვენებია ყველა სტატია diff --git a/inc/lang/ka/jquery.ui.datepicker.js b/inc/lang/ka/jquery.ui.datepicker.js new file mode 100644 index 0000000..d347de8 --- /dev/null +++ b/inc/lang/ka/jquery.ui.datepicker.js @@ -0,0 +1,51 @@ +/* Georgian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Lado Lomidze (lado.lomidze@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.ka = { + 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.ka ); + +return datepicker.regional.ka; + +} ); diff --git a/inc/lang/ka/lang.php b/inc/lang/ka/lang.php new file mode 100644 index 0000000..046a8a7 --- /dev/null +++ b/inc/lang/ka/lang.php @@ -0,0 +1,280 @@ + + * @author Tengiz + * @author Luka Lejava + */ +$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'] = 'მე მსურს პროფილის წაშლა.
    თქვენ აღარ გექნებათ საშუალება აღადგინოთ პროფილი.'; +$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'] = 'ფაილის გაფართოება შეიცვალა .%s დან .%s!'; +$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'] = 'საჭიროა Adobe Flash Plugin'; +$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/inc/lang/kk/jquery.ui.datepicker.js b/inc/lang/kk/jquery.ui.datepicker.js new file mode 100644 index 0000000..20a8486 --- /dev/null +++ b/inc/lang/kk/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Kazakh (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Dmitriy Karasyov (dmitriy.karasyov@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.kk = { + 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.kk ); + +return datepicker.regional.kk; + +} ); diff --git a/inc/lang/kk/lang.php b/inc/lang/kk/lang.php new file mode 100644 index 0000000..cb224d9 --- /dev/null +++ b/inc/lang/kk/lang.php @@ -0,0 +1,129 @@ +>'; +$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/inc/lang/km/admin.txt b/inc/lang/km/admin.txt new file mode 100644 index 0000000..7403411 --- /dev/null +++ b/inc/lang/km/admin.txt @@ -0,0 +1,3 @@ +====== អ្នកគ្រោង ====== + +ខាងក្រោមជាប្រដបប្រដារបស់អ្នកគ្រោង ឌោគូវីគី។ diff --git a/inc/lang/km/backlinks.txt b/inc/lang/km/backlinks.txt new file mode 100644 index 0000000..ef97951 --- /dev/null +++ b/inc/lang/km/backlinks.txt @@ -0,0 +1,3 @@ +====== ខ្សែដំណរក្រោយ ====== + +នេះជាទំព័រដែលមានដំណរបណ្តពីទំព័រឥឡូវ។ diff --git a/inc/lang/km/conflict.txt b/inc/lang/km/conflict.txt new file mode 100644 index 0000000..718df8f --- /dev/null +++ b/inc/lang/km/conflict.txt @@ -0,0 +1,3 @@ +====== មានបុនរាព្រឹត្តិថ្មីៗ ====== + +មានបុនរាព្រឹត្តិថ្មី diff --git a/inc/lang/km/denied.txt b/inc/lang/km/denied.txt new file mode 100644 index 0000000..a5056cb --- /dev/null +++ b/inc/lang/km/denied.txt @@ -0,0 +1,3 @@ +====== បដិសេធអនុញ្ញាត ====== + +សូមទុស អ្នកគ្មានអនុញ្ញាតទៅបណ្តទេ។ diff --git a/inc/lang/km/edit.txt b/inc/lang/km/edit.txt new file mode 100644 index 0000000..089a432 --- /dev/null +++ b/inc/lang/km/edit.txt @@ -0,0 +1 @@ +កែតម្រូវទំព័រនេះហើយ ចុច«រក្សាតុក»។ មើល [[wiki:syntax|វាក្យ​សម្ពន្ធ]] ជាកម្នូវីគី។ សំកែសម្រួលបើអ្នកអាច**ច្នៃចរើន**វា។ បើអ្នកចង់សាកពិសោតអ្វីមួយ សំរៀននៅក្នុង [[playground:playground|playground]]។ diff --git a/inc/lang/km/editrev.txt b/inc/lang/km/editrev.txt new file mode 100644 index 0000000..097c1da --- /dev/null +++ b/inc/lang/km/editrev.txt @@ -0,0 +1,2 @@ +**អ្នក ឯក្សារចាស់!** បើអ្នករក្សាវា អ្នកគុង់តែបង្កើត ថ្មីជាមួយទិន្នន័យនេះ។ +---- diff --git a/inc/lang/km/index.txt b/inc/lang/km/index.txt new file mode 100644 index 0000000..9f15c4b --- /dev/null +++ b/inc/lang/km/index.txt @@ -0,0 +1,3 @@ +====== លិបិក្រម ====== + +នេះជាលិបិក្រមទំព័រទាំងឡាយបញ្ជាដោយ [[doku>wiki:namespaces|ដ្ឋាននាម]] ។ diff --git a/inc/lang/km/jquery.ui.datepicker.js b/inc/lang/km/jquery.ui.datepicker.js new file mode 100644 index 0000000..ab3d89a --- /dev/null +++ b/inc/lang/km/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Khmer initialisation for the jQuery calendar extension. */ +/* Written by Chandara Om (chandara.teacher@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/km/lang.php b/inc/lang/km/lang.php new file mode 100644 index 0000000..8f97465 --- /dev/null +++ b/inc/lang/km/lang.php @@ -0,0 +1,201 @@ + + * @author no credits taken + * @author Ratana Lim + */ +$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_register'] = 'ចុះឈ្មោះ'; +$lang['btn_img_backto'] = 'ថយក្រោយ%s'; +$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['js']['willexpire'] = 'សោអ្នកចំពោះកែតម្រូវទំព័រនេះ ហួសពែលក្នុងមួយនាទី។\nកុំឲ្យមានជម្លោះ ប្រើ «បង្ហាញ»​ ទៅកំណត់​ឡើង​វិញ។'; +$lang['js']['notsavedyet'] = 'កម្រែមិនទានរុក្សាទកត្រូវបោះបង់។\nបន្តទៅទាឬទេ?'; +$lang['js']['keepopen'] = 'ទុកបង្អួចបើក ពេលការជម្រើស'; +$lang['js']['hidedetails'] = 'បាំង'; +$lang['js']['medialeft'] = 'តម្រឹមរូបភាពនៅខាងឆ្វេង។'; +$lang['js']['mediaright'] = 'តម្រឹមរូបភាពនៅខាងស្តាំ។'; +$lang['js']['mediacenter'] = 'តម្រឹមរូបភាពនៅកណ្តាល។'; +$lang['js']['medianoalign'] = 'កុំប្រើតម្រឹម។'; +$lang['js']['del_confirm'] = 'លុប'; +$lang['js']['media_diff'] = 'មើលអ្វីដែលខុសគ្នា:'; +$lang['js']['media_upload_btn'] = 'ផ្ទុកឡើង'; +$lang['js']['media_done_btn'] = 'ការបានបញ្ចប់'; +$lang['js']['media_cancel'] = 'លុបចេញ'; +$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['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'] = 'កត់ពីលើ'; +$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['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['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_subscribe_list'] = 'ទំព័រដែលបានផ្លាស់ប្តូរនៅខាងក្នុងដ្ឋាននាមនេះ'; +$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'] = 'ដំឡើងឌោគូវីគី'; +$lang['i_wikiname'] = 'នាមវីគី'; +$lang['i_enableacl'] = 'បើកប្រើ (អនុសាស)'; +$lang['i_superuser'] = 'អ្នកកំពូល'; +$lang['i_problems'] = 'កម្មវិធី​ដំឡើងបានប៉ះឧបសគ្គ។ អ្នកមិនអាចបន្តទៅទៀត ដល់អ្នកជួសជុលវា។'; +$lang['i_permfail'] = '%s មិនអាចសាស'; +$lang['i_confexists'] = '%s មានហាយ'; +$lang['i_writeerr'] = 'មិនអាចបណ្កើ%s។ អ្នកត្រវការពិនិត្យអធិក្រឹតិរបស់ថតនឹងឯកសារ។'; +$lang['i_failure'] = 'ពលសាសារ'; +$lang['i_policy'] = 'បញ្ជីអនុញ្ញតផ្ដើម'; +$lang['i_pol0'] = 'វីគីបើកចំហ'; +$lang['i_pol1'] = 'វីគីសធារណៈ'; +$lang['i_pol2'] = 'វីគីបិទជិត'; +$lang['i_retry'] = 'ម្តងទៀត'; +$lang['email_signature_text'] = 'អ៊ីមេលនេះបន្ចេអពីឌោគូវីគីនៅ +@DOKUWIKIURL@'; diff --git a/inc/lang/km/login.txt b/inc/lang/km/login.txt new file mode 100644 index 0000000..17d3904 --- /dev/null +++ b/inc/lang/km/login.txt @@ -0,0 +1,3 @@ +====== កត់ចូល ====== + +អ្នកមិនទាន់។ អ្នកត្រូវការអនុញ្ញាឲ្យកត់តនំបានចូល។ diff --git a/inc/lang/km/newpage.txt b/inc/lang/km/newpage.txt new file mode 100644 index 0000000..fe786e6 --- /dev/null +++ b/inc/lang/km/newpage.txt @@ -0,0 +1,3 @@ +====== ឥតទាន់មានទេ ====== + +អ្នកតាមត្រសៃខ្សែដែលគ្មានទំព័រ។ បើ diff --git a/inc/lang/km/norev.txt b/inc/lang/km/norev.txt new file mode 100644 index 0000000..050ae62 --- /dev/null +++ b/inc/lang/km/norev.txt @@ -0,0 +1,3 @@ +====== ឥតមានបុនរាព្រឹត្តិទេ ====== + +បុនរាព្រឹត្តិពុំមានទេ។ សុំប្រើ «ទំព័រចាស់ៗ» ទៅមើលបញ្ជីប្រវត្តទំព័រចាស់រូបស់អត្ថបទនេះ។ diff --git a/inc/lang/km/password.txt b/inc/lang/km/password.txt new file mode 100644 index 0000000..8cdfcd8 --- /dev/null +++ b/inc/lang/km/password.txt @@ -0,0 +1,6 @@ +សួរស្ដី @FULLNAME@! + +នេះជាបញ្ជីប្រើប្រះរុបស @TITLE@ នៅ @DOKUWIKIURL@ + +នាមបង្រើ៖ @LOGIN@ +ពាក្សសម្ងាត៖ @PASSWORD@ diff --git a/inc/lang/km/pwconfirm.txt b/inc/lang/km/pwconfirm.txt new file mode 100644 index 0000000..a51d1fc --- /dev/null +++ b/inc/lang/km/pwconfirm.txt @@ -0,0 +1,9 @@ +សួស្ដី @FULLNAME@! + +មានគេសុមស្នើពាក្យ​សម្ងាត់​រុបសឲ្យ@TITLE@ នៅ @DOKUWIKIURL@។ + +បើអ្នកមិនជាអ្នកសុមពាក្យ​សម្ងាត់ទេ សុំបស់ចល់អ៊ីមេលនេះ។ + +សុំអះអាងដែលសំណើនេះដោយទៅតាមខ្សែ + +@CONFIRM@ diff --git a/inc/lang/km/recent.txt b/inc/lang/km/recent.txt new file mode 100644 index 0000000..d53e1d1 --- /dev/null +++ b/inc/lang/km/recent.txt @@ -0,0 +1,3 @@ +====== ប្រវត្តិទំព័របច្ចុប្បន្ន ====== + +ទំព័រទាំងនេះគឺទំព័រកែប្រែ: diff --git a/inc/lang/km/register.txt b/inc/lang/km/register.txt new file mode 100644 index 0000000..b407419 --- /dev/null +++ b/inc/lang/km/register.txt @@ -0,0 +1,3 @@ +====== អ្នកប្រើថ្មី ====== + +បំពេញនៅក្នុងទាំងអស់ព័ត៌មានខាងក្រោមដើម្បីបង្កើតគណនីថ្មីនៅក្នុងវិគីនេះ។ ធ្វើឱ្យប្រាកដថាអ្នកផ្គត់ផ្គង់មួយ**សុពលភាពអ៊ីម៉ែលអាសយដ្ឋាន**-ប្រសិនបើអ្នកមិនត្រូវបានសួរដើម្បីបញ្ចូលពាក្យសម្ងាត់នៅទីនេះថ្មីមួយនឹងត្រូវបានផ្ញើទៅអាសយដ្ឋាន។ ឈ្មោះចូលគួរត្រូវបានយសុពលភាព [[doku>wiki:pagename|ទំព័រឈ្មោះ]]. diff --git a/inc/lang/km/revisions.txt b/inc/lang/km/revisions.txt new file mode 100644 index 0000000..d25f407 --- /dev/null +++ b/inc/lang/km/revisions.txt @@ -0,0 +1,3 @@ +====== ប្រវត្តិទំព័រចាស់ ====== + +ទាំងនេះគឺប្រវត្តិទំព័រចាស់រុបសអត្ថបទនេះ។ ជ្រើសខ្សែទំព័រពីខាងក្រោមហើយ ចុត «កែទំព័រនេះ» រួចហើយរក្សាវាទុក។ diff --git a/inc/lang/kn/admin.txt b/inc/lang/kn/admin.txt new file mode 100644 index 0000000..ae08fe4 --- /dev/null +++ b/inc/lang/kn/admin.txt @@ -0,0 +1,3 @@ +====== ಆಡಳಿತಾತ್ಮಕ ====== + +ಈ ಕೆಳಗೆ ಡಾಕುವಿಕಿ(DokuWiki)ಯಲ್ಲಿರುವ ಆಡಳಿತಾತ್ಮಕ ಕಾರ್ಯಗಳ ಪಟ್ಟಿಯನ್ನು ನೋಡಬಹುದು. diff --git a/inc/lang/kn/adminplugins.txt b/inc/lang/kn/adminplugins.txt new file mode 100644 index 0000000..0b00527 --- /dev/null +++ b/inc/lang/kn/adminplugins.txt @@ -0,0 +1 @@ +===== ಹೆಚ್ಚುವರಿ ಪ್ಲಗ್ ಇನ್ ಗಳು ===== \ No newline at end of file diff --git a/inc/lang/kn/backlinks.txt b/inc/lang/kn/backlinks.txt new file mode 100644 index 0000000..f68ea01 --- /dev/null +++ b/inc/lang/kn/backlinks.txt @@ -0,0 +1,3 @@ +====== ಹಿಂಕೊಂಡಿಗಳು ====== + +ಹಾಲಿ ಪುಟಕ್ಕೆ ಹಿಂದಕ್ಕೆ ಕೊಂಡಿಯಿರಬಹುದಾದಂತಹ ಪುಟಗಳ ಪಟ್ಟಿಯಿದು. diff --git a/inc/lang/kn/conflict.txt b/inc/lang/kn/conflict.txt new file mode 100644 index 0000000..6447a3d --- /dev/null +++ b/inc/lang/kn/conflict.txt @@ -0,0 +1,5 @@ +====== ಹೊಸ ಅವತರಣಿಕೆ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ ====== + +ನೀವು ಸಂಪಾದಿಸಿದ ಕಡತದ ಇನ್ನೂ ಹೊಸ ಆವೃತ್ತಿ ಅಸ್ತಿತ್ವದಲ್ಲಿದೆ. ನೀವು ಸಂಪಾದಿಸುತ್ತಿರುವಾಗ ಬೇರೊಬ್ಬರು ಅದೇ ಕಡತವನ್ನು ಮಾರ್ಪಡಿಸಿದರೆ ಹೀಗಾಗುತ್ತದೆ. + +ಕೆಳಗೆ ತೋರಿಸಿರುವ ವ್ಯತ್ಯಾಸಗಳನ್ನು ಕೂಲಂಕುಶವಾಗಿ ಪರಿಶೀಲಿಸಿ, ನಂತರ ಯಾವ ಆವೃತ್ತಿಯನ್ನು ಇಟ್ಟುಕೊಳ್ಳಬೇಕೆಂದು ನಿರ್ಧರಿಸಿ. ನೀವು "ಉಳಿಸು" ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಂಡರೆ ನಿಮ್ಮ ಆವೃತ್ತಿ ಉಳಿದುಕೊಳ್ಳುತ್ತದೆ. ನೀವು "ರದ್ದು ಮಾಡು" ಅನ್ನು ಆಯ್ಕೆ ಮಾಡಿಕೊಂಡರೆ ಹಾಲಿ ಆವೃತ್ತಿ ಉಳಿಯುತ್ತದೆ. diff --git a/inc/lang/ko/admin.txt b/inc/lang/ko/admin.txt new file mode 100644 index 0000000..6f8c9e5 --- /dev/null +++ b/inc/lang/ko/admin.txt @@ -0,0 +1,3 @@ +====== 관리 ====== + +도쿠위키에서 사용할 수 있는 관리 작업 목록을 아래에서 찾을 수 있습니다. diff --git a/inc/lang/ko/adminplugins.txt b/inc/lang/ko/adminplugins.txt new file mode 100644 index 0000000..2c436d6 --- /dev/null +++ b/inc/lang/ko/adminplugins.txt @@ -0,0 +1 @@ +===== 추가적인 플러그인 ===== \ No newline at end of file diff --git a/inc/lang/ko/backlinks.txt b/inc/lang/ko/backlinks.txt new file mode 100644 index 0000000..ee86e0c --- /dev/null +++ b/inc/lang/ko/backlinks.txt @@ -0,0 +1,3 @@ +====== 역링크 ====== + +현재 문서를 가리키는 링크가 있는 문서 목록입니다. diff --git a/inc/lang/ko/conflict.txt b/inc/lang/ko/conflict.txt new file mode 100644 index 0000000..ba15a02 --- /dev/null +++ b/inc/lang/ko/conflict.txt @@ -0,0 +1,5 @@ +====== 새 판 있음 ====== + +편집한 문서의 새 판이 있습니다. 당신이 편집하고 있는 동안 다른 사용자가 문서를 바꾸면 이런 일이 생길 수 있습니다. + +아래의 차이를 철저하게 검토하고 어떤 판을 저장하실지 결정하세요. ''저장''을 선택하면 당신의 판이 저장됩니다. ''취소''를 선택하면 현재 판이 유지됩니다. diff --git a/inc/lang/ko/denied.txt b/inc/lang/ko/denied.txt new file mode 100644 index 0000000..8ed2b22 --- /dev/null +++ b/inc/lang/ko/denied.txt @@ -0,0 +1,3 @@ +====== 권한 거절 ====== + +죄송하지만 계속할 수 있는 권한이 없습니다. diff --git a/inc/lang/ko/diff.txt b/inc/lang/ko/diff.txt new file mode 100644 index 0000000..3e68b20 --- /dev/null +++ b/inc/lang/ko/diff.txt @@ -0,0 +1,3 @@ +====== 차이 ====== + +문서의 선택한 두 판 사이의 차이를 보여줍니다. diff --git a/inc/lang/ko/draft.txt b/inc/lang/ko/draft.txt new file mode 100644 index 0000000..49224f8 --- /dev/null +++ b/inc/lang/ko/draft.txt @@ -0,0 +1,5 @@ +====== 문서 초안 있음 ====== + +이 문서의 마지막 편집 세션은 올바르게 끝나지 않았습니다. 도쿠위키는 작업 도중 자동으로 저장된 초안을 사용해 편집을 계속 할 수 있습니다. 마지막 세션 동안 저장된 초안을 아래에서 볼 수 있습니다. + +비정상적으로 끝난 편집 세션을 **복구**할지 여부를 결정하고, 자동으로 저장되었던 초안을 **삭제**하거나 편집 과정을 **취소**하세요. diff --git a/inc/lang/ko/edit.txt b/inc/lang/ko/edit.txt new file mode 100644 index 0000000..b90cca7 --- /dev/null +++ b/inc/lang/ko/edit.txt @@ -0,0 +1 @@ +문서를 편집하고 ''저장''을 누르세요. 위키 구문은 [[wiki:syntax]]를 참조하세요. 문서를 **더 좋게 만들 자신이 있을 때**에만 편집하세요. 연습을 하고 싶다면 먼저 [[playground:playground|연습장]]에 가서 연습하세요. diff --git a/inc/lang/ko/editrev.txt b/inc/lang/ko/editrev.txt new file mode 100644 index 0000000..675c997 --- /dev/null +++ b/inc/lang/ko/editrev.txt @@ -0,0 +1,2 @@ +**문서의 이전 판을 선택했습니다!** 저장하면 이 자료로 새 판을 만듭니다. +---- diff --git a/inc/lang/ko/index.txt b/inc/lang/ko/index.txt new file mode 100644 index 0000000..9cf9e26 --- /dev/null +++ b/inc/lang/ko/index.txt @@ -0,0 +1,3 @@ +====== 사이트맵 ====== + +[[doku>ko:namespaces|이름공간]] 순으로 정렬한 모든 문서의 사이트맵입니다. diff --git a/inc/lang/ko/install.html b/inc/lang/ko/install.html new file mode 100644 index 0000000..e944b4e --- /dev/null +++ b/inc/lang/ko/install.html @@ -0,0 +1,7 @@ +

    이 페이지는 도쿠위키의 첫 설치와 환경 설정을 도와줍니다. 이 설치 프로그램에 대한 자세한 정보는 설명문 페이지에서 볼 수 있습니다.

    + +

    도쿠위키는 위키 문서와 해당 문서와 관련된 정보(예를 들어 그림, 검색 색인, 이전 판 문서 등)를 저장하기 위해 일반적인 텍스트 파일을 사용합니다. 성공적으로 작동하려면 도쿠위키는 이 파일을 담고 있는 디렉토리에 대한 쓰기 권한이 있어야 합니다. 이 설치 프로그램은 디렉토리 권한을 설정할 수 없습니다. 보통 직접 명령 셸에 수행하거나 호스팅을 사용한다면, FTP나 호스팅 제어판(예를 들어 CPanel)을 통해 수행해야 합니다.

    + +

    이 설치 프로그램은 관리자로 로그인하고 나서 플러그인 설치, 사용자 관리, 위키 문서로의 접근 관리와 환경 설정을 바꾸기 위한 도쿠위키의 관리 메뉴에 접근할 수 있는, ACL에 대한 도쿠위키 환경을 설정합니다. 도쿠위키가 작동하는데 필요하지 않지만, 도쿠위키를 쉽게 관리할 수 있도록 해줍니다.

    + +

    숙련된 사용자나 특수한 설치가 필요한 사용자에게 자세한 내용은 설치 지침환경 설정 링크를 사용해야 합니다.

    diff --git a/inc/lang/ko/jquery.ui.datepicker.js b/inc/lang/ko/jquery.ui.datepicker.js new file mode 100644 index 0000000..deb1475 --- /dev/null +++ b/inc/lang/ko/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Korean initialisation for the jQuery calendar extension. */ +/* Written by DaeKwon Kang (ncrash.dk@gmail.com), Edited by Genie and Myeongjin Lee. */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/ko/lang.php b/inc/lang/ko/lang.php new file mode 100644 index 0000000..4c45e60 --- /dev/null +++ b/inc/lang/ko/lang.php @@ -0,0 +1,372 @@ + + * @author merefox + * @author pavement + * @author Traend + * @author Seungheon Song + * @author Hyun Kim + * @author jk Lee + * @author dongnak + * @author Song Younghwan + * @author Seung-Chul Yoo + * @author erial2 + * @author Myeongjin + * @author Gerrit Uitslag + * @author Garam + * @author Young gon Cha + * @author hyeonsoft + * @author S.H. Lee + */ +$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 공유 파일과의 연결은 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['js']['data_insecure'] = '경고: 데이터 디렉터리가 제대로 보호되지 않은 것 같습니다. 도쿠위키의 웹 엑세스 보안에 대해 읽어보세요.'; +$lang['search_exact_match'] = '정확히 일치'; +$lang['search_starts_with'] = '시작'; +$lang['search_ends_with'] = '끝'; +$lang['search_any_ns'] = '모든 네임스페이스'; +$lang['search_past_7_days'] = '저번 주'; +$lang['search_past_month'] = '저번 달'; +$lang['search_past_year'] = '저번 년도'; +$lang['search_sort_by_hits'] = '조회수로 정렬'; +$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'] = '이 위키에서 내 계정을 제거하고 싶습니다.
    이 행동은 되돌릴 수 없습니다.'; +$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['allowedmime'] = '허용된 파일 확장자 리스트'; +$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'] = '이 내용을 표시하기 위해서 Adobe Flash 플러그인이 필요합니다.'; +$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'] = '보안 상의 이유로 이 스크립트는 수정되지 않은 새 도쿠위키 설치에서만 동작됩니다. + 다운로드한 압축 패키지를 다시 설치하거나 도쿠위키 설치 과정을 참조해서 설치하세요.'; +$lang['i_funcna'] = '%s PHP 함수를 사용할 수 없습니다. 호스트 제공자가 어떤 이유에서인지 막아 놓았을지 모릅니다.'; +$lang['i_phpver'] = 'PHP %s 버전은 필요한 %s 버전보다 오래되었습니다. PHP를 업그레이드할 필요가 있습니다.'; +$lang['i_mbfuncoverload'] = '도쿠위키를 실행하려면 mbstring.func_overload를 php.ini에서 비활성화해야 합니다.'; +$lang['i_permfail'] = '%s는 도쿠위키가 쓰기 가능 권한이 없습니다. 먼저 이 디렉터리에 쓰기 권한이 설정되어야 합니다!'; +$lang['i_confexists'] = '%s(은)는 이미 존재합니다'; +$lang['i_writeerr'] = '%s(을)를 만들 수 없습니다. 먼저 디렉터리/파일 권한을 확인하고 파일을 수동으로 만드세요.'; +$lang['i_badhash'] = 'dokuwiki.php를 인식할 수 없거나 원본 파일이 아닙니다 (해시=%s)'; +$lang['i_badval'] = '%s - 잘못되었거나 빈 값입니다'; +$lang['i_success'] = '환경 설정이 성공적으로 끝났습니다. 지금 install.php를 지워도 상관없습니다. + 새 도쿠위키로 들어가세요.'; +$lang['i_failure'] = '환경 설정 파일에 쓰는 도중에 오류가 발생했습니다. + 새 도쿠위키를 사용하기 전에 수동으로 문제를 해결해야 합니다.'; +$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'] = '현재 %s 이름공간을 구독 중입니다. 전체 위키의 최근 바뀜도 볼 수 있습니다.'; +$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에 존재하지 않았습니다. 그 뒤로 %s에 만들어졌습니다.'; +$lang['unable_to_parse_date'] = '"%s" 변수에서 구문 분석할 수 없습니다.'; +$lang['email_signature_text'] = '이 메일은 @DOKUWIKIURL@에서 도쿠위키가 생성했습니다'; +$lang['log_file_failed_to_open'] = '로그 파일을 열지 못했습니다.'; +$lang['log_file_failed_to_read'] = '로그를 읽는 동안 오류가 발생했습니다.'; diff --git a/inc/lang/ko/locked.txt b/inc/lang/ko/locked.txt new file mode 100644 index 0000000..83a677c --- /dev/null +++ b/inc/lang/ko/locked.txt @@ -0,0 +1,3 @@ +====== 문서 잠김 ====== + +이 문서는 다른 사용자가 편집하기 위해 현재 잠겨있습니다. 해당 사용자가 편집을 끝내거나 잠금이 만료될 때까지 기다리세요. diff --git a/inc/lang/ko/login.txt b/inc/lang/ko/login.txt new file mode 100644 index 0000000..1ddc8f1 --- /dev/null +++ b/inc/lang/ko/login.txt @@ -0,0 +1,3 @@ +====== 로그인 ====== + +로그인하지 않았습니다! 아래에서 로그인하세요. 로그인하려면 쿠키를 활성화해야 합니다. diff --git a/inc/lang/ko/mailtext.txt b/inc/lang/ko/mailtext.txt new file mode 100644 index 0000000..2b22258 --- /dev/null +++ b/inc/lang/ko/mailtext.txt @@ -0,0 +1,12 @@ +도쿠위키 문서가 추가되거나 바뀌었습니다. 자세한 내용은 다음과 같습니다: + +날짜: @DATE@ +브라우저: @BROWSER@ +IP 주소: @IPADDRESS@ +호스트 이름: @HOSTNAME@ +이전 판: @OLDPAGE@ +새 판: @NEWPAGE@ +편집 요약: @SUMMARY@ +사용자: @USER@ + +@DIFF@ diff --git a/inc/lang/ko/mailwrap.html b/inc/lang/ko/mailwrap.html new file mode 100644 index 0000000..7df0cdc --- /dev/null +++ b/inc/lang/ko/mailwrap.html @@ -0,0 +1,13 @@ + + + @TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + diff --git a/inc/lang/ko/newpage.txt b/inc/lang/ko/newpage.txt new file mode 100644 index 0000000..51c730b --- /dev/null +++ b/inc/lang/ko/newpage.txt @@ -0,0 +1,3 @@ +====== 이 주제는 아직 없습니다 ====== + +아직 없는 주제에 대한 링크를 따라왔습니다. **문서 만들기**를 클릭해 새로 만들 수 있습니다. diff --git a/inc/lang/ko/norev.txt b/inc/lang/ko/norev.txt new file mode 100644 index 0000000..0910340 --- /dev/null +++ b/inc/lang/ko/norev.txt @@ -0,0 +1,3 @@ +====== 지정한 판 없음 ====== + +지정한 판이 존재하지 않습니다. 이 문서의 이전 판 목록을 보려면 "이전 판"을 클릭하세요. diff --git a/inc/lang/ko/onceexisted.txt b/inc/lang/ko/onceexisted.txt new file mode 100644 index 0000000..6d20557 --- /dev/null +++ b/inc/lang/ko/onceexisted.txt @@ -0,0 +1,3 @@ +======= 이 페이지는 더 이상 존재하지 않습니다 ====== + +더 이상 존재하지 않는 페이지에 대한 링크를 따라왔습니다. **이전 판** 목록을 확인하여 삭제 시점과 이유를 확인하고 오래된 판을 확인하거나 복원할 수 있습니다. diff --git a/inc/lang/ko/password.txt b/inc/lang/ko/password.txt new file mode 100644 index 0000000..1bd9246 --- /dev/null +++ b/inc/lang/ko/password.txt @@ -0,0 +1,6 @@ +@FULLNAME@님 안녕하세요! + +여기에 @DOKUWIKIURL@에서 @TITLE@의 사용자 정보가 있습니다. + +로그인: @LOGIN@ +비밀번호: @PASSWORD@ diff --git a/inc/lang/ko/preview.txt b/inc/lang/ko/preview.txt new file mode 100644 index 0000000..4f5e221 --- /dev/null +++ b/inc/lang/ko/preview.txt @@ -0,0 +1,3 @@ +====== 미리 보기 ====== + +입력한 내용이 어떻게 보일지 미리 보여줍니다. 아직 **저장되지 않았다**는 점을 기억해두세요! diff --git a/inc/lang/ko/pwconfirm.txt b/inc/lang/ko/pwconfirm.txt new file mode 100644 index 0000000..9928502 --- /dev/null +++ b/inc/lang/ko/pwconfirm.txt @@ -0,0 +1,9 @@ +@FULLNAME@님 안녕하세요! + +누군가가 @DOKUWIKIURL@에 @TITLE@에 대해 새 비밀번호가 필요하다고 요청했습니다. + +새 비밀번호를 요청하지 않았다면 이 이메일을 무시해버리세요. + +정말로 당신이 요청을 해서 보내졌는지 확인하려면 다음 링크를 사용하세요. + +@CONFIRM@ diff --git a/inc/lang/ko/read.txt b/inc/lang/ko/read.txt new file mode 100644 index 0000000..be80bd7 --- /dev/null +++ b/inc/lang/ko/read.txt @@ -0,0 +1 @@ +이 문서는 읽기 전용입니다. 원본을 볼 수는 있지만 바꿀 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하세요. diff --git a/inc/lang/ko/recent.txt b/inc/lang/ko/recent.txt new file mode 100644 index 0000000..802cb69 --- /dev/null +++ b/inc/lang/ko/recent.txt @@ -0,0 +1,3 @@ +====== 최근 바뀜 ====== + +다음 문서는 최근에 바뀌었습니다: diff --git a/inc/lang/ko/register.txt b/inc/lang/ko/register.txt new file mode 100644 index 0000000..027e1d5 --- /dev/null +++ b/inc/lang/ko/register.txt @@ -0,0 +1,3 @@ +====== 새 사용자 등록 ====== + +이 위키에 새 계정을 만드려면 아래의 모든 내용을 입력하세요. **올바른 이메일 주소**를 사용하세요. 비밀번호를 입력하는 곳이 없다면, 새 비밀번호는 해당 주소로 보내집니다. 사용자 이름은 올바른 [[doku>ko:pagename|문서 이름]]이어야 합니다. diff --git a/inc/lang/ko/registermail.txt b/inc/lang/ko/registermail.txt new file mode 100644 index 0000000..adc5a08 --- /dev/null +++ b/inc/lang/ko/registermail.txt @@ -0,0 +1,10 @@ +새 사용자가 등록되었습니다. 자세한 내용은 다음과 같습니다: + +사용자 이름: @NEWUSER@ +실명: @NEWNAME@ +이메일: @NEWEMAIL@ + +날짜: @DATE@ +브라우저: @BROWSER@ +IP 주소: @IPADDRESS@ +호스트 이름: @HOSTNAME@ diff --git a/inc/lang/ko/resendpwd.txt b/inc/lang/ko/resendpwd.txt new file mode 100644 index 0000000..b9f48df --- /dev/null +++ b/inc/lang/ko/resendpwd.txt @@ -0,0 +1,3 @@ +====== 새 비밀번호 보내기 ====== + +이 위키 계정에 대한 새 비밀번호를 요청하기 위해 아래 양식에서 사용자 이름을 입력하세요. 확인 링크는 새로 등록한 이메일 주소로 보냅니다. diff --git a/inc/lang/ko/resetpwd.txt b/inc/lang/ko/resetpwd.txt new file mode 100644 index 0000000..f22aa94 --- /dev/null +++ b/inc/lang/ko/resetpwd.txt @@ -0,0 +1,3 @@ +====== 새 비밀번호 설정 ====== + +이 위키에 있는 계정의 새 비밀번호를 입력하세요. diff --git a/inc/lang/ko/revisions.txt b/inc/lang/ko/revisions.txt new file mode 100644 index 0000000..7fa706c --- /dev/null +++ b/inc/lang/ko/revisions.txt @@ -0,0 +1,3 @@ +====== 이전 판 ====== + +이 문서의 이전 판은 다음과 같습니다. 이전 판으로 되돌리려면, 아래에서 선택한 다음 ''문서 편집''을 클릭하고 나서 저장하세요. diff --git a/inc/lang/ko/searchpage.txt b/inc/lang/ko/searchpage.txt new file mode 100644 index 0000000..881d6da --- /dev/null +++ b/inc/lang/ko/searchpage.txt @@ -0,0 +1,3 @@ +====== 검색 ====== + +아래에서 검색 결과를 찾을 수 있습니다. @CREATEPAGEINFO@ diff --git a/inc/lang/ko/showrev.txt b/inc/lang/ko/showrev.txt new file mode 100644 index 0000000..31d8b10 --- /dev/null +++ b/inc/lang/ko/showrev.txt @@ -0,0 +1,2 @@ +**문서의 이전 판입니다!** +---- diff --git a/inc/lang/ko/stopwords.txt b/inc/lang/ko/stopwords.txt new file mode 100644 index 0000000..71e5a08 --- /dev/null +++ b/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 diff --git a/inc/lang/ko/subscr_digest.txt b/inc/lang/ko/subscr_digest.txt new file mode 100644 index 0000000..bdb46ad --- /dev/null +++ b/inc/lang/ko/subscr_digest.txt @@ -0,0 +1,15 @@ +안녕하세요! + +@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다. +바뀜은 다음과 같습니다: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +이전 판: @OLDPAGE@ +새 판: @NEWPAGE@ + + +문서 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤 +@SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요. diff --git a/inc/lang/ko/subscr_form.txt b/inc/lang/ko/subscr_form.txt new file mode 100644 index 0000000..ed380cc --- /dev/null +++ b/inc/lang/ko/subscr_form.txt @@ -0,0 +1,3 @@ +====== 구독 관리 ====== + +이 페이지는 현재의 문서와 이름공간의 구독을 관리할 수 있도록 해줍니다. \ No newline at end of file diff --git a/inc/lang/ko/subscr_list.txt b/inc/lang/ko/subscr_list.txt new file mode 100644 index 0000000..69a2d53 --- /dev/null +++ b/inc/lang/ko/subscr_list.txt @@ -0,0 +1,11 @@ +안녕하세요! + +@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다. +문서의 바뀜은 다음과 같습니다: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤 +@SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요. diff --git a/inc/lang/ko/subscr_single.txt b/inc/lang/ko/subscr_single.txt new file mode 100644 index 0000000..425d0d9 --- /dev/null +++ b/inc/lang/ko/subscr_single.txt @@ -0,0 +1,17 @@ +안녕하세요! + +@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다. +바뀜은 다음과 같습니다: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +날짜: @DATE@ +사용자: @USER@ +편집 요약: @SUMMARY@ +이전 판: @OLDPAGE@ +새 판: @NEWPAGE@ + +문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤 +@SUBSCRIBE@ 문서를 방문해 문서나 이름공간의 구독을 취소하세요. diff --git a/inc/lang/ko/updateprofile.txt b/inc/lang/ko/updateprofile.txt new file mode 100644 index 0000000..335091d --- /dev/null +++ b/inc/lang/ko/updateprofile.txt @@ -0,0 +1,3 @@ +====== 계정 프로필 업데이트 ====== + +바꾸고 싶은 항목을 입력하세요. 사용자 이름은 바꿀 수 없습니다. diff --git a/inc/lang/ko/uploadmail.txt b/inc/lang/ko/uploadmail.txt new file mode 100644 index 0000000..1b6e55c --- /dev/null +++ b/inc/lang/ko/uploadmail.txt @@ -0,0 +1,11 @@ +도쿠위키가 파일을 올렸습니다. 자세한 정보는 다음과 같습니다: + +파일: @MEDIA@ +이전 판: @OLD@ +날짜: @DATE@ +브라우저: @BROWSER@ +IP 주소: @IPADDRESS@ +호스트 이름: @HOSTNAME@ +크기: @SIZE@ +MIME 유형: @MIME@ +사용자: @USER@ diff --git a/inc/lang/ku/backlinks.txt b/inc/lang/ku/backlinks.txt new file mode 100644 index 0000000..408cdee --- /dev/null +++ b/inc/lang/ku/backlinks.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ku/conflict.txt b/inc/lang/ku/conflict.txt new file mode 100644 index 0000000..37cca18 --- /dev/null +++ b/inc/lang/ku/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/ku/diff.txt b/inc/lang/ku/diff.txt new file mode 100644 index 0000000..70bb24c --- /dev/null +++ b/inc/lang/ku/diff.txt @@ -0,0 +1,3 @@ +====== Cuyawazî ====== + +Li vê derê cuyawaziyên nav revîziyona hilbijartî û verziyona aniha tên nîşan dan. diff --git a/inc/lang/ku/edit.txt b/inc/lang/ku/edit.txt new file mode 100644 index 0000000..33e0db5 --- /dev/null +++ b/inc/lang/ku/edit.txt @@ -0,0 +1 @@ +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 [[playground:playground]]. Li vê derê tu dikarî her tiştî biceribînî. diff --git a/inc/lang/ku/index.txt b/inc/lang/ku/index.txt new file mode 100644 index 0000000..c01e4c6 --- /dev/null +++ b/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. diff --git a/inc/lang/ku/lang.php b/inc/lang/ku/lang.php new file mode 100644 index 0000000..61dfd01 --- /dev/null +++ b/inc/lang/ku/lang.php @@ -0,0 +1,72 @@ + + * + * @author Crowdsource Kurdish + * @author qezwan + */ +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '“'; +$lang['doublequoteclosing'] = '”'; +$lang['singlequoteopening'] = ','; +$lang['singlequoteclosing'] = ','; +$lang['apostrophe'] = ','; +$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['btn_profile'] = 'Profîlê Hildemîne'; +$lang['btn_resendpwd'] = 'Pêborîna nû saz bike'; +$lang['btn_draft'] = 'Reşnivîsê sererast bike'; +$lang['btn_recover'] = 'Reşnivîsê vegerîne'; +$lang['btn_draftdel'] = 'Reşnivîsê jê bibe'; +$lang['btn_register'] = 'Tomar bibe'; +$lang['btn_apply'] = 'Bisepîne'; +$lang['btn_deleteuser'] = 'Hesabê Min Jê Bibe'; +$lang['loggedinas'] = 'Têketî wekî:'; +$lang['user'] = 'Navê bikarhêner'; +$lang['pass'] = 'Pêborîn'; +$lang['newpass'] = 'Pêborîna nû'; +$lang['oldpass'] = 'Pêborîna heyî bipejirîne'; +$lang['passchk'] = 'باریکی دیکە'; +$lang['remember'] = 'Min bi bîr bîne'; +$lang['fullname'] = 'Navê rastîn'; +$lang['email'] = 'E-Mail'; +$lang['profile'] = 'Profîla Bikarhêner'; +$lang['badlogin'] = 'Bibore, navê bikarhêneriyê an jî pêborîn çewt bû.'; +$lang['js']['mediatitle'] = 'Sazkariyên girêdanê'; +$lang['js']['mediasize'] = 'Mezinahiya wêneyê'; +$lang['js']['mediaclose'] = 'Bigire'; +$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ê'; diff --git a/inc/lang/ku/newpage.txt b/inc/lang/ku/newpage.txt new file mode 100644 index 0000000..3e898e4 --- /dev/null +++ b/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/inc/lang/ku/preview.txt b/inc/lang/ku/preview.txt new file mode 100644 index 0000000..5555ff1 --- /dev/null +++ b/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**! diff --git a/inc/lang/ku/recent.txt b/inc/lang/ku/recent.txt new file mode 100644 index 0000000..323da6a --- /dev/null +++ b/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/inc/lang/ku/searchpage.txt b/inc/lang/ku/searchpage.txt new file mode 100644 index 0000000..38e0482 --- /dev/null +++ b/inc/lang/ku/searchpage.txt @@ -0,0 +1,3 @@ +====== Lêbigere ====== + +Jêr encamên lêgerandina te tên nîşan dan. @CREATEPAGEINFO@ diff --git a/inc/lang/la/admin.txt b/inc/lang/la/admin.txt new file mode 100644 index 0000000..6f38b00 --- /dev/null +++ b/inc/lang/la/admin.txt @@ -0,0 +1,3 @@ +====== Administratio ====== + +In hac pagina administratio uicis est. diff --git a/inc/lang/la/adminplugins.txt b/inc/lang/la/adminplugins.txt new file mode 100644 index 0000000..9f2ec47 --- /dev/null +++ b/inc/lang/la/adminplugins.txt @@ -0,0 +1 @@ +===== Addenda alia ===== \ No newline at end of file diff --git a/inc/lang/la/backlinks.txt b/inc/lang/la/backlinks.txt new file mode 100644 index 0000000..b3c0d13 --- /dev/null +++ b/inc/lang/la/backlinks.txt @@ -0,0 +1,3 @@ +====== Nexa ====== + +Index paginarum, quae ad hanc paginam connexae sunt. diff --git a/inc/lang/la/conflict.txt b/inc/lang/la/conflict.txt new file mode 100644 index 0000000..84c2788 --- /dev/null +++ b/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. diff --git a/inc/lang/la/denied.txt b/inc/lang/la/denied.txt new file mode 100644 index 0000000..d844a7f --- /dev/null +++ b/inc/lang/la/denied.txt @@ -0,0 +1,3 @@ +====== Ad hanc paginam accedere non potes ====== + +Ad hanc paginam accedere non potes: antea in conuentum ineas. diff --git a/inc/lang/la/diff.txt b/inc/lang/la/diff.txt new file mode 100644 index 0000000..f9f8322 --- /dev/null +++ b/inc/lang/la/diff.txt @@ -0,0 +1,3 @@ +====== Discrimina ====== + +Discrimina inter duas paginas ostendere. diff --git a/inc/lang/la/draft.txt b/inc/lang/la/draft.txt new file mode 100644 index 0000000..aaea7de --- /dev/null +++ b/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. diff --git a/inc/lang/la/edit.txt b/inc/lang/la/edit.txt new file mode 100644 index 0000000..4bbbaf2 --- /dev/null +++ b/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. diff --git a/inc/lang/la/editrev.txt b/inc/lang/la/editrev.txt new file mode 100644 index 0000000..9c4cd49 --- /dev/null +++ b/inc/lang/la/editrev.txt @@ -0,0 +1,2 @@ +**Vetus forma a te restituta est** Si hanc formam seruabis, nouam creabis. +---- diff --git a/inc/lang/la/index.txt b/inc/lang/la/index.txt new file mode 100644 index 0000000..0c9dc92 --- /dev/null +++ b/inc/lang/la/index.txt @@ -0,0 +1,3 @@ +====== Forma Situs ====== + +Haec forma situs ordinata [[doku>namespaces|generatim]]. diff --git a/inc/lang/la/install.html b/inc/lang/la/install.html new file mode 100644 index 0000000..e041df9 --- /dev/null +++ b/inc/lang/la/install.html @@ -0,0 +1,8 @@ +

    Haec pagina te adiuuat in Dokuuiki conformando. Maiores res in +hac pagina sunt.

    + +

    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 debes. Hoc instrumentum facultates eligere non potest, his facultatibus locatori spati interretis quaeras uel FTP intrumento uel aliis rebus (ut cPanel) uteraris.

    + +

    Hoc intrumentum optiones primae DokuWiki ICA, 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.

    + +

    Periti uel qui certa quaesita habet paginas rationis conformandum uicem et optionum conformationis uidere possunt.

    \ No newline at end of file diff --git a/inc/lang/la/lang.php b/inc/lang/la/lang.php new file mode 100644 index 0000000..1968d51 --- /dev/null +++ b/inc/lang/la/lang.php @@ -0,0 +1,261 @@ + + */ +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '"'; +$lang['doublequoteclosing'] = '"'; +$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'] = 'Adobe Flash Plugin 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 Dokuuicis installation instructions'; +$lang['i_funcna'] = 'PHP functio %s inepta est.'; +$lang['i_phpver'] = 'Forma tua PHP %s minor quam illa necessaria %s.'; +$lang['i_permfail'] = '%s non a uice scribitur. Facultates inspicere.'; +$lang['i_confexists'] = '%s iam est.'; +$lang['i_writeerr'] = '%s non creari potest. Manu illum creas.'; +$lang['i_badhash'] = 'Ignotum uel mutatum dokuwiki.php (%s)'; +$lang['i_badval'] = '%s non legitimum uel uacuom'; +$lang['i_success'] = 'Administratio feliciter perficitur. Delere install.php documentum potes. I ad hanc paginam ut continues.'; +$lang['i_failure'] = 'Aliqui errores dum documenta administrantur sunt. Manu onerare omnes potes priusquam tuo nouo uice 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/inc/lang/la/locked.txt b/inc/lang/la/locked.txt new file mode 100644 index 0000000..6982f6f --- /dev/null +++ b/inc/lang/la/locked.txt @@ -0,0 +1,3 @@ +====== Pagina inclusa ====== + +Haec pagina inclusa est: nullam mutationem facere potest. diff --git a/inc/lang/la/login.txt b/inc/lang/la/login.txt new file mode 100644 index 0000000..e79c7ab --- /dev/null +++ b/inc/lang/la/login.txt @@ -0,0 +1,3 @@ +====== Aditus ====== + +Nomen Sodalis et tesseram scribere debes ut in conuentum inire uelis. diff --git a/inc/lang/la/mailtext.txt b/inc/lang/la/mailtext.txt new file mode 100644 index 0000000..8348378 --- /dev/null +++ b/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/inc/lang/la/newpage.txt b/inc/lang/la/newpage.txt new file mode 100644 index 0000000..f5a9456 --- /dev/null +++ b/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. diff --git a/inc/lang/la/norev.txt b/inc/lang/la/norev.txt new file mode 100644 index 0000000..d15badb --- /dev/null +++ b/inc/lang/la/norev.txt @@ -0,0 +1,3 @@ +====== Forma non reperta ====== + +Haec forma non reperta est. Aliam formam quaeris. diff --git a/inc/lang/la/password.txt b/inc/lang/la/password.txt new file mode 100644 index 0000000..0557357 --- /dev/null +++ b/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/inc/lang/la/preview.txt b/inc/lang/la/preview.txt new file mode 100644 index 0000000..468d617 --- /dev/null +++ b/inc/lang/la/preview.txt @@ -0,0 +1,3 @@ +====== Praeuisio ====== + +In hac pagina scriptum praeuidere potes. **Memento hunc non seruatum iam esse**. diff --git a/inc/lang/la/pwconfirm.txt b/inc/lang/la/pwconfirm.txt new file mode 100644 index 0000000..26e0f2f --- /dev/null +++ b/inc/lang/la/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/la/read.txt b/inc/lang/la/read.txt new file mode 100644 index 0000000..478091e --- /dev/null +++ b/inc/lang/la/read.txt @@ -0,0 +1 @@ +Hanc paginam solum legere potes. Fontem uidere, sed non mutare potes. diff --git a/inc/lang/la/recent.txt b/inc/lang/la/recent.txt new file mode 100644 index 0000000..d619c82 --- /dev/null +++ b/inc/lang/la/recent.txt @@ -0,0 +1,3 @@ +====== Recentes Mutationes ====== + +Hae paginae mutatae sunt in recentibus temporibus: diff --git a/inc/lang/la/register.txt b/inc/lang/la/register.txt new file mode 100644 index 0000000..f3ff557 --- /dev/null +++ b/inc/lang/la/register.txt @@ -0,0 +1,3 @@ +====== Nouom\am Sodalem Adscribere ====== + +Nomen Sodalis legitimus esse debes: [[doku>pagename|pagename]]. diff --git a/inc/lang/la/registermail.txt b/inc/lang/la/registermail.txt new file mode 100644 index 0000000..1f28659 --- /dev/null +++ b/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/inc/lang/la/resendpwd.txt b/inc/lang/la/resendpwd.txt new file mode 100644 index 0000000..46c3127 --- /dev/null +++ b/inc/lang/la/resendpwd.txt @@ -0,0 +1,3 @@ +====== ouam Tesseram mittere ====== + +Inserere nomen Sodalis priusquam tesseram petere. Confirmatio mittibitur. diff --git a/inc/lang/la/revisions.txt b/inc/lang/la/revisions.txt new file mode 100644 index 0000000..fa55804 --- /dev/null +++ b/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. diff --git a/inc/lang/la/searchpage.txt b/inc/lang/la/searchpage.txt new file mode 100644 index 0000000..052df49 --- /dev/null +++ b/inc/lang/la/searchpage.txt @@ -0,0 +1,3 @@ +====== Quaerere ====== + +Responsiones in hac pagina uidere potes. @CREATEPAGEINFO@ diff --git a/inc/lang/la/showrev.txt b/inc/lang/la/showrev.txt new file mode 100644 index 0000000..6729dcc --- /dev/null +++ b/inc/lang/la/showrev.txt @@ -0,0 +1,2 @@ +**Haec uetus forma documenti est!** +---- diff --git a/inc/lang/la/stopwords.txt b/inc/lang/la/stopwords.txt new file mode 100644 index 0000000..bd79fcb --- /dev/null +++ b/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 diff --git a/inc/lang/la/subscr_digest.txt b/inc/lang/la/subscr_digest.txt new file mode 100644 index 0000000..d4ca79a --- /dev/null +++ b/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/inc/lang/la/subscr_form.txt b/inc/lang/la/subscr_form.txt new file mode 100644 index 0000000..23000b3 --- /dev/null +++ b/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/inc/lang/la/subscr_list.txt b/inc/lang/la/subscr_list.txt new file mode 100644 index 0000000..3921ff6 --- /dev/null +++ b/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/inc/lang/la/subscr_single.txt b/inc/lang/la/subscr_single.txt new file mode 100644 index 0000000..4bfd7ef --- /dev/null +++ b/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/inc/lang/la/updateprofile.txt b/inc/lang/la/updateprofile.txt new file mode 100644 index 0000000..b0373fd --- /dev/null +++ b/inc/lang/la/updateprofile.txt @@ -0,0 +1,3 @@ +====== Nouare Sodalis tabellas ====== + +Solum in campis, quos mutare uis, scribis. Nomen Sodalis non mutare potes. diff --git a/inc/lang/la/uploadmail.txt b/inc/lang/la/uploadmail.txt new file mode 100644 index 0000000..329bf31 --- /dev/null +++ b/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/inc/lang/lb/admin.txt b/inc/lang/lb/admin.txt new file mode 100644 index 0000000..08f8b2f --- /dev/null +++ b/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/inc/lang/lb/adminplugins.txt b/inc/lang/lb/adminplugins.txt new file mode 100644 index 0000000..9581400 --- /dev/null +++ b/inc/lang/lb/adminplugins.txt @@ -0,0 +1 @@ +===== Zousätzlech Pluginen ===== \ No newline at end of file diff --git a/inc/lang/lb/backlinks.txt b/inc/lang/lb/backlinks.txt new file mode 100644 index 0000000..8b8fbd4 --- /dev/null +++ b/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/inc/lang/lb/conflict.txt b/inc/lang/lb/conflict.txt new file mode 100644 index 0000000..3a84e72 --- /dev/null +++ b/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/inc/lang/lb/denied.txt b/inc/lang/lb/denied.txt new file mode 100644 index 0000000..a8c4c6f --- /dev/null +++ b/inc/lang/lb/denied.txt @@ -0,0 +1,3 @@ +======Erlaabnis verweigert====== + +Et deet mer leed, du hues net genuch Rechter fir weiderzefueren. diff --git a/inc/lang/lb/diff.txt b/inc/lang/lb/diff.txt new file mode 100644 index 0000000..7838b98 --- /dev/null +++ b/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/inc/lang/lb/draft.txt b/inc/lang/lb/draft.txt new file mode 100644 index 0000000..2e2fc9d --- /dev/null +++ b/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/inc/lang/lb/edit.txt b/inc/lang/lb/edit.txt new file mode 100644 index 0000000..ca039d1 --- /dev/null +++ b/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/inc/lang/lb/editrev.txt b/inc/lang/lb/editrev.txt new file mode 100644 index 0000000..dc2cc75 --- /dev/null +++ b/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. +---- diff --git a/inc/lang/lb/index.txt b/inc/lang/lb/index.txt new file mode 100644 index 0000000..183e07a --- /dev/null +++ b/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/inc/lang/lb/jquery.ui.datepicker.js b/inc/lang/lb/jquery.ui.datepicker.js new file mode 100644 index 0000000..936eb44 --- /dev/null +++ b/inc/lang/lb/jquery.ui.datepicker.js @@ -0,0 +1,48 @@ +/* Luxembourgish initialisation for the jQuery UI date picker plugin. */ +/* Written by Michel Weimerskirch */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/lb/lang.php b/inc/lang/lb/lang.php new file mode 100644 index 0000000..7464275 --- /dev/null +++ b/inc/lang/lb/lang.php @@ -0,0 +1,195 @@ +>'; +$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 Adobe Flash Plugin 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 Dokuwiki Installatiounsinstruktiounen'; +$lang['i_funcna'] = 'PHP-Funktioun %s ass net verfügbar. Vläicht huet däi Provider se aus iergend engem Grond ausgeschalt.'; +$lang['i_phpver'] = 'Deng PHP-Versioun %s ass méi kleng wéi déi gebrauchte Versioun %s. 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 %s Namespace. Du kanns och d\'Kierzilech Ännerungen vum ganze Wiki kucken.'; +$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/inc/lang/lb/locked.txt b/inc/lang/lb/locked.txt new file mode 100644 index 0000000..c170b5b --- /dev/null +++ b/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. diff --git a/inc/lang/lb/login.txt b/inc/lang/lb/login.txt new file mode 100644 index 0000000..7d0548e --- /dev/null +++ b/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/inc/lang/lb/mailtext.txt b/inc/lang/lb/mailtext.txt new file mode 100644 index 0000000..59c46e0 --- /dev/null +++ b/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/inc/lang/lb/newpage.txt b/inc/lang/lb/newpage.txt new file mode 100644 index 0000000..bf7108f --- /dev/null +++ b/inc/lang/lb/newpage.txt @@ -0,0 +1,3 @@ +======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/inc/lang/lb/norev.txt b/inc/lang/lb/norev.txt new file mode 100644 index 0000000..45a36ee --- /dev/null +++ b/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/inc/lang/lb/password.txt b/inc/lang/lb/password.txt new file mode 100644 index 0000000..1d05832 --- /dev/null +++ b/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/inc/lang/lb/preview.txt b/inc/lang/lb/preview.txt new file mode 100644 index 0000000..adac872 --- /dev/null +++ b/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/inc/lang/lb/pwconfirm.txt b/inc/lang/lb/pwconfirm.txt new file mode 100644 index 0000000..a57c5a3 --- /dev/null +++ b/inc/lang/lb/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/lb/read.txt b/inc/lang/lb/read.txt new file mode 100644 index 0000000..3f52bd6 --- /dev/null +++ b/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/inc/lang/lb/recent.txt b/inc/lang/lb/recent.txt new file mode 100644 index 0000000..c092251 --- /dev/null +++ b/inc/lang/lb/recent.txt @@ -0,0 +1,3 @@ +====== Rezent Ännerungen ====== + +Folgend Säite goufen an der lescht g'ännert: diff --git a/inc/lang/lb/register.txt b/inc/lang/lb/register.txt new file mode 100644 index 0000000..7664a94 --- /dev/null +++ b/inc/lang/lb/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/lb/registermail.txt b/inc/lang/lb/registermail.txt new file mode 100644 index 0000000..5240dee --- /dev/null +++ b/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/inc/lang/lb/resendpwd.txt b/inc/lang/lb/resendpwd.txt new file mode 100644 index 0000000..6ca4518 --- /dev/null +++ b/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/inc/lang/lb/revisions.txt b/inc/lang/lb/revisions.txt new file mode 100644 index 0000000..7dec327 --- /dev/null +++ b/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/inc/lang/lb/searchpage.txt b/inc/lang/lb/searchpage.txt new file mode 100644 index 0000000..f9d63ef --- /dev/null +++ b/inc/lang/lb/searchpage.txt @@ -0,0 +1,3 @@ +======Sich====== + +Hei ënnendrënner sinn d'Resultater vun der Sich. @CREATEPAGEINFO@ diff --git a/inc/lang/lb/showrev.txt b/inc/lang/lb/showrev.txt new file mode 100644 index 0000000..2fcd5e5 --- /dev/null +++ b/inc/lang/lb/showrev.txt @@ -0,0 +1,2 @@ +**Dat hei ass eng al Versioun vum Document!** +---- diff --git a/inc/lang/lb/updateprofile.txt b/inc/lang/lb/updateprofile.txt new file mode 100644 index 0000000..f270969 --- /dev/null +++ b/inc/lang/lb/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/lb/uploadmail.txt b/inc/lang/lb/uploadmail.txt new file mode 100644 index 0000000..c4b9e8d --- /dev/null +++ b/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/inc/lang/lt/admin.txt b/inc/lang/lt/admin.txt new file mode 100644 index 0000000..c930810 --- /dev/null +++ b/inc/lang/lt/admin.txt @@ -0,0 +1,3 @@ +====== Administracija ====== + +Žemiau matote veiksmų, kuriuos gali atlikti administratorius, sąrašą. diff --git a/inc/lang/lt/adminplugins.txt b/inc/lang/lt/adminplugins.txt new file mode 100644 index 0000000..78e197a --- /dev/null +++ b/inc/lang/lt/adminplugins.txt @@ -0,0 +1 @@ +===== Papildomi įskiepiai ===== \ No newline at end of file diff --git a/inc/lang/lt/backlinks.txt b/inc/lang/lt/backlinks.txt new file mode 100644 index 0000000..b289ae4 --- /dev/null +++ b/inc/lang/lt/backlinks.txt @@ -0,0 +1,3 @@ +====== Atgalinės nuorodos ====== + +Čia matote sąrašą puslapių, kuriuose yra nuorodos į esamą puslapį. diff --git a/inc/lang/lt/conflict.txt b/inc/lang/lt/conflict.txt new file mode 100644 index 0000000..858d616 --- /dev/null +++ b/inc/lang/lt/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/lt/denied.txt b/inc/lang/lt/denied.txt new file mode 100644 index 0000000..1f7781d --- /dev/null +++ b/inc/lang/lt/denied.txt @@ -0,0 +1,3 @@ +====== Priėjimas uždraustas ====== + +Jūs neturite reikiamų teisių, kad galėtumėte tęsti. diff --git a/inc/lang/lt/diff.txt b/inc/lang/lt/diff.txt new file mode 100644 index 0000000..5e63635 --- /dev/null +++ b/inc/lang/lt/diff.txt @@ -0,0 +1,3 @@ +====== Skirtumai ====== + +Čia matote skirtumus tarp pasirinktos versijos ir esamo dokumento. diff --git a/inc/lang/lt/draft.txt b/inc/lang/lt/draft.txt new file mode 100644 index 0000000..4d3191a --- /dev/null +++ b/inc/lang/lt/draft.txt @@ -0,0 +1,5 @@ +====== Rastas juodraščio failas ====== + +Jūsų paskutinė redagavimo sesija šiame puslapyje nebuvo tinkamai baigta. DokuWiki automatiškai išsaugojo juodraštį, kurį galite naudoti norėdami tęsti redagavimą. Žemiau galite pamatyti duomenis, kurie buvo išsaugoti iš jūsų paskutinės sesijos. + + Nuspręskite, ar norite //atkurti// prarastą redagavimo sesiją, //ištrinti// automatiškai išsaugotą juodraštį ar //atšaukti// redagavimo procesą. \ No newline at end of file diff --git a/inc/lang/lt/edit.txt b/inc/lang/lt/edit.txt new file mode 100644 index 0000000..3b5e021 --- /dev/null +++ b/inc/lang/lt/edit.txt @@ -0,0 +1 @@ +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/inc/lang/lt/editrev.txt b/inc/lang/lt/editrev.txt new file mode 100644 index 0000000..05b5539 --- /dev/null +++ b/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ą. +---- diff --git a/inc/lang/lt/index.txt b/inc/lang/lt/index.txt new file mode 100644 index 0000000..9e308bb --- /dev/null +++ b/inc/lang/lt/index.txt @@ -0,0 +1,3 @@ +====== Indeksas ====== + +Čia matote visų šiuo metu egzistuojančių puslapių sąrašą. Jie išrūšiuoti pagal [[doku>namespaces|pavadinimą]]. diff --git a/inc/lang/lt/jquery.ui.datepicker.js b/inc/lang/lt/jquery.ui.datepicker.js new file mode 100644 index 0000000..5f45734 --- /dev/null +++ b/inc/lang/lt/jquery.ui.datepicker.js @@ -0,0 +1,48 @@ +/* Lithuanian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.lt = { + closeText: "Uždaryti", + prevText: "Atgal", + nextText: "Pirmyn", + 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/inc/lang/lt/lang.php b/inc/lang/lt/lang.php new file mode 100644 index 0000000..7888074 --- /dev/null +++ b/inc/lang/lt/lang.php @@ -0,0 +1,189 @@ + + * @author Linas Valiukas + * @author Edmondas Girkantas + * @author Arūnas Vaitekūnas + * @author audrius.klevas + * @author Tomas Darius Davainis + */ +$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_resendpwd'] = 'Nustatykite naują slaptažodį'; +$lang['btn_draft'] = 'Redaguoti juodraštį'; +$lang['btn_recover'] = 'Atkurti juodraštį'; +$lang['btn_draftdel'] = 'Šalinti juodraštį'; +$lang['btn_revert'] = 'Atkurti'; +$lang['btn_register'] = 'Registruotis'; +$lang['btn_apply'] = 'Taikyti'; +$lang['btn_media'] = 'Žiniasklaidos vadybininkas'; +$lang['btn_deleteuser'] = 'Pašalinti mano paskyrą'; +$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['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['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['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'] = 'Adobe Flash Plugin 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/inc/lang/lt/locked.txt b/inc/lang/lt/locked.txt new file mode 100644 index 0000000..3f6d000 --- /dev/null +++ b/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/inc/lang/lt/login.txt b/inc/lang/lt/login.txt new file mode 100644 index 0000000..e5c9c2b --- /dev/null +++ b/inc/lang/lt/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/lt/mailtext.txt b/inc/lang/lt/mailtext.txt new file mode 100644 index 0000000..2abd3ab --- /dev/null +++ b/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/inc/lang/lt/newpage.txt b/inc/lang/lt/newpage.txt new file mode 100644 index 0000000..64d3c7f --- /dev/null +++ b/inc/lang/lt/newpage.txt @@ -0,0 +1,3 @@ +====== Š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/inc/lang/lt/norev.txt b/inc/lang/lt/norev.txt new file mode 100644 index 0000000..45efb1a --- /dev/null +++ b/inc/lang/lt/norev.txt @@ -0,0 +1,3 @@ +====== Tokios versijos nėra ====== + +Nurodyta versija neegzistuoja. Norėdami pamatyti visas dokumento versijas, paspauskite ''Senos versijos'' mygtuką diff --git a/inc/lang/lt/password.txt b/inc/lang/lt/password.txt new file mode 100644 index 0000000..0bcc8e7 --- /dev/null +++ b/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/inc/lang/lt/preview.txt b/inc/lang/lt/preview.txt new file mode 100644 index 0000000..796ca7d --- /dev/null +++ b/inc/lang/lt/preview.txt @@ -0,0 +1,3 @@ +====== Peržiūra ====== + +Čia matote, kaip atrodo jūsų pakeitimai. **Pakeitimai dar nėra išsaugoti**! diff --git a/inc/lang/lt/read.txt b/inc/lang/lt/read.txt new file mode 100644 index 0000000..17a150f --- /dev/null +++ b/inc/lang/lt/read.txt @@ -0,0 +1 @@ +Šį 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/inc/lang/lt/recent.txt b/inc/lang/lt/recent.txt new file mode 100644 index 0000000..3b09d82 --- /dev/null +++ b/inc/lang/lt/recent.txt @@ -0,0 +1,3 @@ +====== Naujausi keitimai ====== + +Šie puslapiai buvo neseniai pakeisti: diff --git a/inc/lang/lt/register.txt b/inc/lang/lt/register.txt new file mode 100644 index 0000000..c709140 --- /dev/null +++ b/inc/lang/lt/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/lt/resendpwd.txt b/inc/lang/lt/resendpwd.txt new file mode 100644 index 0000000..7538271 --- /dev/null +++ b/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/inc/lang/lt/revisions.txt b/inc/lang/lt/revisions.txt new file mode 100644 index 0000000..47ab773 --- /dev/null +++ b/inc/lang/lt/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/lt/searchpage.txt b/inc/lang/lt/searchpage.txt new file mode 100644 index 0000000..6986ee8 --- /dev/null +++ b/inc/lang/lt/searchpage.txt @@ -0,0 +1,3 @@ +====== Paieška ====== + +Žemiau matote Jūsų atliktos paieškos rezultatus. @CREATEPAGEINFO@ diff --git a/inc/lang/lt/showrev.txt b/inc/lang/lt/showrev.txt new file mode 100644 index 0000000..ed77424 --- /dev/null +++ b/inc/lang/lt/showrev.txt @@ -0,0 +1,2 @@ +**Čia yra sena dokumento versija!** +---- diff --git a/inc/lang/lt/updateprofile.txt b/inc/lang/lt/updateprofile.txt new file mode 100644 index 0000000..1ac294b --- /dev/null +++ b/inc/lang/lt/updateprofile.txt @@ -0,0 +1,3 @@ +====== Redaguoti savo profilį ====== + +Užpildykite tik tuos laukus, kuriuos norite pakeisti. Vartotojo vardo keisti nebūtina. diff --git a/inc/lang/lv/admin.txt b/inc/lang/lv/admin.txt new file mode 100644 index 0000000..42cbec1 --- /dev/null +++ b/inc/lang/lv/admin.txt @@ -0,0 +1,3 @@ +====== Administrēšana ====== + +DokuWiki pieejamas šādas administrēšanas iespējas: diff --git a/inc/lang/lv/adminplugins.txt b/inc/lang/lv/adminplugins.txt new file mode 100644 index 0000000..e8d208d --- /dev/null +++ b/inc/lang/lv/adminplugins.txt @@ -0,0 +1 @@ +===== Papildu moduļi ===== \ No newline at end of file diff --git a/inc/lang/lv/backlinks.txt b/inc/lang/lv/backlinks.txt new file mode 100644 index 0000000..632e8d4 --- /dev/null +++ b/inc/lang/lv/backlinks.txt @@ -0,0 +1,3 @@ +====== Saistītās lapas ====== + +Norāde uz šo lapu ir atrodama dokumentos: diff --git a/inc/lang/lv/conflict.txt b/inc/lang/lv/conflict.txt new file mode 100644 index 0000000..47888aa --- /dev/null +++ b/inc/lang/lv/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/lv/denied.txt b/inc/lang/lv/denied.txt new file mode 100644 index 0000000..59ce98e --- /dev/null +++ b/inc/lang/lv/denied.txt @@ -0,0 +1,3 @@ +====== Piekļuve aizliegta ====== + +Atvaino, tev nav tiesību turpināt. diff --git a/inc/lang/lv/diff.txt b/inc/lang/lv/diff.txt new file mode 100644 index 0000000..a5b71e1 --- /dev/null +++ b/inc/lang/lv/diff.txt @@ -0,0 +1,3 @@ +====== Atšķirības ====== + +Norādītais vecais variants no patreizējās lapas atšķiras ar. diff --git a/inc/lang/lv/draft.txt b/inc/lang/lv/draft.txt new file mode 100644 index 0000000..525f7cb --- /dev/null +++ b/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/inc/lang/lv/edit.txt b/inc/lang/lv/edit.txt new file mode 100644 index 0000000..3fcabfa --- /dev/null +++ b/inc/lang/lv/edit.txt @@ -0,0 +1 @@ +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 [[playground:playground|smilšukasti]]. diff --git a/inc/lang/lv/editrev.txt b/inc/lang/lv/editrev.txt new file mode 100644 index 0000000..0629b82 --- /dev/null +++ b/inc/lang/lv/editrev.txt @@ -0,0 +1,2 @@ +**Tu skaties vecu dokumenta versiju!** Ja to saglabāsi, tad izveidosies jauns dokuments ar šo veco saturu. +---- diff --git a/inc/lang/lv/index.txt b/inc/lang/lv/index.txt new file mode 100644 index 0000000..5eee93b --- /dev/null +++ b/inc/lang/lv/index.txt @@ -0,0 +1,3 @@ +====== Rādītājs ====== + +Visu pieejamo lapu rādītājs. Sakārtots pēc [[doku>namespaces|sadaļām]]. diff --git a/inc/lang/lv/install.html b/inc/lang/lv/install.html new file mode 100644 index 0000000..5778297 --- /dev/null +++ b/inc/lang/lv/install.html @@ -0,0 +1,7 @@ +

    Šī lapa palīdz Dokuwikipirmajā instalācijā un konfigurēšanā. Vairāk par instalatoru var lasīt tā documentācijas lapā.

    + +

    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 vajag 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).

    + +

    Instalators konfigurēs DokuWiki ACL 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.

    + +

    Pieredzējušiem lietotājiem ar īpašām prasībām jāmeklē sīkākas ziņas uzstādīšanas instrukcijā un konfigurēšanas padomos.

    diff --git a/inc/lang/lv/jquery.ui.datepicker.js b/inc/lang/lv/jquery.ui.datepicker.js new file mode 100644 index 0000000..25d4a37 --- /dev/null +++ b/inc/lang/lv/jquery.ui.datepicker.js @@ -0,0 +1,48 @@ +/* Latvian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* @author Arturas Paleicikas */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/lv/lang.php b/inc/lang/lv/lang.php new file mode 100644 index 0000000..c91e2b4 --- /dev/null +++ b/inc/lang/lv/lang.php @@ -0,0 +1,339 @@ + + * @author Aivars Miška + */ +$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.
    Š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 Adobe Flash Plugin.'; +$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ā '; +$lang['i_funcna'] = 'PHP funkcija %s nav pieejama. Varbūt jūsu servera īpašnieks to kāda iemesla dēļ atslēdzis?'; +$lang['i_phpver'] = 'Jūsu PHP versija %s ir par vecu. Vajag versiju %s. 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 %s. Jālabo direktorijas tiesības!'; +$lang['i_confexists'] = '%s jau ir'; +$lang['i_writeerr'] = 'Nevar izveidot %s. 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=%s)'; +$lang['i_badval'] = '%s - 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 savā jaunajā DokuWiki.'; +$lang['i_failure'] = 'Rakstot konfigurācijas failu, gadījās dažas kļūmes. Pirms lieto savu jauno DokuWiki, 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ļā %s. Ir iespējams skatīt jaunākos grozījums visā viki. '; +$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/inc/lang/lv/locked.txt b/inc/lang/lv/locked.txt new file mode 100644 index 0000000..6536eea --- /dev/null +++ b/inc/lang/lv/locked.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/lv/login.txt b/inc/lang/lv/login.txt new file mode 100644 index 0000000..3ae5292 --- /dev/null +++ b/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/inc/lang/lv/mailtext.txt b/inc/lang/lv/mailtext.txt new file mode 100644 index 0000000..8316003 --- /dev/null +++ b/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/inc/lang/lv/mailwrap.html b/inc/lang/lv/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/lv/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/lv/newpage.txt b/inc/lang/lv/newpage.txt new file mode 100644 index 0000000..1180cf7 --- /dev/null +++ b/inc/lang/lv/newpage.txt @@ -0,0 +1,3 @@ +====== Šķ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/inc/lang/lv/norev.txt b/inc/lang/lv/norev.txt new file mode 100644 index 0000000..a668810 --- /dev/null +++ b/inc/lang/lv/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/lv/password.txt b/inc/lang/lv/password.txt new file mode 100644 index 0000000..7cd7d8b --- /dev/null +++ b/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/inc/lang/lv/preview.txt b/inc/lang/lv/preview.txt new file mode 100644 index 0000000..fe43b36 --- /dev/null +++ b/inc/lang/lv/preview.txt @@ -0,0 +1,3 @@ +====== Priekšskats ====== + +Tavs teksts izskatīsies šādi. **Ievēro, tas vēl nav saglabāts**! diff --git a/inc/lang/lv/pwconfirm.txt b/inc/lang/lv/pwconfirm.txt new file mode 100644 index 0000000..5dcc3f3 --- /dev/null +++ b/inc/lang/lv/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/lv/read.txt b/inc/lang/lv/read.txt new file mode 100644 index 0000000..4d47982 --- /dev/null +++ b/inc/lang/lv/read.txt @@ -0,0 +1 @@ +Šī 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/inc/lang/lv/recent.txt b/inc/lang/lv/recent.txt new file mode 100644 index 0000000..86d3141 --- /dev/null +++ b/inc/lang/lv/recent.txt @@ -0,0 +1,3 @@ +====== Jaunākie grozījumi ====== + +Jaunākie labojumi ir: diff --git a/inc/lang/lv/register.txt b/inc/lang/lv/register.txt new file mode 100644 index 0000000..a602d74 --- /dev/null +++ b/inc/lang/lv/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/lv/registermail.txt b/inc/lang/lv/registermail.txt new file mode 100644 index 0000000..2a2084c --- /dev/null +++ b/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/inc/lang/lv/resendpwd.txt b/inc/lang/lv/resendpwd.txt new file mode 100644 index 0000000..3f4597a --- /dev/null +++ b/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/inc/lang/lv/resetpwd.txt b/inc/lang/lv/resetpwd.txt new file mode 100644 index 0000000..000b748 --- /dev/null +++ b/inc/lang/lv/resetpwd.txt @@ -0,0 +1,3 @@ +====== Uzstādīt jaunu paroli ====== + +Lūdzu izvēlies savam kontam jaunu paroli. diff --git a/inc/lang/lv/revisions.txt b/inc/lang/lv/revisions.txt new file mode 100644 index 0000000..3857784 --- /dev/null +++ b/inc/lang/lv/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/lv/searchpage.txt b/inc/lang/lv/searchpage.txt new file mode 100644 index 0000000..065e71f --- /dev/null +++ b/inc/lang/lv/searchpage.txt @@ -0,0 +1,3 @@ +====== Meklēšana ====== + +Te vari redzēt meklēšanas rezultātus. @CREATEPAGEINFO@ diff --git a/inc/lang/lv/showrev.txt b/inc/lang/lv/showrev.txt new file mode 100644 index 0000000..7d5c0fa --- /dev/null +++ b/inc/lang/lv/showrev.txt @@ -0,0 +1,2 @@ +**Šī ir veca dokumenta versija!** +---- diff --git a/inc/lang/lv/stopwords.txt b/inc/lang/lv/stopwords.txt new file mode 100644 index 0000000..8447257 --- /dev/null +++ b/inc/lang/lv/stopwords.txt @@ -0,0 +1,46 @@ +# Š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/ +ārpus +šaipus +aiz +apakš +apakšpus +augšpus +bez +caur +dēļ +gar +iekšpus +itin +iz +jā +jo +kaut +kopš +līdz +labad +lejpus +nē +nav +no +otrpus +pār +pēc +pēc +pa +par +pie +pirms +pret +priekš +starp +taču +uz +vai +viņpus +virs +virspus +www +zem diff --git a/inc/lang/lv/subscr_digest.txt b/inc/lang/lv/subscr_digest.txt new file mode 100644 index 0000000..fb24a31 --- /dev/null +++ b/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/inc/lang/lv/subscr_form.txt b/inc/lang/lv/subscr_form.txt new file mode 100644 index 0000000..9e3145f --- /dev/null +++ b/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/inc/lang/lv/subscr_list.txt b/inc/lang/lv/subscr_list.txt new file mode 100644 index 0000000..9c0ecf8 --- /dev/null +++ b/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/inc/lang/lv/subscr_single.txt b/inc/lang/lv/subscr_single.txt new file mode 100644 index 0000000..b5b05d3 --- /dev/null +++ b/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/inc/lang/lv/updateprofile.txt b/inc/lang/lv/updateprofile.txt new file mode 100644 index 0000000..0972079 --- /dev/null +++ b/inc/lang/lv/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/lv/uploadmail.txt b/inc/lang/lv/uploadmail.txt new file mode 100644 index 0000000..8d664d6 --- /dev/null +++ b/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/inc/lang/mg/admin.txt b/inc/lang/mg/admin.txt new file mode 100644 index 0000000..a4ed67b --- /dev/null +++ b/inc/lang/mg/admin.txt @@ -0,0 +1,3 @@ +====== Administration ====== + +Hitanao eo ambany lisitry ny asa fanaovana admin misy amin'ny DokuWiki. diff --git a/inc/lang/mg/backlinks.txt b/inc/lang/mg/backlinks.txt new file mode 100644 index 0000000..e07cfe6 --- /dev/null +++ b/inc/lang/mg/backlinks.txt @@ -0,0 +1,3 @@ +====== Verindrohy ====== + +Lisitr'ireo pejy misy rohy manondro amin'ity pejy ity. diff --git a/inc/lang/mg/conflict.txt b/inc/lang/mg/conflict.txt new file mode 100644 index 0000000..7d614fe --- /dev/null +++ b/inc/lang/mg/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/mg/denied.txt b/inc/lang/mg/denied.txt new file mode 100644 index 0000000..af64f78 --- /dev/null +++ b/inc/lang/mg/denied.txt @@ -0,0 +1,3 @@ +====== Tsy tafiditra ====== + +Miala tsiny fa tsy manana alalana hanohizana mankany ianao. diff --git a/inc/lang/mg/diff.txt b/inc/lang/mg/diff.txt new file mode 100644 index 0000000..cd6ab2a --- /dev/null +++ b/inc/lang/mg/diff.txt @@ -0,0 +1,3 @@ +====== Tsy fitoviana ====== + +Ireto ny maha-samihafa ny kinova nosafidiana sy ny kinovan'ny pejy amin'izao. diff --git a/inc/lang/mg/edit.txt b/inc/lang/mg/edit.txt new file mode 100644 index 0000000..de222e5 --- /dev/null +++ b/inc/lang/mg/edit.txt @@ -0,0 +1 @@ +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 [[playground:playground]]. diff --git a/inc/lang/mg/editrev.txt b/inc/lang/mg/editrev.txt new file mode 100644 index 0000000..1ebe350 --- /dev/null +++ b/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. +---- diff --git a/inc/lang/mg/index.txt b/inc/lang/mg/index.txt new file mode 100644 index 0000000..706e37c --- /dev/null +++ b/inc/lang/mg/index.txt @@ -0,0 +1,3 @@ +====== Index ====== + +Ity misy index mahasarona ireo pejy misy milahatra arakaraka ny [[doku>namespaces|namespaces]]. diff --git a/inc/lang/mg/lang.php b/inc/lang/mg/lang.php new file mode 100644 index 0000000..aea3942 --- /dev/null +++ b/inc/lang/mg/lang.php @@ -0,0 +1,119 @@ +>'; +$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/inc/lang/mg/locked.txt b/inc/lang/mg/locked.txt new file mode 100644 index 0000000..9ed5b00 --- /dev/null +++ b/inc/lang/mg/locked.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/mg/login.txt b/inc/lang/mg/login.txt new file mode 100644 index 0000000..587751c --- /dev/null +++ b/inc/lang/mg/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/mg/mailtext.txt b/inc/lang/mg/mailtext.txt new file mode 100644 index 0000000..c772686 --- /dev/null +++ b/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/inc/lang/mg/newpage.txt b/inc/lang/mg/newpage.txt new file mode 100644 index 0000000..7479057 --- /dev/null +++ b/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/inc/lang/mg/norev.txt b/inc/lang/mg/norev.txt new file mode 100644 index 0000000..09734b9 --- /dev/null +++ b/inc/lang/mg/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/mg/password.txt b/inc/lang/mg/password.txt new file mode 100644 index 0000000..4ed2858 --- /dev/null +++ b/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/inc/lang/mg/preview.txt b/inc/lang/mg/preview.txt new file mode 100644 index 0000000..d5c1668 --- /dev/null +++ b/inc/lang/mg/preview.txt @@ -0,0 +1,3 @@ +====== Topi-maso ====== + +Topi-maso ahafahanao mijery ny fivoakan'ny soratra nataonao ity. **Tandremo: Mbola tsy voarakitra io**! diff --git a/inc/lang/mg/read.txt b/inc/lang/mg/read.txt new file mode 100644 index 0000000..8b341de --- /dev/null +++ b/inc/lang/mg/read.txt @@ -0,0 +1 @@ +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/inc/lang/mg/recent.txt b/inc/lang/mg/recent.txt new file mode 100644 index 0000000..b88f521 --- /dev/null +++ b/inc/lang/mg/recent.txt @@ -0,0 +1,3 @@ +====== Fiovana farany ====== + +Ireto pejy ireto no niova vao haingana: diff --git a/inc/lang/mg/register.txt b/inc/lang/mg/register.txt new file mode 100644 index 0000000..e421b1a --- /dev/null +++ b/inc/lang/mg/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/mg/revisions.txt b/inc/lang/mg/revisions.txt new file mode 100644 index 0000000..64291c9 --- /dev/null +++ b/inc/lang/mg/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/mg/searchpage.txt b/inc/lang/mg/searchpage.txt new file mode 100644 index 0000000..fde6d29 --- /dev/null +++ b/inc/lang/mg/searchpage.txt @@ -0,0 +1,3 @@ +====== Karoka ====== + +Ireto ambany ireto ny valin'ny fikarohanao. @CREATEPAGEINFO@ diff --git a/inc/lang/mg/showrev.txt b/inc/lang/mg/showrev.txt new file mode 100644 index 0000000..92690f4 --- /dev/null +++ b/inc/lang/mg/showrev.txt @@ -0,0 +1,2 @@ +**Ity dia kinovan'ny pejy taloha!** +---- diff --git a/inc/lang/mk/adminplugins.txt b/inc/lang/mk/adminplugins.txt new file mode 100644 index 0000000..28e2cc1 --- /dev/null +++ b/inc/lang/mk/adminplugins.txt @@ -0,0 +1 @@ +===== Додатни приклучоци ===== \ No newline at end of file diff --git a/inc/lang/mk/jquery.ui.datepicker.js b/inc/lang/mk/jquery.ui.datepicker.js new file mode 100644 index 0000000..6f430e9 --- /dev/null +++ b/inc/lang/mk/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Macedonian i18n for the jQuery UI date picker plugin. */ +/* Written by Stojce Slavkovski. */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.mk = { + 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.mk ); + +return datepicker.regional.mk; + +} ); diff --git a/inc/lang/mk/lang.php b/inc/lang/mk/lang.php new file mode 100644 index 0000000..af7dc47 --- /dev/null +++ b/inc/lang/mk/lang.php @@ -0,0 +1,226 @@ + + */ +$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'] = 'Adobe Flash приклучокот е потребен за да се прикаже оваа содржина.'; +$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. Или извадете ги повторно датотеките од симнатиот пакет или консултирајте се со комплетните Dokuwiki инструкции за инсталација'; +$lang['i_funcna'] = 'PHP функцијата %s не е достапна. Можеби вашиот хостинг провајдер ја оневозможил со причина?'; +$lang['i_phpver'] = 'Вашата верзија на PHP %s е пониска од потребната %s. Треба да ја надградите вашата PHP инсталација.'; +$lang['i_permfail'] = '%s не е запишлива од DokuWiki. Треба да ги поправите подесувањата за пермисии на овој директориум!'; +$lang['i_confexists'] = '%s веќе постои'; +$lang['i_writeerr'] = 'Не може да се креира %s. Треба да ги проверите пермисиите на директориумот/датотеката и рачно да ја креирате датотеката.'; +$lang['i_badhash'] = 'непозната или изменете dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - нелегална или празна вредност'; +$lang['i_success'] = 'Конфигурацијата успешно заврши. Сега можете да ја избришете датотеката install.php. Продолжете до вашето ново DokuWiki.'; +$lang['i_failure'] = 'Се појавија некои грешки при запишувањето на конфигурациските датотеки. Можеби треба да ги поравите рачно пред да можете да го користите вашето ново DokuWiki.'; +$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/inc/lang/mk/read.txt b/inc/lang/mk/read.txt new file mode 100644 index 0000000..437f17b --- /dev/null +++ b/inc/lang/mk/read.txt @@ -0,0 +1 @@ +Оваа страница е само за читање. Можете да го гледате изворот, но не можете да ја менувате. Ако мислите дека ова е погрешно, контактирајте го администраторот. diff --git a/inc/lang/mk/recent.txt b/inc/lang/mk/recent.txt new file mode 100644 index 0000000..4b0959e --- /dev/null +++ b/inc/lang/mk/recent.txt @@ -0,0 +1,3 @@ +====== Скорешни промени ====== + +Следниве страници беа скорешно променети: diff --git a/inc/lang/mk/showrev.txt b/inc/lang/mk/showrev.txt new file mode 100644 index 0000000..8cb903b --- /dev/null +++ b/inc/lang/mk/showrev.txt @@ -0,0 +1,2 @@ +**Ова е стара ревизија од документото!** +---- diff --git a/inc/lang/ml/admin.txt b/inc/lang/ml/admin.txt new file mode 100644 index 0000000..a96555c --- /dev/null +++ b/inc/lang/ml/admin.txt @@ -0,0 +1,3 @@ +====== പൊതു സെറ്റിംഗ്സ് ====== + +താഴെ കാണുന്ന പട്ടിക ഡോക്കുവിക്കിയിൽ ഉള്ള പൊതു സെറ്റിംഗ്സ് ആണ് . diff --git a/inc/lang/ml/jquery.ui.datepicker.js b/inc/lang/ml/jquery.ui.datepicker.js new file mode 100644 index 0000000..b6223c8 --- /dev/null +++ b/inc/lang/ml/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Malayalam (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Saji Nediyanchath (saji89@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/mr/admin.txt b/inc/lang/mr/admin.txt new file mode 100644 index 0000000..9dafe91 --- /dev/null +++ b/inc/lang/mr/admin.txt @@ -0,0 +1,3 @@ +====== व्यवस्थापन ====== + +खाली तुम्हाला डॉक्युविकि मधे उपलब्ध असलेल्या व्यवस्थापनाच्या क्रियांची सूची दिली आहे. diff --git a/inc/lang/mr/backlinks.txt b/inc/lang/mr/backlinks.txt new file mode 100644 index 0000000..c9b075e --- /dev/null +++ b/inc/lang/mr/backlinks.txt @@ -0,0 +1,3 @@ +====== प्रतिलिंक ====== + +ही त्या सर्व प्रृष्ठांची सूची आहे जी या पृष्ठाला परत लिंक करतात. diff --git a/inc/lang/mr/conflict.txt b/inc/lang/mr/conflict.txt new file mode 100644 index 0000000..dd9a843 --- /dev/null +++ b/inc/lang/mr/conflict.txt @@ -0,0 +1,5 @@ +====== नवीन आवृत्ती उपलब्ध आहे ====== + +तुम्ही संपादित केलेल्या दस्तावेजाची नवीन आवृत्ती उपलब्ध आहे. तुम्ही संपादित करत असलेल्या दस्तावेजामधे त्याच वेळी इतर यूजरने बदल केल्यास असे घडते. + +खाली दर्शाविलेले फरक नीट तपासा आणि त्यापैकी कुठले ठेवायचे ते ठरवा. जर तुम्ही 'सुरक्षित' केलं तर तुमचे बदल सुरक्षित होतील. सध्याची आवृत्ति ठेवण्यासाठी 'कॅन्सल' वर क्लिक करा. diff --git a/inc/lang/mr/denied.txt b/inc/lang/mr/denied.txt new file mode 100644 index 0000000..4fb1c55 --- /dev/null +++ b/inc/lang/mr/denied.txt @@ -0,0 +1,3 @@ +====== परवानगी नाकारली ====== + +क्षमा करा, पण तुम्हाला यापुढे जाण्याचे हक्क नाहीत. diff --git a/inc/lang/mr/diff.txt b/inc/lang/mr/diff.txt new file mode 100644 index 0000000..e6abdfe --- /dev/null +++ b/inc/lang/mr/diff.txt @@ -0,0 +1,3 @@ +====== फरक ====== + +या पानावर तुम्हाला निवडलेली आवृत्ती व सध्याच्या आवृत्ती मधले फरक दाखवले आहेत. diff --git a/inc/lang/mr/draft.txt b/inc/lang/mr/draft.txt new file mode 100644 index 0000000..52f8d2e --- /dev/null +++ b/inc/lang/mr/draft.txt @@ -0,0 +1,5 @@ +====== मसुद्याची फाइल मिळाली ====== + +तुमचा मागचा संपादानाचा सेशन नीट पूर्ण झाला नव्हता. डॉक्युविकिने तुमच्या कामाचा मसुदा आपोआप सुरक्षित केला होता , जो वापरून तुमची संपादन परत चालू करू शकता. खाली तुमच्या मागच्या सेशन मधला सुरक्षित केलेला डेटा दाखवला आहे. + +कृपया आता हे ठरवा की तुमच्या संपादन सेशनचे //पुनर्स्थापन// करायचे, सुरक्षित केलेला मसुदा //रद्द// करायचा का संपादनच //कॅन्सल// करायचं. diff --git a/inc/lang/mr/edit.txt b/inc/lang/mr/edit.txt new file mode 100644 index 0000000..d372edf --- /dev/null +++ b/inc/lang/mr/edit.txt @@ -0,0 +1 @@ +पान संपादित करा आणि 'सुरक्षित' वर क्लिक करा. विकी सिन्टॅक्स साठी [[wiki:syntax]] पहा.कृपया तुम्ही जर एखादे पान **सुधारित** करू शकत असाल तरच ते संपादित करा. अन्यथा जर तुम्हाला फ़क्त काही गोष्टी ट्राय करून बघायच्या असतील तर [[playground:playground|प्लेग्राऊण्ड]] मधे आपले धडे गिरवा! diff --git a/inc/lang/mr/editrev.txt b/inc/lang/mr/editrev.txt new file mode 100644 index 0000000..7eb3560 --- /dev/null +++ b/inc/lang/mr/editrev.txt @@ -0,0 +1,2 @@ +**तुमची या पानाची जुनी आवृत्ती लोड केलि आहे!** जर तुमची ती सुरक्षित केली तर तुमची त्याची एक नवीन आवृत्ती तयार कराल. +---- diff --git a/inc/lang/mr/index.txt b/inc/lang/mr/index.txt new file mode 100644 index 0000000..a15af08 --- /dev/null +++ b/inc/lang/mr/index.txt @@ -0,0 +1,3 @@ +====== सूची ====== + +ही सर्व उपलब्ध पानांची [[doku>namespaces|नेमस्पेस]] अनुसार तयार केलेली सूची आहे. diff --git a/inc/lang/mr/install.html b/inc/lang/mr/install.html new file mode 100644 index 0000000..9800b54 --- /dev/null +++ b/inc/lang/mr/install.html @@ -0,0 +1,7 @@ +

    हे पान डॉक्युविकि च्या पहिल्या इन्स्टॉलेशन आणि कॉन्फिगरेशन साठी मदत करतं. या इंस्टॉलर विषयी जास्ती माहिती त्याच्या माहितीसंग्रह पानावर उपलब्ध आहे.

    + +

    डॉक्युविकि विकी पाने व सम्बंधित माहिती ( उदा. फोटो , शोध सूची, जुन्या आवृत्ती ई.) साठवण्यासाठी सामान्य फाइलचा उपयोग करतं. डॉक्युविकिने नीट काम करण्यासाठी डॉक्युविकिला या फाइल जिथे साठवल्या आहेत त्या डिरेक्टरीमधे लेखनाचे हक्क ( write access ) असणे अत्यावश्यक आहे. या इंस्टॉलरला डिरेक्टरीचे हक्क सेट करता येत नाहीत. ते थेट तुमच्या शेल मधून सेट करावे लागतात, किंवा तुम्ही व्यावसायिक होस्टिंग वापरत असाल तर FTP वापरून अथवा तुमच्या होस्टिंग कंट्रोल पॅनल ( उदा. cPanel वगैरे ) मधून सेट करावे लागतात.

    + +

    हा इंस्टॉलर तुमच्या डॉक्युविकिचे ACL कॉन्फिगरेशन ठरवेल, ज्याद्वारे तुम्हाला व्यवस्थापकीय लॉगिन, डॉक्युविकिच्या व्यवस्थापन मेनू मधे प्लगिनचे इन्स्टॉलेशन, सदस्यांची व्यवस्था, विकी पानांवरील हक्क, कॉन्फिगरेशन बदलणे ई. साठी प्रवेशाचे हक्क वगैरे बदल करता येतील. ही व्यवस्था डॉक्युविकि वापरण्यासाठी आवश्यक नाही पण वापरल्यास डॉक्युविकिचे व्यवस्थापन अधिक सुरळित होइल.

    + +

    अनुभवी सदस्य किंवा ज्याना काही ख़ास गरजा असतील त्यानी खालील लिंक्स वापराव्यात : इन्स्टॉलेशनविषयी सूचना and कॉन्फिगरेशनची सेटिंग

    diff --git a/inc/lang/mr/lang.php b/inc/lang/mr/lang.php new file mode 100644 index 0000000..567a91d --- /dev/null +++ b/inc/lang/mr/lang.php @@ -0,0 +1,265 @@ + + * @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'] = 'ही माहिती दाखवण्यासाठी अडोब फ्लॅश प्लेअर ची गरज आहे.'; +$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'] = 'सुरक्षिततेच्या कारणासठि ही स्क्रिप्ट फ़क्त नवीन आणि बदललेल्या डॉक्युविकि इन्स्टॉलेशन मधेच चालेल. तुम्ही एकतर डाउनलोड केलेले पॅकेज मधील फाइल परत प्रसारित करा किंवा डॉक्युविकि इन्स्टॉलेशन विषयी सूचना वाचा.'; +$lang['i_funcna'] = 'PHP मधलं %s हे फंक्शन उपलब्ध नाही. बहुधा तुमच्या होस्टिंग पुरवणाराने ते काही कारणाने अनुपलब्ध केलं असावं.'; +$lang['i_phpver'] = 'तुमची PHP आवृत्ति %s ही आवश्यक असलेल्या %s ह्या आवृत्तिपेक्षा कमी आहे. कृपया तुमचे PHP इन्स्टॉलेशन अद्ययावत करा.'; +$lang['i_permfail'] = '%s या डिरेक्टरी मध्ये डॉक्युविकि बदल करू शकत नाही. कृपया या डिरेक्टरीच्या परवानग्या ठीक करा.'; +$lang['i_confexists'] = '%s आधीच अस्तित्वात आहे.'; +$lang['i_writeerr'] = '%s निर्माण करू शकलो नाही. तुम्हाला डिरेक्टरी / फाइल च्या परवानग्या तपासून स्वतःच ही फाइल बनवावी लागेल.'; +$lang['i_badhash'] = 'अनाकलनीय किंवा बदललेले dokuwiki.php (hash=%s)'; +$lang['i_badval'] = 'code>%s
    - अवैध किंवा रिकामा मजकूर.'; +$lang['i_success'] = 'व्यवस्था लावण्याचे काम यशस्वीरीत्या पार पडले. आता तुम्ही install.php डिलीट करू शकता. तुमच्या नविन डॉक्युविकि वर जा.'; +$lang['i_failure'] = 'कॉन्फिगुरेशनच्या फाइल सुरक्षित करताना काही अडचणी आल्या आहेत. तुमची नवीन डॉक्युविकि वापरण्याआधी तुम्हाला ह्या फाइल स्वतः ठीक कराव्या लागतील.'; +$lang['i_policy'] = 'आरंभीची ACL पॉलिसी'; +$lang['i_pol0'] = 'मुक्त विकी ( सर्वांना वाचन, लेखन व अपलोड करण्याची परवानगी )'; +$lang['i_pol1'] = 'सार्वजनिक विकी ( सर्वांना वाचण्याची मुभा , लेखन व अपलोडची परवानगी फक्त नोंदणीकृत सदस्यांना )'; +$lang['i_pol2'] = 'बंदिस्त विकी ( वाचन , लेखन व अपलोडची परवानगी फक्त नोंदणीकृत सदस्यांना ) '; +$lang['i_retry'] = 'पुन्हा प्रयत्न'; +$lang['recent_global'] = 'तुम्ही सध्या %s या नेमस्पेस मधील बदल पाहात आहात.तुम्ही पूर्ण विकी मधले बदल सुद्धा पाहू शकता.'; +$lang['email_signature_text'] = 'हा ईमेल, येथील डॉक्युविकिद्वारा आपोआप तयार केला गेला आहे +@DOKUWIKIURL@'; diff --git a/inc/lang/mr/locked.txt b/inc/lang/mr/locked.txt new file mode 100644 index 0000000..f0c6e07 --- /dev/null +++ b/inc/lang/mr/locked.txt @@ -0,0 +1,3 @@ +====== पान लॉक आहे ====== + +हे पान सध्या दुसर्या सदस्याने संपादनासाठी लॉक केले आहे. तुम्हाला त्याचे संपादन करून होईपर्यंत किंवा लॉक संपेपर्यंत थांबावे लागेल. diff --git a/inc/lang/mr/login.txt b/inc/lang/mr/login.txt new file mode 100644 index 0000000..1b5d2e6 --- /dev/null +++ b/inc/lang/mr/login.txt @@ -0,0 +1,3 @@ +====== लॉगिन ====== + +तुम्ही सध्या लॉगिन केलेले नाही! तुमचे नाव-पासवर्ड देऊन खाली लॉगिन करा. लॉगिन करण्यासाठी तुमच्या ब्राउजरमधे कुकीज चालू असल्या पाहिजेत. diff --git a/inc/lang/mr/mailtext.txt b/inc/lang/mr/mailtext.txt new file mode 100644 index 0000000..826ab0c --- /dev/null +++ b/inc/lang/mr/mailtext.txt @@ -0,0 +1,12 @@ +तुमच्या डॉक्युविकिमधील एक पान बदलले किंवा नवीन टाकले गेले आहे. त्याची माहिती पुढील प्रमाणे : + +दिनांक : @DATE@ +ब्राउजर : @BROWSER@ +IP-पत्ता : @IPADDRESS@ +मशिनचे नाव ( Host name ) : @HOSTNAME@ +जुनी आवृत्ती : @OLDPAGE@ +नवी आवृत्ती : @NEWPAGE@ +संपादन सारांश : @SUMMARY@ +सदस्य : @USER@ + +@DIFF@ diff --git a/inc/lang/mr/newpage.txt b/inc/lang/mr/newpage.txt new file mode 100644 index 0000000..d6a43cb --- /dev/null +++ b/inc/lang/mr/newpage.txt @@ -0,0 +1,3 @@ +====== हा मुद्दा अजून अस्तित्त्वात नाही ====== + +तुमची अशा एखाद्या मुद्द्याच्या लिंक वरून इथे आला आहात जो अजून अस्तित्त्वात नाही. जर तुम्हाला परवानगी असेल तर तुमची त्या मुद्द्यावर **हे पान नवीन तयार करा** हे बटण क्लिक करून स्वतः एक पान तयार करू शकता. diff --git a/inc/lang/mr/norev.txt b/inc/lang/mr/norev.txt new file mode 100644 index 0000000..7548c05 --- /dev/null +++ b/inc/lang/mr/norev.txt @@ -0,0 +1,3 @@ +====== अशी कुठली आवृत्ती नाही ====== + +ही आवृत्ती अस्तित्त्वात नाही. "जुन्या आवृत्त्या" बटण वापरून या दस्तावेजाच्या सर्व जुन्या आवृत्त्या तुमची पाहू शकता. diff --git a/inc/lang/mr/password.txt b/inc/lang/mr/password.txt new file mode 100644 index 0000000..a83f97e --- /dev/null +++ b/inc/lang/mr/password.txt @@ -0,0 +1,6 @@ +नमस्कार @FULLNAME@! + +खाली तुमच्या @DOKUWIKIURL@ येथील @TITLE@ साठी सदस्य माहिती दिली आहे. + +लॉगिन : @LOGIN@ +पासवर्ड : @PASSWORD@ diff --git a/inc/lang/mr/preview.txt b/inc/lang/mr/preview.txt new file mode 100644 index 0000000..fc2c157 --- /dev/null +++ b/inc/lang/mr/preview.txt @@ -0,0 +1,3 @@ +====== झलक ====== + +ही तुमचा मजकूर कसा दिसेल त्याची एक झलक आहे. लक्षात ठेवा : हा मजकूर अजुन **सुरक्षित केलेला नाही** ! diff --git a/inc/lang/mr/pwconfirm.txt b/inc/lang/mr/pwconfirm.txt new file mode 100644 index 0000000..0b2a132 --- /dev/null +++ b/inc/lang/mr/pwconfirm.txt @@ -0,0 +1,9 @@ +नमस्कार @FULLNAME@! + +कोणीतरी तुमच्या @TITLE@ या @DOKUWIKIURL@ येथील लॉगिनसाठी नवीन पासवर्ड मागवला आहे. + +जर तुम्ही हा पासवर्ड मागवला नसेल तर कृपया ह्या ईमेलकड़े दुर्लक्ष करा. + +जर नक्की तुम्हीच हा पासवर्ड मागवला असेल तर खालील लिंकवर क्लिक करून ते नक्की करा. + +@CONFIRM@ diff --git a/inc/lang/mr/read.txt b/inc/lang/mr/read.txt new file mode 100644 index 0000000..0f54c67 --- /dev/null +++ b/inc/lang/mr/read.txt @@ -0,0 +1 @@ +हे पान फक्त वाचता येऊ शकतं. तुम्ही त्याचा मूळ विकी मजकूर पाहू शकता पण तो बदलू शकत नाही. जर हे चुकीचं असेल तर तुमच्या विकी व्यवस्थापकाशी संपर्क साधा. diff --git a/inc/lang/mr/recent.txt b/inc/lang/mr/recent.txt new file mode 100644 index 0000000..e649890 --- /dev/null +++ b/inc/lang/mr/recent.txt @@ -0,0 +1,3 @@ +====== अलीकडील बदल ====== + +खालील पाने हल्लीच बदलली आहेत: diff --git a/inc/lang/mr/register.txt b/inc/lang/mr/register.txt new file mode 100644 index 0000000..15bbda1 --- /dev/null +++ b/inc/lang/mr/register.txt @@ -0,0 +1,3 @@ +====== नवीन सदस्य म्हणुन नोंदणी करा ====== + +खाली तुमची माहिती भरून या विकी वर नवीन खातं उघडा. कृपया आपण देत असलेला ईमेल चालू असल्याची खात्री करा - जर तुम्हाला इथे पासवर्ड टाकायला सांगितला नाही तयार एक नवीन पासवर्ड तुम्हाला त्या ईमेल वर पाठवला जाइल. तुमचं लॉगिन नाम एक वैध [[doku>pagename|पेजनेम]] असले पाहिजे. diff --git a/inc/lang/mr/registermail.txt b/inc/lang/mr/registermail.txt new file mode 100644 index 0000000..ed3b92b --- /dev/null +++ b/inc/lang/mr/registermail.txt @@ -0,0 +1,10 @@ +एक नवीन सदस्याची नोंदणी झाली आहे. त्याची माहीत पुढीलप्रमाणे : + +सदस्य नाम : @NEWUSER@ +पूर्ण नाव : @NEWNAME@ +ईमेल : @NEWEMAIL@ + +दिनांक : @DATE@ +ब्राउजर : @BROWSER@ +IP-पत्ता : @IPADDRESS@ +होस्ट नाम : @HOSTNAME@ diff --git a/inc/lang/mr/resendpwd.txt b/inc/lang/mr/resendpwd.txt new file mode 100644 index 0000000..db9bdfe --- /dev/null +++ b/inc/lang/mr/resendpwd.txt @@ -0,0 +1,3 @@ +====== नवीन पासवर्ड पाठव ====== + +या विकिवरील तुमच्या अकाउंटसाठी नवीन पासवर्ड मिळवण्यासाठी कृपया तुमचे सदस्य नाम खालच्या फॉर्म मधे टाका. ही पासवर्डची मागणी नक्की करण्यासाठी तुम्ही नोंदणी करताना दिलेल्या ईमेल पत्त्यावर एक लिंक पाठवली जाइल. diff --git a/inc/lang/mr/revisions.txt b/inc/lang/mr/revisions.txt new file mode 100644 index 0000000..6cd1c39 --- /dev/null +++ b/inc/lang/mr/revisions.txt @@ -0,0 +1,3 @@ +====== जुन्या आवृत्त्या ====== + +ह्या सद्य दस्तावेजच्या जुन्या आवृत्त्या आहेत. एखाद्या जुन्या आवृत्तीवर परत जाण्यासाठी टी खालून निवडा, "हे पान संपादित करा" वर क्लिक करा आणि ते सुरक्षित करा. diff --git a/inc/lang/mr/searchpage.txt b/inc/lang/mr/searchpage.txt new file mode 100644 index 0000000..cc754d1 --- /dev/null +++ b/inc/lang/mr/searchpage.txt @@ -0,0 +1,3 @@ +====== शोध ====== + +तुम्हाला खाली तुमच्या शोधाचे फलित दिसतील. @CREATEPAGEINFO@ diff --git a/inc/lang/mr/showrev.txt b/inc/lang/mr/showrev.txt new file mode 100644 index 0000000..76a5d77 --- /dev/null +++ b/inc/lang/mr/showrev.txt @@ -0,0 +1,2 @@ +** ही ह्या दस्तावेजची जुनी आवृत्ती आहे. ** +---- diff --git a/inc/lang/mr/stopwords.txt b/inc/lang/mr/stopwords.txt new file mode 100644 index 0000000..ecb9f17 --- /dev/null +++ b/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 diff --git a/inc/lang/mr/updateprofile.txt b/inc/lang/mr/updateprofile.txt new file mode 100644 index 0000000..6de177f --- /dev/null +++ b/inc/lang/mr/updateprofile.txt @@ -0,0 +1,3 @@ +====== तुमची सदस्य माहिती अद्ययावत करा ====== + +फ़क्त तुम्हाला बदल करायचा असेल तेच रकाने परत भरा. तुमची तुमचे सदस्य नाम बदलू शकत नाही. diff --git a/inc/lang/mr/uploadmail.txt b/inc/lang/mr/uploadmail.txt new file mode 100644 index 0000000..1aea97c --- /dev/null +++ b/inc/lang/mr/uploadmail.txt @@ -0,0 +1,10 @@ +एक फाइल तुमच्या डॉक्युविकिवर अपलोड केली गेली आहे. त्याची माहिती याप्रमाणे : + +फाइल : @MEDIA@ +दिनांक : @DATE@ +ब्राउजर : @BROWSER@ +IP-पत्ता : @IPADDRESS@ +होस्टनाम : @HOSTNAME@ +साइज़ : @SIZE@ +MIME टाइप : @MIME@ +सदस्य : @USER@ diff --git a/inc/lang/ms/jquery.ui.datepicker.js b/inc/lang/ms/jquery.ui.datepicker.js new file mode 100644 index 0000000..4170519 --- /dev/null +++ b/inc/lang/ms/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Malaysian initialisation for the jQuery UI date picker plugin. */ +/* Written by Mohd Nawawi Mohamad Jamili (nawawi@ronggeng.net). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.ms = { + closeText: "Tutup", + prevText: "Sebelum", + nextText: "Selepas", + 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/inc/lang/ms/lang.php b/inc/lang/ms/lang.php new file mode 100644 index 0000000..14cb94e --- /dev/null +++ b/inc/lang/ms/lang.php @@ -0,0 +1,95 @@ +>'; +$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/inc/lang/nan/lang.php b/inc/lang/nan/lang.php new file mode 100644 index 0000000..b3048cc --- /dev/null +++ b/inc/lang/nan/lang.php @@ -0,0 +1,57 @@ + + */ +$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'] = '設定新个 password'; //FIXME +$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'] = 'Password'; //FIXME +$lang['newpass'] = '新个 password'; //FIXME diff --git a/inc/lang/ne/admin.txt b/inc/lang/ne/admin.txt new file mode 100644 index 0000000..f697534 --- /dev/null +++ b/inc/lang/ne/admin.txt @@ -0,0 +1,3 @@ +====== व्यवस्थापन ====== + +तल तपाईले DokuWikiमा उपलव्ध व्यवस्थापकिय कार्यहरुको सुची पाउन सक्नुहुन्छ । diff --git a/inc/lang/ne/adminplugins.txt b/inc/lang/ne/adminplugins.txt new file mode 100644 index 0000000..93eff63 --- /dev/null +++ b/inc/lang/ne/adminplugins.txt @@ -0,0 +1 @@ +===== थप प्लगिनहरू ===== \ No newline at end of file diff --git a/inc/lang/ne/backlinks.txt b/inc/lang/ne/backlinks.txt new file mode 100644 index 0000000..55fba20 --- /dev/null +++ b/inc/lang/ne/backlinks.txt @@ -0,0 +1,3 @@ +====== पछाडि लिङ्क ====== + +यो पृष्ठहरुको सुचीहरुले पछाडि लिङ्क स्वयंलाई नै गरेको छ। diff --git a/inc/lang/ne/conflict.txt b/inc/lang/ne/conflict.txt new file mode 100644 index 0000000..3062089 --- /dev/null +++ b/inc/lang/ne/conflict.txt @@ -0,0 +1,5 @@ +====== नयाँ संस्करण उपलब्ध छ ====== + +तपाईले सम्पादन गर्नुभएको पाठको नयाँ सस्करण उपलब्ध छ। तपाईले सम्पादन गरिरहनु भएको समयमा अर्को प्रयोगकर्ताले यो पाठ परिवर्तन गरेकोले यस्तो भएको हो । + +दुबैका फरक दाज्नुहोस् र दुईमा कुन राख्नेहो निश्चित गर्नुहोस् ।तपाईले "वचत गर्नुहोस् " छान्नु भयो भने तपाईको संस्करण वचत हुनेछ। "रद्द गर्नुहोस्" छान्नु भयो भने अहिलेको संस्करण वचत हुनेछ । diff --git a/inc/lang/ne/denied.txt b/inc/lang/ne/denied.txt new file mode 100644 index 0000000..653cd00 --- /dev/null +++ b/inc/lang/ne/denied.txt @@ -0,0 +1,3 @@ +====== अनुमति अमान्य ====== + +माफ गर्नुहोला तपाईलाई अगाडि बढ्न अनुमति छैन। diff --git a/inc/lang/ne/diff.txt b/inc/lang/ne/diff.txt new file mode 100644 index 0000000..17ec669 --- /dev/null +++ b/inc/lang/ne/diff.txt @@ -0,0 +1,3 @@ +====== भिन्नताहरु ====== + +यसले यो पृष्ठको छानिएको संस्करण र हालको संकरण बीच भिन्नताहरु देखाउँछ । diff --git a/inc/lang/ne/draft.txt b/inc/lang/ne/draft.txt new file mode 100644 index 0000000..3593f20 --- /dev/null +++ b/inc/lang/ne/draft.txt @@ -0,0 +1,5 @@ +====== ड्राफ्ट फाइल भेटियो ====== + +तपाईको यो पृष्ठको गत सम्पादन सफलतापूर्वक सम्पन्न भएको थिएन ।DokuWiki ले स्वचालितरुपमा ड्राफ्ट वचतगरेको छ त्यस देखि तपाईले आफ्नो सम्पादन कार्यमा निरन्तरता दिन सक्नुहुन्छ। तल तपाईले गत सत्रमा बचत गरिएको सामग्री देख्न सक्नुहुन्छ । + +कृपया निर्णय दिनुहोस् कि तपाई गत सत्रमा बचत गरिएको सत्रको सम्पादनकार्य //recover//, //delete// वा //cancel// के गर्न चाहनुहुन्छ भनेर। diff --git a/inc/lang/ne/edit.txt b/inc/lang/ne/edit.txt new file mode 100644 index 0000000..e82b54a --- /dev/null +++ b/inc/lang/ne/edit.txt @@ -0,0 +1 @@ +पृष्ठ सम्पादन गर्नुहोस र "बचत" मा थिच्नुहोस् । सिन्टेक्सको लागि [[wiki:syntax]] हेर्नुहोस् । यो पृष्ठलाई **सुधार्न** सक्नुहुन्छ भने मात्र सम्पादन गर्नुहोस् ।यदि कुनै प्रयोग गर्न या , जान्न चाहनुहुन्छ भने [[playground:playground|playground]] को प्रयोग गर्नुहोस् । diff --git a/inc/lang/ne/editrev.txt b/inc/lang/ne/editrev.txt new file mode 100644 index 0000000..e6cc9c1 --- /dev/null +++ b/inc/lang/ne/editrev.txt @@ -0,0 +1,2 @@ +**तपाईले यस कागजातको पुरानो संस्करण खोल्नु भएको छ ।** यदि यसलाई वचत गर्नुभयो भने यसैसामग्रीबाट नयाँ संस्करणको निर्माण हुनेछ । +---- diff --git a/inc/lang/ne/index.txt b/inc/lang/ne/index.txt new file mode 100644 index 0000000..2eba653 --- /dev/null +++ b/inc/lang/ne/index.txt @@ -0,0 +1,3 @@ +====== सुची ====== + +यो सबै उपलाब्ध पृष्ठहरुको [[doku>namespaces|namespaces]] का आधारमा मिलाइएको सुची हो । diff --git a/inc/lang/ne/lang.php b/inc/lang/ne/lang.php new file mode 100644 index 0000000..903a3ee --- /dev/null +++ b/inc/lang/ne/lang.php @@ -0,0 +1,204 @@ + + * @author Saroj Kumar Dhakal + * @author सरोज ढकाल + */ +$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 स्थापनामा मात्र काम गर्छ। तपाईले कि डाउनलोड गर्नुभएको प्याकेज पुन: खोल्नुहोस् कि Dokuwiki स्थापना विधि'; +$lang['i_funcna'] = 'PHP function %s उपलव्ध छैन । हुनसक्छ तपाईको होस्टिङ्ग प्रदायकले कुनै कारण वश यसलाई वन्द गरिदिएका हुनसक्छन् । '; +$lang['i_phpver'] = 'तपाईको PHP संस्करण %s चाहिएको %s भन्दा कम छ। तपाईले आफ्नो PHP स्थापना अध्यावधिक गर्नुपर्छ ।'; +$lang['i_permfail'] = '%s DokuWiki द्वारा लेख्य छैन । तपाईले डाइरेक्टरीको अनुमति परिवर्तन गर्नुपर्छ !'; +$lang['i_confexists'] = '%s पहिले देखि नै रहेको छ।'; +$lang['i_writeerr'] = '%s बनाउन असमर्थ । तपाईले डाइरेक्टरी / फाइल अनुमति जाच्नु पर्छ र फाइल आफैले बनाउनु पर्छ ।'; +$lang['i_badhash'] = 'पहिचान हुन नसकेको वा परिवर्तित okuwiki.php (hash=code>%s
    )'; +$lang['i_badval'] = '%s - अवैध वा रित्तो मान '; +$lang['i_success'] = 'स्थापना सफलरुपमा समाप्त भयो ।तपाई install.php मेट्न सक्नुहु्न्छ । तपाईको नयाँ DokuWiki निरन्तर गर्न सक्नुहुन्छ ।'; +$lang['i_failure'] = 'स्थापना समयमा केहि त्रुटि फेला पर्यो ।तपाईले आफैले यसलाई तपाईको नयाँ DokuWiki प्रयोग गर्नु अगि सच्याउनुपर्ने हुन्छ ।'; +$lang['i_policy'] = 'सुरुको ACL निति'; +$lang['i_pol0'] = 'खुल्ला विकि (पठन, लेखन , अपलोड ) सबैका लागि'; +$lang['i_pol1'] = 'Public विकि (पठन सवैका लागि,लेखन र अपलोड दर्ता गरिएका प्रयपगकर्ताका लागि ) '; +$lang['i_pol2'] = 'बन्द विकि (पठन , लेखन, अपलोड ) दर्ता भएका प्रयोगकर्ताका लागि मात्र ।'; +$lang['i_retry'] = 'पुन: प्रयास गर्नुहोस् '; +$lang['recent_global'] = 'तपाई अहिले %s नेमस्पेस भित्र भएका परिवर्तन हेर्दैहुनुहुन्छ। तपाई पुरै विकिमा भएको परिवर्तन हेर्न सक्नुहुन्छ.'; +$lang['email_signature_text'] = 'यो पत्र DokuWiki ले, मा तयार पारेको हो । +@DOKUWIKIURL@'; diff --git a/inc/lang/ne/locked.txt b/inc/lang/ne/locked.txt new file mode 100644 index 0000000..575d577 --- /dev/null +++ b/inc/lang/ne/locked.txt @@ -0,0 +1,3 @@ +====== पृष्ठमा ताला लगाएको छ ====== + +यो पृष्ठ अर्को प्रयोगकर्ताद्वारा सम्पादनका लागि ताला लगाइएको छ । तपाईले सम्पादन समाप्त नहुन्जेल या तालाको समय समाप्त नहुन्जेल सम्म प्रतिक्षागर्नु पर्छ । diff --git a/inc/lang/ne/norev.txt b/inc/lang/ne/norev.txt new file mode 100644 index 0000000..96c9186 --- /dev/null +++ b/inc/lang/ne/norev.txt @@ -0,0 +1,3 @@ +====== कुनै त्यस्तो पुन:संस्करण भेटिएन ====== + +खुलाइएको पुन:संस्करण अस्तित्वमा छैन ।यस कागजातको सम्पूर्ण संस्करणको सुचीको लागि "पुरानो पुन:संस्करण" बटन प्रयोग गर्नुहोस् । diff --git a/inc/lang/ne/pwconfirm.txt b/inc/lang/ne/pwconfirm.txt new file mode 100644 index 0000000..0552cc5 --- /dev/null +++ b/inc/lang/ne/pwconfirm.txt @@ -0,0 +1,9 @@ +नमस्कार @FULLNAME@! + +कसैद्वारा तपाईको @TITLE@ को लागि नयाँ प्रवेशशब्द माग भएको छ ।@DOKUWIKIURL@मा प्रवेश । + +यदि तपाईले नयाँ प्रवेशशब्दको माग गर्नुभएको हैन भने यस इमेललाई वेवास्ता गर्न सक्नुहुन्छ । + +कृपया तपाईको माग साच्चै पठाइएको थियो भन्ने यकिन गराउनाको लागि तलाको लिङ्कमा प्रयोग गर्नुहोस् । + +@CONFIRM@ diff --git a/inc/lang/ne/read.txt b/inc/lang/ne/read.txt new file mode 100644 index 0000000..2c11d5d --- /dev/null +++ b/inc/lang/ne/read.txt @@ -0,0 +1 @@ +यो पृष्ठ पढ्नको लागि मात्र हो । तपाई स्रोतहेर्न सक्नुहुन्छ ,तर सम्पादन भने गर्न सक्नुहुन्न । तपाईको व्यवस्थापक(administrator) सँग के समस्या छ भनेर सोध्नु होला । diff --git a/inc/lang/ne/recent.txt b/inc/lang/ne/recent.txt new file mode 100644 index 0000000..2db49c9 --- /dev/null +++ b/inc/lang/ne/recent.txt @@ -0,0 +1,3 @@ +====== हालैको परिवर्तन ====== + +निम्न पृष्ठहरु हालै परिवर्तन गरिएका छन् ।: diff --git a/inc/lang/ne/resendpwd.txt b/inc/lang/ne/resendpwd.txt new file mode 100644 index 0000000..5fa71da --- /dev/null +++ b/inc/lang/ne/resendpwd.txt @@ -0,0 +1,3 @@ +====== नयाँ प्रवेशशब्द पठाउनुहोस् ====== + +कृपया तपाईको यस विकीमा रहेको खाताको लाहि नयाँ प्रवेशशव्द अनुरोध गर्न तपाईँको नाम निम्न फर्ममा प्रविष्ट गर्नुहोस । एउटा किटानी लिङ्क तपाईले दर्ता गर्नु भएको इमेल ठेगानामा पठाइने छ । diff --git a/inc/lang/ne/searchpage.txt b/inc/lang/ne/searchpage.txt new file mode 100644 index 0000000..7c0a47c --- /dev/null +++ b/inc/lang/ne/searchpage.txt @@ -0,0 +1,3 @@ +====== खोज ====== + +तपाईले आफ्नो खोजको निम्न नतिजा पाउन सक्नुहुन्छ। @CREATEPAGEINFO@ diff --git a/inc/lang/ne/showrev.txt b/inc/lang/ne/showrev.txt new file mode 100644 index 0000000..7a7a53a --- /dev/null +++ b/inc/lang/ne/showrev.txt @@ -0,0 +1,2 @@ +** यो कागजातको पुरानो पुन:संस्करण हो !** +---- diff --git a/inc/lang/ne/updateprofile.txt b/inc/lang/ne/updateprofile.txt new file mode 100644 index 0000000..e3027e4 --- /dev/null +++ b/inc/lang/ne/updateprofile.txt @@ -0,0 +1,3 @@ +‌‌‍‍‍======तपाईँको खाताको जानकारी अद्यावधिक गर्नुहोस्====== + +तपाईँले आफूले परिवर्तन गर्न चाहेको फिल्ड मात्र परिवर्तन गरे पुग्छ । तपाईँले आफ्नो प्रयोगकर्ता नाम परिवर्तन गर्न पाउनुहुने छैन । diff --git a/inc/lang/ne/uploadmail.txt b/inc/lang/ne/uploadmail.txt new file mode 100644 index 0000000..a023797 --- /dev/null +++ b/inc/lang/ne/uploadmail.txt @@ -0,0 +1,9 @@ +एउटा फाइल तपाईको DokuWiki मा भरण गरिएको छ। थप जानकारी निम्न रहेका छन् : +फाइल : @MEDIA@ +मिति : @DATE@ +ब्राउजर : @BROWSER@ +आइपि ठगाना : @IPADDRESS@ +होस्टनाम : @HOSTNAME@ +आकार : @SIZE@ +MIME प्रकार : @MIME@ +प्रयोगकर्ता : @USER@ diff --git a/inc/lang/nl/admin.txt b/inc/lang/nl/admin.txt new file mode 100644 index 0000000..7138456 --- /dev/null +++ b/inc/lang/nl/admin.txt @@ -0,0 +1,3 @@ +====== Beheer ====== + +Hieronder zie je een lijst van beheertaken beschikbaar in DokuWiki. diff --git a/inc/lang/nl/adminplugins.txt b/inc/lang/nl/adminplugins.txt new file mode 100644 index 0000000..f006f92 --- /dev/null +++ b/inc/lang/nl/adminplugins.txt @@ -0,0 +1 @@ +===== Toegevoegde plugins ===== \ No newline at end of file diff --git a/inc/lang/nl/backlinks.txt b/inc/lang/nl/backlinks.txt new file mode 100644 index 0000000..daae320 --- /dev/null +++ b/inc/lang/nl/backlinks.txt @@ -0,0 +1,3 @@ +====== Backlinks ====== + +Dit is een lijst van pagina's die terug lijken te wijzen naar de huidige pagina. diff --git a/inc/lang/nl/conflict.txt b/inc/lang/nl/conflict.txt new file mode 100644 index 0000000..49a06b0 --- /dev/null +++ b/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/inc/lang/nl/denied.txt b/inc/lang/nl/denied.txt new file mode 100644 index 0000000..283fd6e --- /dev/null +++ b/inc/lang/nl/denied.txt @@ -0,0 +1,3 @@ +====== Toegang geweigerd ====== + +Sorry: je hebt niet voldoende rechten om verder te gaan. diff --git a/inc/lang/nl/diff.txt b/inc/lang/nl/diff.txt new file mode 100644 index 0000000..ef5a1b1 --- /dev/null +++ b/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/inc/lang/nl/draft.txt b/inc/lang/nl/draft.txt new file mode 100644 index 0000000..a6bf527 --- /dev/null +++ b/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/inc/lang/nl/edit.txt b/inc/lang/nl/edit.txt new file mode 100644 index 0000000..4a441bf --- /dev/null +++ b/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/inc/lang/nl/editrev.txt b/inc/lang/nl/editrev.txt new file mode 100644 index 0000000..1b2d130 --- /dev/null +++ b/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/inc/lang/nl/index.txt b/inc/lang/nl/index.txt new file mode 100644 index 0000000..660c45f --- /dev/null +++ b/inc/lang/nl/index.txt @@ -0,0 +1,3 @@ +====== Index ====== + +Dit is een index van alle beschikbare pagina's gesorteerd op [[doku>nl:namespaces|namespaces]]. diff --git a/inc/lang/nl/install.html b/inc/lang/nl/install.html new file mode 100644 index 0000000..d48dff3 --- /dev/null +++ b/inc/lang/nl/install.html @@ -0,0 +1,7 @@ +

    Deze pagina helpt u bij de eerste installatie en configuratie van Dokuwiki. Meer informatie over deze installer is beschikbaar op zijn eigen documentatiepagina.

    + +

    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, moet 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).

    + +

    Deze installer zal uw DokuWiki configureren voor ACL, 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.

    + +

    Ervaren gebruikers of gebruikers die een aangepaste configuratie nodig hebben kunnen voor details terecht op de volgende pagina's: installatie-instructies en configuratie-instellingen.

    diff --git a/inc/lang/nl/jquery.ui.datepicker.js b/inc/lang/nl/jquery.ui.datepicker.js new file mode 100644 index 0000000..535d7fb --- /dev/null +++ b/inc/lang/nl/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Dutch (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Mathias Bynens */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.nl = { + closeText: "Sluiten", + prevText: "Vorig", + nextText: "Volgende", + 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/inc/lang/nl/lang.php b/inc/lang/nl/lang.php new file mode 100644 index 0000000..a3d9b6d --- /dev/null +++ b/inc/lang/nl/lang.php @@ -0,0 +1,387 @@ + + * @author Mark Prins + * @author PBU + * @author Gerrit Uitslag + * @author Andy + * @author Harriet Neitz + * @author François Kooman + * @author Jack van Klaren + * @author Riny Heijdendael + * @author Koen Huybrechts + * @author Wouter Schoot + * @author John de Graaff + * @author Dion Nicolaas + * @author Danny Rotsaert + * @author Matthias Carchon + * @author Marijn Hofstra + * @author Timon Van Overveldt + * @author Jeroen + * @author Ricardo Guijt + * @author Remon + * @author gicalle + * @author Rene + * @author Johan Vervloet + * @author Mijndert + * @author Johan Wijnker + * @author Hugo Smet + * @author Wesley de Weerd + * @author Sjoerd + * @author Joachim David + * @author stafmans + */ +$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.
    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['unknowndate'] = 'Ongeldige datum'; +$lang['noflash'] = 'De Adobe Flash Plugin 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 Dokuwiki installatie-instructies'; +$lang['i_funcna'] = 'PHP functie %s is niet beschikbaar. Wellicht heeft je hosting provider deze uitgeschakeld?'; +$lang['i_disabled'] = 'Niet toegestaan door je provider'; +$lang['i_phpver'] = 'PHP-versie %s is lager dan de vereiste %s. Upgrade PHP.'; +$lang['i_mbfuncoverload'] = 'Om DokuWiki te draaien moet mbstring.func_overload uitgeschakeld zijn in php.ini.'; +$lang['i_permfail'] = '%s is niet schrijfbaar voor DokuWiki. Pas de permissie-instellingen van deze directory aan.'; +$lang['i_confexists'] = '%s bestaat reeds'; +$lang['i_writeerr'] = 'Niet mogelijk om %s aan te maken. Controleer de directory/bestandspermissies en maak het bestand handmatig aan.'; +$lang['i_badhash'] = 'Onbekende of aangepaste dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - onjuiste of lege waarde'; +$lang['i_success'] = 'De configuratie is succesvol afgerond. Je kunt nu het bestand install.php verwijderen. Ga naar je nieuwe DokuWiki.'; +$lang['i_failure'] = 'Fouten deden zich voor tijdens het schrijven naar de configuratiebestanden. Pas deze aan voor je gebruik kunt maken van je nieuwe DokuWiki.'; +$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 %s namespace. Je kunt ook de recente wijzigingen van de hele wiki 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['email_fail'] = 'PHP mail() ontbreekt of is uitgeschakeld. De volgende e-mail is niet verzonden:'; +$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 %s.'; +$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/inc/lang/nl/locked.txt b/inc/lang/nl/locked.txt new file mode 100644 index 0000000..878fb37 --- /dev/null +++ b/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/inc/lang/nl/login.txt b/inc/lang/nl/login.txt new file mode 100644 index 0000000..699cbf8 --- /dev/null +++ b/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/inc/lang/nl/mailtext.txt b/inc/lang/nl/mailtext.txt new file mode 100644 index 0000000..32f6f63 --- /dev/null +++ b/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/inc/lang/nl/mailwrap.html b/inc/lang/nl/mailwrap.html new file mode 100644 index 0000000..f15ec06 --- /dev/null +++ b/inc/lang/nl/mailwrap.html @@ -0,0 +1,13 @@ + + + @TITLE@ + + + + + @HTMLBODY@ + +

    + @EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/nl/newpage.txt b/inc/lang/nl/newpage.txt new file mode 100644 index 0000000..e9bcd0d --- /dev/null +++ b/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/inc/lang/nl/norev.txt b/inc/lang/nl/norev.txt new file mode 100644 index 0000000..a66837f --- /dev/null +++ b/inc/lang/nl/norev.txt @@ -0,0 +1,3 @@ +====== Revisie bestaat niet ====== + +De opgegeven revisie bestaat niet. Klik op ''Oude revisies'' voor een lijst van oude revisies van dit document. diff --git a/inc/lang/nl/onceexisted.txt b/inc/lang/nl/onceexisted.txt new file mode 100644 index 0000000..91092d7 --- /dev/null +++ b/inc/lang/nl/onceexisted.txt @@ -0,0 +1,3 @@ +======= Deze pagina bestaat niet meer ====== + +Je hebt een link gevolgd naar een pagina die niet meer bestaat. Je kunt de lijst met **Oude revisies** bekijken om te zien wanneer en waarom de pagina was verwijderd, oude versies te bekijken en om deze te herstellen. diff --git a/inc/lang/nl/password.txt b/inc/lang/nl/password.txt new file mode 100644 index 0000000..94a180a --- /dev/null +++ b/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/inc/lang/nl/preview.txt b/inc/lang/nl/preview.txt new file mode 100644 index 0000000..4ce0b2b --- /dev/null +++ b/inc/lang/nl/preview.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/nl/pwconfirm.txt b/inc/lang/nl/pwconfirm.txt new file mode 100644 index 0000000..8b900b1 --- /dev/null +++ b/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/inc/lang/nl/read.txt b/inc/lang/nl/read.txt new file mode 100644 index 0000000..329143a --- /dev/null +++ b/inc/lang/nl/read.txt @@ -0,0 +1 @@ +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/inc/lang/nl/recent.txt b/inc/lang/nl/recent.txt new file mode 100644 index 0000000..456f917 --- /dev/null +++ b/inc/lang/nl/recent.txt @@ -0,0 +1,3 @@ +====== Recente wijzigingen ====== + +De volgende pagina's zijn recent aangepast: diff --git a/inc/lang/nl/register.txt b/inc/lang/nl/register.txt new file mode 100644 index 0000000..8843d4b --- /dev/null +++ b/inc/lang/nl/register.txt @@ -0,0 +1,3 @@ +====== 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>nl:pagename|paginanaam]] zijn. diff --git a/inc/lang/nl/registermail.txt b/inc/lang/nl/registermail.txt new file mode 100644 index 0000000..8d23efd --- /dev/null +++ b/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/inc/lang/nl/resendpwd.txt b/inc/lang/nl/resendpwd.txt new file mode 100644 index 0000000..3a67587 --- /dev/null +++ b/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/inc/lang/nl/resetpwd.txt b/inc/lang/nl/resetpwd.txt new file mode 100644 index 0000000..23c5e90 --- /dev/null +++ b/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. diff --git a/inc/lang/nl/revisions.txt b/inc/lang/nl/revisions.txt new file mode 100644 index 0000000..e73c359 --- /dev/null +++ b/inc/lang/nl/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/nl/searchpage.txt b/inc/lang/nl/searchpage.txt new file mode 100644 index 0000000..7b5e68f --- /dev/null +++ b/inc/lang/nl/searchpage.txt @@ -0,0 +1,3 @@ +====== Zoeken ====== + +Hieronder zijn de resultaten van de zoekopdracht. @CREATEPAGEINFO@ diff --git a/inc/lang/nl/showrev.txt b/inc/lang/nl/showrev.txt new file mode 100644 index 0000000..c1bfa4e --- /dev/null +++ b/inc/lang/nl/showrev.txt @@ -0,0 +1,2 @@ +**Dit is een oude revisie van het document!** +---- diff --git a/inc/lang/nl/stopwords.txt b/inc/lang/nl/stopwords.txt new file mode 100644 index 0000000..7a8daab --- /dev/null +++ b/inc/lang/nl/stopwords.txt @@ -0,0 +1,38 @@ +# 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 +www +zal +zei +zij +zou diff --git a/inc/lang/nl/subscr_digest.txt b/inc/lang/nl/subscr_digest.txt new file mode 100644 index 0000000..6a904a7 --- /dev/null +++ b/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/inc/lang/nl/subscr_form.txt b/inc/lang/nl/subscr_form.txt new file mode 100644 index 0000000..0f9f2d0 --- /dev/null +++ b/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/inc/lang/nl/subscr_list.txt b/inc/lang/nl/subscr_list.txt new file mode 100644 index 0000000..b77b075 --- /dev/null +++ b/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/inc/lang/nl/subscr_single.txt b/inc/lang/nl/subscr_single.txt new file mode 100644 index 0000000..fe761f0 --- /dev/null +++ b/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/inc/lang/nl/updateprofile.txt b/inc/lang/nl/updateprofile.txt new file mode 100644 index 0000000..2368a09 --- /dev/null +++ b/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/inc/lang/nl/uploadmail.txt b/inc/lang/nl/uploadmail.txt new file mode 100644 index 0000000..85a4b95 --- /dev/null +++ b/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/inc/lang/no/admin.txt b/inc/lang/no/admin.txt new file mode 100644 index 0000000..765177f --- /dev/null +++ b/inc/lang/no/admin.txt @@ -0,0 +1,3 @@ +====== Administrasjon ====== + +Nedenfor finner du en liste over administrative oppgaver i DokuWiki. diff --git a/inc/lang/no/adminplugins.txt b/inc/lang/no/adminplugins.txt new file mode 100644 index 0000000..df78672 --- /dev/null +++ b/inc/lang/no/adminplugins.txt @@ -0,0 +1 @@ +====== Ekstra programtillegg ====== \ No newline at end of file diff --git a/inc/lang/no/backlinks.txt b/inc/lang/no/backlinks.txt new file mode 100644 index 0000000..100ca14 --- /dev/null +++ b/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. diff --git a/inc/lang/no/conflict.txt b/inc/lang/no/conflict.txt new file mode 100644 index 0000000..a7761d4 --- /dev/null +++ b/inc/lang/no/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/no/denied.txt b/inc/lang/no/denied.txt new file mode 100644 index 0000000..915561b --- /dev/null +++ b/inc/lang/no/denied.txt @@ -0,0 +1,3 @@ +====== Ingen tilgang ====== + +Beklager, du har ikke tilgang til denne siden. diff --git a/inc/lang/no/diff.txt b/inc/lang/no/diff.txt new file mode 100644 index 0000000..3101a08 --- /dev/null +++ b/inc/lang/no/diff.txt @@ -0,0 +1,3 @@ +====== Forskjeller ====== + +Her vises forskjeller mellom den valgte versjonen og den nåværende versjonen av dokumentet. diff --git a/inc/lang/no/draft.txt b/inc/lang/no/draft.txt new file mode 100644 index 0000000..3296c22 --- /dev/null +++ b/inc/lang/no/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/no/edit.txt b/inc/lang/no/edit.txt new file mode 100644 index 0000000..8c3b5fb --- /dev/null +++ b/inc/lang/no/edit.txt @@ -0,0 +1 @@ +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/inc/lang/no/editrev.txt b/inc/lang/no/editrev.txt new file mode 100644 index 0000000..652a84c --- /dev/null +++ b/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/inc/lang/no/index.txt b/inc/lang/no/index.txt new file mode 100644 index 0000000..edb3c2f --- /dev/null +++ b/inc/lang/no/index.txt @@ -0,0 +1,3 @@ +====== Indeks ====== + +Dette er en fortegnelse over alle tilgjengelige sider, sortert etter [[doku>no:namespaces|navnerom]]. diff --git a/inc/lang/no/install.html b/inc/lang/no/install.html new file mode 100644 index 0000000..95f3272 --- /dev/null +++ b/inc/lang/no/install.html @@ -0,0 +1,7 @@ +

    Denne siden assisterer under førstegangs installasjon og konfigurasjon av Dokuwiki. Mer informasjon for denne installasjonen er tilgjengelig på dokumentasjonssiden.

    + +

    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 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).

    + +

    Denne installasjonen vil sette opp din DokuWiki-konfigurasjon for ACL, 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.

    + +

    Erfarne brukere eller brukere med spessielle oppsettingskrav bør se på disse lenkene for detaljer rundt installasjonsinstrukser og konfigurasjonsinnstillinger.

    diff --git a/inc/lang/no/jquery.ui.datepicker.js b/inc/lang/no/jquery.ui.datepicker.js new file mode 100644 index 0000000..becc8bf --- /dev/null +++ b/inc/lang/no/jquery.ui.datepicker.js @@ -0,0 +1,53 @@ +/* Norwegian initialisation for the jQuery UI date picker plugin. */ +/* Written by Naimdjon Takhirov (naimdjon@gmail.com). */ + +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.no = { + closeText: "Lukk", + prevText: "Forrige", + nextText: "Neste", + 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/inc/lang/no/lang.php b/inc/lang/no/lang.php new file mode 100644 index 0000000..ccdb10d --- /dev/null +++ b/inc/lang/no/lang.php @@ -0,0 +1,376 @@ + + * @author Rut Kristin Aanestad + * @author ThorPrestboen + * @author Christian McKenna + * @author Reidar Mosvold + * @author Jorge Barrera Grandon + * @author Rune Rasmussen [http://www.syntaxerror.no/] + * @author Thomas Nygreen + * @author Arild Burud + * @author Torkill Bruland + * @author Rune M. Andersen + * @author Jakob Vad Nielsen + * @author Kjell Tore Næsgaard + * @author Knut Staring + * @author Lisa Ditlefsen + * @author Erik Pedersen + * @author Rune Rasmussen + * @author Jon Bøe + * @author Egil Hansen + * @author Thomas Juberg + * @author Boris + * @author Christopher Schive + * @author Patrick + * @author Danny Buckhof + * @author Arne Hanssen + * @author Patrick Sletvold + */ +$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['searchcreatepage'] = 'Hvis du ikke fant det du søkte etter kan du lage eller endre siden %s.'; +$lang['js']['search_toggle_tools'] = 'Søkeverktøy'; +$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['search_contains'] = 'Inneholder'; +$lang['search_past_7_days'] = 'Sist uke'; +$lang['search_past_month'] = 'Siste måned'; +$lang['search_past_year'] = 'Siste år'; +$lang['search_sort_by_hits'] = 'Sorter etter treff'; +$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.
    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['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 Adobe Flash Plugin.'; +$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 + Dokuwiki-installasjonsinstruksen'; +$lang['i_funcna'] = 'PHP-funksjonen %s er ikke tilgjengelig. Kanskje din nettleverandør har deaktivert denne?'; +$lang['i_phpver'] = 'Din PHP versjon %s er lavere enn kravet %s. Du må oppgradere PHP installasjonen. '; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload må deaktiveres i php.ini for å kjøre DokuWiki.'; +$lang['i_permfail'] = '%s er ikke skrivbar for DokuWiki. Du må fikse rettighetene for denne mappen!'; +$lang['i_confexists'] = '%s eksisterer allerede'; +$lang['i_writeerr'] = 'Kunne ikke opprette %s. Du må sjekke mappe-/filrettigheter og opprette filen manuelt.'; +$lang['i_badhash'] = 'ikke gjenkjent eller modifisert dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - ugyldig eller tom verdi'; +$lang['i_success'] = 'Konfigurasjonen ble vellykket fullført. Du kan slette install.php filen nå. Fortsett til + din nye DokuWiki.'; +$lang['i_failure'] = 'En eller flere feil oppstod ved skriving til konfigurasjonsfilene. Du må kanskje fikse dem manuelt før + du kan bruke din nye DokuWiki.'; +$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 %s. Du kan også se på nylig foretatte endringer for hele wikien. '; +$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 %s.'; +$lang['media_search'] = 'Søk i navnerommet %s.'; +$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å %s'; +$lang['unable_to_parse_date'] = 'Ikke mulig å tolke "%s".'; +$lang['email_signature_text'] = 'Denne meldingen ble laget av DokuWiki +@DOKUWIKIURL@'; diff --git a/inc/lang/no/locked.txt b/inc/lang/no/locked.txt new file mode 100644 index 0000000..cb14c89 --- /dev/null +++ b/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/inc/lang/no/login.txt b/inc/lang/no/login.txt new file mode 100644 index 0000000..0c67c75 --- /dev/null +++ b/inc/lang/no/login.txt @@ -0,0 +1,3 @@ +====== Logg inn ====== + +Du er ikke innlogget! Angi ditt brukernavn og passord nedenfor for å logge inn. Støtte for informasjonskapsler (cookies) må være aktivert i din nettleser for at du skal kunne logge inn. diff --git a/inc/lang/no/mailtext.txt b/inc/lang/no/mailtext.txt new file mode 100644 index 0000000..7260733 --- /dev/null +++ b/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/inc/lang/no/newpage.txt b/inc/lang/no/newpage.txt new file mode 100644 index 0000000..0f4ba4e --- /dev/null +++ b/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/inc/lang/no/norev.txt b/inc/lang/no/norev.txt new file mode 100644 index 0000000..1401976 --- /dev/null +++ b/inc/lang/no/norev.txt @@ -0,0 +1,3 @@ +====== Versjonen finnes ikke ====== + +Den angitte versjonen finnes ikke. Bruk ''**Historikk**'' for en oversikt over de versjoner som finnes av dette dokumentet. diff --git a/inc/lang/no/password.txt b/inc/lang/no/password.txt new file mode 100644 index 0000000..46023e3 --- /dev/null +++ b/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/inc/lang/no/preview.txt b/inc/lang/no/preview.txt new file mode 100644 index 0000000..52501b7 --- /dev/null +++ b/inc/lang/no/preview.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/no/pwconfirm.txt b/inc/lang/no/pwconfirm.txt new file mode 100644 index 0000000..7134d66 --- /dev/null +++ b/inc/lang/no/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/no/read.txt b/inc/lang/no/read.txt new file mode 100644 index 0000000..1ea8e57 --- /dev/null +++ b/inc/lang/no/read.txt @@ -0,0 +1 @@ +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/inc/lang/no/recent.txt b/inc/lang/no/recent.txt new file mode 100644 index 0000000..88109de --- /dev/null +++ b/inc/lang/no/recent.txt @@ -0,0 +1,3 @@ +====== Siste nytt ====== + +Følgende sider har nylig blitt oppdatert: diff --git a/inc/lang/no/register.txt b/inc/lang/no/register.txt new file mode 100644 index 0000000..b305c7c --- /dev/null +++ b/inc/lang/no/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/no/registermail.txt b/inc/lang/no/registermail.txt new file mode 100644 index 0000000..8902273 --- /dev/null +++ b/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/inc/lang/no/resendpwd.txt b/inc/lang/no/resendpwd.txt new file mode 100644 index 0000000..ade0f77 --- /dev/null +++ b/inc/lang/no/resendpwd.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/no/resetpwd.txt b/inc/lang/no/resetpwd.txt new file mode 100644 index 0000000..9fb03b9 --- /dev/null +++ b/inc/lang/no/resetpwd.txt @@ -0,0 +1,3 @@ +====== Sett nytt passord ====== + +Vennligst skriv inn et nytt passord for din konto i denne wikien. diff --git a/inc/lang/no/revisions.txt b/inc/lang/no/revisions.txt new file mode 100644 index 0000000..82df74e --- /dev/null +++ b/inc/lang/no/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/no/searchpage.txt b/inc/lang/no/searchpage.txt new file mode 100644 index 0000000..2d764d2 --- /dev/null +++ b/inc/lang/no/searchpage.txt @@ -0,0 +1,3 @@ +====== Søk ====== + +Du ser resultatet av dette søket nedenfor. @CREATEPAGEINFO@ diff --git a/inc/lang/no/showrev.txt b/inc/lang/no/showrev.txt new file mode 100644 index 0000000..06514f2 --- /dev/null +++ b/inc/lang/no/showrev.txt @@ -0,0 +1,2 @@ +**Dette er en gammel utgave av dokumentet!** +---- diff --git a/inc/lang/no/stopwords.txt b/inc/lang/no/stopwords.txt new file mode 100644 index 0000000..d32397f --- /dev/null +++ b/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 +å +år +alle +andre +at +av +bare +ble +bli +blir +da +de +den +det +dette +eller +en +enn +er +et +etter +få +før +for +fra +går +ha +hadde +han +har +hun +i +ikke +inn +jeg +kan +må +med +men +mer +mot +nå +og +også +om +opp +over +på +så +seg +sier +sin +skal +som +til +to +ut +være +vært +var +ved +vi +vil +www diff --git a/inc/lang/no/subscr_digest.txt b/inc/lang/no/subscr_digest.txt new file mode 100644 index 0000000..90da8e6 --- /dev/null +++ b/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/inc/lang/no/subscr_form.txt b/inc/lang/no/subscr_form.txt new file mode 100644 index 0000000..f62b25b --- /dev/null +++ b/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/inc/lang/no/subscr_list.txt b/inc/lang/no/subscr_list.txt new file mode 100644 index 0000000..d06bc23 --- /dev/null +++ b/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/inc/lang/no/subscr_single.txt b/inc/lang/no/subscr_single.txt new file mode 100644 index 0000000..5fb7716 --- /dev/null +++ b/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/inc/lang/no/updateprofile.txt b/inc/lang/no/updateprofile.txt new file mode 100644 index 0000000..e1349ab --- /dev/null +++ b/inc/lang/no/updateprofile.txt @@ -0,0 +1,3 @@ +====== Oppdater din brukerprofil ====== + +Du behøver bare fylle ut de felter du ønsker å endre. Du kan ikke endre brukernavnet ditt. diff --git a/inc/lang/no/uploadmail.txt b/inc/lang/no/uploadmail.txt new file mode 100644 index 0000000..237ec65 --- /dev/null +++ b/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/inc/lang/oc/admin.txt b/inc/lang/oc/admin.txt new file mode 100644 index 0000000..d19db36 --- /dev/null +++ b/inc/lang/oc/admin.txt @@ -0,0 +1,2 @@ +====== Administracion ====== +Çai-jos trobaretz una liste de las tascas administrativas disponiblas dins DokuWiki. \ No newline at end of file diff --git a/inc/lang/oc/adminplugins.txt b/inc/lang/oc/adminplugins.txt new file mode 100644 index 0000000..8326fb8 --- /dev/null +++ b/inc/lang/oc/adminplugins.txt @@ -0,0 +1 @@ +===== Extensions suplementàrias ===== \ No newline at end of file diff --git a/inc/lang/oc/backlinks.txt b/inc/lang/oc/backlinks.txt new file mode 100644 index 0000000..5c06a2a --- /dev/null +++ b/inc/lang/oc/backlinks.txt @@ -0,0 +1,2 @@ +====== Ligams de retorn ====== +Aquò es una lista de las paginas que semblan menar a la pagina actuala. \ No newline at end of file diff --git a/inc/lang/oc/conflict.txt b/inc/lang/oc/conflict.txt new file mode 100644 index 0000000..1b5cbc9 --- /dev/null +++ b/inc/lang/oc/conflict.txt @@ -0,0 +1,4 @@ +====== Una version mai recenta existís ====== +Una version mai recenta del document qu’avètz modificat existís. Aquò arriba quand qualqu’un mai càmbia lo document del temps que lo modificatz. + +Examinatz las diferéncias mostradas çai-jos, puèi causissètz la version de gardar. Se causissètz « enregistrar », vòstra version serà enregistrada. Quichatz « anullar » per gardar la version actuala. \ No newline at end of file diff --git a/inc/lang/oc/denied.txt b/inc/lang/oc/denied.txt new file mode 100644 index 0000000..58732c9 --- /dev/null +++ b/inc/lang/oc/denied.txt @@ -0,0 +1,2 @@ +====== Autorizacion refusada ====== +O planhèm, avètz pas pro de dreches per contunhar. \ No newline at end of file diff --git a/inc/lang/oc/diff.txt b/inc/lang/oc/diff.txt new file mode 100644 index 0000000..2c1d319 --- /dev/null +++ b/inc/lang/oc/diff.txt @@ -0,0 +1,2 @@ +====== Diferéncias ====== +Vaquí las diferéncias entre las doas versions de la pagina. \ No newline at end of file diff --git a/inc/lang/oc/index.txt b/inc/lang/oc/index.txt new file mode 100644 index 0000000..eaade21 --- /dev/null +++ b/inc/lang/oc/index.txt @@ -0,0 +1,2 @@ +====== Plan del site ====== +Aquò es lo plan del site de totas las paginas disponiblas, triadas per [[doku>namespaces|namespaces]]. \ No newline at end of file diff --git a/inc/lang/oc/lang.php b/inc/lang/oc/lang.php new file mode 100644 index 0000000..bd1a57a --- /dev/null +++ b/inc/lang/oc/lang.php @@ -0,0 +1,226 @@ + + * @author Quenti + */ +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '«'; +$lang['doublequoteclosing'] = '»'; +$lang['singlequoteopening'] = '’'; +$lang['singlequoteclosing'] = '’'; +$lang['apostrophe'] = '’'; +$lang['btn_edit'] = 'Modificar aquesta pagina'; +$lang['btn_source'] = 'Mostrar lo còdi font'; +$lang['btn_show'] = 'Mostrar la pagina'; +$lang['btn_create'] = 'Crear aquesta pagina'; +$lang['btn_search'] = 'Cercar'; +$lang['btn_save'] = 'Salvar'; +$lang['btn_preview'] = 'Apercebut'; +$lang['btn_top'] = 'Tornar amont'; +$lang['btn_newer'] = '<< mai recents'; +$lang['btn_older'] = 'mens recents >>'; +$lang['btn_revs'] = 'Ancianas versions'; +$lang['btn_recent'] = 'Cambiaments recents'; +$lang['btn_upload'] = 'Actualizar'; +$lang['btn_cancel'] = 'Anullar'; +$lang['btn_index'] = 'Plan del site'; +$lang['btn_secedit'] = 'Modificar'; +$lang['btn_login'] = 'Connexion'; +$lang['btn_logout'] = 'Desconnexion'; +$lang['btn_admin'] = 'Admin'; +$lang['btn_update'] = 'Actualizar'; +$lang['btn_delete'] = 'Suprimir'; +$lang['btn_back'] = 'Tornar'; +$lang['btn_backlink'] = 'Ligams de retorn'; +$lang['btn_subscribe'] = 'Gerir los abonaments'; +$lang['btn_profile'] = 'Actualizar lo perfil'; +$lang['btn_reset'] = 'Reïnicializar'; +$lang['btn_resendpwd'] = 'Definir un novèl senhal'; +$lang['btn_draft'] = 'Modificar lo borrolhon'; +$lang['btn_recover'] = 'Restablir lo borrolhon'; +$lang['btn_draftdel'] = 'Suprimir lo borrolhon'; +$lang['btn_revert'] = 'Restablir'; +$lang['btn_register'] = 'Se marcar'; +$lang['btn_apply'] = 'Aplicar'; +$lang['btn_media'] = 'Gestion dels mèdias'; +$lang['btn_deleteuser'] = 'Tirar mon compte'; +$lang['btn_img_backto'] = 'Tornar a %s'; +$lang['btn_mediaManager'] = 'Veire dins lo gestionari de mèdias'; +$lang['loggedinas'] = 'Session a'; +$lang['user'] = 'Nom d\'utilizaire'; +$lang['pass'] = 'Senhal'; +$lang['newpass'] = 'Noù senhal'; +$lang['oldpass'] = 'Confirmatz lo senhal actual'; +$lang['passchk'] = 'tornamai'; +$lang['remember'] = 'Se remembrar de ieu'; +$lang['fullname'] = 'Nom vertadièr'; +$lang['email'] = 'Corrièl'; +$lang['profile'] = 'Perfil d\'utilizaire'; +$lang['badlogin'] = 'Lo nom d\'utilizaire o lo senhal es incorrècte.'; +$lang['badpassconfirm'] = 'Lo senhal es incorrècte'; +$lang['minoredit'] = 'Cambiaments minors'; +$lang['draftdate'] = 'Salvagarda auto del borrolhon activada'; +$lang['nosecedit'] = 'Aquesta pagina a cambiat d’aquel temps, la seccion info èra pas a jorn, pagina complèta cargada allòc.'; +$lang['searchcreatepage'] = 'S’avètz pas trobat çò que cercàvetz, podètz crear o modificar la pagina %s, nommada segon vòstra requèsta.'; +$lang['search_fullresults'] = 'Resultats tèxte brut'; +$lang['js']['search_toggle_tools'] = 'Mostrar/Amagar las aisinas de recèrca'; +$lang['js']['notsavedyet'] = 'Los cambiaments pas enregistrats seràn perduts.'; +$lang['js']['searchmedia'] = 'Cercar de fichièrs'; +$lang['js']['keepopen'] = 'Gardar la fenèstra dobèrta sus la selecion'; +$lang['js']['hidedetails'] = 'Rescondre los detalhs'; +$lang['js']['mediatitle'] = 'Paramètres del ligam'; +$lang['js']['mediadisplay'] = 'Tipe de ligam'; +$lang['js']['mediaalign'] = 'Alinhament'; +$lang['js']['mediasize'] = 'Talha de l\'imatge'; +$lang['js']['mediatarget'] = 'Cibla del ligam'; +$lang['js']['mediaclose'] = 'Tampar'; +$lang['js']['mediainsert'] = 'Inserir'; +$lang['js']['mediadisplayimg'] = 'Mostrar l\'imatge.'; +$lang['js']['mediadisplaylnk'] = 'Mostrar sol lo ligam.'; +$lang['js']['mediasmall'] = 'Version pichona'; +$lang['js']['mediamedium'] = 'Version mejana'; +$lang['js']['medialarge'] = 'Version bèla'; +$lang['js']['mediaoriginal'] = 'Version originala'; +$lang['js']['medialnk'] = 'Ligam cap a la pagina de detalhs'; +$lang['js']['mediadirect'] = 'Ligam dirècte a l\'originala'; +$lang['js']['medianolnk'] = 'Cap de ligam'; +$lang['js']['medianolink'] = 'Ligar pas l\'imatge'; +$lang['js']['medialeft'] = 'Alinhar los imatges a man drecha'; +$lang['js']['mediaright'] = 'Alinhar los imatges a man esquèrra.'; +$lang['js']['mediacenter'] = 'Alinhar los imatges al centre.'; +$lang['js']['medianoalign'] = 'Cap d’alinament.'; +$lang['js']['linkwiz'] = 'Assistent pels ligams'; +$lang['js']['linkto'] = 'Ligam cap a :'; +$lang['js']['del_confirm'] = 'Volètz vertadièrament suprimir lo(s) item(s) seleccionat(s) ?'; +$lang['js']['restore_confirm'] = 'Volètz vertadièrament restaurar aquesta version ?'; +$lang['js']['media_diff'] = 'Veire las diferéncias :'; +$lang['js']['media_diff_both'] = 'Costat per costat'; +$lang['js']['media_select'] = 'Seleccionar de fichièrs...'; +$lang['js']['media_upload_btn'] = 'Enviar'; +$lang['js']['media_done_btn'] = 'Fach'; +$lang['js']['media_drop'] = 'Pausatz los fichièrs aquí per los mandar'; +$lang['js']['media_cancel'] = 'levar'; +$lang['js']['media_overwrt'] = 'Remplaçar los fichièrs existents'; +$lang['search_exact_match'] = 'Correspondéncia exacta'; +$lang['search_starts_with'] = 'Comença amb'; +$lang['search_ends_with'] = 'Termina amb'; +$lang['search_contains'] = 'Conten'; +$lang['search_past_7_days'] = 'La setmana passada'; +$lang['search_past_month'] = 'Lo mes passat'; +$lang['search_past_year'] = 'L\'an passat'; +$lang['search_sort_by_hits'] = 'Triar per accès'; +$lang['search_sort_by_mtime'] = 'Triar per darrièra modificacion'; +$lang['regmissing'] = 'O planhèm, vos cal garnir totes los camps.'; +$lang['reguexists'] = 'Un utilizaire amb aqueste nom existís ja.'; +$lang['regsuccess'] = 'L’utilizaire es estat creat e lo senhal enviat per corrièl.'; +$lang['regsuccess2'] = 'L’utilizaire es estat creat.'; +$lang['regfail'] = 'L’utilizaire a pas pogut èsser creat.'; +$lang['regbadpass'] = 'Los dos senhals donats correspondon pas, tornatz ensajar.'; +$lang['regpwmail'] = 'Vòstre senhal DokuWiki'; +$lang['reghere'] = 'Avètz pas encara de compte ? Creatz-ne un'; +$lang['profna'] = 'Aqueste wiki permet pas de modificar lo perfil'; +$lang['profnochange'] = 'Cap de cambiament, pas res per far.'; +$lang['profnoempty'] = 'Un nom o corrièl void es pas autorizat.'; +$lang['profchanged'] = 'Perfil utilizaire corrèctament actualizat.'; +$lang['profnodelete'] = 'Aqueste wiki es pas compatible amb la supression dels utilizaires'; +$lang['profdeleteuser'] = 'Suprimir lo compte'; +$lang['profdeleted'] = 'Vòstre compte foguèt suprimit d’aqueste wiki'; +$lang['profconfdelete'] = 'Vòli tirar mon compte d’aqueste wiki.
    Aquesta accion pòt pas èsser anullada.'; +$lang['profconfdeletemissing'] = 'La casa de confirmacion es pas causida.'; +$lang['proffail'] = 'Lo perfil de l’utilizaire es pas estat actualizat.'; +$lang['pwdforget'] = 'Avètz oblidat lo senhal ? Demandatz-ne un nòu'; +$lang['resendna'] = 'Aqueste wiki es pas compatible amb las demandas de mandadís de senhal.'; +$lang['resendpwd'] = 'Definir un nòu senhal per'; +$lang['resendpwdmissing'] = 'O planhèm, vos cal garnir totes los camps.'; +$lang['resendpwdnouser'] = 'O planhèm, trobam pas aqueste utilizaire dins nòstra basa de donadas.'; +$lang['resendpwdconfirm'] = 'Avèm enviat un ligam de confirmacion per corrièl.'; +$lang['resendpwdsuccess'] = 'Avèm enviat lo senhal per corrièl.'; +$lang['searchmedia'] = 'Cercar un nom de fichièr :'; +$lang['searchmedia_in'] = 'Cercar dins %s'; +$lang['txt_upload'] = 'Selecionnatz lo fichièr d’enviar :'; +$lang['txt_filename'] = 'Enviar coma (opcional) :'; +$lang['txt_overwrt'] = 'Remplaçar lo fichièr existent'; +$lang['maxuploadsize'] = 'Mandadís max %s per fichièr.'; +$lang['lockedby'] = 'Actualament verrolhat per :'; +$lang['lockexpire'] = 'Lo verrolhatge expira a :'; +$lang['nothingfound'] = 'Pas res es estat trobat.'; +$lang['mediaselect'] = 'Fichièrs mèdias'; +$lang['uploadsucc'] = 'Corrèctament enviat'; +$lang['uploadfail'] = 'Fracàs del mandadís. Benlèu un problèma de permissions ?'; +$lang['uploadwrong'] = 'Mandadís regetat. Aquela extension de fichièr es prohibida ! '; +$lang['uploadexist'] = 'Lo fichièr existís ja. Pas res fach.'; +$lang['deletesucc'] = 'Lo fichièr « %s » es estat suprimit.'; +$lang['deletefail'] = 'Supression impossibla del fichièr « %s » - verificatz las autorizacions.'; +$lang['mediainuse'] = 'Lo fichièr « %s » es pas estat suprimit - es encara utilizat.'; +$lang['mediafiles'] = 'Fichièrs disponibles dins'; +$lang['accessdenied'] = 'Sètz pas autorizatz a veire aquesta pagina.'; +$lang['mediaview'] = 'Veire lo fichièr d\'origina'; +$lang['mediaroot'] = 'root'; +$lang['reference'] = 'Referéncia per'; +$lang['hits'] = 'Accèsses'; +$lang['toc'] = 'Ensenhador'; +$lang['current'] = 'actuala'; +$lang['yours'] = 'Vòstra version'; +$lang['diff'] = 'Mostrar las diferéncias amb la version actuala'; +$lang['diff_type'] = 'Veire las diferéncias :'; +$lang['diffprevrev'] = 'Revision precedenta'; +$lang['diffnextrev'] = 'Revision seguenta'; +$lang['difflastrev'] = 'Darrièra revision'; +$lang['line'] = 'Linha'; +$lang['youarehere'] = 'Sètz aquí :'; +$lang['lastmod'] = 'Darrièra modification :'; +$lang['by'] = 'per'; +$lang['deleted'] = 'levada'; +$lang['created'] = 'creada'; +$lang['tools'] = 'Aisinas'; +$lang['user_tools'] = 'Aisinas utilizaire'; +$lang['site_tools'] = 'Aisinas site'; +$lang['page_tools'] = 'Aisinas pagina'; +$lang['skip_to_content'] = 'passar al contengut'; +$lang['mail_newpage'] = 'pagina ajustada'; +$lang['mail_changed'] = 'pagina cambiada'; +$lang['mail_new_user'] = 'utilizaire novèl :'; +$lang['mail_upload'] = 'fichièr enviat :'; +$lang['changes_type'] = 'Veire los cambiaments de'; +$lang['pages_changes'] = 'Paginas'; +$lang['media_changes'] = 'Fichièrs mèdia'; +$lang['qb_sig'] = 'Inserir una signatura'; +$lang['metaedit'] = 'Modificar las metadonadas'; +$lang['metasaveok'] = 'Metadonadas enregistradas'; +$lang['img_title'] = 'Títol :'; +$lang['img_date'] = 'Data :'; +$lang['img_fsize'] = 'Talha :'; +$lang['img_format'] = 'Format :'; +$lang['img_camera'] = 'Camèra :'; +$lang['img_keywords'] = 'Mot claus :'; +$lang['img_width'] = 'Largor :'; +$lang['img_height'] = 'Nautor :'; +$lang['i_chooselang'] = 'Causissètz vòstra lenga'; +$lang['i_wikiname'] = 'Nom del wiki'; +$lang['i_policy'] = 'Prima politica d’ACL'; +$lang['i_pol0'] = 'Wiki dubèrt (lectura, escritura, mandadís per totes)'; +$lang['i_pol1'] = 'Wiki public (lectura per totes, escritura e mandadís pels utilizaires marcats)'; +$lang['i_pol2'] = 'Wiki barrat (lectura, escritura, mandadís pels sols utilizaires marcats)'; +$lang['i_allowreg'] = 'Autorizar las inscripcions'; +$lang['i_retry'] = 'Tornar ensajar'; +$lang['years'] = 'fa %d ans'; +$lang['months'] = 'fa %d mese'; +$lang['weeks'] = 'fa %d setmanas'; +$lang['days'] = 'fa %d jorns'; +$lang['hours'] = 'fa %d oras'; +$lang['minutes'] = 'fa %d minutas'; +$lang['seconds'] = 'fa %d segondas'; +$lang['media_uploadtab'] = 'Enviar'; +$lang['media_searchtab'] = 'Cercar'; +$lang['media_file'] = 'Fichièr'; +$lang['media_viewtab'] = 'Veire'; +$lang['media_edittab'] = 'Modificar'; +$lang['media_historytab'] = 'Istoric'; +$lang['media_list_thumbs'] = 'Vinhetas'; +$lang['media_list_rows'] = 'Linhas'; +$lang['media_sort_name'] = 'Nom'; +$lang['media_sort_date'] = 'Data'; diff --git a/inc/lang/pl/admin.txt b/inc/lang/pl/admin.txt new file mode 100644 index 0000000..217e7d6 --- /dev/null +++ b/inc/lang/pl/admin.txt @@ -0,0 +1,3 @@ +====== Administracja ====== + +Czynności administracyjne DokuWiki. diff --git a/inc/lang/pl/adminplugins.txt b/inc/lang/pl/adminplugins.txt new file mode 100644 index 0000000..8b54932 --- /dev/null +++ b/inc/lang/pl/adminplugins.txt @@ -0,0 +1 @@ +===== Dodatkowe wtyczki ===== \ No newline at end of file diff --git a/inc/lang/pl/backlinks.txt b/inc/lang/pl/backlinks.txt new file mode 100644 index 0000000..fcca104 --- /dev/null +++ b/inc/lang/pl/backlinks.txt @@ -0,0 +1,3 @@ +====== Odnośnik z innych stron ====== + +Strony zawierające odnośniki do aktualnej strony. diff --git a/inc/lang/pl/conflict.txt b/inc/lang/pl/conflict.txt new file mode 100644 index 0000000..cd5a774 --- /dev/null +++ b/inc/lang/pl/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/pl/denied.txt b/inc/lang/pl/denied.txt new file mode 100644 index 0000000..fdd9d7b --- /dev/null +++ b/inc/lang/pl/denied.txt @@ -0,0 +1,3 @@ +====== Brak dostępu ====== + +Nie masz wystarczających uprawnień. diff --git a/inc/lang/pl/diff.txt b/inc/lang/pl/diff.txt new file mode 100644 index 0000000..b3d160a --- /dev/null +++ b/inc/lang/pl/diff.txt @@ -0,0 +1,3 @@ +====== Różnice ====== + +Różnice między wybraną wersją a wersją aktualną. diff --git a/inc/lang/pl/draft.txt b/inc/lang/pl/draft.txt new file mode 100644 index 0000000..64b9e8c --- /dev/null +++ b/inc/lang/pl/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/pl/edit.txt b/inc/lang/pl/edit.txt new file mode 100644 index 0000000..050b8ec --- /dev/null +++ b/inc/lang/pl/edit.txt @@ -0,0 +1 @@ +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/inc/lang/pl/editrev.txt b/inc/lang/pl/editrev.txt new file mode 100644 index 0000000..1528cac --- /dev/null +++ b/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/inc/lang/pl/index.txt b/inc/lang/pl/index.txt new file mode 100644 index 0000000..ebba0b6 --- /dev/null +++ b/inc/lang/pl/index.txt @@ -0,0 +1,3 @@ +====== Indeks ====== + +Indeks wszystkich dostępnych stron pogrupowany według [[doku>pl:namespaces|katalogów]]. diff --git a/inc/lang/pl/install.html b/inc/lang/pl/install.html new file mode 100644 index 0000000..05daaa9 --- /dev/null +++ b/inc/lang/pl/install.html @@ -0,0 +1,7 @@ +

    Ta strona ma na celu pomóc Ci w instalacji i konfiguracji Dokuwiki. Więcej informacji o instalatorze znajdziesz w dokumentacji instalatora.

    + +

    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ć musisz 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.

    + +

    Instalator pomoże Ci w konfiguracji uprawnień ACL, 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.

    + +

    Zaawansowani użytkownicy lub użytkownicy mający specjalne wymagania powinni zapoznać się z instrukcją instalacji oraz instrukcją konfiguracji.

    diff --git a/inc/lang/pl/jquery.ui.datepicker.js b/inc/lang/pl/jquery.ui.datepicker.js new file mode 100644 index 0000000..4d31086 --- /dev/null +++ b/inc/lang/pl/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Polish initialisation for the jQuery UI date picker plugin. */ +/* Written by Jacek Wysocki (jacek.wysocki@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.pl = { + closeText: "Zamknij", + prevText: "Poprzedni", + nextText: "Następny", + 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/inc/lang/pl/lang.php b/inc/lang/pl/lang.php new file mode 100644 index 0000000..a850017 --- /dev/null +++ b/inc/lang/pl/lang.php @@ -0,0 +1,391 @@ + + * @author Michał + * @author pavulondit + * @author Bartek S + * @author Przemek + * @author Wojciech Lichota + * @author Max + * @author Grzegorz Żur + * @author Mariusz Kujawski + * @author Maciej Kurczewski + * @author Sławomir Boczek + * @author sleshek + * @author Leszek Stachowski + * @author maros + * @author Grzegorz Widła + * @author Łukasz Chmaj + * @author Begina Felicysym + * @author Aoi Karasu + * @author Tomasz Bosak + * @author Paweł Jan Czochański + * @author Mati + * @author Maciej Helt + * @author Kris Charatonik + */ +$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['searchcreatepage'] = 'Jeżeli nie znalazłeś tego czego szukałeś możesz stworzyć lub edytować stronę %s, nazwaną tak jak twoja kwerenda'; +$lang['search_fullresults'] = 'Pokaż więcej wyników'; +$lang['js']['search_toggle_tools'] = 'Przełącz narzędzia wyszukiwania'; +$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['js']['data_insecure'] = 'OSTRZEŻENIE: Wygląda na to, że twój katalog z danymi nie jest odpowiednio zabezpieczony. Proszę przeczytaj Web Access Security in DokuWiki.'; +$lang['search_exact_match'] = 'Dokładne dopasowanie'; +$lang['search_starts_with'] = 'Zaczyna się na'; +$lang['search_ends_with'] = 'Kończy się na'; +$lang['search_contains'] = 'Zwiera'; +$lang['search_custom_match'] = 'Spersonalizowany'; +$lang['search_any_ns'] = 'Jakakolwiek przestrzeń nazw'; +$lang['search_any_time'] = 'Kiedykolwiek'; +$lang['search_past_7_days'] = 'Poprzedni tydzień'; +$lang['search_past_month'] = 'Poprzedni miesiąc'; +$lang['search_past_year'] = 'Poprzedni rok'; +$lang['search_sort_by_hits'] = 'Sortuj według popularności'; +$lang['search_sort_by_mtime'] = 'Sortuj według daty modyfikacji'; +$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.
    Decyzja nie może być cofnięta.'; +$lang['profconfdeletemissing'] = 'Pole potwierdzenia nie zostało zaznaczone'; +$lang['proffail'] = 'Profil użytkownika nie został uaktualniony.'; +$lang['proftokenlegend'] = 'Token uwierzytelniający'; +$lang['proftokengenerate'] = 'Zresetuj token'; +$lang['proftokeninfo'] = 'Token uwierzytelniający może być używany do umożliwienia aplikacjom innych dostawców logowania się i działania w Twoim imieniu. Zresetowanie tokena spowoduje unieważnienie starego i wylogowanie wszystkich aplikacji, które korzystały z poprzedniego tokena.'; +$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['allowedmime'] = 'Lista dozwolonych rozszerzeń plików'; +$lang['lockedby'] = 'Aktualnie zablokowane przez:'; +$lang['lockexpire'] = 'Blokada wygasa:'; +$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['unknowndate'] = 'Nieznana data'; +$lang['noflash'] = 'Plugin Adobe Flash Plugin 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 instrukcją instalacji Dokuwiki'; +$lang['i_funcna'] = 'Funkcja PHP %s jest niedostępna.'; +$lang['i_disabled'] = 'To zostało wyłączone przez twojego dostawcę.'; +$lang['i_funcnmail'] = 'Uwaga: funkcja poczty PHP nie jest dostępna. %s, jeśli pozostanie niedostępna, możesz zainstalować wtyczkę smtp.'; +$lang['i_phpver'] = 'Wersja PHP %s jest niższa od wymaganej %s. Zaktualizuj instalację PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload musi zostać wyłączone w pliku php.ini aby móc uruchomić DokuWiki.'; +$lang['i_urandom'] = 'DokuWiki nie może tworzyć kryptograficznie bezpiecznych liczb dla plików cookie. Możesz sprawdzić ustawienia open_basedir w php.ini pod kątem prawidłowego dostępu do /dev/urandom.'; +$lang['i_permfail'] = 'DokuWiki nie ma prawa zapisu w katalogu %s. Zmień uprawnienia zapisu dla tego katalogu!'; +$lang['i_confexists'] = '%s już istnieje'; +$lang['i_writeerr'] = 'Nie można utworzyć %s. Sprawdź uprawnienia do katalogu lub pliku i stwórz plik ręcznie.'; +$lang['i_badhash'] = 'nierozpoznany lub zmodyfikowany plik dokuwiki.php (skrót=%s)'; +$lang['i_badval'] = '%s - nieprawidłowa wartość lub jej brak'; +$lang['i_success'] = 'Konfiguracja pomyślnie zakończona. Możesz teraz usunąć plik install.php. Przejdź do Twojego nowego DokuWiki.'; +$lang['i_failure'] = 'Podczas zapisu plików konfiguracyjnych wystąpiły błędy. Musisz usunąć wszystkie problemy, zanim zaczniesz korzystać z Twojego nowego DokuWiki.'; +$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 %s. Możesz przejrzeć także zmiany w całym wiki.'; +$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['email_fail'] = 'Brak lub wyłączone PHP mail(). Następujący e-mail nie został wysłany:'; +$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 %s.'; +$lang['unable_to_parse_date'] = 'Nie można przeanalizować parametru "%s".'; +$lang['email_signature_text'] = 'List został wygenerowany przez DokuWiki pod adresem +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = 'Plik log jest zbyt duży. Poprzednie wiersze zostały pominięte!'; +$lang['log_file_failed_to_open'] = 'Nie udało się otworzyć pliku log.'; +$lang['log_file_failed_to_read'] = 'Wystąpił błąd podczas odczytywania pliku log.'; diff --git a/inc/lang/pl/locked.txt b/inc/lang/pl/locked.txt new file mode 100644 index 0000000..e3e05fe --- /dev/null +++ b/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/inc/lang/pl/login.txt b/inc/lang/pl/login.txt new file mode 100644 index 0000000..14220c4 --- /dev/null +++ b/inc/lang/pl/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/pl/mailtext.txt b/inc/lang/pl/mailtext.txt new file mode 100644 index 0000000..cae98db --- /dev/null +++ b/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/inc/lang/pl/mailwrap.html b/inc/lang/pl/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/pl/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/pl/newpage.txt b/inc/lang/pl/newpage.txt new file mode 100644 index 0000000..6fd16c0 --- /dev/null +++ b/inc/lang/pl/newpage.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/pl/norev.txt b/inc/lang/pl/norev.txt new file mode 100644 index 0000000..7226d31 --- /dev/null +++ b/inc/lang/pl/norev.txt @@ -0,0 +1,3 @@ +====== Nie ma takiej wersji ====== + +Nie ma takiej wersji. Kliknij przycisk ''poprzednie wersje'', aby wyświetlić listę wszystkich wersji tej strony. diff --git a/inc/lang/pl/onceexisted.txt b/inc/lang/pl/onceexisted.txt new file mode 100644 index 0000000..d2aa918 --- /dev/null +++ b/inc/lang/pl/onceexisted.txt @@ -0,0 +1,3 @@ +======= Ta strona już nie istnieje ====== + +Wybrałeś odnośnik do strony która już nie instnieję, Możesz sprawdzić listę **old revisions** aby sprawdzić kiedy i dlaczego strona została usunięta. Masz również możliwość dostępu do starej wersji strony i przywrócenia jej diff --git a/inc/lang/pl/password.txt b/inc/lang/pl/password.txt new file mode 100644 index 0000000..745556f --- /dev/null +++ b/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/inc/lang/pl/preview.txt b/inc/lang/pl/preview.txt new file mode 100644 index 0000000..4fa9101 --- /dev/null +++ b/inc/lang/pl/preview.txt @@ -0,0 +1,3 @@ +====== Podgląd ====== + +To jest podgląd edytowanej strony. **Pamiętaj, że ta strona nie jest jeszcze zapisana**! diff --git a/inc/lang/pl/pwconfirm.txt b/inc/lang/pl/pwconfirm.txt new file mode 100644 index 0000000..989de79 --- /dev/null +++ b/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/inc/lang/pl/read.txt b/inc/lang/pl/read.txt new file mode 100644 index 0000000..754dfa8 --- /dev/null +++ b/inc/lang/pl/read.txt @@ -0,0 +1 @@ +Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić. diff --git a/inc/lang/pl/recent.txt b/inc/lang/pl/recent.txt new file mode 100644 index 0000000..95eb805 --- /dev/null +++ b/inc/lang/pl/recent.txt @@ -0,0 +1,3 @@ +====== Ostatnie zmiany ====== + +Ostatnio zmienione strony: diff --git a/inc/lang/pl/register.txt b/inc/lang/pl/register.txt new file mode 100644 index 0000000..65a2a99 --- /dev/null +++ b/inc/lang/pl/register.txt @@ -0,0 +1,3 @@ +====== 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>pl:pagename|nazw stron]]. diff --git a/inc/lang/pl/registermail.txt b/inc/lang/pl/registermail.txt new file mode 100644 index 0000000..0022967 --- /dev/null +++ b/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/inc/lang/pl/resendpwd.txt b/inc/lang/pl/resendpwd.txt new file mode 100644 index 0000000..90f7391 --- /dev/null +++ b/inc/lang/pl/resendpwd.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/pl/resetpwd.txt b/inc/lang/pl/resetpwd.txt new file mode 100644 index 0000000..32647fe --- /dev/null +++ b/inc/lang/pl/resetpwd.txt @@ -0,0 +1,3 @@ +====== Ustalenie nowego hasła ====== + +Podaj, proszę, nowe hasło do Twojego konta w tym wiki. diff --git a/inc/lang/pl/revisions.txt b/inc/lang/pl/revisions.txt new file mode 100644 index 0000000..761eb68 --- /dev/null +++ b/inc/lang/pl/revisions.txt @@ -0,0 +1,3 @@ +====== Poprzednie wersje ====== + +Poprzednie wersje tej strony. Aby przywrócić poprzednią wersję wybierz ją, rozpocznij edycję a potem zapisz. diff --git a/inc/lang/pl/searchpage.txt b/inc/lang/pl/searchpage.txt new file mode 100644 index 0000000..beb59b2 --- /dev/null +++ b/inc/lang/pl/searchpage.txt @@ -0,0 +1,3 @@ +====== Wyszukiwanie ====== + +Wyniki wyszukiwania. @CREATEPAGEINFO@ diff --git a/inc/lang/pl/showrev.txt b/inc/lang/pl/showrev.txt new file mode 100644 index 0000000..43e826e --- /dev/null +++ b/inc/lang/pl/showrev.txt @@ -0,0 +1,2 @@ +**To jest stara wersja strony!** +---- diff --git a/inc/lang/pl/stopwords.txt b/inc/lang/pl/stopwords.txt new file mode 100644 index 0000000..f0f50c1 --- /dev/null +++ b/inc/lang/pl/stopwords.txt @@ -0,0 +1,90 @@ +# 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 +www +właśnie +zawsze diff --git a/inc/lang/pl/subscr_digest.txt b/inc/lang/pl/subscr_digest.txt new file mode 100644 index 0000000..7abbb35 --- /dev/null +++ b/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/inc/lang/pl/subscr_form.txt b/inc/lang/pl/subscr_form.txt new file mode 100644 index 0000000..59fdbdb --- /dev/null +++ b/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/inc/lang/pl/subscr_list.txt b/inc/lang/pl/subscr_list.txt new file mode 100644 index 0000000..633225f --- /dev/null +++ b/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/inc/lang/pl/subscr_single.txt b/inc/lang/pl/subscr_single.txt new file mode 100644 index 0000000..0c8c3ea --- /dev/null +++ b/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/inc/lang/pl/updateprofile.txt b/inc/lang/pl/updateprofile.txt new file mode 100644 index 0000000..5336a83 --- /dev/null +++ b/inc/lang/pl/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/pl/uploadmail.txt b/inc/lang/pl/uploadmail.txt new file mode 100644 index 0000000..a8daa05 --- /dev/null +++ b/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/inc/lang/pt-br/admin.txt b/inc/lang/pt-br/admin.txt new file mode 100644 index 0000000..0e14fbb --- /dev/null +++ b/inc/lang/pt-br/admin.txt @@ -0,0 +1,3 @@ +====== Administração ====== + +Abaixo você encontra uma lista das tarefas administrativas disponíveis no DokuWiki. diff --git a/inc/lang/pt-br/adminplugins.txt b/inc/lang/pt-br/adminplugins.txt new file mode 100644 index 0000000..3eac7af --- /dev/null +++ b/inc/lang/pt-br/adminplugins.txt @@ -0,0 +1 @@ +===== Plugins Adicionais ===== \ No newline at end of file diff --git a/inc/lang/pt-br/backlinks.txt b/inc/lang/pt-br/backlinks.txt new file mode 100644 index 0000000..5f84e78 --- /dev/null +++ b/inc/lang/pt-br/backlinks.txt @@ -0,0 +1,3 @@ +====== Links reversos ====== + +Esta é uma lista de todas as páginas que apresentam links para a página atual. diff --git a/inc/lang/pt-br/conflict.txt b/inc/lang/pt-br/conflict.txt new file mode 100644 index 0000000..53d9afa --- /dev/null +++ b/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/inc/lang/pt-br/denied.txt b/inc/lang/pt-br/denied.txt new file mode 100644 index 0000000..1c17380 --- /dev/null +++ b/inc/lang/pt-br/denied.txt @@ -0,0 +1,3 @@ +====== Permissão Negada ====== + +Desculpe, você não tem permissões suficientes para continuar. diff --git a/inc/lang/pt-br/diff.txt b/inc/lang/pt-br/diff.txt new file mode 100644 index 0000000..517d9f2 --- /dev/null +++ b/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/inc/lang/pt-br/draft.txt b/inc/lang/pt-br/draft.txt new file mode 100644 index 0000000..60926a0 --- /dev/null +++ b/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. diff --git a/inc/lang/pt-br/edit.txt b/inc/lang/pt-br/edit.txt new file mode 100644 index 0000000..53708f9 --- /dev/null +++ b/inc/lang/pt-br/edit.txt @@ -0,0 +1 @@ +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/inc/lang/pt-br/editrev.txt b/inc/lang/pt-br/editrev.txt new file mode 100644 index 0000000..2926ce0 --- /dev/null +++ b/inc/lang/pt-br/editrev.txt @@ -0,0 +1,2 @@ +**Você carregou uma revisão antiga desse documento!** Se você salvá-la, irá criar uma nova versão com esses dados. +---- diff --git a/inc/lang/pt-br/index.txt b/inc/lang/pt-br/index.txt new file mode 100644 index 0000000..ea8fee1 --- /dev/null +++ b/inc/lang/pt-br/index.txt @@ -0,0 +1,3 @@ +====== Índice ====== + +Esse é um índice de todas as páginas disponíveis, ordenadas por [[doku>pt-br:namespaces|domínios]]. diff --git a/inc/lang/pt-br/install.html b/inc/lang/pt-br/install.html new file mode 100644 index 0000000..3e7954f --- /dev/null +++ b/inc/lang/pt-br/install.html @@ -0,0 +1,7 @@ +

    Essa página irá auxiliá-lo na instalação e configuração do DokuWiki. Você encontra mais informações sobre esse instalador na sua página de documentação.

    + +

    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 precisa 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).

    + +

    O instalador irá definir as configurações da ACL 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.

    + +

    Usuários experientes ou que necessitem efetuar configurações especiais devem utilizar os seguintes links, com instruções detalhadas da instalação e da configuração.

    diff --git a/inc/lang/pt-br/jquery.ui.datepicker.js b/inc/lang/pt-br/jquery.ui.datepicker.js new file mode 100644 index 0000000..3c3984f --- /dev/null +++ b/inc/lang/pt-br/jquery.ui.datepicker.js @@ -0,0 +1,48 @@ +/* Brazilian initialisation for the jQuery UI date picker plugin. */ +/* Written by Leonildo Costa Silva (leocsilva@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional[ "pt-BR" ] = { + closeText: "Fechar", + prevText: "Anterior", + nextText: "Próximo", + 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/inc/lang/pt-br/lang.php b/inc/lang/pt-br/lang.php new file mode 100644 index 0000000..8afbc4a --- /dev/null +++ b/inc/lang/pt-br/lang.php @@ -0,0 +1,398 @@ + + * @author Daniel Dias Rodrigues + * @author Paul Nizan + * @author Eduardo Mozart de Oliveira + * @author ANDRE BASSANI DE FREITAS + * @author Aleksandr Selivanov + * @author Davi Jorge + * @author Schopf + * @author Frederico Gonçalves Guimarães + * @author Márcio Gomes Gonçalves + * @author Luis Fernando Enciso + * @author Alauton/Loug + * @author Felipe Castro + * @author Lucien Raven + * @author Enrico Nicoletto + * @author Flávio Veras + * @author Jeferson Propheta + * @author jair.henrique + * @author Luis Dantas + * @author Sergio Motta + * @author Isaias Masiero Filho + * @author Balaco Baco + * @author Victor Westmann + * @author Leone Lisboa Magevski + * @author Dário Estevão + * @author Juliano Marconi Lanigra + * @author Ednei + * @author Hudson FAS + * @author Guilherme Cardoso + * @author Viliam Dias + */ +$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['searchcreatepage'] = 'Caso você não encontre o que está procurando, você pode criar ou editar a página %s, que recebeu esse nome após a sua pesquisa.'; +$lang['search_fullresults'] = 'Resultados de texto inteiro'; +$lang['js']['search_toggle_tools'] = 'Alternar as ferramentas de pesquisa'; +$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['js']['data_insecure'] = 'AVISO: Parece que seu diretório data não está corretamente seguro. Por favor, leia sobre Web Access Security in DokuWiki.'; +$lang['search_exact_match'] = 'Correspondência exata'; +$lang['search_starts_with'] = 'Começa com'; +$lang['search_ends_with'] = 'Termina com'; +$lang['search_contains'] = 'Contém'; +$lang['search_custom_match'] = 'Personalizar'; +$lang['search_any_ns'] = 'Qualquer espaço de nomes'; +$lang['search_any_time'] = 'Qualquer hora'; +$lang['search_past_7_days'] = 'Semana passada'; +$lang['search_past_month'] = 'Mês passado'; +$lang['search_past_year'] = 'Ano passado'; +$lang['search_sort_by_hits'] = 'Ordenar pelos acertos'; +$lang['search_sort_by_mtime'] = 'Ordenar por última modificação'; +$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.
    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['proftokenlegend'] = 'Token de Autenticação'; +$lang['proftokengenerate'] = 'Redefinir Token'; +$lang['proftokeninfo'] = 'O token de autenticação pode ser usado para permitir que aplicativos de terceiros façam login e atuem em seu nome. A redefinição do token invalidará o antigo e desconectará todos os aplicativos que usaram o token anterior.'; +$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['allowedmime'] = 'Lista de extensões de arquivo permitidas'; +$lang['lockedby'] = 'Atualmente bloqueada por:'; +$lang['lockexpire'] = 'O bloqueio expira em:'; +$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 dois pontos.'; +$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['unknowndate'] = 'Data desconhecida'; +$lang['noflash'] = 'O plug-in Adobe Flash é 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 instruções de instalação do DokuWiki.'; +$lang['i_funcna'] = 'A função PHP %s não está disponível. O seu host a mantém desabilitada por algum motivo?'; +$lang['i_disabled'] = 'Foi desativado pelo seu provedor.'; +$lang['i_funcnmail'] = 'Nota: A função de correio PHP não está disponível. %s Se permanecer indisponível, você pode instalar o plugin SMTP.'; +$lang['i_phpver'] = 'A sua versão do PHP (%s) é inferior à necessária (%s). 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_urandom'] = 'O DokuWiki não pode criar números criptograficamente seguros para cookies. Você pode verificar as configurações do open_basedir no php.ini para obter o acesso / dev / urandom adequado.'; +$lang['i_permfail'] = 'O DokuWiki não tem permissão de escrita em %s. Você precisa corrigir as configurações de permissão nesse diretório!'; +$lang['i_confexists'] = '%s já existe'; +$lang['i_writeerr'] = 'Não foi possível criar %s. É 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=%s)'; +$lang['i_badval'] = '%s - 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 novo DokuWiki!'; +$lang['i_failure'] = 'Ocorreram alguns erros durante a escrita dos arquivos de configuração. É necessário corrigi-los manualmente antes de usar seu novo DokuWiki'; +$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 %s. Também é possível ver as modificações recentes no wiki inteiro.'; +$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['email_fail'] = 'PHP mail () ausente ou desativado. O seguinte email não foi enviado:'; +$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 %s.'; +$lang['unable_to_parse_date'] = 'Impossível analisar em "%s".'; +$lang['email_signature_text'] = 'Essa mensagem foi gerada pelo DokuWiki em +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = 'Arquivo de registro muito grande. As linhas anteriores foram ignoradas!'; +$lang['log_file_failed_to_open'] = 'Falha ao abrir o arquivo de log.'; +$lang['log_file_failed_to_read'] = 'Ocorreu um erro ao ler o log.'; diff --git a/inc/lang/pt-br/locked.txt b/inc/lang/pt-br/locked.txt new file mode 100644 index 0000000..70658cb --- /dev/null +++ b/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/inc/lang/pt-br/login.txt b/inc/lang/pt-br/login.txt new file mode 100644 index 0000000..23215e1 --- /dev/null +++ b/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/inc/lang/pt-br/mailtext.txt b/inc/lang/pt-br/mailtext.txt new file mode 100644 index 0000000..5bdbfdd --- /dev/null +++ b/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/inc/lang/pt-br/mailwrap.html b/inc/lang/pt-br/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/pt-br/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/pt-br/newpage.txt b/inc/lang/pt-br/newpage.txt new file mode 100644 index 0000000..cc2ca50 --- /dev/null +++ b/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/inc/lang/pt-br/norev.txt b/inc/lang/pt-br/norev.txt new file mode 100644 index 0000000..19024dc --- /dev/null +++ b/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/inc/lang/pt-br/onceexisted.txt b/inc/lang/pt-br/onceexisted.txt new file mode 100644 index 0000000..b02ceb1 --- /dev/null +++ b/inc/lang/pt-br/onceexisted.txt @@ -0,0 +1,3 @@ +======= Esta página não existe mais ======= + +Você seguiu um link para uma página que não existe mais. Você pode verificar a lista de **revisões anteriores** para verificar quando e porque ela foi excluída, acessar revisões anteriores ou restaurá-la. diff --git a/inc/lang/pt-br/password.txt b/inc/lang/pt-br/password.txt new file mode 100644 index 0000000..0a7587a --- /dev/null +++ b/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/inc/lang/pt-br/preview.txt b/inc/lang/pt-br/preview.txt new file mode 100644 index 0000000..ba1efe7 --- /dev/null +++ b/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/inc/lang/pt-br/pwconfirm.txt b/inc/lang/pt-br/pwconfirm.txt new file mode 100644 index 0000000..324f9df --- /dev/null +++ b/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/inc/lang/pt-br/read.txt b/inc/lang/pt-br/read.txt new file mode 100644 index 0000000..897155e --- /dev/null +++ b/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/inc/lang/pt-br/recent.txt b/inc/lang/pt-br/recent.txt new file mode 100644 index 0000000..e9c4163 --- /dev/null +++ b/inc/lang/pt-br/recent.txt @@ -0,0 +1,3 @@ +====== Alterações Recentes ====== + +As seguintes páginas foram alteradas recentemente: diff --git a/inc/lang/pt-br/register.txt b/inc/lang/pt-br/register.txt new file mode 100644 index 0000000..b83aa0a --- /dev/null +++ b/inc/lang/pt-br/register.txt @@ -0,0 +1,3 @@ +====== 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>pt-br:pagename|nome de página]] válido. diff --git a/inc/lang/pt-br/registermail.txt b/inc/lang/pt-br/registermail.txt new file mode 100644 index 0000000..bbf2547 --- /dev/null +++ b/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/inc/lang/pt-br/resendpwd.txt b/inc/lang/pt-br/resendpwd.txt new file mode 100644 index 0000000..4330e0f --- /dev/null +++ b/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. diff --git a/inc/lang/pt-br/resetpwd.txt b/inc/lang/pt-br/resetpwd.txt new file mode 100644 index 0000000..4c403c8 --- /dev/null +++ b/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. diff --git a/inc/lang/pt-br/revisions.txt b/inc/lang/pt-br/revisions.txt new file mode 100644 index 0000000..fd2ff7d --- /dev/null +++ b/inc/lang/pt-br/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/pt-br/searchpage.txt b/inc/lang/pt-br/searchpage.txt new file mode 100644 index 0000000..fe31dba --- /dev/null +++ b/inc/lang/pt-br/searchpage.txt @@ -0,0 +1,3 @@ +====== Pesquisa ====== + +Você pode encontrar os resultados da sua pesquisa abaixo. @CREATEPAGEINFO@ diff --git a/inc/lang/pt-br/showrev.txt b/inc/lang/pt-br/showrev.txt new file mode 100644 index 0000000..89d9cad --- /dev/null +++ b/inc/lang/pt-br/showrev.txt @@ -0,0 +1,2 @@ +**Essa é uma revisão anterior do documento!** +---- diff --git a/inc/lang/pt-br/stopwords.txt b/inc/lang/pt-br/stopwords.txt new file mode 100644 index 0000000..bad61f2 --- /dev/null +++ b/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 diff --git a/inc/lang/pt-br/subscr_digest.txt b/inc/lang/pt-br/subscr_digest.txt new file mode 100644 index 0000000..8251651 --- /dev/null +++ b/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/inc/lang/pt-br/subscr_form.txt b/inc/lang/pt-br/subscr_form.txt new file mode 100644 index 0000000..1611ea9 --- /dev/null +++ b/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/inc/lang/pt-br/subscr_list.txt b/inc/lang/pt-br/subscr_list.txt new file mode 100644 index 0000000..fb46777 --- /dev/null +++ b/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/inc/lang/pt-br/subscr_single.txt b/inc/lang/pt-br/subscr_single.txt new file mode 100644 index 0000000..e59a1e1 --- /dev/null +++ b/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/inc/lang/pt-br/updateprofile.txt b/inc/lang/pt-br/updateprofile.txt new file mode 100644 index 0000000..2a19939 --- /dev/null +++ b/inc/lang/pt-br/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/pt-br/uploadmail.txt b/inc/lang/pt-br/uploadmail.txt new file mode 100644 index 0000000..8527f8e --- /dev/null +++ b/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/inc/lang/pt/admin.txt b/inc/lang/pt/admin.txt new file mode 100644 index 0000000..8324502 --- /dev/null +++ b/inc/lang/pt/admin.txt @@ -0,0 +1,3 @@ +====== Administração ====== + +Abaixo você pode encontrar uma lista de tarefas administrativas disponíveis no DokuWiki. diff --git a/inc/lang/pt/adminplugins.txt b/inc/lang/pt/adminplugins.txt new file mode 100644 index 0000000..3eac7af --- /dev/null +++ b/inc/lang/pt/adminplugins.txt @@ -0,0 +1 @@ +===== Plugins Adicionais ===== \ No newline at end of file diff --git a/inc/lang/pt/backlinks.txt b/inc/lang/pt/backlinks.txt new file mode 100644 index 0000000..fdc8fe8 --- /dev/null +++ b/inc/lang/pt/backlinks.txt @@ -0,0 +1,3 @@ +====== Backlinks ====== + +Esta é uma lista de páginas que parecem interligar de volta para a página atual. diff --git a/inc/lang/pt/conflict.txt b/inc/lang/pt/conflict.txt new file mode 100644 index 0000000..1a7315e --- /dev/null +++ b/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 usuário alterou o documento enquanto você o editava. + +Analise cuidadosamente as diferenças mostradas abaixo, depois decida qual versão manter. Se escolher 'salvar'', a sua versão será salva. Clique em ''cancelar '' para manter a versão atual. diff --git a/inc/lang/pt/denied.txt b/inc/lang/pt/denied.txt new file mode 100644 index 0000000..8b7a3d1 --- /dev/null +++ b/inc/lang/pt/denied.txt @@ -0,0 +1,3 @@ +====== Permissão Negada ====== + +Desculpe, você não tem direitos suficientes para continuar. diff --git a/inc/lang/pt/diff.txt b/inc/lang/pt/diff.txt new file mode 100644 index 0000000..23feb14 --- /dev/null +++ b/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. diff --git a/inc/lang/pt/draft.txt b/inc/lang/pt/draft.txt new file mode 100644 index 0000000..4aa9556 --- /dev/null +++ b/inc/lang/pt/draft.txt @@ -0,0 +1,5 @@ +====== Rascunho encontrado ====== + +A sessão referente à última edição desta página não terminou corretamente. Foi guardado automaticamente um rascunho durante a edição que você 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/inc/lang/pt/edit.txt b/inc/lang/pt/edit.txt new file mode 100644 index 0000000..7d45559 --- /dev/null +++ b/inc/lang/pt/edit.txt @@ -0,0 +1 @@ +Edite o documento e clique no botão "Salvar". Veja 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 seus conhecimentos no uso deste motor Wiki, realize os seus testes no [[playground:playground|Recreio]]. diff --git a/inc/lang/pt/editrev.txt b/inc/lang/pt/editrev.txt new file mode 100644 index 0000000..7ec25aa --- /dev/null +++ b/inc/lang/pt/editrev.txt @@ -0,0 +1,2 @@ +**Você carregou uma revisão antiga do documento!** Se a salvar irá criar uma nova versão do documento com este conteúdo, que substituirá a versão atual. +---- diff --git a/inc/lang/pt/index.txt b/inc/lang/pt/index.txt new file mode 100644 index 0000000..be624c6 --- /dev/null +++ b/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]]. diff --git a/inc/lang/pt/install.html b/inc/lang/pt/install.html new file mode 100644 index 0000000..ecbf105 --- /dev/null +++ b/inc/lang/pt/install.html @@ -0,0 +1,7 @@ +

    Esta página serve de "assistente" para a primeira instalação e configuração do Dokuwiki. Está disponível mais informação sobre este "assistente" na sua página de documentação.

    + +

    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 requer 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).

    + +

    Este "assistente" vai configurar o DokuWiki com ACL, 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.

    + +

    Utilizadores experiente ou com requisitos especiais devem seguir estes links, que detalham mais em pormenor ainstalação e configuração do DokuWiki.

    diff --git a/inc/lang/pt/jquery.ui.datepicker.js b/inc/lang/pt/jquery.ui.datepicker.js new file mode 100644 index 0000000..3112cb4 --- /dev/null +++ b/inc/lang/pt/jquery.ui.datepicker.js @@ -0,0 +1,47 @@ +/* Portuguese initialisation for the jQuery UI date picker plugin. */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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: 1, + isRTL: false, + showMonthAfterYear: false, + yearSuffix: "" }; +datepicker.setDefaults( datepicker.regional.pt ); + +return datepicker.regional.pt; + +} ); diff --git a/inc/lang/pt/lang.php b/inc/lang/pt/lang.php new file mode 100644 index 0000000..57e993d --- /dev/null +++ b/inc/lang/pt/lang.php @@ -0,0 +1,385 @@ + + * @author Rafael Fernandes + * @author Eduardo Mozart de Oliveira + * @author Gustavo B. Schenkel + * @author Paulo + * @author Mario AlexandTeixeira dos Santos + * @author Maykon Oliveira + * @author José Vieira + * @author José Carlos Monteiro + * @author José Monteiro + * @author Enrico Nicoletto + * @author Fil + * @author André Neves + * @author José Campos + * @author Murilo + * @author Paulo Silva + * @author Guido Salatino + * @author Romulo Pereira + * @author Paulo Carmino + * @author Alfredo Silva + * @author Guilherme Sá + */ +$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'] = 'Salvar'; +$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'] = 'Atualizar'; +$lang['btn_delete'] = 'Excluir'; +$lang['btn_back'] = 'Voltar'; +$lang['btn_backlink'] = 'Backlinks'; +$lang['btn_subscribe'] = 'Gerenciar Subscrições'; +$lang['btn_profile'] = 'Atualizar Perfil'; +$lang['btn_reset'] = 'Redefinir'; +$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'] = 'Gerenciador de Mídia'; +$lang['btn_deleteuser'] = 'Remover Minha Conta'; +$lang['btn_img_backto'] = 'De volta a %s'; +$lang['btn_mediaManager'] = 'Ver no gerenciador de mídia'; +$lang['loggedinas'] = 'Está em sessão como:'; +$lang['user'] = 'Utilizador'; +$lang['pass'] = 'Senha'; +$lang['newpass'] = 'Nova senha'; +$lang['oldpass'] = 'Confirme senha atual'; +$lang['passchk'] = 'mais uma vez'; +$lang['remember'] = 'Lembrar?'; +$lang['fullname'] = 'Nome completo'; +$lang['email'] = 'E-mail'; +$lang['profile'] = 'Perfil do Usuário'; +$lang['badlogin'] = 'Usuário ou ou senha inválida.'; +$lang['badpassconfirm'] = 'Infelizmente a senha não é a correta'; +$lang['minoredit'] = 'Alterações Menores'; +$lang['draftdate'] = 'Rascunho automaticamente gravado em'; +$lang['nosecedit'] = 'A página foi modificada. Como a informação da seção estava desatualizada, foi carregada a página inteira.'; +$lang['searchcreatepage'] = 'Se não encontrou o que estava procurando, pode criar uma nova página com o nome %s.'; +$lang['search_fullresults'] = 'O que foi encontrado nos textos'; +$lang['js']['search_toggle_tools'] = 'Mudar Ferramenta de Pesquisa'; +$lang['js']['willexpire'] = 'O bloqueio de edição para este documento irá expirar em um minuto.\nPara evitar conflitos use o botão prever para reiniciar o temporizador de bloqueio.'; +$lang['js']['notsavedyet'] = 'Alterações não salvas serão perdidas.'; +$lang['js']['searchmedia'] = 'Procurar por arquivos'; +$lang['js']['keepopen'] = 'Mantenha a janela aberta durante a selecção'; +$lang['js']['hidedetails'] = 'Esconder Detalhes'; +$lang['js']['mediatitle'] = 'Configurações de 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 a imagem.'; +$lang['js']['mediadisplaylnk'] = 'Mostrar apenas o 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 a página de detalhe'; +$lang['js']['mediadirect'] = 'Link direto para o original'; +$lang['js']['medianolnk'] = 'Nenhuma link'; +$lang['js']['medianolink'] = 'Não linkar à 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'] = 'Linkar a pastas Windows compartilhadas apenas funciona com o Microsoft Internet Explorer.\nVocê pode no entanto copiar e colar o link.'; +$lang['js']['linkwiz'] = 'Assistente de Criação de Link'; +$lang['js']['linkto'] = 'Link 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 arquivos…'; +$lang['js']['media_upload_btn'] = 'Enviar'; +$lang['js']['media_done_btn'] = 'Feito'; +$lang['js']['media_drop'] = 'Largue arquivo aqui para enviar'; +$lang['js']['media_cancel'] = 'excluir'; +$lang['js']['media_overwrt'] = 'Escrever por cima de arquivos existentes'; +$lang['js']['data_insecure'] = 'AVISO: Parece que seu diretório de dados não está devidamente protegido. Por favor leia sobre Segurança de acesso à web em DokuWiki.'; +$lang['search_exact_match'] = 'Correspondência exata'; +$lang['search_starts_with'] = 'Começa por'; +$lang['search_ends_with'] = 'Termina em'; +$lang['search_contains'] = 'Contém'; +$lang['search_custom_match'] = 'Personalizado'; +$lang['search_any_ns'] = 'Qualquer local'; +$lang['search_any_time'] = 'Em qualquer momento'; +$lang['search_past_7_days'] = 'Semana passada'; +$lang['search_past_month'] = 'Mês passado'; +$lang['search_past_year'] = 'Ano passado'; +$lang['search_sort_by_hits'] = 'Ordenar por ocorrência'; +$lang['search_sort_by_mtime'] = 'Ordenar pela última alteração'; +$lang['regmissing'] = 'Por favor, preencha todos os campos.'; +$lang['reguexists'] = 'Este usuário já está inscrito. Por favor escolha outro nome de usuário.'; +$lang['regsuccess'] = 'O usuário foi criado e a senha foi enviada para o endereço de correio eletrônico usado na inscrição.'; +$lang['regsuccess2'] = 'O usuário 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 eletrônico é inválido. Se o endereço está correto e isto é um erro, 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'] = 'Ainda não tem uma conta? Registre-se'; +$lang['profna'] = 'Este Wiki não suporta modificações nos perfis'; +$lang['profnochange'] = 'Nenhuma alteração, nada a fazer.'; +$lang['profnoempty'] = 'Não são permitidos nomes ou e-mails em branco.'; +$lang['profchanged'] = 'Perfil do usuário atualizado com sucesso.'; +$lang['profnodelete'] = 'Este wiki não suporta remoção de utilizadores'; +$lang['profdeleteuser'] = 'Apagar Conta'; +$lang['profdeleted'] = 'A sua conta de utilizador foi removida deste wiki'; +$lang['profconfdelete'] = 'Quero remover a minha conta deste wiki.
    Esta ação não pode ser desfeita.'; +$lang['profconfdeletemissing'] = 'A caixa de confirmação não foi marcada'; +$lang['proffail'] = 'O perfil do usuário não foi atualizado.'; +$lang['proftokenlegend'] = 'Token de autenticação'; +$lang['proftokengenerate'] = 'Token para limpar'; +$lang['pwdforget'] = 'Esqueceu a sua senha? Peça uma nova'; +$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 usuário.'; +$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 arquivo:'; +$lang['searchmedia_in'] = 'Procurar em %s'; +$lang['txt_upload'] = 'Escolha arquivo a carregar:'; +$lang['txt_filename'] = 'Carregar como (opcional):'; +$lang['txt_overwrt'] = 'Sobrescrever arquivo'; +$lang['maxuploadsize'] = 'Enviar %s max. por arquivo.'; +$lang['allowedmime'] = 'Lista de extensões de arquivo permitidas'; +$lang['lockedby'] = 'Bloqueado por:'; +$lang['lockexpire'] = 'Expira em:'; +$lang['rssfailed'] = 'Erro ao buscar informação deste feed:'; +$lang['nothingfound'] = 'Nada foi encontrado.'; +$lang['mediaselect'] = 'Seleção de arquivos'; +$lang['uploadsucc'] = 'Enviado com sucesso'; +$lang['uploadfail'] = 'O envio falhou. Talvez por não ter permissões?'; +$lang['uploadwrong'] = 'Envio negado. Esta extensão de arquivo é proibida!'; +$lang['uploadexist'] = 'O arquivo já existe. Nada foi feito.'; +$lang['uploadbadcontent'] = 'O conteúdo do envio não corresponde à extensão %s.'; +$lang['uploadspam'] = 'O envio foi bloqueado pela lista negra de spam.'; +$lang['uploadxss'] = 'O envio foi bloqueado porque possivelmente contem conteúdo malicioso.'; +$lang['uploadsize'] = 'O arquivo enviado é muito grande. (máx. %s)'; +$lang['deletesucc'] = 'O arquivo "%s" foi excluído.'; +$lang['deletefail'] = 'O arquivo "%s" não pode ser excluído - verifique as permissões.'; +$lang['mediainuse'] = 'O arquivo "%s" não foi excluído porque está sendo usado.'; +$lang['namespaces'] = 'Namespaces'; +$lang['mediafiles'] = 'Arquivos disponíveis em'; +$lang['accessdenied'] = 'Não tem permissão para ver esta página.'; +$lang['mediausage'] = 'Use a seguinte sintaxe para referenciar este arquivo:'; +$lang['mediaview'] = 'Ver arquivo original'; +$lang['mediaroot'] = 'root'; +$lang['mediaupload'] = 'Enviar arquivos para o grupo atual aqui. Para criar sub-grupos: escrever o nome do sub-grupo seguido de: antes do nome do arquivo no campo "Enviar como".'; +$lang['mediaextchange'] = 'Extensão alterada de .%s para .%s!'; +$lang['reference'] = 'Referências para'; +$lang['ref_inuse'] = 'O arquivo não pode ser removido, porque está sendo 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'] = 'Pagenames encontrados'; +$lang['toc'] = 'Tabela de Conteúdos'; +$lang['current'] = 'Atual'; +$lang['yours'] = 'Sua versão'; +$lang['diff'] = 'Mostrar diferenças com a versão atual'; +$lang['diff2'] = 'Mostrar diferenças entre versões escolhidas'; +$lang['difflink'] = 'Links 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'] = 'Última modificação em:'; +$lang['by'] = 'por'; +$lang['deleted'] = 'excluído'; +$lang['created'] = 'criado'; +$lang['restored'] = 'versão anterior restaurada (%s)'; +$lang['external_edit'] = 'edição externa'; +$lang['summary'] = 'Sumário da edição'; +$lang['unknowndate'] = 'Data desconhecida'; +$lang['noflash'] = 'O Plugin Adobe Flash é necessário para exibir este conteúdo.'; +$lang['download'] = 'Baixar Snippet'; +$lang['tools'] = 'Ferramentas'; +$lang['user_tools'] = 'Ferramentas de Usuário'; +$lang['site_tools'] = 'Ferramentas de Site'; +$lang['page_tools'] = 'Ferramentas de Página'; +$lang['skip_to_content'] = 'ir ao conteúdo'; +$lang['sidebar'] = 'Barra Lateral'; +$lang['mail_newpage'] = 'documento adicionado:'; +$lang['mail_changed'] = 'documento modificado:'; +$lang['mail_subscribe_list'] = 'páginas alteradas no namespace:'; +$lang['mail_new_user'] = 'Novo usuário:'; +$lang['mail_upload'] = 'Arquivo enviado:'; +$lang['changes_type'] = 'Ver alterações de'; +$lang['pages_changes'] = 'Páginas'; +$lang['media_changes'] = 'Arquivo de mídia'; +$lang['both_changes'] = 'Tanto páginas como arquivos de mídia'; +$lang['qb_bold'] = 'Texto Negrito'; +$lang['qb_italic'] = 'Texto Itálico'; +$lang['qb_underl'] = 'Texto Sublinhado'; +$lang['qb_code'] = 'Texto Monoespaçado'; +$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'] = 'Selecionar 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'] = 'Link Interno'; +$lang['qb_extlink'] = 'Link Externo'; +$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 arquivos (abre numa nova página)'; +$lang['qb_sig'] = 'Inserir Assinatura'; +$lang['qb_smileys'] = 'Smileys'; +$lang['qb_chars'] = 'Caracteres Especiais'; +$lang['upperns'] = 'Ir para o namespace superior'; +$lang['metaedit'] = 'Editar Metadata'; +$lang['metasaveerr'] = 'Erro na escrita de Metadata'; +$lang['metasaveok'] = 'Metadata salva'; +$lang['img_title'] = 'Título:'; +$lang['img_caption'] = 'Legenda:'; +$lang['img_date'] = 'Data:'; +$lang['img_fname'] = 'Arquivo:'; +$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 usuário, você 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 namespace corrente.'; +$lang['subscr_m_new_header'] = 'Adicionar subscrição'; +$lang['subscr_m_current_header'] = 'Subscrições atuais'; +$lang['subscr_m_unsubscribe'] = 'Des-subscrever'; +$lang['subscr_m_subscribe'] = 'Subscrever'; +$lang['subscr_m_receive'] = 'Receber'; +$lang['subscr_style_every'] = 'e-mail em toda 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 e-mail (cada %.2f dias)'; +$lang['authtempfail'] = 'Autenticação temporariamente indisponível. Se a situação persistir, informe o Administrador do Wiki.'; +$lang['i_chooselang'] = 'Escolha o idioma'; +$lang['i_installer'] = 'Instalador do DokuWiki'; +$lang['i_wikiname'] = 'Nome Wiki'; +$lang['i_enableacl'] = 'Ativar ACL (recomendado)'; +$lang['i_superuser'] = 'Superusuário'; +$lang['i_problems'] = 'O instalador encontrou alguns problemas, indicados 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. Você deve re-extrair os arquivos do pacote que baixou ou então consultar as instruções de instalação do Dokuwiki'; +$lang['i_funcna'] = 'A função PHP %s não está disponível. Talvez o host a tenha desativado-a por alguma razão?'; +$lang['i_disabled'] = 'Isso foi desativado pelo seu provedor.'; +$lang['i_funcnmail'] = 'Nota: A função mail do PHP não está disponível. %s Se ela permanecer indisponível, instale o plugin smtp.'; +$lang['i_phpver'] = 'A versão de PHP actual %s é inferior à versão mínima %s. É preciso atualizar a instalação PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload deve ser desativada no php.ini para executar o DokuWiki.'; +$lang['i_urandom'] = 'DokuWiki não pode criar números criptograficamente seguros para cookies. Verifique a configuração open_basedir no php.ini para um acesso /dev/urandom adequado.'; +$lang['i_permfail'] = '%s não permite que o DokuWiki escreva nela. É preciso corrigir as permissões desta pasta!'; +$lang['i_confexists'] = '%s já existe'; +$lang['i_writeerr'] = 'Não foi possível criar %s. É preciso verificar as permissões e criar o arquivo manualmente.'; +$lang['i_badhash'] = 'dokuwiki.php não é o original ou não é reconhecido (hash=%s)'; +$lang['i_badval'] = '%s - valor ilegal ou vazio'; +$lang['i_success'] = 'A instalação e a configuração inicial terminaram. Pode remover o install.php. Acesse ao seu novo Wiki rodando o DokuWiki.'; +$lang['i_failure'] = 'Ocorreram alguns erros durante a escrita nos arquivos de configuração. Poderá ser preciso corrigi-los manualmente antes de poder acessar ao seu novo Wiki rodando o DokuWiki.'; +$lang['i_policy'] = 'Política ACL inicial'; +$lang['i_pol0'] = 'Wiki Aberto (ler, escrever e enviar arquivos para todos)'; +$lang['i_pol1'] = 'Wiki Público (ler para todos, escrever e enviar arquivos para utilizadores inscritos)'; +$lang['i_pol2'] = 'Wiki Fechado (ler, escrever e enviar arquivos somente para utilizadores inscritos)'; +$lang['i_allowreg'] = 'Permitir aos utilizadores registarem-se sozinhos'; +$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á vendo as alterações dentro do namespace %s. Também é possível ver as modificações recentes no wiki inteiro.'; +$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'] = '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'] = 'Escolha o namespace'; +$lang['media_files'] = 'Arquivos em %s'; +$lang['media_upload'] = 'Enviar para %s'; +$lang['media_search'] = 'Procurar em %s'; +$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 arquivos.'; +$lang['media_perm_upload'] = 'Perdão, não tem permissão para enviar arquivos.'; +$lang['media_update'] = 'Enviar 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['email_fail'] = 'O mail() PHP está ausente ou desativado. O seguinte e-mail não foi enviado:'; +$lang['currentns'] = 'Namespace atual'; +$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 criada em %s.'; +$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@'; +$lang['log_file_too_large'] = 'Arquivo de log muito grande. Linhas antigas foram ocultadas.'; +$lang['log_file_failed_to_open'] = 'Falha na abertura do arquivo de log.'; +$lang['log_file_failed_to_read'] = 'Um erro ocorreu na leitura do log.'; diff --git a/inc/lang/pt/locked.txt b/inc/lang/pt/locked.txt new file mode 100644 index 0000000..e84552a --- /dev/null +++ b/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. diff --git a/inc/lang/pt/login.txt b/inc/lang/pt/login.txt new file mode 100644 index 0000000..50f9acb --- /dev/null +++ b/inc/lang/pt/login.txt @@ -0,0 +1,3 @@ +====== Entrar ====== + +Não está logado! Digite as suas credenciais de autenticação abaixo para para logar-se. Precisa de ter cookies ativos no navegador. diff --git a/inc/lang/pt/mailtext.txt b/inc/lang/pt/mailtext.txt new file mode 100644 index 0000000..bec21cc --- /dev/null +++ b/inc/lang/pt/mailtext.txt @@ -0,0 +1,16 @@ +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@ +Data da Revisão: @DATE@ +Resumo da Edição : @SUMMARY@ +Usuário : @USER@ + +Pode haver alterações mais recentes após esta revisão. Se isto +acontecer, uma mensagem será mostrada na parte superior da página de revisão. + +@DIFF@ diff --git a/inc/lang/pt/newpage.txt b/inc/lang/pt/newpage.txt new file mode 100644 index 0000000..0a5c936 --- /dev/null +++ b/inc/lang/pt/newpage.txt @@ -0,0 +1,3 @@ +====== Este tópico ainda não existe ====== + +Você seguiu um link para um documento que ainda não existe. Pode criá-lo usando o botão **Criar página**, se as permissões lhe permitirem. diff --git a/inc/lang/pt/norev.txt b/inc/lang/pt/norev.txt new file mode 100644 index 0000000..2802d5f --- /dev/null +++ b/inc/lang/pt/norev.txt @@ -0,0 +1,3 @@ +====== Revisão Inexistente ====== + +A revisão especificada não existe. Clique no botão para acessar a lista de revisões deste documento. diff --git a/inc/lang/pt/onceexisted.txt b/inc/lang/pt/onceexisted.txt new file mode 100644 index 0000000..59509df --- /dev/null +++ b/inc/lang/pt/onceexisted.txt @@ -0,0 +1,3 @@ +======= Esta página não existe mais ====== + +Você seguiu um link para uma página que não existe mais. Você pode verificar a lista de **revisões antigas** para ver quando e por que foi excluída, acessar revisões antigas ou restaurá-la. diff --git a/inc/lang/pt/password.txt b/inc/lang/pt/password.txt new file mode 100644 index 0000000..218f636 --- /dev/null +++ b/inc/lang/pt/password.txt @@ -0,0 +1,6 @@ +Olá, @FULLNAME@! + +Aqui estão as suas credenciais para @TITLE@, em @DOKUWIKIURL@ + +Usuário : @LOGIN@ +Senha : @PASSWORD@ diff --git a/inc/lang/pt/preview.txt b/inc/lang/pt/preview.txt new file mode 100644 index 0000000..c5a8bec --- /dev/null +++ b/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á salvo**! diff --git a/inc/lang/pt/pwconfirm.txt b/inc/lang/pt/pwconfirm.txt new file mode 100644 index 0000000..bcb08ac --- /dev/null +++ b/inc/lang/pt/pwconfirm.txt @@ -0,0 +1,9 @@ +Olá @FULLNAME@! + +Alguém solicitou uma nova senha para o seu perfil @TITLE@ em @DOKUWIKIURL@ + +Se não foi você que solicitou então ignore esta mensagem. + +Senão, para confirmar o pedido, siga este link: + +@CONFIRM@ diff --git a/inc/lang/pt/read.txt b/inc/lang/pt/read.txt new file mode 100644 index 0000000..968084a --- /dev/null +++ b/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á correto. diff --git a/inc/lang/pt/recent.txt b/inc/lang/pt/recent.txt new file mode 100644 index 0000000..eccf281 --- /dev/null +++ b/inc/lang/pt/recent.txt @@ -0,0 +1,3 @@ +====== Alterações Recentes ====== + +Os seguintes documentos foram alterados recentemente: diff --git a/inc/lang/pt/register.txt b/inc/lang/pt/register.txt new file mode 100644 index 0000000..b7a8cc6 --- /dev/null +++ b/inc/lang/pt/register.txt @@ -0,0 +1,3 @@ +====== Inscrição como novo usuário ====== + +Preencha toda a informação abaixo para criar uma nova conta neste wiki. Assegure que providencia um **endereço de e-mail válido** - se não lhe for pedido que introduza uma nova senha aqui, ser-lhe-á enviada uma para esse endereço. O nome de usuário deve ser um [[doku>pt-br:pagename|nome de página]] válido. diff --git a/inc/lang/pt/registermail.txt b/inc/lang/pt/registermail.txt new file mode 100644 index 0000000..ae4a70e --- /dev/null +++ b/inc/lang/pt/registermail.txt @@ -0,0 +1,10 @@ +Um novo usuário foi registrado. Aqui estão os detalhes: + +Usuário : @NEWUSER@ +Nome Completo : @NEWNAME@ +E-mail : @NEWEMAIL@ + +Data : @DATE@ +Navegador : @BROWSER@ +Endereço IP : @IPADDRESS@ +Hostname : @HOSTNAME@ diff --git a/inc/lang/pt/resendpwd.txt b/inc/lang/pt/resendpwd.txt new file mode 100644 index 0000000..7ce47a6 --- /dev/null +++ b/inc/lang/pt/resendpwd.txt @@ -0,0 +1,3 @@ +====== Enviar nova senha ====== + +Insira o seu nome de usuário neste formulário para solicitar uma nova senha para esta conta/perfil. Um link de confirmação será enviado para o endereço de e-mail associado. diff --git a/inc/lang/pt/resetpwd.txt b/inc/lang/pt/resetpwd.txt new file mode 100644 index 0000000..795575a --- /dev/null +++ b/inc/lang/pt/resetpwd.txt @@ -0,0 +1,3 @@ +====== Definir nova senha ====== + +Digite uma nova senha para a sua conta neste wiki. diff --git a/inc/lang/pt/revisions.txt b/inc/lang/pt/revisions.txt new file mode 100644 index 0000000..b0c1ae0 --- /dev/null +++ b/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 salve. diff --git a/inc/lang/pt/searchpage.txt b/inc/lang/pt/searchpage.txt new file mode 100644 index 0000000..62449d4 --- /dev/null +++ b/inc/lang/pt/searchpage.txt @@ -0,0 +1,3 @@ +====== Pesquisa ====== + +Pode encontrar os resultados da sua pesquisa abaixo. @CREATEPAGEINFO@ diff --git a/inc/lang/pt/showrev.txt b/inc/lang/pt/showrev.txt new file mode 100644 index 0000000..e706f45 --- /dev/null +++ b/inc/lang/pt/showrev.txt @@ -0,0 +1,2 @@ +**Esta é uma versão antiga do documento!** +---- diff --git a/inc/lang/pt/stopwords.txt b/inc/lang/pt/stopwords.txt new file mode 100644 index 0000000..2182726 --- /dev/null +++ b/inc/lang/pt/stopwords.txt @@ -0,0 +1,142 @@ +# 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 (fim de linha simples) +# 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ê +www diff --git a/inc/lang/pt/subscr_digest.txt b/inc/lang/pt/subscr_digest.txt new file mode 100644 index 0000000..565c399 --- /dev/null +++ b/inc/lang/pt/subscr_digest.txt @@ -0,0 +1,16 @@ +Olá! + +A página @PAGE@ do 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 no wiki em +@DOKUWIKIURL@, então visite +@SUBSCRIBE@ +e des-subscreva as alterações à página e/ou namespace. diff --git a/inc/lang/pt/subscr_form.txt b/inc/lang/pt/subscr_form.txt new file mode 100644 index 0000000..079a816 --- /dev/null +++ b/inc/lang/pt/subscr_form.txt @@ -0,0 +1,3 @@ +====== Gerenciamento de Subscrição ====== + +Esta página permite-lhe gerenciar as suas subscrições para a página e namespace atuais. \ No newline at end of file diff --git a/inc/lang/pt/subscr_list.txt b/inc/lang/pt/subscr_list.txt new file mode 100644 index 0000000..003baec --- /dev/null +++ b/inc/lang/pt/subscr_list.txt @@ -0,0 +1,13 @@ +Olá! + +Páginas no namespace @PAGE@ do wiki @TITLE@ mudaram. +Eis as páginas alteradas: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Para cancelar as notificações de páginas, inicie sessão no wiki em +@DOKUWIKIURL@, visite +@SUBSCRIBE@ +e des-subscreva às alterações da página e/ou namespace. diff --git a/inc/lang/pt/subscr_single.txt b/inc/lang/pt/subscr_single.txt new file mode 100644 index 0000000..8b494e0 --- /dev/null +++ b/inc/lang/pt/subscr_single.txt @@ -0,0 +1,20 @@ +Olá! + +A página @PAGE@ no wiki @TITLE@ mudou. +Eis as alterações: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Data : @DATE@ +Usuário : @USER@ +Sumário de Edição : @SUMMARY@ +Revisão Antiga : @OLDPAGE@ +Revisão Nova : @NEWPAGE@ +Data da Revisão: @DATE@ + +Para cancelar as notificações de página, logue-se no wiki em +@DOKUWIKIURL@, então visite +@SUBSCRIBE@ +e des-subscreva às alterações de página e/ou namespace. diff --git a/inc/lang/pt/updateprofile.txt b/inc/lang/pt/updateprofile.txt new file mode 100644 index 0000000..78ae025 --- /dev/null +++ b/inc/lang/pt/updateprofile.txt @@ -0,0 +1,3 @@ +====== Atualize o seu perfil ====== + +Apenas precisa de completar os campos que pretende alterar. Não é possível alterar o seu nome de usuário. diff --git a/inc/lang/pt/uploadmail.txt b/inc/lang/pt/uploadmail.txt new file mode 100644 index 0000000..4b8275f --- /dev/null +++ b/inc/lang/pt/uploadmail.txt @@ -0,0 +1,11 @@ +Um arquivo foi enviado. Aqui estão os detalhes: + +Arquivo : @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/inc/lang/ro/admin.txt b/inc/lang/ro/admin.txt new file mode 100644 index 0000000..8c7b3d6 --- /dev/null +++ b/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/inc/lang/ro/adminplugins.txt b/inc/lang/ro/adminplugins.txt new file mode 100644 index 0000000..121a8fd --- /dev/null +++ b/inc/lang/ro/adminplugins.txt @@ -0,0 +1 @@ +===== Plugin-uri suplimentare ===== diff --git a/inc/lang/ro/backlinks.txt b/inc/lang/ro/backlinks.txt new file mode 100644 index 0000000..ae52a10 --- /dev/null +++ b/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/inc/lang/ro/conflict.txt b/inc/lang/ro/conflict.txt new file mode 100644 index 0000000..dcac677 --- /dev/null +++ b/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/inc/lang/ro/denied.txt b/inc/lang/ro/denied.txt new file mode 100644 index 0000000..a485c1a --- /dev/null +++ b/inc/lang/ro/denied.txt @@ -0,0 +1,3 @@ +====== Acces nepermis ====== + +Din păcate nu ai destule drepturi pentru a continua. diff --git a/inc/lang/ro/diff.txt b/inc/lang/ro/diff.txt new file mode 100644 index 0000000..4bf6250 --- /dev/null +++ b/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/inc/lang/ro/draft.txt b/inc/lang/ro/draft.txt new file mode 100644 index 0000000..9ed88b6 --- /dev/null +++ b/inc/lang/ro/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/ro/edit.txt b/inc/lang/ro/edit.txt new file mode 100644 index 0000000..cd5aa2e --- /dev/null +++ b/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/inc/lang/ro/editrev.txt b/inc/lang/ro/editrev.txt new file mode 100644 index 0000000..983cd65 --- /dev/null +++ b/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/inc/lang/ro/index.txt b/inc/lang/ro/index.txt new file mode 100644 index 0000000..a0eebb7 --- /dev/null +++ b/inc/lang/ro/index.txt @@ -0,0 +1,3 @@ +====== Index ====== + +Acesta e un index al tuturor paginilor ordonat după [[doku>namespaces|spații de nume]]. diff --git a/inc/lang/ro/install.html b/inc/lang/ro/install.html new file mode 100644 index 0000000..5d97b07 --- /dev/null +++ b/inc/lang/ro/install.html @@ -0,0 +1,7 @@ +

    Această pagină oferă asistență la instalarea pentru prima dată a Dokuwiki. Mai multe informații privind această instalare găsești în pagina de documentație.

    + +

    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 trebuie 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).

    + +

    Acest script de instalare va configura DokuWiki pentru ACL, 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. + +

    Utilizatorii experimentați sau utilizatorii care au nevoie de o configurație specială pot accesa paginile cu instrucțiunile de instalare și opțiunile de configurare a DokuWiki.

    diff --git a/inc/lang/ro/jquery.ui.datepicker.js b/inc/lang/ro/jquery.ui.datepicker.js new file mode 100644 index 0000000..60f56ae --- /dev/null +++ b/inc/lang/ro/jquery.ui.datepicker.js @@ -0,0 +1,43 @@ +/* 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 ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.ro = { + closeText: "Închide", + prevText: "Luna precedentă", + nextText: "Luna următoare ", + 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/inc/lang/ro/lang.php b/inc/lang/ro/lang.php new file mode 100644 index 0000000..4048f13 --- /dev/null +++ b/inc/lang/ro/lang.php @@ -0,0 +1,368 @@ + + * @author Vitalie Ciubotaru + * @author Victor + * @author Marian Banica + * @author Tiberiu Micu + * @author Sergiu Baltariu + * @author Emanuel-Emeric Andrași + * @author Marius OLAR + * @author Adrian Vesa + * @author valentina_prof + */ +$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['searchcreatepage'] = 'Dacă nu găsești ceea ce căuți, poți crea sau modifica pagina %s numită după căutarea ta.'; +$lang['search_fullresults'] = 'Rezultatele textului-complet'; +$lang['js']['search_toggle_tools'] = 'Folosiți instrumentele de căutare'; +$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['search_exact_match'] = 'Potrivire perfecta'; +$lang['search_starts_with'] = 'Începe cu'; +$lang['search_ends_with'] = 'Termină cu'; +$lang['search_contains'] = 'Conţine'; +$lang['search_custom_match'] = 'Personalizat'; +$lang['search_any_ns'] = 'Orice spațiu de nume'; +$lang['search_any_time'] = 'Oricând'; +$lang['search_past_7_days'] = 'Săptămâna trecută'; +$lang['search_past_month'] = 'Luna trecută'; +$lang['search_past_year'] = 'Anul trecut'; +$lang['search_sort_by_hits'] = 'Sortează după popularitate'; +$lang['search_sort_by_mtime'] = 'Sortează după ultima modificare'; +$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 putut 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.
    Aceasta actiune nu poate fi anulata.'; +$lang['profconfdeletemissing'] = 'Căsuța de confirmare nu este bifată'; +$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['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['diffbothprevrev'] = 'Ambele părți revizuirea anterioară'; +$lang['diffbothnextrev'] = 'Ambele părți următoarea reviziune'; +$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 Adobe Flash Plugin 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['sidebar'] = 'Bara de navigare'; +$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 '; +$lang['i_funcna'] = 'Funcția PHP %s nu este disponibilă. Probabil provider-ul tău a dezactivat-o pentru un motiv anume.'; +$lang['i_disabled'] = 'a fost dezactivat de furnizorul tău'; +$lang['i_funcnmail'] = 'Notă: Funcția PHP de email nu este disponibilă %s Daca tot rămâne nedisponibilă, trebuie sa instalezi modulul stmp. '; +$lang['i_phpver'] = 'Versiunea ta de PHP %s este mai veche decât cea necesară (%s). Trebuie să îți actualizezi instalarea PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload trebuie să fie dezactivată în php.ini pentru a rula DokuWiki.'; +$lang['i_urandom'] = 'DokuWiki nu poate sa creeze numere sigure criptografice pentru cookie-uri. Poate doriți să verificați setările open_basedir din php.ini pentru acces /dev/urandom adecvat.'; +$lang['i_permfail'] = '%s nu poate fi scris de către DokuWiki. Trebuie să modifici permisiunile pe acest director.'; +$lang['i_confexists'] = '%s există deja'; +$lang['i_writeerr'] = 'Nu s-a putut crea %s. 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=%s)'; +$lang['i_badval'] = '%s - valoare nepemisă sau neintrodusă'; +$lang['i_success'] = 'Configurarea a fost finalizată cu succes. Acum poți sterge fișierul install.php. Poți accesa noua ta instanță DokuWiki.'; +$lang['i_failure'] = 'Au apărut erori la scrierea fișierelor de configurare. Va trebui să le corectezi manual înainte de a putea folosi noua ta instanță DokuWiki.'; +$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 %s. De asemenea poți vizualiza modificările recente în întregului wiki-ul.'; +$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['media_acl_warning'] = 'Este posibil ca această listă să nu fie completă din cauza restricțiilor ACL și a paginilor ascunse.'; +$lang['email_fail'] = 'PHP mail() lipsește sau este dezactivat. Următorul email nu a fost trimis:'; +$lang['currentns'] = 'Spațiul de nume curent'; +$lang['searchresult'] = 'Rezultatul cautarii'; +$lang['plainhtml'] = 'HTML simplu'; +$lang['page_nonexist_rev'] = 'Pagina nu a existat la %s. Ulterior a fost creat la %s .'; +$lang['unable_to_parse_date'] = 'Imposibil de analizat la parametrul "%s".'; +$lang['email_signature_text'] = 'Acest e-mail a fost generat de DokuWiki la +@DOKUWIKIURL@'; diff --git a/inc/lang/ro/locked.txt b/inc/lang/ro/locked.txt new file mode 100644 index 0000000..c1ca330 --- /dev/null +++ b/inc/lang/ro/locked.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ro/login.txt b/inc/lang/ro/login.txt new file mode 100644 index 0000000..550848e --- /dev/null +++ b/inc/lang/ro/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ro/mailtext.txt b/inc/lang/ro/mailtext.txt new file mode 100644 index 0000000..14a1538 --- /dev/null +++ b/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/inc/lang/ro/newpage.txt b/inc/lang/ro/newpage.txt new file mode 100644 index 0000000..be04806 --- /dev/null +++ b/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/inc/lang/ro/norev.txt b/inc/lang/ro/norev.txt new file mode 100644 index 0000000..b8aee09 --- /dev/null +++ b/inc/lang/ro/norev.txt @@ -0,0 +1,3 @@ +====== Nu există versiunea paginii ====== + +Versiunea indicată nu există. Folosește butonul ''Versiuni anterioare'' pentru o listă a versiunilor acestei pagini. diff --git a/inc/lang/ro/onceexisted.txt b/inc/lang/ro/onceexisted.txt new file mode 100644 index 0000000..d9d71da --- /dev/null +++ b/inc/lang/ro/onceexisted.txt @@ -0,0 +1,3 @@ +======= Această pagină nu mai există ====== + +Ați urmărit un link către o pagină care nu mai există. Puteți verifica lista de **reviziuni vechi** pentru a vedea când și de ce a fost ștearsă, accesați reviziile vechi sau restaurați-o. diff --git a/inc/lang/ro/password.txt b/inc/lang/ro/password.txt new file mode 100644 index 0000000..3f8ae24 --- /dev/null +++ b/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/inc/lang/ro/preview.txt b/inc/lang/ro/preview.txt new file mode 100644 index 0000000..75ff12b --- /dev/null +++ b/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/inc/lang/ro/pwconfirm.txt b/inc/lang/ro/pwconfirm.txt new file mode 100644 index 0000000..d2e1020 --- /dev/null +++ b/inc/lang/ro/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/ro/read.txt b/inc/lang/ro/read.txt new file mode 100644 index 0000000..442188f --- /dev/null +++ b/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/inc/lang/ro/recent.txt b/inc/lang/ro/recent.txt new file mode 100644 index 0000000..4f54095 --- /dev/null +++ b/inc/lang/ro/recent.txt @@ -0,0 +1,3 @@ +====== Modificări recente ====== + +Următoarele pagini au fost modificate recent: diff --git a/inc/lang/ro/register.txt b/inc/lang/ro/register.txt new file mode 100644 index 0000000..1a6ef25 --- /dev/null +++ b/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/inc/lang/ro/registermail.txt b/inc/lang/ro/registermail.txt new file mode 100644 index 0000000..599deab --- /dev/null +++ b/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/inc/lang/ro/resendpwd.txt b/inc/lang/ro/resendpwd.txt new file mode 100644 index 0000000..2d1ef3c --- /dev/null +++ b/inc/lang/ro/resendpwd.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ro/resetpwd.txt b/inc/lang/ro/resetpwd.txt new file mode 100644 index 0000000..9cea53c --- /dev/null +++ b/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/inc/lang/ro/revisions.txt b/inc/lang/ro/revisions.txt new file mode 100644 index 0000000..67e977b --- /dev/null +++ b/inc/lang/ro/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ro/searchpage.txt b/inc/lang/ro/searchpage.txt new file mode 100644 index 0000000..c13a28c --- /dev/null +++ b/inc/lang/ro/searchpage.txt @@ -0,0 +1,3 @@ +====== Căutare ====== + +Rezultatele căutării sunt afișate mai jos. @CREATEPAGEINFO@ diff --git a/inc/lang/ro/showrev.txt b/inc/lang/ro/showrev.txt new file mode 100644 index 0000000..4c76fd4 --- /dev/null +++ b/inc/lang/ro/showrev.txt @@ -0,0 +1,2 @@ +**Aceasta e o versiune anterioară a paginii.** +---- diff --git a/inc/lang/ro/stopwords.txt b/inc/lang/ro/stopwords.txt new file mode 100644 index 0000000..adcd7ef --- /dev/null +++ b/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/inc/lang/ro/subscr_digest.txt b/inc/lang/ro/subscr_digest.txt new file mode 100644 index 0000000..4e661b6 --- /dev/null +++ b/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/inc/lang/ro/subscr_form.txt b/inc/lang/ro/subscr_form.txt new file mode 100644 index 0000000..c198caf --- /dev/null +++ b/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/inc/lang/ro/subscr_list.txt b/inc/lang/ro/subscr_list.txt new file mode 100644 index 0000000..c561478 --- /dev/null +++ b/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/inc/lang/ro/subscr_single.txt b/inc/lang/ro/subscr_single.txt new file mode 100644 index 0000000..6f8b2f9 --- /dev/null +++ b/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/inc/lang/ro/updateprofile.txt b/inc/lang/ro/updateprofile.txt new file mode 100644 index 0000000..f4ce700 --- /dev/null +++ b/inc/lang/ro/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/ro/uploadmail.txt b/inc/lang/ro/uploadmail.txt new file mode 100644 index 0000000..cf8e8e0 --- /dev/null +++ b/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/inc/lang/ru/admin.txt b/inc/lang/ru/admin.txt new file mode 100644 index 0000000..4637126 --- /dev/null +++ b/inc/lang/ru/admin.txt @@ -0,0 +1,3 @@ +====== Управление ====== + +Ниже вы сможете найти список административных операций, доступных в «Докувики». diff --git a/inc/lang/ru/adminplugins.txt b/inc/lang/ru/adminplugins.txt new file mode 100644 index 0000000..6e3fc26 --- /dev/null +++ b/inc/lang/ru/adminplugins.txt @@ -0,0 +1 @@ +===== Дополнительные плагины ===== \ No newline at end of file diff --git a/inc/lang/ru/backlinks.txt b/inc/lang/ru/backlinks.txt new file mode 100644 index 0000000..c4d59a8 --- /dev/null +++ b/inc/lang/ru/backlinks.txt @@ -0,0 +1,3 @@ +====== Обратные ссылки ====== + +Список страниц, ссылающихся на текущую страницу. diff --git a/inc/lang/ru/conflict.txt b/inc/lang/ru/conflict.txt new file mode 100644 index 0000000..fa43cdd --- /dev/null +++ b/inc/lang/ru/conflict.txt @@ -0,0 +1,5 @@ +====== Существует более новая версия ====== + +Существует более новая версия страницы, которую вы редактировали. Такое случается, когда другой пользователь изменил страницу, пока вы делали то же самое. + +Внимательно изучите различия, приведённые ниже, и решите, какую версию оставить. Если вы выберете «Сохранить», то ваша версия будет сохранена. Нажав «Отменить», вы оставите текущую версию. \ No newline at end of file diff --git a/inc/lang/ru/denied.txt b/inc/lang/ru/denied.txt new file mode 100644 index 0000000..2386745 --- /dev/null +++ b/inc/lang/ru/denied.txt @@ -0,0 +1,3 @@ +====== Доступ запрещён ====== + +Извините, у вас не хватает прав для этого действия. diff --git a/inc/lang/ru/diff.txt b/inc/lang/ru/diff.txt new file mode 100644 index 0000000..e91b9db --- /dev/null +++ b/inc/lang/ru/diff.txt @@ -0,0 +1,3 @@ +====== Различия ====== + +Показаны различия между двумя версиями страницы. diff --git a/inc/lang/ru/draft.txt b/inc/lang/ru/draft.txt new file mode 100644 index 0000000..ceeacb4 --- /dev/null +++ b/inc/lang/ru/draft.txt @@ -0,0 +1,5 @@ +====== Найден черновик ====== + +Последний раз редактирование этой страницы не было корректно завершено. Во время вашей работы был автоматически сохранён черновик, который вы теперь можете восстановить и продолжить прерванную правку. Ниже вы видите автоматически сохранённую версию. + +Пожалуйста, решите, хотите ли вы //восстановить// потерянную версию, //удалить// черновик или //отменить// редактирование. diff --git a/inc/lang/ru/edit.txt b/inc/lang/ru/edit.txt new file mode 100644 index 0000000..25ded41 --- /dev/null +++ b/inc/lang/ru/edit.txt @@ -0,0 +1 @@ +Отредактируйте страницу и нажмите «Сохранить». Прочтите [[wiki:syntax|справочную страницу]] для ознакомления с синтаксисом вики. Пожалуйста, редактируйте только в том случае, если планируете **улучшить** содержимое. Если вы просто хотите потестировать что-либо, воспользуйтесь специальной страницей: [[playground:playground]]. diff --git a/inc/lang/ru/editrev.txt b/inc/lang/ru/editrev.txt new file mode 100644 index 0000000..361482a --- /dev/null +++ b/inc/lang/ru/editrev.txt @@ -0,0 +1,2 @@ +**Вы загрузили старую версию документа!** Сохранив её, вы создадите новую текущую версию с этим содержимым. +---- diff --git a/inc/lang/ru/index.txt b/inc/lang/ru/index.txt new file mode 100644 index 0000000..e234f97 --- /dev/null +++ b/inc/lang/ru/index.txt @@ -0,0 +1,3 @@ +====== Карта сайта ====== + +Перед вами список доступных страниц, упорядоченный по [[doku>ru:namespaces|пространствам имён]]. diff --git a/inc/lang/ru/install.html b/inc/lang/ru/install.html new file mode 100644 index 0000000..57fe31c --- /dev/null +++ b/inc/lang/ru/install.html @@ -0,0 +1,7 @@ +

    Эта страница предназначена помочь в первоначальной установке и конфигурации «ДокуВики». Дополнительная информация о программе установки доступна на её странице документации.

    + +

    «ДокуВики» использует обычные файлы для хранения страниц и дополнительной информации (например, изображений, поискового индекса, предыдущих версий страницы, и т. д.). Для успешной работы «ДокуВики» необходим доступ на запись к директориям с этими файлами. Данная программа установки не может самостоятельно изменять системные права доступа к директориям. Обычно это делается напрямую из командной строки (shell), или, если вы используете удалённый хостинг, через FTP или панель управления своего хостинга (например, cPanel).

    + +

    Программа установки включит использование списков контроля доступа (ACL) в вашей «ДокуВики». Это позволит администратору, после авторизации в «ДокуВики», использовать специальное меню для установки плагинов, управления пользователями и доступом к страницам вики, а также для настройки конфигурационных параметров. Списки контроля доступа не обязательны для работы «ДокуВики», однако они позволяют упростить управление вашей «ДокуВики».

    + +

    Опытным пользователям и пользователям со специальными требованиями к установке рекомендуется обратиться по следующим ссылкам для уточнения подробностей процесса установки и параметров конфигурации.

    diff --git a/inc/lang/ru/jquery.ui.datepicker.js b/inc/lang/ru/jquery.ui.datepicker.js new file mode 100644 index 0000000..5a8b3b7 --- /dev/null +++ b/inc/lang/ru/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Russian (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by Andrew Stromnov (stromnov@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.ru = { + 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.ru ); + +return datepicker.regional.ru; + +} ); diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php new file mode 100644 index 0000000..1298252 --- /dev/null +++ b/inc/lang/ru/lang.php @@ -0,0 +1,409 @@ + + * @author Aleksandr Selivanov + * @author Nikita + * @author Анатолий + * @author Yuriy Skalko + * @author Alexander Kh. <001.arx@gmail.com> + * @author Vyacheslav Strenadko + * @author Wolterhon + * @author Zhassulan + * @author Yuri Pimenov + * @author Igor Tarasov + * @author Denis Simakov + * @author Kaens Bard + * @author Andrew Pleshakov + * @author Змей Этерийский + * @author Hikaru Nakajima + * @author Alexei Tereschenko + * @author Irina Ponomareva + * @author Alexander Sorkin + * @author Kirill Krasnov + * @author Vlad Tsybenko + * @author Aleksey Osadchiy + * @author Ladyko Andrey + * @author Eugene + * @author Johnny Utah + * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua) + * @author Pavel + * @author Artur + * @author Erli Moen + * @author Владимир + * @author Igor Degraf + * @author Type-kun + * @author Vitaly Filatenko + * @author Alex P + * @author Nolf + * @author Takumo <9206984@mail.ru> + * @author RainbowSpike <1@2.ru> + * @author dimsharav + * @author Radimir + * @author alexey + */ +$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['js']['data_insecure'] = 'ВНИМАНИЕ: Похоже, ваш каталог данных не защищен должным образом. Пожалуйста, прочитайте о безопасности веб-доступа в DokuWiki. '; +$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'] = 'Я хочу удалить свой аккаунт из этой вики.
    Это действие необратимо.'; +$lang['profconfdeletemissing'] = 'Флажок подтверждения не установлен'; +$lang['proffail'] = 'Профиль пользователя не обновлён.'; +$lang['proftokenlegend'] = 'Токен аутентификации '; +$lang['proftokengenerate'] = 'Сбросить токен '; +$lang['proftokeninfo'] = 'Токен аутентификации можно использовать, чтобы позволить сторонним приложениям входить в систему и действовать от вашего имени. Сброс токена приведет к аннулированию старого и выходу из системы всех приложений, использовавших предыдущий токен. '; +$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['allowedmime'] = 'Список разрешённых расширений файлов'; +$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'] = 'Загрузка файла в текущее пространство имён. Для создания подпространства имён добавьте его название перед именем файла через двоеточие. Поддерживается drag-and-drop (перетащить-и-оставить).'; +$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['unknowndate'] = 'Дата неизвестна'; +$lang['noflash'] = 'Для просмотра этого содержимого требуется Adobe Flash Plugin.'; +$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'] = 'Из соображений безопасности эта программа запускается только на новой, неизменённой установке «Докувики». + Вам нужно либо заново распаковать скачанный пакет установки, либо обратиться к полной + инструкции по установке «Докувики»'; +$lang['i_funcna'] = 'Функция PHP %s недоступна. Может быть, она по какой-то причине заблокирована вашим хостером?'; +$lang['i_disabled'] = 'Отключено вашим провайдером.'; +$lang['i_funcnmail'] = 'Примечание: PHP-функция mail недоступна. %s Если она по прежнему недоступна, вы можете установить плагин SMTP.'; +$lang['i_phpver'] = 'Ваша версия PHP (%s) ниже требуемой (%s). Вам необходимо обновить установленную версию PHP.'; +$lang['i_mbfuncoverload'] = 'Для запуска «Докувики» необходимо отключить параметр mbstring.func_overload в php.ini'; +$lang['i_urandom'] = '«Докувики» не может создавать криптографически безопасные номера для файлов cookie. Возможно, вы захотите проверить настройки open_basedir в php.ini для правильного доступа /dev/urandom.'; +$lang['i_permfail'] = '%s недоступна для записи «Докувики». Вам необходимо исправить системные права доступа для этой директории!'; +$lang['i_confexists'] = '%s уже существует'; +$lang['i_writeerr'] = 'Не удалось создать %s. Вам необходимо проверить системные права доступа к файлу и директориям, и создать файл вручную.'; +$lang['i_badhash'] = 'dokuwiki.php не распознан или изменён (hash=%s)'; +$lang['i_badval'] = '%s — недопустимое или пустое значение'; +$lang['i_success'] = 'Настройка прошла успешно. Теперь вы можете удалить файл install.php. Переходите к + своей новой «Докувики».'; +$lang['i_failure'] = 'При записи в файлы конфигурации были обнаружены ошибки. Возможно, вам придётся исправить их вручную, прежде чем вы сможете использовать свою новую «Докувики».'; +$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'] = 'Вы просматриваете изменения в пространстве имён %s. Вы можете также просмотреть недавние изменения во всей вики.'; +$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['email_fail'] = 'PHP mail() отсутствует или отключен. Следующее письмо не было отправлено: '; +$lang['currentns'] = 'Текущее пространство имён'; +$lang['searchresult'] = 'Результаты поиска'; +$lang['plainhtml'] = 'Простой HTML'; +$lang['wikimarkup'] = 'вики-разметка'; +$lang['page_nonexist_rev'] = 'Эта страница ещё не существовала %s. Она была создана %s.'; +$lang['unable_to_parse_date'] = 'Невозможно обработать параметр "%s".'; +$lang['email_signature_text'] = 'Это письмо создано «Докувики» с сайта +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = 'Файл журнала слишком большой. Предыдущие строки пропущены! '; +$lang['log_file_failed_to_open'] = 'Не удалось открыть файл журнала. '; +$lang['log_file_failed_to_read'] = 'Произошла ошибка при чтении журнала. '; diff --git a/inc/lang/ru/locked.txt b/inc/lang/ru/locked.txt new file mode 100644 index 0000000..3e868ba --- /dev/null +++ b/inc/lang/ru/locked.txt @@ -0,0 +1,3 @@ +====== Страница заблокирована ====== + +Эта страница в данный момент заблокирована для редактирования другим пользователем. Вам придётся подождать, пока этот пользователь закончит редактирование или истечёт время блокировки. diff --git a/inc/lang/ru/login.txt b/inc/lang/ru/login.txt new file mode 100644 index 0000000..1a74ec4 --- /dev/null +++ b/inc/lang/ru/login.txt @@ -0,0 +1,3 @@ +====== Авторизация ====== + +Сейчас вы не в системе. Авторизируйтесь при помощи формы ниже. //Замечание:// для работы у вас должны быть включены куки (cookies). \ No newline at end of file diff --git a/inc/lang/ru/mailtext.txt b/inc/lang/ru/mailtext.txt new file mode 100644 index 0000000..0eb31a1 --- /dev/null +++ b/inc/lang/ru/mailtext.txt @@ -0,0 +1,12 @@ +В вашей вики была добавлена или изменена страница. Подробности: + +Дата: @DATE@ +Браузер: @BROWSER@ +IP-адрес: @IPADDRESS@ +Хост: @HOSTNAME@ +Старая версия: @OLDPAGE@ +Новая версия: @NEWPAGE@ +Сводка изменений: @SUMMARY@ +Пользователь: @USER@ + +@DIFF@ diff --git a/inc/lang/ru/newpage.txt b/inc/lang/ru/newpage.txt new file mode 100644 index 0000000..836c16f --- /dev/null +++ b/inc/lang/ru/newpage.txt @@ -0,0 +1,3 @@ +====== Эта страница ещё не существует ====== + +Вы перешли по ссылке на страницу, которая ещё не существует. Если позволяют ваши права доступа, создайте её, нажав на кнопку **Создать страницу**. \ No newline at end of file diff --git a/inc/lang/ru/norev.txt b/inc/lang/ru/norev.txt new file mode 100644 index 0000000..ef798f8 --- /dev/null +++ b/inc/lang/ru/norev.txt @@ -0,0 +1,3 @@ +====== Такой версии не существует ====== + +Указанная версия страницы не существует. Нажмите на кнопку «История страницы», чтобы получить список доступных предыдущих версий этого документа. \ No newline at end of file diff --git a/inc/lang/ru/onceexisted.txt b/inc/lang/ru/onceexisted.txt new file mode 100644 index 0000000..64ad2dc --- /dev/null +++ b/inc/lang/ru/onceexisted.txt @@ -0,0 +1,3 @@ +======= Данная страница более не существует ====== + +Вы перешли по ссылке на страницу, которая больше не существует. Вы можете проверить **историю её изменений**, чтобы увидеть, когда и почему она была удалена, а также получить доступ к более ранним её версиям или восстановить её. diff --git a/inc/lang/ru/password.txt b/inc/lang/ru/password.txt new file mode 100644 index 0000000..52ed4b5 --- /dev/null +++ b/inc/lang/ru/password.txt @@ -0,0 +1,6 @@ +Здравствуйте, @FULLNAME@. + +Ваши данные для @TITLE@ (@DOKUWIKIURL@) + +Логин: @LOGIN@ +Пароль: @PASSWORD@ diff --git a/inc/lang/ru/preview.txt b/inc/lang/ru/preview.txt new file mode 100644 index 0000000..e66e7e4 --- /dev/null +++ b/inc/lang/ru/preview.txt @@ -0,0 +1,3 @@ +====== Просмотр ====== + +Здесь показано, как ваш текст будет выглядеть. **Внимание: текст ещё не сохранён!** diff --git a/inc/lang/ru/pwconfirm.txt b/inc/lang/ru/pwconfirm.txt new file mode 100644 index 0000000..5108105 --- /dev/null +++ b/inc/lang/ru/pwconfirm.txt @@ -0,0 +1,9 @@ +Здравствуйте, @FULLNAME@. + +Кто-то запросил новый пароль для входа в @TITLE@ по адресу @DOKUWIKIURL@ + +Если вы не запрашивали новый пароль, просто проигнорируйте это письмо. + +Для подтверждения, что запрос был действительно сделан вами, пожалуйста, перейдите по ссылке: + +@CONFIRM@ diff --git a/inc/lang/ru/read.txt b/inc/lang/ru/read.txt new file mode 100644 index 0000000..8adfb7a --- /dev/null +++ b/inc/lang/ru/read.txt @@ -0,0 +1 @@ +Эта страница только для чтения. Вы можете посмотреть её исходный текст, но не можете его изменить. Сообщите администратору, если считаете, что это неправильно. diff --git a/inc/lang/ru/recent.txt b/inc/lang/ru/recent.txt new file mode 100644 index 0000000..ec9bf35 --- /dev/null +++ b/inc/lang/ru/recent.txt @@ -0,0 +1,3 @@ +====== Недавние изменения ====== + +Следующие страницы были недавно изменены: diff --git a/inc/lang/ru/register.txt b/inc/lang/ru/register.txt new file mode 100644 index 0000000..9dde4a8 --- /dev/null +++ b/inc/lang/ru/register.txt @@ -0,0 +1,3 @@ +====== Регистрация нового пользователя ====== + +Для регистрации в вики заполните все поля ниже. Обратите внимание на **правильность адреса электронной почты** — туда будет выслан пароль в том случае, если вас не просят самостоятельно ввести его здесь. Логин должен удовлетворять ограничениям для [[doku>ru:pagename|идентификатора страницы]]. diff --git a/inc/lang/ru/registermail.txt b/inc/lang/ru/registermail.txt new file mode 100644 index 0000000..8e420aa --- /dev/null +++ b/inc/lang/ru/registermail.txt @@ -0,0 +1,10 @@ +Был зарегистрирован новый пользователь. Подробности: + +Логин: @NEWUSER@ +Полное имя: @NEWNAME@ +Эл. адрес: @NEWEMAIL@ + +Дата: @DATE@ +Браузер: @BROWSER@ +Адрес IP: @IPADDRESS@ +Хост: @HOSTNAME@ diff --git a/inc/lang/ru/resendpwd.txt b/inc/lang/ru/resendpwd.txt new file mode 100644 index 0000000..8dbd303 --- /dev/null +++ b/inc/lang/ru/resendpwd.txt @@ -0,0 +1,3 @@ +====== Выслать новый пароль ====== + +Пожалуйста, введите свой логин в форму ниже, чтобы запросить новый пароль для учётной записи в этой вики. Ссылка для подтверждения будет отправлена на адрес электронной почты, указанный при регистрации. \ No newline at end of file diff --git a/inc/lang/ru/resetpwd.txt b/inc/lang/ru/resetpwd.txt new file mode 100644 index 0000000..b7cc95c --- /dev/null +++ b/inc/lang/ru/resetpwd.txt @@ -0,0 +1,3 @@ +====== Установка нового пароля ====== + +Пожалуйста, введите новый пароль для своей учётной записи в этой вики. \ No newline at end of file diff --git a/inc/lang/ru/revisions.txt b/inc/lang/ru/revisions.txt new file mode 100644 index 0000000..3efeb66 --- /dev/null +++ b/inc/lang/ru/revisions.txt @@ -0,0 +1,3 @@ +====== История страницы ====== + +Перед вами список предыдущих версий текущего документа. Чтобы вернуться к одной из предыдущих версий, выберите нужную, нажмите «Править страницу» и сохраните её. diff --git a/inc/lang/ru/searchpage.txt b/inc/lang/ru/searchpage.txt new file mode 100644 index 0000000..925ab42 --- /dev/null +++ b/inc/lang/ru/searchpage.txt @@ -0,0 +1,3 @@ +====== Поиск ====== + +Перед вами результаты поиска. @CREATEPAGEINFO@ diff --git a/inc/lang/ru/showrev.txt b/inc/lang/ru/showrev.txt new file mode 100644 index 0000000..b3f3852 --- /dev/null +++ b/inc/lang/ru/showrev.txt @@ -0,0 +1,2 @@ +**Это старая версия документа!** +---- diff --git a/inc/lang/ru/stopwords.txt b/inc/lang/ru/stopwords.txt new file mode 100644 index 0000000..5bb3acc --- /dev/null +++ b/inc/lang/ru/stopwords.txt @@ -0,0 +1,94 @@ +# Это список слов, которые индексатор игнорирует, по одному слову в строке +# При редактировании этого файла обязательно используйте окончания строк UNIX (только newline) +# Не нужно включать слова короче 3 символов - они игнорируются в любом случае +более +больше +будет +будто +была +было +быть +вдруг +ведь +впрочем +всегда +всех +всего +говорил +говорила +даже +другой +другая +если +есть +жизнь +жизня +зачем +здесь +иногда +кажется +какая +какой +какое +когда +конечно +лучше +между +менее +меньше +меня +много +может +можно +надо +наконец +него +нельзя +нибудь +никогда +ничего +нужно +один +одна +опять +перед +после +потом +потому +почти +разве +свое +своё +свой +свою +своя +себе +себя +сегодня +сейчас +сказал +сказала +сказать +совсем +такая +такое +такой +тебя +теперь +тогда +того +тоже +только +тому +хорошо +хоть +чего +через +чтоб +чтобы +чуть +этого +этой +этим +этот +www diff --git a/inc/lang/ru/subscr_digest.txt b/inc/lang/ru/subscr_digest.txt new file mode 100644 index 0000000..afc34ef --- /dev/null +++ b/inc/lang/ru/subscr_digest.txt @@ -0,0 +1,15 @@ +Привет! + +Страница @PAGE@ в вики @TITLE@ изменилась. +Список изменений: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Старая версия: @OLDPAGE@ +Новая версия: @NEWPAGE@ + +Чтобы отписаться от уведомлений об изменениях, войдите в вики +@DOKUWIKIURL@ в раздел @SUBSCRIBE@ +и отмените подписку на страницу и/или пространство имён. diff --git a/inc/lang/ru/subscr_form.txt b/inc/lang/ru/subscr_form.txt new file mode 100644 index 0000000..2a775c5 --- /dev/null +++ b/inc/lang/ru/subscr_form.txt @@ -0,0 +1,3 @@ +====== Управление подписками ====== + +Здесь вы можете управлять подписками для текущей страницы и пространства имён. \ No newline at end of file diff --git a/inc/lang/ru/subscr_list.txt b/inc/lang/ru/subscr_list.txt new file mode 100644 index 0000000..cf3ef5d --- /dev/null +++ b/inc/lang/ru/subscr_list.txt @@ -0,0 +1,13 @@ +Привет! + +Страницы в пространстве имён @PAGE@ в вики @TITLE@ были изменены. + +Список изменившихся страниц: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Чтобы отписаться от уведомлений об изменениях, войдите в вики +@DOKUWIKIURL@ в раздел @SUBSCRIBE@ +и отмените подписку на страницу и/или пространство имён. diff --git a/inc/lang/ru/subscr_single.txt b/inc/lang/ru/subscr_single.txt new file mode 100644 index 0000000..9b7d907 --- /dev/null +++ b/inc/lang/ru/subscr_single.txt @@ -0,0 +1,19 @@ +Привет! + +Страница @PAGE@ в вики @TITLE@ изменилась. +Список изменений: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Дата: @DATE@ +Автор: @USER@ + +Примечание: @SUMMARY@ +Старая версия: @OLDPAGE@ +Новая версия: @NEWPAGE@ + +Чтобы отписаться от уведомлений об изменениях, войдите в вики +@DOKUWIKIURL@ в раздел @SUBSCRIBE@ +и отмените подписку на страницу и/или пространство имён. diff --git a/inc/lang/ru/updateprofile.txt b/inc/lang/ru/updateprofile.txt new file mode 100644 index 0000000..ce411ee --- /dev/null +++ b/inc/lang/ru/updateprofile.txt @@ -0,0 +1,3 @@ +====== Обновить профиль ====== + +Необходимо заполнить только те поля, которые вы хотите изменить. Ваш логин не может быть изменён. diff --git a/inc/lang/ru/uploadmail.txt b/inc/lang/ru/uploadmail.txt new file mode 100644 index 0000000..7c342a7 --- /dev/null +++ b/inc/lang/ru/uploadmail.txt @@ -0,0 +1,11 @@ +В вашу вики был загружен файл. Подробная информация: + +Файл: @MEDIA@ +Старая версия: @OLD@ +Дата: @DATE@ +Браузер: @BROWSER@ +Адрес IP: @IPADDRESS@ +Хост: @HOSTNAME@ +Размер: @SIZE@ +Тип MIME: @MIME@ +Пользователь: @USER@ diff --git a/inc/lang/si/admin.txt b/inc/lang/si/admin.txt new file mode 100644 index 0000000..ded2680 --- /dev/null +++ b/inc/lang/si/admin.txt @@ -0,0 +1,3 @@ +====== පරිපාලනය ====== + +ඩොකුවිකි (DokuWiki) තුල පවතින පරිපාලන කාර්යයන් ලැයිස්තුවක් පහත දැකගත හැකිය. \ No newline at end of file diff --git a/inc/lang/si/adminplugins.txt b/inc/lang/si/adminplugins.txt new file mode 100644 index 0000000..5a95037 --- /dev/null +++ b/inc/lang/si/adminplugins.txt @@ -0,0 +1 @@ +===== අමතර යෙදවුම් ===== \ No newline at end of file diff --git a/inc/lang/si/backlinks.txt b/inc/lang/si/backlinks.txt new file mode 100644 index 0000000..03c3bb4 --- /dev/null +++ b/inc/lang/si/backlinks.txt @@ -0,0 +1,3 @@ +====== බාහිර සබැදුම් ====== + +මෙම පිටුවට සම්බන්ධව ඇති බාහිර සබැදුම් ලැයිස්තුවක් මෙහි දක්වා ඇත. \ No newline at end of file diff --git a/inc/lang/si/conflict.txt b/inc/lang/si/conflict.txt new file mode 100644 index 0000000..ec1b516 --- /dev/null +++ b/inc/lang/si/conflict.txt @@ -0,0 +1,2 @@ +====== නව සංස්කරණයක් පවතී ====== + diff --git a/inc/lang/si/denied.txt b/inc/lang/si/denied.txt new file mode 100644 index 0000000..fb92978 --- /dev/null +++ b/inc/lang/si/denied.txt @@ -0,0 +1 @@ +====== ඉදිරියට යාමට අවසරයක් නොමැත ====== \ No newline at end of file diff --git a/inc/lang/si/diff.txt b/inc/lang/si/diff.txt new file mode 100644 index 0000000..99a9395 --- /dev/null +++ b/inc/lang/si/diff.txt @@ -0,0 +1 @@ +====== වෙනස්කම් ====== \ No newline at end of file diff --git a/inc/lang/si/draft.txt b/inc/lang/si/draft.txt new file mode 100644 index 0000000..635974a --- /dev/null +++ b/inc/lang/si/draft.txt @@ -0,0 +1 @@ +====== Draft file found ====== \ No newline at end of file diff --git a/inc/lang/si/index.txt b/inc/lang/si/index.txt new file mode 100644 index 0000000..c6d0975 --- /dev/null +++ b/inc/lang/si/index.txt @@ -0,0 +1 @@ +වෙබ්අඩවියේ පෙළගැස්ම \ No newline at end of file diff --git a/inc/lang/si/lang.php b/inc/lang/si/lang.php new file mode 100644 index 0000000..8e184b6 --- /dev/null +++ b/inc/lang/si/lang.php @@ -0,0 +1,27 @@ + + */ +$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'] = 'උඩුගතකිරීම'; diff --git a/inc/lang/sk/admin.txt b/inc/lang/sk/admin.txt new file mode 100644 index 0000000..3d0ab58 --- /dev/null +++ b/inc/lang/sk/admin.txt @@ -0,0 +1,3 @@ +====== Administrácia ====== + +Nižšie môžete nájsť zoznam administratívnych úloh dostupných v DokuWiki. diff --git a/inc/lang/sk/adminplugins.txt b/inc/lang/sk/adminplugins.txt new file mode 100644 index 0000000..64d2ca7 --- /dev/null +++ b/inc/lang/sk/adminplugins.txt @@ -0,0 +1 @@ +===== Ďalšie pluginy ===== \ No newline at end of file diff --git a/inc/lang/sk/backlinks.txt b/inc/lang/sk/backlinks.txt new file mode 100644 index 0000000..b3217d5 --- /dev/null +++ b/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/inc/lang/sk/conflict.txt b/inc/lang/sk/conflict.txt new file mode 100644 index 0000000..5dab2db --- /dev/null +++ b/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/inc/lang/sk/denied.txt b/inc/lang/sk/denied.txt new file mode 100644 index 0000000..56c7b96 --- /dev/null +++ b/inc/lang/sk/denied.txt @@ -0,0 +1,3 @@ +====== Nepovolená akcia ====== + +Prepáčte, ale nemáte dostatočné oprávnenie k tejto činnosti. diff --git a/inc/lang/sk/diff.txt b/inc/lang/sk/diff.txt new file mode 100644 index 0000000..1b4495a --- /dev/null +++ b/inc/lang/sk/diff.txt @@ -0,0 +1,3 @@ +====== Rozdiely ====== + +Tu môžete vidieť rozdiely medzi vybranou verziou a aktuálnou verziou danej stránky. diff --git a/inc/lang/sk/draft.txt b/inc/lang/sk/draft.txt new file mode 100644 index 0000000..f648c35 --- /dev/null +++ b/inc/lang/sk/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/sk/edit.txt b/inc/lang/sk/edit.txt new file mode 100644 index 0000000..b8d63fb --- /dev/null +++ b/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/inc/lang/sk/editrev.txt b/inc/lang/sk/editrev.txt new file mode 100644 index 0000000..35c62b1 --- /dev/null +++ b/inc/lang/sk/editrev.txt @@ -0,0 +1,2 @@ +**Máte načítanú staršiu verziu dokumentu!** Pokiaľ ju uložíte, vytvoríte tým novú aktuálnu verziu. +---- diff --git a/inc/lang/sk/index.txt b/inc/lang/sk/index.txt new file mode 100644 index 0000000..b4189f2 --- /dev/null +++ b/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/inc/lang/sk/install.html b/inc/lang/sk/install.html new file mode 100644 index 0000000..3b93ab8 --- /dev/null +++ b/inc/lang/sk/install.html @@ -0,0 +1,7 @@ +

    Táto stránka sprevádza prvou inštaláciou a konfiguráciou Dokuwiki. Viac informácií o tomto inštalátore je dostupných na jeho dokumentačnej stránke.

    + +

    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, musí 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.

    + +

    Tento inštalátor nastaví ACL 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.

    + +

    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 inštalačných pokynov a konfiguračných nastavení.

    diff --git a/inc/lang/sk/jquery.ui.datepicker.js b/inc/lang/sk/jquery.ui.datepicker.js new file mode 100644 index 0000000..826dfcb --- /dev/null +++ b/inc/lang/sk/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Slovak initialisation for the jQuery UI date picker plugin. */ +/* Written by Vojtech Rinik (vojto@hmm.sk). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.sk = { + closeText: "Zavrieť", + prevText: "Predchádzajúci", + nextText: "Nasledujúci", + 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/inc/lang/sk/lang.php b/inc/lang/sk/lang.php new file mode 100644 index 0000000..39af572 --- /dev/null +++ b/inc/lang/sk/lang.php @@ -0,0 +1,367 @@ + + * @author Peter Mydliar + * @author Ondrej Vegh with help of the scholars from Zdruzena stredna skola polygraficka in Bratislava + * @author Michal Mesko + * @author exusik + * @author Tibor Repček + */ +$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['searchcreatepage'] = 'Ak ste nenašli, čo ste hľadali, môžete vytvoriť alebo upraviť stránku %s pomenovanú podľa vášho dopytu.'; +$lang['search_fullresults'] = 'Fulltextové výsledky'; +$lang['js']['search_toggle_tools'] = 'Zobraziť/Skryť vyhľadávacie nástroje'; +$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.\nAj 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['search_exact_match'] = 'Presná zhoda'; +$lang['search_starts_with'] = 'Začína na'; +$lang['search_ends_with'] = 'Končí na'; +$lang['search_contains'] = 'Obsahuje'; +$lang['search_custom_match'] = 'Vlastný'; +$lang['search_any_ns'] = 'Akýkoľvek menný priestor'; +$lang['search_any_time'] = 'Kedykoľvek'; +$lang['search_past_7_days'] = 'Posledný týždeň'; +$lang['search_past_month'] = 'Posledný mesiac'; +$lang['search_past_year'] = 'Posledný rok'; +$lang['search_sort_by_hits'] = 'Zoradiť podľa počtu návštev'; +$lang['search_sort_by_mtime'] = 'Zoradiť podľa posledných úprav'; +$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.
    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['allowedmime'] = 'Zoznam povolených prípon súborov'; +$lang['lockedby'] = 'Práve zamknuté:'; +$lang['lockexpire'] = 'Zámok stratí platnosť:'; +$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['diffbothprevrev'] = 'Obojstranná predošlá revízia'; +$lang['diffbothnextrev'] = 'Obojstranná nasledujúca revízia'; +$lang['line'] = 'Riadok'; +$lang['breadcrumb'] = 'Cesta:'; +$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 Adobe Flash Plugin.'; +$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ť inštalačné inštrukcie Dokuwiki'; +$lang['i_funcna'] = 'PHP funkcia %s nie je dostupná. Je možné, že ju z určitých dôvodov zablokoval váš poskytovateľ webhostingu?'; +$lang['i_funcnmail'] = 'Note: PHP mail funkcia nie je dostupná. %s Ak zostáva stále nedostupná, možno by ste mohli nainštalovať smtp plugin.'; +$lang['i_phpver'] = 'Vaša verzia PHP %s je nižšia ako požadovaná %s. 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'] = '%s nie je zapisovateľný pre DokuWiki. Musíte zmeniť prístupové práva pre tento adresár!'; +$lang['i_confexists'] = '%s už existuje'; +$lang['i_writeerr'] = 'Nie je možné vytvoriť %s. 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=%s)'; +$lang['i_badval'] = '%s - 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 vašej novej DokuWiki.'; +$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ť vašu novú DokuWiki.'; +$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 %s. Môžete si tiež pozrieť aktuálne zmeny celej wiki.'; +$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['email_fail'] = 'PHP funkcia mail() chýba alebo nie je povolená. Nasledujúci mail nebol poslaný:'; +$lang['currentns'] = 'Aktuálny menný priestor'; +$lang['searchresult'] = 'Výsledky hľadania'; +$lang['plainhtml'] = 'Jednoduché HTML'; +$lang['wikimarkup'] = 'Wiki formát'; +$lang['page_nonexist_rev'] = 'Stránka %s neexistovala. Bola vytvorená dodatočne %s.'; +$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/inc/lang/sk/locked.txt b/inc/lang/sk/locked.txt new file mode 100644 index 0000000..fae400b --- /dev/null +++ b/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/inc/lang/sk/login.txt b/inc/lang/sk/login.txt new file mode 100644 index 0000000..3bfc910 --- /dev/null +++ b/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/inc/lang/sk/mailtext.txt b/inc/lang/sk/mailtext.txt new file mode 100644 index 0000000..da2f441 --- /dev/null +++ b/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/inc/lang/sk/mailwrap.html b/inc/lang/sk/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/sk/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/sk/newpage.txt b/inc/lang/sk/newpage.txt new file mode 100644 index 0000000..e4f654c --- /dev/null +++ b/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/inc/lang/sk/norev.txt b/inc/lang/sk/norev.txt new file mode 100644 index 0000000..f664ae4 --- /dev/null +++ b/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/inc/lang/sk/onceexisted.txt b/inc/lang/sk/onceexisted.txt new file mode 100644 index 0000000..b2f2294 --- /dev/null +++ b/inc/lang/sk/onceexisted.txt @@ -0,0 +1,3 @@ +======= Táto stránka už neexistuje ====== + +Klikli ste na odkaz k stránke, ktorá už neexistuje. Môžete skontrolovať zoznam **predošlých revízií** a zistíte, kedy a prečo bola stránka zmazaná. Tiež získate prístup k predošlým revíziám a môžete ich obnoviť. diff --git a/inc/lang/sk/password.txt b/inc/lang/sk/password.txt new file mode 100644 index 0000000..8d0907e --- /dev/null +++ b/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/inc/lang/sk/preview.txt b/inc/lang/sk/preview.txt new file mode 100644 index 0000000..446f802 --- /dev/null +++ b/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/inc/lang/sk/pwconfirm.txt b/inc/lang/sk/pwconfirm.txt new file mode 100644 index 0000000..ee0178d --- /dev/null +++ b/inc/lang/sk/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/sk/read.txt b/inc/lang/sk/read.txt new file mode 100644 index 0000000..72fc096 --- /dev/null +++ b/inc/lang/sk/read.txt @@ -0,0 +1 @@ +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/inc/lang/sk/recent.txt b/inc/lang/sk/recent.txt new file mode 100644 index 0000000..3f5b753 --- /dev/null +++ b/inc/lang/sk/recent.txt @@ -0,0 +1,3 @@ +====== Posledné úpravy ====== + +Nasledujúce stránky boli nedávno zmenené: diff --git a/inc/lang/sk/register.txt b/inc/lang/sk/register.txt new file mode 100644 index 0000000..b939dcc --- /dev/null +++ b/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/inc/lang/sk/registermail.txt b/inc/lang/sk/registermail.txt new file mode 100644 index 0000000..2be1ac3 --- /dev/null +++ b/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/inc/lang/sk/resendpwd.txt b/inc/lang/sk/resendpwd.txt new file mode 100644 index 0000000..d8d37cd --- /dev/null +++ b/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. diff --git a/inc/lang/sk/resetpwd.txt b/inc/lang/sk/resetpwd.txt new file mode 100644 index 0000000..a4df4a5 --- /dev/null +++ b/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/inc/lang/sk/revisions.txt b/inc/lang/sk/revisions.txt new file mode 100644 index 0000000..ad99e72 --- /dev/null +++ b/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/inc/lang/sk/searchpage.txt b/inc/lang/sk/searchpage.txt new file mode 100644 index 0000000..1f6d4fc --- /dev/null +++ b/inc/lang/sk/searchpage.txt @@ -0,0 +1,3 @@ +====== Vyhľadávanie ====== + +Výsledky hľadania môžete vidieť nižšie. @CREATEPAGEINFO@ diff --git a/inc/lang/sk/showrev.txt b/inc/lang/sk/showrev.txt new file mode 100644 index 0000000..b694c23 --- /dev/null +++ b/inc/lang/sk/showrev.txt @@ -0,0 +1,2 @@ +**Toto je staršia verzia dokumentu!** +---- diff --git a/inc/lang/sk/stopwords.txt b/inc/lang/sk/stopwords.txt new file mode 100644 index 0000000..fa78362 --- /dev/null +++ b/inc/lang/sk/stopwords.txt @@ -0,0 +1,26 @@ +#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/inc/lang/sk/subscr_digest.txt b/inc/lang/sk/subscr_digest.txt new file mode 100644 index 0000000..6d336cb --- /dev/null +++ b/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/inc/lang/sk/subscr_form.txt b/inc/lang/sk/subscr_form.txt new file mode 100644 index 0000000..1f12e9a --- /dev/null +++ b/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/inc/lang/sk/subscr_list.txt b/inc/lang/sk/subscr_list.txt new file mode 100644 index 0000000..7332e77 --- /dev/null +++ b/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/inc/lang/sk/subscr_single.txt b/inc/lang/sk/subscr_single.txt new file mode 100644 index 0000000..48825a4 --- /dev/null +++ b/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/inc/lang/sk/updateprofile.txt b/inc/lang/sk/updateprofile.txt new file mode 100644 index 0000000..19ada24 --- /dev/null +++ b/inc/lang/sk/updateprofile.txt @@ -0,0 +1,3 @@ +====== Zmena vášho používateľského profilu ====== + +Potrebujete vyplniť len tie polia, ktoré chcete zmeniť. Nemôžete zmeniť prihlasovacie meno. diff --git a/inc/lang/sk/uploadmail.txt b/inc/lang/sk/uploadmail.txt new file mode 100644 index 0000000..df40967 --- /dev/null +++ b/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/inc/lang/sl/admin.txt b/inc/lang/sl/admin.txt new file mode 100644 index 0000000..cee19de --- /dev/null +++ b/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/inc/lang/sl/adminplugins.txt b/inc/lang/sl/adminplugins.txt new file mode 100644 index 0000000..899c854 --- /dev/null +++ b/inc/lang/sl/adminplugins.txt @@ -0,0 +1 @@ +===== Dodatni vstavki ===== \ No newline at end of file diff --git a/inc/lang/sl/backlinks.txt b/inc/lang/sl/backlinks.txt new file mode 100644 index 0000000..5e4d8ff --- /dev/null +++ b/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/inc/lang/sl/conflict.txt b/inc/lang/sl/conflict.txt new file mode 100644 index 0000000..ec5b370 --- /dev/null +++ b/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/inc/lang/sl/denied.txt b/inc/lang/sl/denied.txt new file mode 100644 index 0000000..10783e5 --- /dev/null +++ b/inc/lang/sl/denied.txt @@ -0,0 +1,3 @@ +====== Ni ustreznih dovoljenj ====== + +Za nadaljevanje opravila je treba imeti ustrezna dovoljenja. diff --git a/inc/lang/sl/diff.txt b/inc/lang/sl/diff.txt new file mode 100644 index 0000000..5cb2e3a --- /dev/null +++ b/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/inc/lang/sl/draft.txt b/inc/lang/sl/draft.txt new file mode 100644 index 0000000..72d449d --- /dev/null +++ b/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. diff --git a/inc/lang/sl/edit.txt b/inc/lang/sl/edit.txt new file mode 100644 index 0000000..71d5fb0 --- /dev/null +++ b/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/inc/lang/sl/editrev.txt b/inc/lang/sl/editrev.txt new file mode 100644 index 0000000..cf348fa --- /dev/null +++ b/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. +---- diff --git a/inc/lang/sl/index.txt b/inc/lang/sl/index.txt new file mode 100644 index 0000000..4da7b80 --- /dev/null +++ b/inc/lang/sl/index.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/sl/install.html b/inc/lang/sl/install.html new file mode 100644 index 0000000..7c2be7f --- /dev/null +++ b/inc/lang/sl/install.html @@ -0,0 +1,7 @@ +

    Stran je namenjena pomoči pri prvi namestitvi in nastavitvi spletišča Dokuwiki. Več podrobnosti o tem je mogoče najti na straneh dokumentacije namestitve.

    + +

    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 mora 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).

    + +

    Z namestilnikom lahko spremenite nastavitve dostopa sistema Dokuwiki ACL, 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.

    + +

    Zahtevnejši uporabniki ali skrbniki s posebnimi zahtevami namestitve sistema si lahko več podrobnosti ogledajo na straneh navodil namestitve in nastavitve.

    diff --git a/inc/lang/sl/jquery.ui.datepicker.js b/inc/lang/sl/jquery.ui.datepicker.js new file mode 100644 index 0000000..4b329e2 --- /dev/null +++ b/inc/lang/sl/jquery.ui.datepicker.js @@ -0,0 +1,41 @@ +/* Slovenian initialisation for the jQuery UI date picker plugin. */ +/* Written by Jaka Jancar (jaka@kubje.org). */ +/* c = č, s = š z = ž C = Č S = Š Z = Ž */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.sl = { + closeText: "Zapri", + prevText: "Prejšnji", + nextText: "Naslednji", + 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/inc/lang/sl/lang.php b/inc/lang/sl/lang.php new file mode 100644 index 0000000..87b3724 --- /dev/null +++ b/inc/lang/sl/lang.php @@ -0,0 +1,336 @@ + + * @author Simon + * @author Jaka Kranjc + * @author Boštjan Seničar + * @author Dejan Levec + * @author Gregor Skumavc (grega.skumavc@gmail.com) + * @author Matej Urbančič (mateju@svn.gnome.org) + * @author Matej Urbančič + * @author Jernej Vidmar + */ +$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['searchcreatepage'] = 'Če nisi našel tega kar iščeš, lahko ustvariš ali urediš stran %s, ki bo poimenovana po vašem iskalnem pojmu.'; +$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['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['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 Adobe Flash Plugin'; +$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 navodil nameščanja Dokuwiki.'; +$lang['i_funcna'] = 'Funkcija PHP %s ni na voljo. Morda je možnost na strežniku zaradi varnostnih razlogov onemogočena.'; +$lang['i_phpver'] = 'Različica PHP %s je nižja od zahtevane različice %s. Pred nadaljevanjem je treba posodobiti namestitev PHP.'; +$lang['i_permfail'] = 'Predmet %s ni zapisljiv. Zahtevana je sprememba dovoljenj za to mapo.'; +$lang['i_confexists'] = 'Predmet %s že obstaja.'; +$lang['i_writeerr'] = 'Ni mogoče ustvariti predmeta %s. Preveriti je treba dovoljenja datotek in map in nato ustvariti datoteko ročno.'; +$lang['i_badhash'] = 'nepoznana ali spremenjena datoteka dokuwiki.php (razpršilo=%s)'; +$lang['i_badval'] = '%s - neveljavna ali prazna vrednost'; +$lang['i_success'] = 'Nastavitev je uspešno končana. Datoteko install.php lahko sedaj izbrišete. Nadaljujte v novi DokuWiki.'; +$lang['i_failure'] = 'Med zapisovanjem nastavitvenih datotek je prišlo do napak. Preden lahko uporabite vaš DokuWiki, 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 %s. Mogoče si je ogledati tudi spremembe celotnega sistema Wiki.'; +$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/inc/lang/sl/locked.txt b/inc/lang/sl/locked.txt new file mode 100644 index 0000000..cc693d3 --- /dev/null +++ b/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/inc/lang/sl/login.txt b/inc/lang/sl/login.txt new file mode 100644 index 0000000..eeae0c9 --- /dev/null +++ b/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/inc/lang/sl/mailtext.txt b/inc/lang/sl/mailtext.txt new file mode 100644 index 0000000..9b33373 --- /dev/null +++ b/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/inc/lang/sl/newpage.txt b/inc/lang/sl/newpage.txt new file mode 100644 index 0000000..8c63042 --- /dev/null +++ b/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/inc/lang/sl/norev.txt b/inc/lang/sl/norev.txt new file mode 100644 index 0000000..adaa22d --- /dev/null +++ b/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/inc/lang/sl/password.txt b/inc/lang/sl/password.txt new file mode 100644 index 0000000..d0e1f69 --- /dev/null +++ b/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/inc/lang/sl/preview.txt b/inc/lang/sl/preview.txt new file mode 100644 index 0000000..ab8e5f7 --- /dev/null +++ b/inc/lang/sl/preview.txt @@ -0,0 +1,3 @@ +====== Predogled ====== + +Prikazan je predogled strani. **Stran še ni shranjena**! diff --git a/inc/lang/sl/pwconfirm.txt b/inc/lang/sl/pwconfirm.txt new file mode 100644 index 0000000..109acb5 --- /dev/null +++ b/inc/lang/sl/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/sl/read.txt b/inc/lang/sl/read.txt new file mode 100644 index 0000000..44f3162 --- /dev/null +++ b/inc/lang/sl/read.txt @@ -0,0 +1 @@ +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/inc/lang/sl/recent.txt b/inc/lang/sl/recent.txt new file mode 100644 index 0000000..ee903a8 --- /dev/null +++ b/inc/lang/sl/recent.txt @@ -0,0 +1,3 @@ +====== Nedavne spremembe ====== + +Izpisane wiki strani so bile nedavno spremenjene: diff --git a/inc/lang/sl/register.txt b/inc/lang/sl/register.txt new file mode 100644 index 0000000..f1b22f9 --- /dev/null +++ b/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/inc/lang/sl/registermail.txt b/inc/lang/sl/registermail.txt new file mode 100644 index 0000000..255eb62 --- /dev/null +++ b/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/inc/lang/sl/resendpwd.txt b/inc/lang/sl/resendpwd.txt new file mode 100644 index 0000000..8a1e614 --- /dev/null +++ b/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/inc/lang/sl/resetpwd.txt b/inc/lang/sl/resetpwd.txt new file mode 100644 index 0000000..8711027 --- /dev/null +++ b/inc/lang/sl/resetpwd.txt @@ -0,0 +1,3 @@ +====== Nastavitev novega gesla ====== + +Vnesite novo geslo za račun Wiki. diff --git a/inc/lang/sl/revisions.txt b/inc/lang/sl/revisions.txt new file mode 100644 index 0000000..86ede9d --- /dev/null +++ b/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/inc/lang/sl/searchpage.txt b/inc/lang/sl/searchpage.txt new file mode 100644 index 0000000..f47f765 --- /dev/null +++ b/inc/lang/sl/searchpage.txt @@ -0,0 +1,3 @@ +====== Iskanje ====== + +Spodaj so izpisani rezultati iskanja. @CREATEPAGEINFO@ diff --git a/inc/lang/sl/showrev.txt b/inc/lang/sl/showrev.txt new file mode 100644 index 0000000..8383392 --- /dev/null +++ b/inc/lang/sl/showrev.txt @@ -0,0 +1,2 @@ +**Stara različica tega dokumenta!** +---- diff --git a/inc/lang/sl/stopwords.txt b/inc/lang/sl/stopwords.txt new file mode 100644 index 0000000..31f2791 --- /dev/null +++ b/inc/lang/sl/stopwords.txt @@ -0,0 +1,19 @@ +# 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 +www diff --git a/inc/lang/sl/subscr_digest.txt b/inc/lang/sl/subscr_digest.txt new file mode 100644 index 0000000..5da0042 --- /dev/null +++ b/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/inc/lang/sl/subscr_form.txt b/inc/lang/sl/subscr_form.txt new file mode 100644 index 0000000..46be8c9 --- /dev/null +++ b/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/inc/lang/sl/subscr_list.txt b/inc/lang/sl/subscr_list.txt new file mode 100644 index 0000000..914ae15 --- /dev/null +++ b/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/inc/lang/sl/subscr_single.txt b/inc/lang/sl/subscr_single.txt new file mode 100644 index 0000000..4324b2d --- /dev/null +++ b/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/inc/lang/sl/updateprofile.txt b/inc/lang/sl/updateprofile.txt new file mode 100644 index 0000000..18b9d25 --- /dev/null +++ b/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. diff --git a/inc/lang/sl/uploadmail.txt b/inc/lang/sl/uploadmail.txt new file mode 100644 index 0000000..126ff2a --- /dev/null +++ b/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/inc/lang/sq/admin.txt b/inc/lang/sq/admin.txt new file mode 100644 index 0000000..fc12524 --- /dev/null +++ b/inc/lang/sq/admin.txt @@ -0,0 +1,3 @@ +====== Administrimi ====== + +Poshtë është një listë e punëve administrative të disponueshme në DokuWiki. diff --git a/inc/lang/sq/adminplugins.txt b/inc/lang/sq/adminplugins.txt new file mode 100644 index 0000000..f87626c --- /dev/null +++ b/inc/lang/sq/adminplugins.txt @@ -0,0 +1 @@ +===== Plugin-e Shtesë ===== \ No newline at end of file diff --git a/inc/lang/sq/backlinks.txt b/inc/lang/sq/backlinks.txt new file mode 100644 index 0000000..70035ae --- /dev/null +++ b/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. diff --git a/inc/lang/sq/conflict.txt b/inc/lang/sq/conflict.txt new file mode 100644 index 0000000..4edf814 --- /dev/null +++ b/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. diff --git a/inc/lang/sq/denied.txt b/inc/lang/sq/denied.txt new file mode 100644 index 0000000..25de508 --- /dev/null +++ b/inc/lang/sq/denied.txt @@ -0,0 +1,3 @@ +====== Leja Refuzohet ====== + +Na vjen keq, ju nuk keni të drejta të mjaftueshme për të vazhduar. diff --git a/inc/lang/sq/diff.txt b/inc/lang/sq/diff.txt new file mode 100644 index 0000000..d68c984 --- /dev/null +++ b/inc/lang/sq/diff.txt @@ -0,0 +1,3 @@ +====== Ndryshimet ====== + +Kjo tregon ndryshimet midis dy versioneve të faqes. diff --git a/inc/lang/sq/draft.txt b/inc/lang/sq/draft.txt new file mode 100644 index 0000000..13b4256 --- /dev/null +++ b/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. diff --git a/inc/lang/sq/edit.txt b/inc/lang/sq/edit.txt new file mode 100644 index 0000000..d48c354 --- /dev/null +++ b/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]]. diff --git a/inc/lang/sq/editrev.txt b/inc/lang/sq/editrev.txt new file mode 100644 index 0000000..941be39 --- /dev/null +++ b/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. +---- diff --git a/inc/lang/sq/index.txt b/inc/lang/sq/index.txt new file mode 100644 index 0000000..f17dca9 --- /dev/null +++ b/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]]. diff --git a/inc/lang/sq/install.html b/inc/lang/sq/install.html new file mode 100644 index 0000000..1454628 --- /dev/null +++ b/inc/lang/sq/install.html @@ -0,0 +1,7 @@ +

    Kjo faqe ndihmon në instalimin dhe konfigurimin për herë të parë të Dokuwiki-t. Më shumë informacion mbi këtë installer gjendet në faqen e tij të dokumentimit.

    + +

    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 duhet 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).

    + +

    Ky installer do të instalojë konfigurimin e DokuWiki-t tuaj për ACL, 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ë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 instruksionet e instalimit dhe konfigurimeve.

    diff --git a/inc/lang/sq/jquery.ui.datepicker.js b/inc/lang/sq/jquery.ui.datepicker.js new file mode 100644 index 0000000..9952fb1 --- /dev/null +++ b/inc/lang/sq/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Albanian initialisation for the jQuery UI date picker plugin. */ +/* Written by Flakron Bytyqi (flakron@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.sq = { + closeText: "mbylle", + prevText: "mbrapa", + nextText: "Përpara", + 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/inc/lang/sq/lang.php b/inc/lang/sq/lang.php new file mode 100644 index 0000000..08fb1ea --- /dev/null +++ b/inc/lang/sq/lang.php @@ -0,0 +1,259 @@ + + * @author Endrit Callaki + * @author Leonard Elezi + */ +$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_resendpwd'] = 'Vendos fjalëkalim të ri'; +$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['btn_apply'] = 'Dergo'; +$lang['btn_media'] = 'Menaxhimi i mediave'; +$lang['btn_deleteuser'] = 'Fshij llogarine'; +$lang['btn_img_backto'] = 'Mbrapa te %s'; +$lang['btn_mediaManager'] = 'Shiko tek menaxhimi i mediave'; +$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['badpassconfirm'] = 'Me fal, fjalekalimi ishte i gabuar'; +$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['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['js']['searchmedia'] = 'Kërko për skedarë'; +$lang['js']['keepopen'] = 'Mbaje dritaren të hapur gjatë përzgjedhjes'; +$lang['js']['hidedetails'] = 'Fshih Detajet'; +$lang['js']['mediadisplay'] = 'Lloji i lidhjes'; +$lang['js']['mediaclose'] = 'Mbylle'; +$lang['js']['mediadisplayimg'] = 'Shiko foton'; +$lang['js']['mediadisplaylnk'] = 'Shiko vetem linkun'; +$lang['js']['mediasmall'] = 'Versioni i vegjel'; +$lang['js']['medialarge'] = 'Versioni i madh'; +$lang['js']['mediaoriginal'] = 'Versioni origjinal'; +$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['js']['media_diff'] = 'Shih dallimet:'; +$lang['js']['media_select'] = 'Zgjedh dosjet...'; +$lang['js']['media_upload_btn'] = 'Ngarko'; +$lang['js']['media_drop'] = 'Lëshoji dosjet këtu për t\'i ngarkuar'; +$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['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['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 Adobe Flash Plugin 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['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 Dokuwiki installation instructions'; +$lang['i_funcna'] = 'Funksioni PHP %s 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 %s është më i vogël se ai i duhuri %s. Duhet të përditësoni instalimin tuaj të PHP-së.'; +$lang['i_permfail'] = '%s nuk është e shkruajtshme nga DokuWiki. Duhet të rregulloni lejet e përdorimit për këtë direktori.'; +$lang['i_confexists'] = '%s ekziston njëherë'; +$lang['i_writeerr'] = '%s 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
    )'; +$lang['i_badval'] = '%s - vlerë e palejuar ose boshe'; +$lang['i_success'] = 'Konfigurimi u mbarua me sukses. Tani mund ta fshini skedarin install.php. Vazhdoni tek DokuWiki juaj i ri..'; +$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 DokuWiki-in tuaj të ri..'; +$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 %s. Gjithashtu mund të shihni ndryshimet më të fundit në të gjithë wiki-n.'; +$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/inc/lang/sq/locked.txt b/inc/lang/sq/locked.txt new file mode 100644 index 0000000..7f97f38 --- /dev/null +++ b/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ë. diff --git a/inc/lang/sq/login.txt b/inc/lang/sq/login.txt new file mode 100644 index 0000000..93510a9 --- /dev/null +++ b/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ë. diff --git a/inc/lang/sq/mailtext.txt b/inc/lang/sq/mailtext.txt new file mode 100644 index 0000000..0566aaf --- /dev/null +++ b/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/inc/lang/sq/newpage.txt b/inc/lang/sq/newpage.txt new file mode 100644 index 0000000..49bb3b6 --- /dev/null +++ b/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**. diff --git a/inc/lang/sq/norev.txt b/inc/lang/sq/norev.txt new file mode 100644 index 0000000..df87903 --- /dev/null +++ b/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. diff --git a/inc/lang/sq/password.txt b/inc/lang/sq/password.txt new file mode 100644 index 0000000..44acfe6 --- /dev/null +++ b/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/inc/lang/sq/preview.txt b/inc/lang/sq/preview.txt new file mode 100644 index 0000000..7a6a27c --- /dev/null +++ b/inc/lang/sq/preview.txt @@ -0,0 +1,3 @@ +====== Shikim Paraprak ====== + +Ky është një shikim paraprak i tekstit tuaj. **Kujtohuni: Nuk është ruajtur ende**! diff --git a/inc/lang/sq/pwconfirm.txt b/inc/lang/sq/pwconfirm.txt new file mode 100644 index 0000000..ec776d4 --- /dev/null +++ b/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/inc/lang/sq/read.txt b/inc/lang/sq/read.txt new file mode 100644 index 0000000..f6593fc --- /dev/null +++ b/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. diff --git a/inc/lang/sq/recent.txt b/inc/lang/sq/recent.txt new file mode 100644 index 0000000..c5754af --- /dev/null +++ b/inc/lang/sq/recent.txt @@ -0,0 +1,3 @@ +====== Ndryshimet e kohëve të fundit ====== + +Faqet e mëposhtme janë ndryshuar së fundmi: diff --git a/inc/lang/sq/register.txt b/inc/lang/sq/register.txt new file mode 100644 index 0000000..c8813dd --- /dev/null +++ b/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. diff --git a/inc/lang/sq/registermail.txt b/inc/lang/sq/registermail.txt new file mode 100644 index 0000000..d0f7d51 --- /dev/null +++ b/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/inc/lang/sq/resendpwd.txt b/inc/lang/sq/resendpwd.txt new file mode 100644 index 0000000..8a98a74 --- /dev/null +++ b/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. diff --git a/inc/lang/sq/revisions.txt b/inc/lang/sq/revisions.txt new file mode 100644 index 0000000..349631f --- /dev/null +++ b/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/inc/lang/sq/searchpage.txt b/inc/lang/sq/searchpage.txt new file mode 100644 index 0000000..d3adfd9 --- /dev/null +++ b/inc/lang/sq/searchpage.txt @@ -0,0 +1,3 @@ +====== Kërko ====== + +Mund të gjeni rezultatet e kërkimit tuaj më poshtë. @CREATEPAGEINFO@ diff --git a/inc/lang/sq/showrev.txt b/inc/lang/sq/showrev.txt new file mode 100644 index 0000000..16b5fd9 --- /dev/null +++ b/inc/lang/sq/showrev.txt @@ -0,0 +1,2 @@ +**Ky është një rishikim i vjetër i dokumentit!** +---- diff --git a/inc/lang/sq/stopwords.txt b/inc/lang/sq/stopwords.txt new file mode 100644 index 0000000..d5acd7f --- /dev/null +++ b/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 diff --git a/inc/lang/sq/subscr_digest.txt b/inc/lang/sq/subscr_digest.txt new file mode 100644 index 0000000..62ca057 --- /dev/null +++ b/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/inc/lang/sq/subscr_form.txt b/inc/lang/sq/subscr_form.txt new file mode 100644 index 0000000..7c71a4c --- /dev/null +++ b/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/inc/lang/sq/subscr_list.txt b/inc/lang/sq/subscr_list.txt new file mode 100644 index 0000000..0677f40 --- /dev/null +++ b/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/inc/lang/sq/subscr_single.txt b/inc/lang/sq/subscr_single.txt new file mode 100644 index 0000000..0e4a71c --- /dev/null +++ b/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/inc/lang/sq/updateprofile.txt b/inc/lang/sq/updateprofile.txt new file mode 100644 index 0000000..a240603 --- /dev/null +++ b/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. diff --git a/inc/lang/sq/uploadmail.txt b/inc/lang/sq/uploadmail.txt new file mode 100644 index 0000000..126aefc --- /dev/null +++ b/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/inc/lang/sr/admin.txt b/inc/lang/sr/admin.txt new file mode 100644 index 0000000..284410b --- /dev/null +++ b/inc/lang/sr/admin.txt @@ -0,0 +1,3 @@ +====== Администрација ====== + +Испод се налази листа доступних администраторских опција у DokuWiki-ју. diff --git a/inc/lang/sr/adminplugins.txt b/inc/lang/sr/adminplugins.txt new file mode 100644 index 0000000..02b1a04 --- /dev/null +++ b/inc/lang/sr/adminplugins.txt @@ -0,0 +1 @@ +===== Остали додаци ===== \ No newline at end of file diff --git a/inc/lang/sr/backlinks.txt b/inc/lang/sr/backlinks.txt new file mode 100644 index 0000000..a02dc4a --- /dev/null +++ b/inc/lang/sr/backlinks.txt @@ -0,0 +1,3 @@ +====== Повратне везе ====== + +Ово је листа страница које имају везе ка тренутној страници. diff --git a/inc/lang/sr/conflict.txt b/inc/lang/sr/conflict.txt new file mode 100644 index 0000000..4f53a0d --- /dev/null +++ b/inc/lang/sr/conflict.txt @@ -0,0 +1,5 @@ +====== Постоји новија верзија ====== + +Постоји новија верзија документа који сте изменили. Ово се дешава када неки други корисник измени документ док га Ви још увек мењате. + +Проучите разлике које су доле детаљно приказане, па након тога одлучите коју верзију желите да задржите. Ако изаберете ''сачувај'', Ваша верзија ће да буде сачувана. Ако изаберите ''поништи'', тренутна верзија ће да буде сачувана. diff --git a/inc/lang/sr/denied.txt b/inc/lang/sr/denied.txt new file mode 100644 index 0000000..4b72917 --- /dev/null +++ b/inc/lang/sr/denied.txt @@ -0,0 +1,3 @@ +====== Забрањен приступ ====== + +Извините, али немате довољно права да наставите. diff --git a/inc/lang/sr/diff.txt b/inc/lang/sr/diff.txt new file mode 100644 index 0000000..d410c04 --- /dev/null +++ b/inc/lang/sr/diff.txt @@ -0,0 +1,3 @@ +====== Разлике ====== + +Овде су приказане разлике између изабране ревизије и тренутне верзије странице. diff --git a/inc/lang/sr/draft.txt b/inc/lang/sr/draft.txt new file mode 100644 index 0000000..65e7b26 --- /dev/null +++ b/inc/lang/sr/draft.txt @@ -0,0 +1,5 @@ +====== Пронађена је скица датотеке ====== + +Прошли пут кад сте покушали нешто да измените на овој страници ваше измене нису успешно сачуване. DokuWiki је аутоматски сачувао скицу вашег рада коју сада можете да искористите да бисте наставили са изменама. Испод можете да видите податке који су сачувани током ваше последње посете. + +Молимо вас, одаберите да ли желите да //повратите// ваше измене, //обришете// аутоматски сачувану скицу, или //поништите// цео процес измена. diff --git a/inc/lang/sr/edit.txt b/inc/lang/sr/edit.txt new file mode 100644 index 0000000..7ccf5fe --- /dev/null +++ b/inc/lang/sr/edit.txt @@ -0,0 +1 @@ +Измените ову страницу и притисните ''Сачувај''. Погледајте [[wiki:syntax]] за синтаксу Викија. Молим Вас, измените ову страницу само ако имате намеру да је **побољшате**. Ако желите да тестирате могућности, научите да направите своје кораке на [[playground:playground]]. diff --git a/inc/lang/sr/editrev.txt b/inc/lang/sr/editrev.txt new file mode 100644 index 0000000..3279029 --- /dev/null +++ b/inc/lang/sr/editrev.txt @@ -0,0 +1,2 @@ +**Учитали сте стару ревизију документа!** Ако је сачувате, направићете нову верзију са овим подацима. +---- diff --git a/inc/lang/sr/index.txt b/inc/lang/sr/index.txt new file mode 100644 index 0000000..d82a3b9 --- /dev/null +++ b/inc/lang/sr/index.txt @@ -0,0 +1,3 @@ +====== Индекс ====== + +Овде је индекс свих доступних страница поређаних по [[doku>namespaces|именским просторима]]. diff --git a/inc/lang/sr/install.html b/inc/lang/sr/install.html new file mode 100644 index 0000000..efb47c4 --- /dev/null +++ b/inc/lang/sr/install.html @@ -0,0 +1,7 @@ +

    Ова страница ће вам помоћи у инсталацији и подешавању Dokuwiki-ја. Више информација о инсталацији можете пронаћи у документацији.

    + +

    DokuWiki користи обичне датотеке за складиштење вики страница и осталих информација везаних за странице (слике, индекс претраге, старе преправке, итд.). Да би радио како треба DokuWiki као апликација мора имати могућност писања под фасциклама у којима се налазе ове датотеке. Овај програм за инсталацију нема могућност постављања дозвола за фасцикле. То се обично ради директно из командне линије или ако користите изнајмњени сервер, помоћу ФТПа или кроз Контролни панел (нпр. cPanel).

    + +

    Овај програм за инсталацију DokuWiki-а ће поставити подешавања за Права приступа, које ће омогућити пријјављивање као администратор и приступ менију за инсталацију додатака, управљање корисницима, управљање приступом ка страницама и алтернатвна подешавања. Није неопходно да би DokuWiki радио, али ће вам олакшати администрацију.

    + +

    Искуснији корисници и корисници са посебним захтевима би требало да погледају следеће линкове са детаљним упутствима о инструкцијама за инсталацију и подешавањима.

    diff --git a/inc/lang/sr/jquery.ui.datepicker.js b/inc/lang/sr/jquery.ui.datepicker.js new file mode 100644 index 0000000..8b04d9b --- /dev/null +++ b/inc/lang/sr/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Serbian i18n for the jQuery UI date picker plugin. */ +/* Written by Dejan Dimić. */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.sr = { + 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.sr ); + +return datepicker.regional.sr; + +} ); diff --git a/inc/lang/sr/lang.php b/inc/lang/sr/lang.php new file mode 100644 index 0000000..c34e424 --- /dev/null +++ b/inc/lang/sr/lang.php @@ -0,0 +1,360 @@ + + * @author Milan Oparnica + * @author Filip Brcic + * @author Иван Петровић (Ivan Petrovic) + * @author Miroslav Šolti + * @author Марко М. Костић + */ +$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'] = 'Ako niste pronašli to što tražite, možete napraviti ili urediti stranicu %s, imenovanu prema zadatom upitu.'; +$lang['search_fullresults'] = 'Tekstualni rezultati'; +$lang['js']['search_toggle_tools'] = 'Uključi/isključi Alate Pretrage'; +$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_diff_opacity'] = 'Prosvetl'; +$lang['js']['media_diff_portions'] = 'Prevuci'; +$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'] = 'Potpuno podudaranje'; +$lang['search_starts_with'] = 'Počinje sa'; +$lang['search_ends_with'] = 'Završava se sa'; +$lang['search_contains'] = 'Sadrži'; +$lang['search_custom_match'] = 'Prilagođen'; +$lang['search_any_ns'] = 'Svako imenovanje '; +$lang['search_any_time'] = 'Svako vreme'; +$lang['search_past_7_days'] = 'Prošla nedelja'; +$lang['search_past_month'] = 'Prošli mesec'; +$lang['search_past_year'] = 'Prošla godina'; +$lang['search_sort_by_hits'] = 'Poređaj po pogodcima'; +$lang['search_sort_by_mtime'] = 'Poređaj po vremenu izmene'; +$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'] = 'Желим да уклоним свој налог са овог викија.
    Ова радња се не може опозвати.'; +$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'] = 'За приказивање ове врсте материјала потребан вам је Adobe Flash Plugin.'; +$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 инсталацијом. Требало би или да опет распакујете архиву преузету са сајта или да погледате Dokuwiki инструкције за инсталацију'; +$lang['i_funcna'] = 'ПХП функција %s није доступна. Можда је Ваш хостинг провајдер забранио из неког разлога?'; +$lang['i_phpver'] = '%s Верзија Вашег ПХПа је нижа од неопходне %s. Требало би да надоградите ПХП инсталацију.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload мора бити искључен у датотеци php.ini да бисте користили Докувики.'; +$lang['i_permfail'] = 'DokuWiki нема дозволу писања у %s. Потребно је да поправите дозволе за ову фасциклу!'; +$lang['i_confexists'] = '%s већ постоји'; +$lang['i_writeerr'] = 'Не могу да направим %s. Проверите дозволе а затим ручно направите ову датотеку.'; +$lang['i_badhash'] = 'dokuwiki.php није препознат или је измењен (hash=%s)'; +$lang['i_badval'] = '%s - недозвољена или празна вредност'; +$lang['i_success'] = 'Подешавања су завршена. Сада можете обрисати датотеку install.php. Наставите у Ваш нови DokuWiki.'; +$lang['i_failure'] = 'Појавили су се проблеми при писању датотеке са подешавањима. Требало би да их ручно исправите пре него што ћете моћи да користите Ваш нови DokuWiki.'; +$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'] = 'Тренутно пратите промене у именском простору %s. Такође, можете пратити прмене на целом викију.'; +$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. Касније је направљена у %s.'; +$lang['unable_to_parse_date'] = 'Не могу да обрадим код параметра "%s".'; +$lang['email_signature_text'] = 'Ову поруку је генерисао DokuWiki sa +@DOKUWIKIURL@'; diff --git a/inc/lang/sr/locked.txt b/inc/lang/sr/locked.txt new file mode 100644 index 0000000..4bcc0ac --- /dev/null +++ b/inc/lang/sr/locked.txt @@ -0,0 +1,3 @@ +====== Страница је закључана ====== + +Ову страница је други корисник у овом тренутку закључао за измене. Мораћете да сачекате док он не заврши са изменама или не истекне закључавање. diff --git a/inc/lang/sr/login.txt b/inc/lang/sr/login.txt new file mode 100644 index 0000000..1bc71df --- /dev/null +++ b/inc/lang/sr/login.txt @@ -0,0 +1,3 @@ +====== Пријављивање ====== + +Тренутно нисте пријављени! Унесите Ваше информације испод да бисте се пријавили. За то је неопходно да колачићи буду омогућен. diff --git a/inc/lang/sr/mailtext.txt b/inc/lang/sr/mailtext.txt new file mode 100644 index 0000000..ab9d717 --- /dev/null +++ b/inc/lang/sr/mailtext.txt @@ -0,0 +1,12 @@ +Страница на Вашем DokuWiki-ју је додата или измењена. Ево детаља + +Датум : @DATE@ +Веб читач : @BROWSER@ +ИП адреса : @IPADDRESS@ +Име домаћина : @HOSTNAME@ +Стара ревизија : @OLDPAGE@ +Нова ревизија : @NEWPAGE@ +Сажетак измена : @SUMMARY@ +Корисник : @USER@ + +@DIFF@ diff --git a/inc/lang/sr/newpage.txt b/inc/lang/sr/newpage.txt new file mode 100644 index 0000000..5162f3d --- /dev/null +++ b/inc/lang/sr/newpage.txt @@ -0,0 +1,3 @@ +====== Ова тема још увек не постоји ====== + +Пратили сте везу до теме која још увек не постоји. Можете да је направите користећи дугме **Направи ову страницу**. diff --git a/inc/lang/sr/norev.txt b/inc/lang/sr/norev.txt new file mode 100644 index 0000000..5bb57cd --- /dev/null +++ b/inc/lang/sr/norev.txt @@ -0,0 +1,3 @@ +====== Не постоји таква ревизија ====== + +Задата ревизија не постоји. Искористите дугме ''Старе ревизије'' да излистате старе ревизије овог документа. diff --git a/inc/lang/sr/onceexisted.txt b/inc/lang/sr/onceexisted.txt new file mode 100644 index 0000000..cf4fb45 --- /dev/null +++ b/inc/lang/sr/onceexisted.txt @@ -0,0 +1,3 @@ +======= Ova stranica više ne postoji ====== + +Pratili ste sled do stranice koja više ne postoji. U dnevniku **old revisions** možete pronaći kada i zašto je stranica obrisana, otvoriti njenu staru verziju i povratiti je. diff --git a/inc/lang/sr/password.txt b/inc/lang/sr/password.txt new file mode 100644 index 0000000..bd2cf32 --- /dev/null +++ b/inc/lang/sr/password.txt @@ -0,0 +1,6 @@ +Здраво @FULLNAME@! + +Ево Ваших података за @TITLE@ на @DOKUWIKIURL@ + +Корисничко име : @LOGIN@ +Лозинка : @PASSWORD@ diff --git a/inc/lang/sr/preview.txt b/inc/lang/sr/preview.txt new file mode 100644 index 0000000..57c02ce --- /dev/null +++ b/inc/lang/sr/preview.txt @@ -0,0 +1,3 @@ +====== Преглед ====== + +Ово је преглед тога како би Ваш текст изгледао. **Не заборавите: он још није сачуван**! diff --git a/inc/lang/sr/pwconfirm.txt b/inc/lang/sr/pwconfirm.txt new file mode 100644 index 0000000..ce44cd5 --- /dev/null +++ b/inc/lang/sr/pwconfirm.txt @@ -0,0 +1,9 @@ +Здраво @FULLNAME@! + +Неко је затражио нову лозинку за Ваш налог @TITLE@ на @DOKUWIKIURL@ + +Ако то нисте Ви, само игноришите ову поруку. + +У супротном, да бисте потврдили захтев кликните на следећи линк: + +@CONFIRM@ diff --git a/inc/lang/sr/read.txt b/inc/lang/sr/read.txt new file mode 100644 index 0000000..437a07f --- /dev/null +++ b/inc/lang/sr/read.txt @@ -0,0 +1 @@ +Ова страница је само за читање. Можете да погледате изворни код, али не можете да је мењате. Обратите се администратору ако мислите да то није уреду. diff --git a/inc/lang/sr/recent.txt b/inc/lang/sr/recent.txt new file mode 100644 index 0000000..62bd5ed --- /dev/null +++ b/inc/lang/sr/recent.txt @@ -0,0 +1,3 @@ +====== Скорије измене ====== + +Следеће странице су биле измењене у скорије време: diff --git a/inc/lang/sr/register.txt b/inc/lang/sr/register.txt new file mode 100644 index 0000000..a2c74de --- /dev/null +++ b/inc/lang/sr/register.txt @@ -0,0 +1,3 @@ +====== Региструјте се као нови корисник ====== + +Попуните све информације испод како би сте направили нови налог на овом викију. Обавезно упишите **тачну е-адресу** - Ваша нова лозинка ће тамо бити послата. Корисничко име би требало да буде исправно [[doku>pagename|име странице]] diff --git a/inc/lang/sr/registermail.txt b/inc/lang/sr/registermail.txt new file mode 100644 index 0000000..9dca20c --- /dev/null +++ b/inc/lang/sr/registermail.txt @@ -0,0 +1,10 @@ +Регистрован је нови корисник. Ово су детаљи: + +Корисничко име: @NEWUSER@ +Име и презиме: @NEWNAME@ +Е-адреса: @NEWEMAIL@ + +Датум: @DATE@ +Веб читач: @BROWSER@ +ИП адреса: @IPADDRESS@ +Домаћин: @HOSTNAME@ diff --git a/inc/lang/sr/resendpwd.txt b/inc/lang/sr/resendpwd.txt new file mode 100644 index 0000000..b45be8e --- /dev/null +++ b/inc/lang/sr/resendpwd.txt @@ -0,0 +1,3 @@ +====== Пошаљи нову лозинку ====== + +Молим Вас унесите корисничко име у форму да бисте затражили нову лозинку за Ваш налог на овом викију. Потврдни линк ће бити послат на е-адресу коју сте користили на регистрацији. diff --git a/inc/lang/sr/resetpwd.txt b/inc/lang/sr/resetpwd.txt new file mode 100644 index 0000000..1cabd3f --- /dev/null +++ b/inc/lang/sr/resetpwd.txt @@ -0,0 +1,3 @@ +====== Поставите нову лозинку ====== + +Унесите нову лозинку за ваш налог на овом викију. diff --git a/inc/lang/sr/revisions.txt b/inc/lang/sr/revisions.txt new file mode 100644 index 0000000..463270f --- /dev/null +++ b/inc/lang/sr/revisions.txt @@ -0,0 +1,3 @@ +====== Старе ревизије ====== + +Ово су старије ревизије тренутног документа. Да би сте повратили стару ревизију, изаберите је одоздо, кликните на ''Измени страницу'' и сачувајте је. diff --git a/inc/lang/sr/searchpage.txt b/inc/lang/sr/searchpage.txt new file mode 100644 index 0000000..3a6cea3 --- /dev/null +++ b/inc/lang/sr/searchpage.txt @@ -0,0 +1,3 @@ +====== Претрага ====== + +Испод можете да нађете резултате Ваше претраге. @CREATEPAGEINFO@ diff --git a/inc/lang/sr/showrev.txt b/inc/lang/sr/showrev.txt new file mode 100644 index 0000000..f2aabb2 --- /dev/null +++ b/inc/lang/sr/showrev.txt @@ -0,0 +1,2 @@ +**Ово је стара верзија документа!** +---- diff --git a/inc/lang/sr/stopwords.txt b/inc/lang/sr/stopwords.txt new file mode 100644 index 0000000..78093e2 --- /dev/null +++ b/inc/lang/sr/stopwords.txt @@ -0,0 +1,12 @@ +# Ово је листа речи које се неће индексирати, по једна реч у реду +# Када мењате ову датотеку проверите да ли је нови ред записан по UNIX систему +# Нема потребе уносити речи краће од 3 слова - оне се прескачу иначе +ваш +они +њихов +како +ово +шта +кад +где +www diff --git a/inc/lang/sr/subscr_digest.txt b/inc/lang/sr/subscr_digest.txt new file mode 100644 index 0000000..aaba525 --- /dev/null +++ b/inc/lang/sr/subscr_digest.txt @@ -0,0 +1,16 @@ +Здраво! + +Страница @PAGE@ под Вики насловом @TITLE@ је промењена. +Ово су промене: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Стара верзија: @OLDPAGE@ +Нова верзија: @NEWPAGE@ + + +Да бисте поништили обавештења о променама страница, улогујте се на Вики овде +@DOKUWIKIURL@ а затим посетите +@SUBSCRIBE@ и поништите обавештавање о променама страница и/или именских простора.. diff --git a/inc/lang/sr/subscr_form.txt b/inc/lang/sr/subscr_form.txt new file mode 100644 index 0000000..9bf72e4 --- /dev/null +++ b/inc/lang/sr/subscr_form.txt @@ -0,0 +1,3 @@ +===== Управљање претплатама ===== + +Ова страница вам омогућава да управљате својим претплатама на страницу и именски простор на којима се налазите. \ No newline at end of file diff --git a/inc/lang/sr/subscr_list.txt b/inc/lang/sr/subscr_list.txt new file mode 100644 index 0000000..09df43d --- /dev/null +++ b/inc/lang/sr/subscr_list.txt @@ -0,0 +1,13 @@ +Здраво! + +Страница у именском простору @PAGE@ под Вики насловом @TITLE@ је промењена. +Ово су промењене странице: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + + +Да бисте поништили обавештења о променама страница, улогујте се на Вики овде +@DOKUWIKIURL@ а затим посетите +@SUBSCRIBE@ и поништите обавештавање о променама страница и/или именских простора.. diff --git a/inc/lang/sr/subscr_single.txt b/inc/lang/sr/subscr_single.txt new file mode 100644 index 0000000..67102dd --- /dev/null +++ b/inc/lang/sr/subscr_single.txt @@ -0,0 +1,19 @@ +Здраво! + +Страница @PAGE@ под Вики насловом @TITLE@ је промењена. +Ово су промене: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Датум : @DATE@ +Корисникr : @USER@ +Измени сиже: @SUMMARY@ +Стара верзија: @OLDPAGE@ +Нова верзија: @NEWPAGE@ + + +Да бисте поништили обавештења о променама страница, улогујте се на Бики овде +@DOKUWIKIURL@ а затим посетите +@SUBSCRIBE@ и поништите обавештавање о променама страница и/или именских простора.. diff --git a/inc/lang/sr/updateprofile.txt b/inc/lang/sr/updateprofile.txt new file mode 100644 index 0000000..296cb3c --- /dev/null +++ b/inc/lang/sr/updateprofile.txt @@ -0,0 +1,3 @@ +====== Ажурирање Вашег профила ====== + +Потребно је попунити само она поља која желите да промените. Поље Корисничко име не можете да промените. diff --git a/inc/lang/sr/uploadmail.txt b/inc/lang/sr/uploadmail.txt new file mode 100644 index 0000000..0db6f9e --- /dev/null +++ b/inc/lang/sr/uploadmail.txt @@ -0,0 +1,10 @@ +Нова датотека је послата на Ваш DokuWiki. Ово су њени детањи: + +Датотека: @MEDIA@ +Датум: @DATE@ +Веб читач: @BROWSER@ +ИП адреса: @IPADDRESS@ +Домаћин: @HOSTNAME@ +Величина: @SIZE@ +MIME тип: @MIME@ +Корисник: @USER@ diff --git a/inc/lang/sv/admin.txt b/inc/lang/sv/admin.txt new file mode 100644 index 0000000..e98c935 --- /dev/null +++ b/inc/lang/sv/admin.txt @@ -0,0 +1,3 @@ +====== Administration ====== + +Nedan hittar du en lista över de tillgängliga administrativa uppgifterna i DokuWiki. diff --git a/inc/lang/sv/adminplugins.txt b/inc/lang/sv/adminplugins.txt new file mode 100644 index 0000000..df1b4e4 --- /dev/null +++ b/inc/lang/sv/adminplugins.txt @@ -0,0 +1 @@ +===== Ytterligare tillägg ===== \ No newline at end of file diff --git a/inc/lang/sv/backlinks.txt b/inc/lang/sv/backlinks.txt new file mode 100644 index 0000000..c907c8e --- /dev/null +++ b/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/inc/lang/sv/conflict.txt b/inc/lang/sv/conflict.txt new file mode 100644 index 0000000..3f17309 --- /dev/null +++ b/inc/lang/sv/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/sv/denied.txt b/inc/lang/sv/denied.txt new file mode 100644 index 0000000..c571647 --- /dev/null +++ b/inc/lang/sv/denied.txt @@ -0,0 +1,3 @@ +====== Åtkomst nekad ====== + +Tyvärr, du har inte behörighet att fortsätta. diff --git a/inc/lang/sv/diff.txt b/inc/lang/sv/diff.txt new file mode 100644 index 0000000..4ff2cbc --- /dev/null +++ b/inc/lang/sv/diff.txt @@ -0,0 +1,3 @@ +====== Skillnader ====== + +Här visas skillnader mellan den valda versionen och den nuvarande versionen av sidan. diff --git a/inc/lang/sv/draft.txt b/inc/lang/sv/draft.txt new file mode 100644 index 0000000..31adec7 --- /dev/null +++ b/inc/lang/sv/draft.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/sv/edit.txt b/inc/lang/sv/edit.txt new file mode 100644 index 0000000..6738438 --- /dev/null +++ b/inc/lang/sv/edit.txt @@ -0,0 +1 @@ +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/inc/lang/sv/editrev.txt b/inc/lang/sv/editrev.txt new file mode 100644 index 0000000..8bd1adb --- /dev/null +++ b/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/inc/lang/sv/index.txt b/inc/lang/sv/index.txt new file mode 100644 index 0000000..10d52b4 --- /dev/null +++ b/inc/lang/sv/index.txt @@ -0,0 +1,3 @@ +====== Innehållsförteckning ====== + +Detta är en innehållsförteckning över alla tillgängliga sidor, sorterad efter [[doku>namespaces|namnrymder]]. diff --git a/inc/lang/sv/install.html b/inc/lang/sv/install.html new file mode 100644 index 0000000..ae81a2c --- /dev/null +++ b/inc/lang/sv/install.html @@ -0,0 +1,7 @@ +

    Denna sida hjälper dig med nyinstallation och inställningar för Dokuwiki. Mer information om installationsprogrammet finns på dess egen dokumentationssida.

    + +

    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 måste 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).

    + +

    Detta installationsprogram anpassar inställningarna i din DokuWiki för ACL (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.

    + +

    Erfarna användare, eller användare med särskilda behov, kan använda dessa länkar för att hitta mer detaljer om installation och inställningar.

    diff --git a/inc/lang/sv/jquery.ui.datepicker.js b/inc/lang/sv/jquery.ui.datepicker.js new file mode 100644 index 0000000..ee9296e --- /dev/null +++ b/inc/lang/sv/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Swedish initialisation for the jQuery UI date picker plugin. */ +/* Written by Anders Ekdahl ( anders@nomadiz.se). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.sv = { + closeText: "Stäng", + prevText: "Förra", + nextText: "Nästa", + currentText: "Idag", + monthNames: [ "januari", "februari", "mars", "april", "maj", "juni", + "juli", "augusti", "september", "oktober", "november", "december" ], + monthNamesShort: [ "jan.", "feb.", "mars", "apr.", "maj", "juni", + "juli", "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/inc/lang/sv/lang.php b/inc/lang/sv/lang.php new file mode 100644 index 0000000..653ff19 --- /dev/null +++ b/inc/lang/sv/lang.php @@ -0,0 +1,382 @@ + + * @author Patrik K Lundberg + * @author Tor Härnqvist + * @author Joaquim Homrighausen + * @author Per Foreby + * @author Nicklas Henriksson + * @author Håkan Sandell + * @author Dennis Karlsson + * @author Tormod Otter Johansson + * @author Tormod Johansson + * @author Pontus Bergendahl + * @author Emil Lind + * @author Bogge Bogge + * @author Peter Åström + * @author Henrik + * @author Hans Iwan Bratt + * @author Mikael Bergström + */ +$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['searchcreatepage'] = 'Om du inte hittade det du sökte så kan du skapa eller editera sidan %s som är döpt efter din sökning.'; +$lang['search_fullresults'] = 'Heltext resultat'; +$lang['js']['search_toggle_tools'] = 'Växla sökverktyg'; +$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']['medianoalign'] = 'Använd ingen justering'; +$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['js']['data_insecure'] = 'VARNING! Det tycks som om din datamapp inte har tillräcklig säkerhet. Läs gärna om Åtkomstsäkerhet i DokuWiki'; +$lang['search_exact_match'] = 'Exakt träff'; +$lang['search_starts_with'] = 'Börjar med'; +$lang['search_ends_with'] = 'Slutar med'; +$lang['search_contains'] = 'Innehåller'; +$lang['search_custom_match'] = 'Anpassad'; +$lang['search_any_ns'] = 'Alla namespaces'; +$lang['search_any_time'] = 'Alla tider'; +$lang['search_past_7_days'] = 'Senaste veckan'; +$lang['search_past_month'] = 'Senaste månaden'; +$lang['search_past_year'] = 'Senaste året'; +$lang['search_sort_by_hits'] = 'Sortera efter träffar'; +$lang['search_sort_by_mtime'] = 'Sortera efter senast modifierad'; +$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
    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['allowedmime'] = 'Lista av alla tillåtna extensions'; +$lang['lockedby'] = 'Låst av:'; +$lang['lockexpire'] = 'Lås upphör att gälla:'; +$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_inline'] = 'Exakt träff'; +$lang['diff_side'] = 'Sida vid sida'; +$lang['diffprevrev'] = 'Föregående version.'; +$lang['diffnextrev'] = 'Nästa version.'; +$lang['difflastrev'] = 'Senaste version.'; +$lang['diffbothprevrev'] = 'Börjar med'; +$lang['diffbothnextrev'] = 'Slutar med'; +$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['unknowndate'] = 'Okänt datum'; +$lang['noflash'] = 'Adobe Flash Plugin 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 + instruktionerna för installation av Dokuwiki'; +$lang['i_funcna'] = 'PHP-funktionen %s är inte tillgänglig. Kanske ditt webbhotell har avaktiverat den av någon anledning?'; +$lang['i_disabled'] = 'Det är avstängt av din leverantör.'; +$lang['i_funcnmail'] = 'Note: PHP mail funktionen är inte tillgänglig. %s Om det är fortsatt otillgängligt kan du installera smtp pluginet'; +$lang['i_phpver'] = 'Din PHP-version %s är lägre än vad som krävs %s. Du behöver uppgradera din PHP-installation.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload måste inaktiveras i php.ini för att använda DokuWiki.'; +$lang['i_urandom'] = 'Innehåller'; +$lang['i_permfail'] = '%s är inte skrivbar av DokuWiki. Du behöver ändra filskyddet på den här katalogen!'; +$lang['i_confexists'] = '%s finns redan'; +$lang['i_writeerr'] = 'Kan inte skapa %s. Kontrollera filskyddet på kataloger/filer och skapa filen manuellt.'; +$lang['i_badhash'] = 'okänd eller ändrad dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - felaktig eller blank'; +$lang['i_success'] = 'Konfigurationen avslutades utan fel. Du kan radera filen install.php nu. Fortsätt till + din nya DokuWiki.'; +$lang['i_failure'] = 'Fel uppstod vid skrivning av konfigurationsfilerna. Du kan behöva ordna till dem manuellt innan + du kan använda din nya DokuWiki.'; +$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 %s. Du kan också titta på senaste ändringar för hela wikin.'; +$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['email_fail'] = 'PHP mail() saknas eller är inaktiverad. Följande mejl skickades inte:'; +$lang['currentns'] = 'Nuvarande namnrymd.'; +$lang['searchresult'] = 'Sökresultat'; +$lang['plainhtml'] = 'Ren HTML'; +$lang['wikimarkup'] = 'Wiki Markup'; +$lang['page_nonexist_rev'] = 'Sidan fanns inte på %s. Den blev sedermera skapad på %s.'; +$lang['unable_to_parse_date'] = 'Oförmögen att processera i parameter "%s".'; +$lang['email_signature_text'] = 'Detta meddelande har skapats av DokuWiki på +@DOKUWIKIURL@'; diff --git a/inc/lang/sv/locked.txt b/inc/lang/sv/locked.txt new file mode 100644 index 0000000..cb64eaf --- /dev/null +++ b/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/inc/lang/sv/login.txt b/inc/lang/sv/login.txt new file mode 100644 index 0000000..5cf78fd --- /dev/null +++ b/inc/lang/sv/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/sv/mailtext.txt b/inc/lang/sv/mailtext.txt new file mode 100644 index 0000000..a45bc2a --- /dev/null +++ b/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/inc/lang/sv/mailwrap.html b/inc/lang/sv/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/sv/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/sv/newpage.txt b/inc/lang/sv/newpage.txt new file mode 100644 index 0000000..82f5929 --- /dev/null +++ b/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/inc/lang/sv/norev.txt b/inc/lang/sv/norev.txt new file mode 100644 index 0000000..7d539f5 --- /dev/null +++ b/inc/lang/sv/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/sv/onceexisted.txt b/inc/lang/sv/onceexisted.txt new file mode 100644 index 0000000..58df6b1 --- /dev/null +++ b/inc/lang/sv/onceexisted.txt @@ -0,0 +1,3 @@ +======= Den här sidan existerar inte längre ====== + +Du har följt en länk till en sida som inte längre existerar. Du kan kontrollera följande lista **old revisions** för att se när och varför den togs bort, gå till en äldre version för att återställa den. diff --git a/inc/lang/sv/password.txt b/inc/lang/sv/password.txt new file mode 100644 index 0000000..f8465a4 --- /dev/null +++ b/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/inc/lang/sv/preview.txt b/inc/lang/sv/preview.txt new file mode 100644 index 0000000..31c32b8 --- /dev/null +++ b/inc/lang/sv/preview.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/sv/pwconfirm.txt b/inc/lang/sv/pwconfirm.txt new file mode 100644 index 0000000..18d7590 --- /dev/null +++ b/inc/lang/sv/pwconfirm.txt @@ -0,0 +1,9 @@ +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/inc/lang/sv/read.txt b/inc/lang/sv/read.txt new file mode 100644 index 0000000..8aa4335 --- /dev/null +++ b/inc/lang/sv/read.txt @@ -0,0 +1 @@ +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/inc/lang/sv/recent.txt b/inc/lang/sv/recent.txt new file mode 100644 index 0000000..b68f4b7 --- /dev/null +++ b/inc/lang/sv/recent.txt @@ -0,0 +1,3 @@ +====== Senaste ändringarna ====== + +Följande sidor/dokument har nyligen uppdaterats: diff --git a/inc/lang/sv/register.txt b/inc/lang/sv/register.txt new file mode 100644 index 0000000..5087ccb --- /dev/null +++ b/inc/lang/sv/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/sv/registermail.txt b/inc/lang/sv/registermail.txt new file mode 100644 index 0000000..cbcf3f4 --- /dev/null +++ b/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/inc/lang/sv/resendpwd.txt b/inc/lang/sv/resendpwd.txt new file mode 100644 index 0000000..2c62bb7 --- /dev/null +++ b/inc/lang/sv/resendpwd.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/sv/resetpwd.txt b/inc/lang/sv/resetpwd.txt new file mode 100644 index 0000000..294972b --- /dev/null +++ b/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. diff --git a/inc/lang/sv/revisions.txt b/inc/lang/sv/revisions.txt new file mode 100644 index 0000000..8f28086 --- /dev/null +++ b/inc/lang/sv/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/sv/searchpage.txt b/inc/lang/sv/searchpage.txt new file mode 100644 index 0000000..55cbf19 --- /dev/null +++ b/inc/lang/sv/searchpage.txt @@ -0,0 +1,3 @@ +====== Sök ====== + +Nedan ser du resultatet av sökningen. @CREATEPAGEINFO@ diff --git a/inc/lang/sv/showrev.txt b/inc/lang/sv/showrev.txt new file mode 100644 index 0000000..a79b30b --- /dev/null +++ b/inc/lang/sv/showrev.txt @@ -0,0 +1,2 @@ +**Detta är en gammal version av dokumentet!** +---- diff --git a/inc/lang/sv/stopwords.txt b/inc/lang/sv/stopwords.txt new file mode 100644 index 0000000..583da7b --- /dev/null +++ b/inc/lang/sv/stopwords.txt @@ -0,0 +1,100 @@ +# 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. +över +alla +allt +att +blev +bli +blir +blivit +där +dem +den +denna +deras +dess +dessa +det +detta +dig +din +dina +ditt +efter +eller +era +ert +ett +för +från +här +hade +han +hans +har +henne +hennes +hon +honom +hur +icke +ingen +inom +inte +jag +kan +kunde +man +med +mellan +men +mig +min +mina +mitt +mot +mycket +när +någon +något +några +och +oss +sådan +sådana +sådant +samma +sedan +sig +sin +sina +sitta +själv +skulle +som +till +under +upp +utan +vår +våra +vårt +vad +var +vara +varför +varit +varje +vars +vart +vem +vid +vilka +vilkas +vilken +vilket +www diff --git a/inc/lang/sv/subscr_digest.txt b/inc/lang/sv/subscr_digest.txt new file mode 100644 index 0000000..adf6680 --- /dev/null +++ b/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/inc/lang/sv/subscr_form.txt b/inc/lang/sv/subscr_form.txt new file mode 100644 index 0000000..bfb8fa3 --- /dev/null +++ b/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/inc/lang/sv/subscr_list.txt b/inc/lang/sv/subscr_list.txt new file mode 100644 index 0000000..4621917 --- /dev/null +++ b/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/inc/lang/sv/subscr_single.txt b/inc/lang/sv/subscr_single.txt new file mode 100644 index 0000000..50ef056 --- /dev/null +++ b/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/inc/lang/sv/updateprofile.txt b/inc/lang/sv/updateprofile.txt new file mode 100644 index 0000000..d4b8d5d --- /dev/null +++ b/inc/lang/sv/updateprofile.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/sv/uploadmail.txt b/inc/lang/sv/uploadmail.txt new file mode 100644 index 0000000..8db5f55 --- /dev/null +++ b/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/inc/lang/ta/admin.txt b/inc/lang/ta/admin.txt new file mode 100644 index 0000000..74570f2 --- /dev/null +++ b/inc/lang/ta/admin.txt @@ -0,0 +1,3 @@ +====== நிர்வாகம் ====== + +கீழே டோகுவிக்கியின் நிர்வாகம் தொடர்பான முறைமைகளைப் பார்க்கலாம். diff --git a/inc/lang/ta/adminplugins.txt b/inc/lang/ta/adminplugins.txt new file mode 100644 index 0000000..54a363a --- /dev/null +++ b/inc/lang/ta/adminplugins.txt @@ -0,0 +1 @@ +===== மேலதிக சொருகிகள் ===== \ No newline at end of file diff --git a/inc/lang/ta/backlinks.txt b/inc/lang/ta/backlinks.txt new file mode 100644 index 0000000..50ad3a5 --- /dev/null +++ b/inc/lang/ta/backlinks.txt @@ -0,0 +1,3 @@ +====== பின்னிணைப்புக்கள் ====== + +குறித்த பக்கத்திற்கான இணைப்பைக் கொண்டிருக்கும் அனைத்துப் பக்கங்களும் diff --git a/inc/lang/ta/conflict.txt b/inc/lang/ta/conflict.txt new file mode 100644 index 0000000..1bd822d --- /dev/null +++ b/inc/lang/ta/conflict.txt @@ -0,0 +1,3 @@ +====== புதிய பதிப்பு உண்டு ====== + +நீங்கள் திருத்திய பக்கத்திற்கு புதிய பதிப்பு உருவாகியுள்ளது. நீங்கள் குறித்த பக்கத்தை திருத்தும் போது, இன்னுமொரு பயனர் அதே பக்கத்தைத் திருத்தினால் இப்படி ஏற்பட வாய்ப்புண்டு. diff --git a/inc/lang/ta/denied.txt b/inc/lang/ta/denied.txt new file mode 100644 index 0000000..08d95a8 --- /dev/null +++ b/inc/lang/ta/denied.txt @@ -0,0 +1,3 @@ +====== அணுகல் மறுக்கப்பட்டது ====== + +மன்னிக்கவும் ! உங்களுக்கு தொடர அனுமதி இல்லை diff --git a/inc/lang/ta/diff.txt b/inc/lang/ta/diff.txt new file mode 100644 index 0000000..cc57512 --- /dev/null +++ b/inc/lang/ta/diff.txt @@ -0,0 +1,3 @@ +====== வேறுபாடுகள் ====== + +குறித்த பக்கத்திற்கான இருவேறுபட்ட மாறுதல்களைக் காட்டுகின்றது. diff --git a/inc/lang/ta/draft.txt b/inc/lang/ta/draft.txt new file mode 100644 index 0000000..9f1b2d3 --- /dev/null +++ b/inc/lang/ta/draft.txt @@ -0,0 +1,5 @@ +====== பூரணமாகத கோப்பு ====== + +உங்கள் கடந்த திருத்த அமர்வு இந்த பக்கத்தில் இருந்தது நிறைவு இல்லை சரியாக. DokuWiki தானாகவே சேமிக்கப்படும் ஒரு வரைவு போது உங்கள் வேலை நீங்கள் இப்போது பயன்படுத்த தொடர உங்கள் எடிட்டிங். கீழே நீங்கள் பார்க்க முடியும் என்று தரவு காப்பாற்றப்பட்டது இருந்து உங்கள் கடைசி அமர்வு. + +தயவு செய்து முடிவு செய்ய வேண்டும் என்றால், //மீட்க// உங்கள் இழந்து திருத்த அமர்வு, //நீக்கு// தானாக வரைவு அல்லது //நீக்கு// எடிட்டிங் செயல்முறை. diff --git a/inc/lang/ta/edit.txt b/inc/lang/ta/edit.txt new file mode 100644 index 0000000..bbf6ac6 --- /dev/null +++ b/inc/lang/ta/edit.txt @@ -0,0 +1 @@ +பக்கத்தைத் திருத்தி முடிந்தவுடன், "செமி" என்ற பட்டனை அழுத்தவும். விக்கியின் வாக்கிய அமைப்புக்களைப் அறிந்துகொள்ள [[wiki:syntax]] ஐ பார்க்கவும். நீங்கள் விக்கியில் எழுதிப் பயிற்சிபெற [playground:playground|விளையாட்டுத்தாடலை]] பயன்படுத்தவும். diff --git a/inc/lang/ta/jquery.ui.datepicker.js b/inc/lang/ta/jquery.ui.datepicker.js new file mode 100644 index 0000000..730c5df --- /dev/null +++ b/inc/lang/ta/jquery.ui.datepicker.js @@ -0,0 +1,56 @@ +/* Tamil (UTF-8) initialisation for the jQuery UI date picker plugin. */ +/* Written by S A Sureshkumar (saskumar@live.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +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/inc/lang/ta/lang.php b/inc/lang/ta/lang.php new file mode 100644 index 0000000..422613e --- /dev/null +++ b/inc/lang/ta/lang.php @@ -0,0 +1,55 @@ + + * @author Sri Saravana + */ +$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_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/inc/lang/th/admin.txt b/inc/lang/th/admin.txt new file mode 100644 index 0000000..7509cfb --- /dev/null +++ b/inc/lang/th/admin.txt @@ -0,0 +1,3 @@ +====== งานธุรการควบคุมระบบ ====== + +ด้านล่างนี้คุณสามารถพบรายการงานควบคุมระบบทั้งหมดในโดกุวิกิ diff --git a/inc/lang/th/adminplugins.txt b/inc/lang/th/adminplugins.txt new file mode 100644 index 0000000..85a6b17 --- /dev/null +++ b/inc/lang/th/adminplugins.txt @@ -0,0 +1 @@ +====== ปลั๊กอินเสริม ====== \ No newline at end of file diff --git a/inc/lang/th/backlinks.txt b/inc/lang/th/backlinks.txt new file mode 100644 index 0000000..239325d --- /dev/null +++ b/inc/lang/th/backlinks.txt @@ -0,0 +1,3 @@ +====== ลิงค์กลับ(Backlinks) ====== + +นี่คือรายชื่อเพจที่ชี้ลิงค์กลับมายังเพจปัจจุบัน diff --git a/inc/lang/th/conflict.txt b/inc/lang/th/conflict.txt new file mode 100644 index 0000000..891d019 --- /dev/null +++ b/inc/lang/th/conflict.txt @@ -0,0 +1,5 @@ +====== มีเนื้อหารุ่นใหม่กว่าเกิดขึ้น ====== + +มีเอกสารรุ่นใหม่กว่าที่คุณได้แก้ไขไว้ มันเกิดขึ้นเมื่อผู้ใช้รายอื่นได้ทำการแก้ไขเอกสารในขณะที่ขณะเดียวกันกับที่คุณกำลังแก้ไขมัน + +ให้ตรวจสอบความแตกต่างที่แสดงไว้ด้านล่างนี้ให้ทั่วถึง, แล้วตัดสินใจว่าจะเก็บฉบับไหนไว้ ถ้าคุณเลือก "บันทึก", ฉบับของคุณจะถูกบันทึกไว้ หรือกด "ยกเลิก" เพื่อเก็บฉบับปัจจุบัน diff --git a/inc/lang/th/denied.txt b/inc/lang/th/denied.txt new file mode 100644 index 0000000..4bbd23a --- /dev/null +++ b/inc/lang/th/denied.txt @@ -0,0 +1,3 @@ +====== ปฏิเสธสิทธิ์ ====== + +ขออภัย คุณไม่มีสิทธิ์เพียงพอที่จะดำเนินการต่อ diff --git a/inc/lang/th/diff.txt b/inc/lang/th/diff.txt new file mode 100644 index 0000000..7e1d1d4 --- /dev/null +++ b/inc/lang/th/diff.txt @@ -0,0 +1,3 @@ +====== ความแตกต่าง ====== + +นี่เป็นการแสดงความแตกต่างระหว่างเพจสองรุ่น diff --git a/inc/lang/th/draft.txt b/inc/lang/th/draft.txt new file mode 100644 index 0000000..1dbbf92 --- /dev/null +++ b/inc/lang/th/draft.txt @@ -0,0 +1,5 @@ +====== พบไฟล์ฉบับร่าง ====== + +เซสชั่นที่คุณแก้ไขฉบับล่าสุดในเพจนี้ไม่ถูกจัดเก็บให้สมบูรณ์ โดกุวิกิได้ทำการบันทึกฉบับร่างให้โดยอัตโนมัติในระหว่างที่คุณกำลังทำงาน อันซึ่งขณะนี้คุณอาจต้องการใช้มันเพื่อแก้ไขต่อ ด้านล่างนี้คุณจะเห็นข้อมูลที่ถูกบันทึกไว้จากการทำงานครั้งล่าสุด + +กรุณาตัดสินใจว่าคุณต้องการที่จะ //กู้คืน//งานฉบับที่แก้ไขล่าสุด, //ลบทิ้ง/// ตัวฉบับร่างที่ได้บันทึกอัตโนมัติไว้, //ยกเลิก// กระบวนการแก้ไขนี้ diff --git a/inc/lang/th/edit.txt b/inc/lang/th/edit.txt new file mode 100644 index 0000000..83361c6 --- /dev/null +++ b/inc/lang/th/edit.txt @@ -0,0 +1 @@ +แก้ไขหน้านี้แล้วกด "บันทึก" ให้อ่าน[[wiki:syntax|ไวยกรณ์วิกิ]] สำหรับค้นหาไวยกรณ์ที่ใช้ในวิกิ และกรุณาแก้ไขเฉพาะเพจที่คุณสามารถ**ปรับปรุง**ให้มันดีขึ้นได้, ถ้าหากคุณต้องการที่จะทดสอบอะไรบางอย่าง ให้ไปลองเล่นครั้งแรกได้ใน[[playground:playground|สนามเด็กเล่น]] diff --git a/inc/lang/th/editrev.txt b/inc/lang/th/editrev.txt new file mode 100644 index 0000000..5da4867 --- /dev/null +++ b/inc/lang/th/editrev.txt @@ -0,0 +1,2 @@ +**คุณได้โหลดเอาเอกสารฉบับเก่าขึ้นมา!** ถ้าคุณบันทึกมัน คุณจะสร้างเอกสารรุ่นใหม่ด้วยข้อมูลเหล่านี้ +---- diff --git a/inc/lang/th/index.txt b/inc/lang/th/index.txt new file mode 100644 index 0000000..8bc7099 --- /dev/null +++ b/inc/lang/th/index.txt @@ -0,0 +1,3 @@ +====== ดัชนี ====== + +นี่คือดัชนีรวมทุกเพจ เรียงตาม[[doku>namespaces|เนมสเปซ]] diff --git a/inc/lang/th/jquery.ui.datepicker.js b/inc/lang/th/jquery.ui.datepicker.js new file mode 100644 index 0000000..41cef52 --- /dev/null +++ b/inc/lang/th/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Thai initialisation for the jQuery UI date picker plugin. */ +/* Written by pipo (pipo@sixhead.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.th = { + closeText: "ปิด", + prevText: "ย้อน", + nextText: "ถัดไป", + 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/inc/lang/th/lang.php b/inc/lang/th/lang.php new file mode 100644 index 0000000..62ee106 --- /dev/null +++ b/inc/lang/th/lang.php @@ -0,0 +1,306 @@ + + * @author Komgrit Niyomrath + * @author Arthit Suriyawongkul + * @author Kittithat Arnontavilas + * @author Thanasak Sompaisansin + * @author Yuthana Tantirungrotechai + * @author Amnuay + */ +$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 นาที เพื่อที่จะหลีกเลี่ยงข้อขัดแย้งให้ใช้ปุ่ม "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']['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'] = 'เชื่อมไปยังหน้าต่างแบ่งปัน ทำงานได้กับเฉพาะไมโครซอฟท์อินเตอร์เน็ตเอ็กซโปรเรอร์(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['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'] = 'ฉันอยากลบบัญชีผู้ใช้งานของฉันจากวิกินี้
    การดำเนินการนี้ไม่สามารถแก้ไขคืนได้ '; +$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'] = 'ต้องการตัวเล่นแฟลช Adobe Flash Plugin เพื่อแสดงผลเนื้อหานี้'; +$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'] = 'หัวเรื่องระดับที่ 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['img_width'] = 'ความกว้าง:'; +$lang['img_height'] = 'ความสูง:'; +$lang['subscr_subscribe_success'] = 'เพิ่ม %s ในรายการสมัครสมาชิก สำหรับ %s'; +$lang['subscr_subscribe_error'] = 'เกิดข้อผิดพลาดในการเพิ่ม %s ในรายการสมัครสมาชิก สำหรับ %s'; +$lang['subscr_subscribe_noaddress'] = 'ไม่มีที่อยู่ที่เกี่ยวข้องกับการเข้าสู่ระบบของคุณ จึงไม่สามารถเพิ่มลงในรายการสมัครสมาชิก'; +$lang['authtempfail'] = 'ระบบตรวจสอบสิทธิ์ผู้ใช้ไม่พร้อมใช้งานชั่วคราว หากสถานการณ์ยังไม่เปลี่ยนแปลง กรุณาแจ้งผู้ดูแลระบวิกิของคุณ'; +$lang['i_chooselang'] = 'เลือกภาษาของคุณ'; +$lang['i_installer'] = 'ตัวติดตั้งโดกุวิกิ'; +$lang['i_wikiname'] = 'ชื่อวิกิ'; +$lang['i_enableacl'] = 'เปิดระบบ ACL(แนะนำ)'; +$lang['i_superuser'] = 'ซุปเปอร์ยูสเซอร์'; +$lang['i_problems'] = 'ตัวติดตั้งพบปัญหาบางประการ ตามที่ระบุด้านล่าง คุณไม่สามารถทำต่อได้จนกว่าจะได้แก้ไขสิ่งเหล่านั้น'; +$lang['i_modified'] = 'ด้วยเหตุผลด้านความปลอดภัย สคริปต์นี้จะทำงานกับเฉพาะโดกุวิกิที่ติดตั้งใหม่หรือยังไม่ได้ดัดแปลงแก้ไข +คุณควรเลือกระหว่างคลี่ไฟล์จากแพคเกจที่ได้ดาวน์โหลดมาอีกครั้ง หรือศึกษาจากคู่มือ +Dokuwiki installation instructions'; +$lang['i_funcna'] = 'PHP function %s ไม่สามารถใช้งานได้ อาจเป็นเพราะผู้ให้บริการโฮสไม่เปิดให้ใช้งาน'; +$lang['i_phpver'] = 'PHP รุ่นที่คุณกำลังใช้งานอยู่คือ %s คุณจำเป็นต้องอัพเกรด PHP ให้เป็นรุ่น %s หรือสูงกว่า'; +$lang['i_permfail'] = '%s DokuWiki ไม่สามารถเขียนข้อมูลได้ ต้องตั้งค่าสิทธิ์การอนุญาตของไดเรคทอรีนี้เสียก่อน!'; +$lang['i_confexists'] = '%s ถูกใช้งานไปแล้ว'; +$lang['i_writeerr'] = 'ไม่สามารถสร้าง %s. ตรวจสอบสิทธิ์การอนุญาตของไดเรคทอรีหรือไฟล์ แล้วสร้างไฟล์ด้วยตนเอง'; +$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/inc/lang/th/locked.txt b/inc/lang/th/locked.txt new file mode 100644 index 0000000..a470808 --- /dev/null +++ b/inc/lang/th/locked.txt @@ -0,0 +1,3 @@ +====== เพจถูกล๊อค ====== + +เพจนี้กำลังถูกล๊อคจากการแก้ไขโดยผู้ใช้ท่านอื่น คุณต้องรอจนกว่าผู้ใช้คนนี้จะแก้ไขเสร็จ หรือการล๊อคนั้นหมดเวลา diff --git a/inc/lang/th/login.txt b/inc/lang/th/login.txt new file mode 100644 index 0000000..73be658 --- /dev/null +++ b/inc/lang/th/login.txt @@ -0,0 +1,3 @@ +====== ล็อกอิน ====== + +คุณยังไม่ได้เข้าสู่ระบบ(ล็อกอิน)ในขณะนี้! กรอกรายละเอียดเพื่อพิสูจน์สิทธิ์ข้างล่างนี้เพื่อล็อกอิน คุณต้องเปิดคุ๊กกี้ให้ทำงานก่อนที่จะล็อกอิน diff --git a/inc/lang/th/mailtext.txt b/inc/lang/th/mailtext.txt new file mode 100644 index 0000000..5dec222 --- /dev/null +++ b/inc/lang/th/mailtext.txt @@ -0,0 +1,12 @@ +เพจในโดกุวิกิของคุณได้ถูกเพิ่ม หรือแก้ไข นี่คือรายละเอียด: + +วันที่: @DATE@ +บราวเซอร์: @BROWSER@ +ที่อยู่ไอพี: @IPADDRESS@ +ชื่อโฮสต์: @HOSTNAME@ +ฉบับเก่า: @OLDPAGE@ +ฉบับใหม่: @NEWPAGE@ +สรุปการแก้ไข: @SUMMARY@ +ผู้ใช้: @USER@ + +@DIFF@ diff --git a/inc/lang/th/newpage.txt b/inc/lang/th/newpage.txt new file mode 100644 index 0000000..b9ffc75 --- /dev/null +++ b/inc/lang/th/newpage.txt @@ -0,0 +1,3 @@ +====== ยังไม่มีหัวข้อนี้ ====== + +คุณได้กดลิ้งค์เข้ามายังหัวข้อที่ยังไม่ได้สร้าง ถ้าคุณได้รับอนุญาติ คุณอาจจะสร้างมันได้ด้วยการกดปุ่ม **สร้างเพจนี้** diff --git a/inc/lang/th/norev.txt b/inc/lang/th/norev.txt new file mode 100644 index 0000000..61e6082 --- /dev/null +++ b/inc/lang/th/norev.txt @@ -0,0 +1,3 @@ +====== ไม่มีฉบับที่ระบุ ====== + +ฉบับที่ระบุไม่มีอยู่จริง กรุณาใช้ปุ่ม "ฉบับเก่าๆ" เพื่อแสดงรายการรุ่นเก่าๆของเอกสารนี้ิ diff --git a/inc/lang/th/password.txt b/inc/lang/th/password.txt new file mode 100644 index 0000000..e463e76 --- /dev/null +++ b/inc/lang/th/password.txt @@ -0,0 +1,6 @@ +สวัสดี@FULLNAME@! + +นี่คือข้อมูลผู้ใช้ของคุณสำหรับ @TITLE@ ที่ @DOKUWIKIURL@ + +ล็อกอิน: @LOGIN@ +รหัสผ่าน : @PASSWORD@ diff --git a/inc/lang/th/preview.txt b/inc/lang/th/preview.txt new file mode 100644 index 0000000..8e8f96a --- /dev/null +++ b/inc/lang/th/preview.txt @@ -0,0 +1,3 @@ +====== ดูตัวอย่าง ====== + +นี่คือหน้าตัวอย่างของข้อความที่คุณกรอก จำไว้ว่า: มันยัง **ไม่ได้บันทึก** เก็บไว้! diff --git a/inc/lang/th/pwconfirm.txt b/inc/lang/th/pwconfirm.txt new file mode 100644 index 0000000..fb5610f --- /dev/null +++ b/inc/lang/th/pwconfirm.txt @@ -0,0 +1,9 @@ +เฮ้ @FULLNAME@! + +มีบางคนร้องขอรหัสผ่านใหม่สำหรับ @TITLE@ ของคุณ เพื่อล็อกอินที่ @DOKUWIKIURL@ + +ถ้าคุรไม่ได้ร้องขอรหัสผ่านใหม่ ก็ไม่ต้องสนใจอีเมลนี้ + +หากต้องการยืนยันว่านี่การร้องขอนี้ถูกส่งโดยคุณจริงๆ กรุณาใช้ลิงค์ดังต่อไปนี้ + +@CONFIRM@ diff --git a/inc/lang/th/read.txt b/inc/lang/th/read.txt new file mode 100644 index 0000000..fe52759 --- /dev/null +++ b/inc/lang/th/read.txt @@ -0,0 +1 @@ +หน้านี้มีไว้อ่านอย่างเดียว คุณสามารถอ่านข้อความต้นฉบับ ไม่สามารถแก้ไขได้ ให้สอบถามผู้ดูแลระบบถ้าคุณคิดว่านี่คือข้อผิดพลาด diff --git a/inc/lang/th/recent.txt b/inc/lang/th/recent.txt new file mode 100644 index 0000000..c632c76 --- /dev/null +++ b/inc/lang/th/recent.txt @@ -0,0 +1,3 @@ +====== การเปลี่ยนแปลงเมื่อเร็วๆนี้ ====== + +เพจเหล่านี้ถูกเปลี่ยนแปลงเมื่อเร็วๆนี้: diff --git a/inc/lang/th/register.txt b/inc/lang/th/register.txt new file mode 100644 index 0000000..6d2772e --- /dev/null +++ b/inc/lang/th/register.txt @@ -0,0 +1,3 @@ +====== ลงทะเบียนเป็นผู้ใช้หน้าใหม่ ====== + +กรอกข้อมูลทั้งหมดด้านล่างเพื่อสร้างบัญชีใหม่ในวิกินี้ ให้แน่ใจว่าคุณให้ **ที่อยู่อีเมลที่ใช้ได้จริง** ถ้าคุณไม่ถูกถามให้กรอกรหัสผา่นที่นี่, รหัสผ่านใหม่จะถูกส่งไปยังที่อยู่ดังกล่าว ชื่อล็อกอินควรจะใช้ได้ถูกต้องตาม[[doku>pagename|pagename]]. diff --git a/inc/lang/th/registermail.txt b/inc/lang/th/registermail.txt new file mode 100644 index 0000000..4cfaddd --- /dev/null +++ b/inc/lang/th/registermail.txt @@ -0,0 +1,10 @@ +มีผู้ใช้คนใหม่ได้ลงทะเบียน นี่คือรายละเอียด: + +ชื่อผู้ใช้ : @NEWUSER@ +ชื่อเต็ม : @NEWNAME@ +อีเมล : @NEWEMAIL@ + +วันที่ : @DATE@ +บราวเซอร์ : @BROWSER@ +ที่อยู่ไอพี : @IPADDRESS@ +ชื่อโฮสต์ : @HOSTNAME@ diff --git a/inc/lang/th/resendpwd.txt b/inc/lang/th/resendpwd.txt new file mode 100644 index 0000000..73da702 --- /dev/null +++ b/inc/lang/th/resendpwd.txt @@ -0,0 +1,3 @@ +====== ส่งรหัสผ่านใหม่ ====== + +กรุณากรอกชื่อผู้ใช้ในช่องด้านล่างเพื่อร้องขอรหัสผ่านใหม่จากบัญชีของคุณในวิกินี้ ลิงค์ยืนยันจะถูกส่งไปยังที่อยู่อีเมลที่คุณลงทะเบียนไว้ diff --git a/inc/lang/th/revisions.txt b/inc/lang/th/revisions.txt new file mode 100644 index 0000000..e67b9c6 --- /dev/null +++ b/inc/lang/th/revisions.txt @@ -0,0 +1,3 @@ +====== ฉบับเก่า ====== + +เหล่านี้เป็นรายการฉบับเก่าของเอกสารปัจจุบัน หากต้องการคืนสภาพฉบับเก่า ให้เลือกมันจากด้านล่าง, คลิ๊ก "แก้ไขเพจนี้" แล้วจึงค่อยบันทึกมัน diff --git a/inc/lang/th/searchpage.txt b/inc/lang/th/searchpage.txt new file mode 100644 index 0000000..56d9c04 --- /dev/null +++ b/inc/lang/th/searchpage.txt @@ -0,0 +1,3 @@ +====== สืบค้น ====== + +คุณสามารถพบผลลัพธ์การสืบค้นของคุณด้านล่าง @CREATEPAGEINFO@ diff --git a/inc/lang/th/showrev.txt b/inc/lang/th/showrev.txt new file mode 100644 index 0000000..9dc0e89 --- /dev/null +++ b/inc/lang/th/showrev.txt @@ -0,0 +1,2 @@ +**นี่คือเอกสารรุ่น/ฉบับเก่า** +---- diff --git a/inc/lang/th/updateprofile.txt b/inc/lang/th/updateprofile.txt new file mode 100644 index 0000000..7a0d9cf --- /dev/null +++ b/inc/lang/th/updateprofile.txt @@ -0,0 +1,3 @@ +====== ปรับปรุงข้อมูลส่วนตัวของบัญชีคุณ ====== + +คุณเพียงต้องการกรอกช่องที่ต้องการแก้ไขเหล่านี้ให้ครบ แต่ไม่สามารถเปลี่ยนชื่อผู้ใช้ได้ diff --git a/inc/lang/th/uploadmail.txt b/inc/lang/th/uploadmail.txt new file mode 100644 index 0000000..9d042b9 --- /dev/null +++ b/inc/lang/th/uploadmail.txt @@ -0,0 +1,10 @@ +มีไฟล์ได้ถูกอัพโหลดเข้าไปยังโดกุวิกิของคุณ นี่คือรายละเอียด: + +ไฟล์: @MEDIA@ +วันที่: @DATE@ +เบราเซอร์: @BROWSER@ +ที่อยู่ไอพี: @IPADDRESS@ +ชื่อโฮสต์: @HOSTNAME@ +ขนาด: @SIZE@ +MIME Type : @MIME@ +ผู้ใช้: @USER@ diff --git a/inc/lang/tr/admin.txt b/inc/lang/tr/admin.txt new file mode 100644 index 0000000..2292b6e --- /dev/null +++ b/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/inc/lang/tr/adminplugins.txt b/inc/lang/tr/adminplugins.txt new file mode 100644 index 0000000..7c8de9d --- /dev/null +++ b/inc/lang/tr/adminplugins.txt @@ -0,0 +1 @@ +===== İlave Eklentiler ===== \ No newline at end of file diff --git a/inc/lang/tr/backlinks.txt b/inc/lang/tr/backlinks.txt new file mode 100644 index 0000000..ef71a2e --- /dev/null +++ b/inc/lang/tr/backlinks.txt @@ -0,0 +1,3 @@ +====== Geri linkler ====== + +Bu sayfaya bağlantı veren sayfaların listesi aşağıdadır. diff --git a/inc/lang/tr/conflict.txt b/inc/lang/tr/conflict.txt new file mode 100644 index 0000000..ba770bf --- /dev/null +++ b/inc/lang/tr/conflict.txt @@ -0,0 +1,5 @@ +====== 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/inc/lang/tr/denied.txt b/inc/lang/tr/denied.txt new file mode 100644 index 0000000..07f50f1 --- /dev/null +++ b/inc/lang/tr/denied.txt @@ -0,0 +1,3 @@ +====== Yetki Reddedildi ====== + +Üzgünüz, devam etmek için yetkiniz yok. diff --git a/inc/lang/tr/diff.txt b/inc/lang/tr/diff.txt new file mode 100644 index 0000000..b751949 --- /dev/null +++ b/inc/lang/tr/diff.txt @@ -0,0 +1,3 @@ +====== Farklar ====== + +Bu sayfanın seçili sürümü ile mevcut sürümü arasındaki farkları gösterir. diff --git a/inc/lang/tr/draft.txt b/inc/lang/tr/draft.txt new file mode 100644 index 0000000..0f759e7 --- /dev/null +++ b/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//. diff --git a/inc/lang/tr/edit.txt b/inc/lang/tr/edit.txt new file mode 100644 index 0000000..09d92ee --- /dev/null +++ b/inc/lang/tr/edit.txt @@ -0,0 +1 @@ +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/inc/lang/tr/editrev.txt b/inc/lang/tr/editrev.txt new file mode 100644 index 0000000..9c70fbe --- /dev/null +++ b/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/inc/lang/tr/index.txt b/inc/lang/tr/index.txt new file mode 100644 index 0000000..d42554b --- /dev/null +++ b/inc/lang/tr/index.txt @@ -0,0 +1,3 @@ +====== İndeks ====== + +Bu mevcut tüm sayfaların [[doku>namespaces|isim alanlarına]] göre sıralı bir indeksidir. diff --git a/inc/lang/tr/install.html b/inc/lang/tr/install.html new file mode 100644 index 0000000..d222aeb --- /dev/null +++ b/inc/lang/tr/install.html @@ -0,0 +1,7 @@ +

    Bu sayfa Dokuwiki kurmanıza yardımcı olmaktadır. Kurulum hakkında bilgi sahibi olmak için bu sayfayı ziyaret edebilirsiniz.

    + +

    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 mutlaka 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.

    + +

    Kurulum betiği ACL'yi otomatik olarak ayarlamaktadır. Böylece yönetici izinleri belirlenip, DokuWiki kullanımı kolaylaştırılmaktadır.

    + +

    Deneyimli kullanıcılar bu sayfayı edebilir ve bu sayfa yardımıyla yapılandırma hakkında ekstra bilgi sahibi olabilir.

    diff --git a/inc/lang/tr/jquery.ui.datepicker.js b/inc/lang/tr/jquery.ui.datepicker.js new file mode 100644 index 0000000..32eb3ed --- /dev/null +++ b/inc/lang/tr/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Turkish initialisation for the jQuery UI date picker plugin. */ +/* Written by Izzet Emre Erkan (kara@karalamalar.net). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.tr = { + closeText: "kapat", + prevText: "geri", + nextText: "ileri", + 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/inc/lang/tr/lang.php b/inc/lang/tr/lang.php new file mode 100644 index 0000000..5521e42 --- /dev/null +++ b/inc/lang/tr/lang.php @@ -0,0 +1,364 @@ + + * @author Hakan + * @author mahir + * @author Selim Farsakoğlu + * @author Aydın Coşkuner + * @author Cihan Kahveci + * @author Yavuz Selim + * @author Caleb Maclennan + * @author farukerdemoncel + * @author Mustafa Aslan + * @author huseyin can + * @author ilker rifat kapaç + * @author Mete Cuma + */ +$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['searchcreatepage'] = 'Eğer aradığınızı bulamadıysanız, %s sayfasını yaratabilir veya düzenleyebilirsiniz. '; +$lang['search_fullresults'] = 'Tam Metin sonuçları'; +$lang['js']['search_toggle_tools'] = 'Arama Araçlarını Değiştir'; +$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_diff_portions'] = 'Kaydır'; +$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['search_exact_match'] = 'Tam eşleşme'; +$lang['search_starts_with'] = 'Bununla başlar'; +$lang['search_ends_with'] = 'Bununla biter'; +$lang['search_contains'] = 'İçerir'; +$lang['search_custom_match'] = 'Özel'; +$lang['search_any_ns'] = 'Herhangi bir isim'; +$lang['search_any_time'] = 'Herhangi bir zaman'; +$lang['search_past_7_days'] = 'Geçen hafta'; +$lang['search_past_month'] = 'Geçen ay'; +$lang['search_past_year'] = 'Geçen yıl'; +$lang['search_sort_by_hits'] = 'Tıklanmaya göre sırala'; +$lang['search_sort_by_mtime'] = 'Son değiştirilmeye göre sırala'; +$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.
    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['allowedmime'] = 'İzin verilen dosya uzantılarının listesi'; +$lang['lockedby'] = 'Şu an şunun tarafından kilitli:'; +$lang['lockexpire'] = 'Kilitin açılma tarihi:'; +$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 Adobe Flash Eklentisi 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_digest'] = 'Her sayfa için değişikliklerin özet e-postası (her %.2f gün)'; +$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 adresindeki Dokuwiki kurulum kılavuzuna bakmalısınız.'; +$lang['i_funcna'] = '%s PHP fonksiyonu bulunmamaktadır. Barındırma(Hosting) hizmetinde bu özellik kapatılmış olabilir.'; +$lang['i_disabled'] = 'Sağlayıcınız tarafından devre dışı bırakılmış.'; +$lang['i_phpver'] = '%s PHP sürümü, gereken %s 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'] = '%s Dokuwiki tarafından yazılabilir değil. İzin ayarlarını bu klasör için düzeltmeniz gerekmektedir!'; +$lang['i_confexists'] = '%s zaten var'; +$lang['i_writeerr'] = '%s 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=%s)'; +$lang['i_badval'] = '%s - Yanlış veya boş değer'; +$lang['i_success'] = 'Kurulum başarıyla tamamlandı. Şimdi install.php dosyasını silebilirsiniz. Yeni DokuWikinizi kullanabilirsiniz.'; +$lang['i_failure'] = 'Ayar dosyalarını yazarken bazı hatalar oluştu. Yeni DokuWikinizi 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'] = '%s namespace\'i içerisinde yapılan değişiklikleri görüntülemektesiniz. Wiki\'deki tüm değişiklikleri de bu adresten 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['media_acl_warning'] = 'Bu sayfa ACL sınırlarından ve gizli sayfalardan dolayı eksik olabilir. '; +$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/inc/lang/tr/locked.txt b/inc/lang/tr/locked.txt new file mode 100644 index 0000000..7e04215 --- /dev/null +++ b/inc/lang/tr/locked.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/tr/login.txt b/inc/lang/tr/login.txt new file mode 100644 index 0000000..ce29b96 --- /dev/null +++ b/inc/lang/tr/login.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/tr/mailtext.txt b/inc/lang/tr/mailtext.txt new file mode 100644 index 0000000..dfcc39e --- /dev/null +++ b/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/inc/lang/tr/newpage.txt b/inc/lang/tr/newpage.txt new file mode 100644 index 0000000..79f5f2c --- /dev/null +++ b/inc/lang/tr/newpage.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/tr/norev.txt b/inc/lang/tr/norev.txt new file mode 100644 index 0000000..0c5e923 --- /dev/null +++ b/inc/lang/tr/norev.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/tr/password.txt b/inc/lang/tr/password.txt new file mode 100644 index 0000000..852811d --- /dev/null +++ b/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/inc/lang/tr/preview.txt b/inc/lang/tr/preview.txt new file mode 100644 index 0000000..28a9a4c --- /dev/null +++ b/inc/lang/tr/preview.txt @@ -0,0 +1,3 @@ +====== Önizleme ====== + +Bu yazınızın nasıl çıkacağının bir önizlemesi. **Unutma: Yazı henüz kaydedilmedi!** diff --git a/inc/lang/tr/pwconfirm.txt b/inc/lang/tr/pwconfirm.txt new file mode 100644 index 0000000..7e440e8 --- /dev/null +++ b/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/inc/lang/tr/read.txt b/inc/lang/tr/read.txt new file mode 100644 index 0000000..e6c0f5d --- /dev/null +++ b/inc/lang/tr/read.txt @@ -0,0 +1 @@ +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/inc/lang/tr/recent.txt b/inc/lang/tr/recent.txt new file mode 100644 index 0000000..f193f3f --- /dev/null +++ b/inc/lang/tr/recent.txt @@ -0,0 +1,3 @@ +====== Son değişiklikler ====== + +Aşağıdaki sayfalar yakın zamanda değiştirildi: diff --git a/inc/lang/tr/register.txt b/inc/lang/tr/register.txt new file mode 100644 index 0000000..73e1636 --- /dev/null +++ b/inc/lang/tr/register.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/tr/registermail.txt b/inc/lang/tr/registermail.txt new file mode 100644 index 0000000..26ff739 --- /dev/null +++ b/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/inc/lang/tr/resendpwd.txt b/inc/lang/tr/resendpwd.txt new file mode 100644 index 0000000..1a34396 --- /dev/null +++ b/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/inc/lang/tr/resetpwd.txt b/inc/lang/tr/resetpwd.txt new file mode 100644 index 0000000..df98be6 --- /dev/null +++ b/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. diff --git a/inc/lang/tr/revisions.txt b/inc/lang/tr/revisions.txt new file mode 100644 index 0000000..58fad4a --- /dev/null +++ b/inc/lang/tr/revisions.txt @@ -0,0 +1,3 @@ +====== 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/inc/lang/tr/searchpage.txt b/inc/lang/tr/searchpage.txt new file mode 100644 index 0000000..4ea7f45 --- /dev/null +++ b/inc/lang/tr/searchpage.txt @@ -0,0 +1,3 @@ +====== Arama ====== + +Aşağıda aramanın sonuçları listelenmiştir. @CREATEPAGEINFO@ diff --git a/inc/lang/tr/showrev.txt b/inc/lang/tr/showrev.txt new file mode 100644 index 0000000..4cf3d26 --- /dev/null +++ b/inc/lang/tr/showrev.txt @@ -0,0 +1,2 @@ +**Bu, dökümanın eski bir sürümüdür!** +---- diff --git a/inc/lang/tr/stopwords.txt b/inc/lang/tr/stopwords.txt new file mode 100644 index 0000000..293067a --- /dev/null +++ b/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/inc/lang/tr/subscr_form.txt b/inc/lang/tr/subscr_form.txt new file mode 100644 index 0000000..21a8fba --- /dev/null +++ b/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/inc/lang/tr/updateprofile.txt b/inc/lang/tr/updateprofile.txt new file mode 100644 index 0000000..20b07f9 --- /dev/null +++ b/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/inc/lang/tr/uploadmail.txt b/inc/lang/tr/uploadmail.txt new file mode 100644 index 0000000..92feef2 --- /dev/null +++ b/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/inc/lang/uk/admin.txt b/inc/lang/uk/admin.txt new file mode 100644 index 0000000..b8123fe --- /dev/null +++ b/inc/lang/uk/admin.txt @@ -0,0 +1,3 @@ +====== Адміністрування ====== + +Нижче ви можете знайти перелік адміністративних задач, що наявні в ДокуВікі. diff --git a/inc/lang/uk/adminplugins.txt b/inc/lang/uk/adminplugins.txt new file mode 100644 index 0000000..3689ccd --- /dev/null +++ b/inc/lang/uk/adminplugins.txt @@ -0,0 +1 @@ +===== Додаткові плагіни ===== \ No newline at end of file diff --git a/inc/lang/uk/backlinks.txt b/inc/lang/uk/backlinks.txt new file mode 100644 index 0000000..5f293e5 --- /dev/null +++ b/inc/lang/uk/backlinks.txt @@ -0,0 +1,3 @@ +====== Зворотні зв'язки ====== + +Це перелік сторінок, які, здається, посилаються на поточну сторінку. diff --git a/inc/lang/uk/conflict.txt b/inc/lang/uk/conflict.txt new file mode 100644 index 0000000..cbd3ba2 --- /dev/null +++ b/inc/lang/uk/conflict.txt @@ -0,0 +1,7 @@ +====== Існує більш нова версія ====== + +Існує новіша версія документу, що ви редагували. Це може статися, коли інший користувач змінив документ під час вашого редагування. + +Уважно перегляньте розбіжності та вирішіть, яку версію залишити. Якщо ви натиснете +''зберегти'', буде збережена ваша версія. Якщо натиснете ''скасувати'' --- то залишиться +поточна версія. diff --git a/inc/lang/uk/denied.txt b/inc/lang/uk/denied.txt new file mode 100644 index 0000000..7788228 --- /dev/null +++ b/inc/lang/uk/denied.txt @@ -0,0 +1,3 @@ +====== Доступ заборонено ====== + +Вибачте, але у вас не вистачає прав для продовження. diff --git a/inc/lang/uk/diff.txt b/inc/lang/uk/diff.txt new file mode 100644 index 0000000..b639423 --- /dev/null +++ b/inc/lang/uk/diff.txt @@ -0,0 +1,3 @@ +====== Розбіжності ====== + +Тут показані розбіжності між вибраною ревізією та поточною версією сторінки. diff --git a/inc/lang/uk/draft.txt b/inc/lang/uk/draft.txt new file mode 100644 index 0000000..aa47c9f --- /dev/null +++ b/inc/lang/uk/draft.txt @@ -0,0 +1,5 @@ +====== Знайдено чернетку ====== + +Останнє редагування цієї сторінки не було завершено коректно. ДокуВікі автоматично зберегла чернетку під час вашої роботи. Ви можете використати чернетку для продовження редагування. Нижче ви можете побачити дані, збережені з попереднього сеансу. + +Будь ласка вирішить, чи ви бажаєте //відновити// останній сеанс редагування, //знищити// збережену чернетку або //скасувати// редагування. diff --git a/inc/lang/uk/edit.txt b/inc/lang/uk/edit.txt new file mode 100644 index 0000000..82dbc1a --- /dev/null +++ b/inc/lang/uk/edit.txt @@ -0,0 +1 @@ +Відредагуйте сторінку та натисніть ''Зберегти''. Використовуйте [[wiki:syntax|посібник]] з синтаксису для довідки. Будь ласка, змінюйте сторінку лише у тому випадку, коли ви можете **покращити** її. Якщо ви бажаєте щось спробувати, використовуйте спеціальну сторінку [[playground:playground]] diff --git a/inc/lang/uk/editrev.txt b/inc/lang/uk/editrev.txt new file mode 100644 index 0000000..aae86fa --- /dev/null +++ b/inc/lang/uk/editrev.txt @@ -0,0 +1,2 @@ +**Ви завантажили стару версію документу!** Якщо ви збережете її, ви створите нову версію з ціми даними. +---- diff --git a/inc/lang/uk/index.txt b/inc/lang/uk/index.txt new file mode 100644 index 0000000..f6fb56c --- /dev/null +++ b/inc/lang/uk/index.txt @@ -0,0 +1,3 @@ +====== Зміст ====== + +Це перелік усіх доступних сторінок, упоряджених за [[doku>namespaces|просторами імен]] diff --git a/inc/lang/uk/install.html b/inc/lang/uk/install.html new file mode 100644 index 0000000..b672976 --- /dev/null +++ b/inc/lang/uk/install.html @@ -0,0 +1,7 @@ +

    Ця сторінка допомагає при першій установці та налаштуванні ДокуВікі. Більше інформації про програму установки можна знайти на сторінці документації.

    + +

    ДокуВікі використовую звичайні файли для зберігання сторінок вікі та іншої інформації, щодо цих сторінок (наприклад, зображень, індексів пошуку, старих ревізій та ін.). Для успішного функціонування ДокуВікі має мати права на запис для папок, що містять ці файли. Ця програма установки не може змінювати права доступу. Звичайно це робиться за допомогою інтерпретатора shell, або, якщо ви використовуєте хостинг, за допомогою FTP або панелі управління хостингом (наприклад cPanel).

    + +

    Ця програма установки налаштує вашу ДокуВікі для використання ACL, що, в свою чергу, дозволить адміністратору входити до адміністративного меню для установки доданків, керування користувачами, керування правами доступу до сторінок Вікі та змін параметрів конфігурації. Це не є обов'язковим для роботи ДокуВікі, але зробить життя адміністратора значно легшим.

    + +

    Досвідчені користувачі, або користувачі, що мають особливі вимоги до налагодження, мають використовувати ці посилання для детальної інформації, щодо інструкцій з установки та параметрів конфігурації.

    diff --git a/inc/lang/uk/jquery.ui.datepicker.js b/inc/lang/uk/jquery.ui.datepicker.js new file mode 100644 index 0000000..c273fd6 --- /dev/null +++ b/inc/lang/uk/jquery.ui.datepicker.js @@ -0,0 +1,41 @@ +/* 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 ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.uk = { + 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.uk ); + +return datepicker.regional.uk; + +} ); diff --git a/inc/lang/uk/lang.php b/inc/lang/uk/lang.php new file mode 100644 index 0000000..feaf17c --- /dev/null +++ b/inc/lang/uk/lang.php @@ -0,0 +1,378 @@ + + * @author Mykhailo + * @author velmyshanovnyi + * @author Dmytro Marchenko + * @author Oleksii + * @author Vitaly + * @author Oleksiy Voronin + * @author serg_stetsuk + * @author Oleksandr Kunytsia + * @author Uko + * @author Ulrikhe Lukoie + * @author Egor Smkv + * @author Max Lyashuk + * @author Pavel + * @author Maksim + * @author Nina Zolotova + * @author Roman + */ +$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['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'] = 'Посилання на мережеві папки працює лише в 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['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'] = 'Користувача створено. Пароль відправлено на 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['proftokenlegend'] = 'Токен авторизації'; +$lang['proftokengenerate'] = 'Скинути токен'; +$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['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['unknowndate'] = 'Невідома дата'; +$lang['noflash'] = 'Для перегляду цієї сторінки необхідно встановити Adobe Flash Plugin.'; +$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'] = 'З причин безпеки цей скрипт буде працювати тільки з новою та немодифікованою установкою ДокуВікі. +Вам слід або ще раз розпакувати файли із завантаженого пакету, або звернутися до повної інструкції з установки ДокуВікі'; +$lang['i_funcna'] = 'Функція PHP %s не доступна. Можливо, хостинг-провайдер відключив її з якихось причин?'; +$lang['i_disabled'] = 'Його було вимкнено вашим провайдером'; +$lang['i_phpver'] = 'Версія PHP %s менша, ніж необхідно - %s. Необхідно оновити PHP.'; +$lang['i_mbfuncoverload'] = 'mbstring.func_overload має бути вимкнена у php.ini щоб запустити DokuWiki.'; +$lang['i_permfail'] = 'ДокуВікі не має прав на запис %s. Необхідно змінити права доступа для цієї папки!'; +$lang['i_confexists'] = '%s вже існує'; +$lang['i_writeerr'] = 'Неможливо створити %s. Необхідно перевірити права доступа для файлу/папки та створити файл вручну.'; +$lang['i_badhash'] = 'Невпізнаний або модифікований dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - невірне або пусте значення.'; +$lang['i_success'] = 'Налаштування завершено. Ви можете знищити файл install.php. +Перейдіть до вашої нової ДокуВікі'; +$lang['i_failure'] = 'При збереженні файлу конфігурації виникли помилки. Можливо вам доведеться виправити їх самостійно +до початку використання вашої нової ДокуВікі.'; +$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'] = 'Ви переглядаєте зміни в межах простору імен %s. Також можна переглянути зміни в межах усієї Вікі.'; +$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 відсутня. Може бути створена як %s.'; +$lang['unable_to_parse_date'] = 'Не можливо розібрати параметр "%s" '; +$lang['email_signature_text'] = 'Це повідомлення було створене ДокуВікі з +@DOKUWIKIURL@'; +$lang['log_file_failed_to_open'] = 'Помилка при відкритті файлу логів'; diff --git a/inc/lang/uk/locked.txt b/inc/lang/uk/locked.txt new file mode 100644 index 0000000..8cdf394 --- /dev/null +++ b/inc/lang/uk/locked.txt @@ -0,0 +1,3 @@ +====== Сторінку заблоковано ====== + +Цю сторінку заблоковано іншим користувачем для редагування. Зачекайте, поки цей користувач завершить редагування або закінчиться час блокування. diff --git a/inc/lang/uk/login.txt b/inc/lang/uk/login.txt new file mode 100644 index 0000000..bc33151 --- /dev/null +++ b/inc/lang/uk/login.txt @@ -0,0 +1,3 @@ +====== Вхід до вікі ====== + +Ви не ввійшли до системи. Введіть ваші реєстраційні дані для того, щоб увійти. У вашому браузері повинні бути увімкнені файли cookies. diff --git a/inc/lang/uk/mailtext.txt b/inc/lang/uk/mailtext.txt new file mode 100644 index 0000000..4f3072c --- /dev/null +++ b/inc/lang/uk/mailtext.txt @@ -0,0 +1,12 @@ +Сторінка в вашому ДокуВікі була змінена. Деталі нижче: + +Дата : @DATE@ +Оглядач : @BROWSER@ +Адреса IP : @IPADDRESS@ +Ім'я вузла : @HOSTNAME@ +Стара ревізія: @OLDPAGE@ +Нова ревізія : @NEWPAGE@ +Підсумок змін : @SUMMARY@ +Користувач : @USER@ + +@DIFF@ diff --git a/inc/lang/uk/newpage.txt b/inc/lang/uk/newpage.txt new file mode 100644 index 0000000..70fee6a --- /dev/null +++ b/inc/lang/uk/newpage.txt @@ -0,0 +1,3 @@ +====== Сторінка ще не існує ====== + +Ви прийшли за посиланням на сторінку, що ще не існує. Якщо ваші права дозволяють, ви можете створити цю сторінку натиснувши кнопку **Створити сторінку**. diff --git a/inc/lang/uk/norev.txt b/inc/lang/uk/norev.txt new file mode 100644 index 0000000..09d2cf7 --- /dev/null +++ b/inc/lang/uk/norev.txt @@ -0,0 +1,3 @@ +====== Немає такої ревізії ====== + +Вказана ревізія не існує. Використовуйте кнопку ''Старі ревізії'', щоб отримати перелік ревізій цього документу. diff --git a/inc/lang/uk/password.txt b/inc/lang/uk/password.txt new file mode 100644 index 0000000..7db9be3 --- /dev/null +++ b/inc/lang/uk/password.txt @@ -0,0 +1,6 @@ +Доброго дня, @FULLNAME@! + +Ваші дані користувача для @TITLE@ на @DOKUWIKIURL@ + +Login : @LOGIN@ +Password : @PASSWORD@ diff --git a/inc/lang/uk/preview.txt b/inc/lang/uk/preview.txt new file mode 100644 index 0000000..f74e9a5 --- /dev/null +++ b/inc/lang/uk/preview.txt @@ -0,0 +1,3 @@ +====== Попередній перегляд ====== + +Це попередній перегляд того, як буде виглядати ваш текст. **Не забувайте, текст ще не збережено**! diff --git a/inc/lang/uk/pwconfirm.txt b/inc/lang/uk/pwconfirm.txt new file mode 100644 index 0000000..d100779 --- /dev/null +++ b/inc/lang/uk/pwconfirm.txt @@ -0,0 +1,9 @@ +Доброго дня, @FULLNAME@! + +Хтось запитав новий пароль для користувача @TITLE@ на @DOKUWIKIURL@ + +Якщо це були не ви, ігноруйте це повідомлення. + +Для підтвердження, що це дійсно ви запитали новий пароль, будь ласка перейдіть за наступним посиланням. + +@CONFIRM@ diff --git a/inc/lang/uk/read.txt b/inc/lang/uk/read.txt new file mode 100644 index 0000000..352ae35 --- /dev/null +++ b/inc/lang/uk/read.txt @@ -0,0 +1 @@ +Ця сторінка доступна тільки для перегляду. Ви можете продивитися вихідний текст, але не можете змінювати його. Якщо ви вважаєте, що це не вірно, зверніться до адміністратора. diff --git a/inc/lang/uk/recent.txt b/inc/lang/uk/recent.txt new file mode 100644 index 0000000..4c211f4 --- /dev/null +++ b/inc/lang/uk/recent.txt @@ -0,0 +1,3 @@ +====== Останні зміни ====== + +Вказані нижче сторінки було змінено нещодавно: diff --git a/inc/lang/uk/register.txt b/inc/lang/uk/register.txt new file mode 100644 index 0000000..6bdc836 --- /dev/null +++ b/inc/lang/uk/register.txt @@ -0,0 +1,3 @@ +====== Реєстрація нового користувача ====== + +Введіть необхідну інформацію для того, щоб створити нового користувача у цій Вікі. Переконайтеся. що ви ввели **правильну адресу e-mail** - якщо ви не ввели пароль, то новий пароль буде відіслано на цю адресу. Ім'я користувача повинно бути дозволеною [[doku>ru:pagename|назвою сторінки]] вікі. diff --git a/inc/lang/uk/registermail.txt b/inc/lang/uk/registermail.txt new file mode 100644 index 0000000..14f0e4b --- /dev/null +++ b/inc/lang/uk/registermail.txt @@ -0,0 +1,10 @@ +Зареєстровано нового користувача. Перегляньте деталі: + +Користувач : @NEWUSER@ +Повне ім'я : @NEWNAME@ +E-Mail : @NEWEMAIL@ + +Дата : @DATE@ +Браузер : @BROWSER@ +Адреса IP : @IPADDRESS@ +Назва хосту : @HOSTNAME@ diff --git a/inc/lang/uk/resendpwd.txt b/inc/lang/uk/resendpwd.txt new file mode 100644 index 0000000..208efad --- /dev/null +++ b/inc/lang/uk/resendpwd.txt @@ -0,0 +1,3 @@ +====== Надіслати новий пароль ====== + +Заповніть відомості для того, щоб отримати новий пароль у цій Вікі. Новий пароль буде надіслано на e-mail, що вказано у реєстраційних даних. Ім'я користувача повинно бути дозволеним іменем користувача Вікі. diff --git a/inc/lang/uk/resetpwd.txt b/inc/lang/uk/resetpwd.txt new file mode 100644 index 0000000..a673429 --- /dev/null +++ b/inc/lang/uk/resetpwd.txt @@ -0,0 +1,3 @@ +====== Встановити новий пароль ====== + +Будь-ласка, введіть новий пароль для цієї wiki. diff --git a/inc/lang/uk/revisions.txt b/inc/lang/uk/revisions.txt new file mode 100644 index 0000000..6baca89 --- /dev/null +++ b/inc/lang/uk/revisions.txt @@ -0,0 +1,3 @@ +====== Старі ревізії ====== + +Це старі версії поточного документа. Для того, щоб повернутися до старої версії, виберіть її, натисніть ''Редагувати'', та збережіть сторінку. diff --git a/inc/lang/uk/searchpage.txt b/inc/lang/uk/searchpage.txt new file mode 100644 index 0000000..67a7129 --- /dev/null +++ b/inc/lang/uk/searchpage.txt @@ -0,0 +1,3 @@ +====== Пошук ====== + +Дивіться результати пошуку нижче. @CREATEPAGEINFO@ diff --git a/inc/lang/uk/showrev.txt b/inc/lang/uk/showrev.txt new file mode 100644 index 0000000..2706b35 --- /dev/null +++ b/inc/lang/uk/showrev.txt @@ -0,0 +1,2 @@ +**Це стара версія документу!** +---- diff --git a/inc/lang/uk/stopwords.txt b/inc/lang/uk/stopwords.txt new file mode 100644 index 0000000..56dc48d --- /dev/null +++ b/inc/lang/uk/stopwords.txt @@ -0,0 +1,4 @@ +# Це список ігнорованих індексатором слів, одне слово в рядку +# При редагуванні цього файлу переконайтеся, що використовуєте символи переведення рядку, як в UNIX (одиночні) +# Слова, коротші за 3 символи включати не треба. Вони ігноруються в будь-якому випадку +www diff --git a/inc/lang/uk/subscr_digest.txt b/inc/lang/uk/subscr_digest.txt new file mode 100644 index 0000000..c226e29 --- /dev/null +++ b/inc/lang/uk/subscr_digest.txt @@ -0,0 +1,14 @@ +Доброго дня! + +Сторінку @PAGE@ у @TITLE@ було змінено. +Зміни, які відбулися: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Стара версія: @OLDPAGE@ +Нова версія: @NEWPAGE@ + +Щоб відмовитися від повідомлень про редагування сторінок, зайдіть під своїм ім'ям на сайт @DOKUWIKIURL@, потім відвідайте сторінку @SUBSCRIBE@ +та відпишіться від повідомлень про зміну сторінки та/або простору імен. diff --git a/inc/lang/uk/subscr_form.txt b/inc/lang/uk/subscr_form.txt new file mode 100644 index 0000000..1c9d6d2 --- /dev/null +++ b/inc/lang/uk/subscr_form.txt @@ -0,0 +1,3 @@ +====== Керування підписками ====== + +Ця сторінка дозволяє Вам керувати Вашими підписками для цієї сторінки та простору імен. \ No newline at end of file diff --git a/inc/lang/uk/subscr_list.txt b/inc/lang/uk/subscr_list.txt new file mode 100644 index 0000000..6c4001f --- /dev/null +++ b/inc/lang/uk/subscr_list.txt @@ -0,0 +1,11 @@ +Доброго дня! + +Було змінено сторінки простору імен @PAGE@ у @TITLE@. +Зміни, які вібдулися: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Щоб відмовитися від повідомлень про редагування сторінок, зайдіть під своїм ім'ям на сайт @DOKUWIKIURL@, потім відвідайте сторінку @SUBSCRIBE@ +та відпишіться від повідомлень про зміну сторінки та/або простору імен. diff --git a/inc/lang/uk/subscr_single.txt b/inc/lang/uk/subscr_single.txt new file mode 100644 index 0000000..658bae5 --- /dev/null +++ b/inc/lang/uk/subscr_single.txt @@ -0,0 +1,17 @@ +Доброго часу! + +Сторінку @PAGE@ у @TITLE@ було змінено. +Зміни, що відбулися: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Дата : @DATE@ +Користувач : @USER@ +Підсумок: @SUMMARY@ +Стара версія: @OLDPAGE@ +Нова версія: @NEWPAGE@ + +Щоб відмовитися від повідомлень про редагування сторінок, зайдіть під своїм ім'ям на сайт @DOKUWIKIURL@, потім відвідайте сторінку @NEWPAGE@ +та відпишіться від повідомлень про зміну сторінки та/або простору імен. diff --git a/inc/lang/uk/updateprofile.txt b/inc/lang/uk/updateprofile.txt new file mode 100644 index 0000000..9c5f111 --- /dev/null +++ b/inc/lang/uk/updateprofile.txt @@ -0,0 +1,3 @@ +====== Оновити ваш профіль ====== + +Необхідно заповнити тільки ті поля, які ви бажаєте змінити. Ви не можете змінити ім’я користувача. diff --git a/inc/lang/uk/uploadmail.txt b/inc/lang/uk/uploadmail.txt new file mode 100644 index 0000000..ee982c8 --- /dev/null +++ b/inc/lang/uk/uploadmail.txt @@ -0,0 +1,10 @@ +На вашу ДокуВікі завантажено файл. Деталі: + +Файл : @MEDIA@ +Дата : @DATE@ +Браузер : @BROWSER@ +IP-Адреса : @IPADDRESS@ +Назва вузла : @HOSTNAME@ +Розмір : @SIZE@ +Тип MIME : @MIME@ +Користувач : @USER@ diff --git a/inc/lang/uz/admin.txt b/inc/lang/uz/admin.txt new file mode 100644 index 0000000..e0490cd --- /dev/null +++ b/inc/lang/uz/admin.txt @@ -0,0 +1 @@ +Administratsiya \ No newline at end of file diff --git a/inc/lang/uz/adminplugins.txt b/inc/lang/uz/adminplugins.txt new file mode 100644 index 0000000..ae48492 --- /dev/null +++ b/inc/lang/uz/adminplugins.txt @@ -0,0 +1 @@ +Qo'shimcha plaginlar \ No newline at end of file diff --git a/inc/lang/uz/conflict.txt b/inc/lang/uz/conflict.txt new file mode 100644 index 0000000..96127bf --- /dev/null +++ b/inc/lang/uz/conflict.txt @@ -0,0 +1 @@ +Yangi versiya mavjud \ No newline at end of file diff --git a/inc/lang/uz/denied.txt b/inc/lang/uz/denied.txt new file mode 100644 index 0000000..73ba59b --- /dev/null +++ b/inc/lang/uz/denied.txt @@ -0,0 +1 @@ +Ruxsat etilmagan \ No newline at end of file diff --git a/inc/lang/uz/diff.txt b/inc/lang/uz/diff.txt new file mode 100644 index 0000000..c1865c9 --- /dev/null +++ b/inc/lang/uz/diff.txt @@ -0,0 +1 @@ +Farqlari \ No newline at end of file diff --git a/inc/lang/uz/index.txt b/inc/lang/uz/index.txt new file mode 100644 index 0000000..3aa1f1c --- /dev/null +++ b/inc/lang/uz/index.txt @@ -0,0 +1 @@ +Sayt xaritasi \ No newline at end of file diff --git a/inc/lang/uz/lang.php b/inc/lang/uz/lang.php new file mode 100644 index 0000000..3e01dc9 --- /dev/null +++ b/inc/lang/uz/lang.php @@ -0,0 +1,25 @@ + + */ +$lang['btn_edit'] = 'Ushbu sahifani tahrirlash'; +$lang['btn_show'] = 'Sahifani ko\'rsatish'; +$lang['btn_create'] = 'Sahifa yaratish'; +$lang['btn_search'] = 'Izlash'; +$lang['btn_save'] = 'Saqlash'; +$lang['btn_preview'] = 'Namoyish'; +$lang['btn_top'] = 'Yuqoriga'; +$lang['btn_revs'] = 'Avvalgi versiyalari'; +$lang['btn_recent'] = 'So\'nggi o\'zgarishlar'; +$lang['btn_upload'] = 'Yuklash'; +$lang['btn_cancel'] = 'Bekor qilish'; +$lang['btn_index'] = 'Sayt xaritasi'; +$lang['btn_secedit'] = 'Tahrirlash'; +$lang['btn_delete'] = 'O\'chirish'; +$lang['btn_back'] = 'Ortga'; +$lang['btn_profile'] = 'Profilni yangilash'; +$lang['btn_resendpwd'] = 'Yangi parol o\'rnatish'; +$lang['btn_draft'] = 'Qoralamani tahrirlash'; diff --git a/inc/lang/vi/admin.txt b/inc/lang/vi/admin.txt new file mode 100644 index 0000000..1923bc8 --- /dev/null +++ b/inc/lang/vi/admin.txt @@ -0,0 +1,3 @@ +====== Quản lý ====== + +Dưới đây bạn có thể tìm thấy một danh sách các tác vụ quản lý có sẵn trong DokuWiki. diff --git a/inc/lang/vi/adminplugins.txt b/inc/lang/vi/adminplugins.txt new file mode 100644 index 0000000..89f8165 --- /dev/null +++ b/inc/lang/vi/adminplugins.txt @@ -0,0 +1 @@ +===== Plugin bổ sung ===== \ No newline at end of file diff --git a/inc/lang/vi/backlinks.txt b/inc/lang/vi/backlinks.txt new file mode 100644 index 0000000..fb54022 --- /dev/null +++ b/inc/lang/vi/backlinks.txt @@ -0,0 +1,3 @@ +====== Liên kết đến đây ====== + +Đây là danh sách các trang có liên kết đến trang hiện tại. diff --git a/inc/lang/vi/conflict.txt b/inc/lang/vi/conflict.txt new file mode 100644 index 0000000..f54e6ea --- /dev/null +++ b/inc/lang/vi/conflict.txt @@ -0,0 +1,5 @@ +====== Có phiên bản mới hơn tồn tại ====== + +Một phiên bản mới hơn của tài liệu bạn sửa đổi tồn tại. Điều này xảy ra khi một thành viên khác thay đổi tài liệu trong khi bạn đang sửa đổi nó. + +Kiểm tra khác biệt được hiển thị dưới đây, sau đó hãy quyết định giữ phiên bản nào. Nếu bạn chọn ''Lưu'', phiên bản của bạn sẽ được lưu. Nhấn ''Hủy bỏ'' để giữ phiên bản hiện tại. diff --git a/inc/lang/vi/denied.txt b/inc/lang/vi/denied.txt new file mode 100644 index 0000000..aad47cf --- /dev/null +++ b/inc/lang/vi/denied.txt @@ -0,0 +1,3 @@ +====== Không có quyền thực hiện ====== + +Xin lỗi, bạn không có đủ quyền để tiếp tục. diff --git a/inc/lang/vi/diff.txt b/inc/lang/vi/diff.txt new file mode 100644 index 0000000..821d22c --- /dev/null +++ b/inc/lang/vi/diff.txt @@ -0,0 +1,3 @@ +====== Khác biệt ====== + +Đây là những khác biệt giữa hai phiên bản của trang. diff --git a/inc/lang/vi/draft.txt b/inc/lang/vi/draft.txt new file mode 100644 index 0000000..5fb64f7 --- /dev/null +++ b/inc/lang/vi/draft.txt @@ -0,0 +1,5 @@ +====== Tìm thấy tập tin nháp ====== + +Phiên sửa đổi cuối cùng của bạn trên trang này không được hoàn thành chính xác. DokuWiki tự động lưu một bản nháp trong khi bạn đang sửa đổi mà bây giờ bạn có thể sử dụng để tiếp tục sửa đổi. Bạn có thể thấy dữ liệu dưới đây được lưu từ phiên trước của bạn. + +Vui lòng quyết định nếu bạn muốn //khôi phục// phiên sửa đổi bị mất của bạn, //xóa// bản nháp được lưu tự động hoặc //hủy bỏ// quá trình sửa đổi. \ No newline at end of file diff --git a/inc/lang/vi/edit.txt b/inc/lang/vi/edit.txt new file mode 100644 index 0000000..5bf6377 --- /dev/null +++ b/inc/lang/vi/edit.txt @@ -0,0 +1 @@ +Sửa đổi trang này và nhấn ''Lưu''. Xem [[wiki:syntax]] cho cú pháp Wiki. Vui lòng chỉ sửa đổi trang nếu bạn có thể **cải thiện** nó. Nếu bạn muốn thử một số thứ, hãy học cách thực hiện những bước đầu tiên của bạn tại [[playground:playground|chỗ thử]]. diff --git a/inc/lang/vi/editrev.txt b/inc/lang/vi/editrev.txt new file mode 100644 index 0000000..a7c0261 --- /dev/null +++ b/inc/lang/vi/editrev.txt @@ -0,0 +1,2 @@ +**Bạn đã tải một phiên bản cũ của tài liệu!** Nếu bạn lưu nó, bạn sẽ tạo một phiên bản mới với dữ liệu này. +---- diff --git a/inc/lang/vi/index.txt b/inc/lang/vi/index.txt new file mode 100644 index 0000000..42c186d --- /dev/null +++ b/inc/lang/vi/index.txt @@ -0,0 +1,3 @@ +====== Sơ đồ trang web ====== + +Đây là sơ đồ trang web chứa tất cả các trang có sẵn được sắp xếp theo [[doku>namespaces|không gian tên]]. diff --git a/inc/lang/vi/jquery.ui.datepicker.js b/inc/lang/vi/jquery.ui.datepicker.js new file mode 100644 index 0000000..8664c4f --- /dev/null +++ b/inc/lang/vi/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Vietnamese initialisation for the jQuery UI date picker plugin. */ +/* Translated by Le Thanh Huy (lthanhhuy@cit.ctu.edu.vn). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional.vi = { + closeText: "Đóng", + prevText: "Trước", + nextText: "Tiếp", + 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/inc/lang/vi/lang.php b/inc/lang/vi/lang.php new file mode 100644 index 0000000..97e33fc --- /dev/null +++ b/inc/lang/vi/lang.php @@ -0,0 +1,373 @@ + + * @author Minh + * @author Thien Hau + * @author James Do + */ +$lang['encoding'] = 'utf-8'; +$lang['direction'] = 'ltr'; +$lang['doublequoteopening'] = '“'; +$lang['doublequoteclosing'] = '”'; +$lang['singlequoteopening'] = '‘'; +$lang['singlequoteclosing'] = '’'; +$lang['apostrophe'] = '’'; +$lang['btn_edit'] = 'Sửa đổi trang này'; +$lang['btn_source'] = 'Xem mã nguồn trang'; +$lang['btn_show'] = 'Xem trang'; +$lang['btn_create'] = 'Tạo trang này'; +$lang['btn_search'] = 'Tìm kiếm'; +$lang['btn_save'] = 'Lưu'; +$lang['btn_preview'] = 'Xem trước'; +$lang['btn_top'] = 'Quay lên trên'; +$lang['btn_newer'] = '<< mới hơn'; +$lang['btn_older'] = 'cũ hơn >>'; +$lang['btn_revs'] = 'Phiên bản cũ'; +$lang['btn_recent'] = 'Thay đổi gần đây'; +$lang['btn_upload'] = 'Tải lên'; +$lang['btn_cancel'] = 'Hủy bỏ'; +$lang['btn_index'] = 'Sơ đồ trang web'; +$lang['btn_secedit'] = 'Sửa đổi'; +$lang['btn_login'] = 'Đăng nhập'; +$lang['btn_logout'] = 'Đăng xuất'; +$lang['btn_admin'] = 'Quản lý'; +$lang['btn_update'] = 'Cập nhật'; +$lang['btn_delete'] = 'Xóa'; +$lang['btn_back'] = 'Quay lại'; +$lang['btn_backlink'] = 'Liên kết đến đây'; +$lang['btn_subscribe'] = 'Quản lý đăng ký'; +$lang['btn_profile'] = 'Cập nhật hồ sơ'; +$lang['btn_reset'] = 'Đặt lại'; +$lang['btn_resendpwd'] = 'Đặt mật khẩu mới'; +$lang['btn_draft'] = 'Sửa đổi 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'] = 'Áp dụng'; +$lang['btn_media'] = 'Quản lý phương tiện'; +$lang['btn_deleteuser'] = 'Xóa tài khoản của tôi'; +$lang['btn_img_backto'] = 'Quay lại %s'; +$lang['btn_mediaManager'] = 'Xem trong Quản lý phương tiện'; +$lang['loggedinas'] = 'Đã đăng nhập vói tên:'; +$lang['user'] = 'Tên thành viên'; +$lang['pass'] = 'Mật khẩu'; +$lang['newpass'] = 'Mật khẩu mới'; +$lang['oldpass'] = 'Xác nhận mật khẩu hiện tại'; +$lang['passchk'] = 'lần nữa'; +$lang['remember'] = 'Nhớ tôi'; +$lang['fullname'] = 'Tên thật'; +$lang['email'] = 'Thư điện tử'; +$lang['profile'] = 'Hồ sơ thành viên'; +$lang['badlogin'] = 'Xin lỗi, tên thành viên hoặc mật khẩu không đúng.'; +$lang['badpassconfirm'] = 'Xin lỗi, mật khẩu không đúng'; +$lang['minoredit'] = 'Thay đổi nhỏ'; +$lang['draftdate'] = 'Bản nháp được lưu tự động lúc'; +$lang['nosecedit'] = 'Trang đã được thay đổi trong một thời gian ngắn, thay vào đó thông tin phần đã hết hạn được tải toàn bộ trang.'; +$lang['searchcreatepage'] = 'Nếu bạn không tìm thấy những gì bạn đang tìm kiếm, bạn có thể tạo hoặc sửa đổi trang %s, được đặt tên theo truy vấn của bạn.'; +$lang['search_fullresults'] = 'Toàn văn kết quả'; +$lang['js']['search_toggle_tools'] = 'Chuyển đổi công cụ tìm kiếm'; +$lang['js']['willexpire'] = 'Khóa của bạn dùng cho việc sửa đổi trang này sắp hết hạn sau một phút nữa.\nĐể tránh xung đột, hãy sử dụng nút xem trước để đặt lại bộ hẹn giờ khóa.'; +$lang['js']['notsavedyet'] = 'Những thay đổi chưa được lưu sẽ bị mất.'; +$lang['js']['searchmedia'] = 'Tìm kiếm tập tin'; +$lang['js']['keepopen'] = 'Giữ cửa sổ mở trên lựa chọn'; +$lang['js']['hidedetails'] = 'Ẩn thông tin chi tiết'; +$lang['js']['mediatitle'] = 'Cài đặt liên kết'; +$lang['js']['mediadisplay'] = 'Kiểu liên kết'; +$lang['js']['mediaalign'] = 'Căn chỉnh'; +$lang['js']['mediasize'] = 'Kích thước hình ảnh'; +$lang['js']['mediatarget'] = 'Liên kết đến'; +$lang['js']['mediaclose'] = 'Đóng'; +$lang['js']['mediainsert'] = 'Chèn'; +$lang['js']['mediadisplayimg'] = 'Hiển thị hình ảnh.'; +$lang['js']['mediadisplaylnk'] = 'Chỉ hiển thị liên kết.'; +$lang['js']['mediasmall'] = 'Phiên bản nhỏ'; +$lang['js']['mediamedium'] = 'Phiên bản vừa'; +$lang['js']['medialarge'] = 'Phiên bản lớn'; +$lang['js']['mediaoriginal'] = 'Phiên bản 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 bản gốc'; +$lang['js']['medianolnk'] = 'Không liên kết'; +$lang['js']['medianolink'] = 'Không liên kết đến hình ảnh'; +$lang['js']['medialeft'] = 'Căn chỉnh hình ảnh sang trái.'; +$lang['js']['mediaright'] = 'Căn chỉnh hình ảnh sang phải.'; +$lang['js']['mediacenter'] = 'Căn chỉnh hình ảnh ra giữa.'; +$lang['js']['medianoalign'] = 'Không căn chỉnh.'; +$lang['js']['nosmblinks'] = 'Liên kết đến Windows shares chỉ hoạt động trong Microsoft Internet Explorer.\nBạn vẫn có thể sao chép và dán liên kết.'; +$lang['js']['linkwiz'] = 'Thuật sĩ liên kết'; +$lang['js']['linkto'] = 'Liên kết đến:'; +$lang['js']['del_confirm'] = 'Muốn xóa (các) mục đã chọn?'; +$lang['js']['restore_confirm'] = 'Sẵn sàng phục hồi phiên bản này?'; +$lang['js']['media_diff'] = 'Xem khác biệt:'; +$lang['js']['media_diff_both'] = 'Cạnh nhau'; +$lang['js']['media_diff_opacity'] = 'Sáng qua'; +$lang['js']['media_diff_portions'] = 'Vuốt'; +$lang['js']['media_select'] = 'Chọn tập tin…'; +$lang['js']['media_upload_btn'] = 'Tải lên'; +$lang['js']['media_done_btn'] = 'Xong'; +$lang['js']['media_drop'] = 'Kéo tập tin vào đây để tải lên'; +$lang['js']['media_cancel'] = 'xóa'; +$lang['js']['media_overwrt'] = 'Ghi đè các tập tin hiện có'; +$lang['js']['data_insecure'] = 'CẢNH BÁO: Có vẻ như đường dẫn dữ liệu của bạn không được bảo mật đúng cách. Xin vui lòng đọc Web Access Security in DokuWiki.'; +$lang['search_exact_match'] = 'Khớp chính xác'; +$lang['search_starts_with'] = 'Bắt đầu với'; +$lang['search_ends_with'] = 'Kết thúc bằng'; +$lang['search_contains'] = 'Chứa'; +$lang['search_custom_match'] = 'Tùy chỉnh'; +$lang['search_any_ns'] = 'Mọi không gian tên'; +$lang['search_any_time'] = 'Mọi lúc'; +$lang['search_past_7_days'] = 'Tuần trước'; +$lang['search_past_month'] = 'Tháng trước'; +$lang['search_past_year'] = 'Năm trước'; +$lang['search_sort_by_hits'] = 'Sắp xếp theo lượt truy cập'; +$lang['search_sort_by_mtime'] = 'Sắp xếp theo sửa đổi cuối'; +$lang['regmissing'] = 'Xin lỗi, bạn cần điền vào tất cả các trường'; +$lang['reguexists'] = 'Xin lỗi, thành viên có thông tin đăng nhập này đã tồn tại.'; +$lang['regsuccess'] = 'Thành viên đã được tạo và mật khẩu đã được gửi qua thư điện tử.'; +$lang['regsuccess2'] = 'Thành viên đã được tạo.'; +$lang['regfail'] = 'Không thể tạo thành viên.'; +$lang['regmailfail'] = 'Có vẻ như đã xảy ra lỗi khi gửi thư mật khẩu. Vui lòng liên hệ với quản trị viên!'; +$lang['regbadmail'] = 'Địa chỉ thư điện tử được cung cấp có vẻ không hợp lệ - nếu bạn nghĩ đây là lỗi, hãy liên hệ với quản trị viên'; +$lang['regbadpass'] = 'Hai mật khẩu đã nhập không giống nhau, vui lòng thử lại.'; +$lang['regpwmail'] = 'Mật khẩu DokuWiki của bạn'; +$lang['reghere'] = 'Bạn chưa có tài khoản? Hãy tạo một cái'; +$lang['profna'] = 'Wiki này không hỗ trợ sửa đổi hồ sơ'; +$lang['profnochange'] = 'Không có thay đổi, không có gì để làm.'; +$lang['profnoempty'] = 'Không được bỏ trống tên hoặc địa chỉ thư điện tử.'; +$lang['profchanged'] = 'Cập nhật hồ sơ thành viên thành công.'; +$lang['profnodelete'] = 'Wiki này không hỗ trợ xóa thành viên'; +$lang['profdeleteuser'] = 'Xóa tài khoản'; +$lang['profdeleted'] = 'Tài khoản thành viên của bạn đã bị xóa khỏi wiki này'; +$lang['profconfdelete'] = 'Tôi muốn xóa tài khoản của tôi khỏi wiki này.
    Hành động này không thể hoàn tác.'; +$lang['profconfdeletemissing'] = 'Hộp kiểm xác nhận chưa được đánh dấu'; +$lang['proffail'] = 'Hồ sơ thành viên chưa được cập nhật.'; +$lang['proftokenlegend'] = 'Mã xác thực'; +$lang['proftokengenerate'] = 'Đặt lại mã thông báo'; +$lang['proftokeninfo'] = 'Mã thông báo xác thực có thể được sử dụng để cho phép các ứng dụng của bên thứ 3 đăng nhập và hành động thay mặt bạn. Việc đặt lại mã thông báo sẽ làm mất hiệu lực mã cũ và đăng xuất tất cả các ứng dụng đã sử dụng mã thông báo trước đó.'; +$lang['pwdforget'] = 'Bạn quên mật khẩu? Tạo một cái mới'; +$lang['resendna'] = 'Wiki này không hỗ trợ gửi lại mật khẩu.'; +$lang['resendpwd'] = 'Đặt 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ã xác thực này 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 qua thư điện tử.'; +$lang['resendpwdsuccess'] = 'Mật khẩu mới của bạn đã được gửi qua thư điện tử.'; +$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:'; +$lang['licenseok'] = 'Lưu ý: Bằng cách sửa đổi trang này, bạn đồng ý cấp phép cho nội dung của mình theo giấy phép sau:'; +$lang['searchmedia'] = 'Tìm kiếm tên tập tin:'; +$lang['searchmedia_in'] = 'Tìm kiếm trong %s'; +$lang['txt_upload'] = 'Chọn tập tin để tải lên:'; +$lang['txt_filename'] = 'Tải lên dưới dạng (tùy chọn):'; +$lang['txt_overwrt'] = 'Ghi đè tập tin hiện có'; +$lang['maxuploadsize'] = 'Tải lên tối đa. %s mỗi tập tin.'; +$lang['allowedmime'] = 'Danh sách các phần mở rộng tập tin được phép'; +$lang['lockedby'] = 'Hiện đang bị khóa bởi:'; +$lang['lockexpire'] = 'Khóa hết hạn vào lúc:'; +$lang['rssfailed'] = 'Đã xảy ra lỗi khi tìm nạp nguồn cấp dữ liệu này:'; +$lang['nothingfound'] = 'Không có gì được tìm thấy.'; +$lang['mediaselect'] = 'Tập tin phương tiện'; +$lang['uploadsucc'] = 'Tải lên thành công'; +$lang['uploadfail'] = 'Tải lên không thành công. Có thể không đủ quyền?'; +$lang['uploadwrong'] = 'Tải lên bị từ chối. Phần mở rộng tập tin này bị cấm!'; +$lang['uploadexist'] = 'Tập tin đã tồn tại. Không có gì được thực hiện.'; +$lang['uploadbadcontent'] = 'Nội dung được tải lên không khớp với phần tập tin mở rộng %s.'; +$lang['uploadspam'] = 'Việc tải lên đã bị chặn bởi danh sách đen về spam.'; +$lang['uploadxss'] = 'Việc tải lên đã bị chặn do nội dung độc hại.'; +$lang['uploadsize'] = 'Tập tin đã tải lên quá lớn. (tối đa %s)'; +$lang['deletesucc'] = 'Đã xóa tập tin "%s".'; +$lang['deletefail'] = 'Không thể xóa "%s" - kiểm tra quyền.'; +$lang['mediainuse'] = 'Không thể xóa tập tin "%s" - nó vẫn đang được sử dụng.'; +$lang['namespaces'] = 'Không gian tên'; +$lang['mediafiles'] = 'Tập tin có sẵn trong'; +$lang['accessdenied'] = 'Bạn không được phép xem trang này.'; +$lang['mediausage'] = 'Sử dụng cú pháp sau để tham chiếu tập tin này:'; +$lang['mediaview'] = 'Xem tập tin gốc'; +$lang['mediaroot'] = 'gốc'; +$lang['mediaupload'] = 'Tải một tập tin vào không gian tên hiện tại ở đây. Để tạo không gian tên con, hãy thêm chúng vào tên tập tin của bạn được phân tách bằng dấu hai chấm sau khi bạn chọn tập tin. Tập tin cũng có thể được chọn bằng cách kéo và thả.'; +$lang['mediaextchange'] = 'Đã thay đổi phần mở rộng tập tin từ .%s thành .%s!'; +$lang['reference'] = 'Tài liệu tham khảo cho'; +$lang['ref_inuse'] = 'Không thể xóa tập tin này vì nó vẫn được sử dụng ở các trang sau:'; +$lang['ref_hidden'] = 'Một số tài liệu tham khảo nằm trên các trang bạn không có quyền đọc'; +$lang['hits'] = 'Lượt truy cập'; +$lang['quickhits'] = 'Tên trang trùng khớp'; +$lang['toc'] = 'Mục lục'; +$lang['current'] = 'hiện tại'; +$lang['yours'] = 'Phiên bản của bạn'; +$lang['diff'] = 'Xem khác biệt với phiên bản hiện tại'; +$lang['diff2'] = 'Xem khác biệt giữa các phiên bản được chọn'; +$lang['difflink'] = 'Liên kết đến bản xem so sánh này'; +$lang['diff_type'] = 'Xem khác biệt:'; +$lang['diff_inline'] = 'Nội tuyến'; +$lang['diff_side'] = 'Cạnh nhau'; +$lang['diffprevrev'] = 'Phiên bản trước'; +$lang['diffnextrev'] = 'Phiên bản sau'; +$lang['difflastrev'] = 'Phiên bản cuối'; +$lang['diffbothprevrev'] = 'Phiên bản trước của cả hai bên'; +$lang['diffbothnextrev'] = 'Phiên bản sau của cả hai bên'; +$lang['line'] = 'Dòng'; +$lang['breadcrumb'] = 'Trang đã xem:'; +$lang['youarehere'] = 'Bạn đang ở đây:'; +$lang['lastmod'] = 'Sửa đổi lần cuối:'; +$lang['by'] = 'bởi'; +$lang['deleted'] = 'đã bị xoá'; +$lang['created'] = 'đã tạo'; +$lang['restored'] = 'đã khôi phục phiên bản cũ (%s)'; +$lang['external_edit'] = 'sửa đổi bên ngoài'; +$lang['summary'] = 'Tóm lược sửa đổi'; +$lang['unknowndate'] = 'Ngày không xác định'; +$lang['noflash'] = 'Cần có Adobe Flash Plugin mới có thể xem được nội dung này.'; +$lang['download'] = 'Tải xuống đoạn trích'; +$lang['tools'] = 'Công cụ'; +$lang['user_tools'] = 'Công cụ thành viên'; +$lang['site_tools'] = 'Công cụ trang web'; +$lang['page_tools'] = 'Công cụ trang'; +$lang['skip_to_content'] = 'đi đến nội dung'; +$lang['sidebar'] = 'Thanh bên'; +$lang['mail_newpage'] = 'trang đã thêm:'; +$lang['mail_changed'] = 'trang đã thay đổi:'; +$lang['mail_subscribe_list'] = 'các trang đã thay đổi trong không gian tên:'; +$lang['mail_new_user'] = 'thành viên mới:'; +$lang['mail_upload'] = 'tập tin đã được tải lên:'; +$lang['changes_type'] = 'Xem thay đổi của'; +$lang['pages_changes'] = 'Trang'; +$lang['media_changes'] = 'Tập tin phương tiện'; +$lang['both_changes'] = 'Cả trang và tập tin phương tiện'; +$lang['qb_bold'] = 'Chữ đậm'; +$lang['qb_italic'] = 'Chữ nghiêng'; +$lang['qb_underl'] = 'Chữ gạch chân'; +$lang['qb_code'] = 'Chữ đơn cách'; +$lang['qb_strike'] = 'Gạch ngang chữ'; +$lang['qb_h1'] = 'Đề mục cấp 1'; +$lang['qb_h2'] = 'Đề mục cấp 2'; +$lang['qb_h3'] = 'Đề mục cấp 3'; +$lang['qb_h4'] = 'Đề mục cấp 4'; +$lang['qb_h5'] = 'Đề mục cấp 5'; +$lang['qb_h'] = 'Đề mục'; +$lang['qb_hs'] = 'Chọn đề mục'; +$lang['qb_hplus'] = 'Đề mục cao hơn'; +$lang['qb_hminus'] = 'Đề mục thấp hơn'; +$lang['qb_hequal'] = 'Đề mục cùng cấp'; +$lang['qb_link'] = 'Liên kết nội bộ'; +$lang['qb_extlink'] = 'Liên kết ngoài'; +$lang['qb_hr'] = 'Thanh ngang'; +$lang['qb_ol'] = 'Mục danh sách đánh số'; +$lang['qb_ul'] = 'Mục danh sách không đánh số'; +$lang['qb_media'] = 'Thêm hình ảnh và các tập tin khác (mở trong một cửa sổ mới)'; +$lang['qb_sig'] = 'Chèn chữ ký'; +$lang['qb_smileys'] = 'Biểu tượng mặt cười'; +$lang['qb_chars'] = 'Ký tự đặc biệt'; +$lang['upperns'] = 'nhảy đến không gian tên mẹ'; +$lang['metaedit'] = 'Sửa đổi siêu dữ liệu'; +$lang['metasaveerr'] = 'Viết siêu dữ liệu không thành công'; +$lang['metasaveok'] = 'Đã lưu siêu dữ liệu'; +$lang['img_title'] = 'Tiêu đề:'; +$lang['img_caption'] = 'Chú thích:'; +$lang['img_date'] = 'Ngày:'; +$lang['img_fname'] = 'Tên tập tin:'; +$lang['img_fsize'] = 'Kích thước:'; +$lang['img_artist'] = 'Người chụp:'; +$lang['img_copyr'] = 'Bản quyền:'; +$lang['img_format'] = 'Định dạng:'; +$lang['img_camera'] = 'Máy ảnh:'; +$lang['img_keywords'] = 'Từ khóa:'; +$lang['img_width'] = 'Chiều rộng:'; +$lang['img_height'] = 'Chiều cao:'; +$lang['subscr_subscribe_success'] = 'Đã thêm %s vào danh sách đăng ký cho %s'; +$lang['subscr_subscribe_error'] = 'Có lỗi khi thêm %s vào danh sách đăng ký cho %s'; +$lang['subscr_subscribe_noaddress'] = 'Không có địa chỉ liên quan nào đến thông tin đăng nhập của bạn, bạn không thể thêm vào danh sách đăng ký'; +$lang['subscr_unsubscribe_success'] = 'Đã xóa %s khỏi danh sách đăng ký cho %s'; +$lang['subscr_unsubscribe_error'] = 'Có lỗi khi xóa %s khỏi danh sách đăng ký cho %s'; +$lang['subscr_already_subscribed'] = '%s đã được đăng ký cho %s'; +$lang['subscr_not_subscribed'] = '%s chưa được đăng ký cho %s'; +$lang['subscr_m_not_subscribed'] = 'Bạn hiện chưa đăng ký vào trang hoặc không gian tên hiện tại.'; +$lang['subscr_m_new_header'] = 'Thêm đăng ký'; +$lang['subscr_m_current_header'] = 'Đăng ký hiện tại'; +$lang['subscr_m_unsubscribe'] = 'Hủy đăng ký'; +$lang['subscr_m_subscribe'] = 'Đăng ký'; +$lang['subscr_m_receive'] = 'Nhận'; +$lang['subscr_style_every'] = 'thư điện tử về mọi thay đổi'; +$lang['subscr_style_digest'] = 'Thông báo thư điện tử về các thay đổi cho mỗi trang (mỗi %.2f ngày)'; +$lang['subscr_style_list'] = 'danh sách các trang đã thay đổi kể từ thư điện tử cuối cùng (mỗi %.2f ngày)'; +$lang['authtempfail'] = 'Xác thực thành viên tạm thời không có sẵn. Nếu tình trạng này vẫn còn, vui lòng thông báo cho Quản trị viên Wiki của bạn.'; +$lang['i_chooselang'] = 'Chọn ngôn ngữ của bạn'; +$lang['i_installer'] = 'Trình cài đặt DokuWiki'; +$lang['i_wikiname'] = 'Tên Wiki'; +$lang['i_enableacl'] = 'Kích hoạt Danh sách kiểm soát truy cập (ACL) (khuyến nghị)'; +$lang['i_superuser'] = 'Siêu thành viên'; +$lang['i_problems'] = 'Trình cài đặt tìm thấy một số vấn đề, được chỉ ra bên dưới. Bạn không thể tiếp tục cho đến khi bạn đã sửa chúng.'; +$lang['i_modified'] = 'Vì lý do bảo mật, tập lệnh này sẽ chỉ hoạt động với bản cài đặt Dokuwiki mới và chưa được sửa đổi. + Bạn nên trích xuất lại các tập tin từ gói đã tải xuống hoặc tham khảo + Hướng dẫn cài đặt Dokuwiki đầy đủ'; +$lang['i_funcna'] = 'Hàm PHP %s không có sẵn. Có lẽ nhà cung cấp dịch vụ lưu trữ của bạn đã vô hiệu hóa nó vì một số lý do?'; +$lang['i_disabled'] = 'Nó đã bị vô hiệu hóa bởi nhà cung cấp của bạn.'; +$lang['i_funcnmail'] = 'Lưu ý: Không có sẵn hàm PHP mail. %s Nếu nó vẫn không có sẵn, bạn có thể cài đặt smtp plugin.'; +$lang['i_phpver'] = 'Phiên bản PHP %s hiện taị thấp hơn mức %s cần thiết. Bạn cần nâng cấp cài đặt PHP của bạn.'; +$lang['i_mbfuncoverload'] = 'mbopes.func_overload phải bị vô hiệu trong php.ini để chạy DokuWiki.'; +$lang['i_urandom'] = 'DokuWiki không thể tạo số mật mã an toàn cho cookie. Bạn có thể muốn kiểm tra cài đặt open_basingir trong php.ini để truy cập /dev/urandom thích hợp.'; +$lang['i_permfail'] = 'DokuWiki không thể ghi được %s. Bạn cần sửa đổi các thiết lập quyền của đường dẫn này!'; +$lang['i_confexists'] = '%s đã tồn tại'; +$lang['i_writeerr'] = 'Không thể tạo %s. Bạn sẽ cần kiểm tra quyền truy cập thư mục/tập tin và tạo tập tin thủ công.'; +$lang['i_badhash'] = 'Không thể công nhận hoặc sửa đổi dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s - giá trị bất hợp pháp hoặc trống'; +$lang['i_success'] = 'Đã hoàn thành việc cấu hình thành công. Bạn có thể xóa tập tin install.php ngay bây giờ. Tiếp tục với + DokuWiki mới của bạn'; +$lang['i_failure'] = 'Một số lỗi xảy ra trong khi viết tập tin cấu hình. Bạn có thể cần phải sửa chúng thủ công trước khi + bạn có thể sử dụng DokuWiki mới của bạn.'; +$lang['i_policy'] = 'Chính sách ACL (Danh sách kiểm soát truy cập) ban đầu'; +$lang['i_pol0'] = 'Wiki mở (bất kỳ ai cũng có thể đọc, viết, tải lên)'; +$lang['i_pol1'] = 'Wiki công cộng (bất kỳ ai cũng có thể xem, thành viên đã đăng ký có thể viết và tải lên)'; +$lang['i_pol2'] = 'Wiki đóng (chỉ thành viên đã đăng ký mới có thể đọc, viết, tải lên)'; +$lang['i_allowreg'] = 'Cho phép người dùng tự đăng ký'; +$lang['i_retry'] = 'Thử lại'; +$lang['i_license'] = 'Vui lòng chọn giấy phép bạn muốn đặt nội dung của bạn dưới:'; +$lang['i_license_none'] = 'Không hiển thị bất kỳ thông tin giấy phép nào'; +$lang['i_pop_field'] = 'Vui lòng giúp chúng tôi cải thiện trải nghiệm DokuWiki:'; +$lang['i_pop_label'] = 'Mỗi tháng một lần, gửi dữ liệu sử dụng ẩn danh đến các nhà phát triển DokuWiki'; +$lang['recent_global'] = 'Bạn hiện đang xem những thay đổi bên trong không gian tên %s. Bạn cũng có thể xem những thay đổi gần đây trên toàn bộ wiki.'; +$lang['years'] = '%d năm trước'; +$lang['months'] = '%d tháng trước'; +$lang['weeks'] = '%d tuần trước'; +$lang['days'] = '%d ngày trước'; +$lang['hours'] = '%d giờ trước'; +$lang['minutes'] = '%d phút trước'; +$lang['seconds'] = '%d giây trước'; +$lang['wordblock'] = 'Thay đổi của bạn không được lưu vì nó chứa văn bản bị chặn (spam).'; +$lang['media_uploadtab'] = 'Tải lên'; +$lang['media_searchtab'] = 'Tìm kiếm'; +$lang['media_file'] = 'Tập tin'; +$lang['media_viewtab'] = 'Xem'; +$lang['media_edittab'] = 'Sửa đổi'; +$lang['media_historytab'] = 'Lịch sử'; +$lang['media_list_thumbs'] = 'Hì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 không gian tên'; +$lang['media_files'] = 'Tập tin trong %s'; +$lang['media_upload'] = 'Tải lên %s'; +$lang['media_search'] = 'Tìm kiếm trong %s'; +$lang['media_view'] = '%s'; +$lang['media_viewold'] = '%s ở %s'; +$lang['media_edit'] = 'Sửa đổi %s'; +$lang['media_history'] = 'Lịch sử của %s'; +$lang['media_meta_edited'] = 'đã sửa siêu dữ liệu'; +$lang['media_perm_read'] = 'Xin lỗi, bạn không có đủ quyền để đọc tập tin.'; +$lang['media_perm_upload'] = 'Xin lỗi, bạn không đủ quyền để tải tập tin 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['media_acl_warning'] = 'Danh sách này có thể không đầy đủ do các hạn chế về Danh sách kiểm soát truy cập (ACL) và trang ẩn.'; +$lang['email_fail'] = 'Thiếu hoặc đã vô hiệu hóa PHP mail(). Những thư điện tử sau không được gửi:'; +$lang['currentns'] = 'Không gian tên hiện tại'; +$lang['searchresult'] = 'Kết quả tìm kiếm'; +$lang['plainhtml'] = 'HTML thuần túy'; +$lang['wikimarkup'] = 'Đánh dấu Wiki'; +$lang['page_nonexist_rev'] = 'Trang không tồn tại tại %s. Sau đó, nó đã được tạo ở %s.'; +$lang['unable_to_parse_date'] = 'Không thể phân tích cú pháp tại tham số "%s".'; +$lang['email_signature_text'] = 'Thư này được tạo bởi DokuWiki tại +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = 'Tệp nhật ký quá lớn. Những dòng trước đã bị bỏ qua!'; +$lang['log_file_failed_to_open'] = 'Không thể mở tệp nhật ký.'; +$lang['log_file_failed_to_read'] = 'Đã xảy ra lỗi khi đọc nhật ký.'; diff --git a/inc/lang/vi/locked.txt b/inc/lang/vi/locked.txt new file mode 100644 index 0000000..10ddac0 --- /dev/null +++ b/inc/lang/vi/locked.txt @@ -0,0 +1,3 @@ +====== Trang bị khóa ====== + +Trang này hiện đang bị khóa do thành viên khác đang sửa đổi. Bạn phải đợi cho đến khi thành viên này hoàn thành sửa đổi hoặc khóa hết hạn. diff --git a/inc/lang/vi/login.txt b/inc/lang/vi/login.txt new file mode 100644 index 0000000..59fb2c1 --- /dev/null +++ b/inc/lang/vi/login.txt @@ -0,0 +1,3 @@ +====== Đăng nhập ====== + +Bạn hiện chưa đăng nhập! Nhập thông tin xác thực của bạn bên dưới để đăng nhập. Bạn cần kích hoạt cookie để đăng nhập. diff --git a/inc/lang/vi/mailtext.txt b/inc/lang/vi/mailtext.txt new file mode 100644 index 0000000..3ca8aa1 --- /dev/null +++ b/inc/lang/vi/mailtext.txt @@ -0,0 +1,14 @@ +Một trang trên DokuWiki của bạn vừa được thêm hoặc thay đổi. Đây là những thông tin chi tiết: + +Trình duyệt : @BROWSER@ +Địa chỉ IP : @IPADDRESS@ +Tên máy chủ : @HOSTNAME@ +Phiên bản cũ : @OLDPAGE@ +Phiên bản mới : @NEWPAGE@ +Ngày của phiên bản mới: @DATE@ +Tóm lược sửa đổi : @SUMMARY@ +Thành viên : @USER@ + +Có thể có những thay đổi mới hơn sau khi phiên bản này. Nếu điều này xảy ra, một tin nhắn sẽ được hiển thị trên đầu trang rev. + +@DIFF@ diff --git a/inc/lang/vi/newpage.txt b/inc/lang/vi/newpage.txt new file mode 100644 index 0000000..fa7cfbf --- /dev/null +++ b/inc/lang/vi/newpage.txt @@ -0,0 +1,3 @@ +====== Chưa có đề tài này ====== + +Bạn đã truy cập vào một liên kết đến một đề tài chưa tồn tại. Nếu quyền cho phép, bạn có thể tạo nó bằng cách nhấn vào **Tạo trang này**. diff --git a/inc/lang/vi/norev.txt b/inc/lang/vi/norev.txt new file mode 100644 index 0000000..dcb1583 --- /dev/null +++ b/inc/lang/vi/norev.txt @@ -0,0 +1,3 @@ +====== Không có phiên bản ====== + +Phiên bản bạn yêu cầu không tồn tại. Nhấn vào "Phiên bản cũ" để biết danh sách phiên bản cũ của tài liệu này. diff --git a/inc/lang/vi/onceexisted.txt b/inc/lang/vi/onceexisted.txt new file mode 100644 index 0000000..78aabdc --- /dev/null +++ b/inc/lang/vi/onceexisted.txt @@ -0,0 +1,3 @@ +======= Trang này không còn tồn tại ====== + +Bạn đã vào một liên kết đến một trang không còn tồn tại. Bạn có thể kiểm tra danh sách **phiên bản cũ** để xem khi nào và tại sao nó bị xóa, truy cập các phiên bản cũ hoặc khôi phục nó. diff --git a/inc/lang/vi/password.txt b/inc/lang/vi/password.txt new file mode 100644 index 0000000..e04c90a --- /dev/null +++ b/inc/lang/vi/password.txt @@ -0,0 +1,6 @@ +Chào @FULLNAME@! + +Đây là thông tin thành viên chi tiết để bạn đăng nhập @TITLE@ tại @DOKUWIKIURL@: + +Tên: @LOGIN@ +Mật khẩu: @PASSWORD@ diff --git a/inc/lang/vi/preview.txt b/inc/lang/vi/preview.txt new file mode 100644 index 0000000..a259827 --- /dev/null +++ b/inc/lang/vi/preview.txt @@ -0,0 +1,3 @@ +====== Xem trước ====== + +Đây là một bản xem trước của văn bản của bạn sẽ trông như thế nào. **Hãy nhớ: Nó vẫn chưa được lưu**! diff --git a/inc/lang/vi/pwconfirm.txt b/inc/lang/vi/pwconfirm.txt new file mode 100644 index 0000000..bed586a --- /dev/null +++ b/inc/lang/vi/pwconfirm.txt @@ -0,0 +1,9 @@ +Chào @FULLNAME@! + +Ai đó đã yêu cầu mật khẩu mới cho bạn đăng nhập @TITLE@ tại @DOKUWIKIURL@ + +Nếu bạn không yêu cầu mật khẩu mới thì hãy bỏ qua thư điện tử này. + +Để xác nhận rằng yêu cầu đã thực sự được gửi bởi bạn, vui lòng truy cập vào liên kết sau. + +@CONFIRM@ \ No newline at end of file diff --git a/inc/lang/vi/read.txt b/inc/lang/vi/read.txt new file mode 100644 index 0000000..f1fd12b --- /dev/null +++ b/inc/lang/vi/read.txt @@ -0,0 +1 @@ +Trang này hiện chỉ có thể đọc. Bạn có thể xem mã nguồn, nhưng không thể thay đổi nó. Hỏi quản trị viên của bạn nếu bạn nghĩ rằng điều này là sai. diff --git a/inc/lang/vi/recent.txt b/inc/lang/vi/recent.txt new file mode 100644 index 0000000..59a1446 --- /dev/null +++ b/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/inc/lang/vi/register.txt b/inc/lang/vi/register.txt new file mode 100644 index 0000000..f1f822b --- /dev/null +++ b/inc/lang/vi/register.txt @@ -0,0 +1,3 @@ +====== Đăng ký làm thành viên mới ====== + +Điền vào tất cả các thông tin dưới đây để tạo một tài khoản mới trong wiki này. Hãy chắc chắn rằng bạn cung cấp một **địa chỉ thư điện tử hợp lệ** - nếu bạn không được yêu cầu nhập mật khẩu tại đây, một mật khẩu mới sẽ được gửi đến địa chỉ đó. Tên đăng nhập phải là [[doku>pagename|tên]] hợp lệ . diff --git a/inc/lang/vi/registermail.txt b/inc/lang/vi/registermail.txt new file mode 100644 index 0000000..786d8c1 --- /dev/null +++ b/inc/lang/vi/registermail.txt @@ -0,0 +1,10 @@ +Một người dùng mới đã đăng ký. Đây là những thông tin chi tiết: + +Tên thành viên : @NEWUSER@ +Tên đầy đủ : @NEWNAME@ +Thư điện tử : @NEWEMAIL@ + +Ngày : @DATE@ +Trình duyệt : @BROWSER@ +Địa chỉ IP : @IPADDRESS@ +Tên máy chủ : @HOSTNAME@ \ No newline at end of file diff --git a/inc/lang/vi/resendpwd.txt b/inc/lang/vi/resendpwd.txt new file mode 100644 index 0000000..52e8fd1 --- /dev/null +++ b/inc/lang/vi/resendpwd.txt @@ -0,0 +1,3 @@ +====== Gửi mật khẩu mới ====== + +Vui lòng nhập tên thành viên của bạn vào mẫu dưới đây để yêu cầu một mật khẩu mới cho tài khoản của bạn trong wiki này. Một liên kết xác nhận sẽ được gửi đến địa chỉ thư điện tử đã đăng ký của bạn. \ No newline at end of file diff --git a/inc/lang/vi/resetpwd.txt b/inc/lang/vi/resetpwd.txt new file mode 100644 index 0000000..b307583 --- /dev/null +++ b/inc/lang/vi/resetpwd.txt @@ -0,0 +1,3 @@ +====== Đặt mật khẩu mới ====== + +Vui lòng nhập mật khẩu mới cho tài khoản của bạn trong wiki này. \ No newline at end of file diff --git a/inc/lang/vi/revisions.txt b/inc/lang/vi/revisions.txt new file mode 100644 index 0000000..7e68a3e --- /dev/null +++ b/inc/lang/vi/revisions.txt @@ -0,0 +1,3 @@ +====== Phiên bản cũ ====== + +Đây là những phiên bản cũ của tài liệu hiện tại. Để lùi về một phiên bản cũ, chọn phiên bản từ bên dưới, nhấn vào ''Sửa đổi trang này'' và lưu nó. diff --git a/inc/lang/vi/searchpage.txt b/inc/lang/vi/searchpage.txt new file mode 100644 index 0000000..83ebca0 --- /dev/null +++ b/inc/lang/vi/searchpage.txt @@ -0,0 +1,3 @@ +====== Tìm kiếm ====== + +Bạn có thể tìm thấy kết quả mà bạn tìm kiếm ở bên dưới đây. @CREATEPAGEINFO@ diff --git a/inc/lang/vi/showrev.txt b/inc/lang/vi/showrev.txt new file mode 100644 index 0000000..9adc28e --- /dev/null +++ b/inc/lang/vi/showrev.txt @@ -0,0 +1,2 @@ +**Đây là một phiên bản cũ của tài liệu!** +---- diff --git a/inc/lang/vi/stopwords.txt b/inc/lang/vi/stopwords.txt new file mode 100644 index 0000000..caed7b8 --- /dev/null +++ b/inc/lang/vi/stopwords.txt @@ -0,0 +1,39 @@ +# Đây là danh sách các từ mà người lập chỉ mục bỏ qua, mỗi từ một dòng +# Khi bạn sửa đổi tập tin này, hãy chắc chắn sử dụng các kết thúc dòng UNIX (dòng đơn mới) +# Không cần bao gồm các từ ngắn hơn 3 ký tự - dù sao chúng cũng bị bỏ qua +# Danh sách này dựa trên những cái được tìm thấy tại 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/inc/lang/vi/subscr_digest.txt b/inc/lang/vi/subscr_digest.txt new file mode 100644 index 0000000..a2abd85 --- /dev/null +++ b/inc/lang/vi/subscr_digest.txt @@ -0,0 +1,16 @@ +Chào! + +Trang @PAGE@ trong wiki @TITLE@ đã được thay đổi. +Dưới đây là những thay đổi: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Phiên bản cũ: @OLDPAGE@ +Phiên bản mới: @NEWPAGE@ + +Để hủy thông báo trang, đăng nhập vào wiki tại +@DOKUWIKIURL@ sau đó truy cập +@SUBSCRIBE@ +và hủy đăng ký trang và/hoặc thay đổi không gian tên. \ No newline at end of file diff --git a/inc/lang/vi/subscr_form.txt b/inc/lang/vi/subscr_form.txt new file mode 100644 index 0000000..3264915 --- /dev/null +++ b/inc/lang/vi/subscr_form.txt @@ -0,0 +1,3 @@ +====== Quản lý đăng ký ====== + +Trang này cho phép bạn quản lý đăng ký của mình cho trang hiện tại và không gian tên. \ No newline at end of file diff --git a/inc/lang/vi/subscr_list.txt b/inc/lang/vi/subscr_list.txt new file mode 100644 index 0000000..e58cc39 --- /dev/null +++ b/inc/lang/vi/subscr_list.txt @@ -0,0 +1,13 @@ +Chào! + +Trang @PAGE@ trong wiki @TITLE@ đã được thay đổi. +Dưới đây là những thay đổi: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Để hủy thông báo trang, đăng nhập vào wiki tại +@DOKUWIKIURL@ sau đó truy cập +@SUBSCRIBE@ +và hủy đăng ký trang và/hoặc thay đổi không gian tên. \ No newline at end of file diff --git a/inc/lang/vi/subscr_single.txt b/inc/lang/vi/subscr_single.txt new file mode 100644 index 0000000..e8e231e --- /dev/null +++ b/inc/lang/vi/subscr_single.txt @@ -0,0 +1,19 @@ +Chào! + +Trang @PAGE@ trong wiki @TITLE@ đã được thay đổi. +Dưới đây là những thay đổi: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +Thành viên : @USER@ +Tóm lược sửa đổi : @SUMMARY@ +Phiên bản cũ : @OLDPAGE@ +Phiên bản mới : @NEWPAGE@ +Ngày của phiên bản mới: @DATE@ + +Để hủy thông báo trang, đăng nhập vào wiki tại +@DOKUWIKIURL@ sau đó truy cập +@SUBSCRIBE@ +và hủy đăng ký trang và/hoặc thay đổi không gian tên. \ No newline at end of file diff --git a/inc/lang/vi/updateprofile.txt b/inc/lang/vi/updateprofile.txt new file mode 100644 index 0000000..8a5c717 --- /dev/null +++ b/inc/lang/vi/updateprofile.txt @@ -0,0 +1,3 @@ +====== Cập nhật hồ sơ tài khoản của bạn ====== + +Bạn chỉ cần hoàn thành những trường bạn muốn thay đổi. Bạn không thể thay đổi tên thành viên của bạn. \ No newline at end of file diff --git a/inc/lang/vi/uploadmail.txt b/inc/lang/vi/uploadmail.txt new file mode 100644 index 0000000..94b5c8f --- /dev/null +++ b/inc/lang/vi/uploadmail.txt @@ -0,0 +1,11 @@ +Một tập tin đã được tải lên DokuWiki của bạn. Đây là những thông tin chi tiết: + +Tập tin : @MEDIA@ +Phiên bản cũ: @OLD@ +Ngày : @DATE@ +Trình duyệt : @BROWSER@ +Địa chỉ IP : @IPADDRESS@ +Tên máy chủ : @HOSTNAME@ +Kích thước : @SIZE@ +Loại MIME : @MIME@ +Thành viên : @USER@ \ No newline at end of file diff --git a/inc/lang/zh-tw/admin.txt b/inc/lang/zh-tw/admin.txt new file mode 100644 index 0000000..8a7ac0f --- /dev/null +++ b/inc/lang/zh-tw/admin.txt @@ -0,0 +1,3 @@ +====== 管理選單 ====== + +以下為 DokuWiki 的管理設定。 diff --git a/inc/lang/zh-tw/adminplugins.txt b/inc/lang/zh-tw/adminplugins.txt new file mode 100644 index 0000000..6d21ac2 --- /dev/null +++ b/inc/lang/zh-tw/adminplugins.txt @@ -0,0 +1 @@ +===== 附加元件 ===== \ No newline at end of file diff --git a/inc/lang/zh-tw/backlinks.txt b/inc/lang/zh-tw/backlinks.txt new file mode 100644 index 0000000..f7d000b --- /dev/null +++ b/inc/lang/zh-tw/backlinks.txt @@ -0,0 +1,3 @@ +====== 反向連結 ====== + +這是引用、連結到目前頁面的頁面清單。 diff --git a/inc/lang/zh-tw/conflict.txt b/inc/lang/zh-tw/conflict.txt new file mode 100644 index 0000000..c4836ca --- /dev/null +++ b/inc/lang/zh-tw/conflict.txt @@ -0,0 +1,5 @@ +====== 已存在更新版本 ====== + +此檔案已存在更新的版本。這是因為有其他使用者在您編輯時變更了這份文件。 + +請仔細檢查以下差異,再決定保留哪份。您可選擇「儲存」您的版本或「取消」保留目前版本。 diff --git a/inc/lang/zh-tw/denied.txt b/inc/lang/zh-tw/denied.txt new file mode 100644 index 0000000..754ee92 --- /dev/null +++ b/inc/lang/zh-tw/denied.txt @@ -0,0 +1,3 @@ +====== 權限拒絕 ====== + +抱歉,您沒有足夠權限繼續執行。 diff --git a/inc/lang/zh-tw/diff.txt b/inc/lang/zh-tw/diff.txt new file mode 100644 index 0000000..b32f763 --- /dev/null +++ b/inc/lang/zh-tw/diff.txt @@ -0,0 +1,3 @@ +====== 差異處 ====== + +這裏顯示兩個版本的差異處。 diff --git a/inc/lang/zh-tw/draft.txt b/inc/lang/zh-tw/draft.txt new file mode 100644 index 0000000..f14702e --- /dev/null +++ b/inc/lang/zh-tw/draft.txt @@ -0,0 +1,5 @@ +====== 發現草稿檔案 ====== + +您上次的編輯程序並未正確完成。DokuWiki 已在您編輯時自動儲存了一份草稿使您可以繼續編輯。以下是上次的編輯資料。 + +請決定要//復原//您遺失的編輯文件,//刪除//這份草稿,或者//取消//編輯程序。 diff --git a/inc/lang/zh-tw/edit.txt b/inc/lang/zh-tw/edit.txt new file mode 100644 index 0000000..60dffe0 --- /dev/null +++ b/inc/lang/zh-tw/edit.txt @@ -0,0 +1 @@ +編輯本頁後,請按下「儲存」按鈕。若要參看語法說明,請到[[wiki:syntax|語法]]頁。請只在能讓本文品質**更好**時才編輯。如果只是要測試,請移玉步至 [[playground:playground|遊樂場]]。 diff --git a/inc/lang/zh-tw/editrev.txt b/inc/lang/zh-tw/editrev.txt new file mode 100644 index 0000000..98a800a --- /dev/null +++ b/inc/lang/zh-tw/editrev.txt @@ -0,0 +1,2 @@ +**您目前載入的是本份文件的舊版!** 您如果存檔,這些舊版資料就會變成最新版本。 +---- diff --git a/inc/lang/zh-tw/index.txt b/inc/lang/zh-tw/index.txt new file mode 100644 index 0000000..e5fd243 --- /dev/null +++ b/inc/lang/zh-tw/index.txt @@ -0,0 +1,3 @@ +====== 網站地圖 ====== + +這個網站地圖列出了所有允許的頁面,依 [[doku>namespaces|分類名稱]] 排序。 diff --git a/inc/lang/zh-tw/install.html b/inc/lang/zh-tw/install.html new file mode 100644 index 0000000..85df3c7 --- /dev/null +++ b/inc/lang/zh-tw/install.html @@ -0,0 +1,7 @@ +

    本頁面旨在幫助您完成第一次安装和設定 Dokuwiki。關於安裝工具的更多訊息請參閱 官方文檔頁面

    + +

    DokuWiki 使用普通檔案來儲存 wiki 頁面,以及與頁面相關的訊息(例如:圖像、搜尋索引、修訂記錄等)。為了正常運作,DokuWiki 必須 擁有針對那些路徑和檔案的寫入權限。本安裝工具無法設定目錄權限,這通常要透過命令行、FTP 或您主機上的控制台(如cPanel)進行。

    + +

    本安裝工具將設定您的 DokuWiki 用於 ACL 的設定檔,它能讓管理員登入並使用「管理」功能來安裝附加元件、管理使用者、管理訪問權限和其他設定設定。它並不是 DokuWiki 正常運作所必須,但安裝之後將更方便管理。

    + +

    有經驗的或有特殊需求的使用者,請參閱更詳細的 安裝指南設定

    diff --git a/inc/lang/zh-tw/jquery.ui.datepicker.js b/inc/lang/zh-tw/jquery.ui.datepicker.js new file mode 100644 index 0000000..f5e02a6 --- /dev/null +++ b/inc/lang/zh-tw/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Ressol (ressol@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional[ "zh-TW" ] = { + closeText: "關閉", + prevText: "上個月", + nextText: "下個月", + 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/inc/lang/zh-tw/lang.php b/inc/lang/zh-tw/lang.php new file mode 100644 index 0000000..9f4a128 --- /dev/null +++ b/inc/lang/zh-tw/lang.php @@ -0,0 +1,369 @@ + + * @author GHSRobert Ciang + * @author chinsan + * @author Li-Jiun Huang + * @author http://www.chinese-tools.com/tools/converter-simptrad.html + * @author Wayne San + * @author Cheng-Wei Chien + * @author Shuo-Ting Jian + * @author syaoranhinata + * @author tsangho + * @author Danny Lin + * @author Stan + * @author June-Hao Hou + * @author lioujheyu + */ +$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'] = '本頁的編輯鎖定將在一分鐘內到期。要避免發生衝突,請按「預覽」鍵重設鎖定計時。'; +$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['js']['data_insecure'] = '警告:似乎你的資料目錄沒有適當的防護。請閲讀關於DokuWiki中的網頁存取安全性。'; +$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'] = '您的 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['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'] = '請輸入要上傳至本 wiki 的檔案名稱 (非必要):'; +$lang['txt_overwrt'] = '是否要覆蓋原有檔案'; +$lang['maxuploadsize'] = '每個上傳檔案不可大於 %s 。'; +$lang['allowedmime'] = '允許的副檔名列表'; +$lang['lockedby'] = '目前已被下列人員鎖定:'; +$lang['lockexpire'] = '預計解除鎖定於:'; +$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['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'] = '顯示此內容需要 Adobe Flash 附加元件。'; +$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。 +您可以重新解壓下載的封包或查閱完整的Dokuwiki 安裝指南'; +$lang['i_funcna'] = 'PHP 函數 %s 無法使用。也許您的主機供應者基於某些理由停用了它?'; +$lang['i_phpver'] = '您的 PHP 版本 %s 比需要的版本 %s 還低。您必須更新您的PHP。'; +$lang['i_permfail'] = '%s 無法經由 DokuWiki 寫入。您必須修正該目錄的權限!'; +$lang['i_confexists'] = '%s 已經存在'; +$lang['i_writeerr'] = '無法建立 %s。您必須檢查目錄/檔案的權限並手動建立該檔案。'; +$lang['i_badhash'] = '無法辨識或已遭修改的 dokuwiki.php (hash=%s)'; +$lang['i_badval'] = '%s —— 非法或空白的值'; +$lang['i_success'] = '設定已完成。您現在可以刪除 install.php 檔案。繼續到 +您的新 DokuWiki.'; +$lang['i_failure'] = '寫入設定檔時發生了一些錯誤。您必須在使用您的新 Dokuwiki 之前手動修正它們。'; +$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'] = '您正在閱讀分類名稱: %s 中的變更。您亦可觀看本 wiki 所有的最近更新。'; +$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/inc/lang/zh-tw/locked.txt b/inc/lang/zh-tw/locked.txt new file mode 100644 index 0000000..819e59e --- /dev/null +++ b/inc/lang/zh-tw/locked.txt @@ -0,0 +1,3 @@ +====== 頁面鎖定 ====== + +其他使用者正在編輯本頁,您必須等他完成編輯或等鎖定時間過去。 diff --git a/inc/lang/zh-tw/login.txt b/inc/lang/zh-tw/login.txt new file mode 100644 index 0000000..77269b5 --- /dev/null +++ b/inc/lang/zh-tw/login.txt @@ -0,0 +1,3 @@ +====== 登入 ====== + +您尚未登入,請輸入您的使用者名稱和密碼。 另外,瀏覽器需要啟用 cookies 以登入本 wiki。 diff --git a/inc/lang/zh-tw/mailtext.txt b/inc/lang/zh-tw/mailtext.txt new file mode 100644 index 0000000..7ffb83e --- /dev/null +++ b/inc/lang/zh-tw/mailtext.txt @@ -0,0 +1,12 @@ +您的 DokuWiki 有個新增或變動的頁面。詳細資料如下: + +日期 : @DATE@ +瀏覽器 : @BROWSER@ +IP 位址 : @IPADDRESS@ +主機名稱 : @HOSTNAME@ +舊版本 : @OLDPAGE@ +新版本 : @NEWPAGE@ +編輯摘要 : @SUMMARY@ +使用者 : @USER@ + +@DIFF@ diff --git a/inc/lang/zh-tw/mailwrap.html b/inc/lang/zh-tw/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/zh-tw/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/zh-tw/newpage.txt b/inc/lang/zh-tw/newpage.txt new file mode 100644 index 0000000..5c5da7e --- /dev/null +++ b/inc/lang/zh-tw/newpage.txt @@ -0,0 +1,3 @@ +====== 此主題不存在 ====== + +您來到了一個未建立頁面的主題。如果權限允許,您可以用 **建立此頁**按鈕建立頁面。 diff --git a/inc/lang/zh-tw/norev.txt b/inc/lang/zh-tw/norev.txt new file mode 100644 index 0000000..7fea647 --- /dev/null +++ b/inc/lang/zh-tw/norev.txt @@ -0,0 +1,3 @@ +====== 無此版本 ====== + +該版本的文件不存在。請用「舊版」按鈕檢視該文件所有舊版本清單。 diff --git a/inc/lang/zh-tw/onceexisted.txt b/inc/lang/zh-tw/onceexisted.txt new file mode 100644 index 0000000..b5c2513 --- /dev/null +++ b/inc/lang/zh-tw/onceexisted.txt @@ -0,0 +1,3 @@ +======= 此頁已不存在 ====== + +你點的連結的目標頁面已不存在。您可查看**舊版**瞭解頁面被刪除的時間及原因、載入舊版或還原舊版。 diff --git a/inc/lang/zh-tw/password.txt b/inc/lang/zh-tw/password.txt new file mode 100644 index 0000000..9898f24 --- /dev/null +++ b/inc/lang/zh-tw/password.txt @@ -0,0 +1,6 @@ +@FULLNAME@ 您好! + +這是您在位於 @DOKUWIKIURL@ 之 @TITLE@ 的使用者資料 + +帳號 : @LOGIN@ +密碼 : @PASSWORD@ diff --git a/inc/lang/zh-tw/preview.txt b/inc/lang/zh-tw/preview.txt new file mode 100644 index 0000000..7fd6554 --- /dev/null +++ b/inc/lang/zh-tw/preview.txt @@ -0,0 +1,3 @@ +====== 預覽 ====== + +以下是該文件的預覽。請記住:**您還未儲存它**! diff --git a/inc/lang/zh-tw/pwconfirm.txt b/inc/lang/zh-tw/pwconfirm.txt new file mode 100644 index 0000000..93ed569 --- /dev/null +++ b/inc/lang/zh-tw/pwconfirm.txt @@ -0,0 +1,9 @@ +@FULLNAME@ 您好! + +感謝您在 @TITLE@ ( @DOKUWIKIURL@ ) 註冊了使用者帳號。我們收到請求,希望能允許此帳號使用新密碼。 + +如果您沒有發送此請求,請忽略這封郵件。 + +若您真的要使用新密碼,請拜訪以下的連結。 + +@CONFIRM@ diff --git a/inc/lang/zh-tw/read.txt b/inc/lang/zh-tw/read.txt new file mode 100644 index 0000000..ed3d5e8 --- /dev/null +++ b/inc/lang/zh-tw/read.txt @@ -0,0 +1 @@ +本頁是唯讀的,您可以看到原始碼,但不能更動它。您如果覺得它不應被鎖上,請詢問管理員。 diff --git a/inc/lang/zh-tw/recent.txt b/inc/lang/zh-tw/recent.txt new file mode 100644 index 0000000..8710c68 --- /dev/null +++ b/inc/lang/zh-tw/recent.txt @@ -0,0 +1,3 @@ +====== 最近更新 ====== + +以下的頁面是最近才更新的: diff --git a/inc/lang/zh-tw/register.txt b/inc/lang/zh-tw/register.txt new file mode 100644 index 0000000..5d540d5 --- /dev/null +++ b/inc/lang/zh-tw/register.txt @@ -0,0 +1,3 @@ +====== 註冊新使用者 ====== + +若要註冊本 wiki 的帳號,請填寫下列資料。請確定您提供的是**合法的電郵地址**。如果您不必填寫密碼,系統就會為您自動產生登入密碼,並寄送到該電郵地址。登入名稱須符合正確[[doku>zh-tw:pagename|頁面名稱]]之條件。 diff --git a/inc/lang/zh-tw/registermail.txt b/inc/lang/zh-tw/registermail.txt new file mode 100644 index 0000000..22b7ff8 --- /dev/null +++ b/inc/lang/zh-tw/registermail.txt @@ -0,0 +1,10 @@ +有新的使用者註冊。詳細資料如下: + +帳號 : @NEWUSER@ +姓名 : @NEWNAME@ +電郵 : @NEWEMAIL@ + +日期 : @DATE@ +瀏覽器 : @BROWSER@ +IP 位址 : @IPADDRESS@ +主機名稱 : @HOSTNAME@ diff --git a/inc/lang/zh-tw/resendpwd.txt b/inc/lang/zh-tw/resendpwd.txt new file mode 100644 index 0000000..e575ecb --- /dev/null +++ b/inc/lang/zh-tw/resendpwd.txt @@ -0,0 +1,3 @@ +====== 寄送新密碼 ====== + +請在以下欄位輸入您的帳號,新密碼將會寄送到您註冊時填寫的電郵地址。 diff --git a/inc/lang/zh-tw/resetpwd.txt b/inc/lang/zh-tw/resetpwd.txt new file mode 100644 index 0000000..b226915 --- /dev/null +++ b/inc/lang/zh-tw/resetpwd.txt @@ -0,0 +1,3 @@ +====== 設定新密碼 ====== + +請為您的帳號輸入新密碼。 diff --git a/inc/lang/zh-tw/revisions.txt b/inc/lang/zh-tw/revisions.txt new file mode 100644 index 0000000..1ca060d --- /dev/null +++ b/inc/lang/zh-tw/revisions.txt @@ -0,0 +1,3 @@ +====== 舊版 ====== + +以下是該文件的舊版本。如要還原成某個舊版次,就點下它,然後按「編輯本頁」,並存檔起來就可以了。 diff --git a/inc/lang/zh-tw/searchpage.txt b/inc/lang/zh-tw/searchpage.txt new file mode 100644 index 0000000..5fe9a2e --- /dev/null +++ b/inc/lang/zh-tw/searchpage.txt @@ -0,0 +1,3 @@ +====== 搜尋精靈 ====== + +提示:您可以在下面找到您的搜尋結果。@CREATEPAGEINFO@ diff --git a/inc/lang/zh-tw/showrev.txt b/inc/lang/zh-tw/showrev.txt new file mode 100644 index 0000000..306aa6e --- /dev/null +++ b/inc/lang/zh-tw/showrev.txt @@ -0,0 +1,2 @@ +**這是本文件的舊版!** +---- diff --git a/inc/lang/zh-tw/stopwords.txt b/inc/lang/zh-tw/stopwords.txt new file mode 100644 index 0000000..e549250 --- /dev/null +++ b/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/inc/lang/zh-tw/subscr_digest.txt b/inc/lang/zh-tw/subscr_digest.txt new file mode 100644 index 0000000..2ab0bc0 --- /dev/null +++ b/inc/lang/zh-tw/subscr_digest.txt @@ -0,0 +1,15 @@ +您好! + +本 wiki ( @TITLE@ ) 的頁面 @PAGE@ 已更改。 +更改內容如下: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +舊版本:@OLDPAGE@ +新版本:@NEWPAGE@ + +要取消頁面提醒,請登入本 wiki @DOKUWIKIURL@ +然後拜訪 @SUBSCRIBE@ +並取消訂閱頁面或分類名稱的更改。 diff --git a/inc/lang/zh-tw/subscr_form.txt b/inc/lang/zh-tw/subscr_form.txt new file mode 100644 index 0000000..ba3f161 --- /dev/null +++ b/inc/lang/zh-tw/subscr_form.txt @@ -0,0 +1,3 @@ +====== 訂閱管理 ====== + +在此頁裏,您可以管理在目前頁面及分類名稱之訂閱。 \ No newline at end of file diff --git a/inc/lang/zh-tw/subscr_list.txt b/inc/lang/zh-tw/subscr_list.txt new file mode 100644 index 0000000..8cbb24c --- /dev/null +++ b/inc/lang/zh-tw/subscr_list.txt @@ -0,0 +1,12 @@ +您好! + +本 wiki ( @TITLE@ ) 的 @PAGE@ 分類名稱頁面已更改。 +更改內容如下: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +要取消頁面提醒,請登入本 wiki @DOKUWIKIURL@ +然後拜訪 @SUBSCRIBE@ +並取消訂閱頁面或分類名稱的更改。 diff --git a/inc/lang/zh-tw/subscr_single.txt b/inc/lang/zh-tw/subscr_single.txt new file mode 100644 index 0000000..db9ed2d --- /dev/null +++ b/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/inc/lang/zh-tw/updateprofile.txt b/inc/lang/zh-tw/updateprofile.txt new file mode 100644 index 0000000..7ff5698 --- /dev/null +++ b/inc/lang/zh-tw/updateprofile.txt @@ -0,0 +1,3 @@ +====== 更新個人資料 ====== + +您只需修改想更新的欄位就好,帳號名稱不能變更。 diff --git a/inc/lang/zh-tw/uploadmail.txt b/inc/lang/zh-tw/uploadmail.txt new file mode 100644 index 0000000..9572681 --- /dev/null +++ b/inc/lang/zh-tw/uploadmail.txt @@ -0,0 +1,10 @@ +有人把檔案上傳到您的 DokuWiki。詳細資料如下: + +檔名 : @MEDIA@ +日期 : @DATE@ +瀏覽器 : @BROWSER@ +IP 位址 : @IPADDRESS@ +主機名稱 : @HOSTNAME@ +大小 : @SIZE@ +MIME類型 : @MIME@ +使用者 : @USER@ diff --git a/inc/lang/zh/admin.txt b/inc/lang/zh/admin.txt new file mode 100644 index 0000000..9351454 --- /dev/null +++ b/inc/lang/zh/admin.txt @@ -0,0 +1,3 @@ +====== 管理 ====== + +在下面您能找到 DokuWiki 中可用管理任务的列表。 diff --git a/inc/lang/zh/adminplugins.txt b/inc/lang/zh/adminplugins.txt new file mode 100644 index 0000000..0c4bdb8 --- /dev/null +++ b/inc/lang/zh/adminplugins.txt @@ -0,0 +1 @@ +===== 附加插件 ===== diff --git a/inc/lang/zh/backlinks.txt b/inc/lang/zh/backlinks.txt new file mode 100644 index 0000000..0556eab --- /dev/null +++ b/inc/lang/zh/backlinks.txt @@ -0,0 +1,3 @@ +====== 反向链接 ====== + +这里是能够反向链接到当前页面的其他页面列表。 diff --git a/inc/lang/zh/conflict.txt b/inc/lang/zh/conflict.txt new file mode 100644 index 0000000..92eedf4 --- /dev/null +++ b/inc/lang/zh/conflict.txt @@ -0,0 +1,5 @@ +====== 存在一个更新的版本 ====== + +您编辑的文档存在一个更新的版本。这种情况的发生是因为在您编辑时有另一个用户更改了该文档。 + +请仔细检查下面列出的差别,并决定保留哪个版本。如果您选择“保存”,您的版本将被保留。点击“取消”将保留当前版本。 diff --git a/inc/lang/zh/denied.txt b/inc/lang/zh/denied.txt new file mode 100644 index 0000000..d835e28 --- /dev/null +++ b/inc/lang/zh/denied.txt @@ -0,0 +1,3 @@ +====== 拒绝授权 ====== + +对不起,您没有足够权限,无法继续。 diff --git a/inc/lang/zh/diff.txt b/inc/lang/zh/diff.txt new file mode 100644 index 0000000..a733ed5 --- /dev/null +++ b/inc/lang/zh/diff.txt @@ -0,0 +1,3 @@ +====== 差别 ====== + +这里会显示出您选择的修订版和当前版本之间的差别。 diff --git a/inc/lang/zh/draft.txt b/inc/lang/zh/draft.txt new file mode 100644 index 0000000..77bdb8c --- /dev/null +++ b/inc/lang/zh/draft.txt @@ -0,0 +1,5 @@ +====== 发现草稿 ====== + +您在本页最后的编辑过程没有正常结束。DokuWiki 在您的编辑过程中自动保存了一份草稿,您现在可以使用它继续编辑。 下面是最后编辑时的数据。 + +请决定您希望 //恢复// 您丢失的编辑数据,//删除// 自动保存的草稿,或者 //取消// 本编辑过程。 diff --git a/inc/lang/zh/edit.txt b/inc/lang/zh/edit.txt new file mode 100644 index 0000000..7f9041c --- /dev/null +++ b/inc/lang/zh/edit.txt @@ -0,0 +1 @@ +编辑本页后请点击“保存”。请参阅 [[wiki:syntax]] 了解维基语法。只有在您能 **改进** 该页面的前提下才编辑它。如果您想尝试语法,请先到 [[playground:playground|playground]] 里热身。 diff --git a/inc/lang/zh/editrev.txt b/inc/lang/zh/editrev.txt new file mode 100644 index 0000000..902d552 --- /dev/null +++ b/inc/lang/zh/editrev.txt @@ -0,0 +1,2 @@ +**您载入了该文档旧的修订版!** 如果您保存了它,您就会用这些数据创建一份新的修订版。 +---- diff --git a/inc/lang/zh/index.txt b/inc/lang/zh/index.txt new file mode 100644 index 0000000..7c27301 --- /dev/null +++ b/inc/lang/zh/index.txt @@ -0,0 +1,3 @@ +====== 索引 ====== + +这是根据 [[doku>zh:namespaces|命名空间]] 排列的所有可访问页面的索引。 diff --git a/inc/lang/zh/install.html b/inc/lang/zh/install.html new file mode 100644 index 0000000..6850b1d --- /dev/null +++ b/inc/lang/zh/install.html @@ -0,0 +1,7 @@ +

    本页面旨在帮助您完成第一次安装和配置 Dokuwiki。关于安装工具的更多信息请参阅其 官方文档页面

    + +

    DokuWiki 使用普通的文件保存维基页面和其他与这些页面挂钩的信息(例如:图像,搜索索引,修订记录等)。为了能正常运行,DokuWiki 必须 拥有针对那些路径和文件的写权限。本安装工具不能用于设置这些权限。对权限的操作通常通过命令行或使用您的网络服务提供商的 FTP 或控制面板(例如 cPanel)进行操作。

    + +

    本安装工具将设置您的 DokuWiki 配置 ACL,它能让管理员登录并使用“管理”功能来安装插件,管理用户,管理访问权限和其他配置设置。它并不是 DokuWiki 正常运行所必须的,但安装之后它将更方便您的管理。

    + +

    有经验的用户或有特殊需求的用户请参阅更详细的 安装指南配置设置

    diff --git a/inc/lang/zh/jquery.ui.datepicker.js b/inc/lang/zh/jquery.ui.datepicker.js new file mode 100644 index 0000000..a00553e --- /dev/null +++ b/inc/lang/zh/jquery.ui.datepicker.js @@ -0,0 +1,40 @@ +/* Chinese initialisation for the jQuery UI date picker plugin. */ +/* Written by Cloudream (cloudream@gmail.com). */ +( function( factory ) { + "use strict"; + + if ( typeof define === "function" && define.amd ) { + + // AMD. Register as an anonymous module. + define( [ "../widgets/datepicker" ], factory ); + } else { + + // Browser globals + factory( jQuery.datepicker ); + } +} )( function( datepicker ) { +"use strict"; + +datepicker.regional[ "zh-CN" ] = { + closeText: "关闭", + prevText: "上月", + nextText: "下月", + 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/inc/lang/zh/lang.php b/inc/lang/zh/lang.php new file mode 100644 index 0000000..7dcc294 --- /dev/null +++ b/inc/lang/zh/lang.php @@ -0,0 +1,411 @@ + + * @author 林晓东 + * @author alair + * @author better + * @author 小李 + * @author VinnieChow + * @author Lakejason0 + * @author Phy + * @author Jenxi + * @author FENG.JIE + * @author Xin + * @author HaoNan + * @author Aaron Zhou + * @author lempel + * @author ZDYX + * @author http://www.chinese-tools.com/tools/converter-tradsimp.html + * @author George Sheraton + * @author Simon zhan + * @author ben + * @author lainme + * @author caii + * @author Hiphen Lee + * @author Shuo-Ting Jian + * @author Rachel + * @author Donald + * @author Yangyu Huang + * @author anjianshi + * @author oott123 + * @author Cupen + * @author xiqingongzi + * @author qinghao + * @author Yuwei Sun + * @author Errol + * @author Garfield + * @author JellyChen <451453325@qq.com> + * @author tai + * @author 高博 + * @author hznupeter + * @author kuma + * @author phy25 + */ +$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['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 共享功能只有在 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['js']['data_insecure'] = '警告: 看起来你的数据集不太安全。 请参考以下链接Web Access Security in DokuWiki。'; +$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'] = '您的 DokuWiki 密码'; +$lang['reghere'] = '还没有账号?立即注册'; +$lang['profna'] = '本维基不允许修改个人信息'; +$lang['profnochange'] = '没有改动,不进行操作。'; +$lang['profnoempty'] = '不允许使用空的用户名或邮件地址。'; +$lang['profchanged'] = '用户信息更新成功。'; +$lang['profnodelete'] = '这个 wiki 不支持删除用户'; +$lang['profdeleteuser'] = '删除账号'; +$lang['profdeleted'] = '你的用户已经从这个 wiki 中删除'; +$lang['profconfdelete'] = '我希望删除我的账户。
    这项操作无法撤销。'; +$lang['profconfdeletemissing'] = '确认框未勾选'; +$lang['proffail'] = '用户设置没有更新。'; +$lang['proftokenlegend'] = '认证令牌'; +$lang['proftokengenerate'] = '重置令牌'; +$lang['proftokeninfo'] = '认证令牌可用于让第三方应用登录并代表您进行操作。重置令牌将使旧令牌失效,并注销使用先前令牌的所有应用。'; +$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['allowedmime'] = '允许文件扩展名列表'; +$lang['lockedby'] = '目前已被下列人员锁定:'; +$lang['lockexpire'] = '预计锁定解除于:'; +$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['unknowndate'] = '未知日期'; +$lang['noflash'] = '需要 Adobe Flash 插件 来播放本内容。 '; +$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 安装包。 + 您可以重新解压下载的程序包,或查阅完整的 + Dokuwiki 安装指南'; +$lang['i_funcna'] = 'PHP 功能 %s 无法使用。也许您的服务器提供商因为某些原因禁用了它。'; +$lang['i_disabled'] = '它已经被您的服务商禁用'; +$lang['i_funcnmail'] = '注意: PHP邮件功能不可用。%s 如果仍然不可用,则可以安装SMTP 插件。'; +$lang['i_phpver'] = '您的 PHP 版本 %s 低于最低要求的 %s。您需要升级您的 PHP 版本。'; +$lang['i_mbfuncoverload'] = '为了运行DokuWiki,您必须在php.ini中禁用mbstring.func_overload。'; +$lang['i_urandom'] = 'DokuWiki 无法为 Cookie 创建密码安全的数字。您可能需要检查 php.ini 中的 open_basedir 设置,以获取正确的/dev/urandom访问权限。'; +$lang['i_permfail'] = 'DokuWiki 无法写入 %s。您需要修改该路径的权限设定!'; +$lang['i_confexists'] = '%s 已经存在'; +$lang['i_writeerr'] = '无法创建 %s。您需要检查该路径/文件的权限设定并手动创建该文件。'; +$lang['i_badhash'] = '无法识别的或被修改的 dokuwiki.php(哈希值=%s)'; +$lang['i_badval'] = '%s - 非法或空值'; +$lang['i_success'] = '配置成功完成。您现在可以删除 install.php 了。继续进入 + 您全新的 DokuWiki。'; +$lang['i_failure'] = '写入配置文件的时候产生一些错误。在使用 您全新安装的 DokuWiki 前 + 您需要手动修复它们。'; +$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'] = '您当前看到的是%s 名称空间的变动。你还可以在查看整个维基的近期变动。'; +$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['email_fail'] = 'PHP mail() 不存在或被禁用。未发送以下电子邮件:'; +$lang['currentns'] = '当前命名空间'; +$lang['searchresult'] = '搜索结果'; +$lang['plainhtml'] = '纯HTML'; +$lang['wikimarkup'] = 'Wiki Markup 语言'; +$lang['page_nonexist_rev'] = '页面在 %s 不存在。它曾创建于 %s。'; +$lang['unable_to_parse_date'] = '无法解析参数 "%s"。'; +$lang['email_signature_text'] = '本邮件由 DokuWiki 自动创建 +@DOKUWIKIURL@'; +$lang['log_file_too_large'] = '日志文件太大。跳过前几行!'; +$lang['log_file_failed_to_open'] = '日志文件打开失败。'; +$lang['log_file_failed_to_read'] = '读取日志时发生错误。'; diff --git a/inc/lang/zh/locked.txt b/inc/lang/zh/locked.txt new file mode 100644 index 0000000..5bcf6ac --- /dev/null +++ b/inc/lang/zh/locked.txt @@ -0,0 +1,3 @@ +====== 页面已锁定 ====== + +本页面目前正被其他用户编辑。您要等到该用户完成编辑或锁定因过期而自动解除后才能编辑。 diff --git a/inc/lang/zh/login.txt b/inc/lang/zh/login.txt new file mode 100644 index 0000000..8ff8b38 --- /dev/null +++ b/inc/lang/zh/login.txt @@ -0,0 +1,3 @@ +====== 登录 ====== + +您尚未登录!请在下方输入您的用户名和密码进行登录。 您的浏览器需要支持 Cookies 才能正常登录。 diff --git a/inc/lang/zh/mailtext.txt b/inc/lang/zh/mailtext.txt new file mode 100644 index 0000000..f5e6081 --- /dev/null +++ b/inc/lang/zh/mailtext.txt @@ -0,0 +1,12 @@ +您的 DokuWiki 中有一个页面被添加或更改了。以下是详细资料: + +日期 : @DATE@ +浏览器 : @BROWSER@ +IP 地址 : @IPADDRESS@ +机器名称 : @HOSTNAME@ +修订记录 : @OLDPAGE@ +最新修订 : @NEWPAGE@ +编辑摘要 : @SUMMARY@ +用户 : @USER@ + +@DIFF@ diff --git a/inc/lang/zh/mailwrap.html b/inc/lang/zh/mailwrap.html new file mode 100644 index 0000000..d257190 --- /dev/null +++ b/inc/lang/zh/mailwrap.html @@ -0,0 +1,13 @@ + + +@TITLE@ + + + + +@HTMLBODY@ + +

    +@EMAILSIGNATURE@ + + \ No newline at end of file diff --git a/inc/lang/zh/newpage.txt b/inc/lang/zh/newpage.txt new file mode 100644 index 0000000..9ca65e3 --- /dev/null +++ b/inc/lang/zh/newpage.txt @@ -0,0 +1,3 @@ +====== 该主题尚不存在 ====== + +您访问的页面并不存在。如果允许,您可以使用**创建该页面**按钮来创建它。 diff --git a/inc/lang/zh/norev.txt b/inc/lang/zh/norev.txt new file mode 100644 index 0000000..6734bde --- /dev/null +++ b/inc/lang/zh/norev.txt @@ -0,0 +1,3 @@ +====== 没有该修订版 ====== + +您指定的修订版并不存在。请使用“修订记录”按钮查看本页面的修订记录列表。 diff --git a/inc/lang/zh/onceexisted.txt b/inc/lang/zh/onceexisted.txt new file mode 100644 index 0000000..85d6b03 --- /dev/null +++ b/inc/lang/zh/onceexisted.txt @@ -0,0 +1,3 @@ +======= 该页面不再存在 ====== + +你访问的页面不再存在。你可以查阅**页面历史版本**列表,其中记录了页面被删除的时间、原因,还可以查看或恢复历史版本。 diff --git a/inc/lang/zh/password.txt b/inc/lang/zh/password.txt new file mode 100644 index 0000000..39095a1 --- /dev/null +++ b/inc/lang/zh/password.txt @@ -0,0 +1,5 @@ +@FULLNAME@ 您好! + +这是您在 @TITLE@(@DOKUWIKIURL@)的用户资料 +用户名:@LOGIN@ +密码:@PASSWORD@ diff --git a/inc/lang/zh/preview.txt b/inc/lang/zh/preview.txt new file mode 100644 index 0000000..c897155 --- /dev/null +++ b/inc/lang/zh/preview.txt @@ -0,0 +1,3 @@ +====== 预览 ====== + +这是该文件的效果预览。**请记住:它并没有被保存**! diff --git a/inc/lang/zh/pwconfirm.txt b/inc/lang/zh/pwconfirm.txt new file mode 100644 index 0000000..1b31636 --- /dev/null +++ b/inc/lang/zh/pwconfirm.txt @@ -0,0 +1,9 @@ +@FULLNAME@ 您好! + +有人请求为您在 @DOKUWIKIURL@ 注册的用户名 @TITLE@ 发送新密码 + +如果您没有请求发送新密码,请忽略这封邮件。 + +为了确认发送新密码请求的确来自您,请使用下面的链接。 + +@CONFIRM@ diff --git a/inc/lang/zh/read.txt b/inc/lang/zh/read.txt new file mode 100644 index 0000000..10832a3 --- /dev/null +++ b/inc/lang/zh/read.txt @@ -0,0 +1 @@ +本页面只读。您可以查看源文件,但不能更改它。如果您觉得这是系统错误,请联系管理员。 diff --git a/inc/lang/zh/recent.txt b/inc/lang/zh/recent.txt new file mode 100644 index 0000000..f75cd03 --- /dev/null +++ b/inc/lang/zh/recent.txt @@ -0,0 +1,3 @@ +====== 最近更新 ====== + +以下的页面是最近才更新的: diff --git a/inc/lang/zh/register.txt b/inc/lang/zh/register.txt new file mode 100644 index 0000000..020320e --- /dev/null +++ b/inc/lang/zh/register.txt @@ -0,0 +1,3 @@ +====== 注册新用户 ====== + +填写以下资料来创建一个新帐户。请确定您提供的是 **正确的 E-mail 地址** - 如果您没有被要求在这里输入密码,那么新密码将通过您的邮件地址发送给您。 用于登录的用户名必须合法,请参阅 [[doku>zh:pagename|pagename]]。 diff --git a/inc/lang/zh/registermail.txt b/inc/lang/zh/registermail.txt new file mode 100644 index 0000000..56568dc --- /dev/null +++ b/inc/lang/zh/registermail.txt @@ -0,0 +1,10 @@ +新用户已创建。下面是详细信息: + +用户名 : @NEWUSER@ +全名 : @NEWNAME@ +E-mail : @NEWEMAIL@ + +日期 : @DATE@ +浏览器 : @BROWSER@ +IP 地址 : @IPADDRESS@ +机器名称 : @HOSTNAME@ diff --git a/inc/lang/zh/resendpwd.txt b/inc/lang/zh/resendpwd.txt new file mode 100644 index 0000000..5c1df99 --- /dev/null +++ b/inc/lang/zh/resendpwd.txt @@ -0,0 +1,3 @@ +====== 发送新密码 ====== + +请在下列区域中输入您的用户名来获取新密码。 一封包含确认链接的邮件将发送给您注册的邮件地址。 diff --git a/inc/lang/zh/resetpwd.txt b/inc/lang/zh/resetpwd.txt new file mode 100644 index 0000000..3c32f0f --- /dev/null +++ b/inc/lang/zh/resetpwd.txt @@ -0,0 +1,3 @@ +====== 设置新密码 ====== + +请为您在本维基上的账户设置一个新密码。 diff --git a/inc/lang/zh/revisions.txt b/inc/lang/zh/revisions.txt new file mode 100644 index 0000000..c460b6d --- /dev/null +++ b/inc/lang/zh/revisions.txt @@ -0,0 +1,3 @@ +====== 修订记录 ====== + +以下是当前文档的修订记录。如果要回复到某个旧的修订版,请在下面选择它,并点击“编辑本页”,之后保存即可。 diff --git a/inc/lang/zh/searchpage.txt b/inc/lang/zh/searchpage.txt new file mode 100644 index 0000000..424195b --- /dev/null +++ b/inc/lang/zh/searchpage.txt @@ -0,0 +1,3 @@ +====== 搜索 ====== + +下面将显示您的搜索结果。@CREATEPAGEINFO@ diff --git a/inc/lang/zh/showrev.txt b/inc/lang/zh/showrev.txt new file mode 100644 index 0000000..770fecc --- /dev/null +++ b/inc/lang/zh/showrev.txt @@ -0,0 +1,2 @@ +**这是本文档旧的修订版!** +---- diff --git a/inc/lang/zh/stopwords.txt b/inc/lang/zh/stopwords.txt new file mode 100644 index 0000000..0a18e46 --- /dev/null +++ b/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/inc/lang/zh/subscr_digest.txt b/inc/lang/zh/subscr_digest.txt new file mode 100644 index 0000000..53326ae --- /dev/null +++ b/inc/lang/zh/subscr_digest.txt @@ -0,0 +1,15 @@ +您好! + +@TITLE@ 中的页面 @PAGE@ 已经更改。 +这里是更改的内容: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +旧版本:@OLDPAGE@ +新版本:@NEWPAGE@ + +要取消页面提醒,从 @DOKUWIKIURL@ 登录维基,然后浏览 +@SUBSCRIBE@ +并退订页面以及/或者命名空间的更改。 diff --git a/inc/lang/zh/subscr_form.txt b/inc/lang/zh/subscr_form.txt new file mode 100644 index 0000000..65bfd40 --- /dev/null +++ b/inc/lang/zh/subscr_form.txt @@ -0,0 +1,3 @@ +====== 订阅管理 ====== + +这个页面允许您管理在当前页面和命名空间的订阅。 \ No newline at end of file diff --git a/inc/lang/zh/subscr_list.txt b/inc/lang/zh/subscr_list.txt new file mode 100644 index 0000000..79846f6 --- /dev/null +++ b/inc/lang/zh/subscr_list.txt @@ -0,0 +1,12 @@ +您好! + +@TITLE@ 中的命名空间 @PAGE@ 的页面已经更改。 +这里是更改的页面: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +要取消页面提醒,从 @DOKUWIKIURL@ 登录维基,然后浏览 +@SUBSCRIBE@ +并退订页面以及/或者命名空间的更改。 diff --git a/inc/lang/zh/subscr_single.txt b/inc/lang/zh/subscr_single.txt new file mode 100644 index 0000000..9c1adc8 --- /dev/null +++ b/inc/lang/zh/subscr_single.txt @@ -0,0 +1,18 @@ +您好! + +@TITLE@ 中的页面 @PAGE@ 已经更改。 +这里是更改的内容: + +-------------------------------------------------------- +@DIFF@ +-------------------------------------------------------- + +时间:@DATE@ +用户:@USER@ +编辑摘要:@SUMMARY@ +旧版本:@OLDPAGE@ +新版本:@NEWPAGE@ + +要取消页面提醒,从 @DOKUWIKIURL@ 登录维基,然后浏览 +@SUBSCRIBE@ +并退订页面以及/或者命名空间的更改。 diff --git a/inc/lang/zh/updateprofile.txt b/inc/lang/zh/updateprofile.txt new file mode 100644 index 0000000..d657b6b --- /dev/null +++ b/inc/lang/zh/updateprofile.txt @@ -0,0 +1,3 @@ +====== 更新您帐户的信息 ====== + +您只需要填写希望更改的区域即可。您不能更改用户名。 diff --git a/inc/lang/zh/uploadmail.txt b/inc/lang/zh/uploadmail.txt new file mode 100644 index 0000000..a5ce539 --- /dev/null +++ b/inc/lang/zh/uploadmail.txt @@ -0,0 +1,12 @@ +您好! + +一个文件被上传到您的 DokuWiki 站点。下面是详细信息: + +文件名 : @MEDIA@ +日期 : @DATE@ +浏览器 : @BROWSER@ +IP 地址 : @IPADDRESS@ +主机名 : @HOSTNAME@ +大小 : @SIZE@ +MIME 类型 : @MIME@ +用户 : @USER@ diff --git a/inc/legacy.php b/inc/legacy.php new file mode 100644 index 0000000..eb32e5c --- /dev/null +++ b/inc/legacy.php @@ -0,0 +1,21 @@ + + */ + +namespace dokuwiki; + +use dokuwiki\Extension\PluginController; + +return new class { + /** @var string[] Common libraries that are always loaded */ + protected array $commonLibs = [ + 'defines.php', + 'actions.php', + 'changelog.php', + 'common.php', + 'confutils.php', + 'pluginutils.php', + 'form.php', + 'fulltext.php', + 'html.php', + 'httputils.php', + 'indexer.php', + 'infoutils.php', + 'io.php', + 'mail.php', + 'media.php', + 'pageutils.php', + 'parserutils.php', + 'search.php', + 'template.php', + 'toolbar.php', + 'utf8.php', + 'auth.php', + 'compatibility.php', + 'deprecated.php', + 'legacy.php', + ]; + + /** @var string[] Classname to file mappings */ + protected array $fixedClassNames = [ + 'Diff' => 'DifferenceEngine.php', + 'UnifiedDiffFormatter' => 'DifferenceEngine.php', + 'TableDiffFormatter' => 'DifferenceEngine.php', + 'cache' => 'cache.php', + 'cache_parser' => 'cache.php', + 'cache_instructions' => 'cache.php', + 'cache_renderer' => 'cache.php', + 'Input' => 'Input.class.php', + 'JpegMeta' => 'JpegMeta.php', + 'SimplePie' => 'SimplePie.php', + 'FeedParser' => 'FeedParser.php', + 'SafeFN' => 'SafeFN.class.php', + 'Mailer' => 'Mailer.class.php', + 'Doku_Handler' => 'parser/handler.php', + 'Doku_Renderer' => 'parser/renderer.php', + 'Doku_Renderer_xhtml' => 'parser/xhtml.php', + 'Doku_Renderer_code' => 'parser/code.php', + 'Doku_Renderer_xhtmlsummary' => 'parser/xhtmlsummary.php', + 'Doku_Renderer_metadata' => 'parser/metadata.php' + ]; + + /** + * Load common libs and register autoloader + */ + public function __construct() + { + require_once(DOKU_INC . 'vendor/autoload.php'); + spl_autoload_register([$this, 'autoload']); + $this->loadCommonLibs(); + } + + /** + * require all the common libraries + * + * @return true + */ + public function loadCommonLibs() + { + foreach ($this->commonLibs as $lib) { + require_once(DOKU_INC . 'inc/' . $lib); + } + return true; + } + + /** + * spl_autoload_register callback + * + * @param string $className + * @return bool + */ + public function autoload($className) + { + // namespace to directory conversion + $classPath = str_replace('\\', '/', $className); + + return $this->autoloadFixedClass($className) + || $this->autoloadTestMockClass($classPath) + || $this->autoloadTestClass($classPath) + || $this->autoloadPluginClass($classPath) + || $this->autoloadTemplateClass($classPath) + || $this->autoloadCoreClass($classPath) + || $this->autoloadNamedPluginClass($className); + } + + /** + * Check if the class is one of the fixed names + * + * @param string $className + * @return bool true if the class was loaded, false otherwise + */ + protected function autoloadFixedClass($className) + { + if (isset($this->fixedClassNames[$className])) { + require($this->fixedClassNames[$className]); + return true; + } + return false; + } + + /** + * Check if the class is a test mock class + * + * @param string $classPath The class name using forward slashes as namespace separators + * @return bool true if the class was loaded, false otherwise + */ + protected function autoloadTestMockClass($classPath) + { + if ($this->prefixStrip($classPath, 'dokuwiki/test/mock/')) { + $file = DOKU_INC . '_test/mock/' . $classPath . '.php'; + if (file_exists($file)) { + require $file; + return true; + } + } + return false; + } + + /** + * Check if the class is a test mock class + * + * @param string $classPath The class name using forward slashes as namespace separators + * @return bool true if the class was loaded, false otherwise + */ + protected function autoloadTestClass($classPath) + { + if ($this->prefixStrip($classPath, 'dokuwiki/test/')) { + $file = DOKU_INC . '_test/tests/' . $classPath . '.php'; + if (file_exists($file)) { + require $file; + return true; + } + } + return false; + } + + /** + * Check if the class is a namespaced plugin class + * + * @param string $classPath The class name using forward slashes as namespace separators + * @return bool true if the class was loaded, false otherwise + */ + protected function autoloadPluginClass($classPath) + { + global $plugin_controller; + + if ($this->prefixStrip($classPath, 'dokuwiki/plugin/')) { + $classPath = str_replace('/test/', '/_test/', $classPath); // no underscore in test namespace + $file = DOKU_PLUGIN . $classPath . '.php'; + if (file_exists($file)) { + $plugin = substr($classPath, 0, strpos($classPath, '/')); + // don't load disabled plugin classes (only if plugin controller is available) + if (!defined('DOKU_UNITTEST') && $plugin_controller && plugin_isdisabled($plugin)) return false; + + try { + require $file; + } catch (\Throwable $e) { + ErrorHandler::showExceptionMsg($e, "Error loading plugin $plugin"); + } + return true; + } + } + return false; + } + + /** + * Check if the class is a namespaced template class + * + * @param string $classPath The class name using forward slashes as namespace separators + * @return bool true if the class was loaded, false otherwise + */ + protected function autoloadTemplateClass($classPath) + { + // template namespace + if ($this->prefixStrip($classPath, 'dokuwiki/template/')) { + $classPath = str_replace('/test/', '/_test/', $classPath); // no underscore in test namespace + $file = DOKU_INC . 'lib/tpl/' . $classPath . '.php'; + if (file_exists($file)) { + $template = substr($classPath, 0, strpos($classPath, '/')); + + try { + require $file; + } catch (\Throwable $e) { + ErrorHandler::showExceptionMsg($e, "Error loading template $template"); + } + return true; + } + } + return false; + } + + /** + * Check if the class is a namespaced DokuWiki core class + * + * @param string $classPath The class name using forward slashes as namespace separators + * @return bool true if the class was loaded, false otherwise + */ + protected function autoloadCoreClass($classPath) + { + if ($this->prefixStrip($classPath, 'dokuwiki/')) { + $file = DOKU_INC . 'inc/' . $classPath . '.php'; + if (file_exists($file)) { + require $file; + return true; + } + } + return false; + } + + /** + * Check if the class is a un-namespaced plugin class following our naming scheme + * + * @param string $className + * @return bool true if the class was loaded, false otherwise + */ + protected function autoloadNamedPluginClass($className) + { + global $plugin_controller; + + if ( + preg_match( + '/^(' . implode('|', PluginController::PLUGIN_TYPES) . ')_plugin_(' . + DOKU_PLUGIN_NAME_REGEX . + ')(?:_([^_]+))?$/', + $className, + $m + ) + ) { + $c = ((count($m) === 4) ? "/{$m[3]}" : ''); + $plg = DOKU_PLUGIN . "{$m[2]}/{$m[1]}$c.php"; + if (file_exists($plg)) { + // don't load disabled plugin classes (only if plugin controller is available) + if (!defined('DOKU_UNITTEST') && $plugin_controller && plugin_isdisabled($m[2])) return false; + try { + require $plg; + } catch (\Throwable $e) { + ErrorHandler::showExceptionMsg($e, "Error loading plugin {$m[2]}"); + } + } + return true; + } + return false; + } + + /** + * Check if the given string starts with the given prefix and strip it + * + * @param string $string + * @param string $prefix + * @return bool true if the prefix was found and stripped, false otherwise + */ + protected function prefixStrip(&$string, $prefix) + { + if (str_starts_with($string, $prefix)) { + $string = substr($string, strlen($prefix)); + return true; + } + return false; + } +}; diff --git a/inc/mail.php b/inc/mail.php new file mode 100644 index 0000000..77869e0 --- /dev/null +++ b/inc/mail.php @@ -0,0 +1,168 @@ + + */ + +/** + * 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 + * 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 + */ +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 = []; + 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; +} + +/** + * 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 + * @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 ($sLine === '') 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/inc/media.php b/inc/media.php new file mode 100644 index 0000000..1a6d168 --- /dev/null +++ b/inc/media.php @@ -0,0 +1,2239 @@ + + */ + +use dokuwiki\Ui\MediaRevisions; +use dokuwiki\Cache\CacheImageMod; +use splitbrain\slika\Exception; +use dokuwiki\PassHash; +use dokuwiki\ChangeLog\MediaChangeLog; +use dokuwiki\Extension\Event; +use dokuwiki\Form\Form; +use dokuwiki\HTTP\DokuHTTPClient; +use dokuwiki\Logger; +use dokuwiki\Subscriptions\MediaSubscriptionSender; +use dokuwiki\Ui\Media\DisplayRow; +use dokuwiki\Ui\Media\DisplayTile; +use dokuwiki\Ui\MediaDiff; +use dokuwiki\Utf8\PhpString; +use dokuwiki\Utf8\Sort; +use splitbrain\slika\Slika; + +/** + * 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 + * + * @param array $data + * @param string $id + */ +function media_filesinuse($data, $id) +{ + global $lang; + echo '

    ' . $lang['reference'] . ' ' . hsc(noNS($id)) . '

    '; + echo '

    ' . hsc($lang['ref_inuse']) . '

    '; + + $hidden = 0; //count of hits without read permission + foreach ($data as $row) { + if (auth_quickaclcheck($row) >= AUTH_READ && isVisiblePage($row)) { + echo '
    '; + echo '' . hsc($row) . ''; + echo '
    '; + } else $hidden++; + } + if ($hidden) { + echo '
    ' . $lang['ref_hidden'] . '
    '; + } +} + +/** + * Handles the saving of image meta data + * + * @author Andreas Gohr + * @author Kate Arzamastseva + * + * @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 + * + * @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 + * + * @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) . ':*', '', []) >= AUTH_READ) return true; + return false; +} + +/** + * Display the form to edit image meta data + * + * @author Andreas Gohr + * @author Kate Arzamastseva + * + * @param string $id media id + * @param int $auth permission level + * @return bool + */ +function media_metaform($id, $auth) +{ + global $lang; + + if ($auth < AUTH_UPLOAD) { + echo '
    ' . $lang['media_perm_upload'] . '
    ' . DOKU_LF; + return false; + } + + // load the field descriptions + static $fields = null; + if ($fields === null) { + $config_files = getConfigFiles('mediameta'); + foreach ($config_files as $config_file) { + if (file_exists($config_file)) include($config_file); + } + } + + $src = mediaFN($id); + + // output + $form = new Form([ + 'action' => media_managerURL(['tab_details' => 'view'], '&'), + 'class' => 'meta' + ]); + $form->addTagOpen('div')->addClass('no'); + $form->setHiddenField('img', $id); + $form->setHiddenField('mediado', 'save'); + foreach ($fields as $key => $field) { + // get current value + if (empty($field[0])) continue; + $tags = [$field[0]]; + if (isset($field[3]) && is_array($field[3])) $tags = array_merge($tags, $field[3]); + $value = tpl_img_getTag($tags, '', $src); + $value = cleanText($value); + + // prepare attributes + $p = [ + 'class' => 'edit', + 'id' => 'meta__' . $key, + 'name' => 'meta[' . $field[0] . ']' + ]; + + $form->addTagOpen('div')->addClass('row'); + if ($field[2] == 'text') { + $form->addTextInput( + $p['name'], + ($lang[$field[1]] ?: $field[1] . ':') + )->id($p['id'])->addClass($p['class'])->val($value); + } else { + $form->addTextarea($p['name'], $lang[$field[1]])->id($p['id']) + ->val(formText($value)) + ->addClass($p['class']) + ->attr('rows', '6')->attr('cols', '50'); + } + $form->addTagClose('div'); + } + $form->addTagOpen('div')->addClass('buttons'); + $form->addButton('mediado[save]', $lang['btn_save'])->attr('type', 'submit') + ->attrs(['accesskey' => 's']); + $form->addTagClose('div'); + + $form->addTagClose('div'); + echo $form->toHTML(); + return true; +} + +/** + * Convenience function to check if a media file is still in use + * + * @author Michael Klier + * + * @param string $id media id + * @return array|bool + */ +function media_inuse($id) +{ + global $conf; + + if ($conf['refcheck']) { + $mediareferences = ft_mediause($id, true); + if ($mediareferences === []) { + return false; + } else { + return $mediareferences; + } + } else { + return false; + } +} + +/** + * Handles media file deletions + * + * If configured, checks for media references before deletion + * + * @author Andreas Gohr + * + * @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 = []; + $data['id'] = $id; + $data['name'] = PhpString::basename($file); + $data['path'] = $file; + $data['size'] = (file_exists($file)) ? filesize($file) : 0; + + $data['unl'] = false; + $data['del'] = false; + $evt = new 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'); + [$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 ($INPUT->server->has('CONTENT_LENGTH') && ($realSize != $INPUT->server->int('CONTENT_LENGTH'))) { + unlink($path); + return false; + } + + $res = media_save( + ['name' => $path, 'mime' => $mime, 'ext' => $ext], + $ns . ':' . $id, + ($INPUT->get->str('ow') == 'true'), + $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 + * @author Michael Klier + * + * @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 + [$fext, $fmime] = mimetype($file['name']); + [$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( + [ + '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 ["You don't have permissions to upload files.", -1]; + } + + if (!isset($file['mime']) || !isset($file['ext'])) { + [$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( + static fn($q) => preg_quote($q, "/"), + $types + ); + $regex = implode('|', $types); + + // because a temp file was created already + if (!preg_match('/\.(' . $regex . ')$/i', $fn)) { + return [$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 [$lang['uploadexist'], 0]; + } + // check for valid content + $ok = media_contentcheck($file['name'], $file['mime']); + if ($ok == -1) { + return [sprintf($lang['uploadbadcontent'], '.' . $file['ext']), -1]; + } elseif ($ok == -2) { + return [$lang['uploadspam'], -1]; + } elseif ($ok == -3) { + return [$lang['uploadxss'], -1]; + } + + // prepare event data + $data = []; + $data[0] = $file['name']; + $data[1] = $fn; + $data[2] = $id; + $data[3] = $file['mime']; + $data[4] = $overwrite; + $data[5] = $move; + + // trigger event + return Event::createAndTrigger('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true); +} + +/** + * Callback adapter for media_upload_finish() triggered by MEDIA_UPLOAD_FINISH + * + * @author Michael Klier + * + * @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 + * @author Michael Klier + * @author Kate Arzamastseva + * + * @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, $new); + // 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 [$lang['uploadfail'], -1]; + } +} + +/** + * Moves the current version of media file to the media_attic + * directory + * + * @author Kate Arzamastseva + * + * @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 -= $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 + * @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 (str_starts_with($mime, '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 (str_starts_with($mime, '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 + * + * @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 + */ +function media_notify($id, $file, $mime, $old_rev = false, $current_rev = false) +{ + global $conf; + if (empty($conf['notify'])) return; //notify enabled? + + $subscription = new MediaSubscriptionSender(); + $subscription->sendMediaDiff($conf['notify'], 'uploadmail', $id, $old_rev, $current_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 '

    :' . hsc($ns) . '

    ' . NL; + + if ($auth < AUTH_READ) { + // FIXME: print permission warning here instead? + echo '
    ' . $lang['nothingfound'] . '
    ' . NL; + } else { + if (!$fullscreenview) { + media_uploadform($ns, $auth); + media_searchform($ns); + } + + $dir = utf8_encodeFN(str_replace(':', '/', $ns)); + $data = []; + search( + $data, + $conf['mediadir'], + 'search_mediafiles', + ['showmsg' => true, 'depth' => 1], + $dir, + 1, + $sort + ); + + if (!count($data)) { + echo '
    ' . $lang['nothingfound'] . '
    ' . NL; + } else { + if ($fullscreenview) { + echo '
      '; + } + foreach ($data as $item) { + if (!$fullscreenview) { + //FIXME old call: media_printfile($item,$auth,$jump); + $display = new DisplayRow($item); + $display->scrollIntoView($jump == $item->getID()); + $display->show(); + } else { + //FIXME old call: media_printfile_thumbs($item,$auth,$jump); + echo '
    • '; + $display = new DisplayTile($item); + $display->scrollIntoView($jump == $item->getID()); + $display->show(); + echo '
    • '; + } + } + if ($fullscreenview) echo '
    ' . NL; + } + } +} + +/** + * Prints tabs for files list actions + * + * @author Kate Arzamastseva + * @author Adrian Lang + * + * @param string $selected_tab - opened tab + */ + +function media_tabs_files($selected_tab = '') +{ + global $lang; + $tabs = []; + foreach ( + [ + 'files' => 'mediaselect', + 'upload' => 'media_uploadtab', + 'search' => 'media_searchtab' + ] as $tab => $caption + ) { + $tabs[$tab] = [ + 'href' => media_managerURL(['tab_files' => $tab], '&'), + 'caption' => $lang[$caption] + ]; + } + + html_tabs($tabs, $selected_tab); +} + +/** + * Prints tabs for files details actions + * + * @author Kate Arzamastseva + * @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 = []; + $tabs['view'] = [ + 'href' => media_managerURL(['tab_details' => 'view'], '&'), + 'caption' => $lang['media_viewtab'] + ]; + + [, $mime] = mimetype($image); + if ($mime == 'image/jpeg' && file_exists(mediaFN($image))) { + $tabs['edit'] = [ + 'href' => media_managerURL(['tab_details' => 'edit'], '&'), + 'caption' => $lang['media_edittab'] + ]; + } + if ($conf['mediarevisions']) { + $tabs['history'] = [ + 'href' => media_managerURL(['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 + */ +function media_tab_files_options() +{ + global $lang; + global $INPUT; + global $ID; + + $form = new Form([ + 'method' => 'get', + 'action' => wl($ID), + 'class' => 'options' + ]); + $form->addTagOpen('div')->addClass('no'); + $form->setHiddenField('sectok', null); + $media_manager_params = media_managerURL([], '', false, true); + foreach ($media_manager_params as $pKey => $pVal) { + $form->setHiddenField($pKey, $pVal); + } + if ($INPUT->has('q')) { + $form->setHiddenField('q', $INPUT->str('q')); + } + $form->addHTML('
      ' . NL); + foreach ( + [ + 'list' => ['listType', ['thumbs', 'rows']], + 'sort' => ['sortBy', ['name', 'date']] + ] as $group => $content + ) { + $checked = "_media_get_{$group}_type"; + $checked = $checked(); + + $form->addHTML('
    • '); + foreach ($content[1] as $option) { + $attrs = []; + if ($checked == $option) { + $attrs['checked'] = 'checked'; + } + $radio = $form->addRadioButton( + $group . '_dwmedia', + $lang['media_' . $group . '_' . $option] + )->val($option)->id($content[0] . '__' . $option)->addClass($option); + $radio->attrs($attrs); + } + $form->addHTML('
    • ' . NL); + } + $form->addHTML('
    • '); + $form->addButton('', $lang['btn_apply'])->attr('type', 'submit'); + $form->addHTML('
    • ' . NL); + $form->addHTML('
    ' . NL); + $form->addTagClose('div'); + echo $form->toHTML(); +} + +/** + * Returns type of sorting for the list of files in media manager + * + * @author Kate Arzamastseva + * + * @return string - sort type + */ +function _media_get_sort_type() +{ + return _media_get_display_param('sort', ['default' => 'name', 'date']); +} + +/** + * Returns type of listing for the list of files in media manager + * + * @author Kate Arzamastseva + * + * @return string - list type + */ +function _media_get_list_type() +{ + return _media_get_display_param('list', ['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 + * + * @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 '
    ' . $lang['media_perm_read'] . '
    ' . NL; + } else { + media_filelist($ns, $auth, $jump, true, _media_get_sort_type()); + } +} + +/** + * Prints tab that displays uploading form + * + * @author Kate Arzamastseva + * + * @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 '
    ' . NL; + if ($auth >= AUTH_UPLOAD) { + echo '

    ' . $lang['mediaupload'] . '

    '; + } + media_uploadform($ns, $auth, true); + echo '
    ' . NL; +} + +/** + * Prints tab that displays search form + * + * @author Kate Arzamastseva + * + * @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 '' . NL; +} + +/** + * Prints tab that displays mediafile details + * + * @author Kate Arzamastseva + * + * @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 '
    ' . $lang['media_perm_read'] . '
    ' . NL; + } +} + +/** + * Prints tab that displays form for editing mediafile metadata + * + * @author Kate Arzamastseva + * + * @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) { + [, $mime] = mimetype($image); + if ($mime == 'image/jpeg') media_metaform($image, $auth); + } +} + +/** + * Prints tab that displays mediafile revisions + * + * @author Kate Arzamastseva + * + * @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') { + (new MediaDiff($image))->show(); //media_diff($image, $ns, $auth); + } else { + $first = $INPUT->int('first', -1); + (new MediaRevisions($image))->show($first); + } + } else { + echo '
    ' . $lang['media_perm_read'] . '
    ' . 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 + */ +function media_preview($image, $auth, $rev = '', $meta = false) +{ + + $size = media_image_preview_size($image, $rev, $meta); + + if ($size) { + global $lang; + echo '
    '; + + $more = []; + 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 ''; + echo ''; + echo ''; + + echo '
    '; + } +} + +/** + * Prints mediafile action buttons + * + * @author Kate Arzamastseva + * + * @param string $image media id + * @param int $auth permission level + * @param int|string $rev revision timestamp, or empty string + */ +function media_preview_buttons($image, $auth, $rev = '') +{ + global $lang, $conf; + + echo '
      '; + + if ($auth >= AUTH_DELETE && !$rev && file_exists(mediaFN($image))) { + // delete button + $form = new Form([ + 'id' => 'mediamanager__btn_delete', + 'action' => media_managerURL(['delete' => $image], '&'), + ]); + $form->addTagOpen('div')->addClass('no'); + $form->addButton('', $lang['btn_delete'])->attr('type', 'submit'); + $form->addTagClose('div'); + echo '
    • '; + echo $form->toHTML(); + echo '
    • '; + } + + $auth_ow = (($conf['mediarevisions']) ? AUTH_UPLOAD : AUTH_DELETE); + if ($auth >= $auth_ow && !$rev) { + // upload new version button + $form = new Form([ + 'id' => 'mediamanager__btn_update', + 'action' => media_managerURL(['image' => $image, 'mediado' => 'update'], '&'), + ]); + $form->addTagOpen('div')->addClass('no'); + $form->addButton('', $lang['media_update'])->attr('type', 'submit'); + $form->addTagClose('div'); + echo '
    • '; + echo $form->toHTML(); + echo '
    • '; + } + + if ($auth >= AUTH_UPLOAD && $rev && $conf['mediarevisions'] && file_exists(mediaFN($image, $rev))) { + // restore button + $form = new Form([ + 'id' => 'mediamanager__btn_restore', + 'action' => media_managerURL(['image' => $image], '&'), + ]); + $form->addTagOpen('div')->addClass('no'); + $form->setHiddenField('mediado', 'restore'); + $form->setHiddenField('rev', $rev); + $form->addButton('', $lang['media_restore'])->attr('type', 'submit'); + $form->addTagClose('div'); + echo '
    • '; + echo $form->toHTML(); + echo '
    • '; + } + + echo '
    '; +} + +/** + * Returns image width and height for mediamanager preview panel + * + * @author Kate Arzamastseva + * @param string $image + * @param int|string $rev + * @param JpegMeta|bool $meta + * @param int $size + * @return array + */ +function media_image_preview_size($image, $rev, $meta = false, $size = 500) +{ + if ( + !preg_match("/\.(jpe?g|gif|png)$/", $image) + || !file_exists($filename = mediaFN($image, $rev)) + ) return []; + + $info = getimagesize($filename); + $w = $info[0]; + $h = $info[1]; + + if ($meta && ($w > $size || $h > $size)) { + $ratio = $meta->getResizeRatio($size, $size); + $w = floor($w * $ratio); + $h = floor($h * $ratio); + } + return [$w, $h]; +} + +/** + * Returns the requested EXIF/IPTC tag from the image meta + * + * @author Kate Arzamastseva + * + * @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 = false, $alt = '') +{ + if (!$meta) return $alt; + $info = $meta->getField($tags); + if (!$info) return $alt; + return $info; +} + +/** + * Returns mediafile tags + * + * @author Kate Arzamastseva + * + * @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 = []; + + foreach ($fields as $tag) { + $t = []; + if (!empty($tag[0])) $t = [$tag[0]]; + if (isset($tag[3]) && is_array($tag[3])) $t = array_merge($t, $tag[3]); + $value = media_getTag($t, $meta); + $tags[] = ['tag' => $tag, 'value' => $value]; + } + + return $tags; +} + +/** + * Prints mediafile tags + * + * @author Kate Arzamastseva + * + * @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 '
    ' . NL; + foreach ($tags as $tag) { + if ($tag['value']) { + $value = cleanText($tag['value']); + echo '
    ' . $lang[$tag['tag'][1]] . '
    '; + if ($tag['tag'][2] == 'date') echo dformat($value); + else echo hsc($value); + echo '
    ' . NL; + } + } + echo '
    ' . NL; + echo '
    ' . NL; + echo '
    ' . $lang['reference'] . ':
    '; + $media_usage = ft_mediause($image, true); + if ($media_usage !== []) { + foreach ($media_usage as $path) { + echo '
    ' . html_wikilink($path) . '
    '; + } + } else { + echo '
    ' . $lang['nothingfound'] . '
    '; + } + echo '
    ' . NL; +} + +/** + * Shows difference between two revisions of file + * + * @author Kate Arzamastseva + * + * @param string $image image id + * @param string $ns + * @param int $auth permission level + * @param bool $fromajax + * + * @deprecated 2020-12-31 + */ +function media_diff($image, $ns, $auth, $fromajax = false) +{ + dbg_deprecated('see ' . MediaDiff::class . '::show()'); +} + +/** + * Callback for media file diff + * + * @param array $data event data + * + * @deprecated 2020-12-31 + */ +function _media_file_diff($data) +{ + dbg_deprecated('see ' . MediaDiff::class . '::show()'); +} + +/** + * Shows difference between two revisions of image + * + * @author Kate Arzamastseva + * + * @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 + * @deprecated 2020-12-31 + */ +function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax) +{ + dbg_deprecated('see ' . MediaDiff::class . '::showFileDiff()'); +} + +/** + * Prints two images side by side + * and slider + * + * @author Kate Arzamastseva + * + * @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 + * @deprecated 2020-12-31 + */ +function media_image_diff($image, $l_rev, $r_rev, $l_size, $r_size, $type) +{ + dbg_deprecated('see ' . MediaDiff::class . '::showImageDiff()'); +} + +/** + * 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 + */ +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; + [, $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 + * @author Andreas Gohr + * @author Kate Arzamastseva + * @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 = [ + 'ns' => $ns, + 'data' => [], + 'query' => $query + ]; + if (!blank($query)) { + $evt = new 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(['\*', '\?'], ['.*', '.'], $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_mediafiles', + ['showmsg' => false, 'pattern' => $pattern], + $dir, + 1, + $sort + ); + } + $evt->advise_after(); + unset($evt); + } + + if (!$fullscreen) { + echo '

    ' . sprintf($lang['searchmedia_in'], hsc($ns) . ':*') . '

    ' . NL; + media_searchform($ns, $query); + } + + if (!count($evdata['data'])) { + echo '
    ' . $lang['nothingfound'] . '
    ' . NL; + } else { + if ($fullscreen) { + echo '
      '; + } + foreach ($evdata['data'] as $item) { + if (!$fullscreen) { + // FIXME old call: media_printfile($item,$item['perm'],'',true); + $display = new DisplayRow($item); + $display->relativeDisplay($ns); + $display->show(); + } else { + // FIXME old call: media_printfile_thumbs($item,$item['perm'],false,true); + $display = new DisplayTile($item); + $display->relativeDisplay($ns); + echo '
    • '; + $display->show(); + echo '
    • '; + } + } + if ($fullscreen) echo '
    ' . 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 = '') +{ + [$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 '' . $filename . ''; +} + +/** + * Build link based on the current, adding/rewriting parameters + * + * @author Kate Arzamastseva + * + * @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 = '&', $abs = false, $params_array = false) +{ + global $ID; + global $INPUT; + + $gets = ['do' => 'media']; + $media_manager_params = ['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 + * @author Kate Arzamastseva + * + * @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 '
    ' . $lang['media_perm_upload'] . '
    ' . 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 + $form = new Form([ + 'id' => 'dw__upload', + 'enctype' => 'multipart/form-data', + 'action' => ($fullscreen) + ? media_managerURL(['tab_files' => 'files', 'tab_details' => 'view'], '&') + : DOKU_BASE . 'lib/exe/mediamanager.php', + ]); + $form->addTagOpen('div')->addClass('no'); + $form->setHiddenField('ns', hsc($ns)); // FIXME hsc required? + $form->addTagOpen('p'); + $form->addTextInput('upload', $lang['txt_upload'])->id('upload__file') + ->attrs(['type' => 'file']); + $form->addTagClose('p'); + $form->addTagOpen('p'); + $form->addTextInput('mediaid', $lang['txt_filename'])->id('upload__name') + ->val(noNS($id)); + $form->addButton('', $lang['btn_upload'])->attr('type', 'submit'); + $form->addTagClose('p'); + if ($auth >= $auth_ow) { + $form->addTagOpen('p'); + $attrs = []; + if ($update) $attrs['checked'] = 'checked'; + $form->addCheckbox('ow', $lang['txt_overwrt'])->id('dw__ow')->val('1') + ->addClass('check')->attrs($attrs); + $form->addTagClose('p'); + } + $form->addTagClose('div'); + + if (!$fullscreen) { + echo '
    ' . $lang['mediaupload'] . '
    ' . DOKU_LF; + } else { + echo DOKU_LF; + } + + echo '
    ' . DOKU_LF; + echo $form->toHTML('Upload'); + echo '
    ' . DOKU_LF; + + echo '

    '; + printf($lang['maxuploadsize'], filesize_h(media_getuploadsize())); + echo ' ' . $lang['allowedmime'] . ''; + echo ' ' . implode(', ', array_keys(getMimeTypes())) . ''; + echo '

    ' . DOKU_LF; +} + +/** + * 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 = php_to_byte(@ini_get('post_max_size')); + $suho = php_to_byte(@ini_get('suhosin.post.max_value_length')); + $upld = 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 + * @author Kate Arzamastseva + * + * @param string $ns + * @param string $query + * @param bool $fullscreen + */ +function media_searchform($ns, $query = '', $fullscreen = false) +{ + global $lang; + + // The default HTML search form + $form = new Form([ + 'id' => 'dw__mediasearch', + 'action' => ($fullscreen) + ? media_managerURL([], '&') + : DOKU_BASE . 'lib/exe/mediamanager.php', + ]); + $form->addTagOpen('div')->addClass('no'); + $form->setHiddenField('ns', $ns); + $form->setHiddenField($fullscreen ? 'mediado' : 'do', 'searchlist'); + + $form->addTagOpen('p'); + $form->addTextInput('q', $lang['searchmedia']) + ->attr('title', sprintf($lang['searchmedia_in'], hsc($ns) . ':*')) + ->val($query); + $form->addHTML(' '); + $form->addButton('', $lang['btn_search'])->attr('type', 'submit'); + $form->addTagClose('p'); + $form->addTagClose('div'); + echo $form->toHTML('SearchMedia'); +} + +/** + * Build a tree outline of available media namespaces + * + * @author Andreas Gohr + * + * @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 = []; + search($data, $conf['mediadir'], 'search_index', ['ns' => $ns_dir, 'nofiles' => true]); + + // wrap a list with the root level around the other namespaces + array_unshift($data, ['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 && Sort::strcmp($data[$pos]['id'], $tmp_ns) > 0) + ) { + array_splice($data, $pos, 0, [['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 + * + * @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 .= ''; + else $ret .= ''; + $ret .= $item['label']; + $ret .= ''; + return $ret; +} + +/** + * Userfunction for html_buildlist + * + * Prints a media namespace tree item opener + * + * @author Andreas Gohr + * + * @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 '
  • ' . + '' . $alt . ''; +} + +/** + * Resizes or crop the given image to the given size + * + * @author Andreas Gohr + * + * @param string $file filename, path to file + * @param string $ext extension + * @param int $w desired width + * @param int $h desired height + * @param bool $crop should a center crop be used? + * @return string path to resized or original size if failed + */ +function media_mod_image($file, $ext, $w, $h = 0, $crop = false) +{ + global $conf; + if (!$h) $h = 0; + // we wont scale up to infinity + if ($w > 2000 || $h > 2000) return $file; + + $operation = $crop ? 'crop' : 'resize'; + + $options = [ + 'quality' => $conf['jpg_quality'], + 'imconvert' => $conf['im_convert'], + ]; + + $cache = new CacheImageMod($file, $w, $h, $ext, $crop); + if (!$cache->useCache()) { + try { + Slika::run($file, $options) + ->autorotate() + ->$operation($w, $h) + ->save($cache->cache, $ext); + if ($conf['fperm']) @chmod($cache->cache, $conf['fperm']); + } catch (Exception $e) { + Logger::debug($e->getMessage()); + return $file; + } + } + + return $cache->cache; +} + +/** + * Resizes the given image to the given size + * + * @author Andreas Gohr + * + * @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) +{ + return media_mod_image($file, $ext, $w, $h, false); +} + +/** + * Center crops the given image to the wanted size + * + * @author Andreas Gohr + * + * @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) +{ + return media_mod_image($file, $ext, $w, $h, true); +} + +/** + * 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 + * + * @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 + * @author Pavel Vitis + * + * @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 + * + * @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 && $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 + * @author Andreas Gohr + * + * @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 + * + * @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 + * @deprecated 2020-09-01 + */ +function media_crop_imageIM($ext, $from, $from_w, $from_h, $to, $to_w, $to_h, $ofs_x, $ofs_y) +{ + global $conf; + dbg_deprecated('splitbrain\\Slika'); + + // 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 + * @author Sebastian Wienecke + * + * @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 + * @deprecated 2020-09-01 + */ +function media_resize_imageGD($ext, $from, $from_w, $from_h, $to, $to_w, $to_h, $ofs_x = 0, $ofs_y = 0) +{ + global $conf; + dbg_deprecated('splitbrain\\Slika'); + + 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 resources + imagedestroy($image); + 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 + */ +function media_alternativefiles($src, $exts) +{ + + $files = []; + [$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)) { + [/* 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 + */ +function media_supportedav($mime, $type = null) +{ + $supportedAudio = [ + 'ogg' => 'audio/ogg', + 'mp3' => 'audio/mpeg', + 'wav' => 'audio/wav' + ]; + $supportedVideo = [ + '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é + */ +function media_trackfiles($src) +{ + $kinds = [ + 'sub' => 'subtitles', + 'cap' => 'captions', + 'des' => 'descriptions', + 'cha' => 'chapters', + 'met' => 'metadata' + ]; + + $files = []; + $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'] = [$kinds[$matches[1]], $matches[2]]; + } + } + return $files; +} + +/* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */ diff --git a/inc/pageutils.php b/inc/pageutils.php new file mode 100644 index 0000000..deadc52 --- /dev/null +++ b/inc/pageutils.php @@ -0,0 +1,771 @@ + + * @todo Combine similar functions like {wiki,media,meta}FN() + */ + +use dokuwiki\Utf8\PhpString; +use dokuwiki\Utf8\Clean; +use dokuwiki\File\Resolver; +use dokuwiki\Extension\Event; +use dokuwiki\ChangeLog\MediaChangeLog; +use dokuwiki\ChangeLog\PageChangeLog; +use dokuwiki\File\MediaResolver; +use dokuwiki\File\PageResolver; + +/** + * 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 + * + * @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 . + PhpString::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 (str_ends_with($id, ':') || ($conf['useslash'] && str_ends_with($id, '/'))) { + if (page_exists($id . $conf['start'])) { + // start page inside namespace + $id .= $conf['start']; + } elseif (page_exists($id . noNS(cleanID($id)))) { + // page named like the NS inside the NS + $id .= noNS(cleanID($id)); + } elseif (page_exists($id)) { + // page like namespace exists + $id = substr($id, 0, -1); + } else { + // fall back to default + $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 ($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 + * + * @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 = PhpString::strtolower($id); + + //alternative namespace seperator + if ($conf['useslash']) { + $id = strtr($id, ';/', '::'); + } else { + $id = strtr($id, ';/', ':' . $sepchar); + } + + if ($conf['deaccent'] == 2 || $ascii) $id = Clean::romanize($id); + if ($conf['deaccent'] || $ascii) $id = Clean::deaccent($id, -1); + + //remove specials + $id = Clean::stripspecials($id, $sepchar, '\*'); + + if ($ascii) $id = Clean::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 + * + * @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 + * + * @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 + * + * @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 + * + * @param string $id + * @return string + */ +function noNSorNS($id) +{ + global $conf; + + $p = noNS($id); + if ($p === $conf['start'] || $p === false || $p === '') { + $p = curNS($id); + if ($p === false || $p === '') { + 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 + * @return string the title + * + * @author Andreas Gohr + */ +function sectionID($title, &$check) +{ + $title = str_replace([':', '.'], '', 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)) { + $suffix = 0; + $candidateTitle = $title; + while (in_array($candidateTitle, $check)) { + $candidateTitle = $title . ++$suffix; + } + $check [] = $candidateTitle; + return $candidateTitle; + } else { + return $title; + } +} + +/** + * Wiki page existence check + * + * parameters as for wikiFN + * + * @author Chris Smith + * + * @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) +{ + $id = (explode('#', $id, 2))[0]; // #3608 + + 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)); +} + +/** + * Media existence check + * + * @param string $id page id + * @param string|int $rev empty or revision timestamp + * @param bool $clean flag indicating that $id should be cleaned (see mediaFN as well) + * @param bool $date_at + * @return bool exists? + */ +function media_exists($id, $rev = '', $clean = true, $date_at = false) +{ + if ($rev !== '' && $date_at) { + $changeLog = new MediaChangeLog($id); + $changelog_rev = $changeLog->getLastRevisionAt($rev); + if ($changelog_rev !== false) { + $rev = $changelog_rev; + } + } + return file_exists(mediaFN($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 + */ +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'; + } elseif (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] = []; + } + $cache[$id][$rev] = $fn; + return $fn; +} + +/** + * Returns the full path to the file for locking the page while editing. + * + * @author Ben Coburn + * + * @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 + * + * @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 + * + * @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 + * @author Michael Hamann + * + * @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) : []; +} + +/** + * returns the full path to the mediafile specified by ID + * + * The filename is URL encoded to protect Unicode chars + * + * @author Andreas Gohr + * @author Kate Arzamastseva + * + * @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 + */ +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 + * + * @deprecated 2020-09-30 + * @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; + dbg_deprecated(Resolver::class . ' and its children'); + + // 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\3:', $id); + // prepend the current namespace + $id = $ns . ':' . $id; + + // cleanup relatives + $result = []; + $pathA = explode(':', $id); + if (!$pathA[0]) $result[] = ''; + foreach ($pathA as $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 + * + * @param string $ns namespace which is context of id + * @param string &$media (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 + * @deprecated 2020-09-30 + */ +function resolve_mediaid($ns, &$media, &$exists, $rev = '', $date_at = false) +{ + dbg_deprecated(MediaResolver::class); + $resolver = new MediaResolver("$ns:deprecated"); + $media = $resolver->resolveId($media, $rev, $date_at); + $exists = media_exists($media, $rev, false, $date_at); +} + +/** + * Returns a full page id + * + * @deprecated 2020-09-30 + * @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) +{ + dbg_deprecated(PageResolver::class); + + global $ID; + if (getNS($ID) == $ns) { + $context = $ID; // this is usually the case + } else { + $context = "$ns:deprecated"; // only used when a different context namespace was given + } + + $resolver = new PageResolver($context); + $page = $resolver->resolveId($page, $rev, $date_at); + $exists = page_exists($page, $rev, false, $date_at); +} + +/** + * Returns the name of a cachefile from given data + * + * The needed directory is created by this function! + * + * @author Andreas Gohr + * + * @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 + * + * @param string $id page id + * @return bool + */ +function isHiddenPage($id) +{ + $data = ['id' => $id, 'hidden' => false]; + Event::createAndTrigger('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 + * + * @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 + * + * @param string $id page id + * @return string + */ +function prettyprint_id($id) +{ + if (!$id || $id === ':') { + return '*'; + } + if (str_ends_with($id, ':')) { + $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 + * @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 + * @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 ((string) $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 !== false); + + return false; +} diff --git a/inc/parser/code.php b/inc/parser/code.php new file mode 100644 index 0000000..ac2e136 --- /dev/null +++ b/inc/parser/code.php @@ -0,0 +1,80 @@ + + */ +class Doku_Renderer_code extends Doku_Renderer +{ + protected $_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 + */ + public 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 = PhpString::basename($filename); + $filename = Clean::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 + */ + public function file($text, $language = null, $filename = '') + { + $this->code($text, $language, $filename); + } + + /** + * This should never be reached, if it is send a 404 + */ + public function document_end() + { + http_status(404); + echo '404 - Not found'; + exit; + } + + /** + * Return the format of the renderer + * + * @returns string 'code' + */ + public function getFormat() + { + return 'code'; + } +} diff --git a/inc/parser/handler.php b/inc/parser/handler.php new file mode 100644 index 0000000..c681904 --- /dev/null +++ b/inc/parser/handler.php @@ -0,0 +1,1157 @@ + false, + 'doublequote' => 0 + ]; + + /** @var bool should blocks be rewritten? FIXME seems to always be true */ + protected $rewriteBlocks = true; + + /** + * @var bool are we in a footnote already? + */ + protected $footnote; + + /** + * Doku_Handler constructor. + */ + public function __construct() + { + $this->callWriter = new CallWriter($this); + } + + /** + * Add a new call by passing it to the current CallWriter + * + * @param string $handler handler method name (see mode handlers below) + * @param mixed $args arguments for this call + * @param int $pos byte position in the original source file + */ + public function addCall($handler, $args, $pos) + { + $call = [$handler, $args, $pos]; + $this->callWriter->writeCall($call); + } + + /** + * Accessor for the current CallWriter + * + * @return CallWriterInterface + */ + public function getCallWriter() + { + return $this->callWriter; + } + + /** + * Set a new CallWriter + * + * @param CallWriterInterface $callWriter + */ + public function setCallWriter($callWriter) + { + $this->callWriter = $callWriter; + } + + /** + * Return the current internal status of the given name + * + * @param string $status + * @return mixed|null + */ + public function getStatus($status) + { + if (!isset($this->status[$status])) return null; + return $this->status[$status]; + } + + /** + * Set a new internal status + * + * @param string $status + * @param mixed $value + */ + public function setStatus($status, $value) + { + $this->status[$status] = $value; + } + + /** @deprecated 2019-10-31 use addCall() instead */ + public function _addCall($handler, $args, $pos) + { + dbg_deprecated('addCall'); + $this->addCall($handler, $args, $pos); + } + + /** + * Similar to addCall, but adds a plugin call + * + * @param string $plugin name of the plugin + * @param mixed $args arguments for this call + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @param string $match matched syntax + */ + public function addPluginCall($plugin, $args, $state, $pos, $match) + { + $call = ['plugin', [$plugin, $args, $state, $match], $pos]; + $this->callWriter->writeCall($call); + } + + /** + * Finishes handling + * + * Called from the parser. Calls finalise() on the call writer, closes open + * sections, rewrites blocks and adds document_start and document_end calls. + * + * @triggers PARSER_HANDLER_DONE + */ + public function finalize() + { + $this->callWriter->finalise(); + + if ($this->status['section']) { + $last_call = end($this->calls); + $this->calls[] = ['section_close', [], $last_call[2]]; + } + + if ($this->rewriteBlocks) { + $B = new Block(); + $this->calls = $B->process($this->calls); + } + + Event::createAndTrigger('PARSER_HANDLER_DONE', $this); + + array_unshift($this->calls, ['document_start', [], 0]); + $last_call = end($this->calls); + $this->calls[] = ['document_end', [], $last_call[2]]; + } + + /** + * fetch the current call and advance the pointer to the next one + * + * @fixme seems to be unused? + * @return bool|mixed + */ + public function fetch() + { + $call = current($this->calls); + if ($call !== false) { + next($this->calls); //advance the pointer + return $call; + } + return false; + } + + + /** + * 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 = []; + 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([ + '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; + } + + /** + * Simplifies handling for the formatting tags which all behave the same + * + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @param string $name actual mode name + */ + protected function nestingTag($match, $state, $pos, $name) + { + switch ($state) { + case DOKU_LEXER_ENTER: + $this->addCall($name . '_open', [], $pos); + break; + case DOKU_LEXER_EXIT: + $this->addCall($name . '_close', [], $pos); + break; + case DOKU_LEXER_UNMATCHED: + $this->addCall('cdata', [$match], $pos); + break; + } + } + + + /** + * The following methods define the handlers for the different Syntax modes + * + * The handlers are called from dokuwiki\Parsing\Lexer\Lexer\invokeParser() + * + * @todo it might make sense to move these into their own class or merge them with the + * ParserMode classes some time. + */ + // region mode handlers + + /** + * Special plugin handler + * + * This handler is called for all modes starting with 'plugin_'. + * An additional parameter with the plugin name is passed. The plugin's handle() + * method is called here + * + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @param string $pluginname name of the plugin + * @return bool mode handled? + * @author Andreas Gohr + * + */ + public function plugin($match, $state, $pos, $pluginname) + { + $data = [$match]; + /** @var SyntaxPlugin $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; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function base($match, $state, $pos) + { + if ($state === DOKU_LEXER_UNMATCHED) { + $this->addCall('cdata', [$match], $pos); + return true; + } + return false; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public 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', [], $pos); + + $this->addCall('header', [$title, $level, $pos], $pos); + + $this->addCall('section_open', [$level], $pos); + $this->status['section'] = true; + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function notoc($match, $state, $pos) + { + $this->addCall('notoc', [], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function nocache($match, $state, $pos) + { + $this->addCall('nocache', [], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function linebreak($match, $state, $pos) + { + $this->addCall('linebreak', [], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function eol($match, $state, $pos) + { + $this->addCall('eol', [], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function hr($match, $state, $pos) + { + $this->addCall('hr', [], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function strong($match, $state, $pos) + { + $this->nestingTag($match, $state, $pos, 'strong'); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function emphasis($match, $state, $pos) + { + $this->nestingTag($match, $state, $pos, 'emphasis'); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function underline($match, $state, $pos) + { + $this->nestingTag($match, $state, $pos, 'underline'); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function monospace($match, $state, $pos) + { + $this->nestingTag($match, $state, $pos, 'monospace'); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function subscript($match, $state, $pos) + { + $this->nestingTag($match, $state, $pos, 'subscript'); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function superscript($match, $state, $pos) + { + $this->nestingTag($match, $state, $pos, 'superscript'); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function deleted($match, $state, $pos) + { + $this->nestingTag($match, $state, $pos, 'deleted'); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function footnote($match, $state, $pos) + { + 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', [$match], $pos); + break; + } + $this->footnote = true; + + $this->callWriter = new Nest($this->callWriter, 'footnote_close'); + $this->addCall('footnote_open', [], $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', [$match], $pos); + break; + } + + $this->footnote = false; + $this->addCall('footnote_close', [], $pos); + + /** @var Nest $reWriter */ + $reWriter = $this->callWriter; + $this->callWriter = $reWriter->process(); + break; + case DOKU_LEXER_UNMATCHED: + $this->addCall('cdata', [$match], $pos); + break; + } + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function listblock($match, $state, $pos) + { + switch ($state) { + case DOKU_LEXER_ENTER: + $this->callWriter = new Lists($this->callWriter); + $this->addCall('list_open', [$match], $pos); + break; + case DOKU_LEXER_EXIT: + $this->addCall('list_close', [], $pos); + /** @var Lists $reWriter */ + $reWriter = $this->callWriter; + $this->callWriter = $reWriter->process(); + break; + case DOKU_LEXER_MATCHED: + $this->addCall('list_item', [$match], $pos); + break; + case DOKU_LEXER_UNMATCHED: + $this->addCall('cdata', [$match], $pos); + break; + } + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function unformatted($match, $state, $pos) + { + if ($state == DOKU_LEXER_UNMATCHED) { + $this->addCall('unformatted', [$match], $pos); + } + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function preformatted($match, $state, $pos) + { + switch ($state) { + case DOKU_LEXER_ENTER: + $this->callWriter = new Preformatted($this->callWriter); + $this->addCall('preformatted_start', [], $pos); + break; + case DOKU_LEXER_EXIT: + $this->addCall('preformatted_end', [], $pos); + /** @var Preformatted $reWriter */ + $reWriter = $this->callWriter; + $this->callWriter = $reWriter->process(); + break; + case DOKU_LEXER_MATCHED: + $this->addCall('preformatted_newline', [], $pos); + break; + case DOKU_LEXER_UNMATCHED: + $this->addCall('preformatted_content', [$match], $pos); + break; + } + + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function quote($match, $state, $pos) + { + + switch ($state) { + case DOKU_LEXER_ENTER: + $this->callWriter = new Quote($this->callWriter); + $this->addCall('quote_start', [$match], $pos); + break; + + case DOKU_LEXER_EXIT: + $this->addCall('quote_end', [], $pos); + /** @var Lists $reWriter */ + $reWriter = $this->callWriter; + $this->callWriter = $reWriter->process(); + break; + + case DOKU_LEXER_MATCHED: + $this->addCall('quote_newline', [$match], $pos); + break; + + case DOKU_LEXER_UNMATCHED: + $this->addCall('cdata', [$match], $pos); + break; + } + + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function file($match, $state, $pos) + { + return $this->code($match, $state, $pos, 'file'); + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @param string $type either 'code' or 'file' + * @return bool mode handled? + */ + public function code($match, $state, $pos, $type = 'code') + { + if ($state == DOKU_LEXER_UNMATCHED) { + $matches = sexplode('>', $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) $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; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function acronym($match, $state, $pos) + { + $this->addCall('acronym', [$match], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function smiley($match, $state, $pos) + { + $this->addCall('smiley', [$match], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function wordblock($match, $state, $pos) + { + $this->addCall('wordblock', [$match], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function entity($match, $state, $pos) + { + $this->addCall('entity', [$match], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function multiplyentity($match, $state, $pos) + { + preg_match_all('/\d+/', $match, $matches); + $this->addCall('multiplyentity', [$matches[0][0], $matches[0][1]], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function singlequoteopening($match, $state, $pos) + { + $this->addCall('singlequoteopening', [], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function singlequoteclosing($match, $state, $pos) + { + $this->addCall('singlequoteclosing', [], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function apostrophe($match, $state, $pos) + { + $this->addCall('apostrophe', [], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function doublequoteopening($match, $state, $pos) + { + $this->addCall('doublequoteopening', [], $pos); + $this->status['doublequote']++; + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function doublequoteclosing($match, $state, $pos) + { + if ($this->status['doublequote'] <= 0) { + $this->doublequoteopening($match, $state, $pos); + } else { + $this->addCall('doublequoteclosing', [], $pos); + $this->status['doublequote'] = max(0, --$this->status['doublequote']); + } + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function camelcaselink($match, $state, $pos) + { + $this->addCall('camelcaselink', [$match], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function internallink($match, $state, $pos) + { + // Strip the opening and closing markup + $link = preg_replace(['/^\[\[/', '/\]\]$/u'], '', $match); + + // Split title from URL + $link = sexplode('|', $link, 2); + if ($link[1] === null) { + $link[1] = null; + } elseif (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 = sexplode('>', $link[0], 2, ''); + $this->addCall( + 'interwikilink', + [$link[0], $link[1], strtolower($interwiki[0]), $interwiki[1]], + $pos + ); + } elseif (preg_match('/^\\\\\\\\[^\\\\]+?\\\\/u', $link[0])) { + // Windows Share + $this->addCall( + 'windowssharelink', + [$link[0], $link[1]], + $pos + ); + } elseif (preg_match('#^([a-z0-9\-\.+]+?)://#i', $link[0])) { + // external link (accepts all protocols) + $this->addCall( + 'externallink', + [$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', + [$link[0], $link[1]], + $pos + ); + } elseif (preg_match('!^#.+!', $link[0])) { + // local link + $this->addCall( + 'locallink', + [substr($link[0], 1), $link[1]], + $pos + ); + } else { + // internal link + $this->addCall( + 'internallink', + [$link[0], $link[1]], + $pos + ); + } + + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function filelink($match, $state, $pos) + { + $this->addCall('filelink', [$match, null], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function windowssharelink($match, $state, $pos) + { + $this->addCall('windowssharelink', [$match, null], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function media($match, $state, $pos) + { + $p = Doku_Handler_Parse_Media($match); + + $this->addCall( + $p['type'], + [$p['src'], $p['title'], $p['align'], $p['width'], $p['height'], $p['cache'], $p['linking']], + $pos + ); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function rss($match, $state, $pos) + { + $link = preg_replace(['/^\{\{rss>/', '/\}\}$/'], '', $match); + + // get params + [$link, $params] = sexplode(' ', $link, 2, ''); + + $p = []; + 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 = ['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', [$link, $p], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function externallink($match, $state, $pos) + { + $url = $match; + $title = null; + + // add protocol on simple short URLs + if (str_starts_with($url, 'ftp') && !str_starts_with($url, 'ftp://')) { + $title = $url; + $url = 'ftp://' . $url; + } + if (str_starts_with($url, 'www')) { + $title = $url; + $url = 'http://' . $url; + } + + $this->addCall('externallink', [$url, $title], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function emaillink($match, $state, $pos) + { + $email = preg_replace(['/^$/'], '', $match); + $this->addCall('emaillink', [$email, null], $pos); + return true; + } + + /** + * @param string $match matched syntax + * @param int $state a LEXER_STATE_* constant + * @param int $pos byte position in the original source file + * @return bool mode handled? + */ + public function table($match, $state, $pos) + { + switch ($state) { + case DOKU_LEXER_ENTER: + $this->callWriter = new Table($this->callWriter); + + $this->addCall('table_start', [$pos + 1], $pos); + if (trim($match) == '^') { + $this->addCall('tableheader', [], $pos); + } else { + $this->addCall('tablecell', [], $pos); + } + break; + + case DOKU_LEXER_EXIT: + $this->addCall('table_end', [$pos], $pos); + /** @var Table $reWriter */ + $reWriter = $this->callWriter; + $this->callWriter = $reWriter->process(); + break; + + case DOKU_LEXER_UNMATCHED: + if (trim($match) != '') { + $this->addCall('cdata', [$match], $pos); + } + break; + + case DOKU_LEXER_MATCHED: + if ($match == ' ') { + $this->addCall('cdata', [$match], $pos); + } elseif (preg_match('/:::/', $match)) { + $this->addCall('rowspan', [$match], $pos); + } elseif (preg_match('/\t+/', $match)) { + $this->addCall('table_align', [$match], $pos); + } elseif (preg_match('/ {2,}/', $match)) { + $this->addCall('table_align', [$match], $pos); + } elseif ($match == "\n|") { + $this->addCall('table_row', [], $pos); + $this->addCall('tablecell', [], $pos); + } elseif ($match == "\n^") { + $this->addCall('table_row', [], $pos); + $this->addCall('tableheader', [], $pos); + } elseif ($match == '|') { + $this->addCall('tablecell', [], $pos); + } elseif ($match == '^') { + $this->addCall('tableheader', [], $pos); + } + break; + } + return true; + } + + // endregion modes +} + +//------------------------------------------------------------------------ +function Doku_Handler_Parse_Media($match) +{ + + // Strip the opening and closing markup + $link = preg_replace(['/^\{\{/', '/\}\}$/u'], '', $match); + + // Split title from URL + $link = sexplode('|', $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'; + } elseif ($ralign) { + $align = 'right'; + } elseif ($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)) { + $w = empty($size[1]) ? null : $size[1]; + $h = empty($size[3]) ? null : $size[3]; + } else { + $w = null; + $h = null; + } + + //get linking command + if (preg_match('/nolink/i', $param)) { + $linking = 'nolink'; + } elseif (preg_match('/direct/i', $param)) { + $linking = 'direct'; + } elseif (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 = [ + 'type' => $call, + 'src' => $src, + 'title' => $link[1], + 'align' => $align, + 'width' => $w, + 'height' => $h, + 'cache' => $cache, + 'linking' => $linking + ]; + + return $params; +} diff --git a/inc/parser/metadata.php b/inc/parser/metadata.php new file mode 100644 index 0000000..2d84f50 --- /dev/null +++ b/inc/parser/metadata.php @@ -0,0 +1,770 @@ + + */ +class Doku_Renderer_metadata extends Doku_Renderer +{ + /** the approximate byte lenght to capture for the abstract */ + public const ABSTRACT_LEN = 250; + + /** the maximum UTF8 character length for the abstract */ + public const ABSTRACT_MAX = 500; + + /** @var array transient meta data, will be reset on each rendering */ + public $meta = []; + + /** @var array persistent meta data, will be kept until explicitly deleted */ + public $persistent = []; + + /** @var array the list of headers used to create unique link ids */ + protected $headers = []; + + /** @var string temporary $doc store */ + protected $store = ''; + + /** @var string keeps the first image reference */ + protected $firstimage = ''; + + /** @var bool whether or not data is being captured for the abstract, public to be accessible by plugins */ + public $capturing = true; + + /** @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' + */ + public function getFormat() + { + return 'metadata'; + } + + /** + * Initialize the document + * + * Sets up some of the persistent info about the page if it doesn't exist, yet. + */ + public function document_start() + { + global $ID; + + $this->headers = []; + + // external pages are missing create date + if (!isset($this->persistent['date']['created']) || !$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 + */ + public 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 = PhpString::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 + */ + public function cdata($text) + { + if (!$this->capture || !$this->capturing) { + 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 + */ + public 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'][] = [ + '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 + */ + public 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 + */ + public function p_open() + { + $this->cdata(DOKU_LF); + } + + /** + * Close a paragraph + */ + public function p_close() + { + $this->cdata(DOKU_LF); + } + + /** + * Create a line break + */ + public function linebreak() + { + $this->cdata(DOKU_LF); + } + + /** + * Create a horizontal line + */ + public 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 + */ + public function footnote_open() + { + if ($this->capture) { + // move current content to store + // this is required to ensure safe behaviour of plugins accessed within footnotes + $this->store = $this->doc; + $this->doc = ''; + + // disable capturing + $this->capturing = false; + } + } + + /** + * Callback for footnote end syntax + * + * All content rendered whilst within footnote syntax mode is discarded, + * the previously rendered content is restored and capturing is re-enabled. + * + * @author Andreas Gohr + */ + public function footnote_close() + { + if ($this->capture) { + // re-enable capturing + $this->capturing = true; + // restore previously rendered content + $this->doc = $this->store; + $this->store = ''; + } + } + + /** + * Open an unordered list + */ + public function listu_open() + { + $this->cdata(DOKU_LF); + } + + /** + * Open an ordered list + */ + public 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 + */ + public function listitem_open($level, $node = false) + { + $this->cdata(str_repeat(DOKU_TAB, $level) . '* '); + } + + /** + * Close a list item + */ + public function listitem_close() + { + $this->cdata(DOKU_LF); + } + + /** + * Output preformatted text + * + * @param string $text + */ + public function preformatted($text) + { + $this->cdata($text); + } + + /** + * Start a block quote + */ + public function quote_open() + { + $this->cdata(DOKU_LF . DOKU_TAB . '"'); + } + + /** + * Stop a block quote + */ + public 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 + */ + public 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 + */ + public function code($text, $language = null, $file = null) + { + $this->cdata(DOKU_LF . $text . DOKU_LF); + } + + /** + * Format an acronym + * + * Uses $this->acronyms + * + * @param string $acronym + */ + public function acronym($acronym) + { + $this->cdata($acronym); + } + + /** + * Format a smiley + * + * Uses $this->smiley + * + * @param string $smiley + */ + public function smiley($smiley) + { + $this->cdata($smiley); + } + + /** + * Format an entity + * + * Entities are basically small text replacements + * + * Uses $this->entities + * + * @param string $entity + */ + public 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 + */ + public function multiplyentity($x, $y) + { + $this->cdata($x . '×' . $y); + } + + /** + * Render an opening single quote char (language specific) + */ + public function singlequoteopening() + { + global $lang; + $this->cdata($lang['singlequoteopening']); + } + + /** + * Render a closing single quote char (language specific) + */ + public function singlequoteclosing() + { + global $lang; + $this->cdata($lang['singlequoteclosing']); + } + + /** + * Render an apostrophe char (language specific) + */ + public function apostrophe() + { + global $lang; + $this->cdata($lang['apostrophe']); + } + + /** + * Render an opening double quote char (language specific) + */ + public function doublequoteopening() + { + global $lang; + $this->cdata($lang['doublequoteopening']); + } + + /** + * Render an closinging double quote char (language specific) + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + $resolver = new PageResolver($ID); + $id = $resolver->resolveId($id); + [$page] = sexplode('#', $id, 2); + + // set metadata + $this->meta['relation']['references'][$page] = page_exists($page); + // $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 + */ + public 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 + */ + public function interwikilink($match, $name, $wikiName, $wikiUri) + { + if (is_array($name)) { + $this->_firstimage($name['src']); + if ($name['type'] == 'internalmedia') { + $this->_recordMediaUsage($name['src']); + } + } + + if ($this->capture) { + [$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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + * + * @param string $name + * + * @return mixed|string + * @author Andreas Gohr + * + */ + public 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; + } + + /** + * Construct a title and handle images in titles + * + * @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 + * @author Harry Fuecks + */ + public function _getLinkTitle($title, $default, $id = null) + { + if (is_array($title)) { + if ($title['title']) { + return '[' . $title['title'] . ']'; + } else { + return $default; + } + } elseif (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 + */ + protected function _firstimage($src) + { + global $ID; + + if ($this->firstimage) { + return; + } + + [$src] = explode('#', $src, 2); + if (!media_isexternal($src)) { + $src = (new MediaResolver($ID))->resolveId($src); + } + if (preg_match('/.(jpe?g|gif|png|webp|svg)$/i', $src)) { + $this->firstimage = $src; + } + } + + /** + * Store list of used media files in metadata + * + * @param string $src media ID + */ + protected function _recordMediaUsage($src) + { + global $ID; + + [$src] = explode('#', $src, 2); + if (media_isexternal($src)) { + return; + } + $src = (new MediaResolver($ID))->resolveId($src); + $file = mediaFN($src); + $this->meta['relation']['media'][$src] = file_exists($file); + } + + #endregion +} + +//Setup VIM: ex: et ts=4 : diff --git a/inc/parser/parser.php b/inc/parser/parser.php new file mode 100644 index 0000000..225dee3 --- /dev/null +++ b/inc/parser/parser.php @@ -0,0 +1,92 @@ + ['listblock', 'table', 'quote', 'hr'], + // some mode are allowed inside the base mode only + 'baseonly' => ['header'], + // modes for styling text -- footnote behaves similar to styling + 'formatting' => [ + 'strong', 'emphasis', 'underline', 'monospace', 'subscript', 'superscript', 'deleted', 'footnote' + ], + // modes where the token is simply replaced - they can not contain any + // other modes + 'substition' => [ + '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' => ['preformatted', 'code', 'file'], + // inside this mode no wiki markup should be applied but lineendings + // and whitespace isn't preserved + 'disabled' => ['unformatted'], + // used to mark paragraph boundaries + 'paragraphs' => ['eol'], +]; + +/** + * Class Doku_Parser + * + * @deprecated 2018-05-04 + */ +class Doku_Parser extends Parser +{ + use PropertyDeprecationHelper { + __set as protected deprecationHelperMagicSet; + __get as protected deprecationHelperMagicGet; + } + + /** @inheritdoc */ + public function __construct(Doku_Handler $handler = null) + { + dbg_deprecated(Parser::class); + $this->deprecatePublicProperty('modes', self::class); + $this->deprecatePublicProperty('connected', self::class); + + if (!$handler instanceof \Doku_Handler) { + $handler = new Doku_Handler(); + } + + parent::__construct($handler); + } + + public function __set($name, $value) + { + + if ($name === 'Handler') { + $this->handler = $value; + return; + } + + if ($name === 'Lexer') { + $this->lexer = $value; + return; + } + + $this->deprecationHelperMagicSet($name, $value); + } + + public function __get($name) + { + if ($name === 'Handler') { + return $this->handler; + } + + if ($name === 'Lexer') { + return $this->lexer; + } + + return $this->deprecationHelperMagicGet($name); + } +} diff --git a/inc/parser/renderer.php b/inc/parser/renderer.php new file mode 100644 index 0000000..cd43997 --- /dev/null +++ b/inc/parser/renderer.php @@ -0,0 +1,987 @@ + + * @author Andreas Gohr + */ + +use dokuwiki\Extension\Plugin; +use dokuwiki\Extension\SyntaxPlugin; + +/** + * 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\Extension\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. + */ +abstract class Doku_Renderer extends Plugin +{ + /** @var array Settings, control the behavior of the renderer */ + public $info = [ + 'cache' => true, // may the rendered result cached? + 'toc' => true, // render the TOC? + ]; + + /** @var array contains the smiley configuration, set in p_render() */ + public $smileys = []; + /** @var array contains the entity configuration, set in p_render() */ + public $entities = []; + /** @var array contains the acronym configuration, set in p_render() */ + public $acronyms = []; + /** @var array contains the interwiki configuration, set in p_render() */ + public $interwiki = []; + /** @var string|int link pages and media against this revision */ + public $date_at = ''; + + /** @var array the list of headers used to create unique link ids */ + protected $headers = []; + + /** + * @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 + */ + public function reset() + { + $this->headers = []; + $this->doc = ''; + $this->info['cache'] = true; + $this->info['toc'] = true; + } + + /** + * 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 + */ + public function isSingleton() + { + return false; + } + + /** + * Returns the format produced by this renderer. + * + * Has to be overidden by sub classes + * + * @return string + */ + abstract public function getFormat(); + + /** + * Disable caching of this renderer's output + */ + public function nocache() + { + $this->info['cache'] = false; + } + + /** + * Disable TOC generation for this renderer's output + * + * This might not be used for certain sub renderer + */ + public 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 + */ + public function plugin($name, $data, $state = '', $match = '') + { + /** @var SyntaxPlugin $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 + */ + public function nest($instructions) + { + foreach ($instructions as $instruction) { + // execute the callback against ourself + if (method_exists($this, $instruction[0])) { + call_user_func_array([$this, $instruction[0]], $instruction[1] ?: []); + } + } + } + + /** + * 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. + */ + public function nest_close() + { + } + + #region Syntax modes - sub classes will need to implement them to fill $doc + + /** + * Initialize the document + */ + public function document_start() + { + } + + /** + * Finalize the document + */ + public function document_end() + { + } + + /** + * Render the Table of Contents + * + * @return string + */ + public 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 + */ + public 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 + */ + public function header($text, $level, $pos) + { + } + + /** + * Open a new section + * + * @param int $level section level (as determined by the previous header) + */ + public function section_open($level) + { + } + + /** + * Close the current section + */ + public function section_close() + { + } + + /** + * Render plain text data + * + * @param string $text + */ + public function cdata($text) + { + } + + /** + * Open a paragraph + */ + public function p_open() + { + } + + /** + * Close a paragraph + */ + public function p_close() + { + } + + /** + * Create a line break + */ + public function linebreak() + { + } + + /** + * Create a horizontal line + */ + public function hr() + { + } + + /** + * Start strong (bold) formatting + */ + public function strong_open() + { + } + + /** + * Stop strong (bold) formatting + */ + public function strong_close() + { + } + + /** + * Start emphasis (italics) formatting + */ + public function emphasis_open() + { + } + + /** + * Stop emphasis (italics) formatting + */ + public function emphasis_close() + { + } + + /** + * Start underline formatting + */ + public function underline_open() + { + } + + /** + * Stop underline formatting + */ + public function underline_close() + { + } + + /** + * Start monospace formatting + */ + public function monospace_open() + { + } + + /** + * Stop monospace formatting + */ + public function monospace_close() + { + } + + /** + * Start a subscript + */ + public function subscript_open() + { + } + + /** + * Stop a subscript + */ + public function subscript_close() + { + } + + /** + * Start a superscript + */ + public function superscript_open() + { + } + + /** + * Stop a superscript + */ + public function superscript_close() + { + } + + /** + * Start deleted (strike-through) formatting + */ + public function deleted_open() + { + } + + /** + * Stop deleted (strike-through) formatting + */ + public function deleted_close() + { + } + + /** + * Start a footnote + */ + public function footnote_open() + { + } + + /** + * Stop a footnote + */ + public function footnote_close() + { + } + + /** + * Open an unordered list + */ + public function listu_open() + { + } + + /** + * Close an unordered list + */ + public function listu_close() + { + } + + /** + * Open an ordered list + */ + public function listo_open() + { + } + + /** + * Close an ordered list + */ + public function listo_close() + { + } + + /** + * Open a list item + * + * @param int $level the nesting level + * @param bool $node true when a node; false when a leaf + */ + public function listitem_open($level, $node = false) + { + } + + /** + * Close a list item + */ + public function listitem_close() + { + } + + /** + * Start the content of a list item + */ + public function listcontent_open() + { + } + + /** + * Stop the content of a list item + */ + public function listcontent_close() + { + } + + /** + * Output unformatted $text + * + * Defaults to $this->cdata() + * + * @param string $text + */ + public function unformatted($text) + { + $this->cdata($text); + } + + /** + * Output preformatted text + * + * @param string $text + */ + public function preformatted($text) + { + } + + /** + * Start a block quote + */ + public function quote_open() + { + } + + /** + * Stop a block quote + */ + public 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 + */ + public 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 + */ + public function code($text, $lang = null, $file = null) + { + } + + /** + * Format an acronym + * + * Uses $this->acronyms + * + * @param string $acronym + */ + public function acronym($acronym) + { + } + + /** + * Format a smiley + * + * Uses $this->smiley + * + * @param string $smiley + */ + public function smiley($smiley) + { + } + + /** + * Format an entity + * + * Entities are basically small text replacements + * + * Uses $this->entities + * + * @param string $entity + */ + public 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 + */ + public function multiplyentity($x, $y) + { + } + + /** + * Render an opening single quote char (language specific) + */ + public function singlequoteopening() + { + } + + /** + * Render a closing single quote char (language specific) + */ + public function singlequoteclosing() + { + } + + /** + * Render an apostrophe char (language specific) + */ + public function apostrophe() + { + } + + /** + * Render an opening double quote char (language specific) + */ + public function doublequoteopening() + { + } + + /** + * Render an closinging double quote char (language specific) + */ + public function doublequoteclosing() + { + } + + /** + * Render a CamelCase link + * + * @param string $link The link name + * @see http://en.wikipedia.org/wiki/CamelCase + */ + public function camelcaselink($link) + { + } + + /** + * Render a page local link + * + * @param string $hash hash link identifier + * @param string $name name for the link + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public function interwikilink($link, $title, $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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public 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 + */ + public function table_open($maxcols = null, $numrows = null, $pos = null) + { + } + + /** + * Close a table + * + * @param int $pos byte position in the original source + */ + public function table_close($pos = null) + { + } + + /** + * Open a table header + */ + public function tablethead_open() + { + } + + /** + * Close a table header + */ + public function tablethead_close() + { + } + + /** + * Open a table body + */ + public function tabletbody_open() + { + } + + /** + * Close a table body + */ + public function tabletbody_close() + { + } + + /** + * Open a table footer + */ + public function tabletfoot_open() + { + } + + /** + * Close a table footer + */ + public function tabletfoot_close() + { + } + + /** + * Open a table row + */ + public function tablerow_open() + { + } + + /** + * Close a table row + */ + public function tablerow_close() + { + } + + /** + * Open a table header cell + * + * @param int $colspan + * @param string $align left|center|right + * @param int $rowspan + */ + public function tableheader_open($colspan = 1, $align = null, $rowspan = 1) + { + } + + /** + * Close a table header cell + */ + public function tableheader_close() + { + } + + /** + * Open a table cell + * + * @param int $colspan + * @param string $align left|center|right + * @param int $rowspan + */ + public function tablecell_open($colspan = 1, $align = null, $rowspan = 1) + { + } + + /** + * Close a table cell + */ + public function tablecell_close() + { + } + + #endregion + + #region util functions, you probably won't need to reimplement them + + /** + * Creates a linkid from a headline + * + * @param string $title The headline title + * @param boolean $create Create a new unique ID? + * @return string + * @author Andreas Gohr + */ + public function _headerToLink($title, $create = false) + { + if ($create) { + return sectionID($title, $this->headers); + } else { + $check = false; + return sectionID($title, $check); + } + } + + /** + * Removes any Namespace from the given name but keeps + * casing and special chars + * + * @param string $name + * @return string + * @author Andreas Gohr + * + */ + public function _simpleTitle($name) + { + global $conf; + + //if there is a hash we use the ancor name only + [$name, $hash] = sexplode('#', $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 + */ + public function _resolveInterWiki(&$shortcut, $reference, &$exists = null) + { + //get interwiki URL + if (isset($this->interwiki[$shortcut])) { + $url = $this->interwiki[$shortcut]; + } elseif (isset($this->interwiki['default'])) { + $shortcut = 'default'; + $url = $this->interwiki[$shortcut]; + } else { + // not parsable interwiki outputs '' to make sure string manipluation works + $shortcut = ''; + $url = ''; + } + + //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( + '/[[\\\\\]^`{|}#%]/', + static fn($match) => 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'], + ]); + } elseif ($url != '') { + // make sure when no url is defined, we keep it null + // default + $url .= rawurlencode($reference); + } + //handle as wiki links + if ($url && $url[0] === ':') { + $urlparam = ''; + $id = $url; + if (strpos($url, '?') !== false) { + [$id, $urlparam] = sexplode('?', $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/inc/parser/xhtml.php b/inc/parser/xhtml.php new file mode 100644 index 0000000..a7035c9 --- /dev/null +++ b/inc/parser/xhtml.php @@ -0,0 +1,2064 @@ + + * @author Andreas Gohr + * + */ +class Doku_Renderer_xhtml extends Doku_Renderer +{ + /** @var array store the table of contents */ + public $toc = []; + + /** @var array A stack of section edit data */ + protected $sectionedits = []; + + /** @var int last section edit id, used by startSectionEdit */ + protected $lastsecid = 0; + + /** @var array a list of footnotes, list starts at 1! */ + protected $footnotes = []; + + /** @var int current section level */ + protected $lastlevel = 0; + /** @var array section node tracker */ + protected $node = [0, 0, 0, 0, 0]; + + /** @var string temporary $doc store */ + protected $store = ''; + + /** @var array global counter, for table classes etc. */ + protected $_counter = []; // + + /** @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; + + /** + * 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 + */ + 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 = []; + 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 + */ + public function finishSectionEdit($end = null, $hid = null) + { + if (count($this->sectionedits) == 0) { + return; + } + $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 .= ''; + } + + /** + * Returns the format produced by this renderer. + * + * @return string always 'xhtml' + */ + public function getFormat() + { + return 'xhtml'; + } + + /** + * Initialize the document + */ + public function document_start() + { + //reset some internals + $this->toc = []; + } + + /** + * Finalize the document + */ + public function document_end() + { + // Finish open section edits. + while ($this->sectionedits !== []) { + 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 ($this->footnotes !== []) { + $this->doc .= '
    ' . DOKU_LF; + + foreach ($this->footnotes as $id => $footnote) { + // check its not a placeholder that indicates actual footnote text is elsewhere + if (!str_starts_with($footnote, "@@FNT")) { + // open the footnote and set the anchor and backlink + $this->doc .= '
    '; + $this->doc .= ''; + $this->doc .= $id . ') ' . DOKU_LF; + + // get any other footnotes that use the same markup + $alt = array_keys($this->footnotes, "@@FNT$id"); + + foreach ($alt as $ref) { + // set anchor and backlink for the other footnotes + $this->doc .= ', '; + $this->doc .= ($ref) . ') ' . DOKU_LF; + } + + // add footnote markup and close this footnote + $this->doc .= '
    ' . $footnote . '
    '; + $this->doc .= '
    ' . DOKU_LF; + } + } + $this->doc .= '
    ' . 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('#

    \s*

    #', '', $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 + */ + public 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 + * @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 + */ + public function header($text, $level, $pos, $returnonly = false) + { + 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'] && + $this->sectionedits !== [] && + $this->sectionedits[count($this->sectionedits) - 1]['target'] === 'section' + ) { + $this->finishSectionEdit($pos - 1); + } + + // build the header + $header = DOKU_LF . '_codeblock; + $header .= ' class="' . $this->startSectionEdit($pos, $data) . '"'; + } + $header .= ' id="' . $hid . '">'; + $header .= $this->_xmlEntities($text); + $header .= "" . DOKU_LF; + + if ($returnonly) { + return $header; + } else { + $this->doc .= $header; + } + } + + /** + * Open a new section + * + * @param int $level section level (as determined by the previous header) + */ + public function section_open($level) + { + $this->doc .= '
    ' . DOKU_LF; + } + + /** + * Close the current section + */ + public function section_close() + { + $this->doc .= DOKU_LF . '
    ' . DOKU_LF; + } + + /** + * Render plain text data + * + * @param $text + */ + public function cdata($text) + { + $this->doc .= $this->_xmlEntities($text); + } + + /** + * Open a paragraph + */ + public function p_open() + { + $this->doc .= DOKU_LF . '

    ' . DOKU_LF; + } + + /** + * Close a paragraph + */ + public function p_close() + { + $this->doc .= DOKU_LF . '

    ' . DOKU_LF; + } + + /** + * Create a line break + */ + public function linebreak() + { + $this->doc .= '
    ' . DOKU_LF; + } + + /** + * Create a horizontal line + */ + public function hr() + { + $this->doc .= '
    ' . DOKU_LF; + } + + /** + * Start strong (bold) formatting + */ + public function strong_open() + { + $this->doc .= ''; + } + + /** + * Stop strong (bold) formatting + */ + public function strong_close() + { + $this->doc .= ''; + } + + /** + * Start emphasis (italics) formatting + */ + public function emphasis_open() + { + $this->doc .= ''; + } + + /** + * Stop emphasis (italics) formatting + */ + public function emphasis_close() + { + $this->doc .= ''; + } + + /** + * Start underline formatting + */ + public function underline_open() + { + $this->doc .= ''; + } + + /** + * Stop underline formatting + */ + public function underline_close() + { + $this->doc .= ''; + } + + /** + * Start monospace formatting + */ + public function monospace_open() + { + $this->doc .= ''; + } + + /** + * Stop monospace formatting + */ + public function monospace_close() + { + $this->doc .= ''; + } + + /** + * Start a subscript + */ + public function subscript_open() + { + $this->doc .= ''; + } + + /** + * Stop a subscript + */ + public function subscript_close() + { + $this->doc .= ''; + } + + /** + * Start a superscript + */ + public function superscript_open() + { + $this->doc .= ''; + } + + /** + * Stop a superscript + */ + public function superscript_close() + { + $this->doc .= ''; + } + + /** + * Start deleted (strike-through) formatting + */ + public function deleted_open() + { + $this->doc .= ''; + } + + /** + * Stop deleted (strike-through) formatting + */ + public function deleted_close() + { + $this->doc .= ''; + } + + /** + * 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 + */ + public 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 + */ + public 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 .= sprintf( + '%d)', + $fnid, + $fnid, + $fnid + ); + } + + /** + * Open an unordered list + * + * @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input + */ + public function listu_open($classes = null) + { + $class = ''; + if ($classes !== null) { + if (is_array($classes)) $classes = implode(' ', $classes); + $class = " class=\"$classes\""; + } + $this->doc .= "" . DOKU_LF; + } + + /** + * Close an unordered list + */ + public function listu_close() + { + $this->doc .= '' . DOKU_LF; + } + + /** + * Open an ordered list + * + * @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input + */ + public function listo_open($classes = null) + { + $class = ''; + if ($classes !== null) { + if (is_array($classes)) $classes = implode(' ', $classes); + $class = " class=\"$classes\""; + } + $this->doc .= "" . DOKU_LF; + } + + /** + * Close an ordered list + */ + public function listo_close() + { + $this->doc .= '' . DOKU_LF; + } + + /** + * Open a list item + * + * @param int $level the nesting level + * @param bool $node true when a node; false when a leaf + */ + public function listitem_open($level, $node = false) + { + $branching = $node ? ' node' : ''; + $this->doc .= '
  • '; + } + + /** + * Close a list item + */ + public function listitem_close() + { + $this->doc .= '
  • ' . DOKU_LF; + } + + /** + * Start the content of a list item + */ + public function listcontent_open() + { + $this->doc .= '
    '; + } + + /** + * Stop the content of a list item + */ + public function listcontent_close() + { + $this->doc .= '
    ' . DOKU_LF; + } + + /** + * Output unformatted $text + * + * Defaults to $this->cdata() + * + * @param string $text + */ + public function unformatted($text) + { + $this->doc .= $this->_xmlEntities($text); + } + + /** + * Start a block quote + */ + public function quote_open() + { + $this->doc .= '
    ' . DOKU_LF; + } + + /** + * Stop a block quote + */ + public function quote_close() + { + $this->doc .= '
    ' . DOKU_LF; + } + + /** + * Output preformatted text + * + * @param string $text + */ + public function preformatted($text) + { + $this->doc .= '
    ' . trim($this->_xmlEntities($text), "\n\r") . '
    ' . 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 + */ + public 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 + */ + public 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 + * + * @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 + * @author Andreas Gohr + */ + public function _highlight($type, $text, $language = null, $filename = null, $options = null) + { + global $ID; + global $lang; + global $INPUT; + + $language = preg_replace(PREG_PATTERN_VALID_LANGUAGE, '', $language ?? ''); + + if ($filename) { + // add icon + [$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 .= '
    ' . DOKU_LF; + $this->doc .= '
    '; + $this->doc .= hsc($filename); + $this->doc .= '
    ' . DOKU_LF . '
    '; + } + + if (str_starts_with($text, "\n")) { + $text = substr($text, 1); + } + if (str_ends_with($text, "\n")) { + $text = substr($text, 0, -1); + } + + if (empty($language)) { // empty is faster than is_null and can prevent '' string + $this->doc .= '
    ' . $this->_xmlEntities($text) . '
    ' . DOKU_LF; + } else { + $class = 'code'; //we always need the code class to make the syntax highlighting apply + if ($type != 'code') $class .= ' ' . $type; + + $this->doc .= "
    " .
    +                p_xhtml_cached_geshi($text, $language, '', $options) .
    +                '
    ' . DOKU_LF; + } + + if ($filename) { + $this->doc .= '
    ' . DOKU_LF; + } + + $this->_codeblock++; + } + + /** + * Format an acronym + * + * Uses $this->acronyms + * + * @param string $acronym + */ + public function acronym($acronym) + { + + if (array_key_exists($acronym, $this->acronyms)) { + $title = $this->_xmlEntities($this->acronyms[$acronym]); + + $this->doc .= '' . $this->_xmlEntities($acronym) . ''; + } else { + $this->doc .= $this->_xmlEntities($acronym); + } + } + + /** + * Format a smiley + * + * Uses $this->smiley + * + * @param string $smiley + */ + public function smiley($smiley) + { + if (isset($this->smileys[$smiley])) { + $this->doc .= '' . $this->_xmlEntities($smiley) . ''; + } else { + $this->doc .= $this->_xmlEntities($smiley); + } + } + + /** + * Format an entity + * + * Entities are basically small text replacements + * + * Uses $this->entities + * + * @param string $entity + */ + public 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 + */ + public function multiplyentity($x, $y) + { + $this->doc .= "$x×$y"; + } + + /** + * Render an opening single quote char (language specific) + */ + public function singlequoteopening() + { + global $lang; + $this->doc .= $lang['singlequoteopening']; + } + + /** + * Render a closing single quote char (language specific) + */ + public function singlequoteclosing() + { + global $lang; + $this->doc .= $lang['singlequoteclosing']; + } + + /** + * Render an apostrophe char (language specific) + */ + public function apostrophe() + { + global $lang; + $this->doc .= $lang['apostrophe']; + } + + /** + * Render an opening double quote char (language specific) + */ + public function doublequoteopening() + { + global $lang; + $this->doc .= $lang['doublequoteopening']; + } + + /** + * Render an closinging double quote char (language specific) + */ + public 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 + */ + public 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 + */ + public function locallink($hash, $name = null, $returnonly = false) + { + global $ID; + $name = $this->_getLinkTitle($name, $hash, $isImage); + $hash = $this->_headerToLink($hash); + $title = $ID . ' ↵'; + + $doc = ''; + $doc .= $name; + $doc .= ''; + + 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 + * + * @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 + * @author Andreas Gohr + */ + public 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 + $id = (new PageResolver($ID))->resolveId($id, $this->date_at, true); + $exists = page_exists($id, $this->date_at, false, true); + + $link = []; + $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 + [$id, $hash] = sexplode('#', $id, 2); + if (!empty($hash)) $hash = $this->_headerToLink($hash); + + //prepare for formating + $link['target'] = $conf['target']['wiki']; + $link['style'] = ''; + $link['pre'] = ''; + $link['suf'] = ''; + $link['more'] = 'data-wiki-id="' . $id . '"'; // id is already cleaned + $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'] .= '&'; + if (is_array($search)) { + $search = array_map('rawurlencode', $search); + $link['url'] .= 's[]=' . implode('&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 + */ + public 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(); + [$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 = []; + $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'] .= ' ugc 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 + */ + public function interwikilink($match, $name, $wikiName, $wikiUri, $returnonly = false) + { + global $conf; + + $link = []; + $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 || 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'] = $this->_xmlEntities($link['url']); + + // output formatted + if ($returnonly) { + if ($url == '') return $link['name']; + return $this->_formatLink($link); + } elseif ($url == '') { + $this->doc .= $link['name']; + } 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 + */ + public function windowssharelink($url, $name = null, $returnonly = false) + { + global $conf; + + //simple setup + $link = []; + $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 + */ + public function emaillink($address, $name = null, $returnonly = false) + { + global $conf; + //simple setup + $link = []; + $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 + */ + public function internalmedia( + $src, + $title = null, + $align = null, + $width = null, + $height = null, + $cache = null, + $linking = null, + $return = false + ) { + global $ID; + if (strpos($src, '#') !== false) { + [$src, $hash] = sexplode('#', $src, 2); + } + $src = (new MediaResolver($ID))->resolveId($src, $this->date_at, true); + $exists = media_exists($src); + + $noLink = false; + $render = $linking != 'linkonly'; + $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); + + [$ext, $mime] = mimetype($src, false); + if (str_starts_with($mime, 'image') && $render) { + $link['url'] = ml( + $src, + [ + '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, + [ + '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); + } + } elseif ($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 + */ + public function externalmedia( + $src, + $title = null, + $align = null, + $width = null, + $height = null, + $cache = null, + $linking = null, + $return = false + ) { + if (link_isinterwiki($src)) { + [$shortcut, $reference] = sexplode('>', $src, 2, ''); + $exists = null; + $src = $this->_resolveInterWiki($shortcut, $reference, $exists); + if ($src == '' && empty($title)) { + // make sure at least something will be shown in this case + $title = $reference; + } + } + [$src, $hash] = sexplode('#', $src, 2); + $noLink = false; + if ($src == '') { + // only output plaintext without link if there is no src + $noLink = true; + } + $render = $linking != 'linkonly'; + $link = $this->_getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render); + + $link['url'] = ml($src, ['cache' => $cache]); + + [$ext, $mime] = mimetype($src, false); + if (str_starts_with($mime, '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); + } elseif ($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 + */ + public 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 .= '
      '; + if ($rc) { + for ($x = $start; $x != $end; $x += $mod) { + $item = $feed->get_item($x); + $this->doc .= '
    • '; + + $lnkurl = $item->get_permalink(); + $title = html_entity_decode($item->get_title(), ENT_QUOTES, 'UTF-8'); + + // support feeds without links + if ($lnkurl) { + $this->externallink($item->get_permalink(), $title); + } else { + $this->doc .= ' ' . hsc($item->get_title()); + } + if ($params['author']) { + $author = $item->get_author(0); + if ($author instanceof 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']) { + $desc = $item->get_description(); + $desc = strip_tags($desc); + $desc = html_entity_decode($desc, ENT_QUOTES, 'UTF-8'); + $this->doc .= '
      '; + $this->doc .= hsc($desc); + $this->doc .= '
      '; + } + + $this->doc .= '
    • '; + } + } else { + $this->doc .= '
    • '; + $this->doc .= '' . $lang['rssfailed'] . ''; + $this->externallink($url); + if ($conf['allowdebug']) { + $this->doc .= ''; + } + $this->doc .= '
    • '; + } + $this->doc .= '
    '; + } + + /** + * 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 + */ + public 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 = implode(' ', $classes); + $class .= ' ' . $classes; + } + if ($pos !== null) { + $hid = $this->_headerToLink($class, true); + $data = []; + $data['target'] = 'table'; + $data['name'] = ''; + $data['hid'] = $hid; + $class .= ' ' . $this->startSectionEdit($pos, $data); + } + $this->doc .= '
    ' . + DOKU_LF; + } + + /** + * Close a table + * + * @param int $pos byte position in the original source + */ + public function table_close($pos = null) + { + $this->doc .= '
    ' . DOKU_LF; + if ($pos !== null) { + $this->finishSectionEdit($pos); + } + } + + /** + * Open a table header + */ + public function tablethead_open() + { + $this->doc .= DOKU_TAB . '' . DOKU_LF; + } + + /** + * Close a table header + */ + public function tablethead_close() + { + $this->doc .= DOKU_TAB . '' . DOKU_LF; + } + + /** + * Open a table body + */ + public function tabletbody_open() + { + $this->doc .= DOKU_TAB . '' . DOKU_LF; + } + + /** + * Close a table body + */ + public function tabletbody_close() + { + $this->doc .= DOKU_TAB . '' . DOKU_LF; + } + + /** + * Open a table footer + */ + public function tabletfoot_open() + { + $this->doc .= DOKU_TAB . '' . DOKU_LF; + } + + /** + * Close a table footer + */ + public function tabletfoot_close() + { + $this->doc .= DOKU_TAB . '' . DOKU_LF; + } + + /** + * Open a table row + * + * @param string|string[] $classes css classes - have to be valid, do not pass unfiltered user input + */ + public 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 = implode(' ', $classes); + $class .= ' ' . $classes; + } + $this->doc .= DOKU_TAB . '' . DOKU_LF . DOKU_TAB . DOKU_TAB; + } + + /** + * Close a table row + */ + public function tablerow_close() + { + $this->doc .= DOKU_LF . DOKU_TAB . '' . 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 + */ + public 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 = implode(' ', $classes); + $class .= ' ' . $classes; + } + $class .= '"'; + $this->doc .= ' 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 + */ + public function tableheader_close() + { + $this->doc .= ''; + } + + /** + * 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 + */ + public 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 = implode(' ', $classes); + $class .= ' ' . $classes; + } + $class .= '"'; + $this->doc .= ' 1) { + $this->_counter['cell_counter'] += $colspan - 1; + $this->doc .= ' colspan="' . $colspan . '"'; + } + if ($rowspan > 1) { + $this->doc .= ' rowspan="' . $rowspan . '"'; + } + $this->doc .= '>'; + } + + /** + * Close a table cell + */ + public function tablecell_close() + { + $this->doc .= ''; + } + + /** + * Returns the current header level. + * (required e.g. by the filelist plugin) + * + * @return int The current header level + */ + public 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 + */ + public function _formatLink($link) + { + //make sure the url is XHTML compliant (skip mailto) + if (!str_starts_with($link['url'], 'mailto:')) { + $link['url'] = str_replace('&', '&', $link['url']); + $link['url'] = str_replace('&amp;', '&', $link['url']); + } + //remove double encodings in titles + $link['title'] = str_replace('&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'], ['>' => '%3E', '<' => '%3C', '"' => '%22']); + $link['title'] = strtr($link['title'], ['>' => '>', '<' => '<', '"' => '"']); + + $ret = ''; + $ret .= $link['pre']; + $ret .= ' + */ + public function _media( + $src, + $title = null, + $align = null, + $width = null, + $height = null, + $cache = null, + $render = true + ) { + + $ret = ''; + + [$ext, $mime] = mimetype($src); + if (str_starts_with($mime, '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)); + $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 === null || $title === "") { + // just show the sourcename + $title = $this->_xmlEntities(PhpString::basename(noNS($src))); + } + return $title; + } + //add image tag + $ret .= '_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 ??= 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 $this->_xmlEntities($title ?: PhpString::basename(noNS($src))); + } + + $att = []; + $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 = PhpString::basename(noNS($src)); + } + return $this->_xmlEntities($title); + } + + $att = []; + $att['class'] = "media$align"; + if ($align == 'right') $att['align'] = 'right'; + if ($align == 'left') $att['align'] = 'left'; + $ret .= html_flashobject( + ml($src, ['cache' => $cache], true, '&'), + $width, + $height, + ['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(PhpString::basename(noNS($src))); + } + + return $ret; + } + + /** + * Escape string for output + * + * @param $string + * @return string + */ + public function _xmlEntities($string) + { + return hsc($string); + } + + + /** + * Construct a title and handle images in titles + * + * @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 + * @author Harry Fuecks + */ + public 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 + * + * @param array $img + * @return string HTML img tag or similar + * @author Andreas Gohr + */ + public function _imageTitle($img) + { + global $ID; + + // some fixes on $img['src'] + // see internalmedia() and externalmedia() + [$img['src']] = explode('#', $img['src'], 2); + if ($img['type'] == 'internalmedia') { + $img['src'] = (new MediaResolver($ID))->resolveId($img['src'], $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() + * + * @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 + * @author Pierre Spring + */ + public function _getMediaLinkConf($src, $title, $align, $width, $height, $cache, $render) + { + global $conf; + + $link = []; + $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 + * + * @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 + */ +function tpl_pagelink($id, $name = null, $return = false) +{ + $out = '' . html_wikilink($id, $name) . ''; + if ($return) return $out; + echo $out; + return true; +} + +/** + * get the parent page + * + * Tries to find out which page is parent. + * returns false if none is available + * + * @param string $id page id + * @return false|string + * + * @author Andreas Gohr + */ +function tpl_getparent($id) +{ + $resolver = new PageResolver('root'); + + $parent = getNS($id) . ':'; + $parent = $resolver->resolveId($parent); + if ($parent == $id) { + $pos = strrpos(getNS($id), ':'); + $parent = substr($parent, 0, $pos) . ':'; + $parent = $resolver->resolveId($parent); + if ($parent == $id) return false; + } + return $parent; +} + +/** + * Print one of the buttons + * + * @param string $type + * @param bool $return + * @return bool|string html, or false if no data, true if printed + * @see tpl_get_action + * + * @author Adrian Lang + * @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 + * + * @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 + * + * @see tpl_get_action + * @author Adrian Lang + * @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 ?: $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 + * + * @param string $type + * @return array|bool|string + * + * @author Adrian Lang + * @author Andreas Gohr + * @author Matthias Grimm + * @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 AbstractItem $item */ + $item = new $class(); + $data = $item->getLegacyData(); + $unknown = false; + } catch (RuntimeException $ignored) { + return false; + } + } else { + global $ID; + $data = [ + 'accesskey' => null, + 'type' => $type, + 'id' => $ID, + 'method' => 'get', + 'params' => ['do' => $type], + 'nofollow' => true, + 'replacement' => '' + ]; + $unknown = true; + } + + $evt = new 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() + * + * @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 + * + * @author Anika Henke + * @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"; + + if ($return) return $out; + echo $out; + return (bool)$out; +} + +/** + * 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) + * + * @param bool $ajax + * @param bool $autocomplete + * @return bool + * + * @author Andreas Gohr + */ +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 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'); + + echo $searchForm->toHTML('QuickSearch'); + + return true; +} + +/** + * Print the breadcrumbs trace + * + * @param string $sep Separator between entries + * @param bool $return return or print + * @return bool|string + * + * @author Andreas Gohr + */ +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 = ' ' . $sep . ' '; + + //render crumbs, highlight the last one + $out .= '' . $lang['breadcrumb'] . ''; + $last = count($crumbs); + $i = 0; + foreach ($crumbs as $id => $name) { + $i++; + $out .= $crumbs_sep; + if ($i == $last) $out .= ''; + $out .= '' . tpl_link(wl($id), hsc($name), 'class="breadcrumbs" title="' . $id . '"', true) . ''; + if ($i == $last) $out .= ''; + } + if ($return) return $out; + echo $out; + return (bool)$out; +} + +/** + * Hierarchical breadcrumbs + * + * This code was suggested as replacement for the usual breadcrumbs. + * It only makes sense with a deep site structure. + * + * @param string $sep Separator between entries + * @param bool $return return or print + * @return bool|string + * + * @todo May behave strangely in RTL languages + * @author + * @author Andreas Gohr + * @author Nigel McNie + * @author Sean Coates + */ +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 .= '' . $lang['youarehere'] . ' '; + + // always print the startpage + $out .= '' . tpl_pagelink(':' . $conf['start'], null, true) . ''; + + // 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 + if (isset($page)) { + $page = (new PageResolver('root'))->resolveId($page); + if ($page == $part . $parts[$i]) { + if ($return) return $out; + echo $out; + return true; + } + } + $page = $part . $parts[$i]; + if ($page == $conf['start']) { + if ($return) return $out; + echo $out; + return true; + } + $out .= $sep; + $out .= tpl_pagelink($page, null, true); + if ($return) return $out; + echo $out; + return (bool)$out; +} + +/** + * Print info if the user is logged in + * and show full name in that case + * + * Could be enhanced with a profile link in future? + * + * @return bool + * + * @author Andreas Gohr + */ +function tpl_userinfo() +{ + global $lang; + /** @var Input $INPUT */ + global $INPUT; + + if ($INPUT->server->str('REMOTE_USER')) { + echo $lang['loggedinas'] . ' ' . userlink(); + return true; + } + return false; +} + +/** + * Print some info about the current page + * + * @param bool $ret return content instead of printing it + * @return bool|string + * + * @author Andreas Gohr + */ +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 = '' . $fn . ''; + $out .= ' · '; + $out .= $lang['lastmod']; + $out .= ' '; + $out .= $date; + if ($INFO['editor']) { + $out .= ' ' . $lang['by'] . ' '; + $out .= '' . editorinfo($INFO['editor']) . ''; + } else { + $out .= ' (' . $lang['external_edit'] . ')'; + } + if ($INFO['locked']) { + $out .= ' · '; + $out .= $lang['lockedby']; + $out .= ' '; + $out .= '' . editorinfo($INFO['locked']) . ''; + } + 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. + * + * @param string $id page id + * @param bool $ret return content instead of printing + * @return bool|string + * + * @author Andreas Gohr + */ +function tpl_pagetitle($id = null, $ret = false) +{ + global $ACT, $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 AdminPlugin $plugin */ + if ($plugin = plugin_getRequestAdminPlugin()) { + $plugin_title = $plugin->getMenuText($conf['lang']); + $page_title = $plugin_title ?: $plugin->getPluginName(); + } + break; + + // show action as title + case 'login': + case 'profile': + case 'register': + case 'resendpwd': + case 'index': + case 'search': + $page_title = $lang['btn_' . $ACT]; + break; + + // add pen during editing + case 'edit': + case 'preview': + $page_title = "✎ " . $name; + break; + + // add action to page name + case 'revisions': + $page_title = $name . ' - ' . $lang['btn_revs']; + break; + + // add action to page name + 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 { + echo 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 + * + * @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 + * + * @author Andreas Gohr + */ +function tpl_img_getTag($tags, $alt = '', $src = null) +{ + // Init Exif Reader + global $SRC, $imgMeta; + + if (is_null($src)) $src = $SRC; + if (is_null($src)) return $alt; + + if (!isset($imgMeta)) { + $imgMeta = new JpegMeta($src); + } + if ($imgMeta === false) return $alt; + $info = cleanText($imgMeta->getField($tags)); + if (!$info) return $alt; + return $info; +} + + +/** + * Garbage collects up the open JpegMeta object. + */ +function tpl_img_close() +{ + global $imgMeta; + $imgMeta = null; +} + +/** + * Prints a html description list of the metatags of the current image + */ +function tpl_img_meta() +{ + global $lang; + + $tags = tpl_get_img_meta(); + + echo '
    '; + foreach ($tags as $tag) { + $label = $lang[$tag['langkey']]; + if (!$label) $label = $tag['langkey'] . ':'; + + echo '
    ' . $label . '
    '; + if ($tag['type'] == 'date') { + echo dformat($tag['value']); + } else { + echo hsc($tag['value']); + } + echo '
    '; + } + echo '
    '; +} + +/** + * 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); + } + } + $tags = []; + foreach ($fields as $tag) { + $t = []; + if (!empty($tag[0])) { + $t = [$tag[0]]; + } + if (isset($tag[3]) && is_array($tag[3])) { + $t = array_merge($t, $tag[3]); + } + $value = tpl_img_getTag($t); + if ($value) { + $tags[] = ['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 int $maxwidth - maximal width of the image + * @param int $maxheight - maximal height of the image + * @param bool $link - link to the orginal size? + * @param array $params - 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; + } + } elseif ($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, ['cache' => $INPUT->str('cache'), 'rev' => $REV], true, '&'); + $src = ml($IMG, ['cache' => $INPUT->str('cache'), 'rev' => $REV, 'w' => $w, 'h' => $h], true, '&'); + + //prepare attributes + $alt = tpl_img_getTag('Simple.Title'); + if (is_null($params)) { + $p = []; + } 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 = ['url' => ($link ? $url : null), 'params' => $p]; + return Event::createAndTrigger('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']) echo '
    '; + echo ''; + if ($data['url']) echo ''; + 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 = []; + $p['src'] = DOKU_BASE . 'lib/exe/taskrunner.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); + echo ""; + 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; + } + } + + return $conf['tpl'][$tpl][$id] ?? $notset; +} + +/** + * tpl_loadConfig() + * + * reads all template configuration variables + * this function is automatically called by tpl_getConf() + * + * @return false|array + */ +function tpl_loadConfig() +{ + + $file = tpl_incdir() . '/conf/default.php'; + $conf = []; + + 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 = []; + + if (count($lang) === 0) { + global $conf, $config_cascade; // definitely don't invoke "global $lang" + + $path = tpl_incdir() . 'lang/'; + + $lang = []; + + // 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 + */ +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, ['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) echo '
    '; + $data = ['do' => $do]; + $evt = new 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) echo '
    '; +} + +/** + * 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 + */ +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, ['files', 'upload', 'search'])) $opened_tab = 'files'; + if ($INPUT->str('mediado') == 'update') $opened_tab = 'upload'; + + echo '

    ' . $lang['mediaselect'] . '

    ' . NL; + + media_tabs_files($opened_tab); + + echo '
    ' . NL; + echo '

    '; + $tabTitle = $NS ?: '[' . $lang['mediaroot'] . ']'; + printf($lang['media_' . $opened_tab], '' . hsc($tabTitle) . ''); + echo '

    ' . NL; + if ($opened_tab === 'search' || $opened_tab === 'files') { + media_tab_files_options(); + } + echo '
    ' . NL; + + echo '
    ' . 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 '
    ' . 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 + * + * @param string $image + * @param boolean $rev + * + * @author Kate Arzamastseva + */ +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 = ['view']; + [, $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 '

    '; + [$ext] = mimetype($image, false); + $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $ext); + $class = 'select mediafile mf_' . $class; + + $attributes = $rev ? ['rev' => $rev] : []; + $tabTitle = sprintf( + '%s', + ml($image, $attributes), + $class, + $lang['mediaview'], + $image + ); + if ($opened_tab === 'view' && $rev) { + printf($lang['media_viewold'], $tabTitle, dformat($rev)); + } else { + printf($lang['media_' . $opened_tab], $tabTitle); + } + + echo '

    ' . NL; + + echo '
    ' . 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 '
    ' . NL; +} + +/** + * prints the namespace tree in the mediamanager popup + * + * Only allowed in mediamanager.php + * + * @author Andreas Gohr + */ +function tpl_mediaTree() +{ + global $NS; + echo '
    '; + media_nstree($NS); + echo '
    '; +} + +/** + * 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 + * + * @author Andreas Gohr + * @deprecated 2017-09-01 see devel:menus + */ +function tpl_actiondropdown($empty = '', $button = '>') +{ + dbg_deprecated('see devel:menus'); + $menu = new MobileMenu(); + echo $menu->getDropdown($empty, $button); +} + +/** + * Print a informational line about the used license + * + * @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 + * + * @author Andreas Gohr + */ +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 .= '
    '; + if ($img) { + $src = license_img($img); + if ($src) { + $out .= ''; + if (!$imgonly) $out .= ' '; + } + } + if (!$imgonly) { + $out .= $lang['license'] . ' '; + $out .= ''; + } + if ($wrap) $out .= '
    '; + + 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 + * @deprecated 2020-07-23 + */ +function tpl_subscribe() +{ + dbg_deprecated(Subscribe::class . '::show()'); + (new Subscribe())->show(); +} + +/** + * Tries to send already created content right to the browser + * + * Wraps around ob_flush() and flush() + * + * @author Andreas Gohr + */ +function tpl_flush() +{ + if (ob_get_level() > 0) 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() + * @param bool $fallback use fallback image if target isn't found or return 'false' if potential + * false result is required + * @return string + * + * @author Andreas Gohr + */ +function tpl_getMediaFile($search, $abs = false, &$imginfo = null, $fallback = true) +{ + $img = ''; + $file = ''; + $ismedia = false; + // loop through candidates until a match was found: + foreach ($search as $img) { + if (str_starts_with($img, ':')) { + $file = mediaFN($img); + $ismedia = true; + } else { + $file = tpl_incdir() . $img; + $ismedia = false; + } + + if (file_exists($file)) break; + } + + // manage non existing target + if (!file_exists($file)) { + // give result for fallback image + if ($fallback) { + $file = DOKU_INC . 'lib/images/blank.gif'; + // stop process if false result is required (if $fallback is false) + } else { + return false; + } + } + + // 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! + * + * @param string $file + * + * @author Andreas Gohr + * @author Anika Henke + */ +function tpl_includeFile($file) +{ + global $config_cascade; + foreach (['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 tag for various icon types (favicon|mobile|generic) + * + * @param array $types - list of icon types to display (favicon|mobile|generic) + * @return string + * + * @author Anika Henke + */ +function tpl_favicon($types = ['favicon']) +{ + + $return = ''; + + foreach ($types as $type) { + switch ($type) { + case 'favicon': + $look = [':wiki:favicon.ico', ':favicon.ico', 'images/favicon.ico']; + $return .= '' . NL; + break; + case 'mobile': + $look = [':wiki:apple-touch-icon.png', ':apple-touch-icon.png', 'images/apple-touch-icon.png']; + $return .= '' . NL; + break; + case 'generic': + // ideal world solution, which doesn't work in any browser yet + $look = [':wiki:favicon.svg', ':favicon.svg', 'images/favicon.svg']; + $return .= '' . NL; + break; + } + } + + return $return; +} + +/** + * Prints full-screen media manager + * + * @author Kate Arzamastseva + */ +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 '
    ' . NL; + echo '

    ' . $lang['btn_media'] . '

    ' . NL; + html_msgarea(); + + echo '
    ' . NL; + echo '

    ' . $lang['namespaces'] . '

    ' . NL; + echo '
    '; + echo $lang['media_namespaces']; + echo '
    ' . NL; + + echo '
    ' . NL; + media_nstree($NS); + echo '
    ' . NL; + echo '
    ' . NL; + + echo '
    ' . NL; + tpl_mediaFileList(); + echo '
    ' . NL; + + echo '
    ' . NL; + echo '

    ' . $lang['media_file'] . '

    ' . NL; + tpl_mediaFileDetails($image, $rev); + echo '
    ' . NL; + + echo '
    ' . NL; +} + +/** + * Return useful layout classes + * + * @return string + * + * @author Anika Henke + */ +function tpl_classes() +{ + global $ACT, $conf, $ID, $INFO; + /** @var Input $INPUT */ + global $INPUT; + + $classes = [ + 'dokuwiki', + 'mode_' . $ACT, + 'tpl_' . $conf['template'], + $INPUT->server->bool('REMOTE_USER') ? 'loggedIn' : '', + (isset($INFO['exists']) && $INFO['exists']) ? '' : 'notFound', + ($ID == $conf['start']) ? 'home' : '' + ]; + return implode(' ', $classes); +} + +/** + * Create event for tools menues + * + * @param string $toolsname name of menu + * @param array $items + * @param string $view e.g. 'main', 'detail', ... + * + * @author Anika Henke + * @deprecated 2017-09-01 see devel:menus + */ +function tpl_toolsevent($toolsname, $items, $view = 'main') +{ + dbg_deprecated('see devel:menus'); + $data = ['view' => $view, 'items' => $items]; + + $hook = 'TEMPLATE_' . strtoupper($toolsname) . '_DISPLAY'; + $evt = new Event($hook, $data); + if ($evt->advise_before()) { + foreach ($evt->data['items'] as $html) echo $html; + } + $evt->advise_after(); +} diff --git a/inc/toolbar.php b/inc/toolbar.php new file mode 100644 index 0000000..16ba3f7 --- /dev/null +++ b/inc/toolbar.php @@ -0,0 +1,282 @@ + + */ + +use dokuwiki\Extension\Event; + +/** + * 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 + */ +function toolbar_JSdefines($varname) +{ + global $lang; + + $menu = []; + + $evt = new Event('TOOLBAR_DEFINE', $menu); + if ($evt->advise_before()) { + // build button array + $menu = array_merge($menu, [ + [ + 'type' => 'format', + 'title' => $lang['qb_bold'], + 'icon' => 'bold.png', + 'key' => 'b', + 'open' => '**', + 'close' => '**', + 'block' => false + ], + [ + 'type' => 'format', + 'title' => $lang['qb_italic'], + 'icon' => 'italic.png', + 'key' => 'i', + 'open' => '//', + 'close' => '//', + 'block' => false + ], + [ + 'type' => 'format', + 'title' => $lang['qb_underl'], + 'icon' => 'underline.png', + 'key' => 'u', + 'open' => '__', + 'close' => '__', + 'block' => false + ], + [ + 'type' => 'format', + 'title' => $lang['qb_code'], + 'icon' => 'mono.png', + 'key' => 'm', + 'open' => "''", + 'close' => "''", + 'block' => false + ], + [ + 'type' => 'format', + 'title' => $lang['qb_strike'], + 'icon' => 'strike.png', + 'key' => 'd', + 'open' => '', + 'close' => '', + 'block' => false + ], + [ + 'type' => 'autohead', + 'title' => $lang['qb_hequal'], + 'icon' => 'hequal.png', + 'key' => '8', + 'text' => $lang['qb_h'], + 'mod' => 0, + 'block' => true + ], + [ + 'type' => 'autohead', + 'title' => $lang['qb_hminus'], + 'icon' => 'hminus.png', + 'key' => '9', + 'text' => $lang['qb_h'], + 'mod' => 1, + 'block' => true + ], + [ + 'type' => 'autohead', + 'title' => $lang['qb_hplus'], + 'icon' => 'hplus.png', + 'key' => '0', + 'text' => $lang['qb_h'], + 'mod' => -1, + 'block' => true + ], + [ + 'type' => 'picker', + 'title' => $lang['qb_hs'], + 'icon' => 'h.png', + 'class' => 'pk_hl', + 'list' => [ + [ + 'type' => 'format', + 'title' => $lang['qb_h1'], + 'icon' => 'h1.png', + 'key' => '1', + 'open' => '====== ', + 'close' => ' ======\n' + ], + [ + 'type' => 'format', + 'title' => $lang['qb_h2'], + 'icon' => 'h2.png', + 'key' => '2', + 'open' => '===== ', + 'close' => ' =====\n' + ], + [ + 'type' => 'format', + 'title' => $lang['qb_h3'], + 'icon' => 'h3.png', + 'key' => '3', + 'open' => '==== ', + 'close' => ' ====\n' + ], + [ + 'type' => 'format', + 'title' => $lang['qb_h4'], + 'icon' => 'h4.png', + 'key' => '4', + 'open' => '=== ', + 'close' => ' ===\n' + ], + [ + 'type' => 'format', + 'title' => $lang['qb_h5'], + 'icon' => 'h5.png', + 'key' => '5', + 'open' => '== ', + 'close' => ' ==\n' + ] + ], + 'block' => true + ], + [ + 'type' => 'linkwiz', + 'title' => $lang['qb_link'], + 'icon' => 'link.png', + 'key' => 'l', + 'open' => '[[', + 'close' => ']]', + 'block' => false + ], + [ + 'type' => 'format', + 'title' => $lang['qb_extlink'], + 'icon' => 'linkextern.png', + 'open' => '[[', + 'close' => ']]', + 'sample' => 'http://example.com|' . $lang['qb_extlink'], + 'block' => false + ], + [ + 'type' => 'formatln', + 'title' => $lang['qb_ol'], + 'icon' => 'ol.png', + 'open' => ' - ', + 'close' => '', + 'key' => '-', + 'block' => true + ], + [ + 'type' => 'formatln', + 'title' => $lang['qb_ul'], + 'icon' => 'ul.png', + 'open' => ' * ', + 'close' => '', + 'key' => '.', + 'block' => true + ], + [ + 'type' => 'insert', + 'title' => $lang['qb_hr'], + 'icon' => 'hr.png', + 'insert' => '\n----\n', + 'block' => true + ], + [ + '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 + ], + [ + 'type' => 'picker', + 'title' => $lang['qb_smileys'], + 'icon' => 'smiley.png', + 'list' => getSmileys(), + 'icobase' => 'smileys', + 'block' => false + ], + [ + 'type' => 'picker', + 'title' => $lang['qb_chars'], + 'icon' => 'chars.png', + 'list' => [ + 'À', 'à', 'Á', 'á', 'Â', 'â', 'Ã', 'ã', 'Ä', 'ä', 'Ǎ', 'ǎ', 'Ă', 'ă', 'Å', 'å', + 'Ā', 'ā', 'Ą', 'ą', 'Æ', 'æ', 'Ć', 'ć', 'Ç', 'ç', 'Č', 'č', 'Ĉ', 'ĉ', 'Ċ', 'ċ', + 'Ð', 'đ', 'ð', 'Ď', 'ď', 'È', 'è', 'É', 'é', 'Ê', 'ê', 'Ë', 'ë', 'Ě', 'ě', 'Ē', + 'ē', 'Ė', 'ė', 'Ę', 'ę', 'Ģ', 'ģ', 'Ĝ', 'ĝ', 'Ğ', 'ğ', 'Ġ', 'ġ', 'Ĥ', 'ĥ', 'Ì', + 'ì', 'Í', 'í', 'Î', 'î', 'Ï', 'ï', 'Ǐ', 'ǐ', 'Ī', 'ī', 'İ', 'ı', 'Į', 'į', 'Ĵ', + 'ĵ', 'Ķ', 'ķ', 'Ĺ', 'ĺ', 'Ļ', 'ļ', 'Ľ', 'ľ', 'Ł', 'ł', 'Ŀ', 'ŀ', 'Ń', 'ń', 'Ñ', + 'ñ', 'Ņ', 'ņ', 'Ň', 'ň', 'Ò', 'ò', 'Ó', 'ó', 'Ô', 'ô', 'Õ', 'õ', 'Ö', 'ö', 'Ǒ', + 'ǒ', 'Ō', 'ō', 'Ő', 'ő', 'Œ', 'œ', 'Ø', 'ø', 'Ŕ', 'ŕ', 'Ŗ', 'ŗ', 'Ř', 'ř', 'Ś', + 'ś', 'Ş', 'ş', 'Š', 'š', 'Ŝ', 'ŝ', 'Ţ', 'ţ', 'Ť', 'ť', 'Ù', 'ù', 'Ú', 'ú', 'Û', + 'û', 'Ü', 'ü', 'Ǔ', 'ǔ', 'Ŭ', 'ŭ', 'Ū', 'ū', 'Ů', 'ů', 'ǖ', 'ǘ', 'ǚ', 'ǜ', 'Ų', + 'ų', 'Ű', 'ű', 'Ŵ', 'ŵ', 'Ý', 'ý', 'Ÿ', 'ÿ', 'Ŷ', 'ŷ', 'Ź', 'ź', 'Ž', 'ž', 'Ż', + 'ż', 'Þ', 'þ', 'ß', 'Ħ', 'ħ', '¿', '¡', '¢', '£', '¤', '¥', '€', '¦', '§', 'ª', + '¬', '¯', '°', '±', '÷', '‰', '¼', '½', '¾', '¹', '²', '³', 'µ', '¶', '†', '‡', + '·', '•', 'º', '∀', '∂', '∃', 'Ə', 'ə', '∅', '∇', '∈', '∉', '∋', '∏', '∑', '‾', + '−', '∗', '×', '⁄', '√', '∝', '∞', '∠', '∧', '∨', '∩', '∪', '∫', '∴', '∼', '≅', + '≈', '≠', '≡', '≤', '≥', '⊂', '⊃', '⊄', '⊆', '⊇', '⊕', '⊗', '⊥', '⋅', '◊', '℘', + 'ℑ', 'ℜ', 'ℵ', '♠', '♣', '♥', '♦', 'α', 'β', 'Γ', 'γ', 'Δ', 'δ', 'ε', 'ζ', 'η', + 'Θ', 'θ', 'ι', 'κ', 'Λ', 'λ', 'μ', 'Ξ', 'ξ', 'Π', 'π', 'ρ', 'Σ', 'σ', 'Τ', 'τ', + 'υ', 'Φ', 'φ', 'χ', 'Ψ', 'ψ', 'Ω', 'ω', '★', '☆', '☎', '☚', '☛', '☜', '☝', '☞', + '☟', '☹', '☺', '✔', '✘', '„', '“', '”', '‚', '‘', '’', '«', '»', '‹', '›', '—', + '–', '…', '←', '↑', '→', '↓', '↔', '⇐', '⇑', '⇒', '⇓', '⇔', '©', '™', '®', '′', + '″', '[', ']', '{', '}', '~', '(', ')', '%', '§', '$', '#', '|', '@' + ], + 'block' => false + ], + [ + '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 + echo "var $varname = " . json_encode($menu, JSON_THROW_ON_ERROR) . ";\n"; +} + +/** + * prepares the signature string as configured in the config + * + * @author Andreas Gohr + */ +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); + if (is_null($INFO)) { + $sig = str_replace(['@NAME@', '@MAIL@'], '', $sig); + } else { + $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', $sig); + return json_encode($sig, JSON_THROW_ON_ERROR); +} + +//Setup VIM: ex: et ts=4 : diff --git a/inc/utf8.php b/inc/utf8.php new file mode 100644 index 0000000..5ac3cd6 --- /dev/null +++ b/inc/utf8.php @@ -0,0 +1,285 @@ + + */ + +use dokuwiki\Utf8\Clean; +use dokuwiki\Utf8\Conversion; +use dokuwiki\Utf8\PhpString; +use dokuwiki\Utf8\Unicode; + +/** + * 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')) { + /** @deprecated 2019-06-09 */ + function utf8_isASCII($str) + { + dbg_deprecated(Clean::class . '::isASCII()'); + return Clean::isASCII($str); + } +} + + +if (!function_exists('utf8_strip')) { + /** @deprecated 2019-06-09 */ + function utf8_strip($str) + { + dbg_deprecated(Clean::class . '::strip()'); + return Clean::strip($str); + } +} + +if (!function_exists('utf8_check')) { + /** @deprecated 2019-06-09 */ + function utf8_check($str) + { + dbg_deprecated(Clean::class . '::isUtf8()'); + return Clean::isUtf8($str); + } +} + +if (!function_exists('utf8_basename')) { + /** @deprecated 2019-06-09 */ + function utf8_basename($path, $suffix = '') + { + dbg_deprecated(PhpString::class . '::basename()'); + return PhpString::basename($path, $suffix); + } +} + +if (!function_exists('utf8_strlen')) { + /** @deprecated 2019-06-09 */ + function utf8_strlen($str) + { + dbg_deprecated(PhpString::class . '::strlen()'); + return PhpString::strlen($str); + } +} + +if (!function_exists('utf8_substr')) { + /** @deprecated 2019-06-09 */ + function utf8_substr($str, $offset, $length = null) + { + dbg_deprecated(PhpString::class . '::substr()'); + return PhpString::substr($str, $offset, $length); + } +} + +if (!function_exists('utf8_substr_replace')) { + /** @deprecated 2019-06-09 */ + function utf8_substr_replace($string, $replacement, $start, $length = 0) + { + dbg_deprecated(PhpString::class . '::substr_replace()'); + return PhpString::substr_replace($string, $replacement, $start, $length); + } +} + +if (!function_exists('utf8_ltrim')) { + /** @deprecated 2019-06-09 */ + function utf8_ltrim($str, $charlist = '') + { + dbg_deprecated(PhpString::class . '::ltrim()'); + return PhpString::ltrim($str, $charlist); + } +} + +if (!function_exists('utf8_rtrim')) { + /** @deprecated 2019-06-09 */ + function utf8_rtrim($str, $charlist = '') + { + dbg_deprecated(PhpString::class . '::rtrim()'); + return PhpString::rtrim($str, $charlist); + } +} + +if (!function_exists('utf8_trim')) { + /** @deprecated 2019-06-09 */ + function utf8_trim($str, $charlist = '') + { + dbg_deprecated(PhpString::class . '::trim()'); + return PhpString::trim($str, $charlist); + } +} + +if (!function_exists('utf8_strtolower')) { + /** @deprecated 2019-06-09 */ + function utf8_strtolower($str) + { + dbg_deprecated(PhpString::class . '::strtolower()'); + return PhpString::strtolower($str); + } +} + +if (!function_exists('utf8_strtoupper')) { + /** @deprecated 2019-06-09 */ + function utf8_strtoupper($str) + { + dbg_deprecated(PhpString::class . '::strtoupper()'); + return PhpString::strtoupper($str); + } +} + +if (!function_exists('utf8_ucfirst')) { + /** @deprecated 2019-06-09 */ + function utf8_ucfirst($str) + { + dbg_deprecated(PhpString::class . '::ucfirst()'); + return PhpString::ucfirst($str); + } +} + +if (!function_exists('utf8_ucwords')) { + /** @deprecated 2019-06-09 */ + function utf8_ucwords($str) + { + dbg_deprecated(PhpString::class . '::ucwords()'); + return PhpString::ucwords($str); + } +} + +if (!function_exists('utf8_deaccent')) { + /** @deprecated 2019-06-09 */ + function utf8_deaccent($str, $case = 0) + { + dbg_deprecated(Clean::class . '::deaccent()'); + return Clean::deaccent($str, $case); + } +} + +if (!function_exists('utf8_romanize')) { + /** @deprecated 2019-06-09 */ + function utf8_romanize($str) + { + dbg_deprecated(Clean::class . '::romanize()'); + return Clean::romanize($str); + } +} + +if (!function_exists('utf8_stripspecials')) { + /** @deprecated 2019-06-09 */ + function utf8_stripspecials($str, $repl = '', $additional = '') + { + dbg_deprecated(Clean::class . '::stripspecials()'); + return Clean::stripspecials($str, $repl, $additional); + } +} + +if (!function_exists('utf8_strpos')) { + /** @deprecated 2019-06-09 */ + function utf8_strpos($haystack, $needle, $offset = 0) + { + dbg_deprecated(PhpString::class . '::strpos()'); + return PhpString::strpos($haystack, $needle, $offset); + } +} + +if (!function_exists('utf8_tohtml')) { + /** @deprecated 2019-06-09 */ + function utf8_tohtml($str, $all = false) + { + dbg_deprecated(Conversion::class . '::toHtml()'); + return Conversion::toHtml($str, $all); + } +} + +if (!function_exists('utf8_unhtml')) { + /** @deprecated 2019-06-09 */ + function utf8_unhtml($str, $enties = false) + { + dbg_deprecated(Conversion::class . '::fromHtml()'); + return Conversion::fromHtml($str, $enties); + } +} + +if (!function_exists('utf8_to_unicode')) { + /** @deprecated 2019-06-09 */ + function utf8_to_unicode($str, $strict = false) + { + dbg_deprecated(Unicode::class . '::fromUtf8()'); + return Unicode::fromUtf8($str, $strict); + } +} + +if (!function_exists('unicode_to_utf8')) { + /** @deprecated 2019-06-09 */ + function unicode_to_utf8($arr, $strict = false) + { + dbg_deprecated(Unicode::class . '::toUtf8()'); + return Unicode::toUtf8($arr, $strict); + } +} + +if (!function_exists('utf8_to_utf16be')) { + /** @deprecated 2019-06-09 */ + function utf8_to_utf16be($str, $bom = false) + { + dbg_deprecated(Conversion::class . '::toUtf16be()'); + return Conversion::toUtf16be($str, $bom); + } +} + +if (!function_exists('utf16be_to_utf8')) { + /** @deprecated 2019-06-09 */ + function utf16be_to_utf8($str) + { + dbg_deprecated(Conversion::class . '::fromUtf16be()'); + return Conversion::fromUtf16be($str); + } +} + +if (!function_exists('utf8_bad_replace')) { + /** @deprecated 2019-06-09 */ + function utf8_bad_replace($str, $replace = '') + { + dbg_deprecated(Clean::class . '::replaceBadBytes()'); + return Clean::replaceBadBytes($str, $replace); + } +} + +if (!function_exists('utf8_correctIdx')) { + /** @deprecated 2019-06-09 */ + function utf8_correctIdx($str, $i, $next = false) + { + dbg_deprecated(Clean::class . '::correctIdx()'); + return Clean::correctIdx($str, $i, $next); + } +} diff --git a/index.php b/index.php new file mode 100644 index 0000000..2626d4e --- /dev/null +++ b/index.php @@ -0,0 +1,77 @@ + + */ + +if (PHP_SAPI != 'cli-server') { + if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/'); + require_once(DOKU_INC . 'inc/init.php'); + + send_redirect(wl($conf['start'])); +} + +// ROUTER starts below + +// avoid path traversal +$_SERVER['SCRIPT_NAME'] = str_replace('/../', '/', $_SERVER['SCRIPT_NAME']); + +// routing aka. rewriting +if (preg_match('/^\/_media\/(.*)/', $_SERVER['SCRIPT_NAME'], $m)) { + // media dispatcher + $_GET['media'] = $m[1]; + require $_SERVER['DOCUMENT_ROOT'] . '/lib/exe/fetch.php'; +} elseif (preg_match('/^\/_detail\/(.*)/', $_SERVER['SCRIPT_NAME'], $m)) { + // image detail view + $_GET['media'] = $m[1]; + require $_SERVER['DOCUMENT_ROOT'] . '/lib/exe/detail.php'; +} elseif (preg_match('/^\/_export\/([^\/]+)\/(.*)/', $_SERVER['SCRIPT_NAME'], $m)) { + // exports + $_GET['do'] = 'export_' . $m[1]; + $_GET['id'] = $m[2]; + require $_SERVER['DOCUMENT_ROOT'] . '/doku.php'; +} elseif ( + $_SERVER['SCRIPT_NAME'] !== '/index.php' && + file_exists($_SERVER['DOCUMENT_ROOT'] . $_SERVER['SCRIPT_NAME']) +) { + // existing files + + // access limitiations + if ( + preg_match('/\/([._]ht|README$|VERSION$|COPYING$)/', $_SERVER['SCRIPT_NAME']) || + preg_match('/^\/(data|conf|bin|inc)\//', $_SERVER['SCRIPT_NAME']) + ) { + header('HTTP/1.1 403 Forbidden'); + die('Access denied'); + } + + if (str_ends_with($_SERVER['SCRIPT_NAME'], '.php')) { + # php scripts + require $_SERVER['DOCUMENT_ROOT'] . $_SERVER['SCRIPT_NAME']; + } else { + # static files + return false; + } +} else { + // treat everything else as a potential wiki page + // working around https://bugs.php.net/bug.php?id=61286 + $request_path = preg_split('/\?/', $_SERVER['REQUEST_URI'], 2)[0]; + if (isset($_SERVER['PATH_INFO'])) { + $_GET['id'] = $_SERVER['PATH_INFO']; + } elseif ($request_path != '/' && $request_path != '/index.php') { + $_GET['id'] = $_SERVER['SCRIPT_NAME']; + } + + require $_SERVER['DOCUMENT_ROOT'] . '/doku.php'; +} diff --git a/lib/exe/ajax.php b/lib/exe/ajax.php new file mode 100644 index 0000000..7190641 --- /dev/null +++ b/lib/exe/ajax.php @@ -0,0 +1,29 @@ + + */ + +use dokuwiki\Utf8\Clean; +use dokuwiki\Ajax; + +if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/../../'); +require_once(DOKU_INC . 'inc/init.php'); + +//close session +session_write_close(); + +// default header, ajax call may overwrite it later +header('Content-Type: text/html; charset=utf-8'); + +//call the requested function +global $INPUT; +if ($INPUT->has('call')) { + $call = $INPUT->filter([Clean::class, 'stripspecials'])->str('call'); + new Ajax($call); +} else { + http_status(404); +} diff --git a/lib/exe/css.php b/lib/exe/css.php new file mode 100644 index 0000000..f1e967d --- /dev/null +++ b/lib/exe/css.php @@ -0,0 +1,703 @@ + + */ + +use LesserPHP\Lessc; +use dokuwiki\StyleUtils; +use dokuwiki\Cache\Cache; +use dokuwiki\Extension\Event; + +if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/../../'); +if (!defined('NOSESSION')) define('NOSESSION', true); // we do not use a session or authentication here (better caching) +if (!defined('DOKU_DISABLE_GZIP_OUTPUT')) define('DOKU_DISABLE_GZIP_OUTPUT', 1); // we gzip ourself here +if (!defined('NL')) define('NL', "\n"); +require_once(DOKU_INC . 'inc/init.php'); + +// Main (don't run when UNIT test) +if (!defined('SIMPLE_TEST')) { + header('Content-Type: text/css; charset=utf-8'); + css_out(); +} + + +// ---------------------- functions ------------------------------ + +/** + * Output all needed Styles + * + * @author Andreas Gohr + */ +function css_out() +{ + global $conf; + global $lang; + global $config_cascade; + global $INPUT; + + if ($INPUT->str('s') == 'feed') { + $mediatypes = ['feed']; + $type = 'feed'; + } else { + $mediatypes = ['screen', 'all', 'print', 'speech']; + $type = ''; + } + + // decide from where to get the template + $tpl = trim(preg_replace('/[^\w-]+/', '', $INPUT->str('t'))); + if (!$tpl) { + $tpl = $conf['template']; + } + + // load style.ini + $styleUtil = new StyleUtils($tpl, $INPUT->bool('preview')); + $styleini = $styleUtil->cssStyleini(); + + // cache influencers + $tplinc = tpl_incdir($tpl); + $cache_files = getConfigFiles('main'); + $cache_files[] = $tplinc . 'style.ini'; + $cache_files[] = DOKU_CONF . "tpl/$tpl/style.ini"; + $cache_files[] = __FILE__; + if ($INPUT->bool('preview')) { + $cache_files[] = $conf['cachedir'] . '/preview.ini'; + } + + // Array of needed files and their web locations, the latter ones + // are needed to fix relative paths in the stylesheets + $media_files = []; + foreach ($mediatypes as $mediatype) { + $files = []; + + // load core styles + $files[DOKU_INC . 'lib/styles/' . $mediatype . '.css'] = DOKU_BASE . 'lib/styles/'; + + // load jQuery-UI theme + if ($mediatype == 'screen') { + $files[DOKU_INC . 'lib/scripts/jquery/jquery-ui-theme/smoothness.css'] = + DOKU_BASE . 'lib/scripts/jquery/jquery-ui-theme/'; + } + // load plugin styles + $files = array_merge($files, css_pluginstyles($mediatype)); + // load template styles + if (isset($styleini['stylesheets'][$mediatype])) { + $files = array_merge($files, $styleini['stylesheets'][$mediatype]); + } + // load user styles + if (isset($config_cascade['userstyle'][$mediatype]) && is_array($config_cascade['userstyle'][$mediatype])) { + foreach ($config_cascade['userstyle'][$mediatype] as $userstyle) { + $files[$userstyle] = DOKU_BASE; + } + } + + // Let plugins decide to either put more styles here or to remove some + $media_files[$mediatype] = css_filewrapper($mediatype, $files); + $CSSEvt = new Event('CSS_STYLES_INCLUDED', $media_files[$mediatype]); + + // Make it preventable. + if ($CSSEvt->advise_before()) { + $cache_files = array_merge($cache_files, array_keys($media_files[$mediatype]['files'])); + } else { + // unset if prevented. Nothing will be printed for this mediatype. + unset($media_files[$mediatype]); + } + + // finish event. + $CSSEvt->advise_after(); + } + + // The generated script depends on some dynamic options + $cache = new Cache( + 'styles' . + $_SERVER['HTTP_HOST'] . + $_SERVER['SERVER_PORT'] . + $INPUT->bool('preview') . + DOKU_BASE . + $tpl . + $type, + '.css' + ); + $cache->setEvent('CSS_CACHE_USE'); + + // check cache age & handle conditional request + // This may exit if a cache can be used + $cache_ok = $cache->useCache(['files' => $cache_files]); + http_cached($cache->cache, $cache_ok); + + // start output buffering + ob_start(); + + // Fire CSS_STYLES_INCLUDED for one last time to let the + // plugins decide whether to include the DW default styles. + // This can be done by preventing the Default. + $media_files['DW_DEFAULT'] = css_filewrapper('DW_DEFAULT'); + Event::createAndTrigger('CSS_STYLES_INCLUDED', $media_files['DW_DEFAULT'], 'css_defaultstyles'); + + // build the stylesheet + foreach ($mediatypes as $mediatype) { + // Check if there is a wrapper set for this type. + if (!isset($media_files[$mediatype])) { + continue; + } + + $cssData = $media_files[$mediatype]; + + // Print the styles. + echo NL; + if ($cssData['encapsulate'] === true) { + echo $cssData['encapsulationPrefix'] . ' {'; + } + echo '/* START ' . $cssData['mediatype'] . ' styles */' . NL; + + // load files + foreach ($cssData['files'] as $file => $location) { + $display = str_replace(fullpath(DOKU_INC), '', fullpath($file)); + echo "\n/* XXXXXXXXX $display XXXXXXXXX */\n"; + echo css_loadfile($file, $location); + } + + echo NL; + if ($cssData['encapsulate'] === true) { + echo '} /* /@media '; + } else { + echo '/*'; + } + echo ' END ' . $cssData['mediatype'] . ' styles */' . NL; + } + + // end output buffering and get contents + $css = ob_get_contents(); + ob_end_clean(); + + // strip any source maps + stripsourcemaps($css); + + // apply style replacements + $css = css_applystyle($css, $styleini['replacements']); + + // parse less + $css = css_parseless($css); + + // compress whitespace and comments + if ($conf['compress']) { + $css = css_compress($css); + } + + // embed small images right into the stylesheet + if ($conf['cssdatauri']) { + $base = preg_quote(DOKU_BASE, '#'); + $css = preg_replace_callback('#(url\([ \'"]*)(' . $base . ')(.*?(?:\.(png|gif)))#i', 'css_datauri', $css); + } + + http_cached_finish($cache->cache, $css); +} + +/** + * Uses phpless to parse LESS in our CSS + * + * most of this function is error handling to show a nice useful error when + * LESS compilation fails + * + * @param string $css + * @return string + */ +function css_parseless($css) +{ + global $conf; + + $less = new Lessc(); + $less->setImportDir([DOKU_INC]); + $less->setPreserveComments(!$conf['compress']); + + if (defined('DOKU_UNITTEST')) { + $less->addImportDir(TMP_DIR); + } + + try { + return $less->compile($css); + } catch (Exception $e) { + // get exception message + $msg = str_replace(["\n", "\r", "'"], [], $e->getMessage()); + + // try to use line number to find affected file + if (preg_match('/line: (\d+)$/', $msg, $m)) { + $msg = substr($msg, 0, -1 * strlen($m[0])); //remove useless linenumber + $lno = $m[1]; + + // walk upwards to last include + $lines = explode("\n", $css); + for ($i = $lno - 1; $i >= 0; $i--) { + if (preg_match('/\/(\* XXXXXXXXX )(.*?)( XXXXXXXXX \*)\//', $lines[$i], $m)) { + // we found it, add info to message + $msg .= ' in ' . $m[2] . ' at line ' . ($lno - $i); + break; + } + } + } + + // something went wrong + $error = 'A fatal error occured during compilation of the CSS files. ' . + 'If you recently installed a new plugin or template it ' . + 'might be broken and you should try disabling it again. [' . $msg . ']'; + + echo ".dokuwiki:before { + content: '$error'; + background-color: red; + display: block; + background-color: #fcc; + border-color: #ebb; + color: #000; + padding: 0.5em; + }"; + + exit; + } +} + +/** + * Does placeholder replacements in the style according to + * the ones defined in a templates style.ini file + * + * This also adds the ini defined placeholders as less variables + * (sans the surrounding __ and with a ini_ prefix) + * + * @param string $css + * @param array $replacements array(placeholder => value) + * @return string + * + * @author Andreas Gohr + */ +function css_applystyle($css, $replacements) +{ + // we convert ini replacements to LESS variable names + // and build a list of variable: value; pairs + $less = ''; + foreach ((array)$replacements as $key => $value) { + $lkey = trim($key, '_'); + $lkey = '@ini_' . $lkey; + $less .= "$lkey: $value;\n"; + + $replacements[$key] = $lkey; + } + + // we now replace all old ini replacements with LESS variables + $css = strtr($css, $replacements); + + // now prepend the list of LESS variables as the very first thing + $css = $less . $css; + return $css; +} + +/** + * Wrapper for the files, content and mediatype for the event CSS_STYLES_INCLUDED + * + * @param string $mediatype type ofthe current media files/content set + * @param array $files set of files that define the current mediatype + * @return array + * + * @author Gerry Weißbach + */ +function css_filewrapper($mediatype, $files = []) +{ + return [ + 'files' => $files, + 'mediatype' => $mediatype, + 'encapsulate' => $mediatype != 'all', + 'encapsulationPrefix' => '@media ' . $mediatype + ]; +} + +/** + * Prints the @media encapsulated default styles of DokuWiki + * + * This function is being called by a CSS_STYLES_INCLUDED event + * The event can be distinguished by the mediatype which is: + * DW_DEFAULT + * + * @author Gerry Weißbach + */ +function css_defaultstyles() +{ + // print the default classes for interwiki links and file downloads + echo '@media screen {'; + css_interwiki(); + css_filetypes(); + echo '}'; +} + +/** + * Prints classes for interwikilinks + * + * Interwiki links have two classes: 'interwiki' and 'iw_$name>' where + * $name is the identifier given in the config. All Interwiki links get + * an default style with a default icon. If a special icon is available + * for an interwiki URL it is set in it's own class. Both classes can be + * overwritten in the template or userstyles. + * + * @author Andreas Gohr + */ +function css_interwiki() +{ + + // default style + echo 'a.interwiki {'; + echo ' background: transparent url(' . DOKU_BASE . 'lib/images/interwiki.svg) 0 0 no-repeat;'; + echo ' background-size: 1.2em;'; + echo ' padding: 0 0 0 1.4em;'; + echo '}'; + + // additional styles when icon available + $iwlinks = getInterwiki(); + foreach (array_keys($iwlinks) as $iw) { + $class = preg_replace('/[^_\-a-z0-9]+/i', '_', $iw); + foreach (['svg', 'png', 'gif'] as $ext) { + $file = 'lib/images/interwiki/' . $iw . '.' . $ext; + + if (file_exists(DOKU_INC . $file)) { + echo "a.iw_$class {"; + echo ' background-image: url(' . DOKU_BASE . $file . ')'; + echo '}'; + break; + } + } + } +} + +/** + * Prints classes for file download links + * + * @author Andreas Gohr + */ +function css_filetypes() +{ + + // default style + echo '.mediafile {'; + echo ' background: transparent url(' . DOKU_BASE . 'lib/images/fileicons/svg/file.svg) 0px 1px no-repeat;'; + echo ' background-size: 1.2em;'; + echo ' padding-left: 1.5em;'; + echo '}'; + + // additional styles when icon available + // scan directory for all icons + $exts = []; + if ($dh = opendir(DOKU_INC . 'lib/images/fileicons/svg')) { + while (false !== ($file = readdir($dh))) { + if (preg_match('/(.*?)\.svg$/i', $file, $match)) { + $exts[] = strtolower($match[1]); + } + } + closedir($dh); + } + foreach ($exts as $ext) { + $class = preg_replace('/[^_\-a-z0-9]+/', '_', $ext); + echo ".mf_$class {"; + echo ' background-image: url(' . DOKU_BASE . 'lib/images/fileicons/svg/' . $ext . '.svg)'; + echo '}'; + } +} + +/** + * Loads a given file and fixes relative URLs with the + * given location prefix + * + * @param string $file file system path + * @param string $location + * @return string + */ +function css_loadfile($file, $location = '') +{ + $css_file = new DokuCssFile($file); + return $css_file->load($location); +} + +/** + * Helper class to abstract loading of css/less files + * + * @author Chris Smith + */ +class DokuCssFile +{ + protected $filepath; // file system path to the CSS/Less file + protected $location; // base url location of the CSS/Less file + protected $relative_path; + + public function __construct($file) + { + $this->filepath = $file; + } + + /** + * Load the contents of the css/less file and adjust any relative paths/urls (relative to this file) to be + * relative to the dokuwiki root: the web root (DOKU_BASE) for most files; the file system root (DOKU_INC) + * for less files. + * + * @param string $location base url for this file + * @return string the CSS/Less contents of the file + */ + public function load($location = '') + { + if (!file_exists($this->filepath)) return ''; + + $css = io_readFile($this->filepath); + if (!$location) return $css; + + $this->location = $location; + + $css = preg_replace_callback('#(url\( *)([\'"]?)(.*?)(\2)( *\))#', [$this, 'replacements'], $css); + $css = preg_replace_callback('#(@import\s+)([\'"])(.*?)(\2)#', [$this, 'replacements'], $css); + + return $css; + } + + /** + * Get the relative file system path of this file, relative to dokuwiki's root folder, DOKU_INC + * + * @return string relative file system path + */ + protected function getRelativePath() + { + + if (is_null($this->relative_path)) { + $basedir = [DOKU_INC]; + + // during testing, files may be found relative to a second base dir, TMP_DIR + if (defined('DOKU_UNITTEST')) { + $basedir[] = realpath(TMP_DIR); + } + + $basedir = array_map('preg_quote_cb', $basedir); + $regex = '/^(' . implode('|', $basedir) . ')/'; + $this->relative_path = preg_replace($regex, '', dirname($this->filepath)); + } + + return $this->relative_path; + } + + /** + * preg_replace callback to adjust relative urls from relative to this file to relative + * to the appropriate dokuwiki root location as described in the code + * + * @param array $match see http://php.net/preg_replace_callback + * @return string see http://php.net/preg_replace_callback + */ + public function replacements($match) + { + + if (preg_match('#^(/|data:|https?://)#', $match[3])) { // not a relative url? - no adjustment required + return $match[0]; + } elseif (str_ends_with($match[3], '.less')) { // a less file import? - requires a file system location + if ($match[3][0] != '/') { + $match[3] = $this->getRelativePath() . '/' . $match[3]; + } + } else { // everything else requires a url adjustment + $match[3] = $this->location . $match[3]; + } + + return implode('', array_slice($match, 1)); + } +} + +/** + * Convert local image URLs to data URLs if the filesize is small + * + * Callback for preg_replace_callback + * + * @param array $match + * @return string + */ +function css_datauri($match) +{ + global $conf; + + $pre = unslash($match[1]); + $base = unslash($match[2]); + $url = unslash($match[3]); + $ext = unslash($match[4]); + + $local = DOKU_INC . $url; + $size = @filesize($local); + if ($size && $size < $conf['cssdatauri']) { + $data = base64_encode(file_get_contents($local)); + } + if (!empty($data)) { + $url = 'data:image/' . $ext . ';base64,' . $data; + } else { + $url = $base . $url; + } + return $pre . $url; +} + + +/** + * Returns a list of possible Plugin Styles (no existance check here) + * + * @param string $mediatype + * @return array + * @author Andreas Gohr + * + */ +function css_pluginstyles($mediatype = 'screen') +{ + $list = []; + $plugins = plugin_list(); + foreach ($plugins as $p) { + $list[DOKU_PLUGIN . "$p/$mediatype.css"] = DOKU_BASE . "lib/plugins/$p/"; + $list[DOKU_PLUGIN . "$p/$mediatype.less"] = DOKU_BASE . "lib/plugins/$p/"; + // alternative for screen.css + if ($mediatype == 'screen') { + $list[DOKU_PLUGIN . "$p/style.css"] = DOKU_BASE . "lib/plugins/$p/"; + $list[DOKU_PLUGIN . "$p/style.less"] = DOKU_BASE . "lib/plugins/$p/"; + } + } + return $list; +} + +/** + * Very simple CSS optimizer + * + * @param string $css + * @return string + * @author Andreas Gohr + * + */ +function css_compress($css) +{ + // replace quoted strings with placeholder + $quote_storage = []; + + $quote_cb = function ($match) use (&$quote_storage) { + $quote_storage[] = $match[0]; + return '"STR' . (count($quote_storage) - 1) . '"'; + }; + + $css = preg_replace_callback('/(([\'"]).*?(? 1em) + $css = preg_replace( + '/(? + * + */ +function css_comment_cb($matches) +{ + if (strlen($matches[2]) > 4) return ''; + return $matches[0]; +} + +/** + * Callback for css_compress() + * + * Strips one line comments but makes sure it will not destroy url() constructs with slashes + * + * @param array $matches + * @return string + */ +function css_onelinecomment_cb($matches) +{ + $line = $matches[0]; + + $i = 0; + $len = strlen($line); + + while ($i < $len) { + $nextcom = strpos($line, '//', $i); + $nexturl = stripos($line, 'url(', $i); + + if ($nextcom === false) { + // no more comments, we're done + $i = $len; + break; + } + + if ($nexturl === false || $nextcom < $nexturl) { + // no url anymore, strip comment and be done + $i = $nextcom; + break; + } + + // we have an upcoming url + $i = strpos($line, ')', $nexturl); + } + + return substr($line, 0, $i); +} + +//Setup VIM: ex: et ts=4 : diff --git a/lib/exe/detail.php b/lib/exe/detail.php new file mode 100644 index 0000000..96dcf93 --- /dev/null +++ b/lib/exe/detail.php @@ -0,0 +1,46 @@ +str('id')); +$REV = $INPUT->int('rev'); + +// this makes some general info available as well as the info about the +// "parent" page +$INFO = array_merge(pageinfo(), mediainfo()); + +$tmp = []; +Event::createAndTrigger('DETAIL_STARTED', $tmp); + +//close session +session_write_close(); + +$ERROR = false; +// check image permissions +$AUTH = auth_quickaclcheck($IMG); +if ($AUTH >= AUTH_READ) { + // check if image exists + $SRC = mediaFN($IMG, $REV); + if (!file_exists($SRC)) { + //doesn't exist! + http_status(404); + $ERROR = 'File not found'; + } +} else { + // no auth + $ERROR = p_locale_xhtml('denied'); +} + +//start output and load template +header('Content-Type: text/html; charset=utf-8'); +include(template('detail.php')); +tpl_img_close(); diff --git a/lib/exe/fetch.php b/lib/exe/fetch.php new file mode 100644 index 0000000..cd44b3b --- /dev/null +++ b/lib/exe/fetch.php @@ -0,0 +1,127 @@ + + */ + +use dokuwiki\Input\Input; +use dokuwiki\Extension\Event; + +if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/../../'); +if (!defined('DOKU_DISABLE_GZIP_OUTPUT')) define('DOKU_DISABLE_GZIP_OUTPUT', 1); +require_once(DOKU_INC . 'inc/init.php'); +session_write_close(); //close session + +require_once(DOKU_INC . 'inc/fetch.functions.php'); + +if (defined('SIMPLE_TEST')) { + $INPUT = new Input(); +} + +// BEGIN main +$mimetypes = getMimeTypes(); + +//get input +$MEDIA = stripctl(getID('media', false)); // no cleaning except control chars - maybe external +$CACHE = calc_cache($INPUT->str('cache')); +$WIDTH = $INPUT->int('w'); +$HEIGHT = $INPUT->int('h'); +$REV = &$INPUT->ref('rev'); +//sanitize revision +$REV = preg_replace('/[^0-9]/', '', $REV); + +[$EXT, $MIME, $DL] = mimetype($MEDIA, false); +if ($EXT === false) { + $EXT = 'unknown'; + $MIME = 'application/octet-stream'; + $DL = true; +} + +// check for permissions, preconditions and cache external files +[$STATUS, $STATUSMESSAGE] = checkFileStatus($MEDIA, $FILE, $REV, $WIDTH, $HEIGHT); + +// prepare data for plugin events +$data = [ + 'media' => $MEDIA, + 'file' => $FILE, + 'orig' => $FILE, + 'mime' => $MIME, + 'download' => $DL, + 'cache' => $CACHE, + 'ext' => $EXT, + 'width' => $WIDTH, + 'height' => $HEIGHT, + 'status' => $STATUS, + 'statusmessage' => $STATUSMESSAGE, + 'ispublic' => media_ispublic($MEDIA), + 'csp' => [ + 'default-src' => "'none'", + 'style-src' => "'unsafe-inline'", + 'media-src' => "'self'", + 'object-src' => "'self'", + 'font-src' => "'self' data:", + 'form-action' => "'none'", + 'frame-ancestors' => "'self'", + ] +]; + +// handle the file status +$evt = new Event('FETCH_MEDIA_STATUS', $data); +if ($evt->advise_before()) { + // redirects + if ($data['status'] > 300 && $data['status'] <= 304) { + if (defined('SIMPLE_TEST')) return; //TestResponse doesn't recognize redirects + send_redirect($data['statusmessage']); + } + // send any non 200 status + if ($data['status'] != 200) { + http_status($data['status'], $data['statusmessage']); + } + // die on errors + if ($data['status'] > 203) { + echo $data['statusmessage']; + if (defined('SIMPLE_TEST')) return; + exit; + } +} +$evt->advise_after(); +unset($evt); + +//handle image resizing/cropping +$evt = new Event('MEDIA_RESIZE', $data); +if ($evt->advise_before()) { + if ( + $MIME != 'image/svg+xml' && + str_starts_with($MIME, 'image') && + ($WIDTH || $HEIGHT) + ) { + if ($HEIGHT && $WIDTH) { + $data['file'] = $FILE = media_crop_image($data['file'], $EXT, $WIDTH, $HEIGHT); + } else { + $data['file'] = $FILE = media_resize_image($data['file'], $EXT, $WIDTH, $HEIGHT); + } + } +} +$evt->advise_after(); +unset($evt); + +// finally send the file to the client +$evt = new Event('MEDIA_SENDFILE', $data); +if ($evt->advise_before()) { + sendFile( + $data['file'], + $data['mime'], + $data['download'], + $data['cache'], + $data['ispublic'], + $data['orig'], + $data['csp'] + ); +} +// Do something after the download finished. +$evt->advise_after(); // will not be emitted on 304 or x-sendfile + +// END DO main diff --git a/lib/exe/index.html b/lib/exe/index.html new file mode 100644 index 0000000..977f90e --- /dev/null +++ b/lib/exe/index.html @@ -0,0 +1,11 @@ + + + + + +nothing here... + + + + + diff --git a/lib/exe/indexer.php b/lib/exe/indexer.php new file mode 100644 index 0000000..944c31d --- /dev/null +++ b/lib/exe/indexer.php @@ -0,0 +1,7 @@ +useCache(['files' => $cache_files]); + http_cached($cache->cache, $cache_ok); + + $js = ''; + foreach ($files as $file) { + $js .= file_get_contents($file) . "\n"; + } + stripsourcemaps($js); + + http_cached_finish($cache->cache, $js); +} diff --git a/lib/exe/js.php b/lib/exe/js.php new file mode 100644 index 0000000..2220c90 --- /dev/null +++ b/lib/exe/js.php @@ -0,0 +1,340 @@ + + */ + +use dokuwiki\Utf8\PhpString; +use dokuwiki\Cache\Cache; +use dokuwiki\Extension\Event; +use splitbrain\JSStrip\Exception as JSStripException; +use splitbrain\JSStrip\JSStrip; + +if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/../../'); +if (!defined('NOSESSION')) define('NOSESSION', true); // we do not use a session or authentication here (better caching) +if (!defined('NL')) define('NL', "\n"); +if (!defined('DOKU_DISABLE_GZIP_OUTPUT')) define('DOKU_DISABLE_GZIP_OUTPUT', 1); // we gzip ourself here +require_once(DOKU_INC . 'inc/init.php'); + +// Main (don't run when UNIT test) +if (!defined('SIMPLE_TEST')) { + header('Content-Type: application/javascript; charset=utf-8'); + js_out(); +} + + +// ---------------------- functions ------------------------------ + +/** + * Output all needed JavaScript + * + * @author Andreas Gohr + */ +function js_out() +{ + global $conf; + global $lang; + global $config_cascade; + global $INPUT; + + // decide from where to get the template + $tpl = trim(preg_replace('/[^\w-]+/', '', $INPUT->str('t'))); + if (!$tpl) $tpl = $conf['template']; + + // array of core files + $files = [ + DOKU_INC . 'lib/scripts/jquery/jquery.cookie.js', + DOKU_INC . 'inc/lang/' . $conf['lang'] . '/jquery.ui.datepicker.js', + DOKU_INC . "lib/scripts/fileuploader.js", + DOKU_INC . "lib/scripts/fileuploaderextended.js", + DOKU_INC . 'lib/scripts/helpers.js', + DOKU_INC . 'lib/scripts/delay.js', + DOKU_INC . 'lib/scripts/cookie.js', + DOKU_INC . 'lib/scripts/script.js', + DOKU_INC . 'lib/scripts/qsearch.js', + DOKU_INC . 'lib/scripts/search.js', + DOKU_INC . 'lib/scripts/tree.js', + DOKU_INC . 'lib/scripts/index.js', + DOKU_INC . 'lib/scripts/textselection.js', + DOKU_INC . 'lib/scripts/toolbar.js', + DOKU_INC . 'lib/scripts/edit.js', + DOKU_INC . 'lib/scripts/editor.js', + DOKU_INC . 'lib/scripts/locktimer.js', + DOKU_INC . 'lib/scripts/linkwiz.js', + DOKU_INC . 'lib/scripts/media.js', + DOKU_INC . 'lib/scripts/compatibility.js', + # disabled for FS#1958 DOKU_INC.'lib/scripts/hotkeys.js', + DOKU_INC . 'lib/scripts/behaviour.js', + DOKU_INC . 'lib/scripts/page.js', + tpl_incdir($tpl) . 'script.js', + ]; + + // add possible plugin scripts and userscript + $files = array_merge($files, js_pluginscripts()); + if (is_array($config_cascade['userscript']['default'])) { + foreach ($config_cascade['userscript']['default'] as $userscript) { + $files[] = $userscript; + } + } + + // Let plugins decide to either put more scripts here or to remove some + Event::createAndTrigger('JS_SCRIPT_LIST', $files); + + // The generated script depends on some dynamic options + $cache = new Cache('scripts' . $_SERVER['HTTP_HOST'] . $_SERVER['SERVER_PORT'] . md5(serialize($files)), '.js'); + $cache->setEvent('JS_CACHE_USE'); + + $cache_files = array_merge($files, getConfigFiles('main')); + $cache_files[] = __FILE__; + + // check cache age & handle conditional request + // This may exit if a cache can be used + $cache_ok = $cache->useCache(['files' => $cache_files]); + http_cached($cache->cache, $cache_ok); + + // start output buffering and build the script + ob_start(); + + // add some global variables + echo "var DOKU_BASE = '" . DOKU_BASE . "';"; + echo "var DOKU_TPL = '" . tpl_basedir($tpl) . "';"; + echo "var DOKU_COOKIE_PARAM = " . json_encode([ + 'path' => empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'], + 'secure' => $conf['securecookie'] && is_ssl() + ], JSON_THROW_ON_ERROR) . ";"; + // FIXME: Move those to JSINFO + echo "Object.defineProperty(window, 'DOKU_UHN', { get: function() {" . + "console.warn('Using DOKU_UHN is deprecated. Please use JSINFO.useHeadingNavigation instead');" . + "return JSINFO.useHeadingNavigation; } });"; + echo "Object.defineProperty(window, 'DOKU_UHC', { get: function() {" . + "console.warn('Using DOKU_UHC is deprecated. Please use JSINFO.useHeadingContent instead');" . + "return JSINFO.useHeadingContent; } });"; + + // load JS specific translations + $lang['js']['plugins'] = js_pluginstrings(); + $templatestrings = js_templatestrings($tpl); + if (!empty($templatestrings)) { + $lang['js']['template'] = $templatestrings; + } + echo 'LANG = ' . json_encode($lang['js'], JSON_THROW_ON_ERROR) . ";\n"; + + // load toolbar + toolbar_JSdefines('toolbar'); + + // load files + foreach ($files as $file) { + if (!file_exists($file)) continue; + $ismin = str_ends_with($file, '.min.js'); + $debugjs = ($conf['allowdebug'] && strpos($file, DOKU_INC . 'lib/scripts/') !== 0); + + echo "\n\n/* XXXXXXXXXX begin of " . str_replace(DOKU_INC, '', $file) . " XXXXXXXXXX */\n\n"; + if ($ismin) echo "\n/* BEGIN NOCOMPRESS */\n"; + if ($debugjs) echo "\ntry {\n"; + js_load($file); + if ($debugjs) echo "\n} catch (e) {\n logError(e, '" . str_replace(DOKU_INC, '', $file) . "');\n}\n"; + if ($ismin) echo "\n/* END NOCOMPRESS */\n"; + echo "\n\n/* XXXXXXXXXX end of " . str_replace(DOKU_INC, '', $file) . " XXXXXXXXXX */\n\n"; + } + + // init stuff + if ($conf['locktime'] != 0) { + js_runonstart("dw_locktimer.init(" . ($conf['locktime'] - 60) . "," . $conf['usedraft'] . ")"); + } + // init hotkeys - must have been done after init of toolbar + # disabled for FS#1958 js_runonstart('initializeHotkeys()'); + + // end output buffering and get contents + $js = ob_get_contents(); + ob_end_clean(); + + // strip any source maps + stripsourcemaps($js); + + // compress whitespace and comments + if ($conf['compress']) { + try { + $js = (new JSStrip())->compress($js); + } catch (JSStripException $e) { + $js .= "\nconsole.error(" . json_encode($e->getMessage(), JSON_THROW_ON_ERROR) . ");\n"; + } + } + + $js .= "\n"; // https://bugzilla.mozilla.org/show_bug.cgi?id=316033 + + http_cached_finish($cache->cache, $js); +} + +/** + * Load the given file, handle include calls and print it + * + * @param string $file filename path to file + * + * @author Andreas Gohr + */ +function js_load($file) +{ + if (!file_exists($file)) return; + static $loaded = []; + + $data = io_readFile($file); + while (preg_match('#/\*\s*DOKUWIKI:include(_once)?\s+([\w\.\-_/]+)\s*\*/#', $data, $match)) { + $ifile = $match[2]; + + // is it a include_once? + if ($match[1]) { + $base = PhpString::basename($ifile); + if (array_key_exists($base, $loaded) && $loaded[$base] === true) { + $data = str_replace($match[0], '', $data); + continue; + } + $loaded[$base] = true; + } + + if ($ifile[0] != '/') $ifile = dirname($file) . '/' . $ifile; + + $idata = ''; + if (file_exists($ifile)) { + $ismin = str_ends_with($ifile, '.min.js'); + if ($ismin) $idata .= "\n/* BEGIN NOCOMPRESS */\n"; + $idata .= io_readFile($ifile); + if ($ismin) $idata .= "\n/* END NOCOMPRESS */\n"; + } + $data = str_replace($match[0], $idata, $data); + } + echo "$data\n"; +} + +/** + * Returns a list of possible Plugin Scripts (no existance check here) + * + * @return array + * + * @author Andreas Gohr + */ +function js_pluginscripts() +{ + $list = []; + $plugins = plugin_list(); + foreach ($plugins as $p) { + $list[] = DOKU_PLUGIN . "$p/script.js"; + } + return $list; +} + +/** + * Return an two-dimensional array with strings from the language file of each plugin. + * + * - $lang['js'] must be an array. + * - Nothing is returned for plugins without an entry for $lang['js'] + * + * @return array + * @author Gabriel Birke + * + */ +function js_pluginstrings() +{ + global $conf, $config_cascade; + $pluginstrings = []; + $plugins = plugin_list(); + foreach ($plugins as $p) { + $path = DOKU_PLUGIN . $p . '/lang/'; + + if (isset($lang)) unset($lang); + if (file_exists($path . "en/lang.php")) { + include $path . "en/lang.php"; + } + foreach ($config_cascade['lang']['plugin'] as $config_file) { + if (file_exists($config_file . $p . '/en/lang.php')) { + include($config_file . $p . '/en/lang.php'); + } + } + if (isset($conf['lang']) && $conf['lang'] != 'en') { + if (file_exists($path . $conf['lang'] . "/lang.php")) { + include($path . $conf['lang'] . '/lang.php'); + } + foreach ($config_cascade['lang']['plugin'] as $config_file) { + if (file_exists($config_file . $p . '/' . $conf['lang'] . '/lang.php')) { + include($config_file . $p . '/' . $conf['lang'] . '/lang.php'); + } + } + } + + if (isset($lang['js'])) { + $pluginstrings[$p] = $lang['js']; + } + } + return $pluginstrings; +} + +/** + * Return an two-dimensional array with strings from the language file of current active template. + * + * - $lang['js'] must be an array. + * - Nothing is returned for template without an entry for $lang['js'] + * + * @param string $tpl + * @return array + */ +function js_templatestrings($tpl) +{ + global $conf, $config_cascade; + + $path = tpl_incdir() . 'lang/'; + + $templatestrings = []; + if (file_exists($path . "en/lang.php")) { + 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 (isset($conf['lang']) && $conf['lang'] != 'en' && file_exists($path . $conf['lang'] . "/lang.php")) { + include $path . $conf['lang'] . "/lang.php"; + } + if (isset($conf['lang']) && $conf['lang'] != 'en') { + if (file_exists($path . $conf['lang'] . "/lang.php")) { + 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'); + } + } + } + + if (isset($lang['js'])) { + $templatestrings[$tpl] = $lang['js']; + } + return $templatestrings; +} + +/** + * Escapes a String to be embedded in a JavaScript call, keeps \n + * as newline + * + * @param string $string + * @return string + * + * @author Andreas Gohr + */ +function js_escape($string) +{ + return str_replace('\\\\n', '\\n', addslashes($string)); +} + +/** + * Adds the given JavaScript code to the window.onload() event + * + * @param string $func + * + * @author Andreas Gohr + */ +function js_runonstart($func) +{ + echo "jQuery(function(){ $func; });" . NL; +} diff --git a/lib/exe/jsonrpc.php b/lib/exe/jsonrpc.php new file mode 100644 index 0000000..cf83ed7 --- /dev/null +++ b/lib/exe/jsonrpc.php @@ -0,0 +1,19 @@ +serve(); +} catch (\Exception $e) { + $result = $server->returnError($e); +} + +echo json_encode($result, JSON_THROW_ON_ERROR); diff --git a/lib/exe/manifest.php b/lib/exe/manifest.php new file mode 100644 index 0000000..b3ccfb7 --- /dev/null +++ b/lib/exe/manifest.php @@ -0,0 +1,17 @@ +sendManifest(); diff --git a/lib/exe/mediamanager.php b/lib/exe/mediamanager.php new file mode 100644 index 0000000..54c6b81 --- /dev/null +++ b/lib/exe/mediamanager.php @@ -0,0 +1,131 @@ +str('msg1')) msg(hsc($INPUT->str('msg1')), 1); +if ($INPUT->str('err')) msg(hsc($INPUT->str('err')), -1); + +global $DEL; +// get namespace to display (either direct or from deletion order) +if ($INPUT->str('delete')) { + $DEL = cleanID($INPUT->str('delete')); + $IMG = $DEL; + $NS = getNS($DEL); +} elseif ($INPUT->str('edit')) { + $IMG = cleanID($INPUT->str('edit')); + $NS = getNS($IMG); +} elseif ($INPUT->str('img')) { + $IMG = cleanID($INPUT->str('img')); + $NS = getNS($IMG); +} else { + $NS = cleanID($INPUT->str('ns')); + $IMG = null; +} + +global $INFO, $JSINFO; +$INFO = empty($INFO) ? mediainfo() : array_merge($INFO, mediainfo()); +$JSINFO['id'] = ''; +$JSINFO['namespace'] = ''; +$AUTH = $INFO['perm']; // shortcut for historical reasons + +// If this page is directly opened it means we are in popup mode not fullscreen +// $fullscreen isn't defined by default it might lead to some PHP warnings +$fullscreen ??= false; + +$tmp = []; +Event::createAndTrigger('MEDIAMANAGER_STARTED', $tmp); +session_write_close(); //close session + +// do not display the manager if user does not have read access +if ($AUTH < AUTH_READ && !$fullscreen) { + http_status(403); + die($lang['accessdenied']); +} + +// handle flash upload +if (isset($_FILES['Filedata'])) { + $_FILES['upload'] =& $_FILES['Filedata']; + $JUMPTO = media_upload($NS, $AUTH); + if ($JUMPTO == false) { + http_status(400); + echo 'Upload failed'; + } + echo 'ok'; + exit; +} + +// give info on PHP caught upload errors +if (!empty($_FILES['upload']['error'])) { + switch ($_FILES['upload']['error']) { + case 1: + case 2: + msg(sprintf( + $lang['uploadsize'], + filesize_h(php_to_byte(ini_get('upload_max_filesize'))) + ), -1); + break; + default: + msg($lang['uploadfail'] . ' (' . $_FILES['upload']['error'] . ')', -1); + } + unset($_FILES['upload']); +} + +// handle upload +if (!empty($_FILES['upload']['tmp_name'])) { + $JUMPTO = media_upload($NS, $AUTH); + if ($JUMPTO) $NS = getNS($JUMPTO); +} + +// handle meta saving +if ($IMG && @array_key_exists('save', $INPUT->arr('do'))) { + $JUMPTO = media_metasave($IMG, $AUTH, $INPUT->arr('meta')); +} + +if ($IMG && ($INPUT->str('mediado') == 'save' || @array_key_exists('save', $INPUT->arr('mediado')))) { + $JUMPTO = media_metasave($IMG, $AUTH, $INPUT->arr('meta')); +} + +if ($INPUT->int('rev') && $conf['mediarevisions']) $REV = $INPUT->int('rev'); + +if ($INPUT->str('mediado') == 'restore' && $conf['mediarevisions']) { + $JUMPTO = media_restore($INPUT->str('image'), $REV, $AUTH); +} + +// handle deletion +if ($DEL) { + $res = 0; + if (checkSecurityToken()) { + $res = media_delete($DEL, $AUTH); + } + if ($res & DOKU_MEDIA_DELETED) { + $msg = sprintf($lang['deletesucc'], noNS($DEL)); + if ($res & DOKU_MEDIA_EMPTY_NS && !$fullscreen) { + // current namespace was removed. redirecting to root ns passing msg along + send_redirect(DOKU_URL . 'lib/exe/mediamanager.php?msg1=' . + rawurlencode($msg) . '&edid=' . $INPUT->str('edid')); + } + msg($msg, 1); + } elseif ($res & DOKU_MEDIA_INUSE) { + msg(sprintf($lang['mediainuse'], noNS($DEL)), 0); + } else { + msg(sprintf($lang['deletefail'], noNS($DEL)), -1); + } +} +// finished - start output + +if (!$fullscreen) { + header('Content-Type: text/html; charset=utf-8'); + include(template('mediamanager.php')); +} diff --git a/lib/exe/openapi.php b/lib/exe/openapi.php new file mode 100644 index 0000000..e20b69e --- /dev/null +++ b/lib/exe/openapi.php @@ -0,0 +1,87 @@ +has('spec')) { + header('Content-Type: application/json'); + $apigen = new OpenAPIGenerator(); + echo $apigen->generate(); + exit(); +} +?> + + + + + DokuWiki API Explorer + + + + + +
    +

    + This is an auto generated description and OpenAPI specification for the + DokuWiki JSON-RPC API. + It is generated from the source code and the inline documentation. +

    + +

    + Download + the API Spec +

    + +

    Error Codes

    + +

    + The following error codes are currently used in the core methods. This list may be incomplete + or change in the future. +

    + + + + + getErrorCodes() as $code) { + // duplicate codes are only shown with debug + if ($code['code'] === $last && !$INPUT->has('debug')) continue; + $last = $code['code']; + echo ''; + } + ?> +
    CodeMessage
    0Success
    ' . $code['code'] . '' . hsc($code['message']) . '
    +
    + +
    +

    + server->has('REMOTE_USER')) { + echo 'You are currently logged in as ' . hsc($INPUT->server->str('REMOTE_USER')) . '.'; + echo '
    API calls in this tool will be automatically executed with your permissions.'; + } else { + echo 'You are currently not logged in.
    '; + echo 'You can provide credentials above.'; + } + ?> +

    +
    + + + + + diff --git a/lib/exe/opensearch.php b/lib/exe/opensearch.php new file mode 100644 index 0000000..766bdb2 --- /dev/null +++ b/lib/exe/opensearch.php @@ -0,0 +1,37 @@ + + * @author Andreas Gohr + */ + +if (!defined('DOKU_INC')) define('DOKU_INC', __DIR__ . '/../../'); +if (!defined('NOSESSION')) define('NOSESSION', true); // we do not use a session or authentication here (better caching) +if (!defined('NL')) define('NL', "\n"); +require_once(DOKU_INC . 'inc/init.php'); + +// try to be clever about the favicon location +if (file_exists(DOKU_INC . 'favicon.ico')) { + $ico = DOKU_URL . 'favicon.ico'; +} elseif (file_exists(tpl_incdir() . 'images/favicon.ico')) { + $ico = DOKU_URL . 'lib/tpl/' . $conf['template'] . '/images/favicon.ico'; +} elseif (file_exists(tpl_incdir() . 'favicon.ico')) { + $ico = DOKU_URL . 'lib/tpl/' . $conf['template'] . '/favicon.ico'; +} else { + $ico = DOKU_URL . 'lib/tpl/dokuwiki/images/favicon.ico'; +} + +// output +header('Content-Type: application/opensearchdescription+xml; charset=utf-8'); +echo '' . NL; +echo '' . NL; +echo ' ' . hsc($conf['title']) . '' . NL; +echo ' ' . $ico . '' . NL; +echo ' ' . NL; +echo ' ' . NL; +echo '' . NL; diff --git a/lib/exe/taskrunner.php b/lib/exe/taskrunner.php new file mode 100644 index 0000000..0a62bf6 --- /dev/null +++ b/lib/exe/taskrunner.php @@ -0,0 +1,20 @@ + + */ + +use dokuwiki\TaskRunner; + +if (!defined('DOKU_INC')) { + define('DOKU_INC', __DIR__ . '/../../'); +} +define('DOKU_DISABLE_GZIP_OUTPUT', 1); +require_once DOKU_INC . 'inc/init.php'; +session_write_close(); //close session + +$taskRunner = new TaskRunner(); +$taskRunner->run(); diff --git a/lib/exe/xmlrpc.php b/lib/exe/xmlrpc.php new file mode 100644 index 0000000..9fad901 --- /dev/null +++ b/lib/exe/xmlrpc.php @@ -0,0 +1,19 @@ +serve(); +} catch (\Exception $e) { + $server->error($e->getCode(), $e->getMessage()); +} diff --git a/lib/images/_deprecated.txt b/lib/images/_deprecated.txt new file mode 100644 index 0000000..a347f8b --- /dev/null +++ b/lib/images/_deprecated.txt @@ -0,0 +1,2 @@ + +(none) diff --git a/lib/images/admin/acl.png b/lib/images/admin/acl.png new file mode 100644 index 0000000000000000000000000000000000000000..542e10899183cb0b367cc27b61d1a2dd09d3e807 GIT binary patch literal 1065 zcmV+^1lIeBP)%d(QcN6ErF|!3n+L^Y81gFJC1h z{2y5W?^R9VhAB|4V0jwL6_o805~(a*kbE%}@`~TwA?q~$PZk0QLEtDFii12(rEw~83ELoYctXVm}w?~ zpn++r=$`L_AN_GG1bGm*VJK-{Lzw}T0oCB8!=7e7Z1#RV;H!EdVgW3!C_uDAL}6%+ zmGUti4L0TT9~jt>U*ixT0Qa0AAI3bMLZ=Wk16sN6r=L*1f~L&5KF+m*Xj7Qo9A22y;1x|z#j3AMZilL z)2r{lvTf0G(K)s&Bs&bU?m%#?<~eBW6BfA(3Q!1i94FRp)BbgmnI#dnd~aTSr^{@J;Wq&10fxaM;5f$Q z>hQq!mCyDpOc|QwFOXL?7W^SP>j&vRinF(i-}mo1`NPwq(p=bHFr#GST|+Q zP`4?G^GN@GB@)jSxsWBBYBGECjL^rR?i=+#&Y$GGy0Z4qMMj2?eO8f^rAQn}(DSoF z>lt;TPdjzMg;B$~6P>a^$R*xml07TL>2HOX>H?kJQLiI1IP?wB4=`#tXM&%b?n8Qk z0SRc@6^ibP488%n1xNtg5_~2iS6a4@akPU@#Vun;n|lEC{#!)>l!!1sEm-cQRFx<| jVc5QV3ZxCt++u$L?P<%72_Dbw00000NkvXXu0mjf57GP^ literal 0 HcmV?d00001 diff --git a/lib/images/admin/config.png b/lib/images/admin/config.png new file mode 100644 index 0000000000000000000000000000000000000000..679a673722b8df339289f70b200d05be11905be2 GIT binary patch literal 1484 zcmV;-1vC1IP)pyJb={HES-&w zI*xe!iQv%CP!8zl=f?sA*UXHKjXU7%ymTFvc^uf?-EHy$l1LmzP(7UAvN?wsWYUk{g+E;DZN~3DAe$UL7u6C>V8cSa3*fXYU#p zf3U8#Rg3m^?f6+kCX>a;<#M{{m4d{?eTQ;#^5NjH@D8E2kr$Aq<6t_Yn8MoH4m34& zqPe*XKVB>v)o5~tDk>V$(9nU}+6QQ9(IPoH4aUZkV&}}UVuueOOU}sn9%}XcTZHi- z3)lp4U`NNdKfQFR1od@~P*KrgYt{7SD~h+1LfsSC@X8AXCr>6XJLK`?$OISyLxct zaxqd;voUwB`d4o2q*sC^5)qTjjV;~WJ@QVaWRG6HavP#DqT1|g@Wf`u~fnorY4NX=gAdHWvH#){A|Z} zmRz=d%jshHy!qPR>@&C=9EkXp-nf3N0tO8|(c|dRlmQEi*FG6bk%(*1h*$yve+)cT zB4IO>CQM0hl`zKHo-w71ktCsTYuFQQ))`d$dxHXsjL0Zx`*k#xdJOAEaOza1-tzTX zI}Dd+=-9|e`WzfZ6S##c;p8nMF$<%BAGCfWz2)m<4CH2_;=Sd_ooa&P)6Ma1#7?wO zwzb+mJk>qprc(1w&eJ!oZQ|(@@nXk22)vn~8_1g&b4*|1dS{@h5Pjz}QSa-43zKDV zl25Ai`S7EL;*z@*!7em4cA~4R7dqWj?wgX4`NOESwe1&tJ`?i!6Tlk{-BKP4H?8j+ zy;qLDv#DtCaYw1S0xK1A!zlZTjil;zAz?R)iYrlHKbHIUj&3}7&_!eaCvtOtf|Jvt z!_>JE2aX^xjm^8oTQ_y1`969z$!PUUIpD|`v5ERgg<{I>;97TtZGa4=Bh&G)xC>DzL z6I4m&Zk^7L(!*x@`Ud`T7la6o9{T@16JaXiFP@v>*kFRO*i;f{HtBfS|BrVU&f06ft4bZfYW^Q5Wu57@~kN z;Rj04U;#}NB7q3h52gM3snLhx;b=Y&;6i45R@oR zUpt+=L`W)4+HvOQ84g`KgcFM>g~jqr^8!{ad5O&jc1%cH5h#;P{lbk4Ec;{`Xb>%k z5rQC~kS$bO;63$0J-dI}&CYW>lf2T3qA&9K3wv2Oc?ntvq+;(q&bg$*Y>-W)TI=K? zG1W>1A+1^m$uN~s$r?P#uDo|iq~fuN5|mPD2*SN6RCS#w{=RA-X#^34^_H+0f~K0$ zpfj3=d_y`ojiyv7CBsr$p-i(i!3I*}BG`6ti#mz}IAQ)pf`^Q-}o!*oT zO^IT(GRpEf%ULvI5iv1JRZru*2~Qvjyc^SsYqzfr^$zy7cQ5W@_0z91mVwIyY&^9Q z;|+ok+K>fP7O2{JB3zqTHl~&eS!g7dH zj=%@RaZK!D0P1peP#AZFTwxDZz-zF+#^>f0RKjA z7l0^^0AD~Hh=!`OmN=*;b@t4ao5NSPeZ8Zlvtt#{w=Ttb58hY*$*#hlWBd5-+_y!t zg`+413J6K%hFa(#3@hao>vq4{yZy+nse#Gitp_hab-Nd@42|3_mAVNs7fJAtwf_|R hk7H_Z9BAP`@)sUAwHk&Ok^}$%002ovPDHLkV1h`Z2+05d literal 0 HcmV?d00001 diff --git a/lib/images/admin/popularity.png b/lib/images/admin/popularity.png new file mode 100644 index 0000000000000000000000000000000000000000..e18a8cb444bb9f3e579edabca92303f914ea9c6b GIT binary patch literal 1172 zcmV;F1Z(?=P)JcKqQG&e$HJ+!w%y?&77lHZ~`+ zq}U`u2jZxz+zI_vFu-r8I{5iO1qqw46Bm1ut=o&)wYOF(lVXK)T){`Z(o#!mTN*(t zp+e0NXY))P`sF^~B;G*r`B`FOjysBrJBdPhjXM1>YK@Jzy%wds6poKSlX~I2k;4+& zw)G}T<#}RbPq1W3E=!l4MzQi7tK%>6)jBnbRRvttSOG9JJ!9GjyUV5N<`PcaR?wZ5 z+rp}NHIdOL`E+R>tG>)<-Fh_}H(e(oQ6qo)E!M2R#i`pP#kv>eV)SdYl&z+o9u8KLrJ?B&XD{^}A{graWM9@RvKDShK-(nK!?l}M4klHyZ258XG~Z1ccehXW3h{235W@SF2mPEmxehoa_{2}Q zOKcPr^^lgSW6jz;^Xyq$3cbdJ9uVTaNFn|=S-2k8@WhF+4%pi}&Nm<+;o9U$QQ1OF mSs}##eT95*&Ab|ZE&T&=+N;S!^g(C<0000?m+ literal 0 HcmV?d00001 diff --git a/lib/images/admin/revert.png b/lib/images/admin/revert.png new file mode 100644 index 0000000000000000000000000000000000000000..c74c7928b919edd26d075167c4c1395184adef58 GIT binary patch literal 1295 zcmV+q1@QWbP)9F`K}avJt4!%w?^pBg01PX1FnuMm3)=#e z1Bz=VwG7tWv|;PuNAIn`%|3~+W&kMlLO=riAAB3I6mYqc(V#SFarwkLnQ?d3?IaPO zuYYL&_g2T}X6mpDK13V1y)X~FY5}S!Agv#Cy#8;N1g~2rjcuW%K?_Lfij|Hr4b;GA0w1Eg8Ern085`{BL*;etV4o$DqsKa0WSU;}`j(*#8U zXQ%tPtK7%V?`~W6@UEusBYaOShBZY?iz*Iw)$jHnN$zE6DoSnf2EOLM6Jg|KR0>Hv z6X&&=mkD}^tR=CA9yogKtMRap?muZ9NS~ zfjwwv9xVk*8j`AQ%lf;U>VvIp-P4tRcj)aV0^wg{3>X%}<>88|<-rv^5!p&@(XF)h z{^T<(rxC9=jS-M>Kud(MV{e`w7_dy3408a+*q%eL{q_XHY9!?Sj7&0sD?nLbc@2=f3QndjRi7Ril$U>B z$DhDbUNV{eI3b0SEod8*+=JttMk@pQ(8^^u-Vu-mxXNX0YQhC>xC%zd7>*ANAO&O+ zp9}iRdLCGJf9;Wh<1c0nxpz8-k)T{k!{s&oUB6f!^9@sJRqA(;CtRzsg7^t&Q+Tp&|2M#u|Nqt+OjvU*$`NJ*HWGz?_hQ5&5T7;jExWf zelctWxb7FfQhD>SuI8tMhv#flAIrH~3 z?F52HP>RK{@_-Z<&P|@XukFB&zFiGFt}nUndcrdip8Zu%LMatP+n^;zNi!XfPtC+8 zPa^F@|3=3EkTMUPkWgg62}VaJ$L?r;?#IV=KlD^pNl_^uo*#M%Bbsx249YTKXYu=T zR~H}z#OLzBf0}{KLC6}g14Fa_Oss$Gg&haJanmhZY$s$~oyq(c77~PY1tf=NvhdMJ z9ysa3g)EdhfC0-hZL-{d>h#;4*!~a}*DjrgGiO=YzW@fo|CZDDC{FM4HiZ!a+} zFfYdAz4-tD0^>(p(5hp-Jb1z zPQU&4>`!5vo?5Ni5z9@u!;6i%#@cOD-0gtYRFw(^@rf^l!o&iDUI$RnQCo#xIDITN zMJjtQ5~awPp#iwv^MoQqwI#(hRi#21IZdW#2H|$kg8*%hT6^AbHVdt;F5wGP zMOv{~rubpd;m_P}0I)~+7H$H-rWDgO&66a>bW1bjd%rVZ@oUxv0EB>CY--cm0ARz4 zX_}6bh$1^>nc0Ou4d38&OfR+?9&38K7LyHwlLQNmS=l*9jl%{^vy%V-3K-zVMAZk* zZRixWmrmZ=owNVknAwO)yLGW_^?6Cz!^Y0Jz}c|vcJ=)6;v8kc^GW*z$1-MGEYETX zDQar%`LuFAEX7Zsw4HLh|28wa{y^v)hoZ`wG~KJ9VSzh3Gzv+&yhWTQ?U;B?Kx z!P@3Qk&334?!LA5B0@pi+uNg(L?R|5QxQ8dGJ?@jGY%X)4Cl(C&Gm(*z#p&tN z((>{Op4n_hN^;Vqb;5Q?tyT|*3ta-2l$0dOhpm&;W+H8r)e z=VMv+8GtMR9sq8CcmVhU!W$$fT$jsL2*3g$4nQm+#NqXNbu7!a>U6pf_-{!nNCcj9 sWln;*g7U*60-#F^epMvMf7vzT@c)ilQ%Ti=COoK2F|d8SdB z1dZLRc3*w{rfMqhgBBpm5C;%?=u(lMo368VZaDV!suvdm=h|xq+dDh13TLkrM~Bb6 z;!E{M1^&OmDIf-xwJl$7nE{k0!AyV(A=_SZtQBkb>#e|gMbv5`z)x6 zD6}+x>RC%x*PTB}O~xjwPUDyI6tnN*=JIse7LXlCCdY*SWH#q;q&iBMp{AyR(e^Q%{h>Vldr9 z(a&?xU&=La4sla&0aa5E+Q9INn6u+#vnIcb?kq>?*WaTu4uEK{Ywh>UEBK_Ctc+os zX%gXO5X*0Kb<28h7t_b4pFFwyz4f(Z*u1JEEfgbD%$C2iqZP*vBkTrib8H2esA zCQdf};OY%ddt-+%ovH*P?J=IM!EQ0hM-a%x+oTENUofCFL<)Qbp$0dEC?X}WOmK7i zrw_R&rVl0iu*C`-tKJaO(oxi${^snq*7cpj^uSIm9t-oMV+BNV@meO~(quqxBI^qP zFu>p<+P{bo_@DuJ#~FFOmScDB0uMH@>aO&XE*mqBl2>xqH zZ*KIr-+JMD3s0}vvZJqQRV$hL8j?<8@i+!4V=DO~^W$?|ICi8sbMBYV!@|M;0h@sF zb}{>lt;0_|dzWz9K9Q_$s254c#;`1iiK9S;rMwrGvNLe$45+^Xlm7&(WSE8=L}Y9L O0000>$j@3?%=}IXVGIu?6^qxB}^!GiTO)RRBpamIV0) tGdMiEkp|@Odb&7!PC{xWt~$(696t>7*qfN literal 0 HcmV?d00001 diff --git a/lib/images/closed-rtl.png b/lib/images/closed-rtl.png new file mode 100644 index 0000000000000000000000000000000000000000..016a3c370245ae211e243b4cf7ef23d8daa24f2c GIT binary patch literal 111 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1k$P6S8B$wO;QfvV}A+A7r=FFLOUll+Sj3q&S z!3+-1ZlnP@;+`&!Ar*|t2?-Mtf)a`nejNP6&LSznAbWtNC@$fLJWvUPr>mdKI;Vst E05>ZfAOHXW literal 0 HcmV?d00001 diff --git a/lib/images/closed.png b/lib/images/closed.png new file mode 100644 index 0000000000000000000000000000000000000000..927bfc57ff7d734f41f2f66a3f8298849b20dfa7 GIT binary patch literal 110 zcmeAS@N?(olHy`uVBq!ia0vp^tU%1k$P6S8B$wO;QfvV}A+A7r=FFLOUll+Sj3q&S z!3+-1ZlnP@VxBIJAr*|tX$f`*?l82eo{>Dmc!rxnc?pZg^@UFJfhrh0UHx3vIVCg! E02#d-@&Et; literal 0 HcmV?d00001 diff --git a/lib/images/diff.png b/lib/images/diff.png new file mode 100644 index 0000000000000000000000000000000000000000..04fab07b737f3d74fd0c3f164aaa915078bc160f GIT binary patch literal 190 zcmeAS@N?(olHy`uVBq!ia0vp^{6Ngj!3-p)&s5I?Qi=gSA+G;{VEXj`3=H?*{awB7 z(9A>so4Th2hQ;U_7&D{+g&F>wyz>D_F_r}R1v5B2yO9Rucze1yhE&{g?epehFyuHI zHTT!<|BcUAE{HU75vgkEIKw^VsDkjdvyvt69CRbu#jkYFVdQ&MBb@03@cZSiFD; zrb-vG*_lk{&3qzA#LB{7`{Ta}o)1o4u3x?+bHOyZ{ysE0!RXoasC<2NwMQ2nSUszr z9FKV=cTj@QuqX`H6cOgpk-GqNag`VSArpPcY*+DiG~v-6Nw;s zp@t=d5Pa~Le4HW}@td5robLr literal 0 HcmV?d00001 diff --git a/lib/images/email.svg b/lib/images/email.svg new file mode 100644 index 0000000..72309ae --- /dev/null +++ b/lib/images/email.svg @@ -0,0 +1 @@ + diff --git a/lib/images/error.png b/lib/images/error.png new file mode 100644 index 0000000000000000000000000000000000000000..da0692429e404d4620f23a496890f09f6c8fc8ec GIT binary patch literal 637 zcmV-@0)qXCP)q`6DreHL3G4NK19k@M4ND94=5r6X_07xs~$*yK?G4zE!qsUs)Y}X7J@rL zFp7$h7D|my`A|w7dyGzsPBU}P`JL{$;+>gh=?^|G_xsN8_dWQ&9IZ9>gWUfe>cP!= zYTcp9t0c=wg5(d9{Zt&X9`-LF4H*@P`#0J(bzmnazaqcB0l7Zku77J2u}}z}*yb9k zddr@?9L^F*-n(v-*_SA*E-YwjgbIHHZ8PvxRKw%1!PZO&@!8KiRI0n`>Bz7vkhpuT zj^x{9d9}Z=sR_yVV=ySV{R{@%cX|M7!sp_Sevx*5f6Fx7(CH7WwONhy$4 zfmlsMHtcEF7^0i;@4InqkGycRQxLgTwTML`Ch2N=1p|MApK!om>pnJLU(YQRUAp2B zmGLRUTU&=;Qy)#+1FnD&VlcTL4o9bhC}=z9ifjZPV?FT5A)0^d{000DP9eHH7q$fk zGZty4>r^|H>a&iXC@i+89A8>=24>>k!*z~DZ1VRHV>=|f+g^Pc&RXTE%O~3v88}$t zuPALf2Cr2N6OKnW@N;qk(Uti%lD(&2f6ZED7ZVqc*OTm^GRLGckBJ;Q^JXslnD&Ez XmC>(EJ&Mgr00000NkvXXu0mjfIG`C{ literal 0 HcmV?d00001 diff --git a/lib/images/external-link.png b/lib/images/external-link.png new file mode 100644 index 0000000000000000000000000000000000000000..fecac61c9204efb9a55a77b83a46c4da5cef8cc4 GIT binary patch literal 431 zcmV;g0Z{&lP)|F`^a z1LB%LW#>U6l@^tcYX8*#uZJj@^ZVnKB|z!ce@*}D{@2tpFf8?$@W1hY*Z*#ag1Pq^ zB_1!C|G(jX^Z)w)(@rrkw1hPSdGr4-gD5z@qH;xENexh_0jQw&K_pM*o?0M#_u-2W zM}E;=^|Itg&Hws;^*{yHKgyTX{IC4K?EhV#|BO&KKP=q#zv+L~zdE3z>i^~c>;A9* ze`n?|E_hh}<$RNS;o}mZqB5Y-bN`?I^{W0qA6jI+*M2+m?W4E<-oALd?42b<>?7eg Z1_1VZ$X`V$HBSHl002ovPDHLkV1h6e diff --git a/lib/images/fileicons/32x32/7z.png b/lib/images/fileicons/32x32/7z.png new file mode 100644 index 0000000000000000000000000000000000000000..2537cb96d6ee151e70ef93659a2eceb86084ad45 GIT binary patch literal 911 zcmV;A191F_P)Cl{tgWxFrm3l_t*xo7tgWxFuCTC~W&on4 zrK6>#q^GB)r>Co}t*frBtFErBuCA@GudT4KvW!5xggC>DJ;aSZ#f?46%gfA;HqDMQ z&5kq8jx^1VHO-GT&W|?FkvY$jIna_h(3L^bpH5{%-lj?3 z-{9Zi;oz%M;Njxot5D&tRN>;|;^XAwuvO#a<>Tb$@*E<>%<;txD$R z=H}<<=jZ3==;`RPPw40A=;-O`>FMd|>gwz3>+J08tUTP@U= z(3AA^_4V}k_4fAm_4xMp_xAVr_rFv3#9#NsVEDvc`1$$y#9jKvUi-^w``xAc;k5ha z#Qe)>{MnEE+nW8%X#LG;|I%;&)N%jSa{t$M|JZc@*mnQfi2vV&|NsA|#~-Hv000qm zQchC<0t5^Y6c#W-ud%hk<>%}3KGw&a0004!Nkl2*J zC5veyJ4+?f*eiRbtSp(oK`i|NY$Rn*S;$K%StfYjN2=at2mn0zqSJ zfUOFe)UJW9fUx!Y3!Mh~xA6NG^xOi7M&V-vdu{_x%u&!cum+Ak!n)7Vpps50G{mYJ l0rgo!(?mr8+#IN1@B<|gi{4Z#QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*q-9);uuoFn0xMEmawD5fsg-djCt2aZEWnA9^}GbrSa%!_b-O9i|j9# zez$%8%#$_V@qf62Je`kwB3 zarv8zkDq+kbmi#ABfOFd4d?h?Kgj;OI@&*^fzM*Kyx*UqZ`pr;tYPK}`27?ZGA}Pq z<$a&cyp6?->Ff4=fA{=O)|iivI-*|LxeBR=tX88+VhfR7ZsJu3yT3pIte7 z?dS~C`;1~7&+IgXbuzeX%!G@w#_dukMO!ip(U=O=R55`W;SZwFVb7U;8f`2YCM5$$7kQE-zs;p^~l9? pmk3#VDa_fEoGK;c5E0q&Kt9D|aqg)-D*r%P(9_k=Wt~$(69C_m?mhqj literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/bash.png b/lib/images/fileicons/32x32/bash.png new file mode 100644 index 0000000000000000000000000000000000000000..a31ee688bc95c745573b2ed93da10cd011c7b546 GIT binary patch literal 966 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*q-m{;uunKtMqbe@L>mmhKE94g_`f8?%ch**40bl=v}Xik1jAB)n&PH z|1=ZlcIJmCeTru9DV|x=;kNi;jjpnd=@D+bIcfn}igh;R2AUZh{B1girO5u^vbnb!G#8(|!P^wZ z*OpK{f7AWL;&JNiX*X=|*viPt{jqc_+}1pk^?1gCjf)F-9@Mxr2VdDgFVCZ|zmt#C zFY>*;t4YD4eW`~_ifco|LV|u2%@@A-famKu^(j5(PmiRD9Xrqs+^5t!6UH&E$R9@C(Hbz=aUy?4h zXJy60gR7;4uDrZ@WumOWy})x7Kcgl*D88bdeuQZkb4~n>sM>b_{qYBxFP&zL{OpzR z^SQQ;mw?KLXZtG@J@~fFi+g4B^ncUkS64DEYko0)>yjwY@z8AqCl{tgWxFrm3l_t*xo7tgWxFuCTC~W&on4 zrK6>#q^GB)r>Co}t*frBtFErBuCA@GudT4KvW!5xggC>DJ;aSZ#f?46%gfA;HqDMQ z&5kq8jx^1VHO-GT&W|?FkvY$jIna_h(3L^bpH5{%-lj?3 z-{9Zi;oz%M;Njxot5D&tRN>;|;^XAwuvO#a<>Tb$@*E<>%<;txD$R z=H}<<=jZ3==;`RPPw40A=;-O`>FMd|>gwz3>+J08tUTP@U= z(3AA^_4V}k_4fAm_4xMp_xAVr_rFv3#9#NsVEDvc`1$$y#9jKvUi-^w``xAc;k5ha z#Qe)>{MnEE+nW8%X#LG;|I%;&)N%jSa{t$M|JZc@*mnQfi2vV&|NsA|#~-Hv000qm zQchC<0t5^Y6c#W-ud%hk<>%}3KGw&a0004-Nkl4e-6u|NSd$a4si(rC5 z&;&s&j-c3C3PF+B3-*FwWvTla7A^e%+K3404WtlbKoE!LWUdu z-5=iq0OyE9R^MOKy|M3rC{Z3(7;fZme*5_wJSQHDZ9n`lZUKfi?rSAxh}g?}EmQ(< zTIJQj=^x)uU1j%RW%>DPl^@=Sj$FX8e|BAEcZ;>#=0{)FSb!N&_%vAO)&ANYc3zyh zd1W*@PYeX6m$yG(xNF9yyncFab0{gOCl@dA5knXZY*I@WK$!L|JEG~AtCz`K0>l2zuU0000QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*sk()aSW+ooO^C#R*0iW!^8S>XY@Ly47s(<6g$MCST=49ls};HOCj@8 z{@in3tnrQ;1ZJ!DE0k^8x0p?h~{c2e0h8O}S^chOAO_eWnZ12@Zv$j$8R%1=iaYxpWpS*jM?<$ps2P^-Hr)%c_lU1eGW`-{Iz&rM|slf{vPSc2C>4= ztu}JlEO=)px?FCJXiZtN)Leb@3)i~-Ic0jpZwR~adSdok1FuP}`ECKXc1E$!WKM8c z%frXEg_Y~SAjek6I_4nu##BeOEB8NKG+nAt7r|Qfsc)*!YKBDB&QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*sk+*aSW+ooO;eMTi8M5z{mf4cTWpjd&A+#Qjv>}?Mixjuh=(q)lJa5 zYg}F&ba1_bMThqbcLDR0IvFkkDl@hmyY}pzZQwhLNv9wEf53a3{~ou(YyXgiY3KIa z>e@5jd0eei_V?vV(FO^58`Dc`|GoS7IXcbb@lp6$mKyFW@};hOgrnGRj0?XDf4!@$63X*gaYH{le`etBm=9xhD>m zF#VPNCO)TZC7(=s@y*x|Z!9zp{uI4h+a@`)t63=~Mm=1-%W8+|j)eyqR$2x9XnUN{ zkWrBC)T}5}8WQXrx;m8Qox6#Iq|Jqdo*#j(J^WLHlFr25vA_7>Vgs9iLimH}l?Pf2 znrj*|K4g7xY8H6P{m|}to}$hUi$foJ+2*soH~C@qW5L1coSag9p3N)`GU`(2-g685 z<@^&Me|FhEML`#CU9N&Z`yJK(Ig6aA42b<8aQsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*zWLjaSW+o%sqE7E7(z_{bT+)AE(t}ISP-KiCk>e>)KJc*sdY;i{q}B z|JLm;UfQ%?VTXYE!hVH!D%p<8O$rB>m~K-uPFG25d-&|0{s(m)`*%IeH*1!8b!NQz z{ki7R0h`(bRp#^OyBke7q0YUuAbmsqk5Bz+2_oq&GFcN|o;&#Z{w#(B8P$(7PCvfe z9BzD;LC}k1#=Vl~AC9g}OVCxF@-|uc@Z-PRIbD{p&A6K!DPXkW(cSR(vA=rntSj$+ z{d8i<%c5=O%B6)Gr-iu$6#V*{e+m3Q_EtTxfo(>6yYl`Se{NaKHE&>Sis#9%m!BVV z^NXFthJc3HrWg6Ozbn5V579fCaL{C3$G^j^9|~6|?>6MRp%zemNqnPQ(r@Lz*KYWl z9huRW&%nK6r~j!HtvlH4W(z*CiqBh+9sWf;s^JSzq{{ZyRfi=r0}jkq)O{Np+jvDV z;IDkx>{AaiN`rL&FJ0UGX2Gf3Tw15Z6rTQyn$*a=VwQYCC0qYG&E6w?LKildZxJ(P dY`GTFSid!I)(g*#j?tiO=jrO_vd$@?2>`4U@gV>J literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/cs.png b/lib/images/fileicons/32x32/cs.png new file mode 100644 index 0000000000000000000000000000000000000000..6c2aae2727d8dd77fae10eb9c1f4ba7636ef12b7 GIT binary patch literal 944 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*zWXnaSW+o%)MZr9ULgp@bP)=dCxVu%4!1a3q=YGH6J}v`pXb@@T~sD zrPa@J^6EGbo^<^!c*NI;TZ)}kQ*Gk4S#yfxO!rQo{^Z%t4}9(Se;yXS@cO*h!NV$h zcCHC$IrQ22+V5|VE=7nr_VzRO*ZhBb@#N`lriLbwMQ;AeR(GxMU6o=Gy4u}z$KtmA zy+HO|QXcuc$}a^fFbObKw7y#zQCIY3R}79( z_TAPgt}0FQ1sZZ*-n%Z(zt6w)dJ#irOybMGW&bW@wr-p0l+h%VR(n+;YqtDMtMtN6 zOO@7MVPMqw)S;!xn8RB$$?(cnyZcMm#9oXSVZRlg!~3Ob%@(enw65lGWwVlk*IX6O z2?1wUi5kfK$YIDgXgR3%V3FO?#$WfcHuz)<)aHM#WqSMe_|6L+hj(}X6gr}ibEc?? fgEcjIDMLNu34y-Xf6Xp>g7TfGtDnm{r-UW|lfLdL literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/csh.png b/lib/images/fileicons/32x32/csh.png new file mode 100644 index 0000000000000000000000000000000000000000..e43584c7e6ac409574ee183cf758642647b9c5bd GIT binary patch literal 952 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*q-R=;uuoFSbBbM*5p8m10Vl?o-;Y(wwsRvUy|mdM?pu9x>hlU9dzB( zsdv}9y!f*kOKi-R=?Zz1A}?rYco=qWIrgL`qk^OT`{DW%51)RpmUnm1xA*H5ioEl> z@{mx0|M!*O-`=#jJ)Qk*O~I6o@_RBew);2Oil{uiI{nJx%X1Is#xgtXnYKqE{9GCT z_ALx+*^Fkqllgk(9fJk?QkVZBMKu*4j3iHFuol#v*IT`&@$v)v_6N;>kJXv~czTwF zZGrdn`_<1Aa(hcmof)~FoXqr5d}hD%zlQb&hVC8qe5X&I?~U(f+Mxe4oagk#QuEod zZ{xWFU2Fp8aUPM$tN&T}{ddUr;u3{k<)Vu1lJ~z`t((2MDZA-Onscc7tlRpMRq1t` z7AnoXz`*BGB(LMiSHxR0#c<8*nq97|WDR4MF_o-%A|=7IB8+innir$K+m}R;WM}j#k`?~X2S*E+{@wej(A74Fm;92vGj3w{h owlcnNxmLvUKyl%gX+j^wYtB#2?{0ql8I=D#UHx3vIVCg!0ErjyCIA2c literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/css.png b/lib/images/fileicons/32x32/css.png new file mode 100644 index 0000000000000000000000000000000000000000..786f304718bdac6cfa3782740f6f935dc3bd8ac1 GIT binary patch literal 952 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*q-R=;uuoFn0tP2*5p8m10Vl?o-;Y(wwsRvUy|mdM?pu9x>hlU9dzB( zsdv{nz4)^lOKi-R=?Zz1A}?rYco=qWx%Q+cqcZ1y|M$P_a&dh7KMOMM{bQl(m0Gyo zUwB$W^)Bzd`RDyM*H&IQ!|uMa;`!No2R{p2J39)+)lRG`*|&B7O13vj>s{j}XuIG3 zEgi+Mmd$8JzU-GP_ZTePSGxQUD5}}<-AM9825UjhdAZedn3o@{=R5fSzwh6&536T$ zGCNGy+h5+d@y3i7H@R2?6wdP{a~b|W`PV(NkuBob-OPxyb?g2{O>3w%TzxkIeA-O z=ZWZP3`}*B>~a4Z$$Tw?M|rky!lRu1XN3Z8SKDpKe9ciZzb5y;xOto|?;87#PPbS0 o=1F|;%g{Z}ASdLNt;tx=$k96e!Lhp6g`oWB>FVdQ&MBb@09DxX!2kdN literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/csv.png b/lib/images/fileicons/32x32/csv.png new file mode 100644 index 0000000000000000000000000000000000000000..e5cdbf94064d821f348bb72460c29053147c65ea GIT binary patch literal 663 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dye*%0$T!Az$uypzIRcqF)UB7GRj0?XDf4!@$63>FMGaQo)#ejyt%?LEu2) zE|2Q;r9u~9&h6~?*|KTVr88SzOtii8{(tPPM86wJ_2!$;6xF9~(DBZ>qSd9PT^}3K znJOQ|mhJ7iA*k`1=GCU!7x`TlCp0qH=ek^I`y;Y$8!Km%o~T3OKZd`$6ItdKuVQAM z;h(rc`O$+l?xhb^;!nJ9%%8o0NBnxodsZc_E*Ky=k2{ zB`<|da^33(|NNTukFoRCNz6C-@od6^ou@PZ@iNTh+;M2X zLY1eQyh6hZF@9l*349@c_#1p$8lzZDc_hx>QabT-)s$s_=5W4wqoto6Etr^IvF*U^ Y_!RT0oNFu&7l4wNr>mdKI;Vst0A-tEQUCw| literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/deb.png b/lib/images/fileicons/32x32/deb.png new file mode 100644 index 0000000000000000000000000000000000000000..e2828a347189959098b577985d5df24ddcb0224d GIT binary patch literal 914 zcmV;D18w|?P)Cl{tgWxFrm3l_t*xo7tgWxFuCTC~W&on4 zrK6>#q^GB)r>Co}t*frBtFErBuCA@GudT4KvW!5xggC>DJ;aSZ#f?46%gfA;HqDMQ z&5kq8jx^1VHO-GT&W|?FkvY$jIna_h(3L^bpH5{%-lj?3 z-{9Zi;oz%M;Njxot5D&tRN>;|;^XAwuvO#a<>Tb$@*E<>%<;txD$R z=H}<<=jZ3==;`RPPw40A=;-O`>FMd|>gwz3>+J08tUTP@U= z(3AA^_4V}k_4fAm_4xMp_xAVr_rFv3#9#NsVEDvc`1$$y#9jKvUi-^w``xAc;k5ha z#Qe)>{MnEE+nW8%X#LG;|I%;&)N%jSa{t$M|JZc@*mnQfi2vV&|NsA|#~-Hv000qm zQchC<0t5^Y6c#W-ud%hk<>%}3KGw&a0004%Nkl4f25Ww;O%-i+iMKHl2 zXbwRvj-c3C3PF+B3-*FwWvTfLiZA66h22zMIAc)0PSBe%!!Jwjd9=XjM!DZm> zWB|AO5PdpMN~dJLH7o2{iX5^>L4_qvI)V#q~D9= op>f&(;@=saS)>6doy7?J1JX5*6uaC2qW}N^07*qoM6N<$f`57X&j0`b literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/diff.png b/lib/images/fileicons/32x32/diff.png new file mode 100644 index 0000000000000000000000000000000000000000..9e413cb6ee9279dc638cf83c159f5a7480fbf418 GIT binary patch literal 942 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*lzc9aSW+o%ssb1E5uQx;bZHN%^eSLj4TLX8%q>kM-cWo=S zUSM)r!CkQT=edX7!fPA8UkTdQKWFLj-}%M{OBf^WFe`A1eh@l*UBdaFTB3Q|)33Lb zuSY&F$#;DBDB|CG2S%nFZ!|J}zFproe+GkY!8|#?M@8SVA3xc{Dl_3xQO)n)Uw)iQ z>p9uDo|#{zd;7k>dwwVDP1mU`SgWm5w_}1`-rAp~#*FvbUiJT0y4P81ZsWQo8T0Hm4f!T(#Z)0^C+72{4 zOyHQH9-{D{kG<0JJd+e};)Hbd7j}-P&ZPx42AG-gb6l0M-L-6sko_qK|N9qbX0mb2 cUCH#H!OvkFVdQ&MBb@04YW1mH+?% literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/doc.png b/lib/images/fileicons/32x32/doc.png new file mode 100644 index 0000000000000000000000000000000000000000..43ec354163fe4e6c1a34a5da35429e87c6daf8a8 GIT binary patch literal 956 zcmV;t14I0YP)0?WB8pZq7}vy`7ZVO1H8I}2deO5R?rS`lXuNsTcrY=XG-@S4r_-{SfX0=? z1vgySEYQ--NZk2pKc)VUT z{uL5GDF+Q6kKf8H5vZkBW3futb-3&5WXhdasK6>(IX4du1u+y1iNbwW-F3V9sc9PS z*VjKQbSJ7Brv!qbVT6Xm7!F4YhQ@QBRrl)ZU>HgMSyffkdpsIT6ez%9;fNv%_gUp8 zf!z2w;_(rCCmJM4VTl3+ctsIK6^8n30V-4}rT z;xqgm`H`M=asQjnPCf<_;pd&HJ3#`Vd0cq}Bpw){iB&Di^nM$}*30c!T;oI8AvrIL z4$3&@?!ruEEzp{0W&w!>pwPrxROe^&s~(;llQ{qrvoMMI`z1#|KUIx$DZem*XjHd( z(Akf25-6}}7rcl?Biw7F>0$!9{@teST>!3QepDRxVc8KM=I`_Hm=D1u$`5%_MiV~o zi_ydqR?xWRNBu~~bw>svCh$ELvuS@nfC`%Un`)r)xF5T3yyP)kF12IbnHH=%(Zs)R zI{yH>uD-xB5=a@`>p(~#7LVIJ`Z$CobOc|+BfP>rH(#Ol$pETOHeutrR;)eUjJ-Es z(-;|v%sB5z)=W4u;v*ws0@Psh_)`ew6y6<9U?uIqwkwaZ`9d4k(8L?gwlb9`{J7TE z&%LE|33D0Kk&#Fw#RL+DVe|A$m<4(wbOf~B>(91e^{HlD^nPK9wR8;IuROt2@wZ@N zEbYiJlBSRVH6(4GcPn54#jwts&%OHcLj?2;-w79;c`%-J2uzNTIx>U>OfzNE(W_4F zK$6e7;;@XbiixgalW+d@_I~_Pd<6KJb7T-=0_jx7rlUtg8GYUQR1^KtH1j!PGQC=w zWj=(Gcpo&-t)x(TKmvaKaAc%XX)%FpX3U0`gPL1!v4B>#@IYR8OwH|gz~qD@Bc0BO z35;fQMJ1ET3JQ$nib{5LR8(NB*c2|Xqp1lcwY5cua>WIvl_PNW&$<3tV0yT~=gfZr zK>@FKF7LqX{}a-C;hcU8C_le|*XK)1vdpHmUB$wFVYTw}3Al)AV&@!Eo$tM%l>bPE ebBJsDo6&DCwOMML)wv=700002(;j@uFCQ)6d*APS-#1C8Xik&}qS!2Wy>NRx zc=k^SJW?Gzb-R5=O~Q7pG7|F@s;Z*4u1=)7OY91)r=4^1kI?`|13{;7o)M2~Yk5=@ z1yAbh-`MR$<+E9VKyVDfu@J^WVcXDr&NJe1T^%$n!GFuLjC!|QVF{Z8Tr3opoWgk& zM(dHCnnEl#Zg%3SAV@4>Lx6V_mSo3Jo+&`V64VLvPS72TvczHnp|A`|R+tgLAAN&< zi0{6`*Pa{UO*iL%>geEOAQ2uP&fW< zS$<5!>Dq2A6vhUPbru#7SO5|&tVC2E8$a~(;+V+-m|lb#6dw^R`8>)B*QNUQ1R@dD zq@`mBWh7uTs0$uMBVo=pQB-FFs`}HU^@|^_(>|1+@S@_R7sZF&Jf|y=K-qB*N@>Bj zgHc*oz#5vj`jiiem};p(I1~68jheJ|j-Z?t9+ow%JLAKFyYG3<&g*U1e6b1Z&o=Pq z?N?f`|JFNHkU&!7Tnml_qOq9Ci?5?tNk`Bd8s{Azy!Qb$uSQULt^wOFH)GR-eqr>D3h89i>P5gQ+OCO`=$FTVv*M#cL=ajc~d?7sODJFd23BQ3o3QZuvetPi(a zhd8%{E@3vUTWZAP31FdYH4d&{LJY&hSDYn~pK*hI&$=jJQS20sPU zlPOCLEulLSpoE0U+dc^_AZf;V^SM{ucn-gs<~!k{GY`Zv7J-?m2}=#f0=k|wX&;bh zJCNXWE8=T!AF4KSxXJVnLsL;HfiryP)d*6psZskl48Dxb!I?G zu}oJmfzE)2J}HTkqXO{fm!(EBnQ|tONl%*4c2Ir)GnUfMmL1IrX!1(=z()JUb$ z&IBeh*}RfYXB-MlX7fsBV#2AwWWKR4u(zQBMKv{fhw9oBm=~5Ji+^waZ~h!-M_^6l z&vw6Ga1M2#paP3Zkih@Y0gtCpcfj6nLV7PO=u<%Ta|?L9-jpDUY)b9Q7v>AAQ9qY} si>M;@6_Bc2?*%1OV literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/file.png b/lib/images/fileicons/32x32/file.png new file mode 100644 index 0000000000000000000000000000000000000000..7f6d51a0982ba202d424b18c3ae1e289909f2fde GIT binary patch literal 543 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyPXc^GT!A!xuypzIRcqF)UB7a}ZEuLGiWYu2p;s$9Ea!>QA!@7;fJ|G~ot z4<9{z^!U-^Cy$>zef;Fvlc&#~JbV5Wh@QWA1_aMvJO_doFJC-=`QpV(FnIOq_3PJf zfZ*+$w{PFQ`|$2P5PW$50f;_+{P^k9$IqWWeg6FE%jeHuzI^%m^~?9K-@bkO`s3U8 z@87=v`0?}S&mTX2{rdI$_wPS{{`~#>_y7O@ZaJqkktve;B^1NHb?Va<7ecP{TjV~Se`_E_=UHqEy<`>gv?z(MJee)WN)kS{Z{QC4; z;s%C}#X%h9OX6=lzAeHapsL<>X1-sEsZVLc;WsRBD>Ix~<;>=_mFJ1RL$vl1)*$W;;vRp_MIVULuF-$6)_Li- zmH(wRN*AzrT=8a+$Um#~zf}0ZvEG1_cbOK17&F^3Y`X8qoqSE&8x+l+u6{1-oD!M< DFHR=i literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/gif.png b/lib/images/fileicons/32x32/gif.png new file mode 100644 index 0000000000000000000000000000000000000000..dde2d84143a5e9f4f42346b118cfdd95b10b10af GIT binary patch literal 873 zcmV-v1D5=WP) z?MqW}6vric*$V>^iioH{iYSrZN@8#N3;HvHUTBa#P*H&?Lit#V%bH`lyRCsw6@liP zw4g*w%ZEMQyQ|YpxB2ku+d0>{`c0hs)!l&)XXoyB&i&lq?%>{nzv7_ca`h>0HylnU zdjAQ<$TSB%4#yjwSs)RIxY4Z8bsbil%|&w$;qwRJ4+L|D*K;4oYnu(xXbc>xs>1GYXe^Pl01pcUL(*^`hm{02 zx3&<8ET?y(M^Qp7k&^&lQ81*+!hLB04wm4ZNZk{Bb1t#Oz5;=uijb;F!@IySHa^Zj z1B)2BD|Jth0O&l0Sp*bt1ZkM6h0`P_s(|rQ;ByJ8$AR0#-3;y!HJ<>F7kdU@AfIP% z0cBetL?_k4dOBnHEb#FnQGy3wfhR=W4ihQ9Z6AO9#gGyDd3QKyer^Kcur7f973F!KwKMB{KZE+-GR{VAnIp-W zT{GkamLd@W%P*jt2HSR+2YUR#{m#R9Xf44b+j-7LZTFGjtT-dGyeuWa4Fa|Wz~Kdy z6iy%D4gw8**HQE02yS(r1gIe#q#_nHW|O;s$5Vl}wgR)^x&J4S5qwO@ z8DXvf#hy}oe{a4(t~-z?0kO{04mh0>_kgs({?CN;UYOT^0nN`Y;B>p=^yti{yj^CI zeqrVL*#ruSQlc`ClxBM`IGFmfIFA%&z8U=nS;=hj?a>PH00000NkvXXu0mjfe>R^X literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/gz.png b/lib/images/fileicons/32x32/gz.png new file mode 100644 index 0000000000000000000000000000000000000000..5bddffb6daf1f29fc8e8a4b42bee195a36eae77a GIT binary patch literal 914 zcmV;D18w|?P)Cl{tgWxFrm3l_t*xo7tgWxFuCTC~W&on4 zrK6>#q^GB)r>Co}t*frBtFErBuCA@GudT4KvW!5xggC>DJ;aSZ#f?46%gfA;HqDMQ z&5kq8jx^1VHO-GT&W|?FkvY$jIna_h(3L^bpH5{%-lj?3 z-{9Zi;oz%M;Njxot5D&tRN>;|;^XAwuvO#a<>Tb$@*E<>%<;txD$R z=H}<<=jZ3==;`RPPw40A=;-O`>FMd|>gwz3>+J08tUTP@U= z(3AA^_4V}k_4fAm_4xMp_xAVr_rFv3#9#NsVEDvc`1$$y#9jKvUi-^w``xAc;k5ha z#Qe)>{MnEE+nW8%X#LG;|I%;&)N%jSa{t$M|JZc@*mnQfi2vV&|NsA|#~-Hv000qm zQchC<0t5^Y6c#W-ud%hk<>%}3KGw&a0004%NklKeoSAXsMliu3 zXcj>%mY~>K3PF+B3-*FwWvTNFgO)ykHX=fL11ZE95X54uEkz5XU{KLrm(1iIB|8W1 zUiRyT`{T?%2R*(Nj3^WRISEY5K~CN$ZFhTOI8b9#h_YLc9@KBg!GRcA7705<2J7M7 zpU?vM512_--(S<+QE-4LQ2|yMtQT*7hxCGj6OYBV9)1|Lz|bT2wH7l(?B%^FR2*bl z7xn(>AKy=1WoLh7`T1&H9NdUTE|9Tzc1>kxliqC$!!JD+zyTaX!?uXl&-7iVr> z84k}A1A)oqta_Jgv=$43Ahr1%0OfqW-k?}4Qn`5X z(&B>$e*@uB0zA^aD<(dz`FH>YjOItF)ix=WN?baBzWDRf(sLk8EudHP4Ciu0CnEeL z$`>x2c4zEGQbc&L0N+hEe9rsl&T;qteH37UIF9+MS_K#fBA|Y-00{@BRWAZ$4gb7s z^3mj^Sd!RUfZYF2z;>-b614McYiq9XOJXb5Ur}9kG@dj9lH->STCEn-)6??XS}We$_V$kRP$-<@&Ykb& zzpfgJi~@8*fQ{*NI#PIcc9zxERo2(nMO3Y}g|#_yxnXv9n@F6ErA8W3UBlQIFMzqZ zIm+d-T&>N`2CrTj^7%1mkrOe3#2J(PMjTH-#~9haaeiuQij|cWo<9A9TerU9^5rrk zBaxUBAaR|f02O3gK~k~#ZvtZT^Ye1h;yB>;?eFBpqoZ#ShC^a5M&f-9-_WrRq1m5+ z6mGTJMA2K)aTw<0#eUR2E>R=n1QOS#)0XZT8yln1Xvj;oZm_qv?R@A=0gB<_K;m4y z)aaXl-JKojXl7<6)#up7ch#`itY;v=Q>)bof{;fKACs2x@o~1c>J$nE0Ag!;KLh!E zo~u`{VPZpC0v$-6ucOF#2+`olM|rX1plntFSo%cvYk2e9$Nc{13;NB6AC$Oq_RwLc z=eHleCi&ben%7JS(EAi#qkzeqKMr68N-1%K=>CFXr1gcC~*@20000< KMNUMnLSTZL!>gtM literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/hpp.png b/lib/images/fileicons/32x32/hpp.png new file mode 100644 index 0000000000000000000000000000000000000000..128110d5b764bf3092d22ba902856a351d992bf5 GIT binary patch literal 942 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*lzc9aSW+o%sqE7E7(z_;bHwbAE(t}ISP-KiCk>e>)KJc*sdY;i{q}B zcCX*WtbCx&p?Adhg>r}W$*2n*3LXZTy=%{&u@o|nX{&xOUnF+8{J9Uq&6;Ii6D|M$ z)0r=Dz_!+5@9gvE*Dxj3d=gn|z4-6p>GfN7Idb}~2x>o5&KLLp8V`f`0xzX^pGv+z zxay>>;G}ur>oe@s0I3Kg1=fBQ*DT#H@Z<*w4od2xTaA97G!wGrbEb$f_3EN%EOoZ%DIr!hdI4hHl dW9>_>KgmC3A literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/htm.png b/lib/images/fileicons/32x32/htm.png new file mode 100644 index 0000000000000000000000000000000000000000..79096dc7e253209ffc1bec2705a004768189a428 GIT binary patch literal 945 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*zWRlaSW+o%ssa;E5uQx;bHx`GkTp;hTPg_iXCE6EE_il${*19rI2|k zzt&n?w1)MdQ_eJ-rW+@(HLc@l(s`%0uJh(h%ftuw5_gpUPn>nwd`_XlZ2hDq9=(4n zuKCE!c;25;{`=|7G=)>*-hn&J@7dS<)i*ofGDooJqC)rF=I!;#ybO;O)a8mxw^e^g zlQb4sD3ZX|J@;_9`bNfUK_WNpjHKqh+rPe1Y1*cz%t4MB4WjS&Rlk2_T)O+-+B~uO zZ!SMC$@jebv~vlkq(Z~Fey1;v|6hMI7G1!6?(pN4@n`?%%$ZZ(z}OV;`|jTy+4$RE z>?Ag*Zs1(8|MTPTf8)7#E;`usa!tVhmq9=FT-{t7%6Oagq8z{L8o}8Ap8HLUKl2(c zdv1Mz>7vb&b1vMsnBvb)iFtopH!1sQf#}JT0T;w1cr>!t2JG@=yyqKn`QBHa1yW0+ z8GBX*8lPN{Ipx?^wa|uDC81Wj6Xc)jvI-QQsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*zWRlaSW+o%ssa;E5uQx;bHx`GkTp;hTPg_iXCE6EE_il${*19rI2|k zzt&n?w1)MdQ_eJ-rW+@(HLc@l(s`%0uJh(h%ftuw5_gpUPn>nwd`_XlZ2hDq9=(4n zuKCE!c;25;{`=|7G=)>*-hn&J@7dS<)i*ofGDooJqC)rF=I!;#ybO;O)a8mxw^e^g zlQb4sD3ZX|J@;_9`bNfUK_WNpjHKqh+rPe1Y1*cz%t4MB4WjS&Rlk2_T)O+-+B~uO zZ!SMC$@jebv~vlkq(Z~Fey1;v|6hMI7G1!6?(pN4@n`?%%$ZZ(z}OV;`|jTy+4$RE z>?Ag*Zs1(8|MTPTf8)7#E;`usa!tVhmq9=FT-{t7%6Oagq8z{L8o}8Ap8HLUKl2(c zdv1Mz>7vb&b1vMsnBvb)iFtopH!1sQf#}JT0T;w1cr>!t2JG@=yyqKn`QBHa1yW0+ z8GBX*8lPN{Ipx?^wa|uDC81Wj6Xc)jvI-QM9qJ~5yTtu0?h*B00J{@8gKv

    iXYqOpMKM1gnr%~4w|2zKp+qlfa4@E zdE_48>GnaY}>2IT~T!DWGlUqJI5U3eDgpyQVe z)m`%>p`1dC^#W(D?wlownO!sF1eQY~fp!|&{Tt{Z^eK85Na+17G@8z#X`qs`R_hl? za&FfQIe}0(ETI1b^wD5rnnj@B4Ls~QipK^Wo)|B3)@qZB1n0#W;guCB0d5d5E&*mI zpro+40Gk(R9=wVASI2Ot=QL-nwtB(qh5psmsGPuRBqG2=9e!X)%`hAQM#8|yIM8*y zjI&ld=)Bb@&WJ?Uqy(rTD$w+)60M_EXdAmC&^}&+j)`k%u0GCLt6Rsac)idsEwHv0 z6L?^|goeQ?G&-t9hKP|GG=8|snQLCh>$7Lb3B+RwfgAMw*6Poq?zL_=y&0(Hb-Z5a zkHzA00?EWiL5ar`asung&4Q9hBqaqlHVaB}eO*>yqtN6pV7FJJv$Leo@Z5t7P-KoX zk?VZX1ac0i$gckj98kbwDdsb<|9?VyFD&Y>fadQlV6oZaiq*=dyj=w%^TNvW_Yx>2 rDu|jQQnA;2!Qs@0QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*q-I-;uunKtMqbe_@M%khQc`=cki~|y?aA9;X%ob*p5!w8(pT$@11{r z*K+pmLw|JN-z@%TU2WLwc9|TjrPy7yzc_vJFVGgVZM9OwuLDR#h z6%?Hw8WI#0W_$OolSzf^T;t$PGyUeoXB_zaCoO#SqU_1f?`J4*9QyidQ_|NcfqR)B zmOg4`o1f*8z!9GOLzv+m!=uoB<@^Q3*3~RZFEu-^giT=jE*kNvtVklla>KvRqG6UC xk0ZL(r*ThaTDyL}Rs75S30tg6qduPh#rW@p@JY5dAt_Ks^mO%eS?83{1OUl-^-2H$ literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/jpeg.png b/lib/images/fileicons/32x32/jpeg.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5c425ad32977533e6167cfbc43d57798cf8289 GIT binary patch literal 877 zcmV-z1CsoSP)^iioIS6j36*mBilk7xZTYz0e?gprQg(gz~Wz&6;DnySoIRDgwHpheKzHj0Jd@*XNgp`#7v5 zu(`E`U~oCP6J3hpXNimi_>O#jO&0D;3Q({F??mF6;D>XGCH55X`ZV}8T^im6j?u9( z{u)@s%pLJ(f&@U<$xkDofWt?_G(C_cHeL>l6#*YDs2Bro61P*hMO1zOdfeDG_y+kp zy9+4W0)D!v9x##_L#KiF=Lrk$eFh#8)d|MqeAzz#@RKPc^z-g;(EQ8<0s%t+eMf5Kb|0w@st_5AtzuMivm^OfZA!g@D$KQ$4?om zTV_Z?Ifgp*3}>@$o+63K9W&$v7MGR;8fj?jcc6`EkJB+rLa(o(+I|W(-Nl^Ex_y=; zr+3Vd6Icoc1=@cAoix~%U=HY70PeOO#C@v;4{T>So3-6Tf-~Zb;PSGR05=HO<^hKr zP~tc}fXfHe_FhHhvqQMicAT?Wt3L30p?_s%RZd_f6cXT}eHzfO|6(8j35uoLA z0cW%Bqw}g?oDo`GlMu+DZRugoW?esA!s~^8X@Rx1 zu)rPHIaKwQpt`SAq@NfpL-m`BoVn(8ygqe?oIoTT6}Up*Z+ZJkR6Murq$3H}ypGok z{o!y#P9PTD$SRRYR8C+$wwYC;(U_#b#%5NDt*^@pY-F3v1$uf)(cGMuZFuhA32<;u z32}`WITP6J{D0kn#PL7h0cO{okr!|}1%Whonn30m*!w>ry%*;6S3vXA3pib_h@z@& z%G;GKk}s@0Kb=56QACvGkfL<&1^eS47Uq!r)HkD_sAzDA_+mC^00000NkvXXu0mjf DnPr&Y literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/jpg.png b/lib/images/fileicons/32x32/jpg.png new file mode 100644 index 0000000000000000000000000000000000000000..4b5c425ad32977533e6167cfbc43d57798cf8289 GIT binary patch literal 877 zcmV-z1CsoSP)^iioIS6j36*mBilk7xZTYz0e?gprQg(gz~Wz&6;DnySoIRDgwHpheKzHj0Jd@*XNgp`#7v5 zu(`E`U~oCP6J3hpXNimi_>O#jO&0D;3Q({F??mF6;D>XGCH55X`ZV}8T^im6j?u9( z{u)@s%pLJ(f&@U<$xkDofWt?_G(C_cHeL>l6#*YDs2Bro61P*hMO1zOdfeDG_y+kp zy9+4W0)D!v9x##_L#KiF=Lrk$eFh#8)d|MqeAzz#@RKPc^z-g;(EQ8<0s%t+eMf5Kb|0w@st_5AtzuMivm^OfZA!g@D$KQ$4?om zTV_Z?Ifgp*3}>@$o+63K9W&$v7MGR;8fj?jcc6`EkJB+rLa(o(+I|W(-Nl^Ex_y=; zr+3Vd6Icoc1=@cAoix~%U=HY70PeOO#C@v;4{T>So3-6Tf-~Zb;PSGR05=HO<^hKr zP~tc}fXfHe_FhHhvqQMicAT?Wt3L30p?_s%RZd_f6cXT}eHzfO|6(8j35uoLA z0cW%Bqw}g?oDo`GlMu+DZRugoW?esA!s~^8X@Rx1 zu)rPHIaKwQpt`SAq@NfpL-m`BoVn(8ygqe?oIoTT6}Up*Z+ZJkR6Murq$3H}ypGok z{o!y#P9PTD$SRRYR8C+$wwYC;(U_#b#%5NDt*^@pY-F3v1$uf)(cGMuZFuhA32<;u z32}`WITP6J{D0kn#PL7h0cO{okr!|}1%Whonn30m*!w>ry%*;6S3vXA3pib_h@z@& z%G;GKk}s@0Kb=56QACvGkfL<&1^eS47Uq!r)HkD_sAzDA_+mC^00000NkvXXu0mjf DnPr&Y literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/js.png b/lib/images/fileicons/32x32/js.png new file mode 100644 index 0000000000000000000000000000000000000000..5a8dabe81eee2d25c82b146ed6589abab3e8bee0 GIT binary patch literal 937 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*lzN4aSW+o%sqE7E7(z_{bT+)AE(t}ISP-KiCk>e>)KJc*sdY;i{q}B zcCX*WtbCx&p?Adhg>r}W$*2n*3LXZTy=%{&u~fQ~cw%mi_`9SZcdh?3Z2IXlRp{BD z-VdC>BwA}Z%wyGx8 z_}G&J;tX;gV)?bdE59F)(Tn`_V3oE`-Hr)%d8IYieGXiA_*)o%#Cqdb<;T}d&X^t9 z>9?kV{mR|tCs(p(H=fUP>N_`GI^%WMzaZ`j`x107yxw?=%iz@#hI>6Lliz2tEq&Oa zXs|$Jfv?x=0|^|>r3*T)#XH@!Zn?@i$??Sfu-~(;zqn|+)a%a*#;RX^TW6XvB<8L< ZV1MBFv_Id3l=?s!&ePS;Wt~$(69B)c@$mov literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/json.png b/lib/images/fileicons/32x32/json.png new file mode 100644 index 0000000000000000000000000000000000000000..e4a55e634ba78e0ca7bc2efa40b9723c2324c9c7 GIT binary patch literal 966 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*q-m{;uunKtMqbe_@M%khQc`=cki~|y?b{>!h@0Ti@>16yZ|4VQ@4^SV#PbhRQyfik%!^CNk~UjJUfXERn;{X-WEu zh#Mx+D$jf`SUuF}QEaSiH)?+On$6EiQgg$bK(Px4rwi*HlJwt@y|gUBarI?BrsX2d zoHy*3t?~cR9NO6^$LG)Qzg+#e?QN5DVHdm)T1st}-Es3+f!*SRs#15)1*b1nRd;ny z&F_y>lDcv6#ICB1tJiKcFf`7qJ<^v^(AqZr^6GT!?qDvh;OXs!Wfu-Knk;)V^V_1C z?`G{{n#}e*TI$Y1#^gP_OzgL>+PCtIMZ;%i-gkljgL2~Bd}E!9y^jXjpWEN$e#Lyc z=;R5(L1A%$*4MvxWPE6dvj>?BCz`deM%SspSsuOLL7Hcc{#3WYKAOF8acH!@C0? z&WB6fab!9EYVXFF772~N%ujxH|7Tqsax&Ox$1h&CMIwGI_6?vM%i!ti=d#Wzp$Py> C67{YC literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/lua.png b/lib/images/fileicons/32x32/lua.png new file mode 100644 index 0000000000000000000000000000000000000000..c8e0bf208c75080f6a93b33d589ba40db068ff23 GIT binary patch literal 941 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*lzQ5aSW+o%ssa;E5uQx;bHx`GkTp;hTPg_iXCE6EE_il${*19rI2~) zzSZ2RT>F|56wSQl9N(m5JBG73ij@mrKl0{`rPdjPclZA48y|hRdk&|P}{O_tAFR?tfpda5?nw&y#w2EusAXPkr43ng=RsG@3-&wecGhTzi#WHN4tw({&hQEewL+1dWHR~?h5s7za|zY%cx~P zic#Ozz<%Yf>hmkjx{dvLEKAQV&wg>K>tBragnbF#3$7a1)iyrM dkeIsafPAIb%s+k4zfA*WI!{+Wmvv4FO#q#H?vnrj literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/mp3.png b/lib/images/fileicons/32x32/mp3.png new file mode 100644 index 0000000000000000000000000000000000000000..9bf1695533c2cab1cfceb70e518b15cd71c20e3f GIT binary patch literal 896 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0V4M`-6XFWw;sQ&TFJHB0&D!>MD-1%dp6f`*2M#>U3(?(UwRp5ETx zsZ*y;n>KCw3=o((Yu22(bLY;Rw`l3o#Y>kiS-u?Tu+?kVu3iU3>(;DW2Xx`u4I8#? z-M(YTj$OO<95}H501zBJbmZvqQ>RZ~zH;T>{Rj6SJbdu*(ZffNA3c8Z_{r19Po6z_ z`s~TG=TCv?`HN>j@chMdAb9ce`OB9tp1*wY;^m8%uU>+{tCz3dynOxo6$rg~_4@7W zH$d?A&D*!{-hFuY9tb|X{{TcEKYaM~@#CjYA3uNk1Vmpx1JUO%U%q_(^6lG~@87laT78oUhB|(0{ z3`{IM0wQ7tPU|;rJ^1wb>(6%Aj?V!`U5}@WV@SoV(#z?=ha3bN5_<%9Cmoa$sTQwh z=5gGZ?Qrzo?v6!CjvE)g`~OYP{S4Q~vuEzUdHRseF2O)zN6vQdBfVWgV(AyWrYfww zdq#wJ$kxR9&ZbMiwAF+ z%0BOm-|*u2&xB*|Ht;teIet(>XT9c0yZ^_|{rh;)RHO5lMZuv{ZJ%=de82OWZ0CH& zZ1nTs%EsJlp^?tP(dps)pHAb6mUy#KPUml|tgdhGGPpyf_kTRcw94mgqXdgD|Lc8M0xQ?m99p7{-a=(hDw(e*xZ5L&q+iGBX|Oq_tL%F4Y)WDq8iz)`YMS3#62y;9`uGpwvMw zinY#kmgyJ;FVU77Noxd&AcXF-wA0y_sbU|`6O)tgV)|u1m_EsqGhfbop7T5Jcc#s( zQ)s=@?f%~B@xbA7Vd#PEIt=!C(*rgM)67`$)b3kMZQxy~!y| zPEBhz*HIS-20;1!etcuIUCFl-kF$N$)btFdXJ#=oJD0av&vn$-gM)}fqM&>}A8ZbX zpAdNiFl=^ip2ppKlW@4)&{tIArI&Z% zBeT4WP-sbZ!tQj=6Cy7Fo@j2~NAojI^qhpvW(Rfs`VAP3RcLM9i>|J2oI3qJhP~er zfUf~UeD|QT0zz~`-U)HX7A1rVfH=7i^FIIo_6J}xnsDUEQ5-+s4U44~--;97Us=Iz z(S`c@ZD@b116^XSz5Q)azh1k>*FX@C=;xgP2mrCq1{DA&s5!B*Pi#yR;?m_G@xg~5 zVdu_W*tDq#&CM<76hP%=dYt>xigYH6-*4O$^Scp`C9s-!K<=|TfYS+zr}hVe90iOI zfrSNx!eK<>F~n0zj89D9y!AXf+B;BJ_bggkUO-t{1@`URFF^hf^S`0CrcUPY5ES$C z0tf_x(o5k8V(|nL$rO^QG*amdGTCMP{m*^;y8?=v;D<|>(fipM>}h=kW^*-$h8&PN z{-8F1U~obD*s(5Dh;P7_Ek+m&CRA1$pw}Dt877mN7gE@a>S_yWYMw!DZ5_65wJ0-a zZ2$|4i_#?}WuV;dVf6Q3L?V$~<=G29Q-oAz(3$`iLm}zn;-^6U^z(=aHe&alR`7L< zj9z6|x^pFnA8Ig}Zpr6o-OTp+Cz0Ap9jaAjnaH(#{(X>_0H!RXj8=sYT) zF(PUX9y$#Ey(kr3Q)Yz2QEdR>NJN?)uv)FCe{MS(np)7*{303}o3W#z35|;9=XW$> z+x7-r`04_5x)LZeBGH&OfJihdy?Jvn&VGIldtYtCYi)0!?e#Zvnscl<`$ZquC^NJJ z#A0#jqM|49Y3~{AKX3>K4jxuDYgo%Q$_!c)Kq8)$-nj7zeEdl-dc;4Wp7&0xnl-HD z8f8X2p3nx6N@k=x-|2+WV1(IJ1#^|US;JbcQD*R~stF*S$`;hgWJ)7ICRXy$Vtss8}~>G#f73sbtBdqTa&Z~#1^%| z2US}XwOF*arg_XvCX>lbW+pSS3O~=eks#Wpxh36s;Nvon^Sj^NxhAH@NP^g=7=hZ8)ke{6ETVeu#s%52N38&~{y5a}qd8QYLR0I?X)3SQQMi%3u z{Q3m4)YMQkT~0vPbAn_#T_vMrkVvKw>V1#+;AeaqP2ls`1WvX+$Fkj>Sg|jRz32OI zCG-j-bS;rgGSw_8ft+D5VrMI=N&y;Pyc@^XGyP~e(u+03+M~T#f2;>*+s##J3Mm{f4vsvgl9oJ(cI2ZbW*vqftoeqztaVb2EZRcO%;lLQIf+2{% z85Nt+w(~Geo;W9R@}?;#zzvL^tJs?qQZOlqMm{zSIxgg47fe`$t{XUY;{}$}t5~}0 z9u{xEivt%Pr?a( zjic-r>6#7OuH;yDQA&UsY(b^jLf|`SZGVf^haX|{iN`o}Z2(uJA91^P1Y78s_rjiw z&%}Q{$Dv;F00PdD7bq4Tf$O-K3`)4r^#L1B^kd`6_;30Jn@+{C`E(rnFTbYyUAV5x zeN!PP;5webrqGMwPuSWzfSZrLAZHdarkHs0E`xjVaU8$(9%n8asqy-+)zBPBq^WJ#^>g86)r4d;;NzrT!r0s1bf Uw00%I`v3p{07*qoM6N<$f{m)aa{vGU literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/odf.png b/lib/images/fileicons/32x32/odf.png new file mode 100644 index 0000000000000000000000000000000000000000..8dd89eac608abe3d38636276201d6203d9244a77 GIT binary patch literal 951 zcmV;o14#UdP)R;MH5EMYahb>Y-EZ#PmQ2%xnjP!xydUf8 zLNp%7-DwdMBjunY8okGvO%gSS8yi)+uA?my>7?9QVFl*$lXHDZjUhFbmWKPdZnm|F zQPVWsZf}1Qb|vQV@^Ou&Ge~E$$YgV&;rqFd>sBNJ%d)|xsw&!}QH>=+3vgIAr%1zn zRJ`=4e*KDK(X6jTM=YkWL?{7%qMV}2!hLlCE|w50QQH%|ISrQhqd+#NLQyqocon$% z2L|{xu!tCM)b<1mfaYnQLLdgN9EGV`UK*Bg$}WCa{D3^q?*(Et0foY}yxy>p#keRx zoIswM8j7aN3Fvx3kj`f7Z;|Z(h!4Xld>k3WvDT+pw4)tMc1N-6Ob;$b zUSNo>rP67po+TwvFbqcQY(-TmK*O^)qu6w^7t0TJVY03$31EUve_9lgtObVirj}3#4OGVfv6BeQC2995ShQ;(M7H+?T z`CD#d@7agAa(94p=w4e+pk!H0UBskGoU(+b}pCdbqbzUu44>qT;_3p_nSMnCDZg%&5m?+-HUX0 zBOHz5&a{Y#k#f)(4&UX>CW)HEjg2Z@*U=UVby4oDdIje4lXHDej3Y6gl!p7bZnm|F zQPVWEcXT|icO~ZW@^OtPQ%I)LNToA%!}oI^*R4>L>Wbuh5M=kTr440qOvD=a~dr1SAld!g`#TG@G5W( z3=Z;ZU=cCisO$+A0L{}}Lm&dK427v$RvMOYiZ1?C{D3^qp9LZn0foY}tlqGZ#keTH zK7lMXH55&k6VUaXAel~A$tW2lk|~6G-XK2k0q;i=_%J$-W35lHXh#Q@><(ksnO6!3sp|tM7IMfN zI^8Sw0{1f2EGYpapBJdvEcBd?E3sjm4!uR}*(dQ%hepykA0EQyGtY6ae-u{15X4`O zh|Or*d6*_ooD(^D)07k721d_S>`e+Om=r`K9~%Z87xJ(RCM-hN4IIDv6pQIqEZlw@ z^S88P@7V{qa%Yfp=w4e+pkP@{Rm7x8oT7!2YYSY*;$tzU6dhYz9%9+PyV%z92z`TN zDEmdaX2Z5CIhI|N5}*cKP-(Uh_zqfbzQT$F_p#yV1MI)tk4w>axY09=jdaX=VduHW z;=i8bP_K9Z0q4jI6pN0)bzDpaC7kVii?v7lu&S6100l!pkD4ti66bQ-< zrR4jv0zspxUtno0hNjlmM#H(&6ZolqKlkH&jcd~vm?~W6Jo8Tk{+|_)7l=k@au59d zHz9o&&gfqO<<}O7c6Yn<)0s_qxf;Ze4_3~vCD2SPAePS{3u=8A%;t-1ID<6*`epPD X)*-OqbQ@7c00000NkvXXu0mjfd9S-2 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/odi.png b/lib/images/fileicons/32x32/odi.png new file mode 100644 index 0000000000000000000000000000000000000000..9a08a426ac1134f379a1f80bdcdc6a1820e6a544 GIT binary patch literal 944 zcmV;h15f;kP)WxCTR_bEoy@g zst3w8 z8_{?icm9f)7%2yx(db>yY?7!s+!$8rx{mfpq>FNAH7YQdpPcJ+Y8VsG^(*g!vY+Z%_-7w z9~Cb>s$agKSTyS^(HV;=EYXkvKT%FmW#PWM02NErSAzBgZ%%_H{wR>msZdl+8eRpi zfx$t34J;zY>$N?>0-$-CrxA#OD@S3fmY0SloU)6liXV{YnOY!L6Hq8j%j=b=SeOP|52P=tHhkCH)a4%L9r`iTkE)`HT zbh=mU1@2|)SyBQ*_#wnGAW2gJ~j+GE)`*yOjv}j8#sRTDHhYKSh)Q* z=5M)$y=Ncb%AG;Zp?hsPfs$o0brF*$amp4dt}SpKi;u;aQFLr=d5C5E?qXZZBlHc9 zq3W0Enho2ov#g2LeE9tV^d2%uHFBLf?39>V&dWJ9BwDaaHQ=GPDO@jVhM&AJ(A)fNf SGG?&=000021qG>@6dWHOn_%w#53;paIw5=zmUTT=1B$7LSpcfYxFTQUvPYGI_a^HHR$ z3*l%K59dTgjFf|paJZW@8zgEGH`c3kT}N9e)JeGuY86<_PtNrbf8e-%h)R4A$@4X*;% z;Ls4i1{M+HoywkI0nj{+vj{}Mm7y?I%Syu%PSM4miXV{Y`LjTzBA`&1meuPvvKSZT z*Cvpqrn;i(ass-Z6C~5=Dj6k%L^6d??|Z}tNAYPafzk0voN0NE75mz;>R=cLn)`4q z^a>+%Es;zz)hsE2oMA9xXDg~o0UBPso4}6q{aAav7wd@)Cwj5zWFIyX7g`5VEaZ?k zbh=mU1@2|4SyBQsJ#5X9e% ziOp!+d6*_ooD(^D)07k721d_S>`e+Om=r`K9~%Z87xJ(RCM-hN4V=C80xRiNEZ_S8 zOLyJJ;Y*Kk^WhNZ(7m>tK*6$@s)$LGI7JI3*A}>r#m8byDLQsHJ;9nI-PqIg6#YXJ zDEmdaX2Z5CIhI|N5}*cKP-(Uh_zs%xzQwv@J=k{oF^=9C!1d@y-02;`b~@(0u>bNi z@n6qzs8>9IfOF&pibY4@IxePy5-xRoz~}VRm?ViubnMI5%CZ4>@;6Z!>r&{0RLTH#K_E7Rma6NA(BFAxD zIf0TF2(HCGqwlQ(&-3wPs*G|F2&T#bzE1^wjz&K3!}os+=dhrhfL|)t70)Y43Iyf4 zQu2LSfuP>hF0eWlLqkhTz2V%s2~4Z$=VZ>$U4Uw)jO_V;Ch&i*fV@C7I@di=i@@K1 z6Vi9#y#5tX{_FzLt}d5;I=aI&lUq(Lx XGJ30jP*kIf00000NkvXXu0mjf716)& literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/ods.png b/lib/images/fileicons/32x32/ods.png new file mode 100644 index 0000000000000000000000000000000000000000..cf4a226ff601f342420df9305fb2d1cad3129655 GIT binary patch literal 955 zcmV;s14R6ZP)WxCTR_bEoy@g zsb5@O{o~lBjvy*r?KV9qpk|7v;{WS71IrIoH?3I1=MYX}FK;R(rb` zHBG~vj*h4GuEYXfKCba(3dvL&sdT1p_S3ciPmRWva18j_J*?ZsN+Oxpm8g&gvR zPWOtvz`aa0OG?1V=LKpu3q7afT5K3+L+=rL@kPATp^-E$hKI2A+)F&@AB9yg1o77+ zVl&!y9;V3?=R{84H01=ifzfjndy_&6CI!*R$A&@2g*@zn35(Em11GOP$5MI~i+A3| z!fki3|NJ9dyEn)=bgwNZP_QhfDq_+kPSHZiwFRzY@v#_FijM6qkFnywee7s?g1*5q zl>H)Ivtiqn9Lp|B2~dMAs5Dy$d9IfOF&pibY4@IxZ%H63%zN$NJ-a*l;5Li$1}|lW}Z17013yujqakuIqB& zbjS&~jwi4w^g{R}wzTx)#>3CZnMI5$CLX`d;BI^j$J*ZEOlXKE_E7Rma6NAdoZ~pI zoIuG71ear<(fdY$=lS?CQARlk1QX=|-zNe-MnA;Frn`#q&y%0ztW< zlzd-SAZRr83oMVt(A3)6XgGIf0+Va%x$5~E*Jds-UAWA7=Kl&Xlj^?H`1(002ovPDHLkV1ndW!oUCk literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/odt.png b/lib/images/fileicons/32x32/odt.png new file mode 100644 index 0000000000000000000000000000000000000000..1eae19cc757b761b97fd5fd4a0edea1818e333c3 GIT binary patch literal 949 zcmV;m14{gfP)WxCTR_bEoy@g zs>#89S+~;%od57$BoS@UDweW3iVL#oJIxa^OJLZO-v#&nUse6xNdcJ zic!-v-0A9i+UQCw;N|0*Os0@brIAW!8iuduKCauL5G>0Em#V7h3Wqh8Xjp*5(iue> z?xW(RNBP?~Ppa_;LT~UL|uV&Munnk((o#9 z4Gj0Bb2WU5(G0y)EA#LiY!l>#(8e>;IKrw6d|a359^YmW3`-O+xmCC+pVp;*Wv zZ|HQb*bCgtRI{W6jC@|8X0y<9Iptu3~ReNWr8a8hLIQG%w^~7fe`$t{XUc{W+G>t604A zE*5UPgZ<|p;o7}n&Y^2+Y<~7 zPoV4<>6{JQuH;yDQA&UsY(b^jLf|`SyY&XE4n4%CL9K}Kj3EHC^pla_rmTA zPsM*d$Dv;F00PdD7bq4Tf$O-K3Q9QN{T}O&4`9QI_%8+o8&Afu=~Nv1F1@1bUAV5x zeSbnuz;!%{;A1rMaUZ__M>vNCXZ5du@~0Pw_V&8;)0s_qxtc}wgO&5A6KEwC5i4hrMbmv3%;l48IE%E_ei{7) XvkImjTWap)00000NkvXXu0mjf3Le4k literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/ogg.png b/lib/images/fileicons/32x32/ogg.png new file mode 100644 index 0000000000000000000000000000000000000000..d7b0553f65b2da51a1c946e4f77df0fadb0c4344 GIT binary patch literal 885 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0V4M`-6XFWw;sQ&TFJHB0&D!>MD-1%dp6f`*2M#>U3(?(UwRp5ETx zsZ*y;n>KCw3=o((Yu22(bLY;Rw`l3o#Y>kiS-u?Tu+?kVu3iU3>(;DW2Xx`u4I8#? z-M(YTj$OO<95}H501zBJbmZvqQ>RZ~zH;T>{Rj6SJbdu*(ZffNA3c8Z_{r19Po6z_ z`s~TG=TCv?`HN>j@chMdAb9ce`OB9tp1*wY;^m8%uU>+{tCz3dynOxo6$rg~_4@7W zH$d?A&D*!{-hFuY9tb|X{{TcEKYaM~@#CjYA3uNk1Vmpx1JUO%U%q_(^6lG~@87laT78oUhB|(0{ z3`{IM0wQ7tPU|;rJ^1wb>(6%Aj?V!`U8ARqV@SoV((~;>ha3bN9!eX9#R83_O)88M=(+KTDC( z6@_f3Io>mbj~$r4zRp>_$-8WIig?7~4RI$HIebenx)JApApF3p#%k8$X5P5N0vbv6 z&8hm&8d+DLwc-+*&T}lW)LF55&%e2Q7a!&h=-8E#&~Cc_Q_i`w{CrzWx&GMQ+>;RA zocn6erkz_iFTb9&N9nW}U)jp&#Y?yE-n;c^#q=8m1rB>TOJik~4|j{|ck;3y51F(4 z{U!@ZM;Vrt>w|thvp->R)Ul)DKZ^!`tC}=xaOtB5JnVu=s}>#$k?oW?!(4kv_-1gE z#=<);i}&ojpA*1WAfP;Dc0|sueXHuM3JW@$tCN;_X3W|f9{cz~;9*|Ad8RfG9(Zzd zWqEJ8vW$(vLH)u{^MJgQ&KG9tF?jf$W$>5j$gFGrA#8E!5BG8Z0G-Zn|6NvENEZCc l$*t;R(^-D`*v2Q{q{Td6E?Ut#bprb0y7{-a&M?dU?@h_NPh8f6tv~<{jh@0bp#<&AcQ9lSK%MOcd3uA0D55|bgblABM zOvIKRN{w!QoWd|JVBB2X+%gW79-y@J-0I}=xnlC9Z!+HWB_&?TmA5a?eP7S-z2B!K z&CAdRo5S&)&FO^IZpZMNYy+<%2NtV!gqe97^e7v1CBNT~!J#3C$bBSRfXDdc)cvVx zOij;dHv6bcgM*;FUN62jo3Ca&iN`rUYILoehJvjx2dVvF`PKj4WqFZ-&ibou(Eopxk0(kJy+d#N{hL;QbFi z#I9Ytv3YYonwwkDDS%2#%5nY+6B5Z3e!F=~tnWc29K~wl19G3$0cYhbQ%L^zeDZ~E#2L#CPV*OXt*3`)yJ_N=5 ztN?sIzw}Ztgm5H^Xe^FcJb`#3iDW8`zy5xJe^vmBn|y!y3i>`hi@mL{z+kAx@URs! z$LrSy;P)>`A3xrOva$+n-Ks-nr5+U(l_)Q-1V8Kb1|CRZ1FEZysHu4dwY7EFw#~?1 zg*5>zEG|kH6_tQ;I7Toqa0$_9Y?XT#cux_My&2X9uowtP7Zf}N>c^i(MX(Ng_O^nr zV|45qry}pUURqj?iHS)R7ndqB0!vGp0N5a1C;-NHRnF>XOAL7 zGe9^Tk|w9MngF7anDnMiPvE1E`_OZ`7d`KuQ8Q~; z%N|8WBofsI5RWCLJKyPqu2Khsz6ypaRkMb*>``R!tEveg5l`jRu~=LqKr)q6#}f&y z0LffCdjMCp3;lWhxi)jx29TlE{w~)ZQnO|NwLp1Q`hNh(lse@4P9TQ>cKce+fC`Wj zfcdHb{9U-7-vZ{V0@$6-sLkOZDaVy7%O9-FR|D86TqtZ@M;EI7F4(|D60W0}&wZr+ Y1wa(QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*zWRlaSW+o%A#&_&%e!9Qr_9}4dwMyAm{NdO3X-p58v{fGI`Iqs> zo!u(ta)P&D@6B@$yM@=XygwPRt$)ta4#LZ#{9w?y@`dk z+BcV;etB=sq;BQNya-OF8(%aseZF1aHh%_#?n4_}nd3*lTt9ZQ(!0Q+tNY^H_mdxM z&o)$Jw-dLSpmXonx6kkTXU1%La&W7XPTh_Pc6p^W*L@CbXZ?D-R`C6iYtwt8CmY-q zcy6^(wZh?Ut=F8Y4Q(H8_O5(cv$N4m=@<7>w_i=BEph#G+*&TW89hA9aqCU&TGj*x z5rY+Ktd%Z5w@O?QmU8;0fAs(NZ>*oD*f^bt44vS`@sqJ@O}u4W|2j?GBmCZu{`WVE gT@G@H=+^qcANPM=?zaV!RiKRL>FVdQ&MBb@0Jn$h-~a#s literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/pdf.png b/lib/images/fileicons/32x32/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..09ae62e6ab3063f8de6093a12f56d01a581cfdae GIT binary patch literal 1003 zcmV0-d((xvVs`UjY3c4jdeS3yKwIG_eyDABkWP&W|=#Z3?b3dXUS*xl1c z!zeybmu4lx7#-8ok9zd&dUrjly65qEKMD$`sqXZR(+7SOb8ek;e|4&g={oYCI9gj@ zzg}xJP_5VTS|G-wW$sE^MR|o*0L@@~= z1RqX|61NrTY6f(}EQK3wa?@AeLid#m*pwo?|6HR8gK_?Ch|_1Wr5nsqU}7D`80r6QeG9_# z(Z75J_A@U+jE1mYegoFIHzCp#A_yRS;zP(9VdVm@>#GU4o_7Gpb#oCO<)+Sk55aDA zU}q_8?8ABZ6r4w&g#FI@Im;JefAU48@MMHkpM{2d@YV85lN>(5jBA%&Ir;h zLk4i{@J>8|VUi%*-CnB#IAK_MaxOAUQ61Y>phC_FZt4i!_`g3*%o# Z{{lk~wk(#VW<&r0002ovPDHLkV1iv=$OZra literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/php.png b/lib/images/fileicons/32x32/php.png new file mode 100644 index 0000000000000000000000000000000000000000..1f4cabf6f491c0401f7745b6c2aea78e61c31b84 GIT binary patch literal 952 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*q-R=;uuoFnA?9oOE^%ZeSh&g-!-|)Y69X(nvah83YzCF;ZG2~)1iOS z_j_#m^K;V$N*=rY=6K|{Nz8Mmk9=W-a>CdF!6L@fMNVSh zizXVd+<9F4s-|+&iLlBGXRO^@D_&ncc=2-a?1c)P>-V|XTHUt16DF*4BD+)k$)%U? z9!{Iq^pF2U!nWco!M7O;`nWp(bv~*1|De)HadDqkdU;Od)Av@rSHJw;D}TBxVd|RBMALn* zo_#+3ms_!`W4&L2!c znEUHxTUUvbbAiL8-4Y%}6S5Cg&kVTmv!FSoTVkCMt5rymuLRGEpzaeU7rQ>>_;6Q; z`xv+#FkGB`?ReH=fgi7oi{s3(o}m2a>FVdQ&MBb@0M~@|W&i*H literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/pl.png b/lib/images/fileicons/32x32/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..038e9f3a72fd789e18f6c01031b25f04e852ce28 GIT binary patch literal 936 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*lzT6aSW+o%suCrE$k?A;N$;2Gh4#e-f%eLt+|NZR^;O&*S`#57x^!F zzqfq;%#(G0(*wsnEp;p()hxNC1X(!M)^6N7vvNI4nfc*&|HQu;e15!_Q(?A#$VsE; z_VcEyGv4{^er5OHPiM3gj*0t+?J~b*U-Q@B`@xh4En1}~YMwuM8?Vdofa$f$qji4e z{P%RWFeyD@ipk$s{Nt62_XFF=Q{N_T{!;S4mXYV<6J5CtTAZpMgbsg~aQ^6fD39m# z?3>EFODyk32b5ImtQNlJz%W}@wfE$|+uw|Z7cic?{Ma+*+`pVTbIco4l`s_R>*4;iJu<7?V&Mi!h*DQmYCh(p(-tx)3s>nH0r7ncQ_OC5 Y6E98qlVb3w5tQFNUHx3vIVCg!0NOC>x&QzG literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/png.png b/lib/images/fileicons/32x32/png.png new file mode 100644 index 0000000000000000000000000000000000000000..e3ea1c3a046f456b335cfe718f7269f2217cadc9 GIT binary patch literal 877 zcmV-z1CsoSP)T$YaM?zRR#RRo%E z(t;8#Eg$xH@21nuJ^1kI+d0>{`pw+-i>(76&d%j`&hK-7yMx`5KVrY)aP%uqCv0{* z`u+(;&ol?UHrs2SSt1b!xUoTz9(_0FD2mic;WH-;Pv_QhSzf+$195kkw_FAs;a_jvuP}mw*U|G`2*5$9|a#h zHn+AA4zHw7qE}G@ERmN0-;qC{%EEnV0S=bnlSn-i{BSO_L{0&pUqwLGq~TNG7@wHn zuYpDM+?9GJNC32tA&YuJ>Ym2=i>^E^q; z?wTPdupABxn12F2G}yAk0?_LP?sXo-gKi@pTF!CSYpaI@=foM|l@%!gZV<360ya0G zq_BGcrypqOzlPf9hjFv>1ZTZ=_`&Oi{?*l}oWN=%BEUljRA5m1%}@{+4g>GvK>L+a z&U!sS*Bt?IMkKl>B|r^Pf%^C5Xd0xF)4fwi@m zz+LBg)b&@uG*BrrNDNoO^!5^Gu6Z4=&zvDA5RWAUuG05gZ9avX7slOmrQw>_@p_>@ z7K_UXBoiA2B_2=639KhK3rZr9loZ(5EGWtKbyv28Jb-rf}o(x z6L1cwQEP9#A4s^p?h6F@JjgzkmjS;2gN-1a-Q8S1zk|c+!dY!=?%Q}<|Y}7@{387*M`dPhshr$Dp*m9x@hHn{4^_UdPX%jP`pT$z)V3;E*k#E`Ik>HMCzBYLCRl`0#11=dxX2~+cG ze6BtjtP7zM?+)==T1d%u+D}zFNku#rO2=Io$v<99Duzj_OULOt967OqT$?C@@d~Nq zGIBOz;C*Wo<&Cn;(DtGxyG@7|4NnbK zZ1@lxlNZN)o?;>89%Nl47^^2}*DK@rqrroMBePGd3whA9RK@R)?l;xrJxucCwCzfy zq?n%sCmrqQ9zIBq-}RLdR0F;K^hzP6wx`4t#J7##-Z9L!(FiL^MenGovekU~sGx|S zygvCWoH-icSH1!ZmkP#_o1^E4MKbE6chqwmKI14d-*a))OB)|v-Y-vd)y{eEJVr@X z0y@1Vpl@X25K-0`Tr)7dycldr>dYqh3YmYJ@^_XJh^Hq*mi^eb7><(@*Jsu)BQqll J=A{?j`wPIa#_Rw9 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/pptx.png b/lib/images/fileicons/32x32/pptx.png new file mode 100644 index 0000000000000000000000000000000000000000..b57b09173ef14ed6dd46872779e4c44c9f0123f2 GIT binary patch literal 866 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U~CKU32_B-ae<}Fm#n2{ z#ec0+|7N4Wt!B|%En>HNjqh|S-04!f+ro3NQ|#XT2lu-r?>~6>V1n|4hmRh1^F3Ui z^6=5)M-wC;O_YB0_{rl5l8+}!KYsG`@snpyo<4i>?D^Bl!cT$Z^B2$7W@YH4+J0He*mJ7AC|~} zT&@4{lX8`U%r3+_U+r(AK$)z z|MvaIkLQ> ze!&b(EIa}tVg^p@H*P)n^!e-0cGr&20Y+Dqr;B4q#jVoI?EZ%wWZDYXbX141>KqL$ zXsUkS_$aP}`}@5|VR!c3zhhlg^uOho_pK+n^I|S7*&3nawe9xOK-F3EmPRZIk@dW0 z6r3{QnbUoStL;fTPfr-gb%*Va}3z@7GD?N z9)8hVLS2UUoP@rR)(^X-2W2m3PT@{fu9<)N!NDWEyz_kSTz+tohm$MRxYdYZ@v2XJ zqB;#cKScPC9$o&EQ|UpuREK-dOU|gG1NuLGcm1#A{vIE&Ap2a(tT+Xx?5eh%B_HE8 g!e(1)|KD84xTopbU8!3J{GgoT>FVdQ&MBb@0GgZ2i2wiq literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/ps.png b/lib/images/fileicons/32x32/ps.png new file mode 100644 index 0000000000000000000000000000000000000000..523a0be30cd36c442c115ce8494aff2f46b09434 GIT binary patch literal 996 zcmZ{jdrX^U6o& zOMy=1vP&jmlyd0}O5G^8iqJBk9RYR7xc5p6{n~!LKsUe_|M$sr&U@bfe#yyU!lW}k z2agK8mI8t>qi_N_7JUB?E|1s2=LD!V#bU9ms@QBGySlo%hVxTxO$~=r%K_Z_rM|ANzP_%Z@owYod(978 zo4MQvTy6`G2U2l)?H~-u*2x!j3Iv@(ppXv`i1|XHK(LotAQpp3C=`lBqHgIUiA2&P zkw~S|-=xxqz5S151HF9%z5PQnnQU-qXmDtFNG=~49UD=OjVi{JkH^O+CdMaJlWO&o zsp;vNzn(2F%`Ys@FD@-EEiWyvEU&DttZG&@T8&nx(dxB2y;g6~0S!hyz+f~0jB7^2 znh|uPX>AXa$!s>S12)z-fR=R&5ZSOG7K_z_AQr@iAXdZ*wApNSyA8G5Q9FvFb_a?& z91f?`;dZ)QF6XAp?RL30H@CKSc6N7m_aM*oe+jnepO;8F4`FfMhwz6(qeWfP-*pBv z8u_>K9@zE(F(!&!fXPv-sOO{ba@%gWTd(kx!&%lp;6E?F%?ewXotFJ@ERxpL`7OQ# zC%Jib>iSLkQLj=cASrj{28_qcjHh3~uy~Hvb)wv%_ILRH?7Q_r`e9TvNsKz9)`l|@ z&ORyjh2o<0>Q_(pPJQGDD=)ppIAKZdFEQ7mpM6KB%e^z7>Jfe)7HWoiB3|nL9{(; z7zqVUcag{j#lx;QLu!|hq;sv?niS%P-F_Ez9@E5p@aLYV*(oeAqO6i-ZdiSAvp`iS$v?wRQkrb)Y7520YkC^lF?CTvfX##d;kD>$)1?_od2g<$44A9ECnPeQ2J<7HdekmO4$Yn=C;sb(jVy2%Ko5a8$v zLfig}Ve*DTah_~7h!h|1mAk<6R(*wmEA@fa0Q;xxLU-M%TYI-kj3vbgqc79{1!)^7 A_y7O^ literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/py.png b/lib/images/fileicons/32x32/py.png new file mode 100644 index 0000000000000000000000000000000000000000..ae6e06ad5d30e2ffb2854811a77103db66bb7016 GIT binary patch literal 942 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*lzc9aSW+o%ssa;OT|_=dIIyhUGkMehZC}r@WHfC4QXwOL+5YwMblwLIBI1j8+pD`@ zH%s#2tKs`26tU;?LSib4wWC&z_~8=7 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/rar.png b/lib/images/fileicons/32x32/rar.png new file mode 100644 index 0000000000000000000000000000000000000000..5b1cfcbee33ddea026821fd86cf0b6182fa3f372 GIT binary patch literal 914 zcmV;D18w|?P)Cl{tgWxFrm3l_t*xo7tgWxFuCTC~W&on4 zrK6>#q^GB)r>Co}t*frBtFErBuCA@GudT4KvW!5xggC>DJ;aSZ#f?46%gfA;HqDMQ z&5kq8jx^1VHO-GT&W|?FkvY$jIna_h(3L^bpH5{%-lj?3 z-{9Zi;oz%M;Njxot5D&tRN>;|;^XAwuvO#a<>Tb$@*E<>%<;txD$R z=H}<<=jZ3==;`RPPw40A=;-O`>FMd|>gwz3>+J08tUTP@U= z(3AA^_4V}k_4fAm_4xMp_xAVr_rFv3#9#NsVEDvc`1$$y#9jKvUi-^w``xAc;k5ha z#Qe)>{MnEE+nW8%X#LG;|I%;&)N%jSa{t$M|JZc@*mnQfi2vV&|NsA|#~-Hv000qm zQchC<0t5^Y6c#W-ud%hk<>%}3KGw&a0004%Nkl@H3!5(5?-Qp1GB&2|60tl|j*$1#L_f%4Pp@9mvsa$^v!`s99vZ*NY}4cD;%NjpVjMT8mw z1Mm_C@W3#E2at5B7_gAn01`EjlmJm~k`jS6fhnnCz{DO|JGi@5{MO>Kz2q#c!~}xB zu>rPAXi~cdVHp6~`X?LRVF3L%o2j4S-3FP^==*;Yw6P~Jn#U1v^io;#tiNkeN+uNk o#Hy@;`mCU7qBQt#3H1ZM0TVHioiRr%_W%F@07*qoM6N<$f<+(oNB{r; literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/rb.png b/lib/images/fileicons/32x32/rb.png new file mode 100644 index 0000000000000000000000000000000000000000..398f2080277af9f712be686f4de59da159e6cb9f GIT binary patch literal 936 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabRA=0U_2V&6XFWw;sQ&TFJHB0&D!QsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*lzT6aSW+ooO{mxw6LSV@sIb<{AhUHBzxbcyX=ks5N*bgpq+L!lI}-KR<9f`ktCGT3 zV>l%koW2Vx88(O=NRLuj|LrN;k`0R{b9~xy_ySYLcERw7g&M~ND~#P;|E^|C@nz^a zJX5^+OPvv4y6TKS=Fevw5bRPfV9PO6_Cl{tgWxFrm3l_t*xo7tgWxFuCTC~W&on4 zrK6>#q^GB)r>Co}t*frBtFErBuCA@GudT4KvW!5xggC>DJ;aSZ#f?46%gfA;HqDMQ z&5kq8jx^1VHO-GT&W|?FkvY$jIna_h(3L^bpH5{%-lj?3 z-{9Zi;oz%M;Njxot5D&tRN>;|;^XAwuvO#a<>Tb$@*E<>%<;txD$R z=H}<<=jZ3==;`RPPw40A=;-O`>FMd|>gwz3>+J08tUTP@U= z(3AA^_4V}k_4fAm_4xMp_xAVr_rFv3#9#NsVEDvc`1$$y#9jKvUi-^w``xAc;k5ha z#Qe)>{MnEE+nW8%X#LG;|I%;&)N%jSa{t$M|JZc@*mnQfi2vV&|NsA|#~-Hv000qm zQchC<0t5^Y6c#W-ud%hk<>%}3KGw&a0004-Nkl6y%6u|NSIrlwNQ^6LC zpbdgJgrc}P3Pq8+3+{s8UjNs6#Sf4zM7H|7@{oO&v@{rJ*h`oL=g^Giq zlX7x!_Serd*V#Q-S$?@XDGzTYk6a+Ie|}A6cZ<$li-T_+7Qg{0eCe+7X1{Zfomb~> zUmFZAk^+J8)$OmB?whe8Z=YY-=t~Z&(d8?A#t^z)8&y&`@M%AaBkK4Qs%46h0kK8# zvt}lqX(yFoxD(#4;qNQYSC|(@m!HGgc25ypN z4*Vxi6Yy-voE9C_Z2~=?J)oHm>V3Vc=Ty|zfuHF4>}}Q`^DorZ0urEPHBcRd>BbNE uBsdthTM_a!jv5gEkC~gr2B6F>*5DX^@{}g(vnu%j0000Aw<*GU^?wh~dpYOFIWLE|yPSLj6&w?cKp;@0 zVgd!6iKi}0s$lxvbbCx1aZ&qut;d!!J;1PU(C-@z`)3%9CX?v^U_LOLEf$-_3b0vi zK)c=UaM+y=htuhBIh`(->+sO!Idr?-hhDeG>hvaO-tX0MFx{IZLO~VXZ&=Y>$*2okq9rLUlJBxy*#-ZXC34ZXQi)ic z+oMF!|FQbQw@JOv=r1-0>Kogpj?X{5wCpCH~h#0xo5u;z3u@EUGWto|XksBD4CJ8%!TaZG#=o zRNisu;>aqR(n2%0^9EZPIrl<43Z=~Bk8q>0=8J0ML$|-C7#r7=)3j0OOnt)X{eU4gT4$*59EZOXye)#r2LRD6cTlSx<8rwh*ipe9e@ z5#J8op{&&3P0OU~=}akZH5Rpyo!4YrE@E&da5-TJW0|3>T8*>XLfT%P_~w^70t5-# x&J*H7f;aPhYr~iVjkRV?R2$DtYBfWIlVhX``L*xbQHQsH$LA#`7AAv0acXK=T3UHp&!()btkTlbn(Er7rlz*Gw$9GJ-k#nG{S&86 zn?7sy?78#iEm*j4(bA=hmo8lb1k0BLeY9-(@)avqu3EJk=(W{r*REa%MC*V)TeEH* z(5GuRY}mPL_x}C+j~+dG^5n@=KyVra&YnGc>C&ZZ*RI{Zef!Rxd-v`?xPR~AeIR)7 z@WI1J4<9{#^zg}}$4?#u!IP(tpFDf=^x2bV&z}MTkbM5)84x^w@f-+VynONe<%<_D z!Qd4Lyng-q&6_u`-@SSB_RZV3@7{fQ_Z|p7y#D}1A3uKl^y%a0PoF-2{`BSZ=PzHr zeEs_6``2&ZzJ2}i?fds{-+%o0`Sbt(|Hq6LO8{e0uq4PYn1P9fM?gf(z-j%)tp}ez zfBo6++VMHS*lzQ5aSW+o%spqAJ=sy>z{mf#<(zAyHa2#6Yc6W$bB&3)!k-}eS0Q#+ z`MYOJn&KS`1g2l;SICFUEDckfnjSYv;Brc&v@ zzcb&m6!^<;xO4V-dKY7$U1is$xd-3&)-osxO?xTj3v=_W49+)t=wmSi5u>(!OVSH8JWN*7O=~xv!CP++cqk z&&{Q$U!LpP*6o~G#=y+<;)%x78DG}t*#$Cc70i?CdsOo&`|XoGOne@Nc6GRj0?XDf4!@$63<>}%WQo&ezo;$e7LEu2) zE|2Q;r9u~9&h6~?*|KTVr88SzOtii8{(tN(iI&oc-paa$F)_h&#W_}lNQgZ6r1tZ*gCgHMiR~sYlw+Nx^ey;) zcd&hzk>Z)KX5lKi7g<|%3gs^)oTylGki+tLs-@MXsM8aZAOG`dRzDW=Ksox+>Av?K znZGOLFFxq~=+(@5Dta>W@r`RcQ*VpCdvEe1spi6i_K%*;`FxzOcF*}$!@!YlFhgMv z=RtX~xgY8q5&{<(Fo?`;{>Nm>ttD|p;aArwofA7&O;~crM`Fgy(70PBOox0v`ZW62 YGrHJM^={p!A_+=gp00i_>zopr0HIQ0y#N3J literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/svg.png b/lib/images/fileicons/32x32/svg.png new file mode 100644 index 0000000000000000000000000000000000000000..81a3644ff9e4647d7efbfaa5716c9c59537b3324 GIT binary patch literal 980 zcmV;_11tQAP)L1{%C?ateDNA@o`!QSyt}l- zYfDS}2HBFM-ujXE@HROB+LI3!|_h(p4L)b3qgSUXAT-@7DjSa2ZY;Ip?xMd}0lYB|L1 zQ|rVP#0)H$0c!=yf_C*5Ep-H{w@73^!E*sG;A4WE!gqlZ-^d6&Cy-WF=Jq~mHju1m+&)SeVc#`^Pu zJz_2bPOKmGa5xs&3Npv9(QNM0Y}aWvcgY;Tw)fsgK&2}e&N84?XKl5Xx z<`tfSz(Vz14=)ZX7>Q_5UHIY^>a{Ltjn>fWdHa0KMPPet6DQt4!fGl0MrMphr`PcL zFcYpfV>IAj=*tf(%mZz_`7|&ugegUc;&2I=X$j1DB|Yevjzr+`<2TsY_?g2-E|&*B zjhcZzmY4mRC>Dj~WkazjzB$AHVe@C&hC#fzcD}plHM1A7m4DFNg)&dcEg;o<4f)v(O9V9F2gUCx}p= zbd($c7J;Mue|QS4jeZwMARFo6z5S5U1?r<8s?PukCw4|uL}PUT0000 z$!}X#6vm@cpi&8h(t!?`bS7zN+%z4M4rvPf0W7L+x?llF5ers8fdvAIB@zn+RFzmz zLX=`Vrh*-W7IyWj>KIS)^d?Ww_VbMGk8`eN%ZiBOSJ|KR>0RA>&pE$)-nHb{*P`|I zg@xbkPA6;*2Yz`h+r^Xe;JVHBE9dMpp=UU-ThcTQvvYF`ly_aH0Gs*bEdO!<%YmS2 za~$j1>?~M{qTuKG`CFZKVk@_g6$pk9422O2M>;m|=Q!3+b92!36j-t>W8P*{7@}hU zP8Ng!gFvo}%Ke7G?98=fv7w+DqcrqgW~-9#1qoaouj07@{Kp zK2b!H;r4jprou~<{1Fuj{P`EM@4XL;$S4Q>dIdkILEC>OM7%>WR~+jgBMs*%x5lcDeX9 zFo<~mSicht0ID<42EYzhgo?{_;$`ZDkBTQh{}PoW$5Eb~LWzo(sBr1@G)gDWphWYf zSI1Bq8AEy4ihsZQ8moy9$aPi+u-5@3Dz2y+0?{a>TmPUmbQp!>r;wjGi#$Q(sc@dU zkvlet%FVygP=06>g#(8WUc3pvsy6d*H(8XwGXRx>*x`%;{hb+P4rM|m&Da4hF&*c?DC9v6=D_(cn1R5V8IjnQ4uUfP4)_gBFx-1rT-@2;S5Z5GkJ zuON2F%6mmjyfsfEVGe);*hv7&rfpEEy~_S!$U6oRn|d8W)heWcEs*K7%I*VD>9wc? zsM0=;Nw(%mrpy5(bzL|EK)v)9q@9C^?06Y@hZ7B{({DhcZpZ{D)6JI&K&Ik6$1$0f zJbEf^3V;Gq!bY_M-Q_}XW3+^%l9`N7Kh+W`!at>p7P nw6)!L!Fpa~!XA2H<(JWahTYr;vxTg000000NkvXXu0mjfc3d$& literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/sxc.png b/lib/images/fileicons/32x32/sxc.png new file mode 100644 index 0000000000000000000000000000000000000000..cc45ffa8e545ff9675ed306482a9f827b74c6dcf GIT binary patch literal 964 zcmV;#13UbQP)C7fw zC{1Y1QY)z@w6unXHYRR%cRqG@W_G@3wo!OI4_OvjlFgnl`@)aI%$)a`-<&xKJ0t(A zed_e|Wp!o-O0kHGdqM?Ak%K8kxx~y7iF%Zcd6i{Zm?#vcMeZYm3OvRqXZ>B-KxLyU z4f|N5|4BFSR2(EsHRiLgJ&<#@> zt^#XuX^F3aA{=pcYfn%B;y$B&1XQpz5oVYTX($l}5q2s*An&uYfU1I}i!ifck`idzHW4@FW;8^Ai5s`qap>!L9QbS&F9=@zd=@W%F^87~$IdJw zXf@&3mYBP>7uZWWS#kol95a`wm=}H*SJCj_b+^uz^_3Eqhmlv|JG+MjqR?IBq%cTP{3-W!X6T;|)A5 zUd5B|T)-1=p2tTguHy8?CFY2^zMMeI^GH|36*mb34@u;MM4<;BbFAqW-Wt1x=RUrK zx5s|L{L(twX&|oo@cpeE&ky7TJl`jsW)E2!V(i>4Jpbtx96Wp#pZu_Z?~8xp?Cc6& z7suQS@1493{?`jb(c5_d!W?OVAP7OCFv4b*;KbBjymELRuO2CPmb;yA^>n{BkS3}myN;h)Wn=fueKDbjR%m_tD+fi!97 zN*pJW0$Dp(k~EbS$ns`zfoDr4jEs-x4RiM<&|95zy>t4^-ha4*}+u!gw;J4y^q zpcmF~SD;wr#QyJd?|WeP--P@w9OhpE^ZN=EXJ#V)bfzhnD=(PGT;}%^7!~Xn92g?| m`+XPe<3$<{kD}S0000vhot^v4HVR+Qmko;y$#%{%`-2aMx%|H8GiT1i&Yu6( z-onhxrNZni^2H)93`GGPWe%qE`HReyq^?KVm{kcOFqzBE$lOQL3OvRqXZ>B-L}jz8 z4EtDTCnv!&3E3v&NxH(NqJXE0G(4pyu zGF%1L((*E214TIEOm9z60CJwO0RjcE8Zt~bn#xeZbA9Yqd_c~#yFj5Qpvf?!DKZ-= z#$tXdfo4-=iy_nmglG{|>-9bjt$|9lhTPn3l$Y+|?pg)+);Do@;#WNN?i8N+AdmNt z&EsV523F;@O0`P*SxN#e(Ya`f~P z+)fK^Q$UE`USKcT&QcRF+ie29*@S2boGPv2o7^3ge*25>6f0|We4Agv8^>e*W|q+`h-Ir7*v<#DGCr(?mE2w~#LkJs_E zd=*c=a~@B;c@7^Pzk*X2mYE~(b<_kpwoUpXmYl?MZG^r<;CnWYIijWsyfuCm&wYFm zZ;$_ih2;%&BUfH?;5fY;+i}$dY{wzn%{Jo5!}!^oc>dGNIB@6+KKWr0-xvSHnYmTG zE|0kv-aBy(w(Y?4WG^3}2XoW~T-PJ;Js(?fh~v|D@XDbDyn492%>uz|N6I+xRT&?C z_d8tIhwuCB+X*!R-wOyF8G0gr7YD}|@zdq|Xjv}SH49g7HE_PXfiF+r#?jmgd_O=K zh46zQ33K3izM4Q7!~`cx_c4D{Ll8vxcdLtT920DHWBjuf^PC)cK0*}j2y-Z?CJ=?) zObLQeQ6TPSN*G0|0&&))7kIW*!k&qV%wg_O0*UIMOWwmVSwjmXf_Ee-Ge|6}71&K; zv;xV%(XK$T*cTY^PKVwD%pWMg@4`|33Yb4opg240^RF{axm;PnJmxZgkieK^pJe|C n**ECBU@tGyaDFg$5 zC{1Y1QY)z@w6unXHYRR%cRqG@W_G@3wo!OI54$X~w3|8U>X8!eD<+^E)?Lp9$31rV@gpBN@Nyb zSVPsMVINCuJv#U9!M2_LPD~ez8YMCb@QGASmxXgu zxC^YMDGig3iK?wOzf#5!X`1d3p(B1|`$(oiDsLp-SXfL!On0>!R?Cc=!SncGM) z7V|R+G(}Uc7^a+nX|@PzjYc0;Q&FweQJA}l%F-R&UaR8H`X&xe{EDaEox(F8D0u(K zJdPKxVO89#)@r1mB_+_ZEFu==Vbn!{fvYz*u>b1??EP#GF9=@zd=4*vF^`u7hfglS zZ?|AurkLA33+yGmEI9$owh8oR6K2cAiSjDGDcnN&x4-yKv9i{{x5^6MIC2da7T4jn zErQA)YdnnbJR6R~gcL8n1(4ScRj}`?3O@Yq zcQHRi7>4Y-A94a=5P^6i^q6uR`^OjY)5W`JIX>1k2bXWCI9u7kmnU!HaA5^u7$Ht# zgi(Y+m=gq{oIo6NJ9zV3$Ro10Xfgk0+oS)D#G-RQP@Z^ z7V~onbVO63=!TqtVRQ+a?RJWyDrhuYD9znOed!KvuQhOIeG>;Ke#KMoPT`pk%6R|C zJdT&HVO3mfG@B&Nk`m~eCJ~czGioA0$JHAf*#Gqc_I@^p7X&YUK8KgTn8!Bacl}9QQ1^JsXa|Fiaf!@hYAc zuj0vf&ffCqFFW`|6)KHMfe_ z#WDB7d&jQ8aa{Pm=;Z?pV2-?i=lLLkA7CqqaCG_>UOBLUR}a>=Spa$MP#yces^i1& zei!!#2!eop4?<2L@Iw$+gdQv3#{Tg|{B-dyy0(XP)yCx;3eMIy@a4&yI9ysm5QK>0 z2tgPk3v+xwkQ0c)1mt+_F6OVR2*VivZuQYm5|FKaf`7IWo)aU_$B5$x!W;_93B*yq zP{J^h6iE7o62-BsKvFdM1)i71%*y zgaR2@qhEn)H5JHI?k8tu|4s!S_M4F3g`@m0VE#~n>g;U5pUyPpauo&hn9KZO0%L+b qg1sYT&#>=;-MmP{5i*wjGWrkJ@T-6HCxCPS0000Cl{tgWxFrm3l_t*xo7tgWxFuCTC~W&on4 zrK6>#q^GB)r>Co}t*frBtFErBuCA@GudT4KvW!5xggC>DJ;aSZ#f?46%gfA;HqDMQ z&5kq8jx^1VHO-GT&W|?FkvY$jIna_h(3L^bpH5{%-lj?3 z-{9Zi;oz%M;Njxot5D&tRN>;|;^XAwuvO#a<>Tb$@*E<>%<;txD$R z=H}<<=jZ3==;`RPPw40A=;-O`>FMd|>gwz3>+J08tUTP@U= z(3AA^_4V}k_4fAm_4xMp_xAVr_rFv3#9#NsVEDvc`1$$y#9jKvUi-^w``xAc;k5ha z#Qe)>{MnEE+nW8%X#LG;|I%;&)N%jSa{t$M|JZc@*mnQfi2vV&|NsA|#~-Hv000qm zQchC<0t5^Y6c#W-ud%hk<>%}3KGw&a0004%Nkl4e-6u|NSd$a4si(rC5 z&>VtT96_Y{+t-oGLVz^X|}sP@flEOQ%Le#j~*0n#}YeZBpEC*Sk2%3w)P3eiO1qw4?m1*;ArK(7UGVGzq~hvN(4cR zyx2eeAAImG(kDOc!`fVLcj0hQnCo*>EE(Ls(yuXkt{TT_`Jli z?k*_+1@cY;a+DP0AiiKTpe{Kn=zw&+B$johQ#K~3bd8vb=F-?9dv?H4$1-g$d7Va{ z0_XoU0Z&G>G#^3LI=}|&)lpp`0oCsf;#ZvwkPe#8X$93=niEjk(+EQSIDYXKA{cc$ o*7DxQHL$-ET63!bN^54oKiIjBi$H?0jsO4v07*qoM6N<$f{XzFhX4Qo literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/tgz.png b/lib/images/fileicons/32x32/tgz.png new file mode 100644 index 0000000000000000000000000000000000000000..77faacb92bd6fba45acef5faa05b31b66838bbb4 GIT binary patch literal 919 zcmV;I18Dq-P)Cl{tgWxFrm3l_t*xo7tgWxFuCTC~W&on4 zrK6>#q^GB)r>Co}t*frBtFErBuCA@GudT4KvW!5xggC>DJ;aSZ#f?46%gfA;HqDMQ z&5kq8jx^1VHO-GT&W|?FkvY$jIna_h(3L^bpH5{%-lj?3 z-{9Zi;oz%M;Njxot5D&tRN>;|;^XAwuvO#a<>Tb$@*E<>%<;txD$R z=H}<<=jZ3==;`RPPw40A=;-O`>FMd|>gwz3>+J08tUTP@U= z(3AA^_4V}k_4fAm_4xMp_xAVr_rFv3#9#NsVEDvc`1$$y#9jKvUi-^w``xAc;k5ha z#Qe)>{MnEE+nW8%X#LG;|I%;&)N%jSa{t$M|JZc@*mnQfi2vV&|NsA|#~-Hv000qm zQchC<0t5^Y6c#W-ud%hk<>%}3KGw&a0004+Nkl6y%6u|NSIqyAFQ^6LC zpe=$pgrc}P3Pq8+3+{s8ua*mAM)2k}m8?4;4F!;2>92^3L51mzB?5^Bm>)EO6 zmj;8gcpxyoxcTwiZ8O&8<>NE!eMvzzI)8!p7(%CGqe^lQ>Qleu2h{z@szvfF0b=vg ztTi+F7bsA)94JscC_ro>Oo5sd9?$}5TSZgemR6N)P-zF6RJ4%fhWyDshaJf^J@P6^ z=7I5l>cFERGn#KeT^FEN|McP;2kKdm`UCOdfUE20DTtfm+yNyP|GpddXalmz(0|os t4H&jt0n#*#A_%|7%*;XrC^HKI_yg#Kj__lk@y`GN002ovPDHLkV1ki02Gsxn literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/txt.png b/lib/images/fileicons/32x32/txt.png new file mode 100644 index 0000000000000000000000000000000000000000..5d09e3c93a9cb49d4ef196b3da6982c6d24b6914 GIT binary patch literal 661 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dye*%0$T!Az$uypzIRcqF)UB7GRj0?XDf4!@$63?&;zfQgLhQ`Rwo}2Z4sf zTOPZYKUH0HHCFhF&z41-E}hx%!cF}7|NqmMwUk-p$yZtMaPN6zDbaTD+MQVoRvn5= zZQJzXz?_4pnz*KAU9ekpYXkG&(yi`p4#!_>#j$e=JZ(d1;fzzH&sUj8WUaRB34SA1Am78!(s1102aNm?k?Auzu^PB9r?!l_K$)YZ& z-RyZ-1eYN1Jkxm@0tb9ryLR87{Niw~UJS=R3H(-u9j-R41Y z$Mu&C2Xh?uTw^Qwm(4zr<;xKVmB!!4<9B#YD0WGmS5Q=#kT(76re`_{X>R9JethHZ X7MWaYd9M8~C~>MD-1%dp6f`*2M#>U3(?(UwRp5ETx zsZ*y;n>KCw3=o((Yu22(bLY;Rw`l3o#Y>kiS-u?Tu+?kVu3iU3>(;DW2Xx`u4I8#? z-M(YTj$OO<95}H501zBJbmZvqQ>RZ~zH;T>{Rj6SJbdu*(ZffNA3c8Z_{r19Po6z_ z`s~TG=TCv?`HN>j@chMdAb9ce`OB9tp1*wY;^m8%uU>+{tCz3dynOxo6$rg~_4@7W zH$d?A&D*!{-hFuY9tb|X{{TcEKYaM~@#CjYA3uNk1Vmpx1JUO%U%q_(^6lG~@87laT78oUhB|(0{ z3`{IM0wQ7tPU|;rJ^1wb>(6%Aj?V!`U5lrSV@SoV+Vh;|Oo1W?KK2BbwXO+X#If*= z_i2-fb2VEwy;pJiruzEty|~Y(VwOLQKWqJc-~E}zK`TRiCZ0e2*k(__i4{+ZSWjfF zR&ZyljGHm{@YzEgE!|JcS5(drXD)hVW8t5;bc&+`&m)%t)qaJTLnjnAbZ|FtPg=eq z^w^(7VVxrTR^s_}fwSRdo;{`N=H?bQ`+h@1V@pfJfA>}n$IR?o3kyq2 zODk(@8ylOWwt%gjot=X{VDISQ;N#H0FbLIYhaeOZ zLL!kU6w)2#?v6rvdU&8cJTRV~7z_r7#U96Dy>K`$FE4LA-WTuV=j#`6!k^$D5Ewup z1_Y7_fuum<4@4q~L<%~2>dfiWKxpXMu(M&|VPO#wKSo7Hor{V-PmYZvlP|`R;}R2- zk}joON={8qNlm+)mX=OQqfpY*DH$15Dm9CmnU$HDm6c7)rsdGC(rLNZa<0TO* zyaC>e!9hO%CI2Px>do-To8i&7Z-+^*~^2(-XDW^e3_CzFW2bC{7!C>k9Zat(*yF$Py%W_tfRlwtGrx+`yoIaF<+ z74qzJ%EkSrc}DPbQcV3zuBV|yU2C(iw?|B#N*V7iDzyzc)~qO;7#|6?)vHonNKg1B z{-@)X!J<_50Xq~RT&heh*D`RHq_X2+wX80 zzs9=~iJR>uraXF=u*XE-B>Q=LCt*eD6P+hCunN}eX2JnoEZyp@k8qVFvgvM7+C!I$ zD^FZ1s9d;C%l!MIpU-!2klZegL$L=jN#Y7a4=&*~;C)YS*piMJxt+mW(C&Yo zfiqAI#pF~ak2r;3psi2cxasgJ&8w*u_eIjuqpGop!UG@Zlea!rj~gfOIVH_m-*x84 zu~=d3ea4{^Roq>l9OI3oHz_eXWXr7A`UkbT)WT>TNGs?XZTk;|$N6JhF%h(X0Sz&D AbpQYW literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/xls.png b/lib/images/fileicons/32x32/xls.png new file mode 100644 index 0000000000000000000000000000000000000000..1c21a6ed3b29b42c2b172bf6fbf1e0a03652ab09 GIT binary patch literal 1124 zcmZ{kdrVVz6vr=ZdC0R%jB_M7U~$7hdA0}xRtg1agz^}Wh*4QK4I>?_3J9fzOMwkk z(3s((VPG7k-j<< zaQ}W#H4w}KLYP1Z3&1e}9FjFaC<_QhvK9!dL39eMMMQ;xKm>@20MU^(m`Kn$s@6FQ zNzgT_4uh|C#e**RI%hoFg}`n6~+_^-IpB|k-%^u?6+oTdxouksSE4v@+O#4-`7d@!YaIHf{Fx;~OtIhay8N~s#A zRE?dj5~o)^qcX%)#zbcIXgX7z!FrZiGnrE>$*q; zTH9;-y&3usGgY0l%tsu~j~q@Hmx~O9JNr!^kJraXQqG%{^Cy@1k|lxUAAxjwTDmNfu85Xb6e|klic+ait}0hmt17i>RjX2KRBEkS zqg88l8bsZi_7J@mY1Yl*B`R3UpK593#oDG zv%RykV}d zMec-#pthlboNw*F#R~}Lj>YLG@LNb1oB4qoJ0>tU`Rh02_d?zK#qMfZ1PzN$E`A7| z;CqKA8qz8zk{@35`bEYtImT79fv93MwJ{OCR^)dw5?k_nV*v0r;dMmnzUzr-rLSU; zs37{>P=m#lvZeU)){yGB_sbZXFD;lCP5p(Q#<)S+ z(Brb~-m?qkBZb)8k`_qdk#Afa(XZaxochAz=NBICsnR^5>%2qbge>{r=QLLBZNjY* z&-A(dY$oH?=)_H*jpeE}iPh?FkD YnA6iv;;?f|Z1>@wmzY7vn+yDRo literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/xlsx.png b/lib/images/fileicons/32x32/xlsx.png new file mode 100644 index 0000000000000000000000000000000000000000..cba5937abdcb6ab8ef4e463d45c2e3291dcf7a72 GIT binary patch literal 1131 zcmZ{kdoNKtjEnV-)jKQG&*E88{prOIN z4DhS~yvhNu3c$M@@P=Fo_*4KskO_cqB@`210u)nUBH&Ln^(UI0sWd-Bvr4$Wtr&+m-Hv%>M5$igmkVGp{96It9FUDAavc@I8E6ZZZ^2+M+iezO~ zvLcbLLXpZOhsY&RBa=xb>rx1rTqc#vAj{X}hpfrh6l)5FLaJ6MHWcd+%5|l3V?(vE z38C6lK~bwzTk3VaTD`TkrO~K%G+SDYMyuV}(`t3Pt!>WPxyTE$h$zPQ! zG-1<2%>ZDs5QBd2gNwzHv; zdUv}+x?v30zE8qTb@?N)%tmhQ}tu6Rmh+Ux}>{L9wzNv{i>WC&t`!U?0v}PFgjg$y`GbjFVW1ilZrtOkpm31!;ZrF)$ zUbI&e+uZvG6j)X-(zw&udGdZ)E7C(yU~}vqs!a6WyJ`Ab!S+={1b7F zluj^f)WKlp^q(zquj6d!Jumn*BXFz=v^3QxG*%QGkh+~ic%QfVxIc{kEZoI0B*NWE jz>Hv<_-@ZwhwkrK;b+ltNRO8E!<7+(#-NxNGRXe|MLSh@ literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/xml.png b/lib/images/fileicons/32x32/xml.png new file mode 100644 index 0000000000000000000000000000000000000000..8eee5839889f55f057ae1fd84a668034ff0f0f59 GIT binary patch literal 560 zcmeAS@N?(olHy`uVBq!ia0vp^3LwnE3?yBabR7dyR|9-PT!Az$uypzIRcqF)UB7kYuBz`2Sn@EtXl_EymrHeO%4vHPM^Ma z|H1tS4<9^y^zhN+M~|O8e)9D3lV?w!K6~=)`BNZz{^A)BJb&>V2wuE=@%-hB7car! z)vMR9U%vr@w{PCQefRFeyZ1ow;r$07`uOqVr%xY0fBN+K^QSMLKY#i18T1#kHqpL}}S z_R+?F?a|o7r9H8s^Rh24x>%8VuyLv0uir89yCv4HmiocgtWv7V%o02&M~ms?1aEg&P>zd2ip4{mU+owH^`o*vD_H^dd a`oD~u;_GkPTbyYH#k;4gpUXO@geCwG=qOeI literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/32x32/zip.png b/lib/images/fileicons/32x32/zip.png new file mode 100644 index 0000000000000000000000000000000000000000..0ce83b6bcc00bc5b3c2179a07f185517b59c0a22 GIT binary patch literal 914 zcmV;D18w|?P)Cl{tgWxFrm3l_t*xo7tgWxFuCTC~W&on4 zrK6>#q^GB)r>Co}t*frBtFErBuCA@GudT4KvW!5xggC>DJ;aSZ#f?46%gfA;HqDMQ z&5kq8jx^1VHO-GT&W|?FkvY$jIna_h(3L^bpH5{%-lj?3 z-{9Zi;oz%M;Njxot5D&tRN>;|;^XAwuvO#a<>Tb$@*E<>%<;txD$R z=H}<<=jZ3==;`RPPw40A=;-O`>FMd|>gwz3>+J08tUTP@U= z(3AA^_4V}k_4fAm_4xMp_xAVr_rFv3#9#NsVEDvc`1$$y#9jKvUi-^w``xAc;k5ha z#Qe)>{MnEE+nW8%X#LG;|I%;&)N%jSa{t$M|JZc@*mnQfi2vV&|NsA|#~-Hv000qm zQchC<0t5^Y6c#W-ud%hk<>%}3KGw&a0004%Nkl^67aX;Sk zJ5R3*a7%|07!l&IN=??Dzm`^ZR;cltCtlG1pMRfLJ|Ry>@NL6MgklTz3{R7 z>7i>JCy%+#?Y_|am^PMdhJ$kN5Yx#X^7EofxA}O6Kfu6sVF>%>`~nVldS=H;r2&|L zfZFK6&ETR4X6R_Mf2K$_h^oUQxPpLCC`dITSA+B^_wMKK?8S*X;W`!|X{DrAM5rDx z054+z4-6A{07-{R0SkF`AQOYEL_jjlQYNw*n6fGbOze@hgS+*CzcjgQFF6G(VgkYc zumLtIXpmM7lK6-d_<{fZf{qD-*aYT>4bri1HQ49+)C8TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLsrJ^Uc1Qc+du6{1-oD!M<_;S4k literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/asm.png b/lib/images/fileicons/asm.png new file mode 100644 index 0000000000000000000000000000000000000000..c22c451a19fd374b5d23165e9fa1419089132517 GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLvo5g>2XrCi{Sd7*2>D+6(R=%&f?aC;qX?AVK z`Q4B9-FDZD$o9Q&C!rzk_N?&2+0DE37|$$S8_zL&%b$mn0;2pTWFDHSt9<9&HE~Ae z8T_yBv|s7Gf8t-ArMilSo#>tb8C53bP0l+XkKT;{l} literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/bash.png b/lib/images/fileicons/bash.png new file mode 100644 index 0000000000000000000000000000000000000000..f352cfdb16cc073c640fb47bce9a74336534a370 GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL8S{T&R3* zm)rYzL%7bK?|EE6&Y yW5ccWdMlEi)yL~ea(J9qbvrd#O)>bh^J)F^r{aHX10$S4Vdv@U=d#Wzp$Py(r@QO` literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/bz2.png b/lib/images/fileicons/bz2.png new file mode 100644 index 0000000000000000000000000000000000000000..a1b048fc246d31a841a5f4c0314a274aa480489b GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12fYYrc9YK zb?VfaGiTO?FaWvz@eDtH{P+n5zkmP!^XCsxaATL<#%}v(&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL4Z&%jNAPxRL^UCzceY->xe-}|`jF(-qE$+a2h zcONXgQOtiW%J>`qk|phuh4V_j=d5GYP_O;1bVDTTs%pEFZug>{KSHNEuuEzAvF|T# ys5rj0?r`p@{qg544Nmx(w!K=c;9)E&{8C)ZL+oShHvxT6*m=78xvXTOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLLGka$28vmue)|rV6pf=bMO5+x*QX36=(@HIpiDj@Nx?=O)kB5YuT;`l`EAP3|{Oh z?%#D}U-U|bd)3#shcEGI5G<6*Dc1Jqx#E56mEVLl-Ti%TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLKhKEzO9bq*u zaCMy!3I#0CJ?67Wr1|a>m9NEOY-ggM$Hd0I*ki!Spz!m- z-_L(b0DA>h@0}jkA}me8;o->c7RwY@7NQ^K56k`Pk=g`+Vv6 pcs@xDk8;+dU29V>Xzttmi*?m>(PJjH<@%r?^K|udS?83{1OTgExt{<4 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/conf.png b/lib/images/fileicons/conf.png new file mode 100644 index 0000000000000000000000000000000000000000..c845d4962457bedfc082cde05a8e68df343fa04d GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}V}MVHE0F&G|38pK12bpNoHAv~ z)TvW}jJmoyAlcvF|KrDxpJ4F&_wPS{{s09xZru3n*|X=*pTB(h^3|(XuV24@^XARl zw{PFSfB)gbhmRjWe){z3^XJcBzI^%m_3O89-@bqU4lx8`0?_K;VO!0Cc8in*`2iip zB%@$tVpcbC;>6ke&wl*;_3z*P5w|`7<$F9`978H@rJn8PYf=ztc-Y)fa@p%;QtGUZ zii-d2Zw{=u`lpe1pCJQV%&I9TB$Oxo=1RUitHmL-*>G9*`ih$!JPaaH>2F`(d|;8| z%JO`U>~HBHtwTK){>yfoKW7P>mQu_+vLzc`4=1ZOuYBQ pVdtM#$GSC!q4Fw>=dYTdyf36FE_BiKHz@EJJYD@<);T3K0RZf~zM234 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/cpp.png b/lib/images/fileicons/cpp.png new file mode 100644 index 0000000000000000000000000000000000000000..1a04c32914e3bc1111dbc5b5312917a5cd9d03e7 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLx@eP@b#LOR?r#1T5 wG`2so7CZ4j&N5X&!FJk-sqDTA!JC&nWoHlzopr0I6cSi~s-t literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/cs.png b/lib/images/fileicons/cs.png new file mode 100644 index 0000000000000000000000000000000000000000..740725a30eed89d523f592a88f89f4b7e56094f0 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLJ2rj4xBV>ddhN-K4TlAs zEB0r}{Mwq>Vc52CxAId7wIi8d-Y(v!;*j!kmiob@;y*8A7~X$AUQnza`Im83gXppQpWNqw!p+mw&t;ucLK6T8iM?h3 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/csh.png b/lib/images/fileicons/csh.png new file mode 100644 index 0000000000000000000000000000000000000000..c0131c5f46d46986bb6984e95bc4bfc59451920c GIT binary patch literal 378 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL~Sy#Bp@|FyYuvwkHe{zwoDSkOClNoNpCTDU@b#3X?mi$32o|0=4#+JupzTe0m! zRoIR4*HaXaN&NcOCUV+9sjoTz-POnjBkyQ?4l(KPlY{w6=Bcf#+@Wi6Ye|J@!Jil0 xMduILKGU@QS7-Tbfr9lE4bAUu4(Z>77vE=N6+3*ArL7SZcAl<&F6*2UngFSOyH@}J literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/css.png b/lib/images/fileicons/css.png new file mode 100644 index 0000000000000000000000000000000000000000..89ac36470723bf3bd66eb169e0071d22b2863c03 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLp#wFxUDFMr~GI!`S9`IhT*LE+}<>gTe~DWM4f{0_ex literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/csv.png b/lib/images/fileicons/csv.png new file mode 100644 index 0000000000000000000000000000000000000000..837ae295fa43731ee90e4f7d392814c5789de73f GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}V}MVHE0F&G|38pK12bpNoHAv~ z)TvW}jJmoyAlcvF|KrDxpJ4F&_wPS{{s09xZru3n*|X=*pTB(h^3|(XuV24@^XARl zw{PFSfB)gbhmRjWe){z3^XJcBzI^%m_3O89-@bqU4lx8`0?_K;VO!0Cc8in*`2iip zB%@$tVpcbC;>6ke&wl*;_3z*P5w|`7<$FC{978H@rJn8PYf=ztc-Y)fvNdQ|#7s3M zxqJT^tv3Z{e>G01k!E08Vm9Ygi^7H7LcxzGwH%nTw|HHyUPatW9tNIY5B`1*e0*Vj zXp=yb{4VVvwSz4dz3cW~RcFhZwr;1e&bDu>AG5uXNuKq218c;sie*y|9+OX4_@np7 qzVJW)l@#nlPJ~wbDinYAJT1Qco|uB&zx!W6f#&Jz=d#Wzp$PyjmB1VT literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/deb.png b/lib/images/fileicons/deb.png new file mode 100644 index 0000000000000000000000000000000000000000..1db6fa5b80efe3b048d98398e89fc4c70ff2aafe GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12fYYrc9YK zb?VfaGiTO?FaWvz@eDtH{P+n5zkmP!^XCsxaATL<#%}v(&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLQs7XPf;i0RG)fVUN zr%#y(7FPcMo~^tr^HX}mLuodLh7hZ1YEA|#ay=Ioo;NpwzQ|Sn+VGg|hXC8Lugo9C viZ)AcHvd;=`9wkCcDTsuvM$H8U$ZCa8wH4)-FU_A1`0V(S3j3^P6TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLoV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-|gw*7*cVo_3TZ)W(5IucDPHyn(?mx%5oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-{(4tHoGUro?7D01K8sX?^LOq(N9K`_#TTsF*7p(=aGtJyF6*2Ung9-wyw3mt literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/file.png b/lib/images/fileicons/file.png new file mode 100644 index 0000000000000000000000000000000000000000..54fe8abdad1bc26fd09c217f62fc4069f2d6608b GIT binary patch literal 249 zcmV?s{m~fp0BMBi# z@K!*T21nO`#p42?6X+DZD;w3|24^5Z=s`>nGk}>)%WXhRbMv$oq1Ux8BuJq$gBI%A zAfx~;K#DUlr^+r9wd_@wsb!}`3hpeM{}k&#;LK{11)KUt00000NkvXXu0mjf^QURu literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/gif.png b/lib/images/fileicons/gif.png new file mode 100644 index 0000000000000000000000000000000000000000..38bdbf2dca30fc5dfd03b1188b1a988340cabbe0 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12bnbOqnue z>eQ(-XU?pvV*qmd`x$=x`0*1Ae*gac=g%LY;Kq%18#mfNd-m-4^XD&LzI^rS)$7-< z-@JMA_U+sE@85s;@ZsafkDoq$`uzFxmoHzwe*OCG+qduEzeCJ{7y`82PcL!@(0Y-Q zAU~kHm}C@;Ow8&gPMkP<|Jje9zyAHZKjPL0pnR{Vi(`m{BTl!7shjJ)&Ms_SNWq6Xl?VLoLA)9t~`kV(X-c5|mDh%o;te-PH uQ183OC=f6B`_lyGf^*SF^i&zveC01U)D3(ky8RF++&o?VT-G@yGywnwMYY5L literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/gz.png b/lib/images/fileicons/gz.png new file mode 100644 index 0000000000000000000000000000000000000000..422693a3970cb4a5a82408161c48610cbdf07bf7 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12fYYrc9YK zb?VfaGiTO?FaWvz@eDtH{P+n5zkmP!^XCsxaATL<#%}v(&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLsY`_z3|{Oh zUZ37tyFHBOUiJ0u=1X`EcUbUk+Zq0x uL1BIVpFc%s92}}N48q=+Hu{`Z*S&vgvY1ljONjtbxOuwzxvXTOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLfN+v`a_U-^I^1^EP=TnI*kvX81X?_P|4isg?{4-b{QAEO!__u`twuBtD96 l)Z?#Y$onj}F^ZcZ^uOK`&Ckl4>vw`e%+uA+Wt~$(69AQ!wq*bS literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/hpp.png b/lib/images/fileicons/hpp.png new file mode 100644 index 0000000000000000000000000000000000000000..6d314f5c9566470e6dcc6a967d60e5a8f778ee8d GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/htm.png b/lib/images/fileicons/htm.png new file mode 100644 index 0000000000000000000000000000000000000000..f45847f7e7d556c43cd602164e685fa5719fa178 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL-){cAqgZC}Ccv&q%} zW^!syPVDOw-YNww63l@`Ipn&sq^>bP0l+XkK(pI?& literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/html.png b/lib/images/fileicons/html.png new file mode 100644 index 0000000000000000000000000000000000000000..f45847f7e7d556c43cd602164e685fa5719fa178 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL-){cAqgZC}Ccv&q%} zW^!syPVDOw-YNww63l@`Ipn&sq^>bP0l+XkK(pI?& literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/ico.png b/lib/images/fileicons/ico.png new file mode 100644 index 0000000000000000000000000000000000000000..38aa34b2c986aca593029cb6a0057124249493fa GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12bnbOqnue z>eQ(-XU?pvV*qmd`x$=x`0*1Ae*gac=g%LY;Kq%18#mfNd-m-4^XD&LzI^rS)$7-< z-@JMA_U+sE@85s;@ZsafkDoq$`uzFxmoHzwe*OCG+qduEzeCJ{7y`82PcL!@(0Y-Q zAU~kHm}C@;Ow8&gPMkP<|Jje9zyAHZKjPL0pnSKdi(^Q|t=6-*g_;xu8XmeHc$=WU zb@J49mm^>Q-e2FEIBS{SFZQwryBP!&Opk>qu{7U%Dk3#qhiAt3V>7nxyOg?Ah{0jg zxm)SM7cZ<2Wq3YEc9(RaM1s;Rx6Aid7qgu64!4&OoBe5VFk8+1%AapjxtH3XEiC%~ t@Okh0_&!Mv4}R98U3=3eXzsiGiS=%wSb(F@Pa#mKdAj + + + Filetype icons + + + + + + + '; +} +foreach (glob('32x32/*.png') as $img) { + $fi_list32 .= '' . $img . ' '; +} +echo '

    +' . $fi_list . ' +
    + +
    +' . $fi_list . ' +
    + +
    + +
    +' . $fi_list32 . ' +
    + +
    +' . $fi_list32; +?> +
    + + + diff --git a/lib/images/fileicons/java.png b/lib/images/fileicons/java.png new file mode 100644 index 0000000000000000000000000000000000000000..0c62347f5c5cd1b3190915558b9b47e624b97a8b GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLnbd(Ui2E~79TzBroyn`f>n0> zd8zg~Z6=H7Z!X-O5X7ieQ(-XU?pvV*qmd`x$=x`0*1Ae*gac=g%LY;Kq%18#mfNd-m-4^XD&LzI^rS)$7-< z-@JMA_U+sE@85s;@ZsafkDoq$`uzFxmoHzwe*OCG+qduEzeCJ{7y`82PcL!@(0Y-Q zAU~kHm}C@;Ow8&gPMkP<|Jje9zyAHZKjPL0pnSili(`m{Bz{q@_usO+_1+IFLXX^gZ6mio z+{sJTIXC}l1II?MzY(8rGCHalau;4>Yxr~K){83l_hD(wZr6`LnABi*VPXU0gz{eu wiyy0>yTu?7FZlb@1X+V;x=GW87_R+dkAG{R`2FGIX`qnvboFyt=akR{0K~ewasU7T literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/jpg.png b/lib/images/fileicons/jpg.png new file mode 100644 index 0000000000000000000000000000000000000000..e446dd410b6fee41e2d7be0a81057dfdfff8b171 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12bnbOqnue z>eQ(-XU?pvV*qmd`x$=x`0*1Ae*gac=g%LY;Kq%18#mfNd-m-4^XD&LzI^rS)$7-< z-@JMA_U+sE@85s;@ZsafkDoq$`uzFxmoHzwe*OCG+qduEzeCJ{7y`82PcL!@(0Y-Q zAU~kHm}C@;Ow8&gPMkP<|Jje9zyAHZKjPL0pnSili(`m{Bz{q@_usO+_1+IFLXX^gZ6mio z+{sJTIXC}l1II?MzY(8rGCHalau;4>Yxr~K){83l_hD(wZr6`LnABi*VPXU0gz{eu wiyy0>yTu?7FZlb@1X+V;x=GW87_R+dkAG{R`2FGIX`qnvboFyt=akR{0K~ewasU7T literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/js.png b/lib/images/fileicons/js.png new file mode 100644 index 0000000000000000000000000000000000000000..bee428f200d3b1574f921898534d554b97a978e5 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLvGfQf9rO?+rKm*UUcJkt5=V| zdwHx($@sfAq(fl!mVVRup&Uw`ksXUm8J?tX<7+nDu&L~T#X(iZbBrnt#SK;OC6+&I unQsxr?oi|U=Cm{40n2>B-BTDgT(hq{q$g^{zVJLK+&o?VT-G@yGywpDTOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLm>* z>20^1+Yxd9|KDp2){pK_QIl6?VAc!m@sLoSuv@71m?>wYR&}z^?U;|71UVTrww$|l zeeSzJ31Mq>rZ!nb}@0JTxOqpR;1szKMT$^@_#K9$E{@fdbFd)z4*}Q$iB}{{gt6 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/lua.png b/lib/images/fileicons/lua.png new file mode 100644 index 0000000000000000000000000000000000000000..fcebe3d020fd1d7db2300353f9566ca6f5c7317a GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLba1^sjI0+gQQuv$fU# z=5cCH<=I+0g;(i_&R4VJt9hF|l0=f$^D_KAajRsPUwWDu!`~M%LJYD(4D3%j-@Rb} uAY7fx(6PRwwDJ_6#WCBYsX`3T{;=y!)wNi>ZpLCzxOuwzxvXeQJtXEM|=FwA6N=x6xx^Is!d-m-4^XD&LzI^rS)$7-< z-@JMA_U+sE@85s;@ZsafkDoq$`uzFxmoHzwe*OCG+qduEzeCJ{7y`7tb@z{Sp!Fgp zL4H7YG07+xnV8j0oH%jz{<9xHfBpM+f5fd1K>3NDE{-7;w_?wB@--{)G(1#NvMy=g zbUN2hU1{3)`u(AoC#KqGGR1Q=FswA0uI41LqPElf@vIhy>3g?s%gw8}yM&V=qvYPs z@2ih3yuXaQ;{DwVcPC!r_UX8saofE%aY5S4S?UK@8Q9M))^IX7IOD)(X5mLhpIsgl zv)uaJ`-uC`vHSYVWmr;gTe~DWM4fnD@If literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/mp4.png b/lib/images/fileicons/mp4.png new file mode 100644 index 0000000000000000000000000000000000000000..dc6fd0022d2deb6a6dc8e06972ababf3bb4f0552 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12Y+BPMI=g z>eQ(-XU?o+r~`8Q8Tx}{g@2}7!KV08mq@; z(vh_C(Et6e&&4zy7;ew(jL;P}c(!Tc^lxm(j^B^beRKS@%;UQKvDf}zxv_3mME1Px z&*#sa5OjKj{QKNy4#V63ERV0|ZSqJmd9+8K;l%no>zA%*nl-aMZtn}%La&BbtCSh7 xxGLEfl-E55%6Gi)D6Klh^rf&nVl8WfrToQjh88BZ`$1vI;OXk;vd$@?2>>~Vzajtt literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/odc.png b/lib/images/fileicons/odc.png new file mode 100644 index 0000000000000000000000000000000000000000..bf3b3a104c280727dc063a6c419fc0a7b21e7334 GIT binary patch literal 369 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2Qz0*nKEVS z)TuLP&Sa>oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-{I-v7*cVo_3TZdCIyMMhw_Y>8-1hK z`UngDfA|02uM~;pE1ToCJ+x#HQrX(M(uJep-V>Qu&jlJzMrY^7#{Sq7z$qwMc5mnN z#ZT77u41@Xecd$NP3^z|n=jk;OoV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-{a}x7*cU7^=zk5lY&6QLsti@GhWtf zZG;53f3M$vP4-ygtLGAb+5`m@wsNj?;b7XUKSBDs3d^z=Yq#ds9>49T%8+oO^7%dA zR_FbpJol>2OZb=Y9B#4b-BufRo#Bd3>|dpbw|;@sd0zZ>o-Cegc_C4<*l@$2yB+@y rPWZp4=$wN?m5yPEoJph4*-6vl#mdBPZE9!T0SY!xS3j3^P6 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/odg.png b/lib/images/fileicons/odg.png new file mode 100644 index 0000000000000000000000000000000000000000..0a8196cbf73055204cb5198d50d23c8aecdef891 GIT binary patch literal 370 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2Qz0*nKEVS z)TuLP&Sa>oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-|6Y%7*cU7_v}ldCIykUhs_OJZY*0H zwyd+``0xGu?Ie$9R^M!U&OSk5<=GisEetPwPc1CtW1O*N+qG#&ThDWg3QkOXKDXMg zDDTx$t_OR|eM?hQm`cvXW}l9(lVaoz5-mTFv$g*941ssHYGF67wG>M^%U}54Jl}j@ pou!J3#=TUVX}P8j$I`q`i;IW!G literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/odi.png b/lib/images/fileicons/odi.png new file mode 100644 index 0000000000000000000000000000000000000000..0fc8508adc4c3d8af3d40195640d05dfd49d59f0 GIT binary patch literal 371 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2Qz0*nKEVS z)TuLP&Sa>oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-{tAz7*cVowf{C>lL3!|^^Fzcdm6(- zSR|9L{Qqx%J5|w5-X?eQH=8Y*8XmlEC5uG3H*0DboVmH-z@p99%)Yjsy$`CZ(>>t8h2l%;gFHy64Nr phx1u#oG4RuJ+*e?cjGw*FQvcni%kvp-Tws?Xr8WqF6*2UngAQoV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-|Ok(7*cU7_Uvt;CIx|phpq?SCWK|F zYhQLb^7ilj^-~jNUa{+a+a2N1a77}hQ-G%`enNiCW`l%_(#f};xn1w|VqiFFm3@Ex zthTz0#NTKuydm+e^cR9xh}*sa|GYuoV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-{a}x7*cU7w)dt`lL3!wu-8iNMNQgT z-BW@d{r^9Ix?g*u#Z9&6ii(awFCAn!85j0hR=4T$w4Ad}_6fHAxv^VW=~B+zt@n35 z*?0SRoW=8;`}-s^^xd8n8l2s|hn-RFa+rL_*@v4ROcVMhFZ49pZAP(=4oi`0%~|t9 sb925voi%B}lbC`97MdJ0Ur4I{XMZ7f*!^5_HYnIUUHx3vIVCg!05MCsUjP6A literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/odt.png b/lib/images/fileicons/odt.png new file mode 100644 index 0000000000000000000000000000000000000000..6f8fae4382552e0b073ab96b1867ec881b78073b GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2Qz0*nKEVS z)TuLP&Sa>oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-|gw*7*cVo_3TZdCIyMMhw_Y>hT6GX zi#%Qa?Ee4zb$6oF^2u@28lN+GOt_-9Oh}QTD!L#e#))Csi?v&GYoDI>QgunWQTcqH z?@{OdVT^me=e@}5@oDI+l*+AMe@^g%`>tP%5jlLD{Ujg$JH*2s?PqbMvGd>IH@yr$ q&+8xWVOjcnQu0$j=9H{`nLpY1Si}xL`TMN^6l$KXelF{r5}E*Vkh{A8 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/ogg.png b/lib/images/fileicons/ogg.png new file mode 100644 index 0000000000000000000000000000000000000000..8bb50800e61384bbf4c8c88d25fc66ff2d9b8033 GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2QwL_Oqnuu z>eQJtXEM|=FwA6N=x6xx^Is!d-m-4^XD&LzI^rS)$7-< z-@JMA_U+sE@85s;@ZsafkDoq$`uzFxmoHzwe*OCG+qduEzeCJ{7y`7tb@z{Sp!Fgp zL4H7YG07+xnV8j0oH%jz{<9xHfBpM+f5fd1K=~d|7srqa#?-T~g_;xu+8(+(THR3G z>KwMLv*Y#O`|>DwSR?}E<|SctX!=fA7-SaboN^0 z@2Y8cwr0OPXqmqI*)fl5i5czpu6+L_!%(|qrCh_&Wj|g{5xSS$D7k;L>YaZT?!qkd u4!`N&uX}t7i)#BE=bv$mk6ip${@~@Y5W6L?=o~jF*gReRT-G@yGywoeQ(-XU?o+r~`8Q8Tx2=87srr_Td8MX3pFVSv^{inw3;#X z*2z;Qf`xnk|9;&qv3zB@z_jP=lNLn0oY2$4up;-|zC=#O7kiA4nS5aVW<{5BHQc*&t^7bza9ybn=l7LI%pV?@Ao%RO#5c)h x^#`0jOEYeozh5RuXv!OIK2dAd4q@BnkHon`#SS-gCGvwp&ePS;Wt~$(69DWjzaIbq literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/pas.png b/lib/images/fileicons/pas.png new file mode 100644 index 0000000000000000000000000000000000000000..19f0a3c6c18e2f4fe7fed3e5a49078d35aaa3a9a GIT binary patch literal 380 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLR!6+v zZZh(9iMjXxZ&c@uW%D1-$Y*0}yM}$9>%Nkdwi~U)xFP7P|8kj-w=#48ELqBM>v2TXfs0?f z8_xH>w+#^d6Mgi){&5+Jly)xXt8oHLX7+S`;pLnwb~yLo>U*Hj^K|udS?83{1OW3o Bz;6Hm literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/pdf.png b/lib/images/fileicons/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..42fbfd2bba6750c04da9fa694ef30a7126694237 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK18He#Q>ILr zI(6#InKMH|LV(=(`1l_`e*6T3-@kwV`SS-T*wxk5-QE4{*|X=*pTB(h^3|(XuV24@ z^XARlw{PFSfB)gbhmRjWe){z3^XJcBzI^%m_3O89-@bqU4lxH}2+;OxEZ?Jm){B$` z`2pR6ke&wl*;_3z*P5w|`7T3EIB@f;r5&r3 zOQP0~|Jz^OQDWstm_4&2)`+nY{qaT{K!6=6!xCV?i)*48n*splvX!xx)r^}2o!Xlu6{1-oD!MTOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL?TM^NK7ba vc%Xjn7K1>%;O|cpWDTC_CQTP&xb};^QOZCu{p;CIP{?_@`njxgN@xNAXtlQ& literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/pl.png b/lib/images/fileicons/pl.png new file mode 100644 index 0000000000000000000000000000000000000000..d95513d25df87d4e12bf3560a14b6264c1f730c2 GIT binary patch literal 372 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLba1^sjI0+gQQuv$fU# z=5cCH<=I+0g;(i_&R4VJt9hF|l0=f$^D_KAaqEJ$Y+4$#J9~`K3w8%4_68fqk{_LW r%@~e^AK7J-$}aO*Zlf0`L-9Xm)(1LVe`+Rw1%;ZYtDnm{r-UW|=KQoU literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/png.png b/lib/images/fileicons/png.png new file mode 100644 index 0000000000000000000000000000000000000000..273476daf4cac66ebcc25f2d5cc5a3e093bc5ff8 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12bnbOqnue z>eQ(-XU?pvV*qmd`x$=x`0*1Ae*gac=g%LY;Kq%18#mfNd-m-4^XD&LzI^rS)$7-< z-@JMA_U+sE@85s;@ZsafkDoq$`uzFxmoHzwe*OCG+qduEzeCJ{7y`82PcL!@(0Y-Q zAU~kHm}C@;Ow8&gPMkP<|Jje9zyAHZKjPL0pnRXFi(^Q|td zIy-l5n2XH6|NpH7oL%i>0<@|fzf8t?Kk;*>v z{qiG|cb^%qMH%z@FG*=&Eu2~UKPz8QL*Mzk+KrG`>$5qh7WuUbuVcP2``Gh?syz$B u0#rM!ukDZVN(h)E-D9fmcz}DR&>wc`0I`pmGq3l70?yOb&t;ucLK6UOC%0Pw literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/ppt.png b/lib/images/fileicons/ppt.png new file mode 100644 index 0000000000000000000000000000000000000000..a03d3c0a6f939558594d99dc259d38c03c43297d GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2Qz0*nKEVS z)TuLP&Sa>oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-{&9~(|G^C&dfXcLcRMeeQ!3VC1!KHS`;p{GbLZ1)^b3kxp-anyNcT@Sr~YJJ@~tO zZK2FJEhmnH{ePJ?g%jQ8s9(2zt<9V?WnZOWPR`a>lN#4fTl&a3oX_OLB45D|-J&1P uB-AVZ|NV4MW5bsarEodZMxV3hy7p{W#HRi@apx;2;5=RZT-G@yGywqK#Je&8 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/pptx.png b/lib/images/fileicons/pptx.png new file mode 100644 index 0000000000000000000000000000000000000000..9b5c6332ba8c52f59be09a4e0372801090dec832 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2Qz0*nKEVS z)TuLP&Sa>oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-{?#={xRdv52t+6T4EjTj7GG=IPE z-~4z(xQ-J?-JAIy5@N=WY<9l8dS{VC%H{3(LbIFyK8`xDDdMzma}X0RpSWu5jT-{x tyCS-azCI0VX!sM8yu>b3$jF>iw?2G{cv0_hWkpcHdAjILr zI(6#InKMH|LV(=(`1l_`e*6T3-@kwV`SS-T*wxk5-QE4{*|X=*pTB(h^3|(XuV24@ z^XARlw{PFSfB)gbhmRjWe){z3^XJcBzI^%m_3O89-@bqU4lxH}2+;OxEZ?Jm){B$` z`2pR6ke&wl*;_3z*P5w|`7+6l-QI_#hlLp?tmwV= zKD_zyhNp5phE;FgdwB92KeAc*?qZBmfZwlgo*Qmm?LKF@WB1m?0M;Fue>qt{NPDlS xH{K(-eZ`~q(}VeVHYK-ie5Jr~$)`^ECHwYYqIbV|w3~r~&ePS;Wt~$(6979mzp4NL literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/py.png b/lib/images/fileicons/py.png new file mode 100644 index 0000000000000000000000000000000000000000..893019ee6355f147e5d5443b806099f572dd6e72 GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLc!)W7E3@@(KqT9p*6{ u$bYkyQDL9*wWo^K4*$O;`4`d&MSDxOuwzxvXTOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLFc!MlwJreT$mWRdQG2w z%_)%CrqrTOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLV7;##(Uw!Y`R*E&>p9C!a@b=%$;B}~Zk?wKm>c_8?!-zWCF9by6NX0JI33OG+!KbLh*2~7ZA#JOSs literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/rpm.png b/lib/images/fileicons/rpm.png new file mode 100644 index 0000000000000000000000000000000000000000..75da50e0c5fa58b7c424ad06b20b850b2fe7effc GIT binary patch literal 374 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12fYYrc9YK zb?VfaGiTO?FaWvz@eDtH{P+n5zkmP!^XCsxaATL<#%}v(&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL@9Q7ukyz5s<$N_x=tD^Dq(7_yyyDfFVt2|x;pXY;=d#Wzp$Pz`AGw+U literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/rtf.png b/lib/images/fileicons/rtf.png new file mode 100644 index 0000000000000000000000000000000000000000..2e5a6e53ee57fa9518860f43e7b14c7e5d3b4c08 GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2Qz0*nKEVS z)TuLP&Sa>oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-|y+-7$PCbdeG31*-(Jtz|F6gcC1n^ ziCRDYZ+~$|iIpQ^_RNl0BgW!f_DWs-gnj?l#X9BsXP^81x9o1c_rr?NBllk0$n6hz z@=|rq&41d!vC->q#OIrgjw*)Sh1b{`{@7%_Zaep)XX;Ify9N@?-i!DbI46}PINW1w tm~WBI>`>$S=CpI!ff?I7V!aq5Uduby7-t){cs>J#oTsaw%Q~loCIISkwrKzW literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/sh.png b/lib/images/fileicons/sh.png new file mode 100644 index 0000000000000000000000000000000000000000..bc483541451bef7c9fc03c08fdedcd0a14d89ea7 GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK1IB4Hr%ahL zb?VfaGiPdr)B(Br@%=x3{P+n5zkmP!^XCsxFr{l_YWK!x&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLvGfQf9rO?+rKm*UUcJkt5=V| zdwHx($@sfAq(fl!mVVRup&Uw`ksXUm8J?tX>oeqG*3Ld|!5AZSu8~p2f?Yk}{oIEv tKRSWZN5YTnvw6ZW=d;*GZ%&5nzsyU%>*+YL?d%2xoTsaw%Q~loCIH$xwoL#4 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/sql.png b/lib/images/fileicons/sql.png new file mode 100644 index 0000000000000000000000000000000000000000..c36f3a812885de2b4f940d4ea301478790834def GIT binary patch literal 373 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}V}MVHE0F&G|38pK12bpNoHAv~ z)TvW}jJmoyAlcvF|KrDxpJ4F&_wPS{{s09xZru3n*|X=*pTB(h^3|(XuV24@^XARl zw{PFSfB)gbhmRjWe){z3^XJcBzI^%m_3O89-@bqU4lx8`0?_K;VO!0Cc8in*`2iip zB%@$tVpcbC;>6ke&wl*;_3z*P5w|`7<@-Hd978H@`JTNk)TAKL@X*!8YUR?h4Mx5$ zG57v6MwiX_(k`2}U)rG|#A=$Flfa5iPI>nx3%tlOIril)^ZRxaMuy&Nk-z_LvFJTM z<)CHy@`s&M(jo+=-~6)vn^+^4QAvJN?7f^_^Az6PyZj-Si=$e?PK5EaSVY)~%&$3r r#9r&${ZmrdeMMsR`7VdFU-Ku~ueK3W;N$+b9TaSyu6{1-oD!M-7-FF^Zyqh+r@noJHCKCAo~X){S#1Slxvoo&h`o zc*Gwt96n&PS+Bf0c{(Mg)ALl?dprO6xkeCR?AOW5rTVdASN{4M<7$q}rD{~WB-Ajy zeyEF-@ujZHDZBu9tP{J?)nS_A{U1}f$7b`oQnlZBYpq>tt*_co>p \ No newline at end of file diff --git a/lib/images/fileicons/svg/asm.svg b/lib/images/fileicons/svg/asm.svg new file mode 100644 index 0000000..7483866 --- /dev/null +++ b/lib/images/fileicons/svg/asm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/bash.svg b/lib/images/fileicons/svg/bash.svg new file mode 100644 index 0000000..8406f79 --- /dev/null +++ b/lib/images/fileicons/svg/bash.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/bz2.svg b/lib/images/fileicons/svg/bz2.svg new file mode 100644 index 0000000..44e435e --- /dev/null +++ b/lib/images/fileicons/svg/bz2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/c.svg b/lib/images/fileicons/svg/c.svg new file mode 100644 index 0000000..d014cb2 --- /dev/null +++ b/lib/images/fileicons/svg/c.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/conf.svg b/lib/images/fileicons/svg/conf.svg new file mode 100644 index 0000000..1a9cae0 --- /dev/null +++ b/lib/images/fileicons/svg/conf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/cpp.svg b/lib/images/fileicons/svg/cpp.svg new file mode 100644 index 0000000..178f532 --- /dev/null +++ b/lib/images/fileicons/svg/cpp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/cs.svg b/lib/images/fileicons/svg/cs.svg new file mode 100644 index 0000000..c6853d0 --- /dev/null +++ b/lib/images/fileicons/svg/cs.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/csh.svg b/lib/images/fileicons/svg/csh.svg new file mode 100644 index 0000000..8406f79 --- /dev/null +++ b/lib/images/fileicons/svg/csh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/css.svg b/lib/images/fileicons/svg/css.svg new file mode 100644 index 0000000..f359b94 --- /dev/null +++ b/lib/images/fileicons/svg/css.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/csv.svg b/lib/images/fileicons/svg/csv.svg new file mode 100644 index 0000000..318ba05 --- /dev/null +++ b/lib/images/fileicons/svg/csv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/deb.svg b/lib/images/fileicons/svg/deb.svg new file mode 100644 index 0000000..2cdb6d7 --- /dev/null +++ b/lib/images/fileicons/svg/deb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/doc.svg b/lib/images/fileicons/svg/doc.svg new file mode 100644 index 0000000..ac084a0 --- /dev/null +++ b/lib/images/fileicons/svg/doc.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/docx.svg b/lib/images/fileicons/svg/docx.svg new file mode 100644 index 0000000..ac084a0 --- /dev/null +++ b/lib/images/fileicons/svg/docx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/file.svg b/lib/images/fileicons/svg/file.svg new file mode 100644 index 0000000..2537cbe --- /dev/null +++ b/lib/images/fileicons/svg/file.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/gif.svg b/lib/images/fileicons/svg/gif.svg new file mode 100644 index 0000000..8d4cac8 --- /dev/null +++ b/lib/images/fileicons/svg/gif.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/gz.svg b/lib/images/fileicons/svg/gz.svg new file mode 100644 index 0000000..44e435e --- /dev/null +++ b/lib/images/fileicons/svg/gz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/h.svg b/lib/images/fileicons/svg/h.svg new file mode 100644 index 0000000..b80f32f --- /dev/null +++ b/lib/images/fileicons/svg/h.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/htm.svg b/lib/images/fileicons/svg/htm.svg new file mode 100644 index 0000000..1e37bd4 --- /dev/null +++ b/lib/images/fileicons/svg/htm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/html.svg b/lib/images/fileicons/svg/html.svg new file mode 100644 index 0000000..1e37bd4 --- /dev/null +++ b/lib/images/fileicons/svg/html.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/ico.svg b/lib/images/fileicons/svg/ico.svg new file mode 100644 index 0000000..da894c4 --- /dev/null +++ b/lib/images/fileicons/svg/ico.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/index.php b/lib/images/fileicons/svg/index.php new file mode 100644 index 0000000..2df7699 --- /dev/null +++ b/lib/images/fileicons/svg/index.php @@ -0,0 +1,22 @@ + + + + Filetype icons + + + + + + + '; +} +?> + + diff --git a/lib/images/fileicons/svg/java.svg b/lib/images/fileicons/svg/java.svg new file mode 100644 index 0000000..2a09585 --- /dev/null +++ b/lib/images/fileicons/svg/java.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/jpeg.svg b/lib/images/fileicons/svg/jpeg.svg new file mode 100644 index 0000000..8d4cac8 --- /dev/null +++ b/lib/images/fileicons/svg/jpeg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/jpg.svg b/lib/images/fileicons/svg/jpg.svg new file mode 100644 index 0000000..8d4cac8 --- /dev/null +++ b/lib/images/fileicons/svg/jpg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/js.svg b/lib/images/fileicons/svg/js.svg new file mode 100644 index 0000000..c975547 --- /dev/null +++ b/lib/images/fileicons/svg/js.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/json.svg b/lib/images/fileicons/svg/json.svg new file mode 100644 index 0000000..fde9988 --- /dev/null +++ b/lib/images/fileicons/svg/json.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/lua.svg b/lib/images/fileicons/svg/lua.svg new file mode 100644 index 0000000..8c2a373 --- /dev/null +++ b/lib/images/fileicons/svg/lua.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/mp3.svg b/lib/images/fileicons/svg/mp3.svg new file mode 100644 index 0000000..7d5a0a8 --- /dev/null +++ b/lib/images/fileicons/svg/mp3.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/mp4.svg b/lib/images/fileicons/svg/mp4.svg new file mode 100644 index 0000000..f2a2772 --- /dev/null +++ b/lib/images/fileicons/svg/mp4.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/ods.svg b/lib/images/fileicons/svg/ods.svg new file mode 100644 index 0000000..e361870 --- /dev/null +++ b/lib/images/fileicons/svg/ods.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/odt.svg b/lib/images/fileicons/svg/odt.svg new file mode 100644 index 0000000..f30088b --- /dev/null +++ b/lib/images/fileicons/svg/odt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/ogg.svg b/lib/images/fileicons/svg/ogg.svg new file mode 100644 index 0000000..7d5a0a8 --- /dev/null +++ b/lib/images/fileicons/svg/ogg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/ogv.svg b/lib/images/fileicons/svg/ogv.svg new file mode 100644 index 0000000..f2a2772 --- /dev/null +++ b/lib/images/fileicons/svg/ogv.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/pdf.svg b/lib/images/fileicons/svg/pdf.svg new file mode 100644 index 0000000..e6472df --- /dev/null +++ b/lib/images/fileicons/svg/pdf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/php.svg b/lib/images/fileicons/svg/php.svg new file mode 100644 index 0000000..096500a --- /dev/null +++ b/lib/images/fileicons/svg/php.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/pl.svg b/lib/images/fileicons/svg/pl.svg new file mode 100644 index 0000000..9abc837 --- /dev/null +++ b/lib/images/fileicons/svg/pl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/png.svg b/lib/images/fileicons/svg/png.svg new file mode 100644 index 0000000..8d4cac8 --- /dev/null +++ b/lib/images/fileicons/svg/png.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/ppt.svg b/lib/images/fileicons/svg/ppt.svg new file mode 100644 index 0000000..edcc771 --- /dev/null +++ b/lib/images/fileicons/svg/ppt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/pptx.svg b/lib/images/fileicons/svg/pptx.svg new file mode 100644 index 0000000..edcc771 --- /dev/null +++ b/lib/images/fileicons/svg/pptx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/ps.svg b/lib/images/fileicons/svg/ps.svg new file mode 100644 index 0000000..9cb1835 --- /dev/null +++ b/lib/images/fileicons/svg/ps.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/py.svg b/lib/images/fileicons/svg/py.svg new file mode 100644 index 0000000..4c268d4 --- /dev/null +++ b/lib/images/fileicons/svg/py.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/rar.svg b/lib/images/fileicons/svg/rar.svg new file mode 100644 index 0000000..44e435e --- /dev/null +++ b/lib/images/fileicons/svg/rar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/rb.svg b/lib/images/fileicons/svg/rb.svg new file mode 100644 index 0000000..28b037b --- /dev/null +++ b/lib/images/fileicons/svg/rb.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/rpm.svg b/lib/images/fileicons/svg/rpm.svg new file mode 100644 index 0000000..2cdb6d7 --- /dev/null +++ b/lib/images/fileicons/svg/rpm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/rtf.svg b/lib/images/fileicons/svg/rtf.svg new file mode 100644 index 0000000..6295628 --- /dev/null +++ b/lib/images/fileicons/svg/rtf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/sh.svg b/lib/images/fileicons/svg/sh.svg new file mode 100644 index 0000000..8406f79 --- /dev/null +++ b/lib/images/fileicons/svg/sh.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/sql.svg b/lib/images/fileicons/svg/sql.svg new file mode 100644 index 0000000..b2c3e21 --- /dev/null +++ b/lib/images/fileicons/svg/sql.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/svg.svg b/lib/images/fileicons/svg/svg.svg new file mode 100644 index 0000000..9cb1835 --- /dev/null +++ b/lib/images/fileicons/svg/svg.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/swf.svg b/lib/images/fileicons/svg/swf.svg new file mode 100644 index 0000000..4642c11 --- /dev/null +++ b/lib/images/fileicons/svg/swf.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/tar.svg b/lib/images/fileicons/svg/tar.svg new file mode 100644 index 0000000..2cdb6d7 --- /dev/null +++ b/lib/images/fileicons/svg/tar.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/tgz.svg b/lib/images/fileicons/svg/tgz.svg new file mode 100644 index 0000000..44e435e --- /dev/null +++ b/lib/images/fileicons/svg/tgz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/txt.svg b/lib/images/fileicons/svg/txt.svg new file mode 100644 index 0000000..6295628 --- /dev/null +++ b/lib/images/fileicons/svg/txt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/wav.svg b/lib/images/fileicons/svg/wav.svg new file mode 100644 index 0000000..7d5a0a8 --- /dev/null +++ b/lib/images/fileicons/svg/wav.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/webm.svg b/lib/images/fileicons/svg/webm.svg new file mode 100644 index 0000000..f2a2772 --- /dev/null +++ b/lib/images/fileicons/svg/webm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/xls.svg b/lib/images/fileicons/svg/xls.svg new file mode 100644 index 0000000..ddf8038 --- /dev/null +++ b/lib/images/fileicons/svg/xls.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/xlsx.svg b/lib/images/fileicons/svg/xlsx.svg new file mode 100644 index 0000000..ddf8038 --- /dev/null +++ b/lib/images/fileicons/svg/xlsx.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/xml.svg b/lib/images/fileicons/svg/xml.svg new file mode 100644 index 0000000..6af9a78 --- /dev/null +++ b/lib/images/fileicons/svg/xml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/svg/zip.svg b/lib/images/fileicons/svg/zip.svg new file mode 100644 index 0000000..44e435e --- /dev/null +++ b/lib/images/fileicons/svg/zip.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/fileicons/swf.png b/lib/images/fileicons/swf.png new file mode 100644 index 0000000000000000000000000000000000000000..5c8838778fa2321a05bcfb8ae44c6aee807a1270 GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12Y*Irc9YK zb?VfaGiTN@FaWvz3=BVh{P+n5zkmP!^XCsxaHE~wMtl2b&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL zojheCSXlf2dv@xC%wIbb_eZiN9BAcP%9+gaC}2_kok;>GHklvWa#l8fw+SOd=e5Y+ zmDer4{Jzp$e2(ufv*yc0r#Wty?OtayWKCRGDVQ_m-^)qOmp-pKyfB)voV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=jKf%+*F{I*F?Aez>O$s7y51Tu-WOUz3 zdpfD3V$c8Iue%f1ynM=jxR_1BG3aH03@2m2?>V)PrI;>M=J#a2mX0?sba9!rcJsHZ zAvRxb-)JsA$9H$`#BToV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=jKf%+*F{I*F?AhBwO$q`H4_zIsGT66H zo|>uj=+nRV*U#|@``U{iIL@HpkR=>EQ-Gx^UeSELCx?$|RQB(8ZP$BGF&tR%`P|-k zUBAa+h86Gcn%tRa#KZl_==Q&haY_oCceY$ wbUs;rS-O7z94>(g^4UFC*?kp?Kl`5M=X)h~OPt;0BPi%RUHx3vIVCg!0Fa!wM*si- literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/sxi.png b/lib/images/fileicons/sxi.png new file mode 100644 index 0000000000000000000000000000000000000000..a0fb654312e597052f1fa6d6e2619ec9bbe6edaf GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2Qz0*nKEVS z)TuLP&Sa>oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=jKf%+*F{FYq_G~9#lL1e|Lq3Vm4EzV2 zLs%q}r+lxs-@Q!m@%;%G`j<2`MM!IQPEoq>n`vjEuTw(Ty{Ow}=6mucaWL>$y}$E2 z^zns!VYc^srFU5ewIw>ual38zs+&P{N%lOJ)q8%uoa1=o`OZfRugkW~oo^7rFp>4i wZijQ~)1>R`EmIdL*iO@!%I+(${Mqb2`zPnc(r1?*{s9U)Pgg&ebxsLQ0J~PYxBvhE literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/sxw.png b/lib/images/fileicons/sxw.png new file mode 100644 index 0000000000000000000000000000000000000000..865dc0c6e7ae134112b434898b285471262fb50b GIT binary patch literal 376 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2Qz0*nKEVS z)TuLP&Sa>oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=j-|y+-7*cU7_UvuGW(A&xhe`_8D{fDj zd*@lAQc~sr@6pa3v;O+ddbV5B;6cz)mqQYbHd7^LeN$msCDUUV`}xRmM-_$z7p$`P z=k`7>5Mi8CT=pj3V^#XQx2pI0F>d+7X7WNq`$%!) vo!<_HqV@6XBn>?DMUSo8tny%G)TBS`#*@U&elIBO1BINYtDnm{r-UW|ec8LF literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/tar.png b/lib/images/fileicons/tar.png new file mode 100644 index 0000000000000000000000000000000000000000..8f9fd0f08a95ca78cb6ee9ba04730be65c2083fc GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12fYYrc9YK zb?VfaGiTO?FaWvz@eDtH{P+n5zkmP!^XCsxaATL<#%}v(&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL8Z6yH3NUCsFTZ}~d0Z;vzk3isb%_c}i-XZ@^*?0L5z zfA{fNnR=st`!>gx8M*&wJif{1sA4Ep_>P_7lkxY(t29>4nAyH=b=;RnlNy{#RTeB3 y|HQ}e=g3ZZhK}_erIja`z7%#xtYvMm{Li>0*T5nn#A_2M=saEhT-G@yGywp;o4zXm literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/tgz.png b/lib/images/fileicons/tgz.png new file mode 100644 index 0000000000000000000000000000000000000000..8423ef08738af90d2cb4d0013cf9fdbc2f54c8a8 GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12fYYrc9YK zb?VfaGiTO?FaWvz@eDtH{P+n5zkmP!^XCsxaATL<#%}v(&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfLyq|O z$$72_t0#UES%@_Ju8nOdAj6ke&wl*;_3z*P5w|`7<$FC{978H@rJm*GZ&DCwc3FH zKmPb{zd?Fq*yq;fx02Ea8oZ|pNhY%t#V6p2)e#YZXVrG){ai>6m=IQF^vd$@?2>?CDzH$Hn literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/wav.png b/lib/images/fileicons/wav.png new file mode 100644 index 0000000000000000000000000000000000000000..80eac97837e27993566d00264c7124c8aa87856d GIT binary patch literal 375 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2QwL_Oqnuu z>eQJtXEM|=FwA6N=x6xx^Is!d-m-4^XD&LzI^rS)$7-< z-@JMA_U+sE@85s;@ZsafkDoq$`uzFxmoHzwe*OCG+qduEzeCJ{7y`7tb@z{Sp!Fgp zL4H7YG07+xnV8j0oH%jz{<9xHfBpM+f5fd1K>0pT7srr_Td`+5`I;4Y8XhVsSYOFK zrMKO3Zb!uZ|9`_c6OYGFnxwDDz^oVQq0%FGBDQm1p|8_|Q}-k;n}zSmabaTMTD$q% z*ENMNwjXLPKF4>LSMzD2(;TWKCRGDX^yK?^Vs_nro+jI0rYx&%Y@6Oupkh uM^Sx$z@NWGXBr%eQ(-XU?o+r~`8Q8Tx3NDE{-7;jIn1s`I-!P8XoeQJ!6zJ z;13i`=?T2||L>c$WS)9w5Bn2rOhHR6XL2|$_@;X7m?>wYUUhcv?K>ZKP2^TUkO}K5h1PI=zHZrm^TL^jhH88EC1gD8JPoV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=jKhe|0F{I*F?DuX%c)9ZD xy$?cZI}Y{i5AT!wH%X4`o8~v62}`tG)bd~L6{~yeldK8~J5N_Xmvv4FO#nnnzX|{V literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/xlsx.png b/lib/images/fileicons/xlsx.png new file mode 100644 index 0000000000000000000000000000000000000000..fd5d4f11729c219da6ff3efd9079eaea9a18db13 GIT binary patch literal 379 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK2Qz0*nKEVS z)TuLP&Sa>oV*rx<{Xc&E_z4ETfB*jT=MPZOZsSJ#jT@gmd-nYK^OrAQzIyfQ_3PJf z-n@DH_U-%k?>~I_@bTlvPoF-0{`~pNmoHzxe*O0C+xPF^A?82~0ov{yD_ID%UZf<* z59lr?83iK~v$}~BC(hn~_T%TTfB)`}xb*=jKgrX@F{I*FY;QMTvjUH6cf*^7)f&}1 z&%Sgy^6UTq?aP!?ZZ7oIQ}^X&T4E+RmDADby>`knQ%Rv^Qge!9s}H|+OJzv7!2bUJ zdbZ<TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL$|;lRz(nod3` zmyIDG{^ws@>T30X;r1DqHPbjHif^9Cu4a7vw|t%0uYV@Tcihjv{?*)cTe$BU)Bd*~ ztJRiVG5Yd%ZLWY~+H3h@o7)N7t0xrgdf>ulfrneusdQcYlG!~My5W!wA}4wHK365boFyt=akR{06t>51poj5 literal 0 HcmV?d00001 diff --git a/lib/images/fileicons/zip.png b/lib/images/fileicons/zip.png new file mode 100644 index 0000000000000000000000000000000000000000..4ce08bf7d1c200ef4c004e08e01d98867b1f634c GIT binary patch literal 377 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbK}OMp*^E0F&G|38pK12fYYrc9YK zb?VfaGiTO?FaWvz@eDtH{P+n5zkmP!^XCsxaATL<#%}v(&z?Ph{`}?3m#<#Edj0zK zn>TOXzJ2@t{re9eK79Q6@zbYIpFe;8^5x6duV24?`}Y0&cZfL8Z6yH3NUCsFTZ}~d0Z;vzk3isb%_c}i-XZ@^*?0L5z zfA{fNnR=st`!>gx8M*&wJif{1sA4Ep_>P_7lks=wP|eU8Guihx$L&xFX@50g1)tRk x>s1VYj_j0Y=vd!TT6u!$OJR4!TGj^3|BQ=|8(2iz@`J*V!PC{xWt~$(697KkyS)Ga literal 0 HcmV?d00001 diff --git a/lib/images/history.png b/lib/images/history.png new file mode 100644 index 0000000000000000000000000000000000000000..f6af0f6f18e0e13d38e024dea6ecb3034075cf9d GIT binary patch literal 149 zcmeAS@N?(olHy`uVBq!ia0vp^JV4CH!VDx|PJVD7Nbv{wgt#g)F#P{M=l}ozK!KK~ zmeU&Q>OdA_NswPKgTu2MX+VyNr;B4q1!HmnBO@D|yQ`~fDjSU&5HsGq^p)z4*}Q$iB}1{x@~ literal 0 HcmV?d00001 diff --git a/lib/images/icon-list.png b/lib/images/icon-list.png new file mode 100644 index 0000000000000000000000000000000000000000..4ae738a07065e3bac6deb056fb2c2119097db7ea GIT binary patch literal 584 zcmV-O0=NB%P)>h(tC%ae*E;gdk*5=_J`G*AJ9|?&jpXG3K!u{o*ORkt1gQNhft8bnGm+7;$wZ~6n zdHMB=#l_t9R7yrdFnV$PO_OM(o(~Hf` zJS!`YSYLmeiPzh+H<_5Y!OqU^nwptEIjvHu)ab?1(jDFxK9Rk9t5NUGO*hw5Bodx- z`4=J7k}4wh_4qpnA3yVNe*U#yy><~0Q!@zRluUMvS~buhv=QP&=xAujvAUaeOEih?|(4q@`FW(2eQYDZKYY)H%VcM^%}cnW2-Y z-wjoVss{uW0rkF-7=q9b(O&8mk=BR?5a89d-GREshxy%i#AUKsTK4jJx{D2Q?2QwV4iB9m()PXP z<|0FYnQm-6e>yxIE+vzRbD1E5Il;_}TW z*I&GM{>huiVzMTSfzoUxL4Lsup;-$LUNzHM?gtc!@N{tusbEZYV14womBY_c;L(FA z(;o-6NvjAbE^SabF{MRi={6rnUcHG|Cr)8oa`}?Ok|_7vW)n2LwLG*IZ{|HxXv~m3 ri}BG0m1fh_@+}8dZzx1Ls!U{HSiMn`Iiu6{1-oD!M<3d%t! literal 0 HcmV?d00001 diff --git a/lib/images/index.html b/lib/images/index.html new file mode 100644 index 0000000..977f90e --- /dev/null +++ b/lib/images/index.html @@ -0,0 +1,11 @@ + + + + + +nothing here... + + + + + diff --git a/lib/images/info.png b/lib/images/info.png new file mode 100644 index 0000000000000000000000000000000000000000..5e2336435224870a0a09c4154f703c7bdd5c5de6 GIT binary patch literal 721 zcmV;?0xtcDP)y!VSV7#51h)MdnRE)*SLv)}q9nb7bDQ2hB7;DfSP5FME@qKZo4#v_Fm^pwQfp+ff z@$m#JwQYmwO6#+|SI~hT8;uT8S*v56!#IO@ z&)jR12(Y+R-8qAzw$WfJ{S4xQv3`S&M!aAJwC&)X!+W88ca#6x7N@&04r?q{8$D{TY+rigt)r32eNk@SU1$Aa6K_3FkAyjNAkn?N z&GqkoZlQ+HmkJ-`2c|sz?pHZPU&tOwrA{2rlGwW&5dPU}v+&z8_sW$ur9$(i!iNJ> z?lJTB#jJ=sgZOj!b`tR@rE0)sg}L^7;p4&2^d$Tbs6T>x=#mO&00000NkvXXu0mjf DT+C?l literal 0 HcmV?d00001 diff --git a/lib/images/interwiki.png b/lib/images/interwiki.png new file mode 100644 index 0000000000000000000000000000000000000000..10a2bbe1ecb76b5fed2d51476bb1a687d5d781eb GIT binary patch literal 442 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!63?wyl`GbMf;Q*fyS0K&A#3UsnD-A@lvQjc~ zGIH{=^73*DO7eIUlCI+{8~9 z1{#s?>Eakt!I*5|%zT8)W0Qf=rc+8REl+gb=IB-&Nni@v^X;13F|$`Tp8^=wigR^i zotb4h%T_Qf-q*FNZR)&b7Rn(97+FNFPGNn>#KXhGcgTyYCZ|Bufw4}I(NA&*m%@`r n&jd`J&6+1h&dS)ofRW(}x86dD!*izrt!D6a^>bP0l+XkK_S(|K literal 0 HcmV?d00001 diff --git a/lib/images/interwiki.svg b/lib/images/interwiki.svg new file mode 100644 index 0000000..6c856a2 --- /dev/null +++ b/lib/images/interwiki.svg @@ -0,0 +1 @@ + diff --git a/lib/images/interwiki/amazon.de.svg b/lib/images/interwiki/amazon.de.svg new file mode 100644 index 0000000..9b45506 --- /dev/null +++ b/lib/images/interwiki/amazon.de.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/amazon.svg b/lib/images/interwiki/amazon.svg new file mode 100644 index 0000000..9b45506 --- /dev/null +++ b/lib/images/interwiki/amazon.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/amazon.uk.svg b/lib/images/interwiki/amazon.uk.svg new file mode 100644 index 0000000..9b45506 --- /dev/null +++ b/lib/images/interwiki/amazon.uk.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/callto.svg b/lib/images/interwiki/callto.svg new file mode 100644 index 0000000..c838c52 --- /dev/null +++ b/lib/images/interwiki/callto.svg @@ -0,0 +1 @@ + diff --git a/lib/images/interwiki/doku.svg b/lib/images/interwiki/doku.svg new file mode 100644 index 0000000..4d4ab48 --- /dev/null +++ b/lib/images/interwiki/doku.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/google.svg b/lib/images/interwiki/google.svg new file mode 100644 index 0000000..585d272 --- /dev/null +++ b/lib/images/interwiki/google.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/paypal.svg b/lib/images/interwiki/paypal.svg new file mode 100644 index 0000000..76dabb7 --- /dev/null +++ b/lib/images/interwiki/paypal.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/phpfn.svg b/lib/images/interwiki/phpfn.svg new file mode 100644 index 0000000..21e02a9 --- /dev/null +++ b/lib/images/interwiki/phpfn.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/skype.svg b/lib/images/interwiki/skype.svg new file mode 100644 index 0000000..7c882df --- /dev/null +++ b/lib/images/interwiki/skype.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/tel.svg b/lib/images/interwiki/tel.svg new file mode 100644 index 0000000..c838c52 --- /dev/null +++ b/lib/images/interwiki/tel.svg @@ -0,0 +1 @@ + diff --git a/lib/images/interwiki/user.svg b/lib/images/interwiki/user.svg new file mode 100644 index 0000000..175fc6d --- /dev/null +++ b/lib/images/interwiki/user.svg @@ -0,0 +1 @@ + diff --git a/lib/images/interwiki/wp.svg b/lib/images/interwiki/wp.svg new file mode 100644 index 0000000..5701e89 --- /dev/null +++ b/lib/images/interwiki/wp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/wpde.svg b/lib/images/interwiki/wpde.svg new file mode 100644 index 0000000..5701e89 --- /dev/null +++ b/lib/images/interwiki/wpde.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/wpes.svg b/lib/images/interwiki/wpes.svg new file mode 100644 index 0000000..5701e89 --- /dev/null +++ b/lib/images/interwiki/wpes.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/wpfr.svg b/lib/images/interwiki/wpfr.svg new file mode 100644 index 0000000..5701e89 --- /dev/null +++ b/lib/images/interwiki/wpfr.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/wpjp.svg b/lib/images/interwiki/wpjp.svg new file mode 100644 index 0000000..5701e89 --- /dev/null +++ b/lib/images/interwiki/wpjp.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/wpmeta.svg b/lib/images/interwiki/wpmeta.svg new file mode 100644 index 0000000..5701e89 --- /dev/null +++ b/lib/images/interwiki/wpmeta.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/interwiki/wppl.svg b/lib/images/interwiki/wppl.svg new file mode 100644 index 0000000..5701e89 --- /dev/null +++ b/lib/images/interwiki/wppl.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/larger.gif b/lib/images/larger.gif new file mode 100644 index 0000000000000000000000000000000000000000..e137c92fabb5823ae60d39a7634f9e18489ca9c1 GIT binary patch literal 87 zcmZ?wbhEHb6k!ly_{hWn1P2Zr`2YVukfHdKg^_`Qi9rV>3X*4F(wNe}^7LETMRO)z ml-8M7b^WQQhXj{O*_=BonpB?H-cF7w(Ym+e+;B;*o@YZqijM(8Dv)>IaU%H_Yq3OY7oiQY{Hn! zxW5RQQ zc;dj(-Y*5Fhsur^0+ASTbM|o9`@e5D4?v+XC=3RJ!{O@c>KYmv+8UY&1mdtZ!cb4& z5NU`686k~~j7&{UQAbVCC=~h_%FNu%%G%1>@}!N8jh(%n8|b{7w#9lg zx_T0+zJWw$)KeH_N+X#HYM@dZDbywkjX|X~QEAOodJC!;6dvoja7G_5)vxC{jWVUqzZ7epxYG=2%b6D-1_UB!|^A3R9(Fp>R*TLp>vbzB` zr<>g+=;8uBT%Lf-1GAUc{Y^Lj1;7^w1w8^mPan|J+Yj`<=q+B9vB1-4-Nq%L!xg);!!|6JSH9+9i5t*nw_0pUtizY*Z}(!m^-h5bxK9KyI>)5 zumv3nEO@)?WN+(%pJ*z|_EfZ0;*&MV{Cyd}ToTn7qK)HJKZ>=ggT1V$lhPBP-4o2^dudQ&)7%~b5m?U;d+4Z0#%lM$TFlC?1Sda4(rfRwN2HWbkj|;`) zVHh(5IoTv5jH1@cdhCd3a&l~E{S-R#wBUC^Mu3rl@!9P!Vr`3`E0ku2XNl>rM@5qt zVd|WoM8fAI^9771n2klqAkx}>CjMW&2fJ;owWb!cR*Cs=+D>5k(dlTR3BF*L6nWB9Bzs9@#~H{qk&yqoGzg< z;gR>>c+XX9_wq>ecP5qPILNI~l15B}*&PI4Ywb}k`94g={a0mEYtfV510Kltl6$(6 znzg$&$zCv;!mTYeVMA(RppYYfk?;miYmHDr)J%*>Mwl4z4IDYHbt$?}EBuDG6>SdF zoGq3wpW~s}jLwi$jt#F}Q*|W!EWR|=I~L}DUMa_0)`JoD^^g!1kgC@$VfCHl!I!nl zxKF9GuFKplhHe#NU;-Ll;xHPfd2dS>0uxCMoa!5&;mnJc!bDf-1uCBx!xOLcq%76e z1(8TP5ufIAqZcamLpIT|DaCcmH_YW%p_}8b30q3|3%ikaLG#Y@&BD+Ef1mKD94@OK zI`gcB+Z|VW8?6~{crh7sTTRX#SEbg09V=?qA1pQ_B3xq(6QQ7Hp^dz_;J$p=ofdD_uCHAd$g0U6$q-Cs literal 0 HcmV?d00001 diff --git a/lib/images/license/badge/cc-by-nc-sa.png b/lib/images/license/badge/cc-by-nc-sa.png new file mode 100644 index 0000000000000000000000000000000000000000..e7b57845bafbc3042c41177ebdf8e9909ca0b6eb GIT binary patch literal 1567 zcmXxjdpHwn9KiA69LaNBI+WxxMbu8z2swFNN0Bo-NcT+>x;d1QG1n}Fq#@**qGK4l zm@y+Z+stL=Qlea!ii{3UN5`DEKhF30yubH(pXdGWecp5w@`Re|9#segqULcD;RE)w zU_n)s!1UX-A%Q>?g9i?RUEW9{JR;Am^-c--E}$;lPriUR$P zI)CQuCG@3$fPg^E<*Px#f84wo4!Ru{c{?I10v8<_g(u)+;_!q7LR6rY%w zm`qGgNlH#3rlj0UNxhevo|&F`KjT4aMs{{~4nWGu$;}}Zkn#$1^9%C}@*fu!6qc5h zl$Mv28wN!E)t+t+4S5L2_fT$D-y`I9TZ=g{c z7?g%4N+Yv@%50=IH`1D^bQX=?LSukh=uNE*CcCM*jmhFPvpB347OSNlXld;LTG<_J z_RCiGOLki)(8d9}IPD-XxttDedj}8bc**PN$T{+`2qklQTu*S4>GmX7%{U2De*eXOf2x(@$(i6sm z;1{}fzL$>|&gBu8onI)QnO0FYh)y<$-!5nF_!%K3FA{a)GS@yLw5q9|dN=R%qAkb8 zRkhVKj)_8RgLAtgE$^(~>37Z4eJ%)9 zJc=-TGjjG@xfU{#9@pTXQFjq$7hzJNi$d;8-T%#c*W>Sr8P)HC;JHTYa{eu%J}MW7r6?t=hw!3 z>^Edxg9b(d;A z>k210jY@Z_i(i~T`C|3+=8Uh{F!nM=ZJsm5grjh@@U4~YMrgZQG+GGdb=|*J8!k(e zUiFdx3t9W{O=$z_HlfM1=k{Uyib>v2G=>t3ZP`=D+b4`R+N6~~Xku%W4YratRwgOh z`y&iKg$^O2;=TT4YGv#mh%0^DOum`#`Q-k^i(6kby&8A9m|?k!HhbVwu`t8OqHMrJ r$GeD;b>h(6`;gk1HV=_;?A)f#xu9l!$t;Ng{yD_M4T-3C2}u4A_YOOH literal 0 HcmV?d00001 diff --git a/lib/images/license/badge/cc-by-nc.png b/lib/images/license/badge/cc-by-nc.png new file mode 100644 index 0000000000000000000000000000000000000000..b422cdcfd0e33af019105667c0ff3e418c44750b GIT binary patch literal 1401 zcmXxjc`(~)7zgm5wX$7pf~jiN6>GbttU3nWx=K*2ySmku3VKiLh+7lXYFsITI;%Cb z>WYL!B18mpWcXxFQ5Wa5q;c zKX3k z5KKfYCOR%UCLuO15u1oj!QxV|$q%rpsi|p?($XKMr9Vnf$ERoDGqMO-gzTKWygVXM zNF){!3rh=&%ZkfO%brzMKC7yH4pQ^1v8AD@v9YPOkwk53rjnXzBr-@VnM`XYw>49! zWJ(*ELMOM-DJ=|2E2E{gy@lG|N@G%K9n`iC8ojfP!J@Z!F_`RjCY#y8WOj4|9i1GY zlf_}NdOBG>tgc?5iw*R#yFoy6*&J>+hX-(ac${8-Zyzww$L05NK?}INZ+QJepr1d; zAK>!`hJXQq2oMNGg27?o;0Q1{1dIYhB47*<4FluDBOntaqrl|o*f(S2Q^5Gd^!W7D zlvpg5N~P=T>zkXKU}#3Ga=Bn;@-cp17a&E%vaZ|(@Ve*b4g1SW>q z=dO1x4`tUx>NnIu$F!923r=bZQEu+F69TT1Z>IB-W1+MLC7-7g6C1l=-JVaFtN-hB zowE1!>o?3R<^xO2?WK+}A#vFSd)hIv#V8jOjF`uESASVQ{hj{r_o-Vab(0A!$E^t& zJG|=+>}1tbIPCjvxCDve6=_l&eWxvd)7n=ptJKudUYl_bkB2s{omP_EzBN;UgCRtG zF3m5)W>~6}@l_j4B5$dXC-_38ZVC=zNnQM zhjq;vW3FcT8kMDKNqXX;m01ZInu;JAr5Y>U3^jlGfpHguHXtvV@YdeYbG%pcUahC}Eq zW6IlJI^w8yp7z!Ax;dg3%0K@75JjOULbW1P_rkRxID4-oZ+)KSuZHxTYs>wtn*_R(D=p^Ai-N5}$dfW?NATimdTEcVmoPp~>>-a44k%RHW{%ASg~Gy) zC+sP$F!n7^=#@o}@@oZ`Qigo%&hD7Buo~`Nr)nt5`nKv|9-$7UUki@>({QJZSWxfp pSANGdOmt-5T8i@H5mAdWh1b<*SGv7J?7$jAZq8m#&5r1_{{R~_*l7R& literal 0 HcmV?d00001 diff --git a/lib/images/license/badge/cc-by-nd.png b/lib/images/license/badge/cc-by-nd.png new file mode 100644 index 0000000000000000000000000000000000000000..18322992c13ebdcebdfad31af9d70ead60dffc33 GIT binary patch literal 1261 zcmXxjYc$kp9Ki9vON~o|+D>G|AbVIAC1PpZhG?a6X(M5ju<%6wX=N*-Z$GYDg<;pI+?ue4gKPo^zg8&pA&CCj2Pez}x_WAb4m9 zIuh(LU|H$ufEm4KLj^%vzhc6ogFgS?mzzd#BO@ad6B7gifkYy0t&sK(_6`mXuCA^J z-43{WxTAbgetv#|=s*l80u!GQkHunBl9SU?(=LK=nYnqndHH#l^Yid{JmDIFc#TLb zB$nJLA(2Sr3NpEpTyeXiy0*HZslE}^((r`QMqxf_XHlrEb}GA_24d1^Y$~mTN@vmN z9W*+J#^BHyopfd=gW1Jkburmo7Q36((aq-cbae7KT~9l?{4Oq^+uaLv_XvOttfD^2}S!y=V*0Qm7P*yclSLmEx_ZNcK>+4@at<sbYK3*3(H5mT~uDmw_Y;VwA=gXcf9pKxy$1E{u%AtCtBSW zMK|sD$&a-*SKi#uK>n0m9jS4PTImZ8-bITuy+!W1`$AqSz1229F}ASQ`oPjux|y9_ zTV8R_wj{e>FL-%Ebd|Dj+5d3Ul<>+Hd;gMtV)oGpML>Q($(JSYlQxgZ#Gray0vto^itHo`(_LkqD!Eh46jTd{L+Et zvbxwaj?Lx5!oW8QYptp59MW-jiv+Ggx$OwnX!YzTLi$V*ypMD64!cgsiTfTqhezMp zQ7leve$<%TVz!M-k6@!zt8XrZmsuw0PIZSF8|$O+exAFqH71MRlkJ9{1)NFG%!C~- zoXMmlP0QGYCCc&n{e`hpD5QG4dQVFKs}9!d-a6a(43uh#kfje-bBJftvr=_nB&T~E zfzmPKMMyT~-W{&T%$$<1XV&nI>2OdY2?vo@aW0!KW(_BuyK7HXd|I^Agl3=w8!gOl zHO_{?%x1WE;)4V2LpY(xhOqYYM4Ik7b7q_DpNY>+RC$?Kj636u;U5+|jMbIl!)s5{ z*N#m*pYE(zB2!H$YKt2S7BN*-xLEQjn3+>tmf>FY)idkM#UD+#aO0P@D@1bed7#js Ka5OalOZX2^3Xog? literal 0 HcmV?d00001 diff --git a/lib/images/license/badge/cc-by-sa.png b/lib/images/license/badge/cc-by-sa.png new file mode 100644 index 0000000000000000000000000000000000000000..5749f65b87fe31911a44d659727db630f735a9e4 GIT binary patch literal 1407 zcmXxje>f9(9Ki8uxr(e^CFZx%6ESAvTn?F8QSu{_^u#(BrA6mgDzY?5R%`jy`4vg0 zuwi3A&1RdK*=&l7>L$9QdY+c*Ip_C%{c-Q-_5FOG@AG{B`##^I@X&)MMixd82*e~f zDDWuQW5BZA2n920$HFiKV$c&F5`|y=zqOk%6BrBzhr=x`E$!^=cG=oFI5;?hoE)8; zoc8Y7gG3@xD3m+W6^(KC{K3<2zu$hZeg6LbxIkPuC?fn++$jQqkPv@5g-E;zN=wa3 z&$yg(IVUeCH!p`oBIOt4ldtEK3&`Y~8w@;sDr^^(HWieHYTI3lhM}2Xzyxk zXSa2*+dDYzOil-j%VhDGogf~oi{Hr>baA@bTp@=m1n-QKRY`Mo=(`6u=d8#jH98E5F^;My+I^65rYG}@6nYK^fQA5yprZJxX#pvTkM=d>)W~ASeqPsD*@6vJ1Fh??&E~L(# z)-Ptwv8>6to2pC*C=aXJ9e?A`;X|K1S4j5+Q#N7V(liqdD_7ZkUcT3yP0)c)FW)sc znTP$dJ=3}B&3HIEe)8vxlr+k{tEra^mG-;Lxr_w;Uz97tKA8DGm5G^1d!&&YZK;hh zS6-WjGbKcMn!`i9NQE@##!~;?n5K?n!SV{Sf~J|;kSi;FRSijbIAk(GOqf=ALkr_& zk6E$BKI)Iuz@<1CB-uCN>GICd}uh!Vm~omVw}AB5kUyx0v|MbenFD7SnYqY}vKi8Re29GAVoI zC^m`UULU=V9ZE%^H$XCcU z72F!4LO6MQ-i(8{QE!p3(eax|3u^ln)cD}no~LS&v+g_zw`->j`&E35>*Q%za%q^f zSibDLy8e9F-2;yQ{%+vXob`DpJcz@8Ke?NFK^Nqr^3C(s=oZ7ASz1e5&(@OZJJAka z1}MDQk7?f@EHqX&ywYO3Umm(0U~UW(%al-5yv?}M%hUQT!`#iS%utk6?^m&7Vg1;* zpR6fo8c$SMemLUO_ul%E9wFdkbDn%R|9Xt8%3zw#XBOJF+7)YW`?5Xwg2`4>voDKT z$6Qa@Y^{d4GKS7r1tiv#okU)YefpaBCPQl#lj7VymQ;}DoJ2g-Z1Am@hy63;&Su}8 zHOJL;d52GW&&`#)no)2~Z<03}qG#t3L?1MHU>&ZZ<%Rv_nqSj1hy&AgOLl~&u$7m- zGheU4Cdie^bVeUC>48GW2XLhEo450tvn$Bp4qWNDm<7{|DjJ)ItCN literal 0 HcmV?d00001 diff --git a/lib/images/license/badge/cc-by.png b/lib/images/license/badge/cc-by.png new file mode 100644 index 0000000000000000000000000000000000000000..700679a13ef4d50f08b752a26667244be941c9ec GIT binary patch literal 1186 zcmXxic{tm59Ki9Q6qDeg>a3&HNt-&W7DwxdbDFwF+b3F8MyEA1Q|%MP5nYOrQq_kR zN$aU2a{Lk`Qj&@zA_R?VTDq8Hv>x45SJ%G&*!y{XKi_}8e|?@WDFo{e*EH6I!C>&f z08ALTFM?yPt^#I+!Ix1OOer}eIKp@D|Mp)Z;0OdlM@PrR#KgkF!Uk!BL?Z3&?H!#Q zoX<^aPG`5!IV}u`&fw4)t#oE9 zgW1MlwJ}-kOsJj3=0a>9#Nn}9J2-9p*7lce+|G7xCzsa+@HzxQ2VcPF3p@Bi{>xXu z%TA!XvkL^Ks8b;767&E9VUOTd->Yt*zgyJTEdo<4>e<)RI{@_dN&5N+fqt?{h=?{3>}o?`A4e@&LEp)l9i;aO2SCCAV; zkDxwE>4J+wGD4hMc2Q8NNA31-nByOUV%@CcSoa&>=xe$}HKsn$4Ra$M$}=@GH@iU$ zj`<@CYaVoee36qExA`e4;nGhvdzks#;baHsPlCy@+X7?Lqb-%;K8P8y!;1x{gZNmq ztBX@S%Y9z?VpokS&L?v2bNc1Mq-dC-ZDp_;TFrCf?eO3(*1a|0+6=T!QR$>$PkfO% z#3{WEFk8^F)k7^GB5J&!mJ~Kf<Ui0~VaH{fd}%v4uGwJKuQ<cfT%1YESxUfa2&AM={_Ns39%E@wHk4bu&r(@%+GCu8{s*l&P zOq5A;dBQ(>YF9QU`(u;uvYZ*uri8jW1(O=3MQf(3QB!$Ow7>m(j66;$r7N+Pa-hnz z0*}*2^oCNovP8?)l(CN>B7%;*;AQo@@G34zxg$;-dnHJsO)FC z;zqY6Vsz@a7m4+A9;F=^zB4@ t8Jcli%&kVz;D(c*%+8T-W_##vx;%}qr$lWWwg6ur7U+w`w0Otl{s%1zYN`ML literal 0 HcmV?d00001 diff --git a/lib/images/license/badge/cc-zero.png b/lib/images/license/badge/cc-zero.png new file mode 100644 index 0000000000000000000000000000000000000000..e6d82bfabab892d1af27b2ad2256d8104833e331 GIT binary patch literal 1182 zcmV;P1Y!G$P)6%!Q~6c-s5932}S9~>Sa z9w8ziBP1duCL<;&B`7H;DJv)|Eh;WAEif@JGBhzYH#9dnHaI#rJwH4@K|Vr5K}1GF zMo2|SN=HmiOHEHqP*P7*RZ>+}R9072SzB0EURqpTTVG*bU}9fgW?^GxVq|7xVrph+ zYG-L{Xk~6`W^Zb2Zfj_9Y;JIEYIARGc5!laac*~VczSnqeRz6&d3Jw#c!7L=fPH&} ze|?65e~5#JiH3xYiH(knh>?wolaG*+kByd*j+m2`mz0*6m6M#8l%1KEp`4wcoSLJa zprW3mrJ|mwqoJy$r>Ul*tf!={sHv-{s;sG|ud1lAtf{iCuCT1LwX(Olwz|BzyuQ1? z!M?=C!pF(R$;-&g&dScw&C}J=*4WkA+t}RR+TP*a;Nsum+b6A@a^&R z@bvfd_W1Sr`}q6)`u_j?xHJcp00001bW%=J06^y0W&i*J%t=H+RCock)c-Ma{`Kfq)tHSPQTuX}vLmTKmEtCv$Q99IzB*vtaOXRJ5_ML)jJ$K`)&n%@4n>th(yquBzQG197|%0XT5E8 zO#5Z>wq%MXh`Q=UfaSu)0fPfIGc`5S(G7TQ$?_G+eeDy8t%Ai@=^xrLRjo0QEY|?O z(FI%t*vwzNMLyE8u-P9|SeFc!feC#|?*)LH`QbX2-**2Ry6zh@)ki!h8J55c8nCGV z8~Nc2?3w+(NY-B4;~CC0&4yqo>6XEAhckmAfou8C*yC#(1*|uDWuH?UWjs}VpARHm z1N6_aqb~v6&Rx98Y1QB8tG*nqv896pHCx3EN%tv0R#l$^_&Rs-7yQt)!$nioI(zEA zclWR&>DmDJtLg?Y8RjnDrf<4WU+wweI-54?so4r|NrqW~&xRcWHOULdG4V=A0q53O z@AGV<#$Qa!na@~01DF8#O~Eg(!Y8JOm*_VJ+MDI<4{Adolq?MZB=ETuyesOgnL4IP zQ%!Z7=Ox?v2c%bR7QX1)9)DE#nlN=YJs>wETO{FwD2}9PvE1b3D;uNptV*%`@Xqe0 zNR{Qj9sBcRPV7iK{HJc$ou9+*yHCkACOi@)-iArGWXC63BXjJD58jbopJ@PsMZhGS znBJA{5?Q{!-GA};&OBM#6qzIbGrBOzxo#|Xj~C)fB(jQBmcY>k_csOM785A7MRxD5 zRHwYk@~w6xdke^7?zr30KWSW;#MC_ziQP$jU&`wqFD?oL1X0=u#fiTRz?|;M7dr$d w%L|u3S*rMiQ}B%8ju~>p4&TB5=EA4sZxjNYOf7oGH~;_u07*qoM6N<$f^Ud1^#A|> literal 0 HcmV?d00001 diff --git a/lib/images/license/badge/cc.png b/lib/images/license/badge/cc.png new file mode 100644 index 0000000000000000000000000000000000000000..e28f32c7936ac9d51e95769466902662f26eaa3c GIT binary patch literal 846 zcmV-U1F`&xP)P7E8%nkb$t*!>sdo{QFEwt8TjAt(CBn$NzwTE)%eOiJ_g5& zF=JLYnEQ%M8yoi*`MTqcQqWR_TR4te5shzGRD|Oof390nDq58KjO*4KkMG;{FK-um z3T$%9lA7ZF139jL((@af79llHrljvD_v$CzT>Ss5nM_zCmil+|+FQ{-o8OfqudMl% zo;`RT6#w%>A4vfn3Xh5d{6i5k113)-0o(xsFcQE@xB`>F90s87Bps*&!0WosW0K6F zZBfCFtS}G;s8+C(3?|{ogjWt7tUD{184fbm)+YC&#nDbuC>i1b#$+~qz>Z+jq=D5)>fH7^if;1DVDNR(xXl72D(8NScRn)~O7CXuKFV%fryP3s=Zj5RD1^8$3 YA7wb9*-@3m_y7O^07*qoM6N<$f}=^IlK=n! literal 0 HcmV?d00001 diff --git a/lib/images/license/badge/gnufdl.png b/lib/images/license/badge/gnufdl.png new file mode 100644 index 0000000000000000000000000000000000000000..635de2bd3aed6f5af9fdf9e71ff2765166ba5f83 GIT binary patch literal 1649 zcmV-%29EiOP)P%~FqR%=x^SzB0bS2jTBo}itqpN_4dkD{cZuA-2wqn59uk))=hu%wcur=+i?n5L+u zu%?=)sivr^r>d-}x2&MJt)aQDqPnl6yRf9Pw6VOhrMmCa#=pnO#>mRY(a6Ec%gEHs#Ldsk)y>A%&d1Nu z&ezY#(9+M?(8*eI;=;i0>=IH9@>Fem~?CJ07=`~Ls@o3YLe000Aw zNkl?bd8zdLjF*42^ft&?le>YMmanZc=h zUBzB+v1{K%0sMAY3lh;J1|TGhE$UBOXi%lb`rU45bpbrh1zq_w4e+XR^4ym)uut`m4c!R*i((jdSY!$o@7iF{V z1DQ1B;6N?EJQvah@KWHl8lKk@T#OU}JP`OvLozwz{Xi%Sr3>} z!^qY}KEP>{Y)$~x>+MpLUMl!E90GU%P_Bais9>m~;a&t_O2K!&+~~R3(8;a1qbYe+ z%roWV1#J}L1n?5TMZ+kR31Hue=+I!Gpc!m#0B#!)RbYB~O9k*FUyInGKcLN?an~TU4I{tyKf@}uoTVQ^sq9<6LQgkO;qD~HovvU(?eDy7d>bPR8d}N*FM_oWxmAts z*9OYl+mOaRc~w8?OQxB*Q%X@77Y59&YRo(Gfx54M)%W=_5PUWH4<>PJ!htFj(kwKX zTh#y`Yg@tgy$@BZsd$;50V>b07@iQHy!c!hkR2z719Phyp2mogtX#Ei$lM}cHLm}u zc?RMoeQ)8x+^U9QD(qQ-{oM}cj=3i6dRqKT`T8PrHci5Vb*q|>kx07iFH){G6u@C6 vf;A85Rt3>3SVNcbR$@KHt9AL`t&a2;M53$_t5qRE00000NkvXXu0mjf`lB#| literal 0 HcmV?d00001 diff --git a/lib/images/license/badge/publicdomain.png b/lib/images/license/badge/publicdomain.png new file mode 100644 index 0000000000000000000000000000000000000000..fd742cc9d4fc07cc4d2ca7ed7a7d1bc78eca924e GIT binary patch literal 1326 zcmXxjc~BBq9Kdlb(nRqZ%k{|A%A-rnpkvKEGo@ucC^b_lx76;mRotaS1XnCFgiyEg z*qmMS0_9Kv1r)iwvGPovr0i6j+%l(hUw`a(KJWMDy?@_4YB(kY4zq(nAP{)y(V$4M z$AGnY{aP@w8<({Zh(T5OF>LVa|ABiWBO_yDV-ph-Q&Us88Qjdw%-r1E!otGd-rmW{ z$=$=#4>SP2hi3Ibhb-CV9ML2a*4DHkjlEG9mnHNEQYK23K&(A@(J06o3HAkfVrXf3eoARj!Dh<>!S$TL z3i)*m+&^$CTPRZRH-%#GguaosaWhGJ*5v2Oh;*CF!AK+oQ#{U{PCPq;u%Rg*(J!%# zmu(IW?VcUckFQKlmPN06Zrzfp5INui=upoGTN!R4gfnh(=n1j6%jn?Lcof`Lrut?z zp|c9O@4wFdUS<5qEzY}@{-chY(iS%qUmP?DOZG6&*iuYeKp}NibGn&IxFmB7>AMGu zO)K6=MBPt?T#7!xNj{)bP|oQhTx*_BU8P8$ZEFIpVMOw3n8+R5LB@gc_pF zn)_aKbgZ{7EF!Ix>2BG4kq;y$P2$W>N0a- zo;z_q+hQNu$s+B<%Uezd?q=0)&77l<(A);9Wk{lLjFCqXraZpvpVfpS>(^nqrTG`Mq`NB-pX_(1=B% zwSEj*^GK!8C?8W#htM~~k)Ig&wC%hQy!ZnI{Uq1*<6?a3a5QpkVvS zlL_MYHD_~UXkpXLTW$`H=$s!sH3Z;D{{c$SucQC~ literal 0 HcmV?d00001 diff --git a/lib/images/license/button/cc-by-nc-nd.png b/lib/images/license/button/cc-by-nc-nd.png new file mode 100644 index 0000000000000000000000000000000000000000..994025f1576979c4812d928f615871fad261fcf0 GIT binary patch literal 391 zcmV;20eJq2P)IWd0001cP)t-s0000D z4Gawp4Gj(r4h{|x5fK>~86Y4aAt50mA|fOuBPS>)E-)@JGchwWGdVjsJ3Tu=LP0`8 zLPJACL_|bYRaIMFTV`fvXKQD2c5!!icYT6=hK7cRhlhxWh>4DQl$n#6nVG7ps;jZ8 zySuy0%*@^0-R|!0|NsALSoq!m0075HL_t(|+O3o64#FT1gx4NwJ?cfRqShWF^Zrk0 zNfsj3KUyXvuoL()*$q?%7L^Dp1MG}WRIw$J+8DV1BL}RL3RYqn0JxpQNzrjUFs`67 z5?WBEAl4QL^qV;`o{z?THvoJ9FZ4iGK+04%EoAI~yxe_T4GkZ7CZ)|(iX6RU;w9u9 z{MO-p178!0GS#wyjJ$+=+t&PkVE8?ZDzqt;T2TJPVKq$nV-LH{Ebx@;$qiQfMK>B~ l#&TueZaVI#g#XKd^#UpFllRIWd0001cP)t-s0000D z4Gawp4Gj(r4h{|x5fK>~86Y4aAt50mA|fOuBPS>)E-)@JGchwWGdVjsJ3Tu=LP0`8 zLPJACL_|bYRaIMFTV`fvXKQD2c5!!icYT6=hK7cRhlhxWh>4DQl$n#6nVG7ps;jZ8 zySuy0%*@^0-R|!0|NsALSoq!m007KML_t(|0j-m5Plg~Eh3}q6D|@k*Fp`Q;BF_K+ zg~{wN=lGOda}(Ivb)V@FT^Z4+N)r0Sn^>%<#-#&%{f8`cjRjG+6@-u1$OL&kE<9U= zPE=IV1*m%pf#sD}tDZ}68WY$H-{l+K0At!X%`oRI{CmJWclm&+op6*8#R5Z*1=DOB zvKVF51K@~-azmxtXeOA`wjq0P&xQo0hW=zRx1ytx{s%92g@%Q1$UsT>a8>y)yNged q=No@q=tud$%G0GgB&>gzEAtEN-;>-3L&JRl0000IWd0001cP)t-s0000D z4Gawp4Gj(r4h{|x5fK>~86Y4aAt50mA|fOuBPS>)E-)@JGchwWGdVjsJ3Tu=LP0`8 zLPJACL_|bYRaIMFTV`fvXKQD2c5!!icYT6=hK7cRhlhxWh>4DQl$n#6nVG7ps;jZ8 zySuy0%*@^0-R|!0|NsALSoq!m006y7L_t(|0j-lsPrx7$M#nB{UFsqgMWqWO@BjZo zC3OzQL#yQl2*cs!3zHFB7_k&33q$5fJS(P|@&n_4K!sD|QOsol;q5snQ67&AYftRN zBqLqKT&ocHI>x*+dW9|Fi@ehfIM=3m!PP3{d#M1e*bqKTOyXha0bHX(P_KqX^}7-p z+a@>Ts-Fp0gVwtehRU3WtSeV=L%F5m8(Mc&i b%Z2#_?QxR(fW!2q00000NkvXXu0mjf6|IWd0001cP)t-s0000D z4Gawp4Gj(r4h{|x5fK>~86Y4aAt50mA|fOuBPS>)E-)@JGchwWGdVjsJ3Tu=LP0`8 zLPJACL_|bYRaIMFTV`fvXKQD2c5!!icYT6=hK7cRhlhxWh>4DQl$n#6nVG7ps;jZ8 zySuy0%*@^0-R|!0|NsALSoq!m006#8L_t(|+O5-T4}u^R2H;a_Wf!|)6qTVwy#N0f zCJmTdAGG8hn;bqoJ8&lP$RUoXv7oX!Q{|3WD(wLt|0IAiwVo4K5y0I7A(~F(!K8xD zi5W(@2HSWLXg_xMsr(i|A9$rF@)AO1rfwjT0J`M?_zFGXg|x9#DGRg_X{W=`n8O@6 ztV6~#BWj4L2fG*c^&n79D>NB#!>D-Sxc=_&$2U~ldE_a}$vuFFr5X*|vD}=upUF{R c{C_!e-Yh|r7Qs2kVE_OC07*qoM6N<$f-p~)H~;_u literal 0 HcmV?d00001 diff --git a/lib/images/license/button/cc-by-sa.png b/lib/images/license/button/cc-by-sa.png new file mode 100644 index 0000000000000000000000000000000000000000..9b9b522abeafa9c9d61323bdef521050aee87df4 GIT binary patch literal 379 zcmV->0fhdEP)IWd0001cP)t-s0000D z4Gawp4Gj(r4h{|x5fK>~86Y4aAt50mA|fOuBPS>)E-)@JGchwWGdVjsJ3Tu=LP0`8 zLPJACL_|bYRaIMFTV`fvXKQD2c5!!icYT6=hK7cRhlhxWh>4DQl$n#6nVG7ps;jZ8 zySuy0%*@^0-R|!0|NsALSoq!m006s5L_t(|0j-nS4uUWcMMoAD7hEh>tCj_8@Be?H zkcN3OfykUdhRnmsrPCoT3~7kc3)`L>Sp-y4^$nE&z``oA7*JaQ;c*Sd(RIEsws09K zuPAd+`#}hF1!Z`-0gMVC^hQ>|nAFz|Ow7XYu#cN#!aF%n7ASH6FbNA03V()xz{G?~ zr{2^s5exZ;8B9vpMixy<+AGRGxa@u;IWd0001cP)t-s0000D z4Gawp4Gj(r4h{|x5fK>~86Y4aAt50mA|fOuBPS>)E-)@JGchwWGdVjsJ3Tu=LP0`8 zLPJACL_|bYRaIMFTV`fvXKQD2c5!!icYT6=hK7cRhlhxWh>4DQl$n#6nVG7ps;jZ8 zySuy0%*@^0-R|!0|NsALSoq!m0068>L_t(|+O3n>4#FT1MaM2`UFtR!MWqWO_y51p zl9cLe3nzq3=HcWfH$x&aBoGxR)Q%geVZ~YF7O3Yi3Y$#9!`leL;~FD|uHnK|!4$-n zsW9NZ7Xs)%H%t^h=#8R+l(}s?$aEAA4^tD~$ynD)RiZ~`zl7d9FCmNE$`&&DPdH1c z6NN4(VVTMgF1z4_`ml=JaIWd0001fP)t-s0000D z4Gawp4Gj(r4h{|x5fK>~86Y4aAt50mA|fOuBPS>)E-)@JGchwWGdVjsJ3Tu=LP0`8 zLPJACL_|bYRaIMFTV`fvXKQD2c5!!icYT6=hK7cRhlhxWh>4DQl$n#6nVG7ps;jZ8 zySuy0%*@^0-R|!0{{Q^{|Nj`&DQExy0J=#;K~#7FtINk*iA2)^R&yFaosh@kHUM~BM^aVB1yocSXIPNJ6Sj2mi$6w!cd(95rO2^MB?L0Y6HWwq zLLpP9YE%({^!w}yO;lo&f^-7%4_L00000NkvXXu0mjfN;#Aq literal 0 HcmV?d00001 diff --git a/lib/images/license/button/cc.png b/lib/images/license/button/cc.png new file mode 100644 index 0000000000000000000000000000000000000000..e04958a8bab6168c46dd19da9028b8210ccba0e2 GIT binary patch literal 391 zcmV;20eJq2P)IWd0001cP)t-s0000D z4Gawp4Gj(r4h{|x5fK>~86Y4aAt50mA|fOuBPS>)E-)@JGchwWGdVjsJ3Tu=LP0`8 zLPJACL_|bYRaIMFTV`fvXKQD2c5!!icYT6=hK7cRhlhxWh>4DQl$n#6nVG7ps;jZ8 zySuy0%*@^0-R|!0|NsALSoq!m0075HL_t(|+O3m|3c@f9MWfr)`IxWHYSp=iwfFzO zPy*R-(jmBBn$q0DAtWv7z#@&HVqn8MQz4d$OE&QMM;)+?nJ2_m0N`$cPL@vNfl&dQ zl5&bt3$^(KqTK)va3UcN#~1KQPoz1FNnBOKL_Q!dNhFhNNqWEwS;te!GXOC00I;hN zQlU8Pc`H;pai)Tq{-{t`t?dCe(*kuu+9}FjIIep@z|%uH5B0Fw&I3=moZQjsupIvm lc`P^K?PueDO8CDVSZ{ZGlq7Wi!_oi%002ovPDHLkV1j)Ho-P0Y literal 0 HcmV?d00001 diff --git a/lib/images/license/button/gnufdl.png b/lib/images/license/button/gnufdl.png new file mode 100644 index 0000000000000000000000000000000000000000..b0e0793de8568c3f65d44152ec2423df57988ba9 GIT binary patch literal 497 zcmVIWd0002YP)t-s00002 z0s;dA0|f;I1_lNV4Gawp4Gj(r4h{|%7Z(^97#SHE8X6iPARr+jAtWUuCnzT=DJd>6 zE-^DPH#avpI5;^wIXgQ$J3Tu+Jv~7}K|(@8LqkJEL_|+dPf}7+Q&Uq|SXf$GT3cRQ zW@ct*YiDe1Y;SLGa&~cdcXxbze0_p_etv$2hK7fShlq%XiH>=cnUkxrs=2wjySux> z!otMF#L3CY%*@Qx)YRA4*WBFP-rnBg;^OA!=IZL|@9*#P^Yi=r`~Uy{!gOHM0002s zNklSXJ literal 0 HcmV?d00001 diff --git a/lib/images/license/button/publicdomain.png b/lib/images/license/button/publicdomain.png new file mode 100644 index 0000000000000000000000000000000000000000..b301baf975424cb3a10e1d1c9bf97366b001ae47 GIT binary patch literal 364 zcmV-y0h9iTP)IWd0001cP)t-s0000D z4Gawp4Gj(r4h{|x5fK>~86Y4aAt50mA|fOuBPS>)E-)@JGchwWGdVjsJ3Tu=LP0`8 zLPJACL_|bYRaIMFTV`fvXKQD2c5!!icYT6=hK7cRhlhxWh>4DQl$n#6nVG7ps;jZ8 zySuy0%*@^0-R|!0|NsALSoq!m0068>L_t(|0j<%=4#FT1#__R>T9>*=MNum)BH#Nz zp-zIt9!vR$aNzLEgdv$Yl1LhZhPzPfpG2Yg0neBMs0;SIxK04>mk3!pPY3fBwj$vK zRTg6V0|EGJBzU72ss>7xuIr)l0P^8$EO;gBcq>hfZ>ktf$R~0_Axoz^sO)dTIM8G* z`jVs*RKIcB48WK_G`mIOE$i7MfX9`Y4Dwp;-aE|oL@;FxChh|dijpkzQ%Cgx0000< KMNUMnLSTX%wvS5y literal 0 HcmV?d00001 diff --git a/lib/images/magnifier.png b/lib/images/magnifier.png new file mode 100644 index 0000000000000000000000000000000000000000..014fa921bf17e1122a1bff1953e0a61375ab0f20 GIT binary patch literal 565 zcmV-50?Pe~P)W(5b)LFf{}Mcf1z!Ohu45ka&LB8Xr`igeM6MG+hIur^krmDrM0#n@_c z^&8x_MGcYior3ZYmnw;+(e|;+ZSw)D*?ft!xIuQeA}akFCTPu4cuqTj=M7@E)cIGRnn0Cs^cRe#;X{8BjT1Xilx9H zf|vFyQy2ESx;~_vFL=jLpuk*tnv>i6_CL(neWR)JklQOHz2{L)Od|cb55BXzl}D#{ zy8Z~znI1Uce137Cf1Wvka>Rq^yAwm}6T(3D9}a z+v6NLzTNLR)dTmD%~$CG(7AJT%f{iuo3?ei#DC{E@#qS8vb_I900000NkvXXu0mjf DhxZV< literal 0 HcmV?d00001 diff --git a/lib/images/media_align_center.png b/lib/images/media_align_center.png new file mode 100644 index 0000000000000000000000000000000000000000..8b30a051b7df348056da5b1601e17d945aaff0e8 GIT binary patch literal 249 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`2RvOILn;`P|NQ@N&#amtAZd_% ztmps#e}9vI{QjG{1^ z9=_%MMC?l>9K?g;~Nd=EJ9_-ZPSBxJj^OHeJ4R=gtg0 x4t{?2z?%-P!5k73m_y9JK0e;xtYXZ_ptGm@gK$vz44_{aJYD@<);T3K0RZ1{X!rmC literal 0 HcmV?d00001 diff --git a/lib/images/media_align_left.png b/lib/images/media_align_left.png new file mode 100644 index 0000000000000000000000000000000000000000..d32bbc235c58fef8a5c694da85d484159a30375a GIT binary patch literal 247 zcmV=c46X<2!dV%h}g5bJGaOF}I|1*>F0<)SfTC`x`K_ba}F^^#pp(Al2 zf;`W~7(>=t+V@?7dfPV5=Xut=C<^}12G865Bh$mZI89UO`<}Y4Bj+4prYuVi2+-^Y z!*5}HO%O$qtm{g^Fbq^x75_wV_y%ztV*_bmB0UC6RbpaA&)h4)ZIzATH@ x<2Y(h+qNffkR*vf#VbPvwFi`&rs3;7rZ>pK+~JcrWvT!G002ovPDHLkV1j^6Ya;*v literal 0 HcmV?d00001 diff --git a/lib/images/media_align_noalign.png b/lib/images/media_align_noalign.png new file mode 100644 index 0000000000000000000000000000000000000000..e6ce85790da66432eb7491ed05cce7de6c7a593a GIT binary patch literal 218 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`3q4&NLn;{02A}3UY{0YCI^g)NK7Lq5S*zzSG&-75Co7&y;(t>MvZQ_BgMuDcCk*T5Hj{JAVb53eIsZy>c`- z;`&sB_sQZ5W&}00YSr9h%+`%w`&C}+fHdO@rhukjfxJoYZJ$ddKarXLlGo4p+{5Mx S=RX1+%i!ti=d#Wzp$Pz;>sg}! literal 0 HcmV?d00001 diff --git a/lib/images/media_align_right.png b/lib/images/media_align_right.png new file mode 100644 index 0000000000000000000000000000000000000000..32a5cb0a342d45c50bf8ade73a4a5a44ee89147f GIT binary patch literal 250 zcmV61jjG?w|sc9OTripLn^0LD9asQ40 z26}kEw>PlXN?q5KWtnPSSAJ)3Ji#ywf_s-`iOws*vMir^aPSnmuG9HfRi$qr&vQ_K z2svU1bgB>n|L-aHeJ>yZ#U@nUNRZF-%;)$_PeF8N;U1;wtpET307*qoM6N<$f@A?} Apa1{> literal 0 HcmV?d00001 diff --git a/lib/images/media_link_direct.png b/lib/images/media_link_direct.png new file mode 100644 index 0000000000000000000000000000000000000000..13d24ad7c2f41ce68bd5133f26344409e946d7fd GIT binary patch literal 714 zcmV;*0yX`KP)ktGiJ-L57K`{Hy0Hs4QWQk7Ra=+c zC|!uFf_33W1V0pXqg3feO8p>BCQTb#qfMG*=Dp`Ifl7$r!UK14XYM)goX5LDYt8>b z2w-7ldtG{B{9u*{)lZgyj=<@;wCsc}p4)hz)bLd-Qz5klMjS)XDMMiTRrqO-*O#Bgl|o!bXteML zLfkrbGq>N9@dr(`mLNhP1cqNi82*ew*fdb8`wlK+T2_Qe^a}jP#p+JTUIDk=#BE*# zr)sTGTB4MJ0KeCmLgKX>!M`2{TEj`r;rHVjuJQu%pREdQc@u&T2COqK>NU{DzY82y zt|5Hb{O5zV(K_e@oDt>lQ1`wA)tSdI`+`O~yCmAbkQ%swpNq#dhwn#3;#dbCksnR) z!PX|%Yi(t-*;tnYtt8bSKjzLGHM2{L)a!M|ibX#A=4)K~n1AeHtZ;~OxlCX9`^cxi z^}iAbXr&N+UHYn8{Ko6rMJK zfDD@ZCT=5f-Bkcydif1p*JEyOj!Y&)KA$I-%i($+k3ac50P%R-3LNxDjhgbB@mq#$ ze%SpEfbDlzQBtzDwni)#0|+81rFn02gWN+8QYw|2!8Shn;`W=K5>vH5DtBBt`!+Ux z@1#f#4H1ikM5R(;e}5m#vKSc|VQ_GeM$^+}r`Z1L%g=x9TIcccaWk1rru`FlQmK^f wlT5&jJ1B6?xmUJBF#CP<_-xFFJ{X+ZvlK=n!07*qoM6N<$f>@V-G0PWNK`{K@R0-4Yi zkSkcQXYq%Zbv%L$Ul?99O!^`q?h^Zc!iLFb%YX{>GOgP5TlcuWcVuPdW?%qX_4~Kr zewW=BtB+M(nhsQ;rKz&cK|=N)i_lAkTMXrf zMA?}cnBJr^JQZ2b!20v=v)5k(pI^TDcaQ`%egFW;GHn4ske8MK0000*PSaBT(}VzZk0m8T{muv{sDrB zC@yNZ60}wmS}&W{7-1`K7ak`!$-T> z^ZVrYrr0k{L%E)xzjZAa02_tMgPYm3Wg(=2oQx(BXhVjz?;@0E)w<$-Fr2&D4cIw1j_QH~iRVlfGGzB4yATWfkVj=d= z5VyYZF~#1b^X=nuit+b?T#4P zHmC3B&&|f;+SYEJ6MA~?V4wIIEdI6LE6+B!o89G$$6@B}W@&NSe0b;TFAP8ril3Ln Q9{>OV07*qoM6N<$f~9{8pa1{> literal 0 HcmV?d00001 diff --git a/lib/images/media_link_nolnk.png b/lib/images/media_link_nolnk.png new file mode 100644 index 0000000000000000000000000000000000000000..d277ac9554af876c4caa810d2f82c6d8ea7b14cb GIT binary patch literal 452 zcmV;#0XzPQP)@EB&M6eVO z#6(OuiI=_Io%gd?yfa?76!&4K8D@UG2X9Ogi^u`iHr_rj&sp79)3I+qs&Vd6GgzOk0i_DYt`iQA8tzdyk zlsg7&fBD1_x;wgo`!oOpK)l%80F3!=0`P`CJ>(Y7_QXPN{Y ukKxU|%@5Z`jV`-$q}YQZ=M})h-}w*I@~c+fpKNCU0000cb#Fz)?v8f xF6*QJ4rdxz`AwPKcqL33*xxOvN?XLi%#iy^U=nx6)>lAn44$rjF6*2UngHSZ9IyZY literal 0 HcmV?d00001 diff --git a/lib/images/media_size_medium.png b/lib/images/media_size_medium.png new file mode 100644 index 0000000000000000000000000000000000000000..580c63ed57c6ef82989c3458f4ddd9c54e2d5533 GIT binary patch literal 226 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`D?MEtLn>~qogB#9V8Fw=oQbg} zfq^^X0F&4T1MY|!tU6~7>6~$rJgHop$)?=c&#n75Z?UAGi`~ch3yKeiOb|Y@?vRJ= zX3;Ytck)>N^(N>)k#^K#`Jx-PA?DfYMzO3|`>UHB`j=b3)p3v$G-s85Bv;vAQ>#7W zOw-iXj%HDn1eK3t;2A| z!3_!m8^H9aJiynu(So-tyz$6_qGLOF1X?s4G@K6W1vtNJ zx{_qPKxPSpm+^xG#)(-5ybeDi1^O9}1(@zOgfbTSJ3H z^DIMw^-Pa;JN%J%asJuV!o!fs$C}xcRnRE4g5}6lh2~Df1oJBls%$z9d~6DP3fPXQ z-DD7G`1M^@hhbrjV-jzJq!P!~3bvE3UM##0%mw0(yf=LpF>)|?3r~?KU`ydJ+!(-j z)GMG@&%s9cRclca&x;1D@3KJ;);76m<{AmRN-%h>1cVrVL0B)5He|DeP~R7qH0_q)VB=eG5w)OCeoSh{e5F zq!Tm{7A@RAW)HHmgb*-(aM)q_ox_=(S#vxdxduBLjh+HMz~?do;H!<}_|#kNSG%Tf|(!bVHcQTng zvYzK9!{LzsVLF`}o7OZ+oXuubDit=H4I*1Nn@wETrPXSY#~6dW3UE|wFc|PB>-8E@ zEEY9P9>;Nz_Z)CPZ6S \ No newline at end of file diff --git a/lib/images/menu/01-edit_pencil.svg b/lib/images/menu/01-edit_pencil.svg new file mode 100644 index 0000000..e3a4faa --- /dev/null +++ b/lib/images/menu/01-edit_pencil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/02-create_pencil.svg b/lib/images/menu/02-create_pencil.svg new file mode 100644 index 0000000..4c30b49 --- /dev/null +++ b/lib/images/menu/02-create_pencil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/03-draft_android-studio.svg b/lib/images/menu/03-draft_android-studio.svg new file mode 100644 index 0000000..589658d --- /dev/null +++ b/lib/images/menu/03-draft_android-studio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/04-show_file-document.svg b/lib/images/menu/04-show_file-document.svg new file mode 100644 index 0000000..0eed274 --- /dev/null +++ b/lib/images/menu/04-show_file-document.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/05-source_file-xml.svg b/lib/images/menu/05-source_file-xml.svg new file mode 100644 index 0000000..7e00342 --- /dev/null +++ b/lib/images/menu/05-source_file-xml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/06-revert_replay.svg b/lib/images/menu/06-revert_replay.svg new file mode 100644 index 0000000..0911e5b --- /dev/null +++ b/lib/images/menu/06-revert_replay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/07-revisions_history.svg b/lib/images/menu/07-revisions_history.svg new file mode 100644 index 0000000..cedbc1b --- /dev/null +++ b/lib/images/menu/07-revisions_history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/08-backlink_link-variant.svg b/lib/images/menu/08-backlink_link-variant.svg new file mode 100644 index 0000000..4d639a5 --- /dev/null +++ b/lib/images/menu/08-backlink_link-variant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/09-subscribe_email-outline.svg b/lib/images/menu/09-subscribe_email-outline.svg new file mode 100644 index 0000000..3b23dac --- /dev/null +++ b/lib/images/menu/09-subscribe_email-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/10-top_arrow-up.svg b/lib/images/menu/10-top_arrow-up.svg new file mode 100644 index 0000000..61003a8 --- /dev/null +++ b/lib/images/menu/10-top_arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/11-mediamanager_folder-image.svg b/lib/images/menu/11-mediamanager_folder-image.svg new file mode 100644 index 0000000..4376fdf --- /dev/null +++ b/lib/images/menu/11-mediamanager_folder-image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/12-back_arrow-left.svg b/lib/images/menu/12-back_arrow-left.svg new file mode 100644 index 0000000..d8011b1 --- /dev/null +++ b/lib/images/menu/12-back_arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/account-card-details.svg b/lib/images/menu/account-card-details.svg new file mode 100644 index 0000000..ba74256 --- /dev/null +++ b/lib/images/menu/account-card-details.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/account-plus.svg b/lib/images/menu/account-plus.svg new file mode 100644 index 0000000..a978bf1 --- /dev/null +++ b/lib/images/menu/account-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/calendar-clock.svg b/lib/images/menu/calendar-clock.svg new file mode 100644 index 0000000..b19735d --- /dev/null +++ b/lib/images/menu/calendar-clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/file-tree.svg b/lib/images/menu/file-tree.svg new file mode 100644 index 0000000..0f26188 --- /dev/null +++ b/lib/images/menu/file-tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/folder-multiple-image.svg b/lib/images/menu/folder-multiple-image.svg new file mode 100644 index 0000000..f66aaad --- /dev/null +++ b/lib/images/menu/folder-multiple-image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/lock-reset.svg b/lib/images/menu/lock-reset.svg new file mode 100644 index 0000000..49693c6 --- /dev/null +++ b/lib/images/menu/lock-reset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/login.svg b/lib/images/menu/login.svg new file mode 100644 index 0000000..07a9896 --- /dev/null +++ b/lib/images/menu/login.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/logout.svg b/lib/images/menu/logout.svg new file mode 100644 index 0000000..97d3158 --- /dev/null +++ b/lib/images/menu/logout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/menu/settings.svg b/lib/images/menu/settings.svg new file mode 100644 index 0000000..ced9871 --- /dev/null +++ b/lib/images/menu/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/minus.gif b/lib/images/minus.gif new file mode 100644 index 0000000000000000000000000000000000000000..7e8cbd754c490762a0673328710b81392e7e27a5 GIT binary patch literal 85 zcmZ?wbhEHbVIqxT&+brR`wzL{l62?=$GbLXs|i@V@Z=fA90W@3RTOe=(vZb%QEF z&|DUxUfpjT(2zT<8ZwLyZntU#`3_wqe9cK{$>#+(6xdtH7j)1$tS0B^TYot92Vi=_ zTQL=jpvon*j9{IhU{p^odV12ai@!rc@Lx8WG{Qo_mz)&zIav`<-5u;8f2lIs=bEXkO8mw;*N5PXIx zcy(fUji=C6!VfZnQ5`9ugHv>`E581_2+msY&HeyBlLQ{>2qv3jF;=$^E~N;bCc28& zljwLDvdjpERRW{0?>v^>as(!_5U{3UvHvW*uM;rZ5P_j8AwHIqa4155wK1hXfuzKDo@u60P-i9y?*2iFs#$$+qrIe5Er@P^*923fT)ZgMN8A0c> zkjfEVJp8s?3^bmB?tUC7*-;n^dHAFh!`~W?J{b>oIT!AhB=kHNqV@(y^2Z~-DdCxV z6p?flIZ)pgBj6~)*WN4`3Pk8E=3u6oqy+>fR|n`0&%gH9m_^$op3Phx0rSg?7^gB3 z7?)y1cL}Ab+d$phi3N=S&c?$~+~f}aEnuJrq>(DwkG7&XsI!DHl_#R?@>V=f-hyr! z3wA{`s;{vp))O$OatMhkn+p>?aW3;|e0eW{S-uya^?T4;E=J`QcIUqY42n#yRFS~} zRVak5CK|S?C}^`oQI^V*ZX{r+N#|^qUuEZ3q_I7+RMvE93aed~!Xnn5`3dS@z8=H# REF1s;002ovPDHLkV1leaSn~h? literal 0 HcmV?d00001 diff --git a/lib/images/ns.png b/lib/images/ns.png new file mode 100644 index 0000000000000000000000000000000000000000..77e03b19e838cfc68ddc8b25e8e05015313b5ccc GIT binary patch literal 799 zcmV+)1K|9LP)Mot^LZeSJ>7bRT%;8D^gU@6R9J*D}V? zsqX&v#t2$}Wwa?8tv?+;IW z?{@?&ULLpQ{T&g0R@^(be_;4ca$4cnX0e?-_3AW_)^D!J|MSv6j-L55d<laOsMa&LN)!Do+=>wcQJ-QYp>CauQ&j8SUx=zBAlth-YuenRUr zPwk(u-1758tu1yM^QgopZP#$Dm_0*>AlfG1GepiU(yT2YAcF0cpSvX2+Xr90Xr&_b zYt!hYi4!yknl+kh8yubZ7Tene?PW~6iq%|TcjX0o%W&)WrPE!Kr){u$3$8=4JVe;I zLw8?^QlE!M0MRO_g3JvF*9bOe@RzUSK645&Zwo+!2CM>h?*VM5NK~Ii`*rL*Si!%L zGbEc=Xf+>^c_k<~m^4GQNCb@mK!J&&YZq?+5we1Z8$CpC{=rV#B6E9C0@pzTnUSah zP>P&90Kmx9DY5|q>gw4`anC^l8xqGQi!)S|pn`}rh-EcJ%mtvem$Plidtf5av9wGT zf?Gk%gr^W^GCwBuBZ)d9LJ+N+6Uw!vYu^xVuYyw%P&cRq2?=N!8gV8QK)x_U@1fIZ z>$j@3?%=}IXVGIu?6^qxB}^!GiTO)RRBpamIV0) zGdMiEkp|=ld%8G=R4^w0U~e(y5#wRvabRGO6Jk1e>hpyIKxqa~S3j3^P6L*YjEZedC?W7tU`1 zDv6gq`10~6Z=HK|j5-r00U&|6_V2Na-`w=aZ%6i~r;j~$w!HDoou0 z^F%4B(rXxHp4iFo%k|jyqI>Jv`%kEOEHFbtFxLabmyf4s(;p{ufPmd`S8WJFTGM#Pee`u2tfo0IPC6k=iws!4@5W~ URyod=wEzGB07*qoM6N<$f`jG|0{{R3 literal 0 HcmV?d00001 diff --git a/lib/images/plus.gif b/lib/images/plus.gif new file mode 100644 index 0000000000000000000000000000000000000000..3da3b945890c48f32ccfe2876c2fe59b5aa3fe04 GIT binary patch literal 88 zcmZ?wbhEHbG9b>{+*VlN5u z3lEakt!I3X*4FQlHYl@^r7@ou&Z0 kDBWX4@1Io$Ys95!&PiXj&Rx1!i}~_e+vs2C%vl+%0X(=I0RR91 literal 0 HcmV?d00001 diff --git a/lib/images/smileys/biggrin.svg b/lib/images/smileys/biggrin.svg new file mode 100644 index 0000000..3fdb9bf --- /dev/null +++ b/lib/images/smileys/biggrin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/confused.svg b/lib/images/smileys/confused.svg new file mode 100644 index 0000000..87bb859 --- /dev/null +++ b/lib/images/smileys/confused.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/cool.svg b/lib/images/smileys/cool.svg new file mode 100644 index 0000000..fff644a --- /dev/null +++ b/lib/images/smileys/cool.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/deleteme.svg b/lib/images/smileys/deleteme.svg new file mode 100644 index 0000000..c4d218a --- /dev/null +++ b/lib/images/smileys/deleteme.svg @@ -0,0 +1,6 @@ + + + + + + diff --git a/lib/images/smileys/doubt.svg b/lib/images/smileys/doubt.svg new file mode 100644 index 0000000..339a6a2 --- /dev/null +++ b/lib/images/smileys/doubt.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/doubt2.svg b/lib/images/smileys/doubt2.svg new file mode 100644 index 0000000..339a6a2 --- /dev/null +++ b/lib/images/smileys/doubt2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/eek.svg b/lib/images/smileys/eek.svg new file mode 100644 index 0000000..80ee1fe --- /dev/null +++ b/lib/images/smileys/eek.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/exclaim.svg b/lib/images/smileys/exclaim.svg new file mode 100644 index 0000000..fe00254 --- /dev/null +++ b/lib/images/smileys/exclaim.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lib/images/smileys/facepalm.svg b/lib/images/smileys/facepalm.svg new file mode 100644 index 0000000..631e91c --- /dev/null +++ b/lib/images/smileys/facepalm.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/fixme.svg b/lib/images/smileys/fixme.svg new file mode 100644 index 0000000..3d2165d --- /dev/null +++ b/lib/images/smileys/fixme.svg @@ -0,0 +1,5 @@ + + + + + diff --git a/lib/images/smileys/fun.svg b/lib/images/smileys/fun.svg new file mode 100644 index 0000000..9b792cb --- /dev/null +++ b/lib/images/smileys/fun.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/index.php b/lib/images/smileys/index.php new file mode 100644 index 0000000..31440fd --- /dev/null +++ b/lib/images/smileys/index.php @@ -0,0 +1,53 @@ + + + + Smileys + + + + + + + '; +} +if (is_dir('local')) { + $smi_list .= '
    '; + foreach (glob('local/*.svg') as $img) { + $smi_list .= '' . $img . ' '; + } +} + +echo '
    +' . $smi_list . ' +
    + +
    +' . $smi_list; +?> +
    + + + diff --git a/lib/images/smileys/lol.svg b/lib/images/smileys/lol.svg new file mode 100644 index 0000000..7ddfcae --- /dev/null +++ b/lib/images/smileys/lol.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/neutral.svg b/lib/images/smileys/neutral.svg new file mode 100644 index 0000000..953f921 --- /dev/null +++ b/lib/images/smileys/neutral.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/question.svg b/lib/images/smileys/question.svg new file mode 100644 index 0000000..657616f --- /dev/null +++ b/lib/images/smileys/question.svg @@ -0,0 +1,4 @@ + + + + diff --git a/lib/images/smileys/razz.svg b/lib/images/smileys/razz.svg new file mode 100644 index 0000000..e249672 --- /dev/null +++ b/lib/images/smileys/razz.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/sad.svg b/lib/images/smileys/sad.svg new file mode 100644 index 0000000..cf3557b --- /dev/null +++ b/lib/images/smileys/sad.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/silenced.svg b/lib/images/smileys/silenced.svg new file mode 100644 index 0000000..873621f --- /dev/null +++ b/lib/images/smileys/silenced.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/smile.svg b/lib/images/smileys/smile.svg new file mode 100644 index 0000000..ff9f989 --- /dev/null +++ b/lib/images/smileys/smile.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/smile2.svg b/lib/images/smileys/smile2.svg new file mode 100644 index 0000000..25d4b96 --- /dev/null +++ b/lib/images/smileys/smile2.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/surprised.svg b/lib/images/smileys/surprised.svg new file mode 100644 index 0000000..21fde1f --- /dev/null +++ b/lib/images/smileys/surprised.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/smileys/wink.svg b/lib/images/smileys/wink.svg new file mode 100644 index 0000000..1b7bba0 --- /dev/null +++ b/lib/images/smileys/wink.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/images/success.png b/lib/images/success.png new file mode 100644 index 0000000000000000000000000000000000000000..200142f94d0d5a125c449902f696e3949b675fba GIT binary patch literal 725 zcmV;`0xJE9P)q}E%9LM`RcD5Z;kU&NhB1j0eS3x4NX*Lw|vMfz^_o8&pjA1h^%E);cBc-&=Qmf55 zwW(8^TT{x!Wk(4y_ofTghS9~oJ)9SZBJGVYK5#gk&*#VCd478U?23P06b23_nOgC3x>E`KLYC);zIOKhF zMBYm)w+)b~%B+dx*tK~x+-n1Hyt)p{d=&`%vumv%O|#WF=#a!x91`VUfm~l|e3mzP zgUI}cwV`rU21{X>Jqr_|f>0AU2j`pnxHMe}nN7SQyCIGj0xEAZs~gYeCli?$b^g=P z%oIU0T?qYj5xna|VEtOSNF=ZKC=#!VSs{=)D&xAsEwG21Q5h(K_NkhP1<+0rdj3~nV(Vys(FDhQ6XF`goDewXOx%39dIxnO1C0J+xYq`;^l<^Y$s&xe5A*WRtsiKA zei`g!3HrlbkeaDYAs~N1Zw{>Vz#P<}E@;H(Z=ZPS!`F9$Y@2I<-jf5ydje1o1g07}GA&_=k%Bly` z;at6knn^YE-czWbslf94MYPW~qHO2{G_I2{xpU!s-GdDK5zti>D+E&PlKB1PXskX1 z9&vY3HI@(KNG^24Drj8FSz{#KkGzI7! z0R{#ZAA^>M`hw9Bj{FO30jB!s9YgFg0mIiv{NkGsZOzxovKe%?z#0ihezkDNXK< zJDNnI-gKM@EYN6PV!Tu&qFq;AVKgd|CKb9S4TTe<=!X^0hyiZmrzn20QYy2Mn#!Fql78@AFj0WD1_D=*eg5JUtP z0|OHQ%-C2d12C&`{gV!+xl-kTFlC zO)2doH!F|uK}O*OmgU{^m<&DcNHksaW_obsgsy0VsKjB1MS|9Jg7QL%4qfm1uKg@B?fB%9pUt9 literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/bold.png b/lib/images/toolbar/bold.png new file mode 100644 index 0000000000000000000000000000000000000000..8f425e9d0e251c46333cce02b241289717814797 GIT binary patch literal 249 zcmVoF6QJVM1|z=KrkyAXdcukpEuiF%;z1r~Xd{EAX%P z`|tQ4LqU3d{Qqd60$%~Q`)>a&=3^*GsE_;~eBYsK z=unf+;0!a8`w><<$hl~=i|XRP+06ItS?gyP0l=T~|AL-?SUh$hAzws&^PDT}%$dT@ zUZ`)q0THz<0_EcDI>FSD%;OBCB`6<#rt;RGxP-nTs<8}W!5KSorlx!z!j3A+Mb}Rrs7olT9R$` zC$&187kQQ}mn|KLQYHOS+PW=*PT)9^VERY`8%o0@$@oE9`)FiWgdq~^jtBz;?*9^) j&F0@dpd3u{dpMU5(D2Le&CG3&00000NkvXXu0mjflt15v literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/h.png b/lib/images/toolbar/h.png new file mode 100644 index 0000000000000000000000000000000000000000..7e43d64218ac93f38ec288f8b75095ef7a130d55 GIT binary patch literal 257 zcmeAS@N?(olHy`uVBq!ia0vp^0wB!61|;P_|4#%`Cp=voLn;`P1@iXE9&=!1kQ8uS z$@p@LRDjz`##{rl`fqBg3Vm#kLKMuJx=u0`8VdNcJrYrP=3t&6)x&#r0{4-(8A*Z; ze|S40H|$K1ob`xF;hmc>H`^oo9eXzL`WC7R_&W-7A5K4DXmYgIp+=x1x?u-*hdR?o zzZ$j}=V#8QYaRHRYuIeupE)~M3v05~xCh(tKS?p!sG;z$`*g#94=&xtA8Z2qS(3_^ zY}qK)@t?WSOhYz7%0aE5u<$3pSwqa(0_GDJc@8rKvNT23oLP7T=qCnGS3j3^P6(Rp-;EPp8g^4lbq<2p)xh0VOyh_vGXE@z6>QX9-$B(GcpLsMh6N7JfNkjSgf`@Dy#{QB l8`|mt{oP>c-@wPofgcpSgu0EHkFNj#002ovPDHLkV1oTkc+LO- literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/h2.png b/lib/images/toolbar/h2.png new file mode 100644 index 0000000000000000000000000000000000000000..adec9ec015d7ad0dc469484f0bf2457c0f5a2db2 GIT binary patch literal 319 zcmV-F0l@x=P)pqHq%ty&1d~<1AVp-or*MQOj0{w|3*6y4_X{k6h$$W) RBrN~{002ovPDHLkV1hAle=Yz3 literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/h3.png b/lib/images/toolbar/h3.png new file mode 100644 index 0000000000000000000000000000000000000000..a758b89145909153e993029332fda2fca2a71eb6 GIT binary patch literal 320 zcmV-G0l)r9L4b`DA>Fph(U|NBsRN2u*pEYTttv1g@IZe4q5Pj5tAqe1wn*i5DddtU^0ru zCIf?D5-iI64mKDEpRvn+@PT^|hrYi98#|8jj(j zPY3++e+o+oB%8wrdj5NY11Y=Ml57^AwpTcn@(Ok&bMR#wxRLTYBKQcghdcb(24Wcq za3Wc|YT!}I+qjghQ#J4+qVgHzA8bz4Zl`0n5-77Xa}}AT9&qS|Dx# z;`KoM2bTfc&E(4w;DKrJ* zGeG zVl&`B4*UekkSZXy1mYB;TmaRKoHFa7E;tIr`yd980bniw0BAdh=v`jNZU6uP07*qo IM6N<$f^HjcegFUf literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/h5.png b/lib/images/toolbar/h5.png new file mode 100644 index 0000000000000000000000000000000000000000..86b725991665a71b03e6ec456f481ec7f8c50625 GIT binary patch literal 318 zcmV-E0m1%>P)AKCp$a2g!@*@>^iXg^W7I;55dO*Ms+rbH5?&=D+dzu zPGJ$L$Y$}1-rruZC(02rkpM6fN0`vQIh5ln(2 zOU4y-_X#KLzU=I>au58%9{#*2Tr+n1zHa*83U;I|;L|ic20}@zI75tW?8CMVY)M+f zuCzsb`34RpML3YQgu*v)E@=bD(w6b#8@R1~PT>kEW?UPGMTrD~4&0lrPX?Zhd!tD< zjXfM;&b0}gz+w}D4!qRAIk-S7Eyh1an*M@UIljb$v=G0(f8kq>uaR{bDCOAV12;8! z+d$PY@GLDH>cAaxX%YSg4sbM!Hx!t6Z4!^Dkm&EA2gc5bdDW=8#sB~S07*qoM6N<$ Eg1~`%!TP)kkqCbY$1&$ ztiWj(Sk$IjWVLM^&t8EwZAxKP+a^%<3T$iBJaXDLg*UIjzVfph1)N||Zc#X>AcKG& zIQ9MJB5>*TER?xOUYi&!ThJTGfNq$Mx zwB0izqd`jql$RY`X@Ml(zmD)C?>%@m^5QmZxs$ zVpmaA19f@tLmgEDha4r+{tH?IG5O~M!xHhXtnmLRz}e$`c7gNvcjO-Y%F9P6YJn6! xngh1m8Mf{tq0Q1?<;5Y~p^Oo^#c+-~GM^dF!>YN?am)Y!002ovPDHLkV1mvuuv`ED literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/hplus.png b/lib/images/toolbar/hplus.png new file mode 100644 index 0000000000000000000000000000000000000000..92efcdbd1ead1812d171f3b212d9255c8c17a7c8 GIT binary patch literal 391 zcmV;20eJq2P)!W8h^CeZ+M+cYLYx|c28W;_ND;X^kZ5U08qA77LU414uAwpL z4@m4D4NcKs(2%EnU-&{Ec?b32BfcN+eR*mm9kFQyuLD%ISq5DgGLQ)gXP^tsOo>Lz`vLRr|OlCb_(k zw7o|ec+(D_pfxHG&wJwu%Ud@c(c!Ky10UMq8eUNu;;KNx_7+WBh@>rg-0d6kLl59~ z)C+ieiohB7KK~S$-W3tk60=0AGV)vC0UqfBEtSOy9b7i;=o6C@n4h zPrz1~I7|(dT@V`^`yY?3e}T511k%>DiG}u!ulC9avpOM5AY$Y{!=Hcu7=8ok-@h4v z^k0Ube;639JpQ(CS+0^Z*nq`H-v1ZlV}Wb>_wPT$Um*Si!a&6k1Az43e?T_G&^s@G zGW5jAFv1PMWz+9JK(T)eK!d=VkpaX2%EMsP003^;=HUZ|s;mG2002ovPDHLkV1ny- BahU)B literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/image.png b/lib/images/toolbar/image.png new file mode 100644 index 0000000000000000000000000000000000000000..5cc7afa698a014631ca2d5b60d09e74eada54a1c GIT binary patch literal 539 zcmV+$0_6RPP)JFXk%+4gbGp+TUwWbi;LzD@DFej6h{ZaLBXM`IO!lr2ZvG|9UO{X zMJF2zq98*307Y7@AIZ%%owNg{IJU_>FGV?fU zj;Nt(af=uW&*}l$K?n}c9>G+>ok-;+Oo`gfFfmLufEdhAm9i^~oBkW%@18#2HbGwK zfV-$ieR@K&ze=Dz8E|(>tUg%{XablDpWl9Vri*PgYo+RhtkqYCD14NpBfU8II z@~Ou}fPfJ7)y74Jb~gcI;o5EXkBx=9no~*%oY2D`w|xHYU zr+Fj*M#Mf=eNCR-W99pKM4=F9=Pe$5JkHj)SK(|%xW_YE6d*l~Z|)WycB*l*G0OYy zBpY96S$lJXrS4fw&T*!gKywZE0f31{teM&;rbp{E%7>Y%OtL=w5~*Lnh}XeZ92Es1 z0Ga?E@y2%@!rTz=p)S-TXD7Aot@o~nwt6{AtB*^WMt%r;Nai`B)cFkF75$P^Z&rWzyy+A5EBz)5FQ@> z-{0T=16f`O2??1H6cqH|&CP8ASqAv{_&o6R^!#sYYa2ka0bX8S2ClBI|7~n+K9Cg) zj*gBKTwGlK8yOibAj<#?3yTLp{9j8;D}ZDJ%*@OjOifMyYiMZvCpjURn3y!^>gpa) pQ&T%2FE4*UQc`lm;Li&bVF2CO%faFH6SDvS002ovPDHLkV1iOhU+Mq= literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/link.png b/lib/images/toolbar/link.png new file mode 100644 index 0000000000000000000000000000000000000000..3d2180a6378c5a5158a7cbd4fa18df099bd147f7 GIT binary patch literal 402 zcmV;D0d4+?P)AtL7=#Oj4(%W4FAzEi)uo#f8XS^X(M6|D385y7*n$$52rhzy3c6(uLL3VnG9)-> z3&kNVZZ6f*7Hmu5?RO5Lo!tx^yxcu^d_xY1XeaH{KqiwpsaC6Zola+ESr)Zgt%a`Z z7fh$@j^H5!1NPrQI-Nd}B&pl)_i4FYQWQnxc^;Xj`D7S|KcCM(;mu|<0s|JEcp#NZ zUDfOL*DwrMl}hDa6vZD!QD`t2P_x-2-0+auw!Hw0&fgbw+wJydI2@{lLg6@@&Az*? zOFo_H<@!m}*PADX6Zn7+#8 w@-@>XyWij;0|OSFJ@^xOp5Ltu?No+-0m|o_IV1adOaK4?07*qoM6N<$f~L)`+yDRo literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/linkextern.png b/lib/images/toolbar/linkextern.png new file mode 100644 index 0000000000000000000000000000000000000000..e854572a9300f0d81fe407cb6e273c7aa6dd0ca1 GIT binary patch literal 902 zcmV;119|+3P)1v78O{vMWu{!Hj02`Lg(^}d)HY!-L8(HhF-@vq)R=VT#`HgM0tKsSCwGuo$W-225#$BA^t?%ygK-3bG^?#>HX>_9?7Ag0;<3maPgHyzZMJBQ`BqFEf9`@Aj?!{TsXp+ z6vBD^i@|RW4h0q12i)kcd#dN9L?1;%!^C2(C{g8U?C36@un3@&F=v=d&)pHWc>e3x zuJ6eJz*tx9iJoLrH@l97ElUU?Qx;X|RIzJnY#RZ#_Ixx4pQHO|Tc>5(R{@m#xy>Z- z;hQJUD}OpAGL$L1f&(L10eut=SWWG-S1O^!c90^goULnTYU%f5S7yf+lrxu}{pjVU zGaZr=AR`O#8hFeJGM`l_8!}6&16+R|t>rJw@G3bskD7Prs7=W8_m+>S!0ALd&TTzS z&M)(%(u#{<`%&8hzgC>oJs!^UD&30S_NvW)fzS`f^AbLRDFzs z6(XN^iPRf3#B_4bGZf7QG;g2%hdb;RstE={*p`T@p65xD2bNjHBZ2C37{6sB1%hPO z1hN;VslH5Tzn5al#$c`ju7l?xgpgE6xVuHG7_U{Lg#4%2NV!NG%e3;4#~W%{zM0_; z?bx#5l)FfKb1UhrpV^taxTaTBg)RQLx4RiXUY%evHACsQ1G)lnhKJv#R4UQBwS_t} zOUZ_JMlRy7@{!48n4g~~l8Kp0=kUp$#qISshK?uY84!%m13IHrM5UkK?b|hv+<6xiL-CNvG4f c%10Oe1^T$8s>UPNrT_o{07*qoM6N<$fo?Ok|qc&M?mZWI08rL5jX;V{o2_#4Wdbt8XV#! z6Ug_zVZs*?J<3}OmSr(_HpI;Hyie0~D5d`TzQ5YG-KwfGWmz6YQS5o1Us;xY+=3JN zMx@r70I&QU@GsyWo&g)chG)R55Mp%;Y#YpS97lrLz67jb7CbWyvn}AHY5MVQ0J9v1 zfnc@;ZWxBy1dj-_?7EI%_6iur+TjA2Wz#f-wY>s{v39rsW?9!Y;b2|?;4?{*Z~@Hw reeDC^EFD-g9LKSVqDa5+SALX#x|g8ai;Xbt00000NkvXXu0mjf&o+Cb literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/ol.png b/lib/images/toolbar/ol.png new file mode 100644 index 0000000000000000000000000000000000000000..c12229a972a9d7e23d6b17ff79d2b4804fb41c92 GIT binary patch literal 302 zcmV+}0nz@6P)NklB8O-&6o5Zl&2|KGUg>HnHl zPX{Ov%a=X=U%K@1|Ki1u$#(%rvvuAj@?!y{8Rh~bBcp6>ZSDUmDk}fw07*qoM6N<$fvr-ny+GHf9 zY;r&}Mw@AyMPW?V+t&`FJn}1t_wD<7zdrT-dmzFBsF|Z?j+!}Y=BSy=k(M-9^lXQ_mx3v{!{*2M@;PcdH&Lv! zP77KSF2eX1^R#wL&E>G&{SMZ&tf8QK!j)TT6bZq~2RDOzj~WSI7h?12u-HaZa8=U^ zDCm+X4I;r`h%XcM3!J=JM=~;kM9_-ROd9ysZcy+Q7A&}3BAU2IgQv(Ko=$W~M$Nd| zsz+mk;^-|bSa5A8b+_I++?<*47#P8wZvtUQ8N7xJ)t6Q|Hb;gI7fKObC`4eA?3|7f z^Rbci?)4F|U;)drvovdRmR+~COB10fG8QnA!fzi_*h<6{7XRBdJ_Flnv$=q}A{+n! N002ovPDHLkV1iWf*3JL` literal 0 HcmV?d00001 diff --git a/lib/images/toolbar/smiley.png b/lib/images/toolbar/smiley.png new file mode 100644 index 0000000000000000000000000000000000000000..54f1e6fb49a91dd801b62a9f2720da7eac2c650b GIT binary patch literal 680 zcmV;Z0$2TsP)ZFU;ow_36$@o%OcYOV|WLyr&QgROs~n=^fur{lMnx_9^J?S%%a% z_Njio-IJk;2#HuAo*K3Tq_|UlhP7WCG&Ximz#gzwYq7r4qFBmdf;8fj*pT&jkwloW z&BYgj{1EBP4tMSrSo(33<)0hiEtzYEV(~hebb@5=c{YcW;JoVyxx)%WSKh!-DMvm7%1$~l4u7pVpprRm3 zka~Ao= zeVqlUR4RJu8XKROta!#mxaU1Z7lE@ZILoZFOuYPow$EXJ|8mYT4Db&u_mL+N(3W8U O0000#@6qksI zh`i(H=PxH{fQgAony#+yJ2f@6GxGBC<&u(;X~M$7<-EMS9fLP7P=o;@6`;|~DlilP O0000$(08;%xEb#B&zX@GkU4<~Yq@<+vzkdA+`1$i^;p)|^C%`oU zy?}zt%ggtdl$88O7mtjL6bKFuK944j>4iUk{xAS-!f@)cWy?N%|Ni|0rWa5FSo81S zzp?rkXaEB-27oa61^@#IgvmGH$B!Q*8Nh@^(FKqfoSd8jki}J1RULqaUm(VSiC?~a z0fl(Ik&%%CNK8dV1*Ewjh$o_}$C{MQ&CL~n-lzv+5Df~{3qX3|>({R_TtI1Fzzjqk v9i9JBTS0*dN)xcO0ZL>b%!sUh;BzAYBK5}tYwMK=00000NkvXXu0mjf`51m3 literal 0 HcmV?d00001 diff --git a/lib/images/trash.png b/lib/images/trash.png new file mode 100644 index 0000000000000000000000000000000000000000..350c5e1cf63427410be981bc18e28145feb644ca GIT binary patch literal 423 zcmV;Y0a*TtP)%#CZANYO2c(7;#q!>*bhPv@xspOeDW)D?*XBQm3Q zHEms|!k3})d~voIK2~p;P*qACIN>W*DwLOs=V3b3v!rUnp+qnubHNrWpX$Y{shQJ` z=vcRHT%r&J9RsA{?%2#3hcXQ}9kppxqNXj%k>-yt+O?-^U!rMKlo~P+|JCSBi$z}u2o&Fx?Z`xED6Lma>MD zz&zF>1+aq7f9?M}{&oCs{lD;E%m0Qi2hY#BGx@`W12xy`pMez|cslq0tpAh$xBTz< zaNzgEzuoV5>|gU_;@_!%UmOH0`0x8~!T&Y)PAvLc_rLPvrtfp!wjJvDv-JPdHUGJh zT=HN1;k4cVCjKw^-|%nF|AQ|+)c@y#OMV1Gpc0;MVb_kG|9|2A-Gx8x|D*f=Bh;LK o>i?Dg^MTl((3N~b(?BEu089UTz@^!9m;e9(07*qoM6N<$f^#vNN&o-= literal 0 HcmV?d00001 diff --git a/lib/images/unc.svg b/lib/images/unc.svg new file mode 100644 index 0000000..d4a90df --- /dev/null +++ b/lib/images/unc.svg @@ -0,0 +1 @@ + diff --git a/lib/images/up.png b/lib/images/up.png new file mode 100644 index 0000000000000000000000000000000000000000..dbacf3f23e5651e28d977e94055c4158204b6f3c GIT binary patch literal 248 zcmVP)t-skfFDb zp|_c*x1X@Yth>yvyw0z^&#%AHu)ff-ztOV6)3d?Tw8huC$=trr;=|PF#Ld^o+3m^J z?`+Ufb9t@Gpn0004WQchCkdFL z3_#%?<~H{Y+xtH$p;-{Vf2V0H3gm&d<eP~EsZ}VZR(Jt5Vw3eJ*EQ4AK yjyA4OoI!xRQ#o8ml|n8g^7gmEq|zW$pHFwM(gcaOo6qq80000 literal 0 HcmV?d00001 diff --git a/lib/images/wrap.gif b/lib/images/wrap.gif new file mode 100644 index 0000000000000000000000000000000000000000..f2253e4a288755bd1087abb67656dee814b6722c GIT binary patch literal 86 zcmZ?wbhEHb6k!lySjfZx1P2Zr_zwn(KUo+-0y-c9B+tO4-qOGF^jn#v3QxZ(opVLf gZyQf+?T|@XI(N}FmFKhK_q4q)tNwManw7yC00KB6f&c&j literal 0 HcmV?d00001 diff --git a/lib/index.html b/lib/index.html new file mode 100644 index 0000000..36286bf --- /dev/null +++ b/lib/index.html @@ -0,0 +1,11 @@ + + + + + + nothing here... + + + + + diff --git a/lib/plugins/acl/action.php b/lib/plugins/acl/action.php new file mode 100644 index 0000000..bb84ff1 --- /dev/null +++ b/lib/plugins/acl/action.php @@ -0,0 +1,89 @@ + + */ +/** + * Register handler + */ +class action_plugin_acl extends ActionPlugin +{ + /** + * Registers a callback function for a given event + * + * @param EventHandler $controller DokuWiki's event controller object + * @return void + */ + public function register(EventHandler $controller) + { + + $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handleAjaxCallAcl'); + } + + /** + * AJAX call handler for ACL plugin + * + * @param Event $event event object by reference + * @param mixed $param empty + * @return void + */ + public function handleAjaxCallAcl(Event $event, $param) + { + if ($event->data !== 'plugin_acl') { + return; + } + $event->stopPropagation(); + $event->preventDefault(); + + global $ID; + global $INPUT; + + /** @var $acl admin_plugin_acl */ + $acl = plugin_load('admin', 'acl'); + if (!$acl->isAccessibleByCurrentUser()) { + echo 'for admins only'; + return; + } + if (!checkSecurityToken()) { + echo 'CRSF Attack'; + return; + } + + $ID = getID(); + $acl->handle(); + + $ajax = $INPUT->str('ajax'); + header('Content-Type: text/html; charset=utf-8'); + + if ($ajax == 'info') { + $acl->printInfo(); + } elseif ($ajax == 'tree') { + $ns = $INPUT->str('ns'); + if ($ns == '*') { + $ns = ''; + } + $ns = cleanID($ns); + $lvl = count(explode(':', $ns)); + $ns = utf8_encodeFN(str_replace(':', '/', $ns)); + + $data = $acl->makeTree($ns, $ns); + + foreach (array_keys($data) as $item) { + $data[$item]['level'] = $lvl + 1; + } + echo html_buildlist( + $data, + 'acl', + [$acl, 'makeTreeItem'], + [$acl, 'makeListItem'] + ); + } + } +} diff --git a/lib/plugins/acl/admin.php b/lib/plugins/acl/admin.php new file mode 100644 index 0000000..128db15 --- /dev/null +++ b/lib/plugins/acl/admin.php @@ -0,0 +1,874 @@ + + * @author Anika Henke (concepts) + * @author Frank Schubert (old version) + */ + +/** + * All DokuWiki plugins to extend the admin function + * need to inherit from this class + */ +class admin_plugin_acl extends AdminPlugin +{ + public $acl; + protected $ns; + /** + * The currently selected item, associative array with id and type. + * Populated from (in this order): + * $_REQUEST['current_ns'] + * $_REQUEST['current_id'] + * $ns + * $ID + */ + protected $current_item; + protected $who = ''; + protected $usersgroups = []; + protected $specials = []; + + /** + * return prompt for admin menu + */ + public function getMenuText($language) + { + return $this->getLang('admin_acl'); + } + + /** + * return sort order for position in admin menu + */ + public function getMenuSort() + { + return 1; + } + + /** + * handle user request + * + * Initializes internal vars and handles modifications + * + * @author Andreas Gohr + */ + public function handle() + { + global $AUTH_ACL; + global $ID; + global $auth; + global $config_cascade; + global $INPUT; + + // fresh 1:1 copy without replacements + $AUTH_ACL = file($config_cascade['acl']['default']); + + // namespace given? + if ($INPUT->str('ns') == '*') { + $this->ns = '*'; + } else { + $this->ns = cleanID($INPUT->str('ns')); + } + + if ($INPUT->str('current_ns')) { + $this->current_item = ['id' => cleanID($INPUT->str('current_ns')), 'type' => 'd']; + } elseif ($INPUT->str('current_id')) { + $this->current_item = ['id' => cleanID($INPUT->str('current_id')), 'type' => 'f']; + } elseif ($this->ns) { + $this->current_item = ['id' => $this->ns, 'type' => 'd']; + } else { + $this->current_item = ['id' => $ID, 'type' => 'f']; + } + + // user or group choosen? + $who = trim($INPUT->str('acl_w')); + if ($INPUT->str('acl_t') == '__g__' && $who) { + $this->who = '@' . ltrim($auth->cleanGroup($who), '@'); + } elseif ($INPUT->str('acl_t') == '__u__' && $who) { + $this->who = ltrim($who, '@'); + if ($this->who != '%USER%' && $this->who != '%GROUP%') { #keep wildcard as is + $this->who = $auth->cleanUser($this->who); + } + } elseif ( + $INPUT->str('acl_t') && + $INPUT->str('acl_t') != '__u__' && + $INPUT->str('acl_t') != '__g__' + ) { + $this->who = $INPUT->str('acl_t'); + } elseif ($who) { + $this->who = $who; + } + + // handle modifications + if ($INPUT->has('cmd') && checkSecurityToken()) { + $cmd = $INPUT->extract('cmd')->str('cmd'); + + // scope for modifications + if ($this->ns) { + if ($this->ns == '*') { + $scope = '*'; + } else { + $scope = $this->ns . ':*'; + } + } else { + $scope = $ID; + } + + if ($cmd == 'save' && $scope && $this->who && $INPUT->has('acl')) { + // handle additions or single modifications + $this->deleteACL($scope, $this->who); + $this->addOrUpdateACL($scope, $this->who, $INPUT->int('acl')); + } elseif ($cmd == 'del' && $scope && $this->who) { + // handle single deletions + $this->deleteACL($scope, $this->who); + } elseif ($cmd == 'update') { + $acl = $INPUT->arr('acl'); + + // handle update of the whole file + foreach ($INPUT->arr('del') as $where => $names) { + // remove all rules marked for deletion + foreach ($names as $who) + unset($acl[$where][$who]); + } + // prepare lines + $lines = []; + // keep header + foreach ($AUTH_ACL as $line) { + if ($line[0] == '#') { + $lines[] = $line; + } else { + break; + } + } + // re-add all rules + foreach ($acl as $where => $opt) { + foreach ($opt as $who => $perm) { + if ($who[0] == '@') { + if ($who != '@ALL') { + $who = '@' . ltrim($auth->cleanGroup($who), '@'); + } + } elseif ($who != '%USER%' && $who != '%GROUP%') { #keep wildcard as is + $who = $auth->cleanUser($who); + } + $who = auth_nameencode($who, true); + $lines[] = "$where\t$who\t$perm\n"; + } + } + // save it + io_saveFile($config_cascade['acl']['default'], implode('', $lines)); + } + + // reload ACL config + $AUTH_ACL = file($config_cascade['acl']['default']); + } + + // initialize ACL array + $this->initAclConfig(); + } + + /** + * ACL Output function + * + * print a table with all significant permissions for the + * current id + * + * @author Frank Schubert + * @author Andreas Gohr + */ + public function html() + { + echo '
    '; + echo '

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

    '; + echo '
    '; + + echo '
    '; + $this->makeExplorer(); + echo '
    '; + + echo '
    '; + $this->printDetail(); + echo '
    '; + echo '
    '; + + echo '
    '; + echo '

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

    '; + echo '
    '; + $this->printAclTable(); + echo '
    '; + + echo '
    '; + echo '1)'; + echo '
    ' . $this->getLang('p_include') . '
    '; + echo '
    '; + + echo '
    '; + } + + /** + * returns array with set options for building links + * + * @author Andreas Gohr + */ + protected function getLinkOptions($addopts = null) + { + $opts = ['do' => 'admin', 'page' => 'acl']; + if ($this->ns) $opts['ns'] = $this->ns; + if ($this->who) $opts['acl_w'] = $this->who; + + if (is_null($addopts)) return $opts; + return array_merge($opts, $addopts); + } + + /** + * Display a tree menu to select a page or namespace + * + * @author Andreas Gohr + */ + protected function makeExplorer() + { + global $conf; + global $ID; + global $lang; + + $ns = $this->ns; + if (empty($ns)) { + $ns = dirname(str_replace(':', '/', $ID)); + if ($ns == '.') $ns = ''; + } elseif ($ns == '*') { + $ns = ''; + } + $ns = utf8_encodeFN(str_replace(':', '/', $ns)); + + $data = $this->makeTree($ns); + + // wrap a list with the root level around the other namespaces + array_unshift($data, [ + 'level' => 0, + 'id' => '*', + 'type' => 'd', + 'open' => 'true', + 'label' => '[' . $lang['mediaroot'] . ']' + ]); + + echo html_buildlist( + $data, + 'acl', + [$this, 'makeTreeItem'], + [$this, 'makeListItem'] + ); + } + + /** + * get a combined list of media and page files + * + * also called via AJAX + * + * @param string $folder an already converted filesystem folder of the current namespace + * @param string $limit limit the search to this folder + * @return array + */ + public function makeTree($folder, $limit = '') + { + global $conf; + + // read tree structure from pages and media + $data = []; + search($data, $conf['datadir'], 'search_index', ['ns' => $folder], $limit); + $media = []; + search($media, $conf['mediadir'], 'search_index', ['ns' => $folder, 'nofiles' => true], $limit); + $data = array_merge($data, $media); + unset($media); + + // combine by sorting and removing duplicates + usort($data, [$this, 'treeSort']); + $count = count($data); + if ($count > 0) for ($i = 1; $i < $count; $i++) { + if ($data[$i - 1]['id'] == $data[$i]['id'] && $data[$i - 1]['type'] == $data[$i]['type']) { + unset($data[$i]); + $i++; // duplicate found, next $i can't be a duplicate, so skip forward one + } + } + return $data; + } + + /** + * usort callback + * + * Sorts the combined trees of media and page files + */ + public function treeSort($a, $b) + { + // handle the trivial cases first + if ($a['id'] == '') return -1; + if ($b['id'] == '') return 1; + // split up the id into parts + $a_ids = explode(':', $a['id']); + $b_ids = explode(':', $b['id']); + // now loop through the parts + while (count($a_ids) && count($b_ids)) { + // compare each level from upper to lower + // until a non-equal component is found + $cur_result = Sort::strcmp(array_shift($a_ids), array_shift($b_ids)); + if ($cur_result) { + // if one of the components is the last component and is a file + // and the other one is either of a deeper level or a directory, + // the file has to come after the deeper level or directory + if ($a_ids === [] && $a['type'] == 'f' && (count($b_ids) || $b['type'] == 'd')) return 1; + if ($b_ids === [] && $b['type'] == 'f' && (count($a_ids) || $a['type'] == 'd')) return -1; + return $cur_result; + } + } + // The two ids seem to be equal. One of them might however refer + // to a page, one to a namespace, the namespace needs to be first. + if ($a_ids === [] && $b_ids === []) { + if ($a['type'] == $b['type']) return 0; + if ($a['type'] == 'f') return 1; + return -1; + } + // Now the empty part is either a page in the parent namespace + // that obviously needs to be after the namespace + // Or it is the namespace that contains the other part and should be + // before that other part. + if ($a_ids === []) return ($a['type'] == 'd') ? -1 : 1; + if ($b_ids === []) return ($b['type'] == 'd') ? 1 : -1; + return 0; //shouldn't happen + } + + /** + * Display the current ACL for selected where/who combination with + * selectors and modification form + * + * @author Andreas Gohr + */ + protected function printDetail() + { + global $ID; + + echo '
    '; + + echo '
    '; + echo $this->getLang('acl_perms') . ' '; + $inl = $this->makeSelect(); + echo sprintf( + '', + ($inl) ? '' : hsc(ltrim($this->who, '@')) + ); + echo ''; + echo '
    '; + + echo '
    '; + $this->printInfo(); + echo '
    '; + + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo '
    '; + } + + /** + * Print info and editor + * + * also loaded via Ajax + */ + public function printInfo() + { + global $ID; + + if ($this->who) { + $current = $this->getExactPermisson(); + + // explain current permissions + $this->printExplanation($current); + // load editor + $this->printAclEditor($current); + } else { + echo '

    '; + if ($this->ns) { + printf($this->getLang('p_choose_ns'), hsc($this->ns)); + } else { + printf($this->getLang('p_choose_id'), hsc($ID)); + } + echo '

    '; + + echo $this->locale_xhtml('help'); + } + } + + /** + * Display the ACL editor + * + * @author Andreas Gohr + */ + protected function printAclEditor($current) + { + global $lang; + + echo '
    '; + if (is_null($current)) { + echo '' . $this->getLang('acl_new') . ''; + } else { + echo '' . $this->getLang('acl_mod') . ''; + } + + echo $this->makeCheckboxes($current, empty($this->ns), 'acl'); + + if (is_null($current)) { + echo ''; + } else { + echo ''; + echo ''; + } + + echo '
    '; + } + + /** + * Explain the currently set permissions in plain english/$lang + * + * @author Andreas Gohr + */ + protected function printExplanation($current) + { + global $ID; + global $auth; + + $who = $this->who; + $ns = $this->ns; + + // prepare where to check + if ($ns) { + if ($ns == '*') { + $check = '*'; + } else { + $check = $ns . ':*'; + } + } else { + $check = $ID; + } + + // prepare who to check + if ($who[0] == '@') { + $user = ''; + $groups = [ltrim($who, '@')]; + } else { + $user = $who; + $info = $auth->getUserData($user); + if ($info === false) { + $groups = []; + } else { + $groups = $info['grps']; + } + } + + // check the permissions + $perm = auth_aclcheck($check, $user, $groups); + + // build array of named permissions + $names = []; + if ($perm) { + if ($ns) { + if ($perm >= AUTH_DELETE) $names[] = $this->getLang('acl_perm16'); + if ($perm >= AUTH_UPLOAD) $names[] = $this->getLang('acl_perm8'); + if ($perm >= AUTH_CREATE) $names[] = $this->getLang('acl_perm4'); + } + if ($perm >= AUTH_EDIT) $names[] = $this->getLang('acl_perm2'); + if ($perm >= AUTH_READ) $names[] = $this->getLang('acl_perm1'); + $names = array_reverse($names); + } else { + $names[] = $this->getLang('acl_perm0'); + } + + // print permission explanation + echo '

    '; + if ($user) { + if ($ns) { + printf($this->getLang('p_user_ns'), hsc($who), hsc($ns), implode(', ', $names)); + } else { + printf($this->getLang('p_user_id'), hsc($who), hsc($ID), implode(', ', $names)); + } + } elseif ($ns) { + printf($this->getLang('p_group_ns'), hsc(ltrim($who, '@')), hsc($ns), implode(', ', $names)); + } else { + printf($this->getLang('p_group_id'), hsc(ltrim($who, '@')), hsc($ID), implode(', ', $names)); + } + echo '

    '; + + // add note if admin + if ($perm == AUTH_ADMIN) { + echo '

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

    '; + } elseif (is_null($current)) { + echo '

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

    '; + } + } + + + /** + * Item formatter for the tree view + * + * User function for html_buildlist() + * + * @author Andreas Gohr + */ + public function makeTreeItem($item) + { + $ret = ''; + // what to display + if (!empty($item['label'])) { + $base = $item['label']; + } else { + $base = ':' . $item['id']; + $base = substr($base, strrpos($base, ':') + 1); + } + + // highlight? + if (($item['type'] == $this->current_item['type'] && $item['id'] == $this->current_item['id'])) { + $cl = ' cur'; + } else { + $cl = ''; + } + + // namespace or page? + if ($item['type'] == 'd') { + if ($item['open']) { + $img = DOKU_BASE . 'lib/images/minus.gif'; + $alt = '−'; + } else { + $img = DOKU_BASE . 'lib/images/plus.gif'; + $alt = '+'; + } + $ret .= '' . $alt . ''; + $ret .= ''; + $ret .= $base; + $ret .= ''; + } else { + $ret .= ''; + $ret .= noNS($item['id']); + $ret .= ''; + } + return $ret; + } + + /** + * List Item formatter + * + * @param array $item + * @return string + */ + public function makeListItem($item) + { + return '
  • '; + } + + + /** + * Get current ACL settings as multidim array + * + * @author Andreas Gohr + */ + public function initAclConfig() + { + global $AUTH_ACL; + global $conf; + $acl_config = []; + $usersgroups = []; + + // get special users and groups + $this->specials[] = '@ALL'; + $this->specials[] = '@' . $conf['defaultgroup']; + if ($conf['manager'] != '!!not set!!') { + $this->specials = array_merge( + $this->specials, + array_map( + 'trim', + explode(',', $conf['manager']) + ) + ); + } + $this->specials = array_filter($this->specials); + $this->specials = array_unique($this->specials); + Sort::sort($this->specials); + + foreach ($AUTH_ACL as $line) { + $line = trim(preg_replace('/#.*$/', '', $line)); //ignore comments + if (!$line) continue; + + $acl = preg_split('/[ \t]+/', $line); + //0 is pagename, 1 is user, 2 is acl + + $acl[1] = rawurldecode($acl[1]); + $acl_config[$acl[0]][$acl[1]] = $acl[2]; + + // store non-special users and groups for later selection dialog + $ug = $acl[1]; + if (in_array($ug, $this->specials)) continue; + $usersgroups[] = $ug; + } + + $usersgroups = array_unique($usersgroups); + Sort::sort($usersgroups); + Sort::ksort($acl_config); + foreach (array_keys($acl_config) as $pagename) { + Sort::ksort($acl_config[$pagename]); + } + + $this->acl = $acl_config; + $this->usersgroups = $usersgroups; + } + + /** + * Display all currently set permissions in a table + * + * @author Andreas Gohr + */ + protected function printAclTable() + { + global $lang; + global $ID; + + echo '
    '; + if ($this->ns) { + echo ''; + } else { + echo ''; + } + echo ''; + echo ''; + echo ''; + echo ''; + echo '
    '; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + echo ''; + foreach ($this->acl as $where => $set) { + foreach ($set as $who => $perm) { + echo ''; + echo ''; + + echo ''; + + echo ''; + + echo ''; + echo ''; + } + } + + echo ''; + echo ''; + echo ''; + echo '
    ' . $this->getLang('where') . '' . $this->getLang('who') . '' . $this->getLang('perm') . '1)' . $lang['btn_delete'] . '
    '; + if (str_ends_with($where, '*')) { + echo '' . hsc($where) . ''; + $ispage = false; + } else { + echo '' . hsc($where) . ''; + $ispage = true; + } + echo ''; + if ($who[0] == '@') { + echo '' . hsc($who) . ''; + } else { + echo '' . hsc($who) . ''; + } + echo ''; + echo $this->makeCheckboxes($perm, $ispage, 'acl[' . $where . '][' . $who . ']'); + echo ''; + echo ''; + echo '
    '; + echo ''; + echo '
    '; + echo '
    '; + echo '
    '; + } + + /** + * Returns the permission which were set for exactly the given user/group + * and page/namespace. Returns null if no exact match is available + * + * @author Andreas Gohr + */ + protected function getExactPermisson() + { + global $ID; + if ($this->ns) { + if ($this->ns == '*') { + $check = '*'; + } else { + $check = $this->ns . ':*'; + } + } else { + $check = $ID; + } + + if (isset($this->acl[$check][$this->who])) { + return $this->acl[$check][$this->who]; + } else { + return null; + } + } + + /** + * adds new acl-entry to conf/acl.auth.php + * + * @author Frank Schubert + */ + public function addOrUpdateACL($acl_scope, $acl_user, $acl_level) + { + global $config_cascade; + + // first make sure we won't end up with 2 lines matching this user and scope. See issue #1115 + $this->deleteACL($acl_scope, $acl_user); + $acl_user = auth_nameencode($acl_user, true); + + // max level for pagenames is edit + if (strpos($acl_scope, '*') === false) { + if ($acl_level > AUTH_EDIT) $acl_level = AUTH_EDIT; + } + + $new_acl = "$acl_scope\t$acl_user\t$acl_level\n"; + + return io_saveFile($config_cascade['acl']['default'], $new_acl, true); + } + + /** + * remove acl-entry from conf/acl.auth.php + * + * @author Frank Schubert + */ + public function deleteACL($acl_scope, $acl_user) + { + global $config_cascade; + $acl_user = auth_nameencode($acl_user, true); + + $acl_pattern = '^' . preg_quote($acl_scope, '/') . '[ \t]+' . $acl_user . '[ \t]+[0-8].*$'; + + return io_deleteFromFile($config_cascade['acl']['default'], "/$acl_pattern/", true); + } + + /** + * print the permission radio boxes + * + * @author Frank Schubert + * @author Andreas Gohr + */ + protected function makeCheckboxes($setperm, $ispage, $name) + { + global $lang; + + static $label = 0; //number labels + $ret = ''; + + if ($ispage && $setperm > AUTH_EDIT) $setperm = AUTH_EDIT; + + foreach ([AUTH_NONE, AUTH_READ, AUTH_EDIT, AUTH_CREATE, AUTH_UPLOAD, AUTH_DELETE] as $perm) { + ++$label; + + //general checkbox attributes + $atts = [ + 'type' => 'radio', + 'id' => 'pbox' . $label, + 'name' => $name, + 'value' => $perm + ]; + //dynamic attributes + if (!is_null($setperm) && $setperm == $perm) $atts['checked'] = 'checked'; + if ($ispage && $perm > AUTH_EDIT) { + $atts['disabled'] = 'disabled'; + $class = ' class="disabled"'; + } else { + $class = ''; + } + + //build code + $ret .= ''; + } + return $ret; + } + + /** + * Print a user/group selector (reusing already used users and groups) + * + * @author Andreas Gohr + */ + protected function makeSelect() + { + $inlist = false; + $usel = ''; + $gsel = ''; + + if ( + $this->who && + !in_array($this->who, $this->usersgroups) && + !in_array($this->who, $this->specials) + ) { + if ($this->who[0] == '@') { + $gsel = ' selected="selected"'; + } else { + $usel = ' selected="selected"'; + } + } else { + $inlist = true; + } + + echo ''; + return $inlist; + } +} diff --git a/lib/plugins/acl/admin.svg b/lib/plugins/acl/admin.svg new file mode 100644 index 0000000..b5cf001 --- /dev/null +++ b/lib/plugins/acl/admin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/plugins/acl/lang/af/lang.php b/lib/plugins/acl/lang/af/lang.php new file mode 100644 index 0000000..04d9b0a --- /dev/null +++ b/lib/plugins/acl/lang/af/lang.php @@ -0,0 +1,10 @@ +acl|المستندات الرسمية عن ACL]] قد يساعدك على الفهم الكامل لطريقة عمل التحكم بالوصول في دوكو ويكي. diff --git a/lib/plugins/acl/lang/ar/lang.php b/lib/plugins/acl/lang/ar/lang.php new file mode 100644 index 0000000..da16a8e --- /dev/null +++ b/lib/plugins/acl/lang/ar/lang.php @@ -0,0 +1,37 @@ + + * @author Yaman Hokan + * @author Usama Akkad + */ +$lang['admin_acl'] = 'إدارة قوائم التحكم بالدخول'; +$lang['acl_group'] = 'مجموعة:'; +$lang['acl_user'] = 'مستخدم:'; +$lang['acl_perms'] = 'ترخيص لـ'; +$lang['page'] = 'صفحة'; +$lang['namespace'] = 'فضاء التسمية'; +$lang['btn_select'] = 'اختيار'; +$lang['p_user_id'] = 'المستخدم%s عنده حاليا الصلاحيات التالية على الصفحة%s: %s.'; +$lang['p_user_ns'] = 'المستخدم %s عنده حاليا الصلاحيات التالية في النطاق%s: %s.'; +$lang['p_group_id'] = 'أعضاء مجموعة%s عندهم حاليا الصلاحيات التالية على الصفحة page %s: %s.'; +$lang['p_group_ns'] = 'أعضاء مجموعة %s عندهم حاليا الصلاحيات التالية في النطاق %s: %s.'; +$lang['p_choose_id'] = 'رجاء مستخدما أو مجموعة في النموذج أعلاه لعرض أو تحرير اعداد الصلاحيات للصفحة%s.'; +$lang['p_choose_ns'] = 'رجاء Please أدخل مستخدما أو مجموعة في النموذج أعلاه لعرض أو تحرير اعداد الصلاحيات للنطاق%s.'; +$lang['p_inherited'] = 'لاحظ: هذه الصلاحيات لم تنشأ إراديا بل وُرثت من مجموعات أخرى أو نطاقات أعلى.'; +$lang['p_isadmin'] = 'لاحظ: المجموعة أو المستخدم المحدد عندهم دائما صلاحيات كاملة بسبب ضبطهم كمستخدمين متفوقين.'; +$lang['p_include'] = 'الصلاحيات الاعلى تتضمن الأخفض. صلاحيات الإنشاء ، والرفع، والحذف تطبق فقط على النطاقات، وليس على الصفحات.'; +$lang['current'] = 'قواعد ACL الحالية'; +$lang['where'] = 'الصفحة/النطاق'; +$lang['who'] = 'اسم المستخدم / المجموعة'; +$lang['perm'] = 'التصاريح'; +$lang['acl_perm0'] = 'لا يوجد'; +$lang['acl_perm1'] = 'قراءة'; +$lang['acl_perm2'] = 'تحرير'; +$lang['acl_perm4'] = 'إنشاء'; +$lang['acl_perm8'] = 'تحميل'; +$lang['acl_perm16'] = 'مسح'; +$lang['acl_new'] = 'أضف أضافة جديدة'; +$lang['acl_mod'] = 'عدل المدخلة'; diff --git a/lib/plugins/acl/lang/bg/help.txt b/lib/plugins/acl/lang/bg/help.txt new file mode 100644 index 0000000..ffda1ff --- /dev/null +++ b/lib/plugins/acl/lang/bg/help.txt @@ -0,0 +1,9 @@ +=== Помощ === + +От тук можете да добавяте и премахвате права за именни пространства и страници във вашето Wiki. + * левият панел показва всички налични именни пространства и страници. + * формата отгоре ви позволява да преглеждате и променяте правата на избран потребител или група. + * в таблицата долу са показани всички актуални правила за контрол на достъпа. +Можете да я ползвате за бързо изтриване или промяна на множество правила. + +За да разберете как работи контрола на достъпа в DokuWiki трябва да прочетете [[doku>acl|документацията относно ACL]]. \ No newline at end of file diff --git a/lib/plugins/acl/lang/bg/lang.php b/lib/plugins/acl/lang/bg/lang.php new file mode 100644 index 0000000..5e250bc --- /dev/null +++ b/lib/plugins/acl/lang/bg/lang.php @@ -0,0 +1,37 @@ + + * @author Viktor Usunov + * @author Kiril + */ +$lang['admin_acl'] = 'Управление на списъците за достъп'; +$lang['acl_group'] = 'Група:'; +$lang['acl_user'] = 'Потребител:'; +$lang['acl_perms'] = 'Права за'; +$lang['page'] = 'Страница'; +$lang['namespace'] = 'Именно пространство'; +$lang['btn_select'] = 'Избери'; +$lang['p_user_id'] = 'Потребителят %s в момента има следните права за страницата %s: %s.'; +$lang['p_user_ns'] = 'Потребителят %s в момента има следните права за именното пространство %s: %s.'; +$lang['p_group_id'] = 'Членовете на групата %s в момента имат следните права за страницата %s: %s.'; +$lang['p_group_ns'] = 'Членовете на групата %s в момента имат следните права за именното пространство %s: %s.'; +$lang['p_choose_id'] = 'Моля, въведете потребител или група в полето отгоре, за да видите или промените правата за страницата %s.'; +$lang['p_choose_ns'] = 'Моля, въведете потребител или група в полето отгоре, за да видите или промените правата за именното пространство %s.'; +$lang['p_inherited'] = 'Бележка: Тези права не са зададени директно, а са наследени от други групи или именни пространства.'; +$lang['p_isadmin'] = 'Бележка: Избраната група или потребител има всички права, защото е определен за супер потребител.'; +$lang['p_include'] = 'Висшите права включват по-нисши такива. Правата за създаване, качване и изтриване са приложими само за именни пространства, но не за страници.'; +$lang['current'] = 'Текущи ACL права'; +$lang['where'] = 'Страница/Именно пространство'; +$lang['who'] = 'Потребител/Група'; +$lang['perm'] = 'Права'; +$lang['acl_perm0'] = 'Никакви'; +$lang['acl_perm1'] = 'Четене'; +$lang['acl_perm2'] = 'Редактиране'; +$lang['acl_perm4'] = 'Създаване'; +$lang['acl_perm8'] = 'Качване'; +$lang['acl_perm16'] = 'Изтриване'; +$lang['acl_new'] = 'Добавяне на право'; +$lang['acl_mod'] = 'Промяна на правата'; diff --git a/lib/plugins/acl/lang/ca-valencia/help.txt b/lib/plugins/acl/lang/ca-valencia/help.txt new file mode 100644 index 0000000..87450d2 --- /dev/null +++ b/lib/plugins/acl/lang/ca-valencia/help.txt @@ -0,0 +1,15 @@ +=== Ajuda ràpida: === + +En esta pàgina pot afegir i llevar permissos per a espais de noms i +pàgines del wiki. + +El panel esquerre mostra tots els espais de noms i pàgines disponibles. + +El formulari de dalt permet vore i modificar els permissos de l'usuari +o grup seleccionat. + +En la taula de baix es mostren totes les regles d'accés actuals. Pot +usar-la per a canviar o borrar ràpidament vàries regles. + +Llegint la [[doku>acl|documentació oficial sobre ACL]] podrà +comprendre millor com funciona el control d'accés en DokuWiki. diff --git a/lib/plugins/acl/lang/ca-valencia/lang.php b/lib/plugins/acl/lang/ca-valencia/lang.php new file mode 100644 index 0000000..bdfa7da --- /dev/null +++ b/lib/plugins/acl/lang/ca-valencia/lang.php @@ -0,0 +1,37 @@ + + * @author Bernat Arlandis + * @author Bernat Arlandis + */ +$lang['admin_acl'] = 'Gestor de les llistes de control d\'accés'; +$lang['acl_group'] = 'Grup:'; +$lang['acl_user'] = 'Usuari:'; +$lang['acl_perms'] = 'Permissos per a'; +$lang['page'] = 'Pàgina'; +$lang['namespace'] = 'Espai de noms'; +$lang['btn_select'] = 'Seleccionar'; +$lang['p_user_id'] = 'L\'usuari %s té actualment els següents permissos en la pàgina %s: %s.'; +$lang['p_user_ns'] = 'L\'usuari %s té actualment els següents permissos en l\'espai de noms %s: %s.'; +$lang['p_group_id'] = 'Els membres del grup %s tenen actualment els següents permissos en la pàgina %s: %s.'; +$lang['p_group_ns'] = 'Els membres del grup %s tenen actualment els següents permissos en l\'espai de noms %s: %s.'; +$lang['p_choose_id'] = 'Per favor, introduïxca un usuari o grup en el formulari de dalt per a vore o editar els per a la pàgina %s.'; +$lang['p_choose_ns'] = 'Per favor, introduïxca un usuari o grup en el formulari de dalt per a vore o editar els permissos per a l\'espai de noms %s.'; +$lang['p_inherited'] = 'Nota: estos permissos no s\'han indicat explícitament sino que s\'hereten d\'atres grups o d\'espais de noms antecessors.'; +$lang['p_isadmin'] = 'Nota: el grup o usuari seleccionat té sempre tots els permissos perque està configurat com a super-usuari.'; +$lang['p_include'] = 'Els permissos més alts inclouen als més baixos. Els permissos per a crear, enviar i borrar només valen per a espais de noms, pàgines no.'; +$lang['current'] = 'Regles ACL actuals'; +$lang['where'] = 'Pàgina/espai de noms'; +$lang['who'] = 'Usuari/grup'; +$lang['perm'] = 'Permissos'; +$lang['acl_perm0'] = 'Cap'; +$lang['acl_perm1'] = 'Llegir'; +$lang['acl_perm2'] = 'Editar'; +$lang['acl_perm4'] = 'Crear'; +$lang['acl_perm8'] = 'Pujar'; +$lang['acl_perm16'] = 'Borrar'; +$lang['acl_new'] = 'Afegir entrada nova'; +$lang['acl_mod'] = 'Modificar entrada'; diff --git a/lib/plugins/acl/lang/ca/help.txt b/lib/plugins/acl/lang/ca/help.txt new file mode 100644 index 0000000..d9bcc12 --- /dev/null +++ b/lib/plugins/acl/lang/ca/help.txt @@ -0,0 +1,11 @@ +=== Ajuda ràpida === + +En aquesta pàgina podeu afegir i treure permisos per a espais i pàgines del vostre wiki. + +La subfinestra de l'esquerra mostra tots els espais i pàgines disponibles. + +El formulari de dalt us permet veure i modificar els permisos de l'usuari o grup que seleccioneu. + +En la taula de baix es mostren totes les regles de control d'accés que hagin estat definides. Podeu utilitzar aquesta taula per suprimir o modificar ràpidament totes les regles que vulgueu. + +Llegir la [[doku>acl|documentació oficial sobre ACL]] us pot ajudar a entendre del tot com funciona el control d'accés en DokuWiki. \ No newline at end of file diff --git a/lib/plugins/acl/lang/ca/lang.php b/lib/plugins/acl/lang/ca/lang.php new file mode 100644 index 0000000..b697c37 --- /dev/null +++ b/lib/plugins/acl/lang/ca/lang.php @@ -0,0 +1,37 @@ + + * @author carles.bellver + * @author daniel + */ +$lang['admin_acl'] = 'Gestió de la Llista de Control d\'Accés'; +$lang['acl_group'] = 'Grup:'; +$lang['acl_user'] = 'Usuari:'; +$lang['acl_perms'] = 'Permisos per a'; +$lang['page'] = 'Pàgina'; +$lang['namespace'] = 'Espai'; +$lang['btn_select'] = 'Selecciona'; +$lang['p_user_id'] = 'L\'usuari %s té a hores d\'ara els permisos següents en la pàgina %s: %s.'; +$lang['p_user_ns'] = 'L\'usuari %s té a hores d\'ara els permisos següents en l\'espai %s: %s.'; +$lang['p_group_id'] = 'Els membres del grup %s tenen a hores d\'ara els permisos següents en la pàgina %s: %s.'; +$lang['p_group_ns'] = 'Els membres del grup %s tenen a hores d\'ara els permisos següents en l\'espai %s: %s.'; +$lang['p_choose_id'] = 'Introduïu un usuari o grup en el formulari de dalt per veure o editar els seus permisos en la pàgina %s.'; +$lang['p_choose_ns'] = 'Introduïu un usuari o grup en el formulari de dalt per veure o editar els seus permisos en l\'espai %s.'; +$lang['p_inherited'] = 'Nota: aquests permisos no s\'han definit explícitament, sinó que són heretats d\'altres grups o d\'espais d\'ordre superior.'; +$lang['p_isadmin'] = 'Nota: l\'usuari o grup seleccionat té sempre tots els permisos perquè ha estat configurat com a superusuari.'; +$lang['p_include'] = 'Els permisos més alts inclouen tots els permisos inferiors. Els permisos per a crear, penjar i suprimir només s\'apliquen als espais, no a pàgines.'; +$lang['current'] = 'Regles ACL actuals'; +$lang['where'] = 'Pàgina/espai'; +$lang['who'] = 'Usuari/grup'; +$lang['perm'] = 'Permisos'; +$lang['acl_perm0'] = 'Cap'; +$lang['acl_perm1'] = 'Lectura'; +$lang['acl_perm2'] = 'Edició'; +$lang['acl_perm4'] = 'Creació'; +$lang['acl_perm8'] = 'Penjar fitxers'; +$lang['acl_perm16'] = 'Suprimir'; +$lang['acl_new'] = 'Afegeix nova entrada'; +$lang['acl_mod'] = 'Modifica entrada'; diff --git a/lib/plugins/acl/lang/ckb/help.txt b/lib/plugins/acl/lang/ckb/help.txt new file mode 100644 index 0000000..2c8eef9 --- /dev/null +++ b/lib/plugins/acl/lang/ckb/help.txt @@ -0,0 +1,8 @@ +=== یارمەتی خێرا: === + +لەم لاپەڕەیە دەتوانیت مۆڵەتەکان زیاد بکەیت و لاببەیت بۆ بۆشایی ناوەکان و لاپەڕەکان لە ویکیەکەت. + * بەشی چەپ هەموو دەرەتانی ناو و لاپەڕە بەردەستەکان پیشان دەدات. + * ئەو فۆرمەی سەرەوە ڕێگەت پێدەدات بۆ بینین و هەموارکردنی ڕێپێدانەکانی بەکارهێنەر یان گرووپێکی دیاریکراو. + * لە خشتەی خوارەوە هەموو ئەو یاسایانەی کۆنترۆڵی چوونە ژورەوەی ئێستا دانراوە نیشان دراون. دەتوانیت بەکاری بهێنیت بۆ خێرا سڕینەوە یان گۆڕینی یاسا هەمەجۆرەکان. + +خوێندنەوەی acl|دۆکیومێنتی فەرمی لەسەر ACL; لەوانەیە یارمەتیت بدات بۆ تێگەیشتن ت بەتەواوی چۆنیەتی کارکردنی کۆنترۆڵ لە DokuWiki. \ No newline at end of file diff --git a/lib/plugins/acl/lang/ckb/lang.php b/lib/plugins/acl/lang/ckb/lang.php new file mode 100644 index 0000000..e26e47d --- /dev/null +++ b/lib/plugins/acl/lang/ckb/lang.php @@ -0,0 +1,35 @@ + + */ +$lang['admin_acl'] = 'بەڕێوەبردنی پێرستی دەستپێگەیشتنی چاودێر'; +$lang['acl_group'] = 'کۆمەڵە:'; +$lang['acl_user'] = 'بەکارهێنەر:'; +$lang['acl_perms'] = 'مۆڵەتەکان بۆ'; +$lang['page'] = 'پەڕە'; +$lang['namespace'] = 'بۆشایی ناو'; +$lang['btn_select'] = 'دیاریبکە'; +$lang['p_user_id'] = 'بەکارهێنەر %s لە ئێستادا ئەم ڕێپێدانانەی خوارەوەی هەیە لە پەڕەی %s: %s.'; +$lang['p_user_ns'] = 'بەکارهێنەر %s لە ئێستادا ئەم مۆڵەتانەی خوارەوەی هەیە لە بۆشایی ناوی %s: %s.'; +$lang['p_group_id'] = 'ئەندامانی گرووپی %s لە ئێستادا ئەم ڕێپێدانانەی خوارەوەیان هەیە لە پەڕەی %s: %s'; +$lang['p_group_ns'] = 'ئەندامانی گرووپی %s لە ئێستادا مۆڵەتەکانی خوارەوەیان هەیە لە بۆشایی ناوی %s: %s'; +$lang['p_choose_id'] = 'تکایە بەکارهێنەریان یان کۆمەڵەیەک لەم فۆرمەی سەرەوە بۆ بینین یان بژارکردنی مۆڵەتەکانی دانراو بۆ لاپەڕە %s'; +$lang['p_choose_ns'] = 'تکایە بەکارهێنەریان یان گروپ لەم فۆرمەی سەرەوە بۆ بینین یان بژارکردنی مۆڵەتەکانی دانراوە بۆ بۆشایی ناوی %s.'; +$lang['p_inherited'] = 'تێبینی: ئەو مۆڵەتانە دانەنرا بە ئاشکرا بەڵام لە گروپەکانی تر یان بۆشایی ناوی بەرزتر بۆیان دانراوە.'; +$lang['p_isadmin'] = 'تێبینی: گرووپ یان بەکارهێنەری دیاریکراو هەمیشە مۆڵەتی تەواوی هەیە لەبەرئەوەی بە سوپەر بەکارهێنەر شێوەبەندی کراوە.'; +$lang['p_include'] = 'مۆڵەتە باڵاکان بریتین لە ئەوانەی خوارەوە. دروست کردن, بارکردن و سڕینەوە مۆڵەتەکان تەنها کارپێکردن بۆ ناوەکان, نەک لاپەڕەکان.'; +$lang['current'] = 'یاساکانی ئێستای ACL'; +$lang['where'] = 'لاپەڕە/بۆشایی ناو'; +$lang['who'] = 'بەکارهێنەر/گروپ'; +$lang['perm'] = 'مۆڵەتەکان'; +$lang['acl_perm0'] = 'هیچ'; +$lang['acl_perm1'] = 'خوێندنەوە'; +$lang['acl_perm2'] = 'دەستکاری'; +$lang['acl_perm4'] = 'دروستکردن'; +$lang['acl_perm8'] = 'بارکردن'; +$lang['acl_perm16'] = 'سڕینەوە'; +$lang['acl_new'] = 'زیادکردنی داخڵکردنی نوێ'; +$lang['acl_mod'] = 'دەستکاری ی تۆمارکردن بکە'; diff --git a/lib/plugins/acl/lang/cs/help.txt b/lib/plugins/acl/lang/cs/help.txt new file mode 100644 index 0000000..e961e98 --- /dev/null +++ b/lib/plugins/acl/lang/cs/help.txt @@ -0,0 +1,8 @@ +=== Nápověda: === + +Na této stránce můžete přidávat a odebírat oprávnění pro jmenné prostory a stránky svojí wiki. + * Levý panel zobrazuje všechny dostupné jmenné prostory a stránky. + * Formulář výše umožňuje vidět a modifikovat oprávnění vybraného uživatele nebo skupiny. + * V tabulce uvedené níže jsou zobrazeny všechna aktuální pravidla pro řízení přístupu (oprávnění). Zde můžete rychle odebírat a měnit více položek (oprávnění) najednou. + +Pro detailnější nápovědu si přečtěte stránku [[doku>acl|oficiální dokumentace ACL]], která Vám může pomoci plně pochopit princip, na kterém řízení přístupu na DokuWiki funguje. diff --git a/lib/plugins/acl/lang/cs/lang.php b/lib/plugins/acl/lang/cs/lang.php new file mode 100644 index 0000000..1898571 --- /dev/null +++ b/lib/plugins/acl/lang/cs/lang.php @@ -0,0 +1,43 @@ + + * @author Zbynek Krivka + * @author tomas + * @author Marek Sacha + * @author Lefty + * @author Vojta Beran + * @author Jakub A. Těšínský (j@kub.cz) + * @author mkucera66 + * @author Martin Růžička + */ +$lang['admin_acl'] = 'Správa přístupových práv'; +$lang['acl_group'] = 'Skupina:'; +$lang['acl_user'] = 'Uživatel:'; +$lang['acl_perms'] = 'Práva pro'; +$lang['page'] = 'Stránka'; +$lang['namespace'] = 'Jmenný prostor'; +$lang['btn_select'] = 'Vybrat'; +$lang['p_user_id'] = 'Uživatel %s má nyní na stránku %s následující oprávnění: %s.'; +$lang['p_user_ns'] = 'Uživatel %s má nyní na jmenný prostor %s následující oprávnění: %s.'; +$lang['p_group_id'] = 'Členové skupiny %s mají nyní na stránku %s následující oprávnění: %s.'; +$lang['p_group_ns'] = 'Členové skupiny %s mají nyní na jmenný prostor %s následující oprávnění: %s.'; +$lang['p_choose_id'] = 'Prosím, zadejte uživatele nebo skupinu ve formě uvedené výše, abyste mohli prohlížet a editovat množinu oprávnění pro stránku %s.'; +$lang['p_choose_ns'] = 'Prosím, zadejte uživatele nebo skupinu ve formě uvedené výše, abyste mohli prohlížet a editovat množinu oprávnění pro jmenný prostor %s.'; +$lang['p_inherited'] = 'Poznámka: Tato oprávnění nebyla nastavena explicitně, ale jsou zděděna z jiné skupiny nebo z nadřazeného jmenného prostoru.'; +$lang['p_isadmin'] = 'Poznámka: Vybraná skupina nebo uživatel má vždy plná oprávnění, protože je nastaven jako správce (superuser).'; +$lang['p_include'] = 'Vyšší oprávnění zahrnují nižší oprávnění. Vytvořit, Nahrát a Smazat se vztahují jen k jmenným prostorů, nikoliv ke stránkám.'; +$lang['current'] = 'Aktuální ACL pravidla'; +$lang['where'] = 'Stránka/Jmenný prostor'; +$lang['who'] = 'Uživatel/Skupina'; +$lang['perm'] = 'Oprávnění'; +$lang['acl_perm0'] = 'Žádné'; +$lang['acl_perm1'] = 'Čtení'; +$lang['acl_perm2'] = 'Úpravy'; +$lang['acl_perm4'] = 'Vytvoření'; +$lang['acl_perm8'] = 'Upload'; +$lang['acl_perm16'] = 'Mazání'; +$lang['acl_new'] = 'Přidat novou položku'; +$lang['acl_mod'] = 'Editovat položku'; diff --git a/lib/plugins/acl/lang/cy/help.txt b/lib/plugins/acl/lang/cy/help.txt new file mode 100644 index 0000000..f3d6474 --- /dev/null +++ b/lib/plugins/acl/lang/cy/help.txt @@ -0,0 +1,10 @@ +=== Cymorth Byw: === + +Ar y dudalen hon, gallwch chi ychwanegu a dileu hawliau ar gyfer namespaces a thudalennau yn eich wici. + * Mae'r panel ar y chwith yn dangos pob namespace a thudalen. + * Mae'r ffurflen uchod yn eich galluogi chi i weld a newid hawliau defnyddiwr neu grŵp a ddewiswyd. + * Yn y tabl isod, dengys pob rheol rheoli mynediad sydd wedi'u gosod yn bresennol. Gallwch chi ei ddefnyddio i ddileu neu newid sawl rheol ar y tro. + +Gall darllen [[doku>acl|dogfennaeth swyddogol ar ACL]] fod o fudd er mwyn eich helpu chi ddeall yn llawn sut mae rheolaeth mynediad yn gweithio mewn DokuWiki. + + diff --git a/lib/plugins/acl/lang/cy/lang.php b/lib/plugins/acl/lang/cy/lang.php new file mode 100644 index 0000000..add3ca4 --- /dev/null +++ b/lib/plugins/acl/lang/cy/lang.php @@ -0,0 +1,47 @@ + + * @author Anika Henke + * @author Matthias Grimm + * @author Alan Davies + */ + +$lang['admin_acl'] = 'Rheolaeth Rhestr Rheoli Mynediad'; +$lang['acl_group'] = 'Grŵp:'; +$lang['acl_user'] = 'Defnyddiwr:'; +$lang['acl_perms'] = 'Hawliau'; +$lang['page'] = 'Tudalen'; +$lang['namespace'] = 'Namespace'; //namespace + +$lang['btn_select'] = 'Dewis'; + +$lang['p_user_id'] = 'Mae gan y defnyddiwr %s yr hawliau canlynol yn bresennol ar dudalen %s: %s.'; +$lang['p_user_ns'] = 'Mae gan y defnyddiwr %s yr hawliau canlynol yn bresennol mewn namespace %s: %s.';//namespace +$lang['p_group_id'] = 'Mae gan aelodau grŵp %s yr hawliau canlynol yn bresennol ar dudalen %s: %s.'; +$lang['p_group_ns'] = 'Mae gan aelodau grŵp %s yr hawliau canlynol yn bresennol mewn namespace %s: %s.';//namespace + +$lang['p_choose_id'] = 'Rhowch ddefnyddiwr neu grŵp yn y ffurflen uchod i weld neu golugu\'r hawliau sydd wedi\'u gosod ar gyfer y dudalen %s.'; +$lang['p_choose_ns'] = 'Rhowch ddefnyddiwr neu grŵp yn y ffurflen uchod i weld neu golugu\'r hawliau sydd wedi\'u gosod ar gyfer y namespace %s.';//namespace + + +$lang['p_inherited'] = 'Sylw: Doedd yr hawliau hynny heb eu gosod yn uniongyrchol ond cawsant eu hetifeddu o grwpiau eraill neu namespaces uwch.';//namespace +$lang['p_isadmin'] = 'Sylw: Mae gan y grŵp neu\'r defnyddiwr hawliau llawn oherwydd mae wedi\'i ffurfweddu fel uwchddefnyddiwr.'; +$lang['p_include'] = 'Mae hawliau uwch yn cynnwys rhai is. Mae Creu, Lanlwytho a Dileu yn berthnasol i namespaces yn unig, nid tudalennau.';//namespace + +$lang['current'] = 'Rheolau ACL Cyfredol'; +$lang['where'] = 'Tudalen/Namespace';//namespace +$lang['who'] = 'Defnyddiwr/Grŵp'; +$lang['perm'] = 'Hawliau'; + +$lang['acl_perm0'] = 'Dim'; +$lang['acl_perm1'] = 'Darllen'; +$lang['acl_perm2'] = 'Golygu'; +$lang['acl_perm4'] = 'Creu'; +$lang['acl_perm8'] = 'Lanlwytho'; +$lang['acl_perm16'] = 'Dileu'; +$lang['acl_new'] = 'Ychwanegu Cofnod Newydd'; +$lang['acl_mod'] = 'Newid Cofnod'; +//Setup VIM: ex: et ts=2 : diff --git a/lib/plugins/acl/lang/da/help.txt b/lib/plugins/acl/lang/da/help.txt new file mode 100644 index 0000000..c8eedfc --- /dev/null +++ b/lib/plugins/acl/lang/da/help.txt @@ -0,0 +1,11 @@ +=== Vejledning === + +På denne side kan du tilføje og fjerne tilladelser for navnerum og sider i din wiki. + +Panelet i venstre side viser alle tilgængelige navnerum og sider. + +I kassen for oven giver dig mulighed for at se og ændre tilladelser for en bestemt bruger eller gruppe. + +Nedenstående skema viser dig alle de satte regler for adgangskontrol. Du kan bruge den til hurtigt at slette eller ændre nogle af dem. + +Ved at læse [[doku>acl|den officielle vejledning til ACL]] kan du opnå yderligere hjælp til at blive sat helt ind i, hvordan adgangskontrol virker i DokuWiki. \ No newline at end of file diff --git a/lib/plugins/acl/lang/da/lang.php b/lib/plugins/acl/lang/da/lang.php new file mode 100644 index 0000000..103a867 --- /dev/null +++ b/lib/plugins/acl/lang/da/lang.php @@ -0,0 +1,45 @@ + + * @author koeppe + * @author Jon Bendtsen + * @author Lars Næsbye Christensen + * @author Kalle Sommer Nielsen + * @author Esben Laursen + * @author Harith + * @author Daniel Ejsing-Duun + * @author Erik Bjørn Pedersen + * @author rasmus + * @author Mikael Lyngvig + */ +$lang['admin_acl'] = 'Rettighedsadministration'; +$lang['acl_group'] = 'Gruppe:'; +$lang['acl_user'] = 'Bruger:'; +$lang['acl_perms'] = 'Rettigheder for'; +$lang['page'] = 'Dokument'; +$lang['namespace'] = 'Navnerum'; +$lang['btn_select'] = 'Vælg'; +$lang['p_user_id'] = 'Bruger %s har følgende adgang på siden %s: %s'; +$lang['p_user_ns'] = 'Bruger %s har foreløbig følgende tilladelse i navnerummet %s: %s.'; +$lang['p_group_id'] = 'Medlemmerne af gruppen %s har foreløbigt de følgende tilladelser på siden %s: %s.'; +$lang['p_group_ns'] = 'Medlemmerne af gruppen %s har foreløbigt de følgende tilladelser i navnerummet %s: %s.'; +$lang['p_choose_id'] = 'Venligst udfyld en bruger eller gruppe i ovennævnte formular for at se eller redigere tilladelserne for denne side%s.'; +$lang['p_choose_ns'] = 'Venligst udfyld en bruger eller gruppe i ovennævnte formular for at se eller redigere tilladelserne for navnerummet %s.'; +$lang['p_inherited'] = 'Bemærk: Disse tilladelser var ikke lagt entydigt ind, men var arvet fra andre grupper eller højere navnerum.'; +$lang['p_isadmin'] = 'Bemærk: Den valgte gruppe eller bruger har altid fuld adgang, fordi den er sat til at være en supergruppe eller -bruger'; +$lang['p_include'] = 'Højere tilladelse inkluderer også lavere. Tilladelser til at oprette, lægge filer op og slette gælder kun for navnerum, ikke sider.'; +$lang['current'] = 'Aktuelle ACL-regler'; +$lang['where'] = 'Side/navnerum'; +$lang['who'] = 'Bruger/gruppe'; +$lang['perm'] = 'Rettigheder'; +$lang['acl_perm0'] = 'Ingen'; +$lang['acl_perm1'] = 'Læs'; +$lang['acl_perm2'] = 'Skriv'; +$lang['acl_perm4'] = 'Opret'; +$lang['acl_perm8'] = 'Overfør'; +$lang['acl_perm16'] = 'Slet'; +$lang['acl_new'] = 'Tilføj ny post'; +$lang['acl_mod'] = 'Redigér post'; diff --git a/lib/plugins/acl/lang/de-informal/help.txt b/lib/plugins/acl/lang/de-informal/help.txt new file mode 100644 index 0000000..d7930f8 --- /dev/null +++ b/lib/plugins/acl/lang/de-informal/help.txt @@ -0,0 +1,11 @@ +=== Schnellhilfe === + +Auf dieser Seite kannst Du Rechte für Namensräume und Seiten in deinem Wiki hinzufügen oder entfernen. + +Der linke Bereich zeigt alle Namensräume und Seiten. + +Das obere Formular zeigt die die Rechte der ausgewählten Gruppe bzw. Benutzers. + +In der Tabelle unten werden alle momentan gesetzten Zugriffsregeln gezeigt. Hier kannst Du schnell mehrere Regeln löschen oder ändern. + +Das Lesen von [[doku>acl|official documentation on ACL]] kann Dir helfen zu verstehen, wie die Zugriffskontrole in DokuWiki funktioniert. diff --git a/lib/plugins/acl/lang/de-informal/lang.php b/lib/plugins/acl/lang/de-informal/lang.php new file mode 100644 index 0000000..90fe2bd --- /dev/null +++ b/lib/plugins/acl/lang/de-informal/lang.php @@ -0,0 +1,43 @@ + + * @author Alexander Fischer + * @author Juergen Schwarzer + * @author Marcel Metz + * @author Matthias Schulte + * @author Christian Wichmann + * @author Pierre Corell + * @author Frank Loizzi + * @author Volker Bödker + */ +$lang['admin_acl'] = 'Zugriffsverwaltung'; +$lang['acl_group'] = 'Gruppe:'; +$lang['acl_user'] = 'Benutzer:'; +$lang['acl_perms'] = 'Rechte für'; +$lang['page'] = 'Seite'; +$lang['namespace'] = 'Namensraum'; +$lang['btn_select'] = 'Auswählen'; +$lang['p_user_id'] = 'Benutzer %s hat im Moment folgende Rechte auf der Seite %s: %s'; +$lang['p_user_ns'] = 'Benutzer %s hat momentan die folgenden Rechte im Namensraum %s: %s.'; +$lang['p_group_id'] = 'Die Gruppenmitglieder %s haben momentan die folgenden Rechte auf der Seite %s: %s.'; +$lang['p_group_ns'] = 'Die Mitglieder der Gruppe %s haben gerade Zugriff in folgenden Namensräumen %s: %s.'; +$lang['p_choose_id'] = 'Bitte gib einen Benutzer oder eine Gruppe in das Formular ein, um die Berechtigungen der Seite %s anzusehen oder zu bearbeiten.'; +$lang['p_choose_ns'] = 'Bitte gib einen Benutzer oder eine Gruppe in das Formular ein, um die Berechtigungen des Namenraumes %s anzusehen oder zu bearbeiten.'; +$lang['p_inherited'] = 'Hinweis: Diese Rechte wurden nicht explizit gesetzt, sondern von anderen Gruppen oder übergeordneten Namensräumen geerbt.'; +$lang['p_isadmin'] = 'Hinweis: Die gewählte Gruppe oder der Benutzer haben immer die vollen Rechte, weil sie als Superuser konfiguriert sind.'; +$lang['p_include'] = 'Höhere Rechte schließen kleinere mit ein. Hochlade- und Löschrechte sind nur für Namensräume, nicht für Seiten.'; +$lang['current'] = 'Momentane Zugriffsregeln'; +$lang['where'] = 'Seite/Namensraum'; +$lang['who'] = 'Benutzer/Gruppe'; +$lang['perm'] = 'Rechte'; +$lang['acl_perm0'] = 'Keine'; +$lang['acl_perm1'] = 'Lesen'; +$lang['acl_perm2'] = 'Bearbeiten'; +$lang['acl_perm4'] = 'Erstellen'; +$lang['acl_perm8'] = 'Hochladen'; +$lang['acl_perm16'] = 'Löschen'; +$lang['acl_new'] = 'Neuen Eintrag zufügen'; +$lang['acl_mod'] = 'Eintrag modifizieren'; diff --git a/lib/plugins/acl/lang/de/help.txt b/lib/plugins/acl/lang/de/help.txt new file mode 100644 index 0000000..2a3efe5 --- /dev/null +++ b/lib/plugins/acl/lang/de/help.txt @@ -0,0 +1,11 @@ +=== Kurzhilfe === + +Auf dieser Seite können sie Zugriffsberechtigungen für Seiten und Namensräume festlegen und ändern. + +Die Liste links zeigt alle verfügbaren Namensräume und Seiten. + +Das Formular oben erlaubt Anzeige, Ändern und Hinzufügen von Zugriffsregeln für einen ausgewählten Benutzer oder eine Gruppe. + +In der Tabelle unten werden alle bestehenden Regeln aufgeführt und können dort modifiziert oder gelöscht werden. + +Für ein tiefergehendes Verständnis wie Zugriffsbeschränkungen in DokuWiki funktionieren, sollten Sie die [[doku>acl|offizielle Dokumentation]] lesen. \ No newline at end of file diff --git a/lib/plugins/acl/lang/de/lang.php b/lib/plugins/acl/lang/de/lang.php new file mode 100644 index 0000000..12c7083 --- /dev/null +++ b/lib/plugins/acl/lang/de/lang.php @@ -0,0 +1,53 @@ + + * @author Andreas Gohr + * @author Christof + * @author Anika Henke + * @author Esther Brunner + * @author Matthias Grimm + * @author Michael Klier + * @author Leo Moll + * @author Florian Anderiasch + * @author Robin Kluth + * @author Arne Pelka + * @author Dirk Einecke + * @author Blitzi94 + * @author Robert Bogenschneider + * @author Niels Lange + * @author Christian Wichmann + * @author Paul Lachewsky + * @author Pierre Corell + * @author Michael Große + */ +$lang['admin_acl'] = 'Zugangsverwaltung'; +$lang['acl_group'] = 'Gruppe:'; +$lang['acl_user'] = 'Benutzer:'; +$lang['acl_perms'] = 'Berechtigungen für'; +$lang['page'] = 'Seite'; +$lang['namespace'] = 'Namensraum'; +$lang['btn_select'] = 'Auswählen'; +$lang['p_user_id'] = 'Nutzer %s hat momentan folgende Berechtigungen für die Seite %s: %s.'; +$lang['p_user_ns'] = 'Nutzer %s hat momentan folgende Berechtigungen im Namensraum %s: %s.'; +$lang['p_group_id'] = 'Mitglieder der Gruppe %s haben momentan folgende Berechtigungen für die Seite %s: %s.'; +$lang['p_group_ns'] = 'Mitglieder der Gruppe %s haben momentan folgende Berechtigungen für den Namensraum %s: %s.'; +$lang['p_choose_id'] = 'Bitte geben Sie in obigem Formular einen Benutzer oder eine Gruppe an, um die Berechtigungen für die Seite %s zu sehen oder zu ändern.'; +$lang['p_choose_ns'] = 'Bitte geben Sie in obigem Formular einen Benutzer oder eine Gruppe an, um die Berechtigungen für den Namensraum %s zu sehen oder zu ändern.'; +$lang['p_inherited'] = 'Hinweis: Diese Berechtigungen wurden nicht explizit gesetzt, sondern von anderen Gruppen oder höher liegenden Namensräumen geerbt.'; +$lang['p_isadmin'] = 'Hinweis: Die ausgewählte Gruppe oder Benutzer haben immer alle Berechtigungen, da sie als Superuser konfiguriert wurden.'; +$lang['p_include'] = 'Höhere Berechtigungen schließen niedrigere mit ein. Anlegen, Hochladen und Entfernen gilt nur für Namensräume, nicht für einzelne Seiten'; +$lang['current'] = 'Momentane Zugriffsregeln'; +$lang['where'] = 'Seite/Namensraum'; +$lang['who'] = 'Nutzer/Gruppe'; +$lang['perm'] = 'Berechtigungen'; +$lang['acl_perm0'] = 'Keine'; +$lang['acl_perm1'] = 'Lesen'; +$lang['acl_perm2'] = 'Bearbeiten'; +$lang['acl_perm4'] = 'Anlegen'; +$lang['acl_perm8'] = 'Hochladen'; +$lang['acl_perm16'] = 'Entfernen'; +$lang['acl_new'] = 'Eintrag hinzufügen'; +$lang['acl_mod'] = 'Eintrag bearbeiten'; diff --git a/lib/plugins/acl/lang/el/help.txt b/lib/plugins/acl/lang/el/help.txt new file mode 100644 index 0000000..ea2f816 --- /dev/null +++ b/lib/plugins/acl/lang/el/help.txt @@ -0,0 +1,10 @@ +=== Γρήγορη Βοήθεια: === + +Στη σελίδα αυτή μπορείτε να προσθέσετε και αφαιρέσετε δικαιώματα πρόσβασης για φακέλους και σελίδες στο wiki σας. + +Το αριστερό πλαίσιο δείχνει όλους τους διαθέσιμους φακέλους και αρχεία. + +Η παραπάνω φόρμα επιτρέπει να δείτε και να τροποποιήσετε τα διακαιώματα μίας επιλεγμένης ομάδας χρηστών ή ενός χρήστη. + +Στον παρακάτω πίνακα εμφανίζονται όλοι οι τρέχοντες κανόνες παραχώρησης δικαιωμάτων πρόσβασης. Μπορείτε να τον χρησιμοποιήσετε ώστε να σβήσετε ή να τροποποιήσετε γρήγορα πολλαπλούς κανόνες. +Διαβάζοντας την [[doku>acl|επίσημη τεκμηρίωση για τις Λίστες Δικαιωμάτων Πρόσβασης - ACL]] ίσως σας βοηθήσει να καταλάβετε πλήρως το πως αυτές εφαρμόζονται στην DokuWiki. \ No newline at end of file diff --git a/lib/plugins/acl/lang/el/lang.php b/lib/plugins/acl/lang/el/lang.php new file mode 100644 index 0000000..fe2dd08 --- /dev/null +++ b/lib/plugins/acl/lang/el/lang.php @@ -0,0 +1,43 @@ + + * @author Anika Henke + * @author Matthias Grimm + * @author Thanos Massias + * @author Αθανάσιος Νταής + * @author Konstantinos Koryllos + * @author George Petsagourakis + * @author Petros Vidalis + * @author Vasileios Karavasilis + */ +$lang['admin_acl'] = 'Διαχείριση Δικαιωμάτων Πρόσβασης'; +$lang['acl_group'] = 'Ομάδα:'; +$lang['acl_user'] = 'Χρήστης:'; +$lang['acl_perms'] = 'Δικαιώματα για'; +$lang['page'] = 'Σελίδα'; +$lang['namespace'] = 'Φάκελος'; +$lang['btn_select'] = 'Επιλογή'; +$lang['p_user_id'] = 'Ο χρήστης %s έχει τα ακόλουθα δικαιώματα πρόσβασης στην σελίδα %s: %s.'; +$lang['p_user_ns'] = 'Ο χρήστης %s έχει τα ακόλουθα δικαιώματα πρόσβασης στον φάκελο %s: %s.'; +$lang['p_group_id'] = 'Τα μέλη της ομάδας %s έχουν τα ακόλουθα δικαιώματα πρόσβασης στην σελίδα %s: %s.'; +$lang['p_group_ns'] = 'Τα μέλη της ομάδας %s έχουν τα ακόλουθα δικαιώματα πρόσβασης στον φάκελο %s: %s.'; +$lang['p_choose_id'] = 'Παρακαλώ δώστε ένα όνομα χρήστη ή ομάδας χρηστών στην παραπάνω μορφή για να δείτε τα αντίστοιχα δικαιώματα πρόσβασης για την σελίδα %s.'; +$lang['p_choose_ns'] = 'Παρακαλώ δώστε ένα όνομα χρήστη ή ομάδας χρηστών στην παραπάνω μορφή για να δείτε τα αντίστοιχα δικαιώματα πρόσβασης για τον φάκελο %s.'; +$lang['p_inherited'] = 'Σημείωση: Αυτά τα διακαιώματα χρήσης δεν ορίστηκαν άμεσα αλλά κληρονομήθηκαν από άλλες ομάδες χρηστών ή φακέλους σε υψηλότερο επίπεδο.'; +$lang['p_isadmin'] = 'Σημείωση: Η επιλεγμένη ομάδα χρηστών ή χρήστης έχει πάντα πλήρη διακαιώματα πρόσβασης διότι είναι δηλωμένος σαν υπερχρήστης (superuser).'; +$lang['p_include'] = 'Τα υψηλότερα δικαιώματα πρόσβασης περιλαμβάνουν τα χαμηλότερα. Τα δικαιώματα για Δημιουργία, Φόρτωση και Διαγραφή αφορούν μόνο φακέλους και όχι σελίδες. '; +$lang['current'] = 'Τρέχοντες κανόνες Λίστας Δικαιωμάτων Πρόσβασης - ACL'; +$lang['where'] = 'Σελίδα/Φάκελος'; +$lang['who'] = 'Χρήστης/Ομάδα χρηστών'; +$lang['perm'] = 'Δικαιώματα πρόσβασης'; +$lang['acl_perm0'] = 'Κανένα'; +$lang['acl_perm1'] = 'Ανάγνωση'; +$lang['acl_perm2'] = 'Τροποποίηση'; +$lang['acl_perm4'] = 'Δημιουργία'; +$lang['acl_perm8'] = 'Φόρτωση'; +$lang['acl_perm16'] = 'Διαγραφή'; +$lang['acl_new'] = 'Προσθήκη νέας εγγραφής'; +$lang['acl_mod'] = 'Τροποποίηση εγγραφής'; diff --git a/lib/plugins/acl/lang/en/help.txt b/lib/plugins/acl/lang/en/help.txt new file mode 100644 index 0000000..e865bbb --- /dev/null +++ b/lib/plugins/acl/lang/en/help.txt @@ -0,0 +1,9 @@ +=== Quick Help: === + +On this page you can add and remove permissions for namespaces and pages in your wiki. + * The left pane displays all available namespaces and pages. + * The form above allows you to see and modify the permissions of a selected user or group. + * In the table below all currently set access control rules are shown. You can use it to quickly delete or change multiple rules. + +Reading the [[doku>acl|official documentation on ACL]] might help you to fully understand how access control works in DokuWiki. + diff --git a/lib/plugins/acl/lang/en/lang.php b/lib/plugins/acl/lang/en/lang.php new file mode 100644 index 0000000..0c86489 --- /dev/null +++ b/lib/plugins/acl/lang/en/lang.php @@ -0,0 +1,46 @@ + + * @author Anika Henke + * @author Matthias Grimm + */ + +$lang['admin_acl'] = 'Access Control List Management'; +$lang['acl_group'] = 'Group:'; +$lang['acl_user'] = 'User:'; +$lang['acl_perms'] = 'Permissions for'; +$lang['page'] = 'Page'; +$lang['namespace'] = 'Namespace'; + +$lang['btn_select'] = 'Select'; + +$lang['p_user_id'] = 'User %s currently has the following permissions on page %s: %s.'; +$lang['p_user_ns'] = 'User %s currently has the following permissions in namespace %s: %s.'; +$lang['p_group_id'] = 'Members of group %s currently have the following permissions on page %s: %s.'; +$lang['p_group_ns'] = 'Members of group %s currently have the following permissions in namespace %s: %s.'; + +$lang['p_choose_id'] = 'Please enter a user or group in the form above to view or edit the permissions set for the page %s.'; +$lang['p_choose_ns'] = 'Please enter a user or group in the form above to view or edit the permissions set for the namespace %s.'; + + +$lang['p_inherited'] = 'Note: Those permissions were not set explicitly but were inherited from other groups or higher namespaces.'; +$lang['p_isadmin'] = 'Note: The selected group or user has always full permissions because it is configured as superuser.'; +$lang['p_include'] = 'Higher permissions include lower ones. Create, Upload and Delete permissions only apply to namespaces, not pages.'; + +$lang['current'] = 'Current ACL Rules'; +$lang['where'] = 'Page/Namespace'; +$lang['who'] = 'User/Group'; +$lang['perm'] = 'Permissions'; + +$lang['acl_perm0'] = 'None'; +$lang['acl_perm1'] = 'Read'; +$lang['acl_perm2'] = 'Edit'; +$lang['acl_perm4'] = 'Create'; +$lang['acl_perm8'] = 'Upload'; +$lang['acl_perm16'] = 'Delete'; +$lang['acl_new'] = 'Add new Entry'; +$lang['acl_mod'] = 'Modify Entry'; +//Setup VIM: ex: et ts=2 : diff --git a/lib/plugins/acl/lang/eo/help.txt b/lib/plugins/acl/lang/eo/help.txt new file mode 100644 index 0000000..488e84a --- /dev/null +++ b/lib/plugins/acl/lang/eo/help.txt @@ -0,0 +1,11 @@ +=== Helpeto: === + +En tiu ĉi paĝo vi povas aldoni kaj forigi rajtojn por nomspacoj kaj paĝoj en via vikio. + +La maldekstra panelo montras ĉiujn disponeblajn nomspacojn kaj paĝojn. + +La suba agordilo permesas al vi rigardi kaj modifi la rajtojn de elektita uzanto aŭ grupo. + +En la suba tabelo ĉiuj aktuale difinitaj alirkontrolaj reguloj estas montrataj. Vi povas uzi ĝin por rapide forigi aŭ ŝanĝi multoblajn regulojn. + +Legi la [[doku>acl|oficialan dokumentaron pri ACL]] povus helpi vin bone kompreni kiel alirkontrolo funkcias en DokuWiki. diff --git a/lib/plugins/acl/lang/eo/lang.php b/lib/plugins/acl/lang/eo/lang.php new file mode 100644 index 0000000..b59f465 --- /dev/null +++ b/lib/plugins/acl/lang/eo/lang.php @@ -0,0 +1,38 @@ + + * @author Felipo Kastro + * @author Robert Bogenschneider + * @author Erik Pedersen + */ +$lang['admin_acl'] = 'Administrado de Alirkontrola Listo (ACL)'; +$lang['acl_group'] = 'Grupo:'; +$lang['acl_user'] = 'Uzanto:'; +$lang['acl_perms'] = 'Rajtoj por'; +$lang['page'] = 'Paĝo'; +$lang['namespace'] = 'Nomspaco'; +$lang['btn_select'] = 'Elekti'; +$lang['p_user_id'] = 'Uzanto %s aktuale havas la jenajn rajtojn en la paĝo %s: %s.'; +$lang['p_user_ns'] = 'Uzanto %s aktuale havas la jenajn rajtojn en la nomspaco %s: %s.'; +$lang['p_group_id'] = 'Anoj de la grupo %s aktuale havas la jenajn rajtojn en la paĝo %s: %s.'; +$lang['p_group_ns'] = 'Anoj de la grupo %s aktuale havas la jenajn rajtojn en la nomspaco %s: %s.'; +$lang['p_choose_id'] = 'Bonvolu enmeti uzanton aŭ grupon en la suban agordilon por rigardi aŭ redakti la aron da rajtoj por la paĝo %s.'; +$lang['p_choose_ns'] = 'Bonvolu enmeti uzanton aŭ grupon en la suban agordilon por rigardi aŭ redakti la aron da rajtoj por la nomspaco %s.'; +$lang['p_inherited'] = 'Rimarko: tiuj rajtoj ne estas rekte difinitaj, sed ili herediĝas el aliaj pli supraj grupoj aŭ nomspacoj.'; +$lang['p_isadmin'] = 'Rimarko: la elektita grupo aŭ uzanto ĉiam havas plenan rajtaron ĉar ĝi estas difinita kiel superuzanto.'; +$lang['p_include'] = 'Plialtaj permesoj inkluzivas malpli altajn. La permesoj por Krei, Alŝuti kaj Forigi nur aplikeblas al nomspacoj, ne al paĝoj.'; +$lang['current'] = 'Aktuala regularo ACL'; +$lang['where'] = 'Paĝo/Nomspaco'; +$lang['who'] = 'Uzanto/Grupo'; +$lang['perm'] = 'Rajtoj'; +$lang['acl_perm0'] = 'Nenio'; +$lang['acl_perm1'] = 'Legi'; +$lang['acl_perm2'] = 'Redakti'; +$lang['acl_perm4'] = 'Krei'; +$lang['acl_perm8'] = 'Alŝuti'; +$lang['acl_perm16'] = 'Forigi'; +$lang['acl_new'] = 'Aldoni novan enmetaĵon'; +$lang['acl_mod'] = 'Modifi enmetaĵon'; diff --git a/lib/plugins/acl/lang/es/help.txt b/lib/plugins/acl/lang/es/help.txt new file mode 100644 index 0000000..01f7a2e --- /dev/null +++ b/lib/plugins/acl/lang/es/help.txt @@ -0,0 +1,11 @@ +=== Ayuda rápida: === + +En esta página puede agregar o retirar permisos para los espacios de nombres y páginas en su wiki. + +El panel de la izquierda muestra todos los espacios de nombres y páginas + +El formulario inferior permite ver y modificar los permisos del usuario o grupo elegido. + +En la tabla anterior se muestran todas las reglas de control de acceso vigentes Puede usarla para borrar o cambiar varias reglas rápidamente. + +Consultar el [[doku>acl|official documentation on ACL]] puede ayudarle a entender completamente como el control de acceso trabaja en DokuWiki. diff --git a/lib/plugins/acl/lang/es/lang.php b/lib/plugins/acl/lang/es/lang.php new file mode 100644 index 0000000..7518e38 --- /dev/null +++ b/lib/plugins/acl/lang/es/lang.php @@ -0,0 +1,54 @@ + + * @author Oscar M. Lage + * @author Gabriel Castillo + * @author oliver + * @author Enrico Nicoletto + * @author Manuel Meco + * @author VictorCastelan + * @author Jordan Mero + * @author Felipe Martinez + * @author Javier Aranda + * @author Zerial + * @author Marvin Ortega + * @author Daniel Castro Alvarado + * @author Fernando J. Gómez + * @author Mauro Javier Giamberardino + * @author emezeta + * @author Oscar Ciudad + * @author Ruben Figols + * @author Gerardo Zamudio + * @author Mercè López + */ +$lang['admin_acl'] = 'Administración de lista de control de acceso'; +$lang['acl_group'] = 'Grupo:'; +$lang['acl_user'] = 'Usuario:'; +$lang['acl_perms'] = 'Permiso para'; +$lang['page'] = 'Página'; +$lang['namespace'] = 'Espacio de nombres'; +$lang['btn_select'] = 'Seleccionar'; +$lang['p_user_id'] = 'El usuario %s tiene los siguientes permisos sobre la página %s: %s.'; +$lang['p_user_ns'] = 'El usuario %s tiene los siguientes permisos sobre el espacio de nombres %s: %s.'; +$lang['p_group_id'] = 'Los miembros del grupo %s tienen actualmente los siguientes permisos sobre la página %s: %s.'; +$lang['p_group_ns'] = 'Los miembros del grupo %s tienen actualmente los siguientes permisos sobre el espacio de nombres %s: %s.'; +$lang['p_choose_id'] = 'Por favor proporcione un usuario o grupoen el formulario arriba mostrado para ver o editar los permisos asignados sobre la página%s.'; +$lang['p_choose_ns'] = 'Por favor proporcione un usuario o grupoen el formulario arriba mostrado para ver o editar los permisos asignados sobre el espacio de nombres %s.'; +$lang['p_inherited'] = 'Nota: Esos permisos no fueron establecidos explícitamente sino que fueron heredados desde otros grupos o espacios de nombres superiores'; +$lang['p_isadmin'] = 'Nota: El grupo o usuario seleccionado simepre tiene permisos totales debido a que se encuentra configurado como superusuario.'; +$lang['p_include'] = 'Los permisos superiores incluyen a los inferiores. Los permisos Crear, Cargar y Eliminar sólo se aplican a los espacios de nombres, no a las páginas.'; +$lang['current'] = 'Reglas ACL vigentes'; +$lang['where'] = 'Página/Espacio de nombres'; +$lang['who'] = 'Usuario/Grupo'; +$lang['perm'] = 'Permisos'; +$lang['acl_perm0'] = 'ninguno'; +$lang['acl_perm1'] = 'Leer'; +$lang['acl_perm2'] = 'Editar'; +$lang['acl_perm4'] = 'Crear'; +$lang['acl_perm8'] = 'Subir un fichero'; +$lang['acl_perm16'] = 'Borrar'; +$lang['acl_new'] = 'Agregar una nueva entrada'; +$lang['acl_mod'] = 'Modificar una entrada'; diff --git a/lib/plugins/acl/lang/et/help.txt b/lib/plugins/acl/lang/et/help.txt new file mode 100644 index 0000000..a2c8e9e --- /dev/null +++ b/lib/plugins/acl/lang/et/help.txt @@ -0,0 +1,9 @@ +=== Kiir-spikker: === + +Käesoleval leheküljel saad oma wiki nimeruumidele ja lehekülgedele lisada ning eemaldada õigusi. + * Vasemas paanis on näidatud kõik saada olevad nimeruumid ja leheküljed. + * Ülal olev vorm laseb sul vaadelda ja muuta valitud rühma või kasutaja õigusi. + * Allolevas tabelis näidatakse kõiki hetkel sättestatud reegleid ligipääsudele. +Saad seda kasutada reeglite hulgi muutmiseks või kustutamiseks + +Mõistmaks paremini DokuWiki ligipääsu halduse toimimist, võiks abiks olla [[doku>acl|ACL-i ametliku dokumentatsiooniga]] tutvumine. \ No newline at end of file diff --git a/lib/plugins/acl/lang/et/lang.php b/lib/plugins/acl/lang/et/lang.php new file mode 100644 index 0000000..a369a82 --- /dev/null +++ b/lib/plugins/acl/lang/et/lang.php @@ -0,0 +1,37 @@ + + * @author Aari Juhanson + * @author Kaiko Kaur + * @author kristian.kankainen + * @author Rivo Zängov + * @author Janar Leas + */ +$lang['admin_acl'] = 'Ligipääsukontrolli nimekirja haldamine'; +$lang['acl_group'] = 'Rühm:'; +$lang['acl_user'] = 'Kasutaja:'; +$lang['acl_perms'] = 'Lubatud'; +$lang['page'] = 'leht'; +$lang['namespace'] = 'Nimeruum'; +$lang['btn_select'] = 'Vali'; +$lang['p_user_ns'] = 'Kasutaja %s omab nimeruumis %s: %s järgmisi õigusi.'; +$lang['p_group_ns'] = 'Rühma %s liikmed omavad nimeruumis %s: %s järgmisi õigusi.'; +$lang['p_choose_id'] = 'Sisesta ülal-olevasse vormi kasutaja või rühm nägemaks leheküljele %s sätestatud volitusi.'; +$lang['p_choose_ns'] = 'Sisesta ülal-olevasse vormi kasutaja või rühm nägemaks nimeruumile %s sätestatud volitusi.'; +$lang['p_inherited'] = 'Teadmiseks: Neid õigusi pole eralti määratletud, vaid on päritud teistest rühmadest või ülemast nimeruumist.'; +$lang['p_isadmin'] = 'Teadmiseks: Valitud rühm või kasutaja omab alati kõiki õigusi, kuna nii on sätestanud ülemkasutaja.'; +$lang['p_include'] = 'Kõrgemad õigused hõlmavad alamaid. Õigus loomine, üleslaadida ja kustutada rakenduvad nimeruumidele, mitte lehekülgedele.'; +$lang['where'] = 'Lehekülg/nimeruum'; +$lang['who'] = 'Kasutaja/Grupp'; +$lang['perm'] = 'Õigused'; +$lang['acl_perm0'] = 'Pole'; +$lang['acl_perm1'] = 'Lugemine'; +$lang['acl_perm2'] = 'Toimetamine'; +$lang['acl_perm4'] = 'Tekitamine'; +$lang['acl_perm8'] = 'Üles laadimine'; +$lang['acl_perm16'] = 'Kustuta'; +$lang['acl_new'] = 'Uue kirje lisamine'; +$lang['acl_mod'] = 'Muuda sissekannet'; diff --git a/lib/plugins/acl/lang/eu/help.txt b/lib/plugins/acl/lang/eu/help.txt new file mode 100644 index 0000000..9e6070a --- /dev/null +++ b/lib/plugins/acl/lang/eu/help.txt @@ -0,0 +1,11 @@ +=== Laguntza Bizkorra: === + +Orri honetan wiki-ko orri eta izen-espazioen baimenak gehitu eta kendu ahal ditzakezu. + +Ezkerreko panelak eskuragarri dauden orri eta izen-espazioak erakusten ditu. + +Goiko formularioak aukeratutako erabiltzaile edo taldearen baimenak ikusi eta aldatzea ahalbidetzen dizu. + +Beheko taulan une honetan ezarritako atzipen kontrol arauak daude. Hainbat arau bizkor ezabatu edo aldatzeko erabili dezakezu. + +[[doku>acl|Atzipen Kontrol Listen inguruko dokumentazio ofiziala]] irakurtzeak atzipen kontrolak DokuWiki-n nola funtzionatzen duen ulertzen lagundu zaitzaike. diff --git a/lib/plugins/acl/lang/eu/lang.php b/lib/plugins/acl/lang/eu/lang.php new file mode 100644 index 0000000..722ffd1 --- /dev/null +++ b/lib/plugins/acl/lang/eu/lang.php @@ -0,0 +1,36 @@ + + * @author Zigor Astarbe + */ +$lang['admin_acl'] = 'Atzipen Kontrol Listaren Kudeaketa'; +$lang['acl_group'] = 'Taldea:'; +$lang['acl_user'] = 'Erabiltzailea:'; +$lang['acl_perms'] = 'Baimenak honetarako:'; +$lang['page'] = 'Orria'; +$lang['namespace'] = 'Izen-espazioa'; +$lang['btn_select'] = 'Aukeratu'; +$lang['p_user_id'] = '%s erabiltzaileak une honetan honako baimenak ditu %s orrian: %s.'; +$lang['p_user_ns'] = '%s erabiltzaileak une honetan honako baimenak ditu %s izen-espazioan: %s.'; +$lang['p_group_id'] = '%s taldeko kideek une honetan honako baimenak dituzte %s orrian: %s.'; +$lang['p_group_ns'] = '%s taldeko kideek une honetan honako baimenak dituzte %s izen-espazioan: %s.'; +$lang['p_choose_id'] = 'Mesedez sartu erabiltzaile edo taldea goiko formularioan %s orrian ezarritako baimenak ikusi edo aldatzeko.'; +$lang['p_choose_ns'] = 'Mesedez sartu erabiltzaile edo taldea goiko formularioan %s izen-espazioan ezarritako baimenak ikusi edo aldatzeko.'; +$lang['p_inherited'] = 'Oharra: Baimen horiek ez dira esplizituki jarriak, beste talde batzuetatik edo goragoko izen-espazioetatik heredatuak baizik.'; +$lang['p_isadmin'] = 'Oharra: Aukeratutako talde edo erabiltzaileak beti daika baimen osoa, supererabiltzaile gisa konfiguratuta baitago.'; +$lang['p_include'] = 'Baimen handiagoek baimen txikiagoak barneratzen dituzte. Sortu, Igo eta Ezabatu baimenak izen-espazioei soilik aplikatzen zaizkie, ez orriei.'; +$lang['current'] = 'Uneko AKL Arauak'; +$lang['where'] = 'Orria/Izen-espazioa'; +$lang['who'] = 'Erabiltzailea/Taldea'; +$lang['perm'] = 'Baimenak'; +$lang['acl_perm0'] = 'Inork'; +$lang['acl_perm1'] = 'Irakurri'; +$lang['acl_perm2'] = 'Editatu'; +$lang['acl_perm4'] = 'Sortu'; +$lang['acl_perm8'] = 'Igo'; +$lang['acl_perm16'] = 'Ezabatu'; +$lang['acl_new'] = 'Sarrera berri bat gehitu'; +$lang['acl_mod'] = 'Aldatu Sarrera'; diff --git a/lib/plugins/acl/lang/fa/help.txt b/lib/plugins/acl/lang/fa/help.txt new file mode 100644 index 0000000..1ec797f --- /dev/null +++ b/lib/plugins/acl/lang/fa/help.txt @@ -0,0 +1,11 @@ +=== راهنما: === + +در این صفحه شما می‌توانید دسترسی صفحات و فضای‌نام‌ها را مدیریت کنید. + +در قسمت سمت راست، لیست تمام صفحات و فضای‌نام‌ها را مشاهده می‌کنید. + +در فرم بالا می‌توانید دسترسی‌های کاربران و گروه‌های مختلف را مشاهده و ویرایش کنید. + +در جدول زیر، تمامی قوانین مدیریتی را مشاهده می‌کنید. شما می‌توانید آن‌ها را حذف یا تعدادی از آن‌ها رو تغییر دهید. + +ممکن است خواندن [[doku>acl|مطلب رسمی در مورد مدیریت دسترسی‌ها]] شما را در درک بهتر این قسمت DokuWiki یاری کند. \ No newline at end of file diff --git a/lib/plugins/acl/lang/fa/lang.php b/lib/plugins/acl/lang/fa/lang.php new file mode 100644 index 0000000..46db208 --- /dev/null +++ b/lib/plugins/acl/lang/fa/lang.php @@ -0,0 +1,40 @@ + + * @author omidmr + * @author Mohammad Reza Shoaei + * @author Milad DZand + * @author AmirH Hassaneini + */ +$lang['admin_acl'] = 'مدیریت کنترل دسترسی‌ها'; +$lang['acl_group'] = 'گروه:'; +$lang['acl_user'] = 'کاربر:'; +$lang['acl_perms'] = 'مجوز برای'; +$lang['page'] = 'صفحه'; +$lang['namespace'] = 'فضای‌نام'; +$lang['btn_select'] = 'انتخاب'; +$lang['p_user_id'] = 'کاربر %s دسترسی‌های زیر را برای صفحه‌ی %s دارد: %s.'; +$lang['p_user_ns'] = 'کاربر %s دسترسی‌های زیر را برای فضای‌نام %s دارد: %s.'; +$lang['p_group_id'] = 'اعضای گروه %s دسترسی‌های زیر را برای صفحه‌ی %s دارند: %s.'; +$lang['p_group_ns'] = 'اعضای گروه %s دسترسی‌های زیر را برای فضای‌نام %s دارند: %s.'; +$lang['p_choose_id'] = 'خواهشمندیم نام یک کاربر یا گروه را در فرم بالا وارد کنید تا دسترسی‌های آن را برای صفحه‌ی %s ببینید و ویرایش کنید.'; +$lang['p_choose_ns'] = 'خواهشمندیم نام یک کاربر یا گروه را در فرم بالا وارد کنید تا دسترسی‌های آن را برای فضای‌نام %s ببینید و ویرایش کنید.'; +$lang['p_inherited'] = 'توجه: دسترسی‌ها مستقیمن مقداردهی نشده است، بلکه از گروه‌های بالا یا فضای‌نام گرفته شده است.'; +$lang['p_isadmin'] = 'توجه: کاربر یا گروه انتخاب شده همیشه با تمام دسترسی می‌باشد، زیرا به عنوان «superuser» انتخاب شده است.'; +$lang['p_include'] = 'دسترسی‌های بالا، دسترسی‌های پایین را شامل می‌شود. ایجاد، ارسال و حذف فقط به فضای‌نام الحاق می‌شود.'; +$lang['current'] = 'قوانین دسترسی فعلی'; +$lang['where'] = 'صفحه/فضای‌نام'; +$lang['who'] = 'کاربر/گروه'; +$lang['perm'] = 'دسترسی‌ها'; +$lang['acl_perm0'] = 'هیچ‌کدام'; +$lang['acl_perm1'] = 'خواندن'; +$lang['acl_perm2'] = 'ویزایش'; +$lang['acl_perm4'] = 'ایجاد'; +$lang['acl_perm8'] = 'ارسال'; +$lang['acl_perm16'] = 'حذف'; +$lang['acl_new'] = 'اضافه کردن ورودی جدید'; +$lang['acl_mod'] = 'ویرایش ورودی'; diff --git a/lib/plugins/acl/lang/fi/help.txt b/lib/plugins/acl/lang/fi/help.txt new file mode 100644 index 0000000..d821f2d --- /dev/null +++ b/lib/plugins/acl/lang/fi/help.txt @@ -0,0 +1,11 @@ +=== Pika-apu: === + +Tällä sivulla voit lisätä tai poistaa oikeuksia wikisi nimiavaruuksiin tai sivuihin. + +Vasen osa näyttää kaikki tarjolla olevat nimiavaruudet ja sivut. + +Yllä olevan kaavakkeen avulla voit katsoa ja muokata oikeuksia valitulle käyttäjälle ja ryhmälle. + +Alla olevassa taulukossa on näkyvissä päällä olevat pääsyoikeudet. Voit käyttää sitä muokataksesi tai poistaaksesi useita oikeuksia. + +[[doku>acl|Virallisen käyttöoikeus (ACL) dokumentaation]] lukeminen voi helpottaa sinua täysin ymmärtämään mitän käyttöoikeudet toimivat DokuWikissä. diff --git a/lib/plugins/acl/lang/fi/lang.php b/lib/plugins/acl/lang/fi/lang.php new file mode 100644 index 0000000..f680f29 --- /dev/null +++ b/lib/plugins/acl/lang/fi/lang.php @@ -0,0 +1,37 @@ + + * @author Teemu Mattila + * @author Sami Olmari + */ +$lang['admin_acl'] = 'Käyttöoikeudet (ACL)'; +$lang['acl_group'] = 'Ryhmä:'; +$lang['acl_user'] = 'Käyttäjä:'; +$lang['acl_perms'] = 'Oikeudet'; +$lang['page'] = 'Sivu'; +$lang['namespace'] = 'Nimiavaruus'; +$lang['btn_select'] = 'Valitse'; +$lang['p_user_id'] = 'Käyttäjällä %s on tällä hetkellä seuraavat oikeudet sivulla %s: %s.'; +$lang['p_user_ns'] = 'Käyttäjällä %s on tällä hetkellä seuraavat oikeudet nimiavaruudessa %s: %s.'; +$lang['p_group_id'] = 'Ryhmän %s jäsenillä on tällä hetkellä seuraavat oikeudet sivulla %s: %s.'; +$lang['p_group_ns'] = 'Ryhmän %s jäsenillä on tällä hetkellä seuraavat oikeudet nimiavaruudessa %s: %s.'; +$lang['p_choose_id'] = 'Ole hyvä ja syötä ryhmän nimi yllä olevaan kaavakkeeseen katsoaksesi tai muokataksesi oikeuksia sivulle %s.'; +$lang['p_choose_ns'] = 'Ole hyvä ja syötä ryhmän nimi yllä olevaan kaavakkeeseen katsoaksesi tai muokataksesi oikeuksia nimiavaruuteen %s.'; +$lang['p_inherited'] = 'Huomaa: Oikeuksia ei ole erikseen asetettu, vaan ne on peritty toiselta ryhmältä tai ylemmältä nimiavaruudelta.'; +$lang['p_isadmin'] = 'Huomaa: Valitulla ryhmällä tai käyttäjällä on aina täydet oikeudet, koska se on määritelty pääkäyttäjäksi (Superuser)'; +$lang['p_include'] = 'Korkeammat oikeudet sisältävät matalammat. Luonti-, Lähetys- ja Poisto-oikeudet vaikuttavat vain nimiavaruuksiin, ei sivuihin.'; +$lang['current'] = 'Tämänhetkiset käyttöoikeudet (ACL)'; +$lang['where'] = 'Sivu/Nimiavaruus'; +$lang['who'] = 'Käyttäjä/Ryhmä'; +$lang['perm'] = 'Oikeudet'; +$lang['acl_perm0'] = 'Ei mitään'; +$lang['acl_perm1'] = 'Luku'; +$lang['acl_perm2'] = 'Muokkaus'; +$lang['acl_perm4'] = 'Luonti'; +$lang['acl_perm8'] = 'Lähetys'; +$lang['acl_perm16'] = 'Poisto'; +$lang['acl_new'] = 'Lisää uusi'; +$lang['acl_mod'] = 'Muokkaa'; diff --git a/lib/plugins/acl/lang/fr/help.txt b/lib/plugins/acl/lang/fr/help.txt new file mode 100644 index 0000000..38478ae --- /dev/null +++ b/lib/plugins/acl/lang/fr/help.txt @@ -0,0 +1,9 @@ +=== Aide rapide === + +Cette page vous permet d'ajouter ou de supprimer des autorisations pour les catégories et les pages de votre wiki. + + * Le panneau de gauche liste toutes les catégories et les pages disponibles. + * Le formulaire ci-dessus permet d'afficher et de modifier les autorisations d'un utilisateur ou d'un groupe sélectionné. + * Le tableau ci-dessous présente la liste de contrôle d'accès (ACL) actuelle. Vous pouvez l'utiliser pour supprimer ou modifier rapidement plusieurs contrôles d'accès. + +La lecture de [[doku>fr:acl|la documentation officielle du contrôle d'accès]] pourra vous permettre de mieux comprendre le fonctionnement du contrôle d'accès dans DokuWiki. diff --git a/lib/plugins/acl/lang/fr/lang.php b/lib/plugins/acl/lang/fr/lang.php new file mode 100644 index 0000000..76082c0 --- /dev/null +++ b/lib/plugins/acl/lang/fr/lang.php @@ -0,0 +1,56 @@ + + * @author Schplurtz le Déboulonné + * @author Sébastien Bauer + * @author Antoine Fixary + * @author cumulus + * @author Gwenn Gueguen + * @author Guy Brand + * @author Fabien Chabreuil + * @author Stéphane Chamberland + * @author Maurice A. LeBlanc + * @author stephane.gully + * @author Guillaume Turri + * @author Erik Pedersen + * @author olivier duperray + * @author Vincent Feltz + * @author Philippe Bajoit + * @author Florian Gaub + * @author Johan Guilbaud + * @author Yannick Aure + * @author Olivier DUVAL + * @author Anael Mobilia + * @author Bruno Veilleux + */ +$lang['admin_acl'] = 'Gestion de la liste des contrôles d\'accès (ACL)'; +$lang['acl_group'] = 'Groupe :'; +$lang['acl_user'] = 'Utilisateur :'; +$lang['acl_perms'] = 'Autorisations pour'; +$lang['page'] = 'Page'; +$lang['namespace'] = 'Catégorie'; +$lang['btn_select'] = 'Sélectionner'; +$lang['p_user_id'] = 'Autorisations actuelles de l\'utilisateur %s sur la page %s : %s.'; +$lang['p_user_ns'] = 'Autorisations actuelles de l\'utilisateur %s sur la catégorie %s : %s.'; +$lang['p_group_id'] = 'Autorisations actuelles des membres du groupe %s sur la page %s : %s.'; +$lang['p_group_ns'] = 'Autorisations actuelles des membres du groupe %s sur la catégorie %s : %s.'; +$lang['p_choose_id'] = 'Saisissez un nom d\'utilisateur ou de groupe dans le formulaire ci-dessus pour afficher ou éditer les autorisations relatives à la page %s.'; +$lang['p_choose_ns'] = 'Veuillez saisir un nom d\'utilisateur ou de groupe dans le formulaire ci-dessus pour afficher ou éditer les autorisations relatives à la catégorie %s.'; +$lang['p_inherited'] = 'Note : ces autorisations n\'ont pas été explicitement définies mais sont héritées de groupes ou catégories supérieurs.'; +$lang['p_isadmin'] = 'Note : le groupe ou l\'utilisateur sélectionné dispose toujours de toutes les autorisations car il est paramétré en tant que super-utilisateur.'; +$lang['p_include'] = 'Les autorisations les plus élevées incluent les plus faibles. Création, Envoyer et Effacer ne s\'appliquent qu\'aux catégories, pas aux pages.'; +$lang['current'] = 'Contrôles d\'accès actuels'; +$lang['where'] = 'Page/Catégorie'; +$lang['who'] = 'Utilisateur/Groupe'; +$lang['perm'] = 'Autorisations'; +$lang['acl_perm0'] = 'Aucune'; +$lang['acl_perm1'] = 'Lecture'; +$lang['acl_perm2'] = 'Écriture'; +$lang['acl_perm4'] = 'Création'; +$lang['acl_perm8'] = 'Envoyer'; +$lang['acl_perm16'] = 'Effacer'; +$lang['acl_new'] = 'Ajouter une nouvelle entrée'; +$lang['acl_mod'] = 'Modifier l\'entrée'; diff --git a/lib/plugins/acl/lang/gl/help.txt b/lib/plugins/acl/lang/gl/help.txt new file mode 100644 index 0000000..593dcef --- /dev/null +++ b/lib/plugins/acl/lang/gl/help.txt @@ -0,0 +1,11 @@ +=== Axuda Rápida: === + +Nesta páxina podes engadir e eliminar permisos para os nomes de espazo e as páxinas do teu wiki. + +O panel da esquerda amosa todos os nomes de espazo e páxinas dispoñíbeis. + +O formulario de enriba permíteche ver e modificares os permisos do usuario ou grupo seleccionado. + +Na táboa de embaixo amósanse todas as regras de control de accesos estabelecidas. Podes empregala para mudares ou eliminares varias regras dun xeito rápido. + +A lectura da [[doku>acl|documentación oficial da ACL]] pode servirche de axuda para comprenderes como funciona o control de accesos no Dokuwiki. diff --git a/lib/plugins/acl/lang/gl/lang.php b/lib/plugins/acl/lang/gl/lang.php new file mode 100644 index 0000000..74d2a79 --- /dev/null +++ b/lib/plugins/acl/lang/gl/lang.php @@ -0,0 +1,36 @@ + + * @author Oscar M. Lage + * @author Rodrigo Rega + */ +$lang['admin_acl'] = 'Xestión da Lista de Control de Acceso (ACL)'; +$lang['acl_group'] = 'Grupo:'; +$lang['acl_user'] = 'Usuario:'; +$lang['acl_perms'] = 'Permisos para'; +$lang['page'] = 'Páxina'; +$lang['namespace'] = 'Nome de espazo'; +$lang['btn_select'] = 'Escolle'; +$lang['p_user_id'] = 'O usuario %s dispón actualmente dos seguintes permisos na páxina %s: %s.'; +$lang['p_user_ns'] = 'O usuario %s dispón actualmente dos seguintes permisos no nome de espazo %s: %s.'; +$lang['p_group_id'] = 'Os membros do grupo %s dispoñen actualmente dos seguintes permisos na páxina %s: %s.'; +$lang['p_group_ns'] = 'Os membros do grupo %s cdispoñen actualmente dos seguintes permisos no nome de espazo %s: %s.'; +$lang['p_choose_id'] = 'Por favor, insire un usuario ou grupo no formulario de enriba para ver ou editar os permisos establecidos para a páxina %s.'; +$lang['p_choose_ns'] = 'Por favor insire un usuario ou grupo no formulario de enriba para ver ou editar os permisos establecidos no nome de espazo %s.'; +$lang['p_inherited'] = 'Nota: Estes permisos non foron establecidos explicitamente senón que foron herdadas de outros grupos ou nomes de espazo meirandes.'; +$lang['p_isadmin'] = 'Nota: O grupo ou usuario seleccionado terá sempre permisos completos por estar configurado como super-usuario.'; +$lang['p_include'] = 'Os permisos meirandes inclúen os menores. Os permisos de Creación, Subida e Eliminado só se aplican aos nomes de espazo, non ás páxinas.'; +$lang['current'] = 'Regras ACL Actuais'; +$lang['where'] = 'Páxina/Nome de Espazo'; +$lang['who'] = 'Usuario/Grupo'; +$lang['perm'] = 'Permisos'; +$lang['acl_perm0'] = 'Ningún'; +$lang['acl_perm1'] = 'Ler'; +$lang['acl_perm2'] = 'Editar'; +$lang['acl_perm4'] = 'Crear'; +$lang['acl_perm8'] = 'Subir arquivos'; +$lang['acl_perm16'] = 'Eliminar'; +$lang['acl_new'] = 'Engadir nova Entrada'; +$lang['acl_mod'] = 'Modificar Entrada'; diff --git a/lib/plugins/acl/lang/he/help.txt b/lib/plugins/acl/lang/he/help.txt new file mode 100644 index 0000000..33f2933 --- /dev/null +++ b/lib/plugins/acl/lang/he/help.txt @@ -0,0 +1,11 @@ +=== עזרה חפוזה: === + +בדף זה ניתן להוסיף ולהסיר הרשאות למרחבי שמות ולדפים בויקי שלך. + +הצד השמאלי מציג את כל מרבי השמות והדפים הזמינים. + +הטופס מעלה מאפשר לך לראות ולשנות את ההרשאות של משתמש או קבוצה נבחרים. + +בטבלה מטה מוצגים כל כללי בקרת הגישה הנוכחיים. ניתן להשתמש בה כדי למחוק או לשנות מספר כללים במהירות. + +קריאת [[doku>acl|התיעוד הרשמי ל-ACL ACL]] יכולה לעזור לך להבין באופן מלא כיצד בקרת הגישה עובדת בדוקוויקי. diff --git a/lib/plugins/acl/lang/he/lang.php b/lib/plugins/acl/lang/he/lang.php new file mode 100644 index 0000000..33ce761 --- /dev/null +++ b/lib/plugins/acl/lang/he/lang.php @@ -0,0 +1,36 @@ + + * @author Moshe Kaplan + * @author Yaron Yogev + * @author Yaron Shahrabani + */ +$lang['admin_acl'] = 'ניהול רשימת בקרת גישות'; +$lang['acl_group'] = 'קבוצה:'; +$lang['acl_user'] = 'משתמש:'; +$lang['acl_perms'] = 'הרשאות עבור'; +$lang['page'] = 'דף'; +$lang['namespace'] = 'מרחב שמות'; +$lang['p_user_id'] = 'למשתמש %s יש כרגע את ההרשאות הבאות בדף %s: %s.'; +$lang['p_user_ns'] = 'למשתמש %s יש כרגע את ההרשאות הבאות במרחב השם %s: %s.'; +$lang['p_group_id'] = 'לחברי קבוצת %s יש כרגע את ההרשאות הבאות בדף %s: %s.'; +$lang['p_group_ns'] = 'לחברי קבוצת %s יש כרגע את ההרשאות הבאות במרחב השם %s: %s.'; +$lang['p_choose_id'] = 'נא להזין משתמש או קבוצה בטופס מעלה כדי לצפות או לערוך את ההרשאות המוגדרות עבור הדף %s.'; +$lang['p_choose_ns'] = 'נא להזין משתמש או קבוצה בטופס מעלה כדי לצפות או לערוך את ההרשאות המוגדרות עבור מרחב השם %s.'; +$lang['p_inherited'] = 'לתשומת לבך: הרשאות אלו לא הוגדרו באופן מפורש אלא נורשו מקבוצות אחרות או ממרחב שמות גבוה יותר.'; +$lang['p_isadmin'] = 'לתשומת לבך: לקבוצה או המשתמש שנבחרו יש תמיד הרשאות מלאות בגלל הגדרתם כמשתמש-על.'; +$lang['current'] = 'חוקי ה-ACL הנוכחיים'; +$lang['where'] = 'דף/מרחב שם'; +$lang['who'] = 'משתמש/קבוצה'; +$lang['perm'] = 'הרשאות'; +$lang['acl_perm0'] = 'ללא'; +$lang['acl_perm1'] = 'קריאה'; +$lang['acl_perm2'] = 'עריכה'; +$lang['acl_perm4'] = 'יצירה'; +$lang['acl_perm8'] = 'העלאה'; +$lang['acl_perm16'] = 'מחיקה'; +$lang['acl_new'] = 'הוספת רשומה חדשה'; +$lang['acl_mod'] = 'שינויי מובאה'; diff --git a/lib/plugins/acl/lang/hr/help.txt b/lib/plugins/acl/lang/hr/help.txt new file mode 100644 index 0000000..4e7cfc3 --- /dev/null +++ b/lib/plugins/acl/lang/hr/help.txt @@ -0,0 +1,11 @@ +=== Brza Pomoć: === + +Na ovoj stranici možeš dodavati i brisati dozvole za imenske prostore i stranice u svom wiki-u. + +Lijevi prozor prikazuje sve dostupne imenske prostore i stranice. + +Forma iznad ti omogućuje pregled i mijenjanje dozvola odabranom korisniku ili grupi. + +U tablici ispod prikazana su sva trenutno postavljena pravila kontrole pristupa. Koristite je za višestruko brisanje ili mijenjanje pravila. + +Čitanje [[doku>acl|službena dokumentacija o ACL]] može vam pomoći potpuno razumijeti kako kontrola pristupa radi u DokuWiki. \ No newline at end of file diff --git a/lib/plugins/acl/lang/hr/lang.php b/lib/plugins/acl/lang/hr/lang.php new file mode 100644 index 0000000..d188176 --- /dev/null +++ b/lib/plugins/acl/lang/hr/lang.php @@ -0,0 +1,37 @@ + + * @author Dražen Odobašić + * @author Dejan Igrec + */ +$lang['admin_acl'] = 'Upravljanje listom kontrole pristupa'; +$lang['acl_group'] = 'Grupa:'; +$lang['acl_user'] = 'Korisnik:'; +$lang['acl_perms'] = 'Dozvole za'; +$lang['page'] = 'Stranica'; +$lang['namespace'] = 'Imenski prostor'; +$lang['btn_select'] = 'Odaberi'; +$lang['p_user_id'] = 'Korisnik %s trenutno ima sljedeće dozvole na stranici %s: %s.'; +$lang['p_user_ns'] = 'Korisnik %s trenutno ima sljedeće dozvole u imenskom prostoru %s: %s.'; +$lang['p_group_id'] = 'Članovi grupe %s trenutno imaju sljedeće dozvole na stranici %s: %s.'; +$lang['p_group_ns'] = 'Članovi grupe %s trenutno imaju sljedeće dozvole u imenskom prostoru %s: %s.'; +$lang['p_choose_id'] = 'Molim unesti korisnika ili grupu u gornju formu za pregled ili uređivanje dozvola postavljenih za stranicu %s.'; +$lang['p_choose_ns'] = 'Molim unesti korisnika ili grupu u gornju formu za pregled ili uređivanje dozvola postavljenih za imenski prostor %s.'; +$lang['p_inherited'] = 'Napomena: Ove dozvole nisu postavljene eksplicitno već su naslijeđene od drugih grupa ili nadređenih imenskih prostora.'; +$lang['p_isadmin'] = 'Napomena: Odabrana grupa ili korisnik uvijek ima sve dozvole jer je postavljen kao superuser.'; +$lang['p_include'] = 'Više dozvole uključuju sve niže. Dozvole Kreiraj, Učitaj i Briši se primjenjuju samo na imenske prostore, ne stranice.'; +$lang['current'] = 'Trenutna ACL Pravila'; +$lang['where'] = 'Stranica/Imenski prostor'; +$lang['who'] = 'Korisnik/Grupa'; +$lang['perm'] = 'Dozvole'; +$lang['acl_perm0'] = 'Ništa'; +$lang['acl_perm1'] = 'Čitaj'; +$lang['acl_perm2'] = 'Uredi'; +$lang['acl_perm4'] = 'Kreiraj'; +$lang['acl_perm8'] = 'Učitaj'; +$lang['acl_perm16'] = 'Briši'; +$lang['acl_new'] = 'Dodaj novi Zapis'; +$lang['acl_mod'] = 'Promijeni Zapis'; diff --git a/lib/plugins/acl/lang/hu/help.txt b/lib/plugins/acl/lang/hu/help.txt new file mode 100644 index 0000000..57f16a3 --- /dev/null +++ b/lib/plugins/acl/lang/hu/help.txt @@ -0,0 +1,12 @@ +=== Hozzáférési lista (ACL) kezelő === + +Ezen az oldalon jogokat oszthat és vehet el a wiki oldalakhoz és névterekhez. + +A bal oldalon látható az összes névtér és oldal. + +A felső form segít a kiválasztott felhasználó vagy csoport jogosultságainak megtekintésében vagy változtatásában. + +Az alsó táblázat mutatja az összes jelenleg érvényes hozzáférési szabályt. Ennek segítségével gyorsan törölhetők vagy megváltoztathatók a szabályok. + +A [[doku>acl|hivatalos ACL dokumentáció]] segíthet a DokuWiki hozzáférés-kezelés működésének megértésében. + diff --git a/lib/plugins/acl/lang/hu/lang.php b/lib/plugins/acl/lang/hu/lang.php new file mode 100644 index 0000000..8676383 --- /dev/null +++ b/lib/plugins/acl/lang/hu/lang.php @@ -0,0 +1,39 @@ + + * @author Siaynoq Mage + * @author schilling.janos + * @author Szabó Dávid + * @author Marton Sebok + */ +$lang['admin_acl'] = 'Hozzáférési lista (ACL) kezelő'; +$lang['acl_group'] = 'Csoport:'; +$lang['acl_user'] = 'Felhasználó:'; +$lang['acl_perms'] = 'Jogosultság ehhez:'; +$lang['page'] = 'Oldal'; +$lang['namespace'] = 'Névtér'; +$lang['btn_select'] = 'Kiválaszt'; +$lang['p_user_id'] = 'A(z) %s felhasználónak jelenleg a következő jogosultsága van ezen az oldalon: %s: %s.'; +$lang['p_user_ns'] = 'A(z) %s felhasználónak jelenleg a következő jogosultsága van ebben a névtérben: %s: %s.'; +$lang['p_group_id'] = 'A(z) %s csoport tagjainak jelenleg a következő jogosultsága van ezen az oldalon: %s: %s.'; +$lang['p_group_ns'] = 'A(z) %s csoport tagjainak jelenleg a következő jogosultsága van ebben a névtérben: %s: %s.'; +$lang['p_choose_id'] = 'A felső űrlapon adjon meg egy felhasználót vagy csoportot, akinek a(z) %s oldalhoz beállított jogosultságait megtekinteni vagy változtatni szeretné.'; +$lang['p_choose_ns'] = 'A felső űrlapon adj meg egy felhasználót vagy csoportot, akinek a(z) %s névtérhez beállított jogosultságait megtekinteni vagy változtatni szeretnéd.'; +$lang['p_inherited'] = 'Megjegyzés: ezek a jogok nem itt lettek explicit beállítva, hanem öröklődtek egyéb csoportokból vagy felsőbb névterekből.'; +$lang['p_isadmin'] = 'Megjegyzés: a kiválasztott csoportnak vagy felhasználónak mindig teljes jogosultsága lesz, mert Adminisztrátornak van beállítva.'; +$lang['p_include'] = 'A magasabb szintű jogok tartalmazzák az alacsonyabbakat. A Létrehozás, Feltöltés és Törlés jogosultságok csak névterekre alkalmazhatók, az egyes oldalakra nem.'; +$lang['current'] = 'Jelenlegi hozzáférési szabályok'; +$lang['where'] = 'Oldal/Névtér'; +$lang['who'] = 'Felhasználó/Csoport'; +$lang['perm'] = 'Jogosultságok'; +$lang['acl_perm0'] = 'Semmi'; +$lang['acl_perm1'] = 'Olvasás'; +$lang['acl_perm2'] = 'Szerkesztés'; +$lang['acl_perm4'] = 'Létrehozás'; +$lang['acl_perm8'] = 'Feltöltés'; +$lang['acl_perm16'] = 'Törlés'; +$lang['acl_new'] = 'Új bejegyzés hozzáadása'; +$lang['acl_mod'] = 'Bejegyzés módosítása'; diff --git a/lib/plugins/acl/lang/ia/help.txt b/lib/plugins/acl/lang/ia/help.txt new file mode 100644 index 0000000..59f5764 --- /dev/null +++ b/lib/plugins/acl/lang/ia/help.txt @@ -0,0 +1,11 @@ +=== Adjuta rapide: === + +In iste pagina tu pote adder e remover permissiones pro spatios de nomines e paginas in tu wiki. + +Le columna sinistre presenta tote le spatios de nomines e paginas disponibile. + +Le formulario hic supra permitte vider e modificar le permissiones de un usator o gruppo seligite. + +In le tabella hic infra se monstra tote le regulas de controlo de accesso actualmente configurate. Tu pote usar lo pro rapidemente deler o modificar plure regulas. + +Es recommendate leger le [[doku>acl|documentation official super ACL]] pro comprender completemente como le controlo de accesso functiona in DokuWiki. diff --git a/lib/plugins/acl/lang/ia/lang.php b/lib/plugins/acl/lang/ia/lang.php new file mode 100644 index 0000000..121424c --- /dev/null +++ b/lib/plugins/acl/lang/ia/lang.php @@ -0,0 +1,35 @@ + + * @author Martijn Dekker + */ +$lang['admin_acl'] = 'Gestion de listas de controlo de accesso'; +$lang['acl_group'] = 'Gruppo:'; +$lang['acl_user'] = 'Usator:'; +$lang['acl_perms'] = 'Permissiones pro'; +$lang['page'] = 'Pagina'; +$lang['namespace'] = 'Spatio de nomines'; +$lang['btn_select'] = 'Seliger'; +$lang['p_user_id'] = 'Le usator %s ha actualmente le sequente permissiones in le pagina %s: %s.'; +$lang['p_user_ns'] = 'Le usator %s ha actualmente le sequente permissiones in le spatio de nomines %s: %s.'; +$lang['p_group_id'] = 'Le membros del gruppo %s a actualmente le sequente permissiones in le pagina %s: %s.'; +$lang['p_group_ns'] = 'Le membros del gruppo %s ha actualmente le sequente permissiones in le spatio de nomines %s: %s.'; +$lang['p_choose_id'] = 'Per favor entra un usator o gruppo in le formulario hic supra pro vider o modificar le permissiones configurate pro le pagina %s.'; +$lang['p_choose_ns'] = 'Per favor entra un usator o gruppo in le formulario hic supra pro vider o modificar le permissiones configurate pro le spatio de nomines %s.'; +$lang['p_inherited'] = 'Nota ben: Iste permissiones non ha essite configurate explicitemente ma ha essite hereditate de altere gruppos o de spatios de nomines superior.'; +$lang['p_isadmin'] = 'Nota ben: Le gruppo o usator seligite ha sempre permissiones integral proque es configurate como superusator.'; +$lang['p_include'] = 'Le permissiones superior include les inferior. Le permissiones de Crear, Incargar e Deler es solmente applicabile a spatios de nomines, non a paginas.'; +$lang['current'] = 'Regulas ACL actual'; +$lang['where'] = 'Pagina/Spatio de nomines'; +$lang['who'] = 'Usator/Gruppo'; +$lang['perm'] = 'Permissiones'; +$lang['acl_perm0'] = 'Nulle'; +$lang['acl_perm1'] = 'Leger'; +$lang['acl_perm2'] = 'Modificar'; +$lang['acl_perm4'] = 'Crear'; +$lang['acl_perm8'] = 'Incargar'; +$lang['acl_perm16'] = 'Deler'; +$lang['acl_new'] = 'Adder nove entrata'; +$lang['acl_mod'] = 'Modificar entrata'; diff --git a/lib/plugins/acl/lang/id/lang.php b/lib/plugins/acl/lang/id/lang.php new file mode 100644 index 0000000..93e3f41 --- /dev/null +++ b/lib/plugins/acl/lang/id/lang.php @@ -0,0 +1,21 @@ + + * @author Yustinus Waruwu + */ +$lang['admin_acl'] = 'Manajemen Daftar Pengendali Akses'; +$lang['acl_group'] = 'Grup:'; +$lang['acl_user'] = 'User:'; +$lang['acl_perms'] = 'Ijin untuk'; +$lang['page'] = 'Halaman'; +$lang['namespace'] = 'Namespace'; +$lang['btn_select'] = 'Pilih'; +$lang['acl_perm1'] = 'Baca'; +$lang['acl_perm2'] = 'Ubah'; +$lang['acl_perm4'] = 'Buat'; +$lang['acl_perm8'] = 'Upload'; +$lang['acl_perm16'] = 'Hapus'; +$lang['acl_new'] = 'Tambah Entry baru'; diff --git a/lib/plugins/acl/lang/is/lang.php b/lib/plugins/acl/lang/is/lang.php new file mode 100644 index 0000000..6715c27 --- /dev/null +++ b/lib/plugins/acl/lang/is/lang.php @@ -0,0 +1,18 @@ + + * @author Ólafur Gunnlaugsson + * @author Erik Bjørn Pedersen + */ +$lang['acl_group'] = 'Hópur:'; +$lang['acl_user'] = 'Notandi:'; +$lang['page'] = 'Síða'; +$lang['namespace'] = 'Nafnrými'; +$lang['btn_select'] = 'Veldu'; +$lang['where'] = 'Síða/Nafnrými'; +$lang['acl_perm16'] = 'Eyða'; diff --git a/lib/plugins/acl/lang/it/help.txt b/lib/plugins/acl/lang/it/help.txt new file mode 100644 index 0000000..8bf68e8 --- /dev/null +++ b/lib/plugins/acl/lang/it/help.txt @@ -0,0 +1,11 @@ +=== Breve Aiuto: === + +In questa pagina puoi aggiungere e rimuovere permessi per categorie e pagine del tuo wiki. + +Il pannello di sinistra mostra tutte le categorie e le pagine disponibili. + +Il campo sopra ti permette di vedere e modificare i permessi di un utente o gruppo selezionato. + +Nella tabella sotto, sono riportate tutte le regole di controllo degli accessi attualmente impostate. Puoi utilizzarla per eliminare o cambiare al volo varie regole. + +Leggere la [[doku>acl|documentazione ufficale delle ACL]] può aiutarti a capire pienamente come funziona il controllo degli accessi in DokuWiki. diff --git a/lib/plugins/acl/lang/it/lang.php b/lib/plugins/acl/lang/it/lang.php new file mode 100644 index 0000000..7528d49 --- /dev/null +++ b/lib/plugins/acl/lang/it/lang.php @@ -0,0 +1,41 @@ + + * @author Roberto Bolli + * @author Pietro Battiston + * @author Lorenzo Breda + * @author robocap + * @author Jacopo Corbetta + * @author Matteo Pasotti + */ +$lang['admin_acl'] = 'Gestione Lista Controllo Accessi (ACL)'; +$lang['acl_group'] = 'Gruppo:'; +$lang['acl_user'] = 'Utente:'; +$lang['acl_perms'] = 'Permessi per'; +$lang['page'] = 'Pagina'; +$lang['namespace'] = 'Categoria'; +$lang['btn_select'] = 'Seleziona'; +$lang['p_user_id'] = 'L\'utente %s attualmente ha i seguenti permessi sulla pagina %s: %s.'; +$lang['p_user_ns'] = 'L\'utente %s attualmente ha i seguenti permessi per la categoria %s: %s.'; +$lang['p_group_id'] = 'I membri del gruppo%s attualmente hanno i seguenti permessi sulla pagina %s: %s.'; +$lang['p_group_ns'] = 'I membri del gruppo%s attualmente hanno i seguenti permessi per la categoria %s: %s.'; +$lang['p_choose_id'] = 'Inserisci un utente o gruppo nel campo sopra per modificare i permessi impostati per la pagina %s.'; +$lang['p_choose_ns'] = 'Inserisci un utente o un gruppo nel campo sopra per modificare i permessi impostati per la categoria %s.'; +$lang['p_inherited'] = 'Nota: questi permessi non sono stati esplicitamente impostati, ma sono stati ereditati da altri gruppi o da categorie superiori.'; +$lang['p_isadmin'] = 'Nota: il gruppo o utente selezionato ha sempre tutti i permessi perché è configurato come amministratore.'; +$lang['p_include'] = 'I permessi più elevati includono i permessi inferiori. I permessi Crea, Carica ed Elimina si applicano soltanto alle categorie e non alle pagine.'; +$lang['current'] = 'Regole ACL attuali'; +$lang['where'] = 'Pagina/Categoria'; +$lang['who'] = 'Utente/Gruppo'; +$lang['perm'] = 'Permessi'; +$lang['acl_perm0'] = 'Nessuno'; +$lang['acl_perm1'] = 'Lettura'; +$lang['acl_perm2'] = 'Modifica'; +$lang['acl_perm4'] = 'Crea'; +$lang['acl_perm8'] = 'Carica'; +$lang['acl_perm16'] = 'Elimina'; +$lang['acl_new'] = 'Aggiungi nuovo valore'; +$lang['acl_mod'] = 'Modifica valore'; diff --git a/lib/plugins/acl/lang/ja/help.txt b/lib/plugins/acl/lang/ja/help.txt new file mode 100644 index 0000000..a1f03a3 --- /dev/null +++ b/lib/plugins/acl/lang/ja/help.txt @@ -0,0 +1,8 @@ +=== 操作案内 === + +このページでは、Wiki 内の名前空間とページに対する権限を追加・削除することができます。 + * 左側のボックスには存在する名前空間とページが表示されています。 + * 上部のフォームを使って、選択したユーザーもしくはグループの権限を閲覧・変更することができます。 + * 下部の一覧は、現在設定されているアクセス制御のルールを表示します。この一覧を使って、複数のルールを素早く変更・削除することが可能です。 + +DokuWiki のアクセス制御については、[[doku>ja:acl|アクセス制御リスト (ACL)の公式解説]]をお読み下さい。 \ No newline at end of file diff --git a/lib/plugins/acl/lang/ja/lang.php b/lib/plugins/acl/lang/ja/lang.php new file mode 100644 index 0000000..1a87a04 --- /dev/null +++ b/lib/plugins/acl/lang/ja/lang.php @@ -0,0 +1,41 @@ + + * @author Davilin(Yuji Takenaka) + * @author Ikuo Obataya + * @author Daniel Dupriest + * @author Kazutaka Miyasaka + * @author Taisuke Shimamoto + * @author Satoshi Sahara + */ +$lang['admin_acl'] = 'アクセスコントロール管理'; +$lang['acl_group'] = 'グループ:'; +$lang['acl_user'] = 'ユーザー:'; +$lang['acl_perms'] = '権限を追加'; +$lang['page'] = '文書'; +$lang['namespace'] = '名前空間'; +$lang['btn_select'] = '選択'; +$lang['p_user_id'] = 'ユーザー %s は、ページ %s に対して次の権限を持っています: %s'; +$lang['p_user_ns'] = 'ユーザー %s は、名前空間 %s に対して次の権限を持っています: %s'; +$lang['p_group_id'] = 'グループ %s のメンバーは、ページ %s に対して次の権限を持っています: %s'; +$lang['p_group_ns'] = 'グループ %s のメンバーは、名前空間 %s に対して次の権限を持っています: %s'; +$lang['p_choose_id'] = 'ページ %s にセットされた権限を閲覧・編集するには、上記のフォームにユーザー名もしくはグループ名を入力して下さい。'; +$lang['p_choose_ns'] = '名前空間 %s にセットされた権限を閲覧・編集するには、上記のフォームにユーザー名もしくはグループ名を入力して下さい。'; +$lang['p_inherited'] = '注意:これらの権限は明示されていませんが、他のグループもしくは上位の名前空間の権限を継承しています。'; +$lang['p_isadmin'] = '注意:選択したグループもしくはユーザーはスーパーユーザーであるため、全ての権限があります。'; +$lang['p_include'] = '高次の権限は、それより低次の権限を含みます。作成・アップロード・削除の権限は、ページではなく名前空間のみに適用されます。'; +$lang['current'] = '現在のACLルール'; +$lang['where'] = 'ページ/名前空間'; +$lang['who'] = 'ユーザー/グループ'; +$lang['perm'] = '権限'; +$lang['acl_perm0'] = '無し'; +$lang['acl_perm1'] = '読取'; +$lang['acl_perm2'] = '編集'; +$lang['acl_perm4'] = '作成'; +$lang['acl_perm8'] = 'アップロード'; +$lang['acl_perm16'] = '削除'; +$lang['acl_new'] = '新規エントリ'; +$lang['acl_mod'] = 'エントリの編集'; diff --git a/lib/plugins/acl/lang/kk/lang.php b/lib/plugins/acl/lang/kk/lang.php new file mode 100644 index 0000000..28984fd --- /dev/null +++ b/lib/plugins/acl/lang/kk/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['where'] = 'ទំព័រ/ដ្ឋាននាម'; diff --git a/lib/plugins/acl/lang/ko/help.txt b/lib/plugins/acl/lang/ko/help.txt new file mode 100644 index 0000000..80069b3 --- /dev/null +++ b/lib/plugins/acl/lang/ko/help.txt @@ -0,0 +1,8 @@ +=== 빠른 도움말: === + +현재 문서에서 위키 이름공간과 문서에 대한 접근 권한을 추가하거나 삭제할 수 있습니다. + * 왼쪽 영역에는 선택 가능한 이름공간과 문서 목록을 보여줍니다. + * 위쪽 입력 양식에서 선택된 사용자와 그룹의 접근 권한을 보거나 바꿀 수 있습니다. + * 아래 테이블에서 현재 설정된 모든 접근 제어 규칙을 볼 수 있으며, 즉시 여러 규칙을 삭제하거나 바꿀 수 있습니다. + +도쿠위키에서 접근 제어가 어떻게 동작되는지 알아보려면 [[doku>ko:acl|ACL 공식 문서]]를 읽어보시기 바랍니다. \ No newline at end of file diff --git a/lib/plugins/acl/lang/ko/lang.php b/lib/plugins/acl/lang/ko/lang.php new file mode 100644 index 0000000..35f06c4 --- /dev/null +++ b/lib/plugins/acl/lang/ko/lang.php @@ -0,0 +1,44 @@ + + * @author Anika Henke + * @author Matthias Grimm + * @author jk Lee + * @author dongnak + * @author Song Younghwan + * @author Seung-Chul Yoo + * @author erial2 + * @author Myeongjin + * @author Garam + */ +$lang['admin_acl'] = '접근 제어 목록 관리'; +$lang['acl_group'] = '그룹:'; +$lang['acl_user'] = '사용자:'; +$lang['acl_perms'] = '권한'; +$lang['page'] = '문서'; +$lang['namespace'] = '이름공간'; +$lang['btn_select'] = '선택'; +$lang['p_user_id'] = '%s 사용자는 현재 %s: %s 문서에 접근이 가능합니다.'; +$lang['p_user_ns'] = '%s 사용자는 현재 %s: %s 이름공간에 접근이 가능합니다.'; +$lang['p_group_id'] = '%s 그룹 구성원은 현재 %s: %s 문서에 접근이 가능합니다.'; +$lang['p_group_ns'] = '%s 그룹 구성원은 현재 %s: %s 이름공간에 접근이 가능합니다.'; +$lang['p_choose_id'] = '%s 문서 접근 권한을 보거나 바꾸려면 사용자그룹을 위 양식에 입력하세요.'; +$lang['p_choose_ns'] = '%s 이름공간 접근 권한을 보거나 바꾸려면 사용자그룹을 위 양식에 입력하세요.'; +$lang['p_inherited'] = '참고: 권한이 명시적으로 설정되지 않았으므로 다른 그룹이나 상위 이름공간으로부터 가져왔습니다.'; +$lang['p_isadmin'] = '참고: 슈퍼 사용자로 설정되어 있으므로 선택된 그룹이나 사용자는 언제나 모든 접근 권한을 가집니다.'; +$lang['p_include'] = '더 높은 접근 권한은 하위를 포함합니다. 문서가 아닌 이름공간에는 만들기, 올리기, 삭제 권한만 적용됩니다.'; +$lang['current'] = '현재 ACL 규칙'; +$lang['where'] = '문서/이름공간'; +$lang['who'] = '사용자/그룹'; +$lang['perm'] = '권한'; +$lang['acl_perm0'] = '없음'; +$lang['acl_perm1'] = '읽기'; +$lang['acl_perm2'] = '편집'; +$lang['acl_perm4'] = '만들기'; +$lang['acl_perm8'] = '올리기'; +$lang['acl_perm16'] = '삭제'; +$lang['acl_new'] = '새 항목 추가'; +$lang['acl_mod'] = '항목 수정'; diff --git a/lib/plugins/acl/lang/la/help.txt b/lib/plugins/acl/lang/la/help.txt new file mode 100644 index 0000000..553884c --- /dev/null +++ b/lib/plugins/acl/lang/la/help.txt @@ -0,0 +1,11 @@ +=== Auxilium: === + +Hic facultates generum paginarumque addere delereue potes. + +Tabella sinistra omnes paginas generaque ostendit. + +His campis mutare facultates electorum Sodalium Gregumque potes. + +In tabula omnes administrationis leges ostensae sunt. Delere quoque uel mutare plures leges potes. + +Si [[doku>acl|official documentation on ACL]] legas, maius auxilium in Vicem mutando habes. \ No newline at end of file diff --git a/lib/plugins/acl/lang/la/lang.php b/lib/plugins/acl/lang/la/lang.php new file mode 100644 index 0000000..3779ba7 --- /dev/null +++ b/lib/plugins/acl/lang/la/lang.php @@ -0,0 +1,34 @@ + + */ +$lang['admin_acl'] = 'Administratio Indicis Custodiae Aditus'; +$lang['acl_group'] = 'Grex:'; +$lang['acl_user'] = 'Sodalis:'; +$lang['acl_perms'] = 'Facultas:'; +$lang['page'] = 'Pagina'; +$lang['namespace'] = 'Genus'; +$lang['btn_select'] = 'eligere'; +$lang['p_user_id'] = 'Sodalis %s nunc has facultates paginae "%s habes: %s.'; +$lang['p_user_ns'] = 'Sodalis %s nunc has facultates generis "%s habes: %s.'; +$lang['p_group_id'] = 'Socius\a gregis %s nunc has facultates paginae "%s habes: %s.'; +$lang['p_group_ns'] = 'Socius\a gregis %s nunc has facultates generis "%s habes: %s.'; +$lang['p_choose_id'] = 'Sodalis grexue in campo insere ut facultates paginae %s uideas.'; +$lang['p_choose_ns'] = 'Sodalis grexue in campo insere ut facultates generis %s uideas.'; +$lang['p_inherited'] = 'Caue: hae facultates et huic rei et aliis gregibus uel generibus legitimae sunt.'; +$lang['p_isadmin'] = 'Caue: electi greges semper plenum ius habent, eo quod ut magister\stra elegitur.'; +$lang['p_include'] = 'Maiores facultates minores includunt. Creandi, onerandi uel delendi facultates solum generibus, non paginis sunt.'; +$lang['current'] = 'Communes ICA leges'; +$lang['where'] = 'Pagina/Genus'; +$lang['who'] = 'Sodalis/Grex'; +$lang['perm'] = 'Facultates'; +$lang['acl_perm0'] = 'Nihil'; +$lang['acl_perm1'] = 'Legere'; +$lang['acl_perm2'] = 'Recensere'; +$lang['acl_perm4'] = 'Creare'; +$lang['acl_perm8'] = 'Onerare'; +$lang['acl_perm16'] = 'Delere'; +$lang['acl_new'] = 'Nouom addere'; +$lang['acl_mod'] = 'Nouom recensere'; diff --git a/lib/plugins/acl/lang/lb/help.txt b/lib/plugins/acl/lang/lb/help.txt new file mode 100644 index 0000000..e36ed37 --- /dev/null +++ b/lib/plugins/acl/lang/lb/help.txt @@ -0,0 +1,11 @@ +=== Séier Hëllef: === + +Op dëser Säit kanns de Rechter fir Namespacen a Säiten an dengem Wiki setzen. + +Op der lénkser Säit hues de all d'Namespacen a Säiten. + +Am Formulär hei uewendriwwer kanns de d'Rechter vun dem ausgewielte Benotzer oder Grupp änneren + +An der Tabell hei ënnendrënner kanns de all d'Reegele gesinn déi de Moment gesat sinn. Du kanns se huelen fir Reegelen ze änneren oder ze läschen. + +Déi [[doku>acl|offiziell Dokumentatioun iwwert ACL]] hëlleft der besser ze verstoen wéi déi Reegelen am Dokuwiki funktionéieren. diff --git a/lib/plugins/acl/lang/lt/lang.php b/lib/plugins/acl/lang/lt/lang.php new file mode 100644 index 0000000..5bf5981 --- /dev/null +++ b/lib/plugins/acl/lang/lt/lang.php @@ -0,0 +1,22 @@ + + * @author audrius.klevas + * @author Arunas Vaitekunas + */ +$lang['admin_acl'] = 'Priėjimo Kontrolės Sąrašų valdymas'; +$lang['acl_group'] = 'Grupė:'; +$lang['acl_user'] = 'Vartotojas:'; +$lang['acl_perms'] = 'Leidimai'; +$lang['page'] = 'Puslapis'; +$lang['namespace'] = 'Pavadinimas'; +$lang['btn_select'] = 'Rinktis'; +$lang['acl_perm1'] = 'Skaityti'; +$lang['acl_perm2'] = 'Redaguoti'; +$lang['acl_perm4'] = 'Sukurti'; +$lang['acl_perm8'] = 'Atsiųsti'; +$lang['acl_perm16'] = 'Ištrinti'; +$lang['acl_new'] = 'Pridėti naują įrašą'; diff --git a/lib/plugins/acl/lang/lv/help.txt b/lib/plugins/acl/lang/lv/help.txt new file mode 100644 index 0000000..f570d79 --- /dev/null +++ b/lib/plugins/acl/lang/lv/help.txt @@ -0,0 +1,11 @@ +=== Īsa palīdzība === + +Šajā lapā var uzdot un noņemt tiesības uz lapām un nodaļām. + +Kreisajā pusē parādītas visas pieejamās nodaļas un lapas. + +Formā augšpusē var redzēt un grozīt norādītā lietotāja vai grupas tiesības . + +Apakšā tabulā parādīts visu tiesību saraksts. To var lietot, lai ātri mainītu vairākus pieejas tiesību noteikumus. + +[[doku>acl|Officiālajos piekļuves tiesību noteikumu dokumentos]] var atrast izvērstu informāciju, kā darbojas DokuWiki sistēmas piekļuves tiesību kontrole. diff --git a/lib/plugins/acl/lang/lv/lang.php b/lib/plugins/acl/lang/lv/lang.php new file mode 100644 index 0000000..e4ca492 --- /dev/null +++ b/lib/plugins/acl/lang/lv/lang.php @@ -0,0 +1,35 @@ + + */ +$lang['admin_acl'] = 'Piekļuves tiesību vadība'; +$lang['acl_group'] = 'Grupa:'; +$lang['acl_user'] = 'Lietotājs:'; +$lang['acl_perms'] = 'Tiesības'; +$lang['page'] = 'Lapa'; +$lang['namespace'] = 'Nodaļa'; +$lang['btn_select'] = 'Izvēlēties'; +$lang['p_user_id'] = 'Lietotājam %s ir tiesības %s lapu %s .'; +$lang['p_user_ns'] = 'Lietotājam %s nodaļā %s ir tiesības %s.'; +$lang['p_group_id'] = 'Grupas %s biedriem ir tiesības %s lapu %s.'; +$lang['p_group_ns'] = 'Grupas %s biedriem ir tiesības %s nodaļu %s: .'; +$lang['p_choose_id'] = 'Lūdzu ieraksti lietotāju vai grupu augstāk norādītajā laukā, lai skatītu vai labotu tiesības lapai %s.'; +$lang['p_choose_ns'] = 'Lūdzu ieraksti lietotāju vai grupu augstāk norādītajā laukā, lai skatītu vai labotu tiesības nodaļai %s.'; +$lang['p_inherited'] = 'Ievēro: Šīs tiesības nav tieši uzdotas, bet mantotas no citām grupām vai augstākām nodaļām. '; +$lang['p_isadmin'] = 'Ievēro: Norādītajai grupai vai lietotājam vienmēr ir visas tiesības, jo tas konfigurēts kā superuser.'; +$lang['p_include'] = 'Augstāka atļauja iekļauj arī zemākās tiesības. Izveidošanas, augšupielādēšanas un dzēšanas tiesības attiecas tikai uz nodaļām, nevis lapām.'; +$lang['current'] = 'Patreizējo tiesību saraksts (ACL)'; +$lang['where'] = 'Lapa/nodaļa'; +$lang['who'] = 'Lietotājs/grupa'; +$lang['perm'] = 'Tiesības'; +$lang['acl_perm0'] = 'nekādas'; +$lang['acl_perm1'] = 'lasīt'; +$lang['acl_perm2'] = 'labot'; +$lang['acl_perm4'] = 'izveidot'; +$lang['acl_perm8'] = 'augšupielādēt'; +$lang['acl_perm16'] = 'dzēst'; +$lang['acl_new'] = 'pievienot jaunu šķirkli'; +$lang['acl_mod'] = 'labot šķirkli'; diff --git a/lib/plugins/acl/lang/mk/lang.php b/lib/plugins/acl/lang/mk/lang.php new file mode 100644 index 0000000..27f41e7 --- /dev/null +++ b/lib/plugins/acl/lang/mk/lang.php @@ -0,0 +1,22 @@ + + */ +$lang['acl_group'] = 'Група:'; +$lang['acl_user'] = 'Корисник:'; +$lang['acl_perms'] = 'Пермисии за'; +$lang['page'] = 'Страница'; +$lang['btn_select'] = 'Избери'; +$lang['current'] = 'Моментални ACL правила'; +$lang['who'] = 'Корисник/група'; +$lang['perm'] = 'Пермисии'; +$lang['acl_perm0'] = 'Ништо'; +$lang['acl_perm1'] = 'Читај'; +$lang['acl_perm2'] = 'Уреди'; +$lang['acl_perm4'] = 'Креирај'; +$lang['acl_perm8'] = 'Качи'; +$lang['acl_perm16'] = 'Избриши'; +$lang['acl_new'] = 'Додај нов запис'; +$lang['acl_mod'] = 'Измени запис'; diff --git a/lib/plugins/acl/lang/mr/help.txt b/lib/plugins/acl/lang/mr/help.txt new file mode 100644 index 0000000..e8aa13b --- /dev/null +++ b/lib/plugins/acl/lang/mr/help.txt @@ -0,0 +1,12 @@ +=== त्वरित मदत === + +या पानावर तुमची तुमच्या विकी मधील पाने किंवा नेमस्पेस वरील परवानग्या बदलू शकता. + +डाविकडील मार्जिन मधे सर्व उपलब्ध पाने आणि नेमस्पेस दाखवले आहेत. + +वरील फॉर्म वापरून तुमची निवडलेल्या सदस्य किंवा गटाच्या परवानग्या बदलू शकता. + +खालील टेबल मधे सध्या सेट असलेले नियम दिलेले आहेत. +हे टेबल वापरून तुम्ही चटकन हे नियम बदलू शकता. + +[[doku>acl| ACL वरील अधिकृत माहितीसंग्रह ]] वाचून तुम्हाला डॉक्युविकिमधे परवानगीची व्यवस्था कशी काम करते ते नीट समजेल. \ No newline at end of file diff --git a/lib/plugins/acl/lang/mr/lang.php b/lib/plugins/acl/lang/mr/lang.php new file mode 100644 index 0000000..1094ed7 --- /dev/null +++ b/lib/plugins/acl/lang/mr/lang.php @@ -0,0 +1,37 @@ + + * @author Padmanabh Kulkarni + * @author shantanoo@gmail.com + */ +$lang['admin_acl'] = 'Access Control List व्यवस्थापन'; +$lang['acl_group'] = 'गट:'; +$lang['acl_user'] = 'सदस्य:'; +$lang['acl_perms'] = 'परवानगी \'च्या साठी'; +$lang['page'] = 'पान'; +$lang['namespace'] = 'नेमस्पेस'; +$lang['btn_select'] = 'निवडा'; +$lang['p_user_id'] = '%s ह्या सदस्याला सध्या %s या पानावर पुढील परवानग्या आहेत : %s.'; +$lang['p_user_ns'] = '%s या सदस्याला सध्या %s या नेमस्पेसवर पुढील परवानग्या आहेत : %s.'; +$lang['p_group_id'] = '%s या गटाच्या सदस्याना सध्या %s या पानावर पुढील परवानग्या आहेत : %s.'; +$lang['p_group_ns'] = '%s या गटाच्या सदस्याना सध्या %s या नेमस्पेसवर पुढील परवानग्या आहेत : %s.'; +$lang['p_choose_id'] = 'वरील फॉर्म मधे एखाद्या सदस्य किंवा गटाचे नाव टाकुन %s या पानासाठी त्यांच्या परवानग्या पाहू/बदलू शकता.'; +$lang['p_choose_ns'] = 'वरील फॉर्म मधे एखाद्या सदस्य किंवा गटाचे नाव टाकुन %s या नेमस्पेससाठी त्यांच्या परवानग्या पाहू/बदलू शकता.'; +$lang['p_inherited'] = 'टीप : ह्या परवानग्या प्रत्यक्ष सेट केल्या नसून त्या इतर गट किंवा अधिक उच्च नेमस्पेस कडून वारसाहक्काने :) आल्या आहेत.'; +$lang['p_isadmin'] = 'टीप : निवडलेल्या सदस्य किंवा गटाला कायम सर्व परवानग्या असतात कारण तो सुपर सदस्य म्हणुन सेट केला आहे.'; +$lang['p_include'] = 'उच्च परवानग्यांमधे त्याखालिल परवानग्या अध्याहृत असतात. क्रिएट, अपलोड आणि डिलीट परवानग्या फ़क्त नामसमुहावर (नेमस्पेस) लागू असतात, पानांवर नाही.'; +$lang['current'] = 'सद्य ACL नियम'; +$lang['where'] = 'पान/नेमस्पेस'; +$lang['who'] = 'सदस्य/गट'; +$lang['perm'] = 'परवानग्या'; +$lang['acl_perm0'] = 'काही नाही.'; +$lang['acl_perm1'] = 'वाचन'; +$lang['acl_perm2'] = 'संपादन'; +$lang['acl_perm4'] = 'निर्माण'; +$lang['acl_perm8'] = 'अपलोड'; +$lang['acl_perm16'] = 'डिलीट'; +$lang['acl_new'] = 'नवीन एंट्री करा'; +$lang['acl_mod'] = 'एंट्री बदला'; diff --git a/lib/plugins/acl/lang/ne/lang.php b/lib/plugins/acl/lang/ne/lang.php new file mode 100644 index 0000000..481b39a --- /dev/null +++ b/lib/plugins/acl/lang/ne/lang.php @@ -0,0 +1,28 @@ + + * @author SarojKumar Dhakal + * @author Saroj Dhakal + */ +$lang['admin_acl'] = 'एक्सेस कन्ट्रोल लिस्ट व्यवस्थापन'; +$lang['acl_group'] = 'समूह:'; +$lang['acl_user'] = 'प्रोगकर्ता:'; +$lang['acl_perms'] = 'को लागि अनुमति'; +$lang['page'] = 'पृष्ठ'; +$lang['namespace'] = 'नेमस्पेस'; +$lang['btn_select'] = 'छान्नुहोस्'; +$lang['current'] = 'हालैको ACL नियमहरु '; +$lang['where'] = 'पृष्ठ / नेमस्पेस'; +$lang['who'] = 'प्रयोगकर्ता / समूह '; +$lang['perm'] = 'अनुमति'; +$lang['acl_perm0'] = 'कुनै पनि होइन'; +$lang['acl_perm1'] = 'पठन गर्नुहोस्'; +$lang['acl_perm2'] = 'सम्पादन गर्नुहोस्'; +$lang['acl_perm4'] = 'निर्माण गर्नुहोस्'; +$lang['acl_perm8'] = 'अपलोड गर्नुहोस्'; +$lang['acl_perm16'] = 'मेटाउनुहोस्'; +$lang['acl_new'] = 'नयाँ प्रविष्ठि गर्नुहोस्'; +$lang['acl_mod'] = 'प्रविष्ठि सच्याउनुहोस्'; diff --git a/lib/plugins/acl/lang/nl/help.txt b/lib/plugins/acl/lang/nl/help.txt new file mode 100644 index 0000000..14c78e2 --- /dev/null +++ b/lib/plugins/acl/lang/nl/help.txt @@ -0,0 +1,8 @@ +=== Snelle hulp: === + +Op deze pagina kun je bevoegdheden toevoegen en verwijderen voor namespaces en pagina's in je wiki. + * Het linkerpaneel geeft alle beschikbare namespaces en pagina's weer. + * In het formulier hierboven kun je bevoegdheden zien en aanpassen voor een selecteerde gebruiker of groep. + * In de tabel hieronder worden alle momenteel ingestelde toegangsregels weergegeven. Je kunt hier snel regels wijzigen of verwijderen. + +Lees de [[doku>acl|documentatie over ACLs]] om de mogelijkheden volledig te begrijpen. diff --git a/lib/plugins/acl/lang/nl/lang.php b/lib/plugins/acl/lang/nl/lang.php new file mode 100644 index 0000000..7f28170 --- /dev/null +++ b/lib/plugins/acl/lang/nl/lang.php @@ -0,0 +1,48 @@ + + * @author Jack van Klaren + * @author Riny Heijdendael + * @author Koen Huybrechts + * @author Wouter Schoot + * @author John de Graaff + * @author Niels Schoot + * @author Dion Nicolaas + * @author Danny Rotsaert + * @author Marijn Hofstra + * @author Timon Van Overveldt + * @author Ricardo Guijt + * @author Gerrit + * @author Remon + */ +$lang['admin_acl'] = 'Toegangsrechten'; +$lang['acl_group'] = 'Groep:'; +$lang['acl_user'] = 'Gebruiker:'; +$lang['acl_perms'] = 'Permissies voor'; +$lang['page'] = 'Pagina'; +$lang['namespace'] = 'Namespace'; +$lang['btn_select'] = 'Selecteer'; +$lang['p_user_id'] = 'Gebruiker %s heeft momenteel de volgende bevoegdheden op pagina %s: %s.'; +$lang['p_user_ns'] = 'Gebruiker %s heeft momenteel de volgende bevoegdheden op namespace %s: %s.'; +$lang['p_group_id'] = 'Leden van groep %s hebben momenteel de volgende bevoegdheden op pagina %s: %s.'; +$lang['p_group_ns'] = 'Leden van groep %s hebben momenteel de volgende bevoegdheden in namespace %s: %s.'; +$lang['p_choose_id'] = 'Vul een gebruiker of groep in in het bovenstaande formulier om de bevoegdheden te bekijken of te bewerken voor de pagina %s.'; +$lang['p_choose_ns'] = 'Vul een gebruiker of groep in in het bovenstaande formulier om de bevoegdheden te bekijken of te bewerken voor de namespace %s.'; +$lang['p_inherited'] = 'Let op: Deze permissies zijn niet expliciet ingesteld maar overerfd van andere groepen of hogere namespaces.'; +$lang['p_isadmin'] = 'Let op: De geselecteerde groep of gebruiker heeft altijd volledige toegangsrechten omdat hij als superuser geconfigureerd is.'; +$lang['p_include'] = 'Hogere permissies bevatten ook de lagere. Aanmaken, uploaden en verwijderen gelden alleen voor namespaces, niet voor pagina\'s.'; +$lang['current'] = 'Huidige ACL regels'; +$lang['where'] = 'Pagina/Namespace'; +$lang['who'] = 'Gebruiker/Groep'; +$lang['perm'] = 'Bevoegdheden'; +$lang['acl_perm0'] = 'Geen'; +$lang['acl_perm1'] = 'Lezen'; +$lang['acl_perm2'] = 'Bewerken'; +$lang['acl_perm4'] = 'Aanmaken'; +$lang['acl_perm8'] = 'Uploaden'; +$lang['acl_perm16'] = 'Verwijderen'; +$lang['acl_new'] = 'Nieuwe regel toevoegen'; +$lang['acl_mod'] = 'Regel aanpassen'; diff --git a/lib/plugins/acl/lang/no/help.txt b/lib/plugins/acl/lang/no/help.txt new file mode 100644 index 0000000..c3d3688 --- /dev/null +++ b/lib/plugins/acl/lang/no/help.txt @@ -0,0 +1,11 @@ +=== Hurtighjelp: === + +På denne siden kan du legge til og fjerne tillatelser for navnerom og sider i din wiki. + +Venstre panel viser alle tilgjengelige navnerom og sider. + +Skjemaet over tillater deg å se og modifisere tillatelser for en valgt bruker eller gruppe. + +I tabellen nedenfor vises alle nærværende satte adgangskontroll-regler. Du kan bruke den til raskt å slette eller endre mange regler i slengen. + +Å lese [[doku>acl|den offisielle dokumentasjonen for ACL]] kan hjelpe deg å fullt ut forstå hvordan adgangskontroll fungerer i DokuWiki. diff --git a/lib/plugins/acl/lang/no/lang.php b/lib/plugins/acl/lang/no/lang.php new file mode 100644 index 0000000..218ea75 --- /dev/null +++ b/lib/plugins/acl/lang/no/lang.php @@ -0,0 +1,48 @@ + + * @author Jorge Barrera Grandon + * @author Thomas Nygreen + * @author Arild Burud + * @author Torkill Bruland + * @author Rune M. Andersen + * @author Jakob Vad Nielsen (me@jakobnielsen.net) + * @author Kjell Tore Næsgaard + * @author Knut Staring + * @author Lisa Ditlefsen + * @author Erik Pedersen + * @author Rune Rasmussen + * @author Jon Bøe + * @author Egil Hansen + */ +$lang['admin_acl'] = 'Administrasjon av lister for adgangskontroll (ACL)'; +$lang['acl_group'] = 'Gruppe:'; +$lang['acl_user'] = 'Bruker:'; +$lang['acl_perms'] = 'Rettigheter for'; +$lang['page'] = 'Side'; +$lang['namespace'] = 'Navnerom'; +$lang['btn_select'] = 'Velg'; +$lang['p_user_id'] = 'Bruker %s har for tiden følgende tillatelser i for siden %s: %s.'; +$lang['p_user_ns'] = 'Bruker %s har for tiden følgende tillatelser i navnerom %s: %s.'; +$lang['p_group_id'] = 'Medlemmer av gruppe %s har for tiden følgende tillatelser i for siden %s: %s.'; +$lang['p_group_ns'] = 'Medlemmer av gruppe %s har for tiden følgende tillatelser i navnerom %s: %s.'; +$lang['p_choose_id'] = 'Før inn en bruker eller gruppe i skjemaet over for å vise eller redigere tillatelser satt for siden %s.'; +$lang['p_choose_ns'] = 'Før inn en bruker eller gruppe i skjemaet over for å vise eller redigere tillatelser satt for navnerommet %s.'; +$lang['p_inherited'] = 'Merk: Disse tillatelser ble ikke eksplisitt satt, men ble arvet fra andre grupper eller høyere navnerom.'; +$lang['p_isadmin'] = 'Merk: Den valgte gruppen eller bruker har altid fulle tillatelser fordi vedkommende er konfigurert som superbruker.'; +$lang['p_include'] = 'Høyere tillgangsrettigheter inkluderer lavere. Rettigheter for å opprette, laste opp og slette gjelder bare for navnerom, ikke enkeltsider.'; +$lang['current'] = 'Gjeldende ACL-regler'; +$lang['where'] = 'Side/Navnerom'; +$lang['who'] = 'Bruker/Gruppe'; +$lang['perm'] = 'Rettigheter'; +$lang['acl_perm0'] = 'Ingen'; +$lang['acl_perm1'] = 'Lese'; +$lang['acl_perm2'] = 'Redigere'; +$lang['acl_perm4'] = 'Opprette'; +$lang['acl_perm8'] = 'Laste opp'; +$lang['acl_perm16'] = 'Slette'; +$lang['acl_new'] = 'Legg til ny oppføring'; +$lang['acl_mod'] = 'Endre oppføring'; diff --git a/lib/plugins/acl/lang/pl/help.txt b/lib/plugins/acl/lang/pl/help.txt new file mode 100644 index 0000000..331fd2a --- /dev/null +++ b/lib/plugins/acl/lang/pl/help.txt @@ -0,0 +1,11 @@ +=== Pomoc === + +Na tej stronie możesz zmienić uprawnienia do stron i katalogów w wiki. + +Lewy panel pokazuje wszystkie dostępne katalogi i strony. + +Formularz powyżej pozwala wyświetlać uprawnienia wybranego użytkownika oraz grupy. + +W tabeli poniżej znajdują się wszystkie aktywne reguły dotyczące uprawnień. + +Więcej informacji na temat uprawnień w DokuWiki możesz znaleźć w [[doku>acl|oficjalnej dokumentacji uprawnień]]. diff --git a/lib/plugins/acl/lang/pl/lang.php b/lib/plugins/acl/lang/pl/lang.php new file mode 100644 index 0000000..2d2f91e --- /dev/null +++ b/lib/plugins/acl/lang/pl/lang.php @@ -0,0 +1,45 @@ + + * @author Mariusz Kujawski + * @author Maciej Kurczewski + * @author Sławomir Boczek + * @author sleshek + * @author Leszek Stachowski + * @author maros + * @author Grzegorz Widła + * @author Łukasz Chmaj + * @author Begina Felicysym + * @author Aoi Karasu + */ +$lang['admin_acl'] = 'Zarządzanie uprawnieniami'; +$lang['acl_group'] = 'Grupa:'; +$lang['acl_user'] = 'Użytkownik:'; +$lang['acl_perms'] = 'Uprawnienia użytkownika'; +$lang['page'] = 'Strona'; +$lang['namespace'] = 'Katalog'; +$lang['btn_select'] = 'Wybierz'; +$lang['p_user_id'] = 'Użytkownik %s posiada następujące uprawnienia do strony %s: %s.'; +$lang['p_user_ns'] = 'Użytkownik %s posiada następujące uprawnienia do katalogów %s: %s.'; +$lang['p_group_id'] = 'Członkowie grupy %s posiadają następujące uprawnienia do strony %s: %s.'; +$lang['p_group_ns'] = 'Członkowie grupy %s posiadają następujące uprawnienia do katalogu %s: %s.'; +$lang['p_choose_id'] = 'Podaj nazwę użytkownika lub grupy w powyższym formularzu, by wyświetlić lub zmienić uprawnienia do strony %s.'; +$lang['p_choose_ns'] = 'Podaj nazwę użytkownika lub grupy w powyższym formularzu, by wyświetlić lub zmienić uprawnienia do katalogu %s.'; +$lang['p_inherited'] = 'Uwaga: Uprawnienia nie zostały nadane wprost ale są dziedziczone z grupy lub katalogu.'; +$lang['p_isadmin'] = 'Uwaga: Wybrana grupa lub użytkownika zawsze dysponuje pełnymi uprawnieniami ponieważ posiada uprawnienia administratora.'; +$lang['p_include'] = 'Szersze uprawnienia zawierają węższe. Tworzenie, przesyłanie plików oraz usuwanie mają znaczenie tylko dla katalogów, nie dla stron.'; +$lang['current'] = 'Aktywne reguły zarządzania uprawnieniami'; +$lang['where'] = 'Strona/Katalog'; +$lang['who'] = 'Użytkownik/Grupa'; +$lang['perm'] = 'Uprawnienie'; +$lang['acl_perm0'] = 'Żadne'; +$lang['acl_perm1'] = 'Czytanie'; +$lang['acl_perm2'] = 'Zmiana'; +$lang['acl_perm4'] = 'Tworzenie'; +$lang['acl_perm8'] = 'Przesyłanie plików'; +$lang['acl_perm16'] = 'Usuwanie'; +$lang['acl_new'] = 'Dodaj nowy wpis'; +$lang['acl_mod'] = 'Zmień wpis'; diff --git a/lib/plugins/acl/lang/pt-br/help.txt b/lib/plugins/acl/lang/pt-br/help.txt new file mode 100644 index 0000000..b2a49a9 --- /dev/null +++ b/lib/plugins/acl/lang/pt-br/help.txt @@ -0,0 +1,11 @@ +=== Ajuda rápida: === + +Nessa página você pode adicionar e remover permissões para espaços de nomes e páginas do seu wiki. + +O painel à esquerda mostra todos os espaços de nomes e páginas disponíveis. + +O formulário acima permite a visualização e modificação das permissões de um determinado usuário ou grupo. + +Na tabela abaixo são exibidas todas as regras de controle de acesso definidas. Você pode usá-la para excluir ou mudar rapidamente várias regras. + +A leitura da [[doku>acl|documentação oficial sobre ACL]] pode ajudar a compreender melhor como o controle de acessos funciona no DokuWiki. diff --git a/lib/plugins/acl/lang/pt-br/lang.php b/lib/plugins/acl/lang/pt-br/lang.php new file mode 100644 index 0000000..962d91b --- /dev/null +++ b/lib/plugins/acl/lang/pt-br/lang.php @@ -0,0 +1,49 @@ + + * @author Luis Fernando Enciso + * @author Alauton/Loug + * @author Frederico Gonçalves Guimarães + * @author Felipe Castro + * @author Lucien Raven + * @author Enrico Nicoletto + * @author Flávio Veras + * @author Jeferson Propheta + * @author jair.henrique + * @author Luis Dantas + * @author Sergio Motta + * @author Isaias Masiero Filho + * @author Balaco Baco + * @author Victor Westmann + */ +$lang['admin_acl'] = 'Administração da Lista de Controles de Acesso'; +$lang['acl_group'] = 'Grupo:'; +$lang['acl_user'] = 'Usuário:'; +$lang['acl_perms'] = 'Permissões para'; +$lang['page'] = 'Página'; +$lang['namespace'] = 'Espaço de nomes'; +$lang['btn_select'] = 'Selecionar'; +$lang['p_user_id'] = 'O usuário %s possui as seguintes permissões na página %s: %s.'; +$lang['p_user_ns'] = 'O usuário %s possui as seguintes permissões no espaço de nomes %s: %s.'; +$lang['p_group_id'] = 'Os membros do grupo %s possuem as seguintes permissões na página %s: %s.'; +$lang['p_group_ns'] = 'Os membros do grupo %s possuem as seguintes permissões no espaço de nomes %s: %s.'; +$lang['p_choose_id'] = 'Por favor digite um usuário ou grupo no formulário acima para ver ou editar as permissões para a página %s.'; +$lang['p_choose_ns'] = 'Por favor digite um usuário ou grupo no formulário acima para ver ou editar as permissões para o espaço de nomes %s.'; +$lang['p_inherited'] = 'Nota: Essas permissões não foram definidas explicitamente, mas sim herdadas de outros grupos ou espaço de nomes superiores.'; +$lang['p_isadmin'] = 'Nota: O grupo ou usuário selecionado sempre tem permissões completas, porque ele está configurado como superusuário.'; +$lang['p_include'] = 'As permissões superiores incluem as inferiores. Permissões para Criar, Enviar e Apagar aplicam-se apenas aos espaços de nomes e não às páginas.'; +$lang['current'] = 'Regras atuais da ACL'; +$lang['where'] = 'Página/Espaço de nomes'; +$lang['who'] = 'Usuário/Grupo'; +$lang['perm'] = 'Permissões'; +$lang['acl_perm0'] = 'Nenhuma'; +$lang['acl_perm1'] = 'Ler'; +$lang['acl_perm2'] = 'Editar'; +$lang['acl_perm4'] = 'Criar'; +$lang['acl_perm8'] = 'Enviar'; +$lang['acl_perm16'] = 'Excluir'; +$lang['acl_new'] = 'Adicionar nova entrada'; +$lang['acl_mod'] = 'Modificar a entrada'; diff --git a/lib/plugins/acl/lang/pt/help.txt b/lib/plugins/acl/lang/pt/help.txt new file mode 100644 index 0000000..6b07669 --- /dev/null +++ b/lib/plugins/acl/lang/pt/help.txt @@ -0,0 +1,8 @@ +=== Auxílio Rápido === + +Nesta página pode adicionar e remover permissões para namespace e páginas no seu wiki. + * O painel esquerdo exibe todos os namespaces e páginas.´ + * O formulário acima permite a ver e modificar as permissões de um usuário ou grupo selecionado. + * Na tabela abaixo são exibidas todas as regras de controle de acesso atuais. Podes utilizá-la para excluir ou mudar rapidamente várias regras ao mesmo tempo. + +A leitura da [[doku>acl|documentação oficial sobre ACL]] pode ajudar a compreender melhor como o controle de acessos funciona no DokuWiki. diff --git a/lib/plugins/acl/lang/pt/lang.php b/lib/plugins/acl/lang/pt/lang.php new file mode 100644 index 0000000..e30ce97 --- /dev/null +++ b/lib/plugins/acl/lang/pt/lang.php @@ -0,0 +1,41 @@ + + * @author José Carlos Monteiro + * @author José Monteiro + * @author Enrico Nicoletto + * @author Fil + * @author André Neves + * @author José Campos + */ +$lang['admin_acl'] = 'Gerenciamento de ACLs'; +$lang['acl_group'] = 'Grupo:'; +$lang['acl_user'] = 'Usuário:'; +$lang['acl_perms'] = 'Permissão para'; +$lang['page'] = 'Página'; +$lang['namespace'] = 'Namespace'; +$lang['btn_select'] = 'Selecionar'; +$lang['p_user_id'] = 'O utilizador %s tem as seguintes permissões na página %s: %s.'; +$lang['p_user_ns'] = 'O utilizador %s tem as seguintes permissões no namespace %s: %s.'; +$lang['p_group_id'] = 'Os membros do grupo %s têm as seguintes permissões na página %s: %s.'; +$lang['p_group_ns'] = 'Os membros do grupo %s têm as seguintes permissões no namespace %s: %s.'; +$lang['p_choose_id'] = 'Por favor digite um usuário ou grupo no formulário acima para ver ou editar as permissões para a página %s.'; +$lang['p_choose_ns'] = 'Por favor digite um usuário ou grupo no formulário acima para ver ou editar as permissões para o namespace %s.'; +$lang['p_inherited'] = 'Nota: Essas permissões não foram definidas explicitamente, mas sim herdadas de outros grupos ou namespaces superiores.'; +$lang['p_isadmin'] = 'Nota: O grupo ou utilizador seleccionado tem sempre permissões completas, porque ele está configurado como superusuário.'; +$lang['p_include'] = 'As permissões superiores incluem as inferiores. Permissões para Criar, Enviar e Excluir aplicam-se apenas aos namespaces e não às páginas.'; +$lang['current'] = 'Regras ACL Atuais'; +$lang['where'] = 'Página/Namespace'; +$lang['who'] = 'Usuário/Grupo'; +$lang['perm'] = 'Permissões'; +$lang['acl_perm0'] = 'Nenhum'; +$lang['acl_perm1'] = 'Ler'; +$lang['acl_perm2'] = 'Editar'; +$lang['acl_perm4'] = 'Criar'; +$lang['acl_perm8'] = 'Carregar'; +$lang['acl_perm16'] = 'Remover'; +$lang['acl_new'] = 'Adicionar nova Entrada'; +$lang['acl_mod'] = 'Modificar Entrada'; diff --git a/lib/plugins/acl/lang/ro/help.txt b/lib/plugins/acl/lang/ro/help.txt new file mode 100644 index 0000000..3f76261 --- /dev/null +++ b/lib/plugins/acl/lang/ro/help.txt @@ -0,0 +1,11 @@ +=== Quick Help: === + +Pe această pagină puteţi adăuga şi elimina autorizaţiile pentru spaţiile de nume şi paginile din wiki. + +Panoul din stânga afişează toate spaţiile de nume şi paginile disponibile. + +Formularul de sus vă permite să vedeţi şi să modificaţi autorizaţiile unui anume utilizator sau grup. + +In tabelul de jos sunt arătate toate regulile de control a accesului setate. Îl puteţi folosi pentru a şterge sau modifica rapid mai multe reguli. + +Consultarea [[doku>acl|official documentation on ACL]] vă poate ajuta să înţelegeţi deplin cum funcţionează controlul accesului în DocuWiki. \ No newline at end of file diff --git a/lib/plugins/acl/lang/ro/lang.php b/lib/plugins/acl/lang/ro/lang.php new file mode 100644 index 0000000..3c55a12 --- /dev/null +++ b/lib/plugins/acl/lang/ro/lang.php @@ -0,0 +1,38 @@ + + * @author Emanuel-Emeric Andrasi + * @author Emanuel-Emeric Andraşi + * @author Marius OLAR + */ +$lang['admin_acl'] = 'Managementul Listei de Control a Accesului'; +$lang['acl_group'] = 'Grup:'; +$lang['acl_user'] = 'Utilizator:'; +$lang['acl_perms'] = 'Autorizare pentru'; +$lang['page'] = 'Pagina'; +$lang['namespace'] = 'Spaţiu de nume'; +$lang['btn_select'] = 'Selectează'; +$lang['p_user_id'] = 'Utilizatorul %s are următoarele autorizaţii pe pagină %s: %s.'; +$lang['p_user_ns'] = 'Utilizatorul %s are următoarele autorizaţii pe spaţiul de nume %s: %s.'; +$lang['p_group_id'] = 'Membrii grupului %s au următoarele autorizaţii pe pagină %s: %s.'; +$lang['p_group_ns'] = 'Membrii grupului %s au următoarele autorizaţii pe spaţiul de nume %s: %s.'; +$lang['p_choose_id'] = 'Introduceţi un utilizator sau un grup în formularul de mai sus pentru a vizualiza sau edita autorizaţiile paginii %s.'; +$lang['p_choose_ns'] = 'Introduceţi un utilizator sau un grup în formularul de mai sus pentru a vizualiza sau edita autorizaţiile spaţiului de nume %s.'; +$lang['p_inherited'] = 'Notă: Aceste autorizaţii nu au fost setate explicit ci au fost moştenite de la alte grupuri sau spaţii de nume superioare ierarhic.'; +$lang['p_isadmin'] = 'Notă: Grupul sau utilizatorul selectat are intotdeauna toate autorizatiile întrucât este configurat ca superutilizator.'; +$lang['p_include'] = 'Permisiunile superioare le includ pe cele inferioare. Permisiunile de Creare, Upload şi Ştergere se aplică doar numelor de spaţiu, nu paginilor.'; +$lang['current'] = 'Reguli ACL actuale'; +$lang['where'] = 'Pagină/Spaţiu de nume'; +$lang['who'] = 'Utilizator/Grup'; +$lang['perm'] = 'Autorizaţii'; +$lang['acl_perm0'] = 'Nici una'; +$lang['acl_perm1'] = 'Citire'; +$lang['acl_perm2'] = 'Editare'; +$lang['acl_perm4'] = 'Creare'; +$lang['acl_perm8'] = 'Încărcare'; +$lang['acl_perm16'] = 'Ştergere'; +$lang['acl_new'] = 'Adaugă intrare nouă'; +$lang['acl_mod'] = 'Modifică intrare'; diff --git a/lib/plugins/acl/lang/ru/help.txt b/lib/plugins/acl/lang/ru/help.txt new file mode 100644 index 0000000..d9a444f --- /dev/null +++ b/lib/plugins/acl/lang/ru/help.txt @@ -0,0 +1,8 @@ +=== Краткая справка === + +На этой странице вы можете добавить или удалить права доступа к пространствам имён и страницам своей вики. + * На панели слева отображены доступные пространства имён и страницы. + * Форма выше позволяет вам просмотреть и изменить права доступа для выбранного пользователя или группы. + * Текущие права доступа отображены в таблице ниже. Вы можете использовать её для быстрого удаления или изменения правил. + +Прочтение [[doku>acl|официальной документации по правам доступа]] может помочь вам в полном понимании работы управления правами доступа в «Докувики». diff --git a/lib/plugins/acl/lang/ru/lang.php b/lib/plugins/acl/lang/ru/lang.php new file mode 100644 index 0000000..b9e3e43 --- /dev/null +++ b/lib/plugins/acl/lang/ru/lang.php @@ -0,0 +1,46 @@ + + * @author Denis Simakov + * @author Змей Этерийский + * @author Hikaru Nakajima + * @author Alexei Tereschenko + * @author Alexander Sorkin + * @author Kirill Krasnov + * @author Vlad Tsybenko + * @author Aleksey Osadchiy + * @author Ladyko Andrey + * @author Eugene + * @author Johnny Utah + */ +$lang['admin_acl'] = 'Управление списками контроля доступа'; +$lang['acl_group'] = 'Группа:'; +$lang['acl_user'] = 'Пользователь:'; +$lang['acl_perms'] = 'Права доступа для'; +$lang['page'] = 'Страница'; +$lang['namespace'] = 'Пространство имён'; +$lang['btn_select'] = 'Выбрать'; +$lang['p_user_id'] = 'Сейчас пользователь %s имеет следующие права на доступ к странице %s: %s.'; +$lang['p_user_ns'] = 'Сейчас пользователь %s имеет следующие права на доступ к пространству имён %s: %s.'; +$lang['p_group_id'] = 'Сейчас члены группы %s имеют следующие права на доступ к странице %s: %s.'; +$lang['p_group_ns'] = 'Сейчас члены группы %s имеют следующие права на доступ к пространству имён %s: %s.'; +$lang['p_choose_id'] = 'Пожалуйста, введите пользователя или группу в форме выше, чтобы просмотреть или отредактировать права на доступ к странице %s.'; +$lang['p_choose_ns'] = 'Пожалуйста, введите пользователя или группу в форме выше, чтобы просмотреть или отредактировать права на доступ к пространству имён %s.'; +$lang['p_inherited'] = 'Замечание: эти права доступа не были заданы явно, а были унаследованы от других групп или пространств имён более высокого порядка.'; +$lang['p_isadmin'] = 'Замечание: выбранный пользователь всегда имеет полные права, так как он является суперпользователем.'; +$lang['p_include'] = 'Более высокие права доступа включают в себя более низкие. Права доступа «Создание», «Загрузка» и «Удаление» относятся только к пространствам имён, а не к страницам.'; +$lang['current'] = 'Текущие правила ACL'; +$lang['where'] = 'Страница /Пространство имён'; +$lang['who'] = 'Пользователь / Группа'; +$lang['perm'] = 'Права доступа'; +$lang['acl_perm0'] = 'Нет доступа'; +$lang['acl_perm1'] = 'Чтение'; +$lang['acl_perm2'] = 'Правка'; +$lang['acl_perm4'] = 'Создание'; +$lang['acl_perm8'] = 'Загрузка'; +$lang['acl_perm16'] = 'Удаление'; +$lang['acl_new'] = 'Добавить новую запись'; +$lang['acl_mod'] = 'Отредактировать запись'; diff --git a/lib/plugins/acl/lang/sk/help.txt b/lib/plugins/acl/lang/sk/help.txt new file mode 100644 index 0000000..103a034 --- /dev/null +++ b/lib/plugins/acl/lang/sk/help.txt @@ -0,0 +1,11 @@ +=== Krátka nápoveda: === + +Na tejto stránke môžete pridávať alebo rušiť oprávnenia pre menné priestory a stránky vo Vašej wiki. + +Ľavý panel zobrazuje všetky dostupné menné priestory a stránky. + +Formulár zobrazený vyššie Vám dovoľuje prehliadať a meniť oprávnenia pre vybraného používateľa alebo skupinu. + +V tabuľke nižšie sú zobrazené všetky aktuálne prístupové pravidlá. Môžete v nej rýchlo rušiť alebo meniť viacero pravidiel súčasne. + +Prečítanie [[doku>acl|oficiálnej dokumentácie ACL]] Vám môže pomôcť plne pochopiť spôsob ako fungujú prístupové pravidlá (oprávnenia) v DokuWiki. \ No newline at end of file diff --git a/lib/plugins/acl/lang/sk/lang.php b/lib/plugins/acl/lang/sk/lang.php new file mode 100644 index 0000000..0434fe5 --- /dev/null +++ b/lib/plugins/acl/lang/sk/lang.php @@ -0,0 +1,38 @@ + + * @author Michal Mesko + * @author exusik + * @author Martin Michalek + */ +$lang['admin_acl'] = 'Správa zoznamu prístupových práv'; +$lang['acl_group'] = 'Skupina:'; +$lang['acl_user'] = 'Užívateľ:'; +$lang['acl_perms'] = 'Práva pre'; +$lang['page'] = 'Stránka'; +$lang['namespace'] = 'Menný priestor'; +$lang['btn_select'] = 'Vybrať'; +$lang['p_user_id'] = 'Používateľ %s má aktuálne nasledujúce oprávnenia k stránke %s: %s.'; +$lang['p_user_ns'] = 'Používateľ %s má aktuálne nasledujúce oprávnenia v mennom priestore %s: %s.'; +$lang['p_group_id'] = 'Členovia skupiny %s majú aktuálne nasledujúce oprávnenia k stránke %s: %s.'; +$lang['p_group_ns'] = 'Členovia skupiny %s majú aktuálne nasledujúce oprávnenia v mennom priestore %s: %s.'; +$lang['p_choose_id'] = 'Prosím zadajte používateľa alebo skupinu do formulára zobrazeného vyššie, aby ste mohli prezerať alebo meniť oprávnenia k stránke %s.'; +$lang['p_choose_ns'] = 'Prosím zadajte používateľa alebo skupinu do formulára zobrazeného vyššie, aby ste mohli prezerať alebo meniť oprávnenia v mennom priestore %s.'; +$lang['p_inherited'] = 'Poznámka: Tieto oprávnenia neboli nastavené explicitne, ale boli odvodené z inej skupiny alebo nadradeného menného priestoru.'; +$lang['p_isadmin'] = 'Poznámka: Vybraná skupina alebo používateľ má vždy najvyššie oprávnenia, pretože je vedená/vedený ako správca.'; +$lang['p_include'] = 'Vyššie oprávnenia zahŕňajú nižšie. Oprávnenie Vytvoriť, Nahrať a Zmazať sa vzťahujú iba k menným priestorom, nie ku stránkam.'; +$lang['current'] = 'Aktuálne pravidlá prístupu (ACL)'; +$lang['where'] = 'Stránka/Menný priestor'; +$lang['who'] = 'Používateľ/Skupina'; +$lang['perm'] = 'Povolenia'; +$lang['acl_perm0'] = 'Žiadne'; +$lang['acl_perm1'] = 'Čítať'; +$lang['acl_perm2'] = 'Zmeniť'; +$lang['acl_perm4'] = 'Vytvoriť'; +$lang['acl_perm8'] = 'Nahrať súbor'; +$lang['acl_perm16'] = 'Zmazať'; +$lang['acl_new'] = 'Pridať nový záznam'; +$lang['acl_mod'] = 'Upraviť záznam'; diff --git a/lib/plugins/acl/lang/sl/help.txt b/lib/plugins/acl/lang/sl/help.txt new file mode 100644 index 0000000..ff096ae --- /dev/null +++ b/lib/plugins/acl/lang/sl/help.txt @@ -0,0 +1,11 @@ +=== Hitra pomoč === + +Na tej strani je mogoče dodajati, odstranjevati in spreminjati dovoljenja za delo z wiki stranmi in imenskimi prostori. + +Na veli strani so izpisani vsi imenski prostori in strani. + +Na obrazcu zgoraj je mogoče pregledovati in spreminjati dovoljenja za izbranega uporabnika ali skupino. + +V preglednici spodaj so prikazana vsa pravila nadzora. Ta je mogoče hitro spreminjati ali brisati. + +Več podrobnosti o delovanju nadzora dostopa sistema DokuWiki je mogoče najti v [[doku>acl|uradni dokumentaciji ACL]]. diff --git a/lib/plugins/acl/lang/sl/lang.php b/lib/plugins/acl/lang/sl/lang.php new file mode 100644 index 0000000..9edbe0d --- /dev/null +++ b/lib/plugins/acl/lang/sl/lang.php @@ -0,0 +1,38 @@ + + * @author Boštjan Seničar + * @author Gregor Skumavc (grega.skumavc@gmail.com) + * @author Matej Urbančič (mateju@svn.gnome.org) + */ +$lang['admin_acl'] = 'Upravljanje dostopa'; +$lang['acl_group'] = 'Skupina:'; +$lang['acl_user'] = 'Uporabnik:'; +$lang['acl_perms'] = 'Dovoljenja za'; +$lang['page'] = 'Stran'; +$lang['namespace'] = 'Imenski prostor'; +$lang['btn_select'] = 'Izberi'; +$lang['p_user_id'] = 'Uporabnik %s ima naslednja dovoljenja za stran %s: %s.'; +$lang['p_user_ns'] = 'Uporabnik %s ima naslednja dovoljenja za imenski prostor %s: %s.'; +$lang['p_group_id'] = 'Uporabniška skupina %s ima naslednja dovoljenja za stran %s: %s.'; +$lang['p_group_ns'] = 'Uporabniška skupina %s ima naslednja dovoljenja za imenski prostor %s: %s.'; +$lang['p_choose_id'] = 'Vnesite ime uporabnika ali skupine v zgornji obrazec za ogled ali urejanje dovoljenj za stran %s.'; +$lang['p_choose_ns'] = 'Vnesite ime uporabnika ali skupine v zgornji obrazec za ogled ali urejanje dovoljenj za imenski prostor %s.'; +$lang['p_inherited'] = 'Opomba: trenutna dovoljenja niso bila posebej določena, temveč so bila prevzeta iz drugih skupin ali višjih imenskih prostorov.'; +$lang['p_isadmin'] = 'Opomba: izbrana skupina ali uporabnik imajo vsa dovoljenja za spreminjanje, saj so določeni kot skrbniki sistema.'; +$lang['p_include'] = 'Višja dovoljenja vključujejo tudi nižja. '; +$lang['current'] = 'Trenutna pravila dostopa'; +$lang['where'] = 'Stran / Imenski prostor'; +$lang['who'] = 'Uporabnik/Skupina'; +$lang['perm'] = 'Dovoljenja'; +$lang['acl_perm0'] = 'Nič'; +$lang['acl_perm1'] = 'Preberi'; +$lang['acl_perm2'] = 'Uredi'; +$lang['acl_perm4'] = 'Ustvari'; +$lang['acl_perm8'] = 'Naloži'; +$lang['acl_perm16'] = 'Zbriši'; +$lang['acl_new'] = 'Dodaj nov zapis'; +$lang['acl_mod'] = 'Spremeni zapis'; diff --git a/lib/plugins/acl/lang/sq/help.txt b/lib/plugins/acl/lang/sq/help.txt new file mode 100644 index 0000000..84a567f --- /dev/null +++ b/lib/plugins/acl/lang/sq/help.txt @@ -0,0 +1,11 @@ +=== Ndihmë e Shpejtë: === + +Në këtë faqe mund të shtoni ose hiqni të drejta për hapësira emri dhe faqe në wiki-n tuaj. + +Paneli i majtë tregon të gjitha faqet dhe hapësirat e emrit të disponueshme. + +Forma më sipër ju lejon të shihni dhe ndryshoni lejet për një grup ose përdorues të përzgjedhur. + +Në tabelën më poshtë tregohen të gjitha rregullat e vendosjes së aksesit. Mund ta përdorni për të fshirë shpejt ose ndryshuar shumë rregulla njëkohësisht. + +Leximi i [[doku>acl|dokumentimit zyrtar mbi ACL]] mund t'ju ndihmojë për të kuptuar plotësisht sesi funksionin Kontrolli i Aksesit në DokuWiki. diff --git a/lib/plugins/acl/lang/sq/lang.php b/lib/plugins/acl/lang/sq/lang.php new file mode 100644 index 0000000..403f81f --- /dev/null +++ b/lib/plugins/acl/lang/sq/lang.php @@ -0,0 +1,37 @@ + + */ +$lang['admin_acl'] = 'Menaxhimi i Listës së Kontrollit të Aksesit'; +$lang['acl_group'] = 'Grup:'; +$lang['acl_user'] = 'Përdorues:'; +$lang['acl_perms'] = 'Të drejta për'; +$lang['page'] = 'Faqe'; +$lang['namespace'] = 'Hapësira e Emrit'; +$lang['btn_select'] = 'Zgjidh'; +$lang['p_user_id'] = 'Përdoruesi %s momentalisht ka të drejtat e mëposhtme mbi faqen %s: %s.'; +$lang['p_user_ns'] = 'Përdoruesi %s momentalisht ka të drejtat e mëposhtme mbi hapësirën e emrit %s: %s.'; +$lang['p_group_id'] = 'Anëtarët e grupit %s momentalisht kanë të drejtat e mëposhtme mbi faqen %s: %s.'; +$lang['p_group_ns'] = 'Anëtarët e grupit %s momentalisht kanë të drejtat e mëposhtme mbi hapësirën e emrit %s: %s.'; +$lang['p_choose_id'] = 'Ju lutemi futni një përdorues ose grup në formën e mësipërme për të parë ose ndryshuar bashkësinë e të drejtave për faqen %s.'; +$lang['p_choose_ns'] = 'Ju lutemi futni një përdorues ose grup në formën e mësipërme për të parë ose ndryshuar bashkësinë e të drejtave për hapësirën e emrit %s.'; +$lang['p_inherited'] = 'Shënim: Ato të drejta nuk janë vendosur specifikisht por janë të trashëguara nga grupe të tjera ose hapësira emri më të larta.'; +$lang['p_isadmin'] = 'Shënim: Grupi ose përdoruesi i përzgjedhur ka gjithmonë të drejta të plota sepse është konfiguruar si superpërdorues.'; +$lang['p_include'] = 'Të drejtat më të larta i përfshijnë edhe ato më të ultat. Të drejtat Krijo, Ngarko dhe Fshi u aplikohen vetëm hapësirave të emrit, jo faqeve.'; +$lang['current'] = 'Rregullat aktuale ACL'; +$lang['where'] = 'Faqe/Hapësirë Emri'; +$lang['who'] = 'Përdorues/Grup'; +$lang['perm'] = 'Të Drejta'; +$lang['acl_perm0'] = 'Asgjë'; +$lang['acl_perm1'] = 'Lexim'; +$lang['acl_perm2'] = 'Redaktim'; +$lang['acl_perm4'] = 'Krijim'; +$lang['acl_perm8'] = 'Ngarkim'; +$lang['acl_perm16'] = 'Fshi'; +$lang['acl_new'] = 'Shto Hyrje të re'; +$lang['acl_mod'] = 'Ndrysho Hyrje'; diff --git a/lib/plugins/acl/lang/sr/help.txt b/lib/plugins/acl/lang/sr/help.txt new file mode 100644 index 0000000..0ec8921 --- /dev/null +++ b/lib/plugins/acl/lang/sr/help.txt @@ -0,0 +1,11 @@ +=== Приручна помоћ: === + +На овој страни можете додати или уклонити дозволе за странице и именске просторе на Вашем викију. + +Леви панел приказује све доступне именске просторе и странице. + +Формулар изнад омогућава приказ и измену дозвола за одабране кориснике или групе. + +У табели испод су приказане све тренутно постављене дозволе. Можете је користити за брзо брисање или измену више правила. + +Читање [[doku>acl|званичне документације о ACL]] Вам може помоћи у потпуном разумевању рада дозвола приступа у DokuWiki-ју. diff --git a/lib/plugins/acl/lang/sr/lang.php b/lib/plugins/acl/lang/sr/lang.php new file mode 100644 index 0000000..f2c9548 --- /dev/null +++ b/lib/plugins/acl/lang/sr/lang.php @@ -0,0 +1,37 @@ + + * @author Иван Петровић + * @author Miroslav Šolti + */ +$lang['admin_acl'] = 'Управљање листом контроле приступа'; +$lang['acl_group'] = 'Група:'; +$lang['acl_user'] = 'Корисник:'; +$lang['acl_perms'] = 'Дозволе за'; +$lang['page'] = 'Страница'; +$lang['namespace'] = 'Именски простор'; +$lang['btn_select'] = 'Одабери'; +$lang['p_user_id'] = 'Корисник %s тренутно има следеће дозволе за ову страницу %s: %s.'; +$lang['p_user_ns'] = 'Корисник %s тренутно има следеће дозволе за овај именски простор %s: %s.'; +$lang['p_group_id'] = 'Чланови групе %s тренутно имају следеће дозволе за ову страницу %s: %s.'; +$lang['p_group_ns'] = 'Чланови групе %s тренутно имају следеће дозволе за овај именски простор %s: %s.'; +$lang['p_choose_id'] = 'Молим Вас унесите корисника или групу у формулар изнад да бисте приказали или изменили дозволе за страницу %s.'; +$lang['p_choose_ns'] = 'Молим Вас унесите корисника или групу у формулар изнад да бисте приказали или изменили дозволе за именски простор %s.'; +$lang['p_inherited'] = 'Напомена: Ове дозволе се не постављају експлицитно већ само тамо где се не сударају са осталим групама или вишем иманском простору.'; +$lang['p_isadmin'] = 'Напомена: Одабран корисник или група има увек пуне дозволе јер је постављен за суперкорисника.'; +$lang['p_include'] = 'Више дозволе укључују ниже. Дозволе одавања, слања и брисања ће бити примењене само на именске просторе, не и на стране.'; +$lang['current'] = 'Тренутна правила проступа'; +$lang['where'] = 'Страница/Именски простор'; +$lang['who'] = 'Корисник/Група'; +$lang['perm'] = 'Дозволе'; +$lang['acl_perm0'] = 'Ништа'; +$lang['acl_perm1'] = 'Читање'; +$lang['acl_perm2'] = 'Измена'; +$lang['acl_perm4'] = 'Прављење'; +$lang['acl_perm8'] = 'Слање'; +$lang['acl_perm16'] = 'Брисање'; +$lang['acl_new'] = 'Додај нови унос'; +$lang['acl_mod'] = 'Измени унос'; diff --git a/lib/plugins/acl/lang/sv/help.txt b/lib/plugins/acl/lang/sv/help.txt new file mode 100644 index 0000000..5ba770f --- /dev/null +++ b/lib/plugins/acl/lang/sv/help.txt @@ -0,0 +1,8 @@ +=== Hjälp === +På den här sidan kan du lägga till och ta bort åtkomsträttigheter för namnrymder och enstaka sidor i din wiki. + +Till vänster visas alla tillgängliga namnrymder och sidor du kan välja. I formuläret ovanför kan du sedan välja användare eller grupp för vilken åtkomsträttigheterna ska visas eller ändras. + +Tabellen nedanför visar samtliga uppsatta regler för åtkomsträttigheter. Den kan du använda för att snabbt ta bort eller ändra flera regler på en gång. + +Läs gärna [[doku>acl|den officiella dokumentationen för ACL]] som kan hjälpa dig till fullo förstå hur åtkomsträttigheter fungerar i DokuWiki. \ No newline at end of file diff --git a/lib/plugins/acl/lang/sv/lang.php b/lib/plugins/acl/lang/sv/lang.php new file mode 100644 index 0000000..176a937 --- /dev/null +++ b/lib/plugins/acl/lang/sv/lang.php @@ -0,0 +1,43 @@ + + * @author Nicklas Henriksson + * @author Håkan Sandell + * @author Dennis Karlsson + * @author Tormod Otter Johansson + * @author Pontus Bergendahl + * @author Emil Lind + * @author Bogge Bogge + * @author Peter Åström + */ +$lang['admin_acl'] = 'Hantera behörighetslistan (ACL)'; +$lang['acl_group'] = 'Grupp:'; +$lang['acl_user'] = 'Användare:'; +$lang['acl_perms'] = 'Behörighet för'; +$lang['page'] = 'Sida'; +$lang['namespace'] = 'Namnrymd'; +$lang['btn_select'] = 'Välj'; +$lang['p_user_id'] = 'Användaren %s har förnärvarande följande rättigheter på sidan %s: %s.'; +$lang['p_user_ns'] = 'Användaren %s har för närvarande följande rättigheter i namnrymden %s: %s.'; +$lang['p_group_id'] = 'Medlemmar av gruppen %s har för närvarande följande rättigheter på sidan %s: %s.'; +$lang['p_group_ns'] = 'Medlemmar av gruppen %s har för närvarande följande rättigheter i namnrymden %s: %s.'; +$lang['p_choose_id'] = 'Vänligen ange en användare eller grupp i formuläret ovan för att visa eller ändra rättigheterna för sidan %s.'; +$lang['p_choose_ns'] = 'Vänligen ange en användare eller grupp i formuläret ovan för att visa eller ändra rättigheterna för namnrymden %s.'; +$lang['p_inherited'] = 'Notering: De här rättigheterna är inte explicit satta utan var ärvda från andra grupper eller högre namnrymder.'; +$lang['p_isadmin'] = 'Notering: Den valda gruppen eller användaren har alltid fulla rättigheter på grund av att den är konfigurerad som superanvändare.'; +$lang['p_include'] = 'Högre rättigheter inkluderar lägre. Rättigheter för Skapa, Ladda upp och Radera är endast applicerbara namnrymder, inte sidor.'; +$lang['current'] = 'Nuvarande ACL regler'; +$lang['where'] = 'Sida/Namnrymd'; +$lang['who'] = 'Användare/Grupp'; +$lang['perm'] = 'Rättigheter'; +$lang['acl_perm0'] = 'Inga'; +$lang['acl_perm1'] = 'Läsa'; +$lang['acl_perm2'] = 'Redigera'; +$lang['acl_perm4'] = 'Skapa'; +$lang['acl_perm8'] = 'Ladda upp'; +$lang['acl_perm16'] = 'Radera'; +$lang['acl_new'] = 'Lägg till ny behörighet'; +$lang['acl_mod'] = 'Ändra behörighet'; diff --git a/lib/plugins/acl/lang/th/help.txt b/lib/plugins/acl/lang/th/help.txt new file mode 100644 index 0000000..52edca9 --- /dev/null +++ b/lib/plugins/acl/lang/th/help.txt @@ -0,0 +1,11 @@ +=== ตัวช่วยอย่างเร็ว === + +ในหน้านี้คุณสามารถเพิ่มและถอดสิทธิ์สำหรับเนมสเปซ และเพจในวิกิของคุณ + +แถบด้านซ้ายจะแสดงรายชื่อเนมสเปซ และเพจที่มีอยู่ทั้งหมด + +แบบฟอร์มข้างบนอนุญาติให้คุณมองเห็น และแก้ไขสิทธิ์ของผู้ใช้หรือกลุ่มที่เลือกไว้ได้ + +ในตารางด้านล่างได้แสดงกฏควบคุมการเข้าถึงทั้งหมดไว้ คุณสามารถใช้มันลบ หรือเปลี่ยนกฏครั้งละหลายๆตัวพร้อมกันได้อย่างรวดเร็ว + +การอ่าน [[doku>acl|official documentation on ACL]] น่าจะช่วยให้คุณเข้าใจวิธีควบคุมการเข้าถึงของโดกุวิกิได้อย่างถ่องแท้ \ No newline at end of file diff --git a/lib/plugins/acl/lang/th/lang.php b/lib/plugins/acl/lang/th/lang.php new file mode 100644 index 0000000..24694ac --- /dev/null +++ b/lib/plugins/acl/lang/th/lang.php @@ -0,0 +1,27 @@ + + * @author Kittithat Arnontavilas + * @author Thanasak Sompaisansin + */ +$lang['admin_acl'] = 'จัดการรายชื่อเพื่อควบคุมการเข้าถึง (Access Control List:ACL)'; +$lang['acl_group'] = 'กลุ่ม:'; +$lang['acl_user'] = 'ผู้ใช้:'; +$lang['acl_perms'] = 'สิทธิสำหรับ'; +$lang['page'] = 'เพจ'; +$lang['namespace'] = 'เนมสเปซ'; +$lang['btn_select'] = 'เลือก'; +$lang['where'] = 'เพจ/เนมสเปซ'; +$lang['who'] = 'ผู้ใช้/กลุ่ม'; +$lang['perm'] = 'สิทธิ์'; +$lang['acl_perm0'] = 'ไร้สิทธิ์'; +$lang['acl_perm1'] = 'อ่าน'; +$lang['acl_perm2'] = 'แก้ไข'; +$lang['acl_perm4'] = 'สร้าง'; +$lang['acl_perm8'] = 'อัพโหลด'; +$lang['acl_perm16'] = 'ลบ'; +$lang['acl_new'] = 'เพิ่มเนื้อหาใหม่'; +$lang['acl_mod'] = 'ปรับแก้เนื้อหา'; diff --git a/lib/plugins/acl/lang/tr/help.txt b/lib/plugins/acl/lang/tr/help.txt new file mode 100644 index 0000000..b467c50 --- /dev/null +++ b/lib/plugins/acl/lang/tr/help.txt @@ -0,0 +1,11 @@ +=== Hızlı yardım: === + +Bu sayfada Wiki'nizin namespace ve sayfaları için izinleri belirleyebilirsiniz. + +Soldaki kısım varolan namespace ve sayfaları listeler. + +Yukarıdaki kısım seçilen bir kullanıcı veya grup için izinleri görüp değiştirmenizi sağlar. + +Aşağıdaki tablo ise varolan erişim kontrol kurallarını gösterir. Bu tabloyu birden fazla kuralı hızlıca silip değiştirmek için kullanabilirsiniz. + +Resmi ACL dökümanını ([[doku>acl|official documentation on ACL]]) okuyarak erişim kontrolünün nasıl çalıştığını öğrenebilirsiniz. diff --git a/lib/plugins/acl/lang/tr/lang.php b/lib/plugins/acl/lang/tr/lang.php new file mode 100644 index 0000000..1f81da0 --- /dev/null +++ b/lib/plugins/acl/lang/tr/lang.php @@ -0,0 +1,40 @@ + + * @author Aydın Coşkuner + * @author Cihan Kahveci + * @author Yavuz Selim + * @author Caleb Maclennan + * @author farukerdemoncel + */ +$lang['admin_acl'] = 'Erişim Kontrol Listesi (ACL) Yönetimi'; +$lang['acl_group'] = 'Grup:'; +$lang['acl_user'] = 'Kullanıcı:'; +$lang['acl_perms'] = 'Şunun için yetkiler:'; +$lang['page'] = 'Sayfa'; +$lang['namespace'] = 'Namespace'; +$lang['btn_select'] = 'Seç'; +$lang['p_user_id'] = '%s kullanıcısının şu anda %s sayfası için yetkisi: %s.'; +$lang['p_user_ns'] = '%s kullanıcısının şu anda %s namesapace\'i için yetkisi: %s.'; +$lang['p_group_id'] = '%s grubunun şu anda %s sayfası için yetkisi: %s.'; +$lang['p_group_ns'] = '%s grubunun şu anda %s namesapace\'i için yetkisi: %s.'; +$lang['p_choose_id'] = 'Lütfen %s sayfasına izin verilen yetkilerini görmek veya değiştirmek için yukarıdaki forma bir kullanıcı veya grup adı girin.'; +$lang['p_choose_ns'] = 'Lütfen %s namespace\'ie izin verilen yetkileri görmek veya değiştirmek için yukarıdaki forma bir kullanıcı veya grup adı girin.'; +$lang['p_inherited'] = 'Not: Bu izinler doğrudan ayarlanmadan başka grup veya üst namespace\'lerden gelmektedir.'; +$lang['p_isadmin'] = 'Not: Seçili grup veya kullanıcı, "Ana kullanıcı" olarak atandığından tüm izinlere sahiptir.'; +$lang['p_include'] = 'Üst seviye izinler alt izinleri içermektedir. Oluşturma, Yükleme ve Silme yetkisi sadece namespace\'e uygulanmaktadır. Bu yetki sayfalara uygulanmaz.'; +$lang['current'] = 'Şimdiki ACL(İzin Kontrol listesi) kuralları'; +$lang['where'] = 'Sayfa/Namespace'; +$lang['who'] = 'Kullanıcı/Grup'; +$lang['perm'] = 'İzinler'; +$lang['acl_perm0'] = 'Yok'; +$lang['acl_perm1'] = 'Okuma'; +$lang['acl_perm2'] = 'Değiştirme'; +$lang['acl_perm4'] = 'Oluşturma'; +$lang['acl_perm8'] = 'Yükleme'; +$lang['acl_perm16'] = 'Silme'; +$lang['acl_new'] = 'Yeni giriş ekle'; +$lang['acl_mod'] = 'Eski girişi değiştirme'; diff --git a/lib/plugins/acl/lang/uk/help.txt b/lib/plugins/acl/lang/uk/help.txt new file mode 100644 index 0000000..d16af0a --- /dev/null +++ b/lib/plugins/acl/lang/uk/help.txt @@ -0,0 +1,11 @@ +=== Швидка довідка: === + +На цій сторінці ви можете додавати чи знищувати права доступу для просторів імен чи сторінок вашої вікі. + +Ліва панель показує всі доступні простори імен і сторінки. + +Верхня форма дозволяє переглянути і редагувати права доступу для обраного користувача чи групи + +В таблиці знизу показані всі оголошені правила доступу. Можете її використовувати для швидкого знищення чи модифікації кількох правил. + +Додаткова допомога в [[doku>acl|офіційній документації по ACL]] допоможе вам більше зрозуміти як працює контроль доступу у ДокуВікі. \ No newline at end of file diff --git a/lib/plugins/acl/lang/uk/lang.php b/lib/plugins/acl/lang/uk/lang.php new file mode 100644 index 0000000..05c2596 --- /dev/null +++ b/lib/plugins/acl/lang/uk/lang.php @@ -0,0 +1,37 @@ + + * @author serg_stetsuk + * @author Oleksandr Kunytsia + */ +$lang['admin_acl'] = 'Керування списками контролю доступу'; +$lang['acl_group'] = 'Група:'; +$lang['acl_user'] = 'Користувач:'; +$lang['acl_perms'] = 'Права доступу для'; +$lang['page'] = 'Сторінка'; +$lang['namespace'] = 'Простір імен'; +$lang['btn_select'] = 'Вибрати'; +$lang['p_user_id'] = 'Користувач %s зараз має такі права доступу до сторінки %s: %s.'; +$lang['p_user_ns'] = 'Користувач %s зараз має такі права доступу до простору імен %s: %s.'; +$lang['p_group_id'] = 'Члени групи %s зараз мають такі права для сторінки %s: %s.'; +$lang['p_group_ns'] = 'Члени групи %s зараз мають такі права доступу до простору імен %s: %s.'; +$lang['p_choose_id'] = 'Будь-ласка введіть користувача або групу в поле зверху, щоб подивитися чи змінити права доступу до сторінки %s.'; +$lang['p_choose_ns'] = 'Будь-ласка введіть користувача або групу у вікно зверху, щоб подивитися чи змінити права доступу до сторінки %s.'; +$lang['p_inherited'] = 'Зверніть увагу! Права доступу, не встановлені явно, наслідуються від інших груп чи вищих просторів імен.'; +$lang['p_isadmin'] = 'Зверніть увагу! Обрані група чи користувач завжди мають повні права доступу, оскільки вони є суперкористувачами.'; +$lang['p_include'] = 'Старші права доступу включають молодші. Створення, Завантаження і Вилучення застосовні лише до просторів імен.'; +$lang['current'] = 'Поточні правила ACL'; +$lang['where'] = 'Сторінка/Простір імен'; +$lang['who'] = 'Користувач/Група'; +$lang['perm'] = 'Права доступу'; +$lang['acl_perm0'] = 'Жодних'; +$lang['acl_perm1'] = 'Читання'; +$lang['acl_perm2'] = 'Редагування'; +$lang['acl_perm4'] = 'Створення'; +$lang['acl_perm8'] = 'Завантаження'; +$lang['acl_perm16'] = 'Вилучення'; +$lang['acl_new'] = 'Додати новий запис'; +$lang['acl_mod'] = 'Змінити запис'; diff --git a/lib/plugins/acl/lang/vi/help.txt b/lib/plugins/acl/lang/vi/help.txt new file mode 100644 index 0000000..40b674e --- /dev/null +++ b/lib/plugins/acl/lang/vi/help.txt @@ -0,0 +1,8 @@ +=== Trợ giúp nhanh: === + +Trên trang này, bạn có thể thêm và xóa quyền cho không gian tên và trang trong wiki của bạn. + * Khung bên trái hiển thị tất cả các không gian tên và trang có sẵn + * Biểu mẫu trên cho phép bạn xem và sửa đổi các quyền của thành viên hoặc nhóm đã chọn. + * Bảng dưới đây hiện thị tất cả các quy tắc kiểm soát truy cập. Bạn có thể sử dụng nó để nhanh chóng xóa hoặc thay đổi nhiều quy tắc. + +Đọc [[doku>acl|tài liệu chính thức về Danh sách kiểm soát truy cập (ACL)]] có thể giúp bạn hiểu đầy đủ cách thức kiểm soát hoạt động truy cập trong DokuWiki. \ No newline at end of file diff --git a/lib/plugins/acl/lang/vi/lang.php b/lib/plugins/acl/lang/vi/lang.php new file mode 100644 index 0000000..ff9da8b --- /dev/null +++ b/lib/plugins/acl/lang/vi/lang.php @@ -0,0 +1,36 @@ + + * @author NukeViet + */ +$lang['admin_acl'] = 'Quản lý Danh sách kiểm soát truy cập'; +$lang['acl_group'] = 'Nhóm:'; +$lang['acl_user'] = 'Thành viên:'; +$lang['acl_perms'] = 'Cấp quyền cho'; +$lang['page'] = 'Trang'; +$lang['namespace'] = 'Không gian tên'; +$lang['btn_select'] = 'Chọn'; +$lang['p_user_id'] = 'Thành viên %s hiện có các quyền sau trên trang %s: %s.'; +$lang['p_user_ns'] = 'Thành viên %s hiện có các quyền sau trong không gian tên %s: %s.'; +$lang['p_group_id'] = 'Thành viên trong nhóm %s hiện có các quyền sau trên trang %s: %s.'; +$lang['p_group_ns'] = 'Thành viên trong nhóm %s hiện có các quyền sau trong không gian tên %s: %s.'; +$lang['p_choose_id'] = 'Hãy nhập tên thành viên hoặc nhóm vào mẫu trên đây để xem hoặc sửa đổi quyền đã thiết đặt cho trang %s.'; +$lang['p_choose_ns'] = 'Hãy nhập tên thành viên hoặc nhóm vào mẫu trên đây để xem hoặc sửa đổi quyền đã thiết đặt cho không gian tên %s.'; +$lang['p_inherited'] = 'Ghi chú: Những quyền đó không được thể hiện rõ ràng nhưng được kế thừa từ những nhóm khác hoặc không gian tên cao hơn.'; +$lang['p_isadmin'] = 'Ghi chú: Nhóm hoặc thành viên này luôn được cấp đủ quyền vì họ được đặt là Siêu thành viên'; +$lang['p_include'] = 'Những quyền cao hơn bao gồm những quyền thấp hơn. Quyền Tạo, Tải lên và Xóa chỉ áp dụng cho không gian tên, không phải trang.'; +$lang['current'] = 'Quy tắc Danh sách kiểm soát truy cập (ACL) hiện tại'; +$lang['where'] = 'Trang/Không gian tên'; +$lang['who'] = 'Thành viên/Nhóm'; +$lang['perm'] = 'Quyền'; +$lang['acl_perm0'] = 'Không'; +$lang['acl_perm1'] = 'Đọc'; +$lang['acl_perm2'] = 'Sửa đổi'; +$lang['acl_perm4'] = 'Tạo'; +$lang['acl_perm8'] = 'Tải lên'; +$lang['acl_perm16'] = 'Xóa'; +$lang['acl_new'] = 'Thêm mục nhập mới'; +$lang['acl_mod'] = 'Sửa đổi mục nhập'; diff --git a/lib/plugins/acl/lang/zh-tw/help.txt b/lib/plugins/acl/lang/zh-tw/help.txt new file mode 100644 index 0000000..2d1c84b --- /dev/null +++ b/lib/plugins/acl/lang/zh-tw/help.txt @@ -0,0 +1,11 @@ +=== 快速指南: === + +你可以用這個頁面,為本 wiki 中的分類名稱或頁面增加或移除權限。 + +左方面板顯示了所有分類名稱和頁面。 + +上方表格允許你觀看及修改選取的使用者或群組的權限。 + +下方表格顯示了目前所有的存取控制表 (ACL),你可以用它快速刪除或更改多項規則。 + +閱讀 [[doku>acl|official documentation on ACL]] 可以幫助你完整地了解 DokuWiki 存取控制的運作。 \ No newline at end of file diff --git a/lib/plugins/acl/lang/zh-tw/lang.php b/lib/plugins/acl/lang/zh-tw/lang.php new file mode 100644 index 0000000..323a106 --- /dev/null +++ b/lib/plugins/acl/lang/zh-tw/lang.php @@ -0,0 +1,42 @@ + + * @author Li-Jiun Huang + * @author http://www.chinese-tools.com/tools/converter-simptrad.html + * @author Wayne San + * @author Cheng-Wei Chien + * @author Danny Lin + * @author Shuo-Ting Jian + * @author syaoranhinata + */ +$lang['admin_acl'] = '管理存取控制表 (ACL)'; +$lang['acl_group'] = '群組:'; +$lang['acl_user'] = '使用者:'; +$lang['acl_perms'] = '設定權限於'; +$lang['page'] = '頁面'; +$lang['namespace'] = '分類名稱'; +$lang['btn_select'] = '選擇'; +$lang['p_user_id'] = '使用者 %s 目前在頁面 %s 裏擁有以下權限:%s。'; +$lang['p_user_ns'] = '使用者 %s 目前在分類名稱 %s 裏擁有以下權限:%s。'; +$lang['p_group_id'] = '群組 %s 的成員目前在頁面 %s 裏擁有以下權限:%s。'; +$lang['p_group_ns'] = '群組 %s 的成員目前在分類名稱 %s 裏擁有以下權限:%s。'; +$lang['p_choose_id'] = '請在上方表格輸入使用者或群組以檢視或編輯頁面 %s 的權限設定。'; +$lang['p_choose_ns'] = '請在上方表格輸入使用者或群組以檢視或編輯分類名稱 %s 的權限設定。'; +$lang['p_inherited'] = '注意:這些權限並未明確指定,它們是從群組或上層的分類名稱繼承而來。'; +$lang['p_isadmin'] = '注意:選取的群組或使用者擁有完整權限,因為他或他們已成為超級使用者。'; +$lang['p_include'] = '較高的權限亦包含了較低的權限。新增、上傳與刪除權限只能套用至分類名稱,不能套用至頁面。'; +$lang['current'] = '目前的存取控制規則'; +$lang['where'] = '頁面/分類名稱'; +$lang['who'] = '使用者/群組'; +$lang['perm'] = '權限'; +$lang['acl_perm0'] = '無'; +$lang['acl_perm1'] = '讀取頁面'; +$lang['acl_perm2'] = '編輯頁面'; +$lang['acl_perm4'] = '新增頁面'; +$lang['acl_perm8'] = '上傳圖檔'; +$lang['acl_perm16'] = '刪除檔案'; +$lang['acl_new'] = '增加規則'; +$lang['acl_mod'] = '修改規則'; diff --git a/lib/plugins/acl/lang/zh/help.txt b/lib/plugins/acl/lang/zh/help.txt new file mode 100644 index 0000000..8589970 --- /dev/null +++ b/lib/plugins/acl/lang/zh/help.txt @@ -0,0 +1,11 @@ +=== 快速帮助 === + +本页中您可以添加或移除命名空间或页面的权限。 + +左边的窗格显示的是全部可用的命名空间和页面。 + +您可以在上方的表格中查看并修改选定用户或组的权限。 + +下方的表格中显示的是当前设置的全部访问控制规则。 您可以通过它快速删除或更改多条规则。 + +参阅 [[doku>acl|ACL 官方文档]] 能帮助您完整地理解 DokuWiki 中的访问控制是如何工作的。 diff --git a/lib/plugins/acl/lang/zh/lang.php b/lib/plugins/acl/lang/zh/lang.php new file mode 100644 index 0000000..fe92bde --- /dev/null +++ b/lib/plugins/acl/lang/zh/lang.php @@ -0,0 +1,42 @@ + + * @author http://www.chinese-tools.com/tools/converter-tradsimp.html + * @author Simon zhan + * @author ben + * @author lainme + * @author caii + * @author Hiphen Lee + * @author Shuo-Ting Jian + */ +$lang['admin_acl'] = '访问控制列表(ACL)管理器'; +$lang['acl_group'] = '组:'; +$lang['acl_user'] = '用户:'; +$lang['acl_perms'] = '许可给'; +$lang['page'] = '页面'; +$lang['namespace'] = '命名空间'; +$lang['btn_select'] = '选择'; +$lang['p_user_id'] = '用户 %s 当前在页面 %s 拥有以下权限:%s。'; +$lang['p_user_ns'] = '用户 %s 当前在命名空间 %s 拥有以下权限:%s。'; +$lang['p_group_id'] = '%s 组成员当前在页面 %s 拥有以下权限:%s。'; +$lang['p_group_ns'] = '%s 组成员当前在命名空间 %s 拥有以下权限:%s。'; +$lang['p_choose_id'] = '请在上表中输入用户名或组名称,来查看或编辑页面 %s 的权限设置。'; +$lang['p_choose_ns'] = '请在上表中输入用户名或组名称,来查看或编辑命名空间 %s 的权限设置。'; +$lang['p_inherited'] = '请注意:这些权限并没有明确设定,而是从其他组或更高级的名称空间继承而来。'; +$lang['p_isadmin'] = '请注意:选定的组或用户拥有完全权限,因为它被设定为超级用户。'; +$lang['p_include'] = '高权限包含低权限。创建、上传和删除权限只能应用于名称空间,而不是单个页面。'; +$lang['current'] = '当前 ACL 规则'; +$lang['where'] = '页面/命名空间'; +$lang['who'] = '用户/组'; +$lang['perm'] = '权限'; +$lang['acl_perm0'] = '无'; +$lang['acl_perm1'] = '读取'; +$lang['acl_perm2'] = '编辑'; +$lang['acl_perm4'] = '创建'; +$lang['acl_perm8'] = '上传'; +$lang['acl_perm16'] = '删除'; +$lang['acl_new'] = '添加新条目'; +$lang['acl_mod'] = '编辑条目'; diff --git a/lib/plugins/acl/pix/group.png b/lib/plugins/acl/pix/group.png new file mode 100644 index 0000000000000000000000000000000000000000..348d4e55cee99dd26e62a054641735d571a5d6e4 GIT binary patch literal 699 zcmV;s0!00ZP)u1{8#paKHJq$S zi1`N)(2p})gz2FsJ_B3Vp_jqXrbE3^jXMt%7peV3DIP?f99+=RJqn3d>o)WF;mdpIJ)$hRV|DB^aPPSd z>JADD!h*+B-=Q#iu|KuP5|h>z9qFs1Vp*+hwrpr^a5)5>3lL8M`C|ZQ2;foxF#+(^ zF2ply$%w#$F6rk?p8@h00SHC_fqfl(Y8`A#2pJ|I!w|w#^UH9sh=8X#&EHpB2A*aT zlGlLn6_9TS@&;~1LnFT*4i*vk&?!wFuFk4TVO#AvH%tBba?;(002ovPDHLkV1n<%I57YK literal 0 HcmV?d00001 diff --git a/lib/plugins/acl/pix/ns.png b/lib/plugins/acl/pix/ns.png new file mode 100644 index 0000000000000000000000000000000000000000..77e03b19e838cfc68ddc8b25e8e05015313b5ccc GIT binary patch literal 799 zcmV+)1K|9LP)Mot^LZeSJ>7bRT%;8D^gU@6R9J*D}V? zsqX&v#t2$}Wwa?8tv?+;IW z?{@?&ULLpQ{T&g0R@^(be_;4ca$4cnX0e?-_3AW_)^D!J|MSv6j-L55d<laOsMa&LN)!Do+=>wcQJ-QYp>CauQ&j8SUx=zBAlth-YuenRUr zPwk(u-1758tu1yM^QgopZP#$Dm_0*>AlfG1GepiU(yT2YAcF0cpSvX2+Xr90Xr&_b zYt!hYi4!yknl+kh8yubZ7Tene?PW~6iq%|TcjX0o%W&)WrPE!Kr){u$3$8=4JVe;I zLw8?^QlE!M0MRO_g3JvF*9bOe@RzUSK645&Zwo+!2CM>h?*VM5NK~Ii`*rL*Si!%L zGbEc=Xf+>^c_k<~m^4GQNCb@mK!J&&YZq?+5we1Z8$CpC{=rV#B6E9C0@pzTnUSah zP>P&90Kmx9DY5|q>gw4`anC^l8xqGQi!)S|pn`}rh-EcJ%mtvem$Plidtf5av9wGT zf?Gk%gr^W^GCwBuBZ)d9LJ+N+6Uw!vYu^xVuYyw%P&cRq2?=N!8gV8QK)x_U@1fIZ zL*YjEZedC?W7tU`1 zDv6gq`10~6Z=HK|j5-r00U&|6_V2Na-`w=aZ%6i~r;j~$w!HDoou0 z^F%4B(rXxHp4iFo%k|jyqI>Jv`%kEOEHFbtFxLabmyf4s(;p{ufPmd`S8WJFTGM#Pee`u2tfo0IPC6k=iws!4@5W~ URyod=wEzGB07*qoM6N<$f`jG|0{{R3 literal 0 HcmV?d00001 diff --git a/lib/plugins/acl/pix/user.png b/lib/plugins/acl/pix/user.png new file mode 100644 index 0000000000000000000000000000000000000000..8d5d1c2e9bd82220dd8fb533e621f1b2bc113c14 GIT binary patch literal 650 zcmV;50(Jd~P)YZuDUv zIyDv)c+rS%27Su5vbqiFE`-^gE{Z+9z88amXyC=edEfUu&yWAZe-nTWY1PMz4)dMR z={*R`>o9Oi1g?EIShMcIe*rkw6$xt_F?#M8ZmD)+#C;TfauM9JgJ7MO__}~0qXZ*X zF$PHJrs*&V*CWat0Vm%FL+jqkx_}EO8gND3jIpa4#MzUu9dE!jVhrqP$LcH(n zjx_;;%Kgi8FYlrBaU4J2K1AVhKfb@Xj^fNHc+G*|UmjiBx+WmuX#KD_JBfvS21}o( zh^Fazu`q?Zo|gQY71|WsHknM88S{6boWGCdZ_lZgKBX}^&;f}=@~q{|`R%I$luBj2 zN~IFiYBf@+6zq08#)layjYdP?bUNM2IZC{u8UP7y4hDm_$xmuZCX=vOEXZUsNT<^< znM{bqV(@r8=;`UHbar+Q63CV+fCMkIEQ^VW2^b6p7>!2QY&K-GS>$p#^!D~btJT74 zwSwn)xZUoGLZRrZ0*b?pe-~y35ekJM2m&=Z91f7l==co7!0YwG<#NI2^P!aG@xH&Q zTm{U9n<|U1Zcsxak)R+_X~j${1p)#1{eDEFQ40I@TEJ|uxl#puec~G`42l0ZolfZW z`V}KpBod+h$yD@C`lG9>3q`)AOfo{v7Urk9I?_>0*7%0>ohRd$ySuwVL__3Tl1ioT k%w}`*kEdK+%@#JIe+J8b>6J-D3jhEB07*qoM6N<$f_v08xBvhE literal 0 HcmV?d00001 diff --git a/lib/plugins/acl/plugin.info.txt b/lib/plugins/acl/plugin.info.txt new file mode 100644 index 0000000..1b2c82c --- /dev/null +++ b/lib/plugins/acl/plugin.info.txt @@ -0,0 +1,7 @@ +base acl +author Andreas Gohr +email andi@splitbrain.org +date 2015-07-25 +name ACL Manager +desc Manage Page Access Control Lists +url http://dokuwiki.org/plugin:acl diff --git a/lib/plugins/acl/remote.php b/lib/plugins/acl/remote.php new file mode 100644 index 0000000..762a2ac --- /dev/null +++ b/lib/plugins/acl/remote.php @@ -0,0 +1,75 @@ +initAclConfig(); + return $apa->acl; + } + + /** + * Add a new ACL rule to the config + * + * @param string $scope The page or namespace to apply the ACL to + * @param string $user The user or group to apply the ACL to + * @param int $level The permission level to set + * @return bool If adding the ACL rule was successful + * @throws AccessDeniedException + */ + public function addAcl($scope, $user, $level) + { + if (!auth_isadmin()) { + throw new AccessDeniedException( + 'You are not allowed to access ACLs, superuser permission is required', + 114 + ); + } + + /** @var admin_plugin_acl $apa */ + $apa = plugin_load('admin', 'acl'); + return $apa->addOrUpdateACL($scope, $user, $level); + } + + /** + * Remove an entry from ACL config + * + * @param string $scope The page or namespace the ACL applied to + * @param string $user The user or group the ACL applied to + * @return bool If removing the ACL rule was successful + * @throws AccessDeniedException + */ + public function delAcl($scope, $user) + { + if (!auth_isadmin()) { + throw new AccessDeniedException( + 'You are not allowed to access ACLs, superuser permission is required', + 114 + ); + } + + /** @var admin_plugin_acl $apa */ + $apa = plugin_load('admin', 'acl'); + return $apa->deleteACL($scope, $user); + } +} diff --git a/lib/plugins/acl/script.js b/lib/plugins/acl/script.js new file mode 100644 index 0000000..95621a2 --- /dev/null +++ b/lib/plugins/acl/script.js @@ -0,0 +1,121 @@ +/** + * ACL Manager AJAX enhancements + * + * @author Andreas Gohr + */ +var dw_acl = { + /** + * Initialize the object and attach the event handlers + */ + init: function () { + var $tree; + + //FIXME only one underscore!! + if (jQuery('#acl_manager').length === 0) { + return; + } + + jQuery('#acl__user select').on('change', dw_acl.userselhandler); + jQuery('#acl__user button').on('click', dw_acl.loadinfo); + + $tree = jQuery('#acl__tree'); + $tree.dw_tree({toggle_selector: 'img', + load_data: function (show_sublist, $clicky) { + // get the enclosed link and the edit form + var $frm = jQuery('#acl__detail form'); + + jQuery.post( + DOKU_BASE + 'lib/exe/ajax.php', + jQuery.extend(dw_acl.parseatt($clicky.parent().find('a')[0].search), + {call: 'plugin_acl', + ajax: 'tree', + current_ns: $frm.find('input[name=ns]').val(), + current_id: $frm.find('input[name=id]').val()}), + show_sublist, + 'html' + ); + }, + + toggle_display: function ($clicky, opening) { + $clicky.attr('src', + DOKU_BASE + 'lib/images/' + + (opening ? 'minus' : 'plus') + '.gif'); + }}); + $tree.delegate('a', 'click', dw_acl.treehandler); + }, + + /** + * Handle user dropdown + * + * Hides or shows the user/group entry box depending on what was selected in the + * dropdown element + */ + userselhandler: function () { + // make entry field visible/invisible + jQuery('#acl__user input').toggle(this.value === '__g__' || + this.value === '__u__'); + dw_acl.loadinfo(); + }, + + /** + * Load the current permission info and edit form + */ + loadinfo: function () { + jQuery('#acl__info') + .attr('role', 'alert') + .html('...') + .load( + DOKU_BASE + 'lib/exe/ajax.php', + jQuery('#acl__detail form').serialize() + '&call=plugin_acl&ajax=info' + ); + return false; + }, + + /** + * parse URL attributes into a associative array + * + * @todo put into global script lib? + */ + parseatt: function (str) { + if (str[0] === '?') { + str = str.substr(1); + } + var attributes = {}; + var all = str.split('&'); + for (var i = 0; i < all.length; i++) { + var att = all[i].split('='); + attributes[att[0]] = decodeURIComponent(att[1]); + } + return attributes; + }, + + /** + * Handles clicks to the tree nodes + */ + treehandler: function () { + var $link, $frm; + + $link = jQuery(this); + + // remove highlighting + jQuery('#acl__tree a.cur').removeClass('cur'); + + // add new highlighting + $link.addClass('cur'); + + // set new page to detail form + $frm = jQuery('#acl__detail form'); + if ($link.hasClass('wikilink1')) { + $frm.find('input[name=ns]').val(''); + $frm.find('input[name=id]').val(dw_acl.parseatt($link[0].search).id); + } else if ($link.hasClass('idx_dir')) { + $frm.find('input[name=ns]').val(dw_acl.parseatt($link[0].search).ns); + $frm.find('input[name=id]').val(''); + } + dw_acl.loadinfo(); + + return false; + } +}; + +jQuery(dw_acl.init); diff --git a/lib/plugins/acl/style.css b/lib/plugins/acl/style.css new file mode 100644 index 0000000..4233cd3 --- /dev/null +++ b/lib/plugins/acl/style.css @@ -0,0 +1,135 @@ +#acl__tree { + font-size: 90%; + width: 25%; + height: 300px; + float: left; + overflow: auto; + border: 1px solid __border__; + text-align: left; +} +[dir=rtl] #acl__tree { + float: right; + text-align: right; +} + +#acl__tree a.cur { + background-color: __highlight__; + font-weight: bold; +} + +#acl__tree ul { + list-style-type: none; + margin: 0; + padding: 0; +} + +#acl__tree li { + padding-left: 1em; + list-style-image: none; +} +[dir=rtl] #acl__tree li { + padding-left: 0em; + padding-right: 1em; +} + +#acl__tree ul img { + margin-right: 0.25em; + cursor: pointer; +} +[dir=rtl] #acl__tree ul img { + margin-left: 0.25em; + margin-right: 0em; +} + +#acl__detail { + width: 73%; + height: 300px; + float: right; + overflow: auto; +} +[dir=rtl] #acl__detail { + float: left; +} + +#acl__detail fieldset { + width: 90%; +} + +#acl__detail div#acl__user { + border: 1px solid __border__; + padding: 0.5em; + margin-bottom: 0.6em; +} + +#acl_manager table.inline { + width: 100%; + margin: 0; +} + +#acl_manager table .check { + text-align: center; +} + +#acl_manager table .action { + text-align: right; +} + +#acl_manager .aclgroup { + background: transparent url(pix/group.png) 0px 1px no-repeat; + padding: 1px 0px 1px 18px; +} +[dir=rtl] #acl_manager .aclgroup { + background: transparent url(pix/group.png) right 1px no-repeat; + padding: 1px 18px 1px 0px; +} + +#acl_manager .acluser { + background: transparent url(pix/user.png) 0px 1px no-repeat; + padding: 1px 0px 1px 18px; +} +[dir=rtl] #acl_manager .acluser { + background: transparent url(pix/user.png) right 1px no-repeat; + padding: 1px 18px 1px 0px; +} + +#acl_manager .aclpage { + background: transparent url(pix/page.png) 0px 1px no-repeat; + padding: 1px 0px 1px 18px; +} +[dir=rtl] #acl_manager .aclpage { + background: transparent url(pix/page.png) right 1px no-repeat; + padding: 1px 18px 1px 0px; +} + +#acl_manager .aclns { + background: transparent url(pix/ns.png) 0px 1px no-repeat; + padding: 1px 0px 1px 18px; +} +[dir=rtl] #acl_manager .aclns { + background: transparent url(pix/ns.png) right 1px no-repeat; + padding: 1px 18px 1px 0px; +} + +#acl_manager label.disabled { + opacity: .5; + cursor: auto; +} + +#acl_manager label { + text-align: left; + font-weight: normal; + display: inline; +} + +#acl_manager table { + margin-left: 10%; + width: 80%; +} + +#acl_manager table tr { + background-color: inherit; +} + +#acl_manager table tr:hover { + background-color: __background_alt__; +} diff --git a/lib/plugins/action.php b/lib/plugins/action.php new file mode 100644 index 0000000..e75f700 --- /dev/null +++ b/lib/plugins/action.php @@ -0,0 +1,9 @@ + + */ + +/** + * Class action_plugin_addomain + */ +class action_plugin_authad extends ActionPlugin +{ + /** + * Registers a callback function for a given event + */ + public function register(EventHandler $controller) + { + $controller->register_hook('AUTH_LOGIN_CHECK', 'BEFORE', $this, 'handleAuthLoginCheck'); + $controller->register_hook('FORM_LOGIN_OUTPUT', 'BEFORE', $this, 'handleFormLoginOutput'); + } + + /** + * Adds the selected domain as user postfix when attempting a login + * + * @param Event $event + * @param array $param + */ + public function handleAuthLoginCheck(Event $event, $param) + { + global $INPUT; + + /** @var auth_plugin_authad $auth */ + global $auth; + if (!is_a($auth, 'auth_plugin_authad')) return; // AD not even used + + if ($INPUT->str('dom')) { + $usr = $auth->cleanUser($event->data['user']); + $dom = $auth->getUserDomain($usr); + if (!$dom) { + $usr = "$usr@" . $INPUT->str('dom'); + } + $INPUT->post->set('u', $usr); + $event->data['user'] = $usr; + } + } + + /** + * Shows a domain selection in the login form when more than one domain is configured + * + * @param Event $event + * @param array $param + */ + public function handleFormLoginOutput(Event $event, $param) + { + global $INPUT; + /** @var auth_plugin_authad $auth */ + global $auth; + if (!is_a($auth, 'auth_plugin_authad')) return; // AD not even used + $domains = $auth->getConfiguredDomains(); + if (count($domains) <= 1) return; // no choice at all + + /** @var dokuwiki\Form\Form $form */ + $form =& $event->data; + + // find the username input box + $pos = $form->findPositionByAttribute('name', 'u'); + if ($pos === false) return; + + // any default? + if ($INPUT->has('u')) { + $usr = $auth->cleanUser($INPUT->str('u')); + $dom = $auth->getUserDomain($usr); + + // update user field value + if ($dom) { + $usr = $auth->getUserName($usr); + $element = $form->getElementAt($pos); + $element->val($usr); + } + } + + // add locate domain selector just after the username input box + $element = $form->addDropdown('dom', $domains, $this->getLang('domain'), $pos + 1); + $element->addClass('block'); + } +} + +// vim:ts=4:sw=4:et: diff --git a/lib/plugins/authad/adLDAP/adLDAP.php b/lib/plugins/authad/adLDAP/adLDAP.php new file mode 100644 index 0000000..c84a4f4 --- /dev/null +++ b/lib/plugins/authad/adLDAP/adLDAP.php @@ -0,0 +1,949 @@ +ldapConnection) { + return $this->ldapConnection; + } + return false; + } + + /** + * Get the bind status + * + * @return bool + */ + public function getLdapBind() { + return $this->ldapBind; + } + + /** + * Get the current base DN + * + * @return string + */ + public function getBaseDn() { + return $this->baseDn; + } + + /** + * The group class + * + * @var adLDAPGroups + */ + protected $groupClass; + + /** + * Get the group class interface + * + * @return adLDAPGroups + */ + public function group() { + if (!$this->groupClass) { + $this->groupClass = new adLDAPGroups($this); + } + return $this->groupClass; + } + + /** + * The user class + * + * @var adLDAPUsers + */ + protected $userClass; + + /** + * Get the userclass interface + * + * @return adLDAPUsers + */ + public function user() { + if (!$this->userClass) { + $this->userClass = new adLDAPUsers($this); + } + return $this->userClass; + } + + /** + * The folders class + * + * @var adLDAPFolders + */ + protected $folderClass; + + /** + * Get the folder class interface + * + * @return adLDAPFolders + */ + public function folder() { + if (!$this->folderClass) { + $this->folderClass = new adLDAPFolders($this); + } + return $this->folderClass; + } + + /** + * The utils class + * + * @var adLDAPUtils + */ + protected $utilClass; + + /** + * Get the utils class interface + * + * @return adLDAPUtils + */ + public function utilities() { + if (!$this->utilClass) { + $this->utilClass = new adLDAPUtils($this); + } + return $this->utilClass; + } + + /** + * The contacts class + * + * @var adLDAPContacts + */ + protected $contactClass; + + /** + * Get the contacts class interface + * + * @return adLDAPContacts + */ + public function contact() { + if (!$this->contactClass) { + $this->contactClass = new adLDAPContacts($this); + } + return $this->contactClass; + } + + /** + * The exchange class + * + * @var adLDAPExchange + */ + protected $exchangeClass; + + /** + * Get the exchange class interface + * + * @return adLDAPExchange + */ + public function exchange() { + if (!$this->exchangeClass) { + $this->exchangeClass = new adLDAPExchange($this); + } + return $this->exchangeClass; + } + + /** + * The computers class + * + * @var adLDAPComputers + */ + protected $computersClass; + + /** + * Get the computers class interface + * + * @return adLDAPComputers + */ + public function computer() { + if (!$this->computerClass) { + $this->computerClass = new adLDAPComputers($this); + } + return $this->computerClass; + } + + /** + * Getters and Setters + */ + + /** + * Set the account suffix + * + * @param string $accountSuffix + * @return void + */ + public function setAccountSuffix($accountSuffix) + { + $this->accountSuffix = $accountSuffix; + } + + /** + * Get the account suffix + * + * @return string + */ + public function getAccountSuffix() + { + return $this->accountSuffix; + } + + /** + * Set the domain controllers array + * + * @param array $domainControllers + * @return void + */ + public function setDomainControllers(array $domainControllers) + { + $this->domainControllers = $domainControllers; + } + + /** + * Get the list of domain controllers + * + * @return void + */ + public function getDomainControllers() + { + return $this->domainControllers; + } + + /** + * Sets the port number your domain controller communicates over + * + * @param int $adPort + */ + public function setPort($adPort) + { + $this->adPort = $adPort; + } + + /** + * Gets the port number your domain controller communicates over + * + * @return int + */ + public function getPort() + { + return $this->adPort; + } + + /** + * Set the username of an account with higher priviledges + * + * @param string $adminUsername + * @return void + */ + public function setAdminUsername($adminUsername) + { + $this->adminUsername = $adminUsername; + } + + /** + * Get the username of the account with higher priviledges + * + * This will throw an exception for security reasons + */ + public function getAdminUsername() + { + throw new adLDAPException('For security reasons you cannot access the domain administrator account details'); + } + + /** + * Set the password of an account with higher priviledges + * + * @param string $adminPassword + * @return void + */ + public function setAdminPassword($adminPassword) + { + $this->adminPassword = $adminPassword; + } + + /** + * Get the password of the account with higher priviledges + * + * This will throw an exception for security reasons + */ + public function getAdminPassword() + { + throw new adLDAPException('For security reasons you cannot access the domain administrator account details'); + } + + /** + * Set whether to detect the true primary group + * + * @param bool $realPrimaryGroup + * @return void + */ + public function setRealPrimaryGroup($realPrimaryGroup) + { + $this->realPrimaryGroup = $realPrimaryGroup; + } + + /** + * Get the real primary group setting + * + * @return bool + */ + public function getRealPrimaryGroup() + { + return $this->realPrimaryGroup; + } + + /** + * Set whether to use SSL + * + * @param bool $useSSL + * @return void + */ + public function setUseSSL($useSSL) + { + $this->useSSL = $useSSL; + // Set the default port correctly + if($this->useSSL) { + $this->setPort(self::ADLDAP_LDAPS_PORT); + } + else { + $this->setPort(self::ADLDAP_LDAP_PORT); + } + } + + /** + * Get the SSL setting + * + * @return bool + */ + public function getUseSSL() + { + return $this->useSSL; + } + + /** + * Set whether to use TLS + * + * @param bool $useTLS + * @return void + */ + public function setUseTLS($useTLS) + { + $this->useTLS = $useTLS; + } + + /** + * Get the TLS setting + * + * @return bool + */ + public function getUseTLS() + { + return $this->useTLS; + } + + /** + * Set whether to use SSO + * Requires ldap_sasl_bind support. Be sure --with-ldap-sasl is used when configuring PHP otherwise this function will be undefined. + * + * @param bool $useSSO + * @return void + */ + public function setUseSSO($useSSO) + { + if ($useSSO === true && !$this->ldapSaslSupported()) { + throw new adLDAPException('No LDAP SASL support for PHP. See: http://php.net/ldap_sasl_bind'); + } + $this->useSSO = $useSSO; + } + + /** + * Get the SSO setting + * + * @return bool + */ + public function getUseSSO() + { + return $this->useSSO; + } + + /** + * Set whether to lookup recursive groups + * + * @param bool $recursiveGroups + * @return void + */ + public function setRecursiveGroups($recursiveGroups) + { + $this->recursiveGroups = $recursiveGroups; + } + + /** + * Get the recursive groups setting + * + * @return bool + */ + public function getRecursiveGroups() + { + return $this->recursiveGroups; + } + + /** + * Default Constructor + * + * Tries to bind to the AD domain over LDAP or LDAPs + * + * @param array $options Array of options to pass to the constructor + * @throws Exception - if unable to bind to Domain Controller + * @return bool + */ + function __construct($options = array()) { + // You can specifically overide any of the default configuration options setup above + if (count($options) > 0) { + if (array_key_exists("account_suffix",$options)){ $this->accountSuffix = $options["account_suffix"]; } + if (array_key_exists("base_dn",$options)){ $this->baseDn = $options["base_dn"]; } + if (array_key_exists("domain_controllers",$options)){ + if (!is_array($options["domain_controllers"])) { + throw new adLDAPException('[domain_controllers] option must be an array'); + } + $this->domainControllers = $options["domain_controllers"]; + } + if (array_key_exists("admin_username",$options)){ $this->adminUsername = $options["admin_username"]; } + if (array_key_exists("admin_password",$options)){ $this->adminPassword = $options["admin_password"]; } + if (array_key_exists("real_primarygroup",$options)){ $this->realPrimaryGroup = $options["real_primarygroup"]; } + if (array_key_exists("use_ssl",$options)){ $this->setUseSSL($options["use_ssl"]); } + if (array_key_exists("use_tls",$options)){ $this->useTLS = $options["use_tls"]; } + if (array_key_exists("recursive_groups",$options)){ $this->recursiveGroups = $options["recursive_groups"]; } + if (array_key_exists("ad_port",$options)){ $this->setPort($options["ad_port"]); } + if (array_key_exists("sso",$options)) { + $this->setUseSSO($options["sso"]); + if (!$this->ldapSaslSupported()) { + $this->setUseSSO(false); + } + } + } + + if ($this->ldapSupported() === false) { + throw new adLDAPException('No LDAP support for PHP. See: http://php.net/ldap'); + } + + return $this->connect(); + } + + /** + * Default Destructor + * + * Closes the LDAP connection + * + * @return void + */ + function __destruct() { + $this->close(); + } + + /** + * Connects and Binds to the Domain Controller + * + * @return bool + */ + public function connect() + { + // Connect to the AD/LDAP server as the username/password + $domainController = $this->randomController(); + if ($this->useSSL) { + $this->ldapConnection = ldap_connect("ldaps://" . $domainController, $this->adPort); + } else { + $this->ldapConnection = ldap_connect($domainController, $this->adPort); + } + + // Set some ldap options for talking to AD + ldap_set_option($this->ldapConnection, LDAP_OPT_PROTOCOL_VERSION, 3); + ldap_set_option($this->ldapConnection, LDAP_OPT_REFERRALS, 0); + + if ($this->useTLS) { + ldap_start_tls($this->ldapConnection); + } + + // Bind as a domain admin if they've set it up + if ($this->adminUsername !== NULL && $this->adminPassword !== NULL) { + $this->ldapBind = @ldap_bind($this->ldapConnection, $this->adminUsername . $this->accountSuffix, $this->adminPassword); + if (!$this->ldapBind) { + if ($this->useSSL && !$this->useTLS) { + // If you have problems troubleshooting, remove the @ character from the ldapldapBind command above to get the actual error message + throw new adLDAPException('Bind to Active Directory failed. Either the LDAPs connection failed or the login credentials are incorrect. AD said: ' . $this->getLastError()); + } + else { + throw new adLDAPException('Bind to Active Directory failed. Check the login credentials and/or server details. AD said: ' . $this->getLastError()); + } + } + } + if ($this->useSSO && $_SERVER['REMOTE_USER'] && $this->adminUsername === null && $_SERVER['KRB5CCNAME']) { + putenv("KRB5CCNAME=" . $_SERVER['KRB5CCNAME']); + $this->ldapBind = @ldap_sasl_bind($this->ldapConnection, NULL, NULL, "GSSAPI"); + if (!$this->ldapBind){ + throw new adLDAPException('Rebind to Active Directory failed. AD said: ' . $this->getLastError()); + } + else { + return true; + } + } + + + if ($this->baseDn == NULL) { + $this->baseDn = $this->findBaseDn(); + } + + return true; + } + + /** + * Closes the LDAP connection + * + * @return void + */ + public function close() { + if ($this->ldapConnection) { + @ldap_close($this->ldapConnection); + } + } + + /** + * Validate a user's login credentials + * + * @param string $username A user's AD username + * @param string $password A user's AD password + * @param bool optional $preventRebind + * @return bool + */ + public function authenticate($username, $password, $preventRebind = false) { + // Prevent null binding + if ($username === NULL || $password === NULL) { return false; } + if (empty($username) || empty($password)) { return false; } + + // Allow binding over SSO for Kerberos + if ($this->useSSO && $_SERVER['REMOTE_USER'] && $_SERVER['REMOTE_USER'] == $username && $this->adminUsername === NULL && $_SERVER['KRB5CCNAME']) { + putenv("KRB5CCNAME=" . $_SERVER['KRB5CCNAME']); + $this->ldapBind = @ldap_sasl_bind($this->ldapConnection, NULL, NULL, "GSSAPI"); + if (!$this->ldapBind) { + throw new adLDAPException('Rebind to Active Directory failed. AD said: ' . $this->getLastError()); + } + else { + return true; + } + } + + // Bind as the user + $ret = true; + $this->ldapBind = @ldap_bind($this->ldapConnection, $username . $this->accountSuffix, $password); + if (!$this->ldapBind){ + $ret = false; + } + + // Cnce we've checked their details, kick back into admin mode if we have it + if ($this->adminUsername !== NULL && !$preventRebind) { + $this->ldapBind = @ldap_bind($this->ldapConnection, $this->adminUsername . $this->accountSuffix , $this->adminPassword); + if (!$this->ldapBind){ + // This should never happen in theory + throw new adLDAPException('Rebind to Active Directory failed. AD said: ' . $this->getLastError()); + } + } + + return $ret; + } + + /** + * Find the Base DN of your domain controller + * + * @return string + */ + public function findBaseDn() + { + $namingContext = $this->getRootDse(array('defaultnamingcontext')); + return $namingContext[0]['defaultnamingcontext'][0]; + } + + /** + * Get the RootDSE properties from a domain controller + * + * @param array $attributes The attributes you wish to query e.g. defaultnamingcontext + * @return array + */ + public function getRootDse($attributes = array("*", "+")) { + if (!$this->ldapBind){ return (false); } + + $sr = @ldap_read($this->ldapConnection, NULL, 'objectClass=*', $attributes); + $entries = @ldap_get_entries($this->ldapConnection, $sr); + return $entries; + } + + /** + * Get last error from Active Directory + * + * This function gets the last message from Active Directory + * This may indeed be a 'Success' message but if you get an unknown error + * it might be worth calling this function to see what errors were raised + * + * return string + */ + public function getLastError() { + return @ldap_error($this->ldapConnection); + } + + /** + * Detect LDAP support in php + * + * @return bool + */ + protected function ldapSupported() + { + if (!function_exists('ldap_connect')) { + return false; + } + return true; + } + + /** + * Detect ldap_sasl_bind support in PHP + * + * @return bool + */ + protected function ldapSaslSupported() + { + if (!function_exists('ldap_sasl_bind')) { + return false; + } + return true; + } + + /** + * Schema + * + * @param array $attributes Attributes to be queried + * @return array + */ + public function adldap_schema($attributes){ + + // LDAP doesn't like NULL attributes, only set them if they have values + // If you wish to remove an attribute you should set it to a space + // TO DO: Adapt user_modify to use ldap_mod_delete to remove a NULL attribute + $mod=array(); + + // Check every attribute to see if it contains 8bit characters and then UTF8 encode them + array_walk($attributes, array($this, 'encode8bit')); + + if ($attributes["address_city"]){ $mod["l"][0]=$attributes["address_city"]; } + if ($attributes["address_code"]){ $mod["postalCode"][0]=$attributes["address_code"]; } + //if ($attributes["address_country"]){ $mod["countryCode"][0]=$attributes["address_country"]; } // use country codes? + if ($attributes["address_country"]){ $mod["c"][0]=$attributes["address_country"]; } + if ($attributes["address_pobox"]){ $mod["postOfficeBox"][0]=$attributes["address_pobox"]; } + if ($attributes["address_state"]){ $mod["st"][0]=$attributes["address_state"]; } + if ($attributes["address_street"]){ $mod["streetAddress"][0]=$attributes["address_street"]; } + if ($attributes["company"]){ $mod["company"][0]=$attributes["company"]; } + if ($attributes["change_password"]){ $mod["pwdLastSet"][0]=0; } + if ($attributes["department"]){ $mod["department"][0]=$attributes["department"]; } + if ($attributes["description"]){ $mod["description"][0]=$attributes["description"]; } + if ($attributes["display_name"]){ $mod["displayName"][0]=$attributes["display_name"]; } + if ($attributes["email"]){ $mod["mail"][0]=$attributes["email"]; } + if ($attributes["expires"]){ $mod["accountExpires"][0]=$attributes["expires"]; } //unix epoch format? + if ($attributes["firstname"]){ $mod["givenName"][0]=$attributes["firstname"]; } + if ($attributes["home_directory"]){ $mod["homeDirectory"][0]=$attributes["home_directory"]; } + if ($attributes["home_drive"]){ $mod["homeDrive"][0]=$attributes["home_drive"]; } + if ($attributes["initials"]){ $mod["initials"][0]=$attributes["initials"]; } + if ($attributes["logon_name"]){ $mod["userPrincipalName"][0]=$attributes["logon_name"]; } + if ($attributes["manager"]){ $mod["manager"][0]=$attributes["manager"]; } //UNTESTED ***Use DistinguishedName*** + if ($attributes["office"]){ $mod["physicalDeliveryOfficeName"][0]=$attributes["office"]; } + if ($attributes["password"]){ $mod["unicodePwd"][0]=$this->user()->encodePassword($attributes["password"]); } + if ($attributes["profile_path"]){ $mod["profilepath"][0]=$attributes["profile_path"]; } + if ($attributes["script_path"]){ $mod["scriptPath"][0]=$attributes["script_path"]; } + if ($attributes["surname"]){ $mod["sn"][0]=$attributes["surname"]; } + if ($attributes["title"]){ $mod["title"][0]=$attributes["title"]; } + if ($attributes["telephone"]){ $mod["telephoneNumber"][0]=$attributes["telephone"]; } + if ($attributes["mobile"]){ $mod["mobile"][0]=$attributes["mobile"]; } + if ($attributes["pager"]){ $mod["pager"][0]=$attributes["pager"]; } + if ($attributes["ipphone"]){ $mod["ipphone"][0]=$attributes["ipphone"]; } + if ($attributes["web_page"]){ $mod["wWWHomePage"][0]=$attributes["web_page"]; } + if ($attributes["fax"]){ $mod["facsimileTelephoneNumber"][0]=$attributes["fax"]; } + if ($attributes["enabled"]){ $mod["userAccountControl"][0]=$attributes["enabled"]; } + if ($attributes["homephone"]){ $mod["homephone"][0]=$attributes["homephone"]; } + + // Distribution List specific schema + if ($attributes["group_sendpermission"]){ $mod["dlMemSubmitPerms"][0]=$attributes["group_sendpermission"]; } + if ($attributes["group_rejectpermission"]){ $mod["dlMemRejectPerms"][0]=$attributes["group_rejectpermission"]; } + + // Exchange Schema + if ($attributes["exchange_homemdb"]){ $mod["homeMDB"][0]=$attributes["exchange_homemdb"]; } + if ($attributes["exchange_mailnickname"]){ $mod["mailNickname"][0]=$attributes["exchange_mailnickname"]; } + if ($attributes["exchange_proxyaddress"]){ $mod["proxyAddresses"][0]=$attributes["exchange_proxyaddress"]; } + if ($attributes["exchange_usedefaults"]){ $mod["mDBUseDefaults"][0]=$attributes["exchange_usedefaults"]; } + if ($attributes["exchange_policyexclude"]){ $mod["msExchPoliciesExcluded"][0]=$attributes["exchange_policyexclude"]; } + if ($attributes["exchange_policyinclude"]){ $mod["msExchPoliciesIncluded"][0]=$attributes["exchange_policyinclude"]; } + if ($attributes["exchange_addressbook"]){ $mod["showInAddressBook"][0]=$attributes["exchange_addressbook"]; } + if ($attributes["exchange_altrecipient"]){ $mod["altRecipient"][0]=$attributes["exchange_altrecipient"]; } + if ($attributes["exchange_deliverandredirect"]){ $mod["deliverAndRedirect"][0]=$attributes["exchange_deliverandredirect"]; } + + // This schema is designed for contacts + if ($attributes["exchange_hidefromlists"]){ $mod["msExchHideFromAddressLists"][0]=$attributes["exchange_hidefromlists"]; } + if ($attributes["contact_email"]){ $mod["targetAddress"][0]=$attributes["contact_email"]; } + + //echo ("
    "); print_r($mod);
    +        /*
    +        // modifying a name is a bit fiddly
    +        if ($attributes["firstname"] && $attributes["surname"]){
    +            $mod["cn"][0]=$attributes["firstname"]." ".$attributes["surname"];
    +            $mod["displayname"][0]=$attributes["firstname"]." ".$attributes["surname"];
    +            $mod["name"][0]=$attributes["firstname"]." ".$attributes["surname"];
    +        }
    +        */
    +
    +        if (count($mod)==0){ return (false); }
    +        return ($mod);
    +    }
    +    
    +    /**
    +    * Convert 8bit characters e.g. accented characters to UTF8 encoded characters
    +    */
    +    protected function encode8Bit(&$item, $key) {
    +        $encode = false;
    +        if (is_string($item)) {
    +            for ($i=0; $i> 7) {
    +                    $encode = true;
    +                }
    +            }
    +        }
    +        if ($encode === true && $key != 'password') {
    +            $item = utf8_encode($item);   
    +        }
    +    }
    +    
    +    /**
    +    * Select a random domain controller from your domain controller array
    +    * 
    +    * @return string
    +    */
    +    protected function randomController() 
    +    {
    +        mt_srand(doubleval(microtime()) * 100000000); // For older PHP versions
    +        /*if (sizeof($this->domainControllers) > 1) {
    +            $adController = $this->domainControllers[array_rand($this->domainControllers)]; 
    +            // Test if the controller is responding to pings
    +            $ping = $this->pingController($adController); 
    +            if ($ping === false) { 
    +                // Find the current key in the domain controllers array
    +                $key = array_search($adController, $this->domainControllers);
    +                // Remove it so that we don't end up in a recursive loop
    +                unset($this->domainControllers[$key]);
    +                // Select a new controller
    +                return $this->randomController(); 
    +            }
    +            else { 
    +                return ($adController); 
    +            }
    +        } */
    +        return $this->domainControllers[array_rand($this->domainControllers)];
    +    }  
    +    
    +    /** 
    +    * Test basic connectivity to controller 
    +    * 
    +    * @return bool
    +    */ 
    +    protected function pingController($host) {
    +        $port = $this->adPort; 
    +        fsockopen($host, $port, $errno, $errstr, 10); 
    +        if ($errno > 0) {
    +            return false;
    +        }
    +        return true;
    +    }
    +
    +}
    +
    +/**
    +* adLDAP Exception Handler
    +* 
    +* Exceptions of this type are thrown on bind failure or when SSL is required but not configured
    +* Example:
    +* try {
    +*   $adldap = new adLDAP();
    +* }
    +* catch (adLDAPException $e) {
    +*   echo $e;
    +*   exit();
    +* }
    +*/
    +class adLDAPException extends Exception {}
    diff --git a/lib/plugins/authad/adLDAP/classes/adLDAPComputers.php b/lib/plugins/authad/adLDAP/classes/adLDAPComputers.php
    new file mode 100644
    index 0000000..aabd88f
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/classes/adLDAPComputers.php
    @@ -0,0 +1,153 @@
    +adldap = $adldap;
    +    }
    +    
    +    /**
    +    * Get information about a specific computer. Returned in a raw array format from AD
    +    * 
    +    * @param string $computerName The name of the computer
    +    * @param array $fields Attributes to return
    +    * @return array
    +    */
    +    public function info($computerName, $fields = NULL)
    +    {
    +        if ($computerName === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +
    +        $filter = "(&(objectClass=computer)(cn=" . $computerName . "))";
    +        if ($fields === NULL) { 
    +            $fields = array("memberof","cn","displayname","dnshostname","distinguishedname","objectcategory","operatingsystem","operatingsystemservicepack","operatingsystemversion"); 
    +        }
    +        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +        
    +        return $entries;
    +    }
    +    
    +    /**
    +    * Find information about the computers. Returned in a raw array format from AD
    +    * 
    +    * @param string $computerName The name of the computer
    +    * @param array $fields Array of parameters to query
    +    * @return mixed
    +    */
    +    public function infoCollection($computerName, $fields = NULL)
    +    {
    +        if ($computerName === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        
    +        $info = $this->info($computerName, $fields);
    +        
    +        if ($info !== false) {
    +            $collection = new adLDAPComputerCollection($info, $this->adldap);
    +            return $collection;
    +        }
    +        return false;
    +    }
    +    
    +    /**
    +    * Check if a computer is in a group
    +    * 
    +    * @param string $computerName The name of the computer
    +    * @param string $group The group to check
    +    * @param bool $recursive Whether to check recursively
    +    * @return array
    +    */
    +    public function inGroup($computerName, $group, $recursive = NULL)
    +    {
    +        if ($computerName === NULL) { return false; }
    +        if ($group === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } // use the default option if they haven't set it
    +
    +        //get a list of the groups
    +        $groups = $this->groups($computerName, array("memberof"), $recursive);
    +
    +        //return true if the specified group is in the group list
    +        if (in_array($group, $groups)){ 
    +            return true; 
    +        }
    +
    +        return false;
    +    }
    +    
    +    /**
    +    * Get the groups a computer is in
    +    * 
    +    * @param string $computerName The name of the computer
    +    * @param bool $recursive Whether to check recursively
    +    * @return array
    +    */
    +    public function groups($computerName, $recursive = NULL)
    +    {
    +        if ($computerName === NULL) { return false; }
    +        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } //use the default option if they haven't set it
    +        if (!$this->adldap->getLdapBind()){ return false; }
    +
    +        //search the directory for their information
    +        $info = @$this->info($computerName, array("memberof", "primarygroupid"));
    +        $groups = $this->adldap->utilities()->niceNames($info[0]["memberof"]); //presuming the entry returned is our guy (unique usernames)
    +
    +        if ($recursive === true) {
    +            foreach ($groups as $id => $groupName){
    +              $extraGroups = $this->adldap->group()->recursiveGroups($groupName);
    +              $groups = array_merge($groups, $extraGroups);
    +            }
    +        }
    +
    +        return $groups;
    +    }
    +    
    +}
    +?>
    \ No newline at end of file
    diff --git a/lib/plugins/authad/adLDAP/classes/adLDAPContacts.php b/lib/plugins/authad/adLDAP/classes/adLDAPContacts.php
    new file mode 100644
    index 0000000..ac7114b
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/classes/adLDAPContacts.php
    @@ -0,0 +1,296 @@
    +adldap = $adldap;
    +    }
    +    
    +    //*****************************************************************************************************************
    +    // CONTACT FUNCTIONS
    +    // * Still work to do in this area, and new functions to write
    +    
    +    /**
    +    * Create a contact
    +    * 
    +    * @param array $attributes The attributes to set to the contact
    +    * @return bool
    +    */
    +    public function create($attributes)
    +    {
    +        // Check for compulsory fields
    +        if (!array_key_exists("display_name", $attributes)) { return "Missing compulsory field [display_name]"; }
    +        if (!array_key_exists("email", $attributes)) { return "Missing compulsory field [email]"; }
    +        if (!array_key_exists("container", $attributes)) { return "Missing compulsory field [container]"; }
    +        if (!is_array($attributes["container"])) { return "Container attribute must be an array."; }
    +
    +        // Translate the schema
    +        $add = $this->adldap->adldap_schema($attributes);
    +        
    +        // Additional stuff only used for adding contacts
    +        $add["cn"][0] = $attributes["display_name"];
    +        $add["objectclass"][0] = "top";
    +        $add["objectclass"][1] = "person";
    +        $add["objectclass"][2] = "organizationalPerson";
    +        $add["objectclass"][3] = "contact"; 
    +        if (!isset($attributes['exchange_hidefromlists'])) {
    +            $add["msExchHideFromAddressLists"][0] = "TRUE";
    +        }
    +
    +        // Determine the container
    +        $attributes["container"] = array_reverse($attributes["container"]);
    +        $container= "OU=" . implode(",OU=", $attributes["container"]);
    +
    +        // Add the entry
    +        $result = @ldap_add($this->adldap->getLdapConnection(), "CN=" . $this->adldap->utilities()->escapeCharacters($add["cn"][0]) . ", " . $container . "," . $this->adldap->getBaseDn(), $add);
    +        if ($result != true) { 
    +            return false; 
    +        }
    +        
    +        return true;
    +    }  
    +    
    +    /**
    +    * Determine the list of groups a contact is a member of
    +    * 
    +    * @param string $distinguisedname The full DN of a contact
    +    * @param bool $recursive Recursively check groups
    +    * @return array
    +    */
    +    public function groups($distinguishedName, $recursive = NULL)
    +    {
    +        if ($distinguishedName === NULL) { return false; }
    +        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } //use the default option if they haven't set it
    +        if (!$this->adldap->getLdapBind()){ return false; }
    +        
    +        // Search the directory for their information
    +        $info = @$this->info($distinguishedName, array("memberof", "primarygroupid"));
    +        $groups = $this->adldap->utilities()->niceNames($info[0]["memberof"]); //presuming the entry returned is our contact
    +
    +        if ($recursive === true){
    +            foreach ($groups as $id => $groupName){
    +                $extraGroups = $this->adldap->group()->recursiveGroups($groupName);
    +                $groups = array_merge($groups, $extraGroups);
    +            }
    +        }
    +        
    +        return $groups;
    +    }
    +    
    +    /**
    +    * Get contact information. Returned in a raw array format from AD
    +    * 
    +    * @param string $distinguisedname The full DN of a contact
    +    * @param array $fields Attributes to be returned
    +    * @return array
    +    */
    +    public function info($distinguishedName, $fields = NULL)
    +    {
    +        if ($distinguishedName === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +
    +        $filter = "distinguishedName=" . $distinguishedName;
    +        if ($fields === NULL) { 
    +            $fields = array("distinguishedname", "mail", "memberof", "department", "displayname", "telephonenumber", "primarygroupid", "objectsid"); 
    +        }
    +        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +        
    +        if ($entries[0]['count'] >= 1) {
    +            // AD does not return the primary group in the ldap query, we may need to fudge it
    +            if ($this->adldap->getRealPrimaryGroup() && isset($entries[0]["primarygroupid"][0]) && isset($entries[0]["primarygroupid"][0])){
    +                //$entries[0]["memberof"][]=$this->group_cn($entries[0]["primarygroupid"][0]);
    +                $entries[0]["memberof"][] = $this->adldap->group()->getPrimaryGroup($entries[0]["primarygroupid"][0], $entries[0]["objectsid"][0]);
    +            } else {
    +                $entries[0]["memberof"][] = "CN=Domain Users,CN=Users," . $this->adldap->getBaseDn();
    +            }
    +        }
    +        
    +        $entries[0]["memberof"]["count"]++;
    +        return $entries;
    +    }
    +    
    +    /**
    +    * Find information about the contacts. Returned in a raw array format from AD
    +    * 
    +    * @param string $distinguishedName The full DN of a contact 
    +    * @param array $fields Array of parameters to query
    +    * @return mixed
    +    */
    +    public function infoCollection($distinguishedName, $fields = NULL)
    +    {
    +        if ($distinguishedName === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        
    +        $info = $this->info($distinguishedName, $fields);
    +        
    +        if ($info !== false) {
    +            $collection = new adLDAPContactCollection($info, $this->adldap);
    +            return $collection;
    +        }
    +        return false;
    +    }
    +    
    +    /**
    +    * Determine if a contact is a member of a group
    +    * 
    +    * @param string $distinguisedName The full DN of a contact
    +    * @param string $group The group name to query
    +    * @param bool $recursive Recursively check groups
    +    * @return bool
    +    */
    +    public function inGroup($distinguisedName, $group, $recursive = NULL)
    +    {
    +        if ($distinguisedName === NULL) { return false; }
    +        if ($group === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } //use the default option if they haven't set it
    +        
    +        // Get a list of the groups
    +        $groups = $this->groups($distinguisedName, array("memberof"), $recursive);
    +        
    +        // Return true if the specified group is in the group list
    +        if (in_array($group, $groups)){ 
    +            return true; 
    +        }
    +
    +        return false;
    +    }          
    +    
    +    /**
    +    * Modify a contact
    +    * 
    +    * @param string $distinguishedName The contact to query
    +    * @param array $attributes The attributes to modify.  Note if you set the enabled attribute you must not specify any other attributes
    +    * @return bool
    +    */
    +    public function modify($distinguishedName, $attributes) {
    +        if ($distinguishedName === NULL) { return "Missing compulsory field [distinguishedname]"; }
    +        
    +        // Translate the update to the LDAP schema                
    +        $mod = $this->adldap->adldap_schema($attributes);
    +        
    +        // Check to see if this is an enabled status update
    +        if (!$mod) { 
    +            return false; 
    +        }
    +        
    +        // Do the update
    +        $result = ldap_modify($this->adldap->getLdapConnection(), $distinguishedName, $mod);
    +        if ($result == false) { 
    +            return false; 
    +        }
    +        
    +        return true;
    +    }
    +    
    +    /**
    +    * Delete a contact
    +    * 
    +    * @param string $distinguishedName The contact dn to delete (please be careful here!)
    +    * @return array
    +    */
    +    public function delete($distinguishedName) 
    +    {
    +        $result = $this->folder()->delete($distinguishedName);
    +        if ($result != true) { 
    +            return false; 
    +        }       
    +        return true;
    +    }
    +    
    +    /**
    +    * Return a list of all contacts
    +    * 
    +    * @param bool $includeDescription Include a description of a contact
    +    * @param string $search The search parameters
    +    * @param bool $sorted Whether to sort the results
    +    * @return array
    +    */
    +    public function all($includeDescription = false, $search = "*", $sorted = true) {
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        
    +        // Perform the search and grab all their details
    +        $filter = "(&(objectClass=contact)(cn=" . $search . "))";
    +        $fields = array("displayname","distinguishedname");           
    +        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +
    +        $usersArray = array();
    +        for ($i=0; $i<$entries["count"]; $i++){
    +            if ($includeDescription && strlen($entries[$i]["displayname"][0])>0){
    +                $usersArray[$entries[$i]["distinguishedname"][0]] = $entries[$i]["displayname"][0];
    +            } elseif ($includeDescription){
    +                $usersArray[$entries[$i]["distinguishedname"][0]] = $entries[$i]["distinguishedname"][0];
    +            } else {
    +                array_push($usersArray, $entries[$i]["distinguishedname"][0]);
    +            }
    +        }
    +        if ($sorted) { 
    +            Sort::asort($usersArray); 
    +        }
    +        return $usersArray;
    +    }
    +    
    +    /**
    +    * Mail enable a contact
    +    * Allows email to be sent to them through Exchange
    +    * 
    +    * @param string $distinguishedname The contact to mail enable
    +    * @param string $emailaddress The email address to allow emails to be sent through
    +    * @param string $mailnickname The mailnickname for the contact in Exchange.  If NULL this will be set to the display name
    +    * @return bool
    +    */
    +    public function contactMailEnable($distinguishedName, $emailAddress, $mailNickname = NULL){
    +        return $this->adldap->exchange()->contactMailEnable($distinguishedName, $emailAddress, $mailNickname);
    +    }
    +    
    +    
    +}
    +?>
    diff --git a/lib/plugins/authad/adLDAP/classes/adLDAPExchange.php b/lib/plugins/authad/adLDAP/classes/adLDAPExchange.php
    new file mode 100644
    index 0000000..d70aac7
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/classes/adLDAPExchange.php
    @@ -0,0 +1,390 @@
    +adldap = $adldap;
    +    }
    +    
    +    /**
    +    * Create an Exchange account
    +    * 
    +    * @param string $username The username of the user to add the Exchange account to
    +    * @param array $storageGroup The mailbox, Exchange Storage Group, for the user account, this must be a full CN
    +    *                            If the storage group has a different base_dn to the adLDAP configuration, set it using $base_dn
    +    * @param string $emailAddress The primary email address to add to this user
    +    * @param string $mailNickname The mail nick name.  If mail nickname is blank, the username will be used
    +    * @param bool $mdbUseDefaults Indicates whether the store should use the default quota, rather than the per-mailbox quota.
    +    * @param string $baseDn Specify an alternative base_dn for the Exchange storage group
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function createMailbox($username, $storageGroup, $emailAddress, $mailNickname=NULL, $useDefaults=TRUE, $baseDn=NULL, $isGUID=false)
    +    {
    +        if ($username === NULL){ return "Missing compulsory field [username]"; }     
    +        if ($storageGroup === NULL) { return "Missing compulsory array [storagegroup]"; }
    +        if (!is_array($storageGroup)) { return "[storagegroup] must be an array"; }
    +        if ($emailAddress === NULL) { return "Missing compulsory field [emailAddress]"; }
    +        
    +        if ($baseDn === NULL) {
    +            $baseDn = $this->adldap->getBaseDn();   
    +        }
    +        
    +        $container = "CN=" . implode(",CN=", $storageGroup);
    +        
    +        if ($mailNickname === NULL) { 
    +            $mailNickname = $username; 
    +        }
    +        $mdbUseDefaults = $this->adldap->utilities()->boolToString($useDefaults);
    +        
    +        $attributes = array(
    +            'exchange_homemdb'=>$container.",".$baseDn,
    +            'exchange_proxyaddress'=>'SMTP:' . $emailAddress,
    +            'exchange_mailnickname'=>$mailNickname,
    +            'exchange_usedefaults'=>$mdbUseDefaults
    +        );
    +        $result = $this->adldap->user()->modify($username, $attributes, $isGUID);
    +        if ($result == false) { 
    +            return false; 
    +        }
    +        return true;
    +    }
    +    
    +    /**
    +    * Add an X400 address to Exchange
    +    * See http://tools.ietf.org/html/rfc1685 for more information.
    +    * An X400 Address looks similar to this X400:c=US;a= ;p=Domain;o=Organization;s=Doe;g=John;
    +    * 
    +    * @param string $username The username of the user to add the X400 to to
    +    * @param string $country Country
    +    * @param string $admd Administration Management Domain
    +    * @param string $pdmd Private Management Domain (often your AD domain)
    +    * @param string $org Organization
    +    * @param string $surname Surname
    +    * @param string $givenName Given name
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function addX400($username, $country, $admd, $pdmd, $org, $surname, $givenName, $isGUID=false) 
    +    {
    +        if ($username === NULL){ return "Missing compulsory field [username]"; }     
    +        
    +        $proxyValue = 'X400:';
    +            
    +        // Find the dn of the user
    +        $user = $this->adldap->user()->info($username, array("cn","proxyaddresses"), $isGUID);
    +        if ($user[0]["dn"] === NULL) { return false; }
    +        $userDn = $user[0]["dn"];
    +        
    +        // We do not have to demote an email address from the default so we can just add the new proxy address
    +        $attributes['exchange_proxyaddress'] = $proxyValue . 'c=' . $country . ';a=' . $admd . ';p=' . $pdmd . ';o=' . $org . ';s=' . $surname . ';g=' . $givenName . ';';
    +       
    +        // Translate the update to the LDAP schema                
    +        $add = $this->adldap->adldap_schema($attributes);
    +        
    +        if (!$add) { return false; }
    +        
    +        // Do the update
    +        // Take out the @ to see any errors, usually this error might occur because the address already
    +        // exists in the list of proxyAddresses
    +        $result = @ldap_mod_add($this->adldap->getLdapConnection(), $userDn, $add);
    +        if ($result == false) { 
    +            return false; 
    +        }
    +        
    +        return true;
    +    }
    +    
    +    /**
    +    * Add an address to Exchange
    +    * 
    +    * @param string $username The username of the user to add the Exchange account to
    +    * @param string $emailAddress The email address to add to this user
    +    * @param bool $default Make this email address the default address, this is a bit more intensive as we have to demote any existing default addresses
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function addAddress($username, $emailAddress, $default = FALSE, $isGUID = false) 
    +    {
    +        if ($username === NULL) { return "Missing compulsory field [username]"; }     
    +        if ($emailAddress === NULL) { return "Missing compulsory fields [emailAddress]"; }
    +        
    +        $proxyValue = 'smtp:';
    +        if ($default === true) {
    +            $proxyValue = 'SMTP:';
    +        }
    +              
    +        // Find the dn of the user
    +        $user = $this->adldap->user()->info($username, array("cn","proxyaddresses"), $isGUID);
    +        if ($user[0]["dn"] === NULL){ return false; }
    +        $userDn = $user[0]["dn"];
    +        
    +        // We need to scan existing proxy addresses and demote the default one
    +        if (is_array($user[0]["proxyaddresses"]) && $default === true) {
    +            $modAddresses = array();
    +            for ($i=0;$iadldap->getLdapConnection(), $userDn, $modAddresses);
    +            if ($result == false) { 
    +                return false; 
    +            }
    +            
    +            return true;
    +        }
    +        else {
    +            // We do not have to demote an email address from the default so we can just add the new proxy address
    +            $attributes['exchange_proxyaddress'] = $proxyValue . $emailAddress;
    +            
    +            // Translate the update to the LDAP schema                
    +            $add = $this->adldap->adldap_schema($attributes);
    +            
    +            if (!$add) { 
    +                return false; 
    +            }
    +            
    +            // Do the update
    +            // Take out the @ to see any errors, usually this error might occur because the address already
    +            // exists in the list of proxyAddresses
    +            $result = @ldap_mod_add($this->adldap->getLdapConnection(), $userDn,$add);
    +            if ($result == false) { 
    +                return false; 
    +            }
    +            
    +            return true;
    +        }
    +    }
    +    
    +    /**
    +    * Remove an address to Exchange
    +    * If you remove a default address the account will no longer have a default, 
    +    * we recommend changing the default address first
    +    * 
    +    * @param string $username The username of the user to add the Exchange account to
    +    * @param string $emailAddress The email address to add to this user
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function deleteAddress($username, $emailAddress, $isGUID=false) 
    +    {
    +        if ($username === NULL) { return "Missing compulsory field [username]"; }     
    +        if ($emailAddress === NULL) { return "Missing compulsory fields [emailAddress]"; }
    +        
    +        // Find the dn of the user
    +        $user = $this->adldap->user()->info($username, array("cn","proxyaddresses"), $isGUID);
    +        if ($user[0]["dn"] === NULL) { return false; }
    +        $userDn = $user[0]["dn"];
    +        
    +        if (is_array($user[0]["proxyaddresses"])) {
    +            $mod = array();
    +            for ($i=0;$iadldap->getLdapConnection(), $userDn,$mod);
    +            if ($result == false) { 
    +                return false; 
    +            }
    +            
    +            return true;
    +        }
    +        else {
    +            return false;
    +        }
    +    }
    +    /**
    +    * Change the default address
    +    * 
    +    * @param string $username The username of the user to add the Exchange account to
    +    * @param string $emailAddress The email address to make default
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function primaryAddress($username, $emailAddress, $isGUID = false) 
    +    {
    +        if ($username === NULL) { return "Missing compulsory field [username]"; }     
    +        if ($emailAddress === NULL) { return "Missing compulsory fields [emailAddress]"; }
    +        
    +        // Find the dn of the user
    +        $user = $this->adldap->user()->info($username, array("cn","proxyaddresses"), $isGUID);
    +        if ($user[0]["dn"] === NULL){ return false; }
    +        $userDn = $user[0]["dn"];
    +        
    +        if (is_array($user[0]["proxyaddresses"])) {
    +            $modAddresses = array();
    +            for ($i=0;$iadldap->getLdapConnection(), $userDn, $modAddresses);
    +            if ($result == false) { 
    +                return false; 
    +            }
    +            
    +            return true;
    +        }
    +        
    +    }
    +    
    +    /**
    +    * Mail enable a contact
    +    * Allows email to be sent to them through Exchange
    +    * 
    +    * @param string $distinguishedName The contact to mail enable
    +    * @param string $emailAddress The email address to allow emails to be sent through
    +    * @param string $mailNickname The mailnickname for the contact in Exchange.  If NULL this will be set to the display name
    +    * @return bool
    +    */
    +    public function contactMailEnable($distinguishedName, $emailAddress, $mailNickname = NULL)
    +    {
    +        if ($distinguishedName === NULL) { return "Missing compulsory field [distinguishedName]"; }   
    +        if ($emailAddress === NULL) { return "Missing compulsory field [emailAddress]"; }  
    +        
    +        if ($mailNickname !== NULL) {
    +            // Find the dn of the user
    +            $user = $this->adldap->contact()->info($distinguishedName, array("cn","displayname"));
    +            if ($user[0]["displayname"] === NULL) { return false; }
    +            $mailNickname = $user[0]['displayname'][0];
    +        }
    +        
    +        $attributes = array("email"=>$emailAddress,"contact_email"=>"SMTP:" . $emailAddress,"exchange_proxyaddress"=>"SMTP:" . $emailAddress,"exchange_mailnickname" => $mailNickname);
    +         
    +        // Translate the update to the LDAP schema                
    +        $mod = $this->adldap->adldap_schema($attributes);
    +        
    +        // Check to see if this is an enabled status update
    +        if (!$mod) { return false; }
    +        
    +        // Do the update
    +        $result = ldap_modify($this->adldap->getLdapConnection(), $distinguishedName, $mod);
    +        if ($result == false) { return false; }
    +        
    +        return true;
    +    }
    +    
    +    /**
    +    * Returns a list of Exchange Servers in the ConfigurationNamingContext of the domain
    +    * 
    +    * @param array $attributes An array of the AD attributes you wish to return
    +    * @return array
    +    */
    +    public function servers($attributes = array('cn','distinguishedname','serialnumber')) 
    +    {
    +        if (!$this->adldap->getLdapBind()){ return false; }
    +        
    +        $configurationNamingContext = $this->adldap->getRootDse(array('configurationnamingcontext'));
    +        $sr = @ldap_search($this->adldap->getLdapConnection(), $configurationNamingContext[0]['configurationnamingcontext'][0],'(&(objectCategory=msExchExchangeServer))', $attributes);
    +        $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +        return $entries;
    +    }
    +    
    +    /**
    +    * Returns a list of Storage Groups in Exchange for a given mail server
    +    * 
    +    * @param string $exchangeServer The full DN of an Exchange server.  You can use exchange_servers() to find the DN for your server
    +    * @param array $attributes An array of the AD attributes you wish to return
    +    * @param bool $recursive If enabled this will automatically query the databases within a storage group
    +    * @return array
    +    */
    +    public function storageGroups($exchangeServer, $attributes = array('cn','distinguishedname'), $recursive = NULL) 
    +    {
    +        if (!$this->adldap->getLdapBind()){ return false; }
    +        if ($exchangeServer === NULL) { return "Missing compulsory field [exchangeServer]"; }
    +        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); }
    +
    +        $filter = '(&(objectCategory=msExchStorageGroup))';
    +        $sr = @ldap_search($this->adldap->getLdapConnection(), $exchangeServer, $filter, $attributes);
    +        $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +
    +        if ($recursive === true) {
    +            for ($i=0; $i<$entries['count']; $i++) {
    +                $entries[$i]['msexchprivatemdb'] = $this->storageDatabases($entries[$i]['distinguishedname'][0]);       
    +            }
    +        }
    +        
    +        return $entries;
    +    }
    +    
    +    /**
    +    * Returns a list of Databases within any given storage group in Exchange for a given mail server
    +    * 
    +    * @param string $storageGroup The full DN of an Storage Group.  You can use exchange_storage_groups() to find the DN 
    +    * @param array $attributes An array of the AD attributes you wish to return
    +    * @return array
    +    */
    +    public function storageDatabases($storageGroup, $attributes = array('cn','distinguishedname','displayname')) {
    +        if (!$this->adldap->getLdapBind()){ return false; }
    +        if ($storageGroup === NULL) { return "Missing compulsory field [storageGroup]"; }
    +        
    +        $filter = '(&(objectCategory=msExchPrivateMDB))';
    +        $sr = @ldap_search($this->adldap->getLdapConnection(), $storageGroup, $filter, $attributes);
    +        $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +        return $entries;
    +    }
    +}
    +?>
    \ No newline at end of file
    diff --git a/lib/plugins/authad/adLDAP/classes/adLDAPFolders.php b/lib/plugins/authad/adLDAP/classes/adLDAPFolders.php
    new file mode 100644
    index 0000000..67b1474
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/classes/adLDAPFolders.php
    @@ -0,0 +1,179 @@
    +adldap = $adldap;
    +    }
    +    
    +    /**
    +    * Delete a distinguished name from Active Directory
    +    * You should never need to call this yourself, just use the wrapper functions user_delete and contact_delete
    +    *
    +    * @param string $dn The distinguished name to delete
    +    * @return bool
    +    */
    +    public function delete($dn){ 
    +        $result = ldap_delete($this->adldap->getLdapConnection(), $dn);
    +        if ($result != true) { 
    +            return false; 
    +        }
    +        return true;
    +    }
    +    
    +    /**
    +    * Returns a folder listing for a specific OU
    +    * See http://adldap.sourceforge.net/wiki/doku.php?id=api_folder_functions
    +    * 
    +    * @param array $folderName An array to the OU you wish to list. 
    +    *                           If set to NULL will list the root, strongly recommended to set 
    +    *                           $recursive to false in that instance!
    +    * @param string $dnType The type of record to list.  This can be ADLDAP_FOLDER or ADLDAP_CONTAINER.
    +    * @param bool $recursive Recursively search sub folders
    +    * @param bool $type Specify a type of object to search for
    +    * @return array
    +    */
    +    public function listing($folderName = NULL, $dnType = adLDAP::ADLDAP_FOLDER, $recursive = NULL, $type = NULL) 
    +    {
    +        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } //use the default option if they haven't set it
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +
    +        $filter = '(&';
    +        if ($type !== NULL) {
    +            switch ($type) {
    +                case 'contact':
    +                    $filter .= '(objectClass=contact)';
    +                    break;
    +                case 'computer':
    +                    $filter .= '(objectClass=computer)';
    +                    break;
    +                case 'group':
    +                    $filter .= '(objectClass=group)';
    +                    break;
    +                case 'folder':
    +                    $filter .= '(objectClass=organizationalUnit)';
    +                    break;
    +                case 'container':
    +                    $filter .= '(objectClass=container)';
    +                    break;
    +                case 'domain':
    +                    $filter .= '(objectClass=builtinDomain)';
    +                    break;
    +                default:
    +                    $filter .= '(objectClass=user)';
    +                    break;   
    +            }
    +        }
    +        else {
    +            $filter .= '(objectClass=*)';   
    +        }
    +        // If the folder name is null then we will search the root level of AD
    +        // This requires us to not have an OU= part, just the base_dn
    +        $searchOu = $this->adldap->getBaseDn();
    +        if (is_array($folderName)) {
    +            $ou = $dnType . "=" . implode("," . $dnType . "=", $folderName);
    +            $filter .= '(!(distinguishedname=' . $ou . ',' . $this->adldap->getBaseDn() . ')))';
    +            $searchOu = $ou . ',' . $this->adldap->getBaseDn();
    +        }
    +        else {
    +            $filter .= '(!(distinguishedname=' . $this->adldap->getBaseDn() . ')))';
    +        }
    +
    +        if ($recursive === true) {
    +            $sr = ldap_search($this->adldap->getLdapConnection(), $searchOu, $filter, array('objectclass', 'distinguishedname', 'samaccountname'));
    +            $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +            if (is_array($entries)) {
    +                return $entries;
    +            }
    +        }
    +        else {
    +            $sr = ldap_list($this->adldap->getLdapConnection(), $searchOu, $filter, array('objectclass', 'distinguishedname', 'samaccountname'));
    +            $entries = @ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +            if (is_array($entries)) {
    +                return $entries;
    +            }
    +        }
    +        
    +        return false;
    +    }
    +
    +    /**
    +    * Create an organizational unit
    +    * 
    +    * @param array $attributes Default attributes of the ou
    +    * @return bool
    +    */
    +    public function create($attributes)
    +    {
    +        if (!is_array($attributes)){ return "Attributes must be an array"; }
    +        if (!is_array($attributes["container"])) { return "Container attribute must be an array."; }
    +        if (!array_key_exists("ou_name",$attributes)) { return "Missing compulsory field [ou_name]"; }
    +        if (!array_key_exists("container",$attributes)) { return "Missing compulsory field [container]"; }
    +        
    +        $attributes["container"] = array_reverse($attributes["container"]);
    +
    +        $add=array();
    +        $add["objectClass"] = "organizationalUnit";
    +        $add["OU"] = $attributes['ou_name'];
    +        $containers = "";
    +        if (count($attributes['container']) > 0) {
    +            $containers = "OU=" . implode(",OU=", $attributes["container"]) . ",";
    +        }
    +
    +        $containers = "OU=" . implode(",OU=", $attributes["container"]);
    +        $result = ldap_add($this->adldap->getLdapConnection(), "OU=" . $add["OU"] . ", " . $containers . $this->adldap->getBaseDn(), $add);
    +        if ($result != true) { 
    +            return false; 
    +        }
    +        
    +        return true;
    +    }
    +    
    +}
    +
    +?>
    \ No newline at end of file
    diff --git a/lib/plugins/authad/adLDAP/classes/adLDAPGroups.php b/lib/plugins/authad/adLDAP/classes/adLDAPGroups.php
    new file mode 100644
    index 0000000..8c8e88d
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/classes/adLDAPGroups.php
    @@ -0,0 +1,633 @@
    +adldap = $adldap;
    +    }
    +    
    +    /**
    +    * Add a group to a group
    +    * 
    +    * @param string $parent The parent group name
    +    * @param string $child The child group name
    +    * @return bool
    +    */
    +    public function addGroup($parent,$child){
    +
    +        // Find the parent group's dn
    +        $parentGroup = $this->ginfo($parent, array("cn"));
    +        if ($parentGroup[0]["dn"] === NULL){
    +            return false; 
    +        }
    +        $parentDn = $parentGroup[0]["dn"];
    +        
    +        // Find the child group's dn
    +        $childGroup = $this->info($child, array("cn"));
    +        if ($childGroup[0]["dn"] === NULL){ 
    +            return false; 
    +        }
    +        $childDn = $childGroup[0]["dn"];
    +                
    +        $add = array();
    +        $add["member"] = $childDn;
    +        
    +        $result = @ldap_mod_add($this->adldap->getLdapConnection(), $parentDn, $add);
    +        if ($result == false) { 
    +            return false; 
    +        }
    +        return true;
    +    }
    +    
    +    /**
    +    * Add a user to a group
    +    * 
    +    * @param string $group The group to add the user to
    +    * @param string $user The user to add to the group
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function addUser($group, $user, $isGUID = false)
    +    {
    +        // Adding a user is a bit fiddly, we need to get the full DN of the user
    +        // and add it using the full DN of the group
    +        
    +        // Find the user's dn
    +        $userDn = $this->adldap->user()->dn($user, $isGUID);
    +        if ($userDn === false) { 
    +            return false; 
    +        }
    +        
    +        // Find the group's dn
    +        $groupInfo = $this->info($group, array("cn"));
    +        if ($groupInfo[0]["dn"] === NULL) { 
    +            return false; 
    +        }
    +        $groupDn = $groupInfo[0]["dn"];
    +        
    +        $add = array();
    +        $add["member"] = $userDn;
    +        
    +        $result = @ldap_mod_add($this->adldap->getLdapConnection(), $groupDn, $add);
    +        if ($result == false) { 
    +            return false; 
    +        }
    +        return true;
    +    }
    +    
    +    /**
    +    * Add a contact to a group
    +    * 
    +    * @param string $group The group to add the contact to
    +    * @param string $contactDn The DN of the contact to add
    +    * @return bool
    +    */
    +    public function addContact($group, $contactDn)
    +    {
    +        // To add a contact we take the contact's DN
    +        // and add it using the full DN of the group
    +        
    +        // Find the group's dn
    +        $groupInfo = $this->info($group, array("cn"));
    +        if ($groupInfo[0]["dn"] === NULL) { 
    +            return false; 
    +        }
    +        $groupDn = $groupInfo[0]["dn"];
    +        
    +        $add = array();
    +        $add["member"] = $contactDn;
    +        
    +        $result = @ldap_mod_add($this->adldap->getLdapConnection(), $groupDn, $add);
    +        if ($result == false) { 
    +            return false; 
    +        }
    +        return true;
    +    }
    +
    +    /**
    +    * Create a group
    +    * 
    +    * @param array $attributes Default attributes of the group
    +    * @return bool
    +    */
    +    public function create($attributes)
    +    {
    +        if (!is_array($attributes)){ return "Attributes must be an array"; }
    +        if (!array_key_exists("group_name", $attributes)){ return "Missing compulsory field [group_name]"; }
    +        if (!array_key_exists("container", $attributes)){ return "Missing compulsory field [container]"; }
    +        if (!array_key_exists("description", $attributes)){ return "Missing compulsory field [description]"; }
    +        if (!is_array($attributes["container"])){ return "Container attribute must be an array."; }
    +        $attributes["container"] = array_reverse($attributes["container"]);
    +
    +        //$member_array = array();
    +        //$member_array[0] = "cn=user1,cn=Users,dc=yourdomain,dc=com";
    +        //$member_array[1] = "cn=administrator,cn=Users,dc=yourdomain,dc=com";
    +        
    +        $add = array();
    +        $add["cn"] = $attributes["group_name"];
    +        $add["samaccountname"] = $attributes["group_name"];
    +        $add["objectClass"] = "Group";
    +        $add["description"] = $attributes["description"];
    +        //$add["member"] = $member_array; UNTESTED
    +
    +        $container = "OU=" . implode(",OU=", $attributes["container"]);
    +        $result = ldap_add($this->adldap->getLdapConnection(), "CN=" . $add["cn"] . ", " . $container . "," . $this->adldap->getBaseDn(), $add);
    +        if ($result != true) { 
    +            return false; 
    +        }
    +        return true;
    +    }
    +    
    +    /**
    +    * Delete a group account 
    +    * 
    +    * @param string $group The group to delete (please be careful here!) 
    +    * 
    +    * @return array 
    +    */
    +    public function delete($group) {
    +        if (!$this->adldap->getLdapBind()){ return false; }
    +        if ($group === null){ return "Missing compulsory field [group]"; }
    +        
    +        $groupInfo = $this->info($group, array("*"));
    +        $dn = $groupInfo[0]['distinguishedname'][0]; 
    +        $result = $this->adldap->folder()->delete($dn); 
    +        if ($result !== true) { 
    +            return false; 
    +        } return true;   
    +    }
    +
    +    /**
    +    * Remove a group from a group
    +    * 
    +    * @param string $parent The parent group name
    +    * @param string $child The child group name
    +    * @return bool
    +    */
    +    public function removeGroup($parent , $child)
    +    {
    +    
    +        // Find the parent dn
    +        $parentGroup = $this->info($parent, array("cn"));
    +        if ($parentGroup[0]["dn"] === NULL) { 
    +            return false; 
    +        }
    +        $parentDn = $parentGroup[0]["dn"];
    +        
    +        // Find the child dn
    +        $childGroup = $this->info($child, array("cn"));
    +        if ($childGroup[0]["dn"] === NULL) { 
    +            return false; 
    +        }
    +        $childDn = $childGroup[0]["dn"];
    +        
    +        $del = array();
    +        $del["member"] = $childDn;
    +        
    +        $result = @ldap_mod_del($this->adldap->getLdapConnection(), $parentDn, $del);
    +        if ($result == false) { 
    +            return false; 
    +        }
    +        return true;
    +    }
    +    
    +    /**
    +    * Remove a user from a group
    +    * 
    +    * @param string $group The group to remove a user from
    +    * @param string $user The AD user to remove from the group
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function removeUser($group, $user, $isGUID = false)
    +    {
    +    
    +        // Find the parent dn
    +        $groupInfo = $this->info($group, array("cn"));
    +        if ($groupInfo[0]["dn"] === NULL){ 
    +            return false; 
    +        }
    +        $groupDn = $groupInfo[0]["dn"];
    +        
    +        // Find the users dn
    +        $userDn = $this->adldap->user()->dn($user, $isGUID);
    +        if ($userDn === false) {
    +            return false; 
    +        }
    +
    +        $del = array();
    +        $del["member"] = $userDn;
    +        
    +        $result = @ldap_mod_del($this->adldap->getLdapConnection(), $groupDn, $del);
    +        if ($result == false) {
    +            return false; 
    +        }
    +        return true;
    +    }
    +    
    +    /**
    +    * Remove a contact from a group
    +    * 
    +    * @param string $group The group to remove a user from
    +    * @param string $contactDn The DN of a contact to remove from the group
    +    * @return bool
    +    */
    +    public function removeContact($group, $contactDn)
    +    {
    +    
    +        // Find the parent dn
    +        $groupInfo = $this->info($group, array("cn"));
    +        if ($groupInfo[0]["dn"] === NULL) { 
    +            return false; 
    +        }
    +        $groupDn = $groupInfo[0]["dn"];
    +    
    +        $del = array();
    +        $del["member"] = $contactDn;
    +        
    +        $result = @ldap_mod_del($this->adldap->getLdapConnection(), $groupDn, $del);
    +        if ($result == false) { 
    +            return false; 
    +        }
    +        return true;
    +    }
    +    
    +    /**
    +    * Return a list of groups in a group
    +    * 
    +    * @param string $group The group to query
    +    * @param bool $recursive Recursively get groups
    +    * @return array
    +    */
    +    public function inGroup($group, $recursive = NULL)
    +    {
    +        if (!$this->adldap->getLdapBind()){ return false; }
    +        if ($recursive === NULL){ $recursive = $this->adldap->getRecursiveGroups(); } // Use the default option if they haven't set it 
    +        
    +        // Search the directory for the members of a group
    +        $info = $this->info($group, array("member","cn"));
    +        $groups = $info[0]["member"];
    +        if (!is_array($groups)) {
    +            return false;   
    +        }
    + 
    +        $groupArray = array();
    +
    +        for ($i=0; $i<$groups["count"]; $i++){ 
    +             $filter = "(&(objectCategory=group)(distinguishedName=" . $this->adldap->utilities()->ldapSlashes($groups[$i]) . "))";
    +             $fields = array("samaccountname", "distinguishedname", "objectClass");
    +             $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +             $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +
    +             // not a person, look for a group  
    +             if ($entries['count'] == 0 && $recursive == true) {  
    +                $filter = "(&(objectCategory=group)(distinguishedName=" . $this->adldap->utilities()->ldapSlashes($groups[$i]) . "))";  
    +                $fields = array("distinguishedname");  
    +                $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);  
    +                $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);  
    +                if (!isset($entries[0]['distinguishedname'][0])) {
    +                    continue;  
    +                }
    +                $subGroups = $this->inGroup($entries[0]['distinguishedname'][0], $recursive);  
    +                if (is_array($subGroups)) {
    +                    $groupArray = array_merge($groupArray, $subGroups); 
    +                    $groupArray = array_unique($groupArray);  
    +                }
    +                continue;  
    +             } 
    +
    +             $groupArray[] = $entries[0]['distinguishedname'][0];
    +        }
    +        return $groupArray;
    +    }
    +    
    +    /**
    +    * Return a list of members in a group
    +    * 
    +    * @param string $group The group to query
    +    * @param bool $recursive Recursively get group members
    +    * @return array
    +    */
    +    public function members($group, $recursive = NULL)
    +    {
    +        if (!$this->adldap->getLdapBind()){ return false; }
    +        if ($recursive === NULL){ $recursive = $this->adldap->getRecursiveGroups(); } // Use the default option if they haven't set it 
    +        // Search the directory for the members of a group
    +        $info = $this->info($group, array("member","cn"));
    +        $users = $info[0]["member"];
    +        if (!is_array($users)) {
    +            return false;   
    +        }
    + 
    +        $userArray = array();
    +
    +        for ($i=0; $i<$users["count"]; $i++){ 
    +             $filter = "(&(objectCategory=person)(distinguishedName=" . $this->adldap->utilities()->ldapSlashes($users[$i]) . "))";
    +             $fields = array("samaccountname", "distinguishedname", "objectClass");
    +             $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +             $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +
    +             // not a person, look for a group  
    +             if ($entries['count'] == 0 && $recursive == true) {  
    +                $filter = "(&(objectCategory=group)(distinguishedName=" . $this->adldap->utilities()->ldapSlashes($users[$i]) . "))";  
    +                $fields = array("samaccountname");  
    +                $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);  
    +                $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);  
    +                if (!isset($entries[0]['samaccountname'][0])) {
    +                    continue;  
    +                }
    +                $subUsers = $this->members($entries[0]['samaccountname'][0], $recursive);  
    +                if (is_array($subUsers)) {
    +                    $userArray = array_merge($userArray, $subUsers); 
    +                    $userArray = array_unique($userArray);  
    +                }
    +                continue;  
    +             } 
    +             else if ($entries['count'] == 0) {   
    +                continue; 
    +             } 
    +
    +             if ((!isset($entries[0]['samaccountname'][0]) || $entries[0]['samaccountname'][0] === NULL) && $entries[0]['distinguishedname'][0] !== NULL) {
    +                 $userArray[] = $entries[0]['distinguishedname'][0];
    +             }
    +             else if ($entries[0]['samaccountname'][0] !== NULL) {
    +                $userArray[] = $entries[0]['samaccountname'][0];
    +             }
    +        }
    +        return $userArray;
    +    }
    +    
    +    /**
    +    * Group Information.  Returns an array of raw information about a group.
    +    * The group name is case sensitive
    +    * 
    +    * @param string $groupName The group name to retrieve info about
    +    * @param array $fields Fields to retrieve
    +    * @return array
    +    */
    +    public function info($groupName, $fields = NULL)
    +    {
    +        if ($groupName === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        
    +        if (stristr($groupName, '+')) {
    +            $groupName = stripslashes($groupName);   
    +        }
    +        
    +        $filter = "(&(objectCategory=group)(name=" . $this->adldap->utilities()->ldapSlashes($groupName) . "))";
    +        if ($fields === NULL) { 
    +            $fields = array("member","memberof","cn","description","distinguishedname","objectcategory","samaccountname"); 
    +        }
    +        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +
    +        return $entries;
    +    }
    +    
    +    /**
    +    * Group Information.  Returns an collection
    +    * The group name is case sensitive
    +    * 
    +    * @param string $groupName The group name to retrieve info about
    +    * @param array $fields Fields to retrieve
    +    * @return adLDAPGroupCollection
    +    */
    +    public function infoCollection($groupName, $fields = NULL)
    +    {
    +        if ($groupName === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        
    +        $info = $this->info($groupName, $fields);
    +        if ($info !== false) {
    +            $collection = new adLDAPGroupCollection($info, $this->adldap);
    +            return $collection;
    +        }
    +        return false;
    +    }
    +    
    +    /**
    +    * Return a complete list of "groups in groups"
    +    * 
    +    * @param string $group The group to get the list from
    +    * @return array
    +    */
    +    public function recursiveGroups($group)
    +    {
    +        if ($group === NULL) { return false; }
    +
    +        $stack = array(); 
    +        $processed = array(); 
    +        $retGroups = array(); 
    +     
    +        array_push($stack, $group); // Initial Group to Start with 
    +        while (count($stack) > 0) {
    +            $parent = array_pop($stack);
    +            array_push($processed, $parent);
    +            
    +            $info = $this->info($parent, array("memberof"));
    +            
    +            if (isset($info[0]["memberof"]) && is_array($info[0]["memberof"])) {
    +                $groups = $info[0]["memberof"]; 
    +                if ($groups) {
    +                    $groupNames = $this->adldap->utilities()->niceNames($groups);  
    +                    $retGroups = array_merge($retGroups, $groupNames); //final groups to return
    +                    foreach ($groupNames as $id => $groupName) { 
    +                        if (!in_array($groupName, $processed)) {
    +                            array_push($stack, $groupName);
    +                        }
    +                    }
    +                }
    +            }
    +        }
    +        
    +        return $retGroups;
    +    }
    +    
    +    /**
    +    * Returns a complete list of the groups in AD based on a SAM Account Type  
    +    * 
    +    * @param string $sAMAaccountType The account type to return
    +    * @param bool $includeDescription Whether to return a description
    +    * @param string $search Search parameters
    +    * @param bool $sorted Whether to sort the results
    +    * @return array
    +    */
    +    public function search($sAMAaccountType = adLDAP::ADLDAP_SECURITY_GLOBAL_GROUP, $includeDescription = false, $search = "*", $sorted = true) {
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        
    +        $filter = '(&(objectCategory=group)';
    +        if ($sAMAaccountType !== null) {
    +            $filter .= '(samaccounttype='. $sAMAaccountType .')';
    +        }
    +        $filter .= '(cn=' . $search . '))';
    +        // Perform the search and grab all their details
    +        $fields = array("samaccountname", "description");
    +        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +
    +        $groupsArray = array();        
    +        for ($i=0; $i<$entries["count"]; $i++){
    +            if ($includeDescription && strlen($entries[$i]["description"][0]) > 0 ) {
    +                $groupsArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["description"][0];
    +            }
    +            else if ($includeDescription){
    +                $groupsArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["samaccountname"][0];
    +            }
    +            else {
    +                array_push($groupsArray, $entries[$i]["samaccountname"][0]);
    +            }
    +        }
    +        if ($sorted) { 
    +            Sort::asort($groupsArray); 
    +        }
    +        return $groupsArray;
    +    }
    +    
    +    /**
    +    * Returns a complete list of all groups in AD
    +    * 
    +    * @param bool $includeDescription Whether to return a description
    +    * @param string $search Search parameters
    +    * @param bool $sorted Whether to sort the results
    +    * @return array
    +    */
    +    public function all($includeDescription = false, $search = "*", $sorted = true){
    +        $groupsArray = $this->search(null, $includeDescription, $search, $sorted);
    +        return $groupsArray;
    +    }
    +    
    +    /**
    +    * Returns a complete list of security groups in AD
    +    * 
    +    * @param bool $includeDescription Whether to return a description
    +    * @param string $search Search parameters
    +    * @param bool $sorted Whether to sort the results
    +    * @return array
    +    */
    +    public function allSecurity($includeDescription = false, $search = "*", $sorted = true){
    +        $groupsArray = $this->search(adLDAP::ADLDAP_SECURITY_GLOBAL_GROUP, $includeDescription, $search, $sorted);
    +        return $groupsArray;
    +    }
    +    
    +    /**
    +    * Returns a complete list of distribution lists in AD
    +    * 
    +    * @param bool $includeDescription Whether to return a description
    +    * @param string $search Search parameters
    +    * @param bool $sorted Whether to sort the results
    +    * @return array
    +    */
    +    public function allDistribution($includeDescription = false, $search = "*", $sorted = true){
    +        $groupsArray = $this->search(adLDAP::ADLDAP_DISTRIBUTION_GROUP, $includeDescription, $search, $sorted);
    +        return $groupsArray;
    +    }
    +    
    +    /**
    +    * Coping with AD not returning the primary group
    +    * http://support.microsoft.com/?kbid=321360 
    +    * 
    +    * This is a re-write based on code submitted by Bruce which prevents the 
    +    * need to search each security group to find the true primary group
    +    * 
    +    * @param string $gid Group ID
    +    * @param string $usersid User's Object SID
    +    * @return mixed
    +    */
    +    public function getPrimaryGroup($gid, $usersid)
    +    {
    +        if ($gid === NULL || $usersid === NULL) { return false; }
    +        $sr = false;
    +
    +        $gsid = substr_replace($usersid, pack('V',$gid), strlen($usersid)-4,4);
    +        $filter = '(objectsid=' . $this->adldap->utilities()->getTextSID($gsid).')';
    +        $fields = array("samaccountname","distinguishedname");
    +        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +
    +        if (isset($entries[0]['distinguishedname'][0])) {
    +            return $entries[0]['distinguishedname'][0];
    +        }
    +        return false;
    +     }
    +     
    +     /**
    +    * Coping with AD not returning the primary group
    +    * http://support.microsoft.com/?kbid=321360 
    +    * 
    +    * For some reason it's not possible to search on primarygrouptoken=XXX
    +    * If someone can show otherwise, I'd like to know about it :)
    +    * this way is resource intensive and generally a pain in the @#%^
    +    * 
    +    * @deprecated deprecated since version 3.1, see get get_primary_group
    +    * @param string $gid Group ID
    +    * @return string
    +    */
    +    public function cn($gid){    
    +        if ($gid === NULL) { return false; }
    +        $sr = false;
    +        $r = '';
    +        
    +        $filter = "(&(objectCategory=group)(samaccounttype=" . adLDAP::ADLDAP_SECURITY_GLOBAL_GROUP . "))";
    +        $fields = array("primarygrouptoken", "samaccountname", "distinguishedname");
    +        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +        
    +        for ($i=0; $i<$entries["count"]; $i++){
    +            if ($entries[$i]["primarygrouptoken"][0] == $gid) {
    +                $r = $entries[$i]["distinguishedname"][0];
    +                $i = $entries["count"];
    +            }
    +        }
    +
    +        return $r;
    +    }
    +}
    +?>
    diff --git a/lib/plugins/authad/adLDAP/classes/adLDAPUsers.php b/lib/plugins/authad/adLDAP/classes/adLDAPUsers.php
    new file mode 100644
    index 0000000..d750f10
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/classes/adLDAPUsers.php
    @@ -0,0 +1,684 @@
    +adldap = $adldap;
    +    }
    +    
    +    /**
    +    * Validate a user's login credentials
    +    * 
    +    * @param string $username A user's AD username
    +    * @param string $password A user's AD password
    +    * @param bool optional $prevent_rebind
    +    * @return bool
    +    */
    +    public function authenticate($username, $password, $preventRebind = false) {
    +        return $this->adldap->authenticate($username, $password, $preventRebind);
    +    }
    +    
    +    /**
    +    * Create a user
    +    * 
    +    * If you specify a password here, this can only be performed over SSL
    +    * 
    +    * @param array $attributes The attributes to set to the user account
    +    * @return bool
    +    */
    +    public function create($attributes)
    +    {
    +        // Check for compulsory fields
    +        if (!array_key_exists("username", $attributes)){ return "Missing compulsory field [username]"; }
    +        if (!array_key_exists("firstname", $attributes)){ return "Missing compulsory field [firstname]"; }
    +        if (!array_key_exists("surname", $attributes)){ return "Missing compulsory field [surname]"; }
    +        if (!array_key_exists("email", $attributes)){ return "Missing compulsory field [email]"; }
    +        if (!array_key_exists("container", $attributes)){ return "Missing compulsory field [container]"; }
    +        if (!is_array($attributes["container"])){ return "Container attribute must be an array."; }
    +
    +        if (array_key_exists("password",$attributes) && (!$this->adldap->getUseSSL() && !$this->adldap->getUseTLS())){ 
    +            throw new adLDAPException('SSL must be configured on your webserver and enabled in the class to set passwords.');
    +        }
    +
    +        if (!array_key_exists("display_name", $attributes)) { 
    +            $attributes["display_name"] = $attributes["firstname"] . " " . $attributes["surname"]; 
    +        }
    +
    +        // Translate the schema
    +        $add = $this->adldap->adldap_schema($attributes);
    +        
    +        // Additional stuff only used for adding accounts
    +        $add["cn"][0] = $attributes["display_name"];
    +        $add["samaccountname"][0] = $attributes["username"];
    +        $add["objectclass"][0] = "top";
    +        $add["objectclass"][1] = "person";
    +        $add["objectclass"][2] = "organizationalPerson";
    +        $add["objectclass"][3] = "user"; //person?
    +        //$add["name"][0]=$attributes["firstname"]." ".$attributes["surname"];
    +
    +        // Set the account control attribute
    +        $control_options = array("NORMAL_ACCOUNT");
    +        if (!$attributes["enabled"]) { 
    +            $control_options[] = "ACCOUNTDISABLE"; 
    +        }
    +        $add["userAccountControl"][0] = $this->accountControl($control_options);
    +        
    +        // Determine the container
    +        $attributes["container"] = array_reverse($attributes["container"]);
    +        $container = "OU=" . implode(", OU=",$attributes["container"]);
    +
    +        // Add the entry
    +        $result = @ldap_add($this->adldap->getLdapConnection(), "CN=" . $add["cn"][0] . ", " . $container . "," . $this->adldap->getBaseDn(), $add);
    +        if ($result != true) { 
    +            return false; 
    +        }
    +        
    +        return true;
    +    }
    +    
    +    /**
    +    * Account control options
    +    *
    +    * @param array $options The options to convert to int 
    +    * @return int
    +    */
    +    protected function accountControl($options)
    +    {
    +        $val=0;
    +
    +        if (is_array($options)) {
    +            if (in_array("SCRIPT",$options)){ $val=$val+1; }
    +            if (in_array("ACCOUNTDISABLE",$options)){ $val=$val+2; }
    +            if (in_array("HOMEDIR_REQUIRED",$options)){ $val=$val+8; }
    +            if (in_array("LOCKOUT",$options)){ $val=$val+16; }
    +            if (in_array("PASSWD_NOTREQD",$options)){ $val=$val+32; }
    +            //PASSWD_CANT_CHANGE Note You cannot assign this permission by directly modifying the UserAccountControl attribute.
    +            //For information about how to set the permission programmatically, see the "Property flag descriptions" section.
    +            if (in_array("ENCRYPTED_TEXT_PWD_ALLOWED",$options)){ $val=$val+128; }
    +            if (in_array("TEMP_DUPLICATE_ACCOUNT",$options)){ $val=$val+256; }
    +            if (in_array("NORMAL_ACCOUNT",$options)){ $val=$val+512; }
    +            if (in_array("INTERDOMAIN_TRUST_ACCOUNT",$options)){ $val=$val+2048; }
    +            if (in_array("WORKSTATION_TRUST_ACCOUNT",$options)){ $val=$val+4096; }
    +            if (in_array("SERVER_TRUST_ACCOUNT",$options)){ $val=$val+8192; }
    +            if (in_array("DONT_EXPIRE_PASSWORD",$options)){ $val=$val+65536; }
    +            if (in_array("MNS_LOGON_ACCOUNT",$options)){ $val=$val+131072; }
    +            if (in_array("SMARTCARD_REQUIRED",$options)){ $val=$val+262144; }
    +            if (in_array("TRUSTED_FOR_DELEGATION",$options)){ $val=$val+524288; }
    +            if (in_array("NOT_DELEGATED",$options)){ $val=$val+1048576; }
    +            if (in_array("USE_DES_KEY_ONLY",$options)){ $val=$val+2097152; }
    +            if (in_array("DONT_REQ_PREAUTH",$options)){ $val=$val+4194304; } 
    +            if (in_array("PASSWORD_EXPIRED",$options)){ $val=$val+8388608; }
    +            if (in_array("TRUSTED_TO_AUTH_FOR_DELEGATION",$options)){ $val=$val+16777216; }
    +        }
    +        return $val;
    +    }
    +    
    +    /**
    +    * Delete a user account
    +    * 
    +    * @param string $username The username to delete (please be careful here!)
    +    * @param bool $isGUID Is the username a GUID or a samAccountName
    +    * @return array
    +    */
    +    public function delete($username, $isGUID = false) 
    +    {      
    +        $userinfo = $this->info($username, array("*"), $isGUID);
    +        $dn = $userinfo[0]['distinguishedname'][0];
    +        $result = $this->adldap->folder()->delete($dn);
    +        if ($result != true) { 
    +            return false;
    +        }        
    +        return true;
    +    }
    +    
    +    /**
    +    * Groups the user is a member of
    +    * 
    +    * @param string $username The username to query
    +    * @param bool $recursive Recursive list of groups
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return array
    +    */
    +    public function groups($username, $recursive = NULL, $isGUID = false)
    +    {
    +        if ($username === NULL) { return false; }
    +        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } // Use the default option if they haven't set it
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        
    +        // Search the directory for their information
    +        $info = @$this->info($username, array("memberof", "primarygroupid"), $isGUID);
    +        $groups = $this->adldap->utilities()->niceNames($info[0]["memberof"]); // Presuming the entry returned is our guy (unique usernames)
    +
    +        if ($recursive === true){
    +            foreach ($groups as $id => $groupName){
    +                $extraGroups = $this->adldap->group()->recursiveGroups($groupName);
    +                $groups = array_merge($groups, $extraGroups);
    +            }
    +        }
    +        
    +        return $groups;
    +    }
    +    
    +    /**
    +    * Find information about the users. Returned in a raw array format from AD
    +    * 
    +    * @param string $username The username to query
    +    * @param array $fields Array of parameters to query
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return array
    +    */
    +    public function info($username, $fields = NULL, $isGUID = false)
    +    {
    +        if ($username === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +
    +        if ($isGUID === true) {
    +            $username = $this->adldap->utilities()->strGuidToHex($username);
    +            $filter = "objectguid=" . $username;
    +        }
    +        else if (strstr($username, "@")) {
    +             $filter = "userPrincipalName=" . $username;
    +        }
    +        else {
    +             $filter = "samaccountname=" . $username;
    +        }
    +        $filter = "(&(objectCategory=person)({$filter}))";
    +        if ($fields === NULL) { 
    +            $fields = array("samaccountname","mail","memberof","department","displayname","telephonenumber","primarygroupid","objectsid"); 
    +        }
    +        if (!in_array("objectsid", $fields)) {
    +            $fields[] = "objectsid";
    +        }
    +        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +        
    +        if (isset($entries[0])) {
    +            if ($entries[0]['count'] >= 1) {
    +                if (in_array("memberof", $fields)) {
    +                    // AD does not return the primary group in the ldap query, we may need to fudge it
    +                    if ($this->adldap->getRealPrimaryGroup() && isset($entries[0]["primarygroupid"][0]) && isset($entries[0]["objectsid"][0])){
    +                        //$entries[0]["memberof"][]=$this->group_cn($entries[0]["primarygroupid"][0]);
    +                        $entries[0]["memberof"][] = $this->adldap->group()->getPrimaryGroup($entries[0]["primarygroupid"][0], $entries[0]["objectsid"][0]);
    +                    } else {
    +                        $entries[0]["memberof"][] = "CN=Domain Users,CN=Users," . $this->adldap->getBaseDn();
    +                    }
    +                    if (!isset($entries[0]["memberof"]["count"])) {
    +                        $entries[0]["memberof"]["count"] = 0;
    +                    }
    +                    $entries[0]["memberof"]["count"]++;
    +                }
    +            }
    +            
    +            return $entries;
    +        }
    +        return false;
    +    }
    +    
    +    /**
    +    * Find information about the users. Returned in a raw array format from AD
    +    * 
    +    * @param string $username The username to query
    +    * @param array $fields Array of parameters to query
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return mixed
    +    */
    +    public function infoCollection($username, $fields = NULL, $isGUID = false)
    +    {
    +        if ($username === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        
    +        $info = $this->info($username, $fields, $isGUID);
    +        
    +        if ($info !== false) {
    +            $collection = new adLDAPUserCollection($info, $this->adldap);
    +            return $collection;
    +        }
    +        return false;
    +    }
    +    
    +    /**
    +    * Determine if a user is in a specific group
    +    * 
    +    * @param string $username The username to query
    +    * @param string $group The name of the group to check against
    +    * @param bool $recursive Check groups recursively
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function inGroup($username, $group, $recursive = NULL, $isGUID = false)
    +    {
    +        if ($username === NULL) { return false; }
    +        if ($group === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        if ($recursive === NULL) { $recursive = $this->adldap->getRecursiveGroups(); } // Use the default option if they haven't set it
    +        
    +        // Get a list of the groups
    +        $groups = $this->groups($username, $recursive, $isGUID);
    +        
    +        // Return true if the specified group is in the group list
    +        if (in_array($group, $groups)) { 
    +            return true; 
    +        }
    +
    +        return false;
    +    }
    +    
    +    /**
    +    * Determine a user's password expiry date
    +    * 
    +    * @param string $username The username to query
    +    * @param book $isGUID Is the username passed a GUID or a samAccountName
    +    * @requires bcmath http://php.net/manual/en/book.bc.php
    +    * @return array
    +    */
    +    public function passwordExpiry($username, $isGUID = false) 
    +    {
    +        if ($username === NULL) { return "Missing compulsory field [username]"; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        if (!function_exists('bcmod')) { throw new adLDAPException("Missing function support [bcmod] http://php.net/manual/en/book.bc.php"); };
    +        
    +        $userInfo = $this->info($username, array("pwdlastset", "useraccountcontrol"), $isGUID);
    +        $pwdLastSet = $userInfo[0]['pwdlastset'][0];
    +        $status = array();
    +        
    +        if ($userInfo[0]['useraccountcontrol'][0] == '66048') {
    +            // Password does not expire
    +            return "Does not expire";
    +        }
    +        if ($pwdLastSet === '0') {
    +            // Password has already expired
    +            return "Password has expired";
    +        }
    +        
    +         // Password expiry in AD can be calculated from TWO values:
    +         //   - User's own pwdLastSet attribute: stores the last time the password was changed
    +         //   - Domain's maxPwdAge attribute: how long passwords last in the domain
    +         //
    +         // Although Microsoft chose to use a different base and unit for time measurements.
    +         // This function will convert them to Unix timestamps
    +         $sr = ldap_read($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), 'objectclass=*', array('maxPwdAge'));
    +         if (!$sr) {
    +             return false;
    +         }
    +         $info = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +         $maxPwdAge = $info[0]['maxpwdage'][0];
    +         
    +
    +         // See MSDN: http://msdn.microsoft.com/en-us/library/ms974598.aspx
    +         //
    +         // pwdLastSet contains the number of 100 nanosecond intervals since January 1, 1601 (UTC), 
    +         // stored in a 64 bit integer. 
    +         //
    +         // The number of seconds between this date and Unix epoch is 11644473600.
    +         //
    +         // maxPwdAge is stored as a large integer that represents the number of 100 nanosecond
    +         // intervals from the time the password was set before the password expires.
    +         //
    +         // We also need to scale this to seconds but also this value is a _negative_ quantity!
    +         //
    +         // If the low 32 bits of maxPwdAge are equal to 0 passwords do not expire
    +         //
    +         // Unfortunately the maths involved are too big for PHP integers, so I've had to require
    +         // BCMath functions to work with arbitrary precision numbers.
    +         if (bcmod($maxPwdAge, 4294967296) === '0') {
    +            return "Domain does not expire passwords";
    +        }
    +        
    +        // Add maxpwdage and pwdlastset and we get password expiration time in Microsoft's
    +        // time units.  Because maxpwd age is negative we need to subtract it.
    +        $pwdExpire = bcsub($pwdLastSet, $maxPwdAge);
    +    
    +        // Convert MS's time to Unix time
    +        $status['expiryts'] = bcsub(bcdiv($pwdExpire, '10000000'), '11644473600');
    +        $status['expiryformat'] = date('Y-m-d H:i:s', bcsub(bcdiv($pwdExpire, '10000000'), '11644473600'));
    +        
    +        return $status;
    +    }
    +    
    +    /**
    +    * Modify a user
    +    * 
    +    * @param string $username The username to query
    +    * @param array $attributes The attributes to modify.  Note if you set the enabled attribute you must not specify any other attributes
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function modify($username, $attributes, $isGUID = false)
    +    {
    +        if ($username === NULL) { return "Missing compulsory field [username]"; }
    +        if (array_key_exists("password", $attributes) && !$this->adldap->getUseSSL() && !$this->adldap->getUseTLS()) { 
    +            throw new adLDAPException('SSL/TLS must be configured on your webserver and enabled in the class to set passwords.');
    +        }
    +
    +        // Find the dn of the user
    +        $userDn = $this->dn($username, $isGUID);
    +        if ($userDn === false) { 
    +            return false; 
    +        }
    +        
    +        // Translate the update to the LDAP schema                
    +        $mod = $this->adldap->adldap_schema($attributes);
    +        
    +        // Check to see if this is an enabled status update
    +        if (!$mod && !array_key_exists("enabled", $attributes)){ 
    +            return false; 
    +        }
    +        
    +        // Set the account control attribute (only if specified)
    +        if (array_key_exists("enabled", $attributes)){
    +            if ($attributes["enabled"]){ 
    +                $controlOptions = array("NORMAL_ACCOUNT"); 
    +            }
    +            else { 
    +                $controlOptions = array("NORMAL_ACCOUNT", "ACCOUNTDISABLE"); 
    +            }
    +            $mod["userAccountControl"][0] = $this->accountControl($controlOptions);
    +        }
    +
    +        // Do the update
    +        $result = @ldap_modify($this->adldap->getLdapConnection(), $userDn, $mod);
    +        if ($result == false) { 
    +            return false; 
    +        }
    +        
    +        return true;
    +    }
    +    
    +    /**
    +    * Disable a user account
    +    * 
    +    * @param string $username The username to disable
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function disable($username, $isGUID = false)
    +    {
    +        if ($username === NULL) { return "Missing compulsory field [username]"; }
    +        $attributes = array("enabled" => 0);
    +        $result = $this->modify($username, $attributes, $isGUID);
    +        if ($result == false) { return false; }
    +        
    +        return true;
    +    }
    +    
    +    /**
    +    * Enable a user account
    +    * 
    +    * @param string $username The username to enable
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function enable($username, $isGUID = false)
    +    {
    +        if ($username === NULL) { return "Missing compulsory field [username]"; }
    +        $attributes = array("enabled" => 1);
    +        $result = $this->modify($username, $attributes, $isGUID);
    +        if ($result == false) { return false; }
    +        
    +        return true;
    +    }
    +    
    +    /**
    +    * Set the password of a user - This must be performed over SSL
    +    * 
    +    * @param string $username The username to modify
    +    * @param string $password The new password
    +    * @param bool $isGUID Is the username passed a GUID or a samAccountName
    +    * @return bool
    +    */
    +    public function password($username, $password, $isGUID = false)
    +    {
    +        if ($username === NULL) { return false; }
    +        if ($password === NULL) { return false; }
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        if (!$this->adldap->getUseSSL() && !$this->adldap->getUseTLS()) { 
    +            throw new adLDAPException('SSL must be configured on your webserver and enabled in the class to set passwords.');
    +        }
    +        
    +        $userDn = $this->dn($username, $isGUID);
    +        if ($userDn === false) { 
    +            return false; 
    +        }
    +                
    +        $add=array();
    +        $add["unicodePwd"][0] = $this->encodePassword($password);
    +        
    +        $result = @ldap_mod_replace($this->adldap->getLdapConnection(), $userDn, $add);
    +        if ($result === false){
    +            $err = ldap_errno($this->adldap->getLdapConnection());
    +            if ($err) {
    +                $msg = 'Error ' . $err . ': ' . ldap_err2str($err) . '.';
    +                if($err == 53) {
    +                    $msg .= ' Your password might not match the password policy.';
    +                }
    +                throw new adLDAPException($msg);
    +            }
    +            else {
    +                return false;
    +            }
    +        }
    +        
    +        return true;
    +    }
    +    
    +    /**
    +    * Encode a password for transmission over LDAP
    +    *
    +    * @param string $password The password to encode
    +    * @return string
    +    */
    +    public function encodePassword($password)
    +    {
    +        $password="\"".$password."\"";
    +        $encoded="";
    +        for ($i=0; $i info($username, array("cn"), $isGUID);
    +        if ($user[0]["dn"] === NULL) { 
    +            return false; 
    +        }
    +        $userDn = $user[0]["dn"];
    +        return $userDn;
    +    }
    +    
    +    /**
    +    * Return a list of all users in AD
    +    * 
    +    * @param bool $includeDescription Return a description of the user
    +    * @param string $search Search parameter
    +    * @param bool $sorted Sort the user accounts
    +    * @return array
    +    */
    +    public function all($includeDescription = false, $search = "*", $sorted = true)
    +    {
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        
    +        // Perform the search and grab all their details
    +        $filter = "(&(objectClass=user)(samaccounttype=" . adLDAP::ADLDAP_NORMAL_ACCOUNT .")(objectCategory=person)(cn=" . $search . "))";
    +        $fields = array("samaccountname","displayname");
    +        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +
    +        $usersArray = array();
    +        for ($i=0; $i<$entries["count"]; $i++){
    +            if ($includeDescription && strlen($entries[$i]["displayname"][0])>0){
    +                $usersArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["displayname"][0];
    +            } elseif ($includeDescription){
    +                $usersArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["samaccountname"][0];
    +            } else {
    +                array_push($usersArray, $entries[$i]["samaccountname"][0]);
    +            }
    +        }
    +        if ($sorted) { 
    +            Sort::asort($usersArray); 
    +        }
    +        return $usersArray;
    +    }
    +    
    +    /**
    +    * Converts a username (samAccountName) to a GUID
    +    * 
    +    * @param string $username The username to query
    +    * @return string
    +    */
    +    public function usernameToGuid($username) 
    +    {
    +        if (!$this->adldap->getLdapBind()){ return false; }
    +        if ($username === null){ return "Missing compulsory field [username]"; }
    +        
    +        $filter = "samaccountname=" . $username; 
    +        $fields = array("objectGUID"); 
    +        $sr = @ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields); 
    +        if (ldap_count_entries($this->adldap->getLdapConnection(), $sr) > 0) { 
    +            $entry = @ldap_first_entry($this->adldap->getLdapConnection(), $sr); 
    +            $guid = @ldap_get_values_len($this->adldap->getLdapConnection(), $entry, 'objectGUID'); 
    +            $strGUID = $this->adldap->utilities()->binaryToText($guid[0]);          
    +            return $strGUID; 
    +        }
    +        return false; 
    +    }
    +    
    +    /**
    +    * Return a list of all users in AD that have a specific value in a field
    +    *
    +    * @param bool $includeDescription Return a description of the user
    +    * @param string $searchField Field to search search for
    +    * @param string $searchFilter Value to search for in the specified field
    +    * @param bool $sorted Sort the user accounts
    +    * @return array
    +    */
    +    public function find($includeDescription = false, $searchField = false, $searchFilter = false, $sorted = true){
    +        if (!$this->adldap->getLdapBind()){ return false; }
    +          
    +        // Perform the search and grab all their details
    +        $searchParams = "";
    +        if ($searchField) {
    +            $searchParams = "(" . $searchField . "=" . $searchFilter . ")";
    +        }                           
    +        $filter = "(&(objectClass=user)(samaccounttype=" . adLDAP::ADLDAP_NORMAL_ACCOUNT .")(objectCategory=person)" . $searchParams . ")";
    +        $fields = array("samaccountname","displayname");
    +        $sr = ldap_search($this->adldap->getLdapConnection(), $this->adldap->getBaseDn(), $filter, $fields);
    +        $entries = ldap_get_entries($this->adldap->getLdapConnection(), $sr);
    +
    +        $usersArray = array();
    +        for ($i=0; $i < $entries["count"]; $i++) {
    +            if ($includeDescription && strlen($entries[$i]["displayname"][0]) > 0) {
    +                $usersArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["displayname"][0];
    +            }
    +            else if ($includeDescription) {
    +                $usersArray[$entries[$i]["samaccountname"][0]] = $entries[$i]["samaccountname"][0];
    +            }
    +            else {
    +                array_push($usersArray, $entries[$i]["samaccountname"][0]);
    +            }
    +        }
    +        if ($sorted){ 
    +          Sort::asort($usersArray); 
    +        }
    +        return ($usersArray);
    +    }
    +    
    +    /**
    +    * Move a user account to a different OU
    +    *
    +    * @param string $username The username to move (please be careful here!)
    +    * @param array $container The container or containers to move the user to (please be careful here!).
    +    * accepts containers in 1. parent 2. child order
    +    * @return array
    +    */
    +    public function move($username, $container) 
    +    {
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        if ($username === null) { return "Missing compulsory field [username]"; }
    +        if ($container === null) { return "Missing compulsory field [container]"; }
    +        if (!is_array($container)) { return "Container must be an array"; }
    +        
    +        $userInfo = $this->info($username, array("*"));
    +        $dn = $userInfo[0]['distinguishedname'][0];
    +        $newRDn = "cn=" . $username;
    +        $container = array_reverse($container);
    +        $newContainer = "ou=" . implode(",ou=",$container);
    +        $newBaseDn = strtolower($newContainer) . "," . $this->adldap->getBaseDn();
    +        $result = @ldap_rename($this->adldap->getLdapConnection(), $dn, $newRDn, $newBaseDn, true);
    +        if ($result !== true) {
    +            return false;
    +        }
    +        return true;
    +    }
    +    
    +    /**
    +    * Get the last logon time of any user as a Unix timestamp
    +    * 
    +    * @param string $username
    +    * @return long $unixTimestamp
    +    */
    +    public function getLastLogon($username) {
    +        if (!$this->adldap->getLdapBind()) { return false; }
    +        if ($username === null) { return "Missing compulsory field [username]"; }
    +        $userInfo = $this->info($username, array("lastLogonTimestamp"));
    +        $lastLogon = adLDAPUtils::convertWindowsTimeToUnixTime($userInfo[0]['lastLogonTimestamp'][0]);
    +        return $lastLogon;
    +    }
    +    
    +}
    +?>
    diff --git a/lib/plugins/authad/adLDAP/classes/adLDAPUtils.php b/lib/plugins/authad/adLDAP/classes/adLDAPUtils.php
    new file mode 100644
    index 0000000..6f94fe2
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/classes/adLDAPUtils.php
    @@ -0,0 +1,268 @@
    +adldap = $adldap;
    +    }
    +    
    +    
    +    /**
    +    * Take an LDAP query and return the nice names, without all the LDAP prefixes (eg. CN, DN)
    +    *
    +    * @param array $groups
    +    * @return array
    +    */
    +    public function niceNames($groups)
    +    {
    +
    +        $groupArray = array();
    +        for ($i=0; $i<$groups["count"]; $i++){ // For each group
    +            $line = $groups[$i];
    +            
    +            if (strlen($line)>0) { 
    +                // More presumptions, they're all prefixed with CN=
    +                // so we ditch the first three characters and the group
    +                // name goes up to the first comma
    +                $bits=explode(",", $line);
    +                $groupArray[] = substr($bits[0], 3, (strlen($bits[0])-3));
    +            }
    +        }
    +        return $groupArray;    
    +    }
    +    
    +    /**
    +    * Escape characters for use in an ldap_create function
    +    * 
    +    * @param string $str
    +    * @return string
    +    */
    +    public function escapeCharacters($str) {
    +        $str = str_replace(",", "\,", $str);
    +        return $str;
    +    }
    +    
    +    /**
    +    * Escape strings for the use in LDAP filters
    +    * 
    +    * DEVELOPERS SHOULD BE DOING PROPER FILTERING IF THEY'RE ACCEPTING USER INPUT
    +    * Ported from Perl's Net::LDAP::Util escape_filter_value
    +    *
    +    * @param string $str The string the parse
    +    * @author Port by Andreas Gohr 
    +    * @return string
    +    */
    +    public function ldapSlashes($str) {
    +        // see https://github.com/adldap/adLDAP/issues/22
    +        return preg_replace_callback(
    +            '/([\x00-\x1F\*\(\)\\\\])/',
    +            function ($matches) {
    +                return "\\".join("", unpack("H2", $matches[1]));
    +            },
    +            $str
    +        );
    +    }
    +    /**
    +    * Converts a string GUID to a hexdecimal value so it can be queried
    +    *
    +    * @param string $strGUID A string representation of a GUID
    +    * @return string
    +    */
    +    public function strGuidToHex($strGUID)
    +    {
    +        $strGUID = str_replace('-', '', $strGUID);
    +
    +        $octet_str = '\\' . substr($strGUID, 6, 2);
    +        $octet_str .= '\\' . substr($strGUID, 4, 2);
    +        $octet_str .= '\\' . substr($strGUID, 2, 2);
    +        $octet_str .= '\\' . substr($strGUID, 0, 2);
    +        $octet_str .= '\\' . substr($strGUID, 10, 2);
    +        $octet_str .= '\\' . substr($strGUID, 8, 2);
    +        $octet_str .= '\\' . substr($strGUID, 14, 2);
    +        $octet_str .= '\\' . substr($strGUID, 12, 2);
    +        //$octet_str .= '\\' . substr($strGUID, 16, strlen($strGUID));
    +        for ($i=16; $i<=(strlen($strGUID)-2); $i++) {
    +            if (($i % 2) == 0) {
    +                $octet_str .= '\\' . substr($strGUID, $i, 2);
    +            }
    +        }
    +        
    +        return $octet_str;
    +    }
    +    
    +    /**
    +    * Convert a binary SID to a text SID
    +    * 
    +    * @param string $binsid A Binary SID
    +    * @return string
    +    */
    +     public function getTextSID($binsid) {
    +        $hex_sid = bin2hex($binsid);
    +        $rev = hexdec(substr($hex_sid, 0, 2));
    +        $subcount = hexdec(substr($hex_sid, 2, 2));
    +        $auth = hexdec(substr($hex_sid, 4, 12));
    +        $result = "$rev-$auth";
    +
    +        for ($x=0;$x < $subcount; $x++) {
    +            $subauth[$x] =
    +                hexdec($this->littleEndian(substr($hex_sid, 16 + ($x * 8), 8)));
    +                $result .= "-" . $subauth[$x];
    +        }
    +
    +        // Cheat by tacking on the S-
    +        return 'S-' . $result;
    +     }
    +     
    +    /**
    +    * Converts a little-endian hex number to one that hexdec() can convert
    +    * 
    +    * @param string $hex A hex code
    +    * @return string
    +    */
    +     public function littleEndian($hex) 
    +     {
    +        $result = '';
    +        for ($x = strlen($hex) - 2; $x >= 0; $x = $x - 2) {
    +            $result .= substr($hex, $x, 2);
    +        }
    +        return $result;
    +     }
    +     
    +     /**
    +    * Converts a binary attribute to a string
    +    * 
    +    * @param string $bin A binary LDAP attribute
    +    * @return string
    +    */
    +    public function binaryToText($bin) 
    +    {
    +        $hex_guid = bin2hex($bin); 
    +        $hex_guid_to_guid_str = ''; 
    +        for($k = 1; $k <= 4; ++$k) { 
    +            $hex_guid_to_guid_str .= substr($hex_guid, 8 - 2 * $k, 2); 
    +        } 
    +        $hex_guid_to_guid_str .= '-'; 
    +        for($k = 1; $k <= 2; ++$k) { 
    +            $hex_guid_to_guid_str .= substr($hex_guid, 12 - 2 * $k, 2); 
    +        } 
    +        $hex_guid_to_guid_str .= '-'; 
    +        for($k = 1; $k <= 2; ++$k) { 
    +            $hex_guid_to_guid_str .= substr($hex_guid, 16 - 2 * $k, 2); 
    +        } 
    +        $hex_guid_to_guid_str .= '-' . substr($hex_guid, 16, 4); 
    +        $hex_guid_to_guid_str .= '-' . substr($hex_guid, 20); 
    +        return strtoupper($hex_guid_to_guid_str);   
    +    }
    +    
    +    /**
    +    * Converts a binary GUID to a string GUID
    +    * 
    +    * @param string $binaryGuid The binary GUID attribute to convert
    +    * @return string
    +    */
    +    public function decodeGuid($binaryGuid) 
    +    {
    +        if ($binaryGuid === null){ return "Missing compulsory field [binaryGuid]"; }
    +        
    +        $strGUID = $this->binaryToText($binaryGuid);          
    +        return $strGUID; 
    +    }
    +    
    +    /**
    +    * Convert a boolean value to a string
    +    * You should never need to call this yourself
    +    *
    +    * @param bool $bool Boolean value
    +    * @return string
    +    */
    +    public function boolToStr($bool) 
    +    {
    +        return ($bool) ? 'TRUE' : 'FALSE';
    +    }
    +    
    +    /**
    +    * Convert 8bit characters e.g. accented characters to UTF8 encoded characters
    +    */
    +    public function encode8Bit(&$item, $key) {
    +        $encode = false;
    +        if (is_string($item)) {
    +            for ($i=0; $i> 7) {
    +                    $encode = true;
    +                }
    +            }
    +        }
    +        if ($encode === true && $key != 'password') {
    +            $item = utf8_encode($item);   
    +        }
    +    }  
    +    
    +    /**
    +    * Get the current class version number
    +    * 
    +    * @return string
    +    */
    +    public function getVersion() {
    +        return self::ADLDAP_VERSION;
    +    }
    +    
    +    /**
    +    * Round a Windows timestamp down to seconds and remove the seconds between 1601-01-01 and 1970-01-01
    +    * 
    +    * @param long $windowsTime
    +    * @return long $unixTime
    +    */
    +    public static function convertWindowsTimeToUnixTime($windowsTime) {
    +      $unixTime = round($windowsTime / 10000000) - 11644477200; 
    +      return $unixTime; 
    +    }
    +}
    +
    +?>
    diff --git a/lib/plugins/authad/adLDAP/collections/adLDAPCollection.php b/lib/plugins/authad/adLDAP/collections/adLDAPCollection.php
    new file mode 100644
    index 0000000..433d39f
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/collections/adLDAPCollection.php
    @@ -0,0 +1,137 @@
    +setInfo($info);   
    +        $this->adldap = $adldap;
    +    }
    +    
    +    /**
    +    * Set the raw info array from Active Directory
    +    * 
    +    * @param array $info
    +    */
    +    public function setInfo(array $info) 
    +    {
    +        if ($this->info && sizeof($info) >= 1) {
    +            unset($this->info);
    +        }
    +        $this->info = $info;   
    +    }
    +    
    +    /**
    +    * Magic get method to retrieve data from the raw array in a formatted way
    +    * 
    +    * @param string $attribute
    +    * @return mixed
    +    */
    +    public function __get($attribute)
    +    {
    +        if (isset($this->info[0]) && is_array($this->info[0])) {
    +            foreach ($this->info[0] as $keyAttr => $valueAttr) {
    +                if (strtolower($keyAttr) == strtolower($attribute)) {
    +                    if ($this->info[0][strtolower($attribute)]['count'] == 1) {
    +                        return $this->info[0][strtolower($attribute)][0];   
    +                    }
    +                    else {
    +                        $array = array();
    +                        foreach ($this->info[0][strtolower($attribute)] as $key => $value) {
    +                            if ((string)$key != 'count') {
    +                                $array[$key] = $value;
    +                            } 
    +                        }  
    +                        return $array;   
    +                    }
    +                }   
    +            }
    +        }
    +        else {
    +            return NULL;   
    +        }
    +    }    
    +    
    +    /**
    +    * Magic set method to update an attribute
    +    * 
    +    * @param string $attribute
    +    * @param string $value
    +    * @return bool
    +    */
    +    abstract public function __set($attribute, $value);
    +    
    +    /** 
    +    * Magic isset method to check for the existence of an attribute 
    +    * 
    +    * @param string $attribute 
    +    * @return bool 
    +    */ 
    +    public function __isset($attribute) {
    +        if (isset($this->info[0]) && is_array($this->info[0])) { 
    +            foreach ($this->info[0] as $keyAttr => $valueAttr) { 
    +                if (strtolower($keyAttr) == strtolower($attribute)) { 
    +                    return true; 
    +                } 
    +            } 
    +        } 
    +        return false; 
    +     } 
    +}
    +?>
    diff --git a/lib/plugins/authad/adLDAP/collections/adLDAPComputerCollection.php b/lib/plugins/authad/adLDAP/collections/adLDAPComputerCollection.php
    new file mode 100644
    index 0000000..09f82ca
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/collections/adLDAPComputerCollection.php
    @@ -0,0 +1,46 @@
    +
    diff --git a/lib/plugins/authad/adLDAP/collections/adLDAPContactCollection.php b/lib/plugins/authad/adLDAP/collections/adLDAPContactCollection.php
    new file mode 100644
    index 0000000..a9efad5
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/collections/adLDAPContactCollection.php
    @@ -0,0 +1,46 @@
    +
    diff --git a/lib/plugins/authad/adLDAP/collections/adLDAPGroupCollection.php b/lib/plugins/authad/adLDAP/collections/adLDAPGroupCollection.php
    new file mode 100644
    index 0000000..ef4af8d
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/collections/adLDAPGroupCollection.php
    @@ -0,0 +1,46 @@
    +
    diff --git a/lib/plugins/authad/adLDAP/collections/adLDAPUserCollection.php b/lib/plugins/authad/adLDAP/collections/adLDAPUserCollection.php
    new file mode 100644
    index 0000000..63fce5f
    --- /dev/null
    +++ b/lib/plugins/authad/adLDAP/collections/adLDAPUserCollection.php
    @@ -0,0 +1,46 @@
    +
    diff --git a/lib/plugins/authad/auth.php b/lib/plugins/authad/auth.php
    new file mode 100644
    index 0000000..d5fd528
    --- /dev/null
    +++ b/lib/plugins/authad/auth.php
    @@ -0,0 +1,804 @@
    +
    + * @link    http://www.nosq.com/blog/2005/08/ldap-activedirectory-and-dokuwiki/
    + * @author  Andreas Gohr 
    + * @author  Jan Schumann 
    + */
    +class auth_plugin_authad extends AuthPlugin
    +{
    +    /**
    +     * @var array hold connection data for a specific AD domain
    +     */
    +    protected $opts = [];
    +
    +    /**
    +     * @var array open connections for each AD domain, as adLDAP objects
    +     */
    +    protected $adldap = [];
    +
    +    /**
    +     * @var bool message state
    +     */
    +    protected $msgshown = false;
    +
    +    /**
    +     * @var array user listing cache
    +     */
    +    protected $users = [];
    +
    +    /**
    +     * @var array filter patterns for listing users
    +     */
    +    protected $pattern = [];
    +
    +    protected $grpsusers = [];
    +
    +    /**
    +     * Constructor
    +     */
    +    public function __construct()
    +    {
    +        global $INPUT;
    +        parent::__construct();
    +
    +        require_once(DOKU_PLUGIN . 'authad/adLDAP/adLDAP.php');
    +        require_once(DOKU_PLUGIN . 'authad/adLDAP/classes/adLDAPUtils.php');
    +
    +        // we load the config early to modify it a bit here
    +        $this->loadConfig();
    +
    +        // additional information fields
    +        if (isset($this->conf['additional'])) {
    +            $this->conf['additional'] = str_replace(' ', '', $this->conf['additional']);
    +            $this->conf['additional'] = explode(',', $this->conf['additional']);
    +        } else $this->conf['additional'] = [];
    +
    +        // ldap extension is needed
    +        if (!function_exists('ldap_connect')) {
    +            if ($this->conf['debug'])
    +                msg("AD Auth: PHP LDAP extension not found.", -1);
    +            $this->success = false;
    +            return;
    +        }
    +
    +        // Prepare SSO
    +        if (!empty($INPUT->server->str('REMOTE_USER'))) {
    +            // make sure the right encoding is used
    +            if ($this->getConf('sso_charset')) {
    +                $INPUT->server->set(
    +                    'REMOTE_USER',
    +                    iconv($this->getConf('sso_charset'), 'UTF-8', $INPUT->server->str('REMOTE_USER'))
    +                );
    +            } elseif (!Clean::isUtf8($INPUT->server->str('REMOTE_USER'))) {
    +                $INPUT->server->set('REMOTE_USER', utf8_encode($INPUT->server->str('REMOTE_USER')));
    +            }
    +
    +            // trust the incoming user
    +            if ($this->conf['sso']) {
    +                $INPUT->server->set('REMOTE_USER', $this->cleanUser($INPUT->server->str('REMOTE_USER')));
    +
    +                // we need to simulate a login
    +                if (empty($_COOKIE[DOKU_COOKIE])) {
    +                    $INPUT->set('u', $INPUT->server->str('REMOTE_USER'));
    +                    $INPUT->set('p', 'sso_only');
    +                }
    +            }
    +        }
    +
    +        // other can do's are changed in $this->_loadServerConfig() base on domain setup
    +        $this->cando['modName'] = (bool)$this->conf['update_name'];
    +        $this->cando['modMail'] = (bool)$this->conf['update_mail'];
    +        $this->cando['getUserCount'] = true;
    +    }
    +
    +    /**
    +     * Load domain config on capability check
    +     *
    +     * @param string $cap
    +     * @return bool
    +     */
    +    public function canDo($cap)
    +    {
    +        global $INPUT;
    +        //capabilities depend on config, which may change depending on domain
    +        $domain = $this->getUserDomain($INPUT->server->str('REMOTE_USER'));
    +        $this->loadServerConfig($domain);
    +        return parent::canDo($cap);
    +    }
    +
    +    /**
    +     * Check user+password [required auth function]
    +     *
    +     * Checks if the given user exists and the given
    +     * plaintext password is correct by trying to bind
    +     * to the LDAP server
    +     *
    +     * @author  James Van Lommel 
    +     * @param string $user
    +     * @param string $pass
    +     * @return  bool
    +     */
    +    public function checkPass($user, $pass)
    +    {
    +        global $INPUT;
    +        if (
    +            $INPUT->server->str('REMOTE_USER') == $user &&
    +            $this->conf['sso']
    +        ) return true;
    +
    +        $adldap = $this->initAdLdap($this->getUserDomain($user));
    +        if (!$adldap) return false;
    +
    +        try {
    +            return $adldap->authenticate($this->getUserName($user), $pass);
    +        } catch (adLDAPException $e) {
    +            // shouldn't really happen
    +            return false;
    +        }
    +    }
    +
    +    /**
    +     * Return user info [required auth function]
    +     *
    +     * Returns info about the given user needs to contain
    +     * at least these fields:
    +     *
    +     * name    string  full name of the user
    +     * mail    string  email address of the user
    +     * grps    array   list of groups the user is in
    +     *
    +     * This AD specific function returns the following
    +     * addional fields:
    +     *
    +     * dn         string    distinguished name (DN)
    +     * uid        string    samaccountname
    +     * lastpwd    int       timestamp of the date when the password was set
    +     * expires    true      if the password expires
    +     * expiresin  int       seconds until the password expires
    +     * any fields specified in the 'additional' config option
    +     *
    +     * @author  James Van Lommel 
    +     * @param string $user
    +     * @param bool $requireGroups (optional) - ignored, groups are always supplied by this plugin
    +     * @return array|false
    +     */
    +    public function getUserData($user, $requireGroups = true)
    +    {
    +        global $conf;
    +        global $lang;
    +        global $ID;
    +        global $INPUT;
    +        $adldap = $this->initAdLdap($this->getUserDomain($user));
    +        if (!$adldap) return false;
    +        if ($user == '') return false;
    +
    +        $fields = ['mail', 'displayname', 'samaccountname', 'lastpwd', 'pwdlastset', 'useraccountcontrol'];
    +
    +        // add additional fields to read
    +        $fields = array_merge($fields, $this->conf['additional']);
    +        $fields = array_unique($fields);
    +        $fields = array_filter($fields);
    +
    +        //get info for given user
    +        $result = $adldap->user()->info($this->getUserName($user), $fields);
    +        if ($result == false) {
    +            return false;
    +        }
    +
    +        //general user info
    +        $info = [];
    +        $info['name'] = $result[0]['displayname'][0];
    +        $info['mail'] = $result[0]['mail'][0];
    +        $info['uid']  = $result[0]['samaccountname'][0];
    +        $info['dn']   = $result[0]['dn'];
    +        //last password set (Windows counts from January 1st 1601)
    +        $info['lastpwd'] = $result[0]['pwdlastset'][0] / 10_000_000 - 11_644_473_600;
    +        //will it expire?
    +        $info['expires'] = !($result[0]['useraccountcontrol'][0] & 0x10000); //ADS_UF_DONT_EXPIRE_PASSWD
    +
    +        // additional information
    +        foreach ($this->conf['additional'] as $field) {
    +            if (isset($result[0][strtolower($field)])) {
    +                $info[$field] = $result[0][strtolower($field)][0];
    +            }
    +        }
    +
    +        // handle ActiveDirectory memberOf
    +        $info['grps'] = $adldap->user()->groups($this->getUserName($user), (bool) $this->opts['recursive_groups']);
    +
    +        if (is_array($info['grps'])) {
    +            foreach ($info['grps'] as $ndx => $group) {
    +                $info['grps'][$ndx] = $this->cleanGroup($group);
    +            }
    +        } else {
    +            $info['grps'] = [];
    +        }
    +
    +        // always add the default group to the list of groups
    +        if (!in_array($conf['defaultgroup'], $info['grps'])) {
    +            $info['grps'][] = $conf['defaultgroup'];
    +        }
    +
    +        // add the user's domain to the groups
    +        $domain = $this->getUserDomain($user);
    +        if ($domain && !in_array("domain-$domain", $info['grps'])) {
    +            $info['grps'][] = $this->cleanGroup("domain-$domain");
    +        }
    +
    +        // check expiry time
    +        if ($info['expires'] && $this->conf['expirywarn']) {
    +            try {
    +                $expiry = $adldap->user()->passwordExpiry($user);
    +                if (is_array($expiry)) {
    +                    $info['expiresat'] = $expiry['expiryts'];
    +                    $info['expiresin'] = round(($info['expiresat'] - time()) / (24 * 60 * 60));
    +
    +                    // if this is the current user, warn him (once per request only)
    +                    if (
    +                        ($INPUT->server->str('REMOTE_USER') == $user) &&
    +                        ($info['expiresin'] <= $this->conf['expirywarn']) &&
    +                        !$this->msgshown
    +                    ) {
    +                        $msg = sprintf($this->getLang('authpwdexpire'), $info['expiresin']);
    +                        if ($this->canDo('modPass')) {
    +                            $url = wl($ID, ['do' => 'profile']);
    +                            $msg .= ' ' . $lang['btn_profile'] . '';
    +                        }
    +                        msg($msg);
    +                        $this->msgshown = true;
    +                    }
    +                }
    +            } catch (adLDAPException $e) {
    +                // ignore. should usually not happen
    +            }
    +        }
    +
    +        return $info;
    +    }
    +
    +    /**
    +     * Make AD group names usable by DokuWiki.
    +     *
    +     * Removes backslashes ('\'), pound signs ('#'), and converts spaces to underscores.
    +     *
    +     * @author  James Van Lommel (jamesvl@gmail.com)
    +     * @param string $group
    +     * @return string
    +     */
    +    public function cleanGroup($group)
    +    {
    +        $group = str_replace('\\', '', $group);
    +        $group = str_replace('#', '', $group);
    +        $group = preg_replace('[\s]', '_', $group);
    +        $group = PhpString::strtolower(trim($group));
    +        return $group;
    +    }
    +
    +    /**
    +     * Sanitize user names
    +     *
    +     * Normalizes domain parts, does not modify the user name itself (unlike cleanGroup)
    +     *
    +     * @author Andreas Gohr 
    +     * @param string $user
    +     * @return string
    +     */
    +    public function cleanUser($user)
    +    {
    +        $domain = '';
    +
    +        // get NTLM or Kerberos domain part
    +        [$dom, $user] = sexplode('\\', $user, 2, '');
    +        if (!$user) $user = $dom;
    +        if ($dom) $domain = $dom;
    +        [$user, $dom] = sexplode('@', $user, 2, '');
    +        if ($dom) $domain = $dom;
    +
    +        // clean up both
    +        $domain = PhpString::strtolower(trim($domain));
    +        $user   = PhpString::strtolower(trim($user));
    +
    +        // is this a known, valid domain or do we work without account suffix? if not discard
    +        if (
    +            (!isset($this->conf[$domain]) || !is_array($this->conf[$domain])) &&
    +            $this->conf['account_suffix'] !== ''
    +        ) {
    +            $domain = '';
    +        }
    +
    +        // reattach domain
    +        if ($domain) $user = "$user@$domain";
    +        return $user;
    +    }
    +
    +    /**
    +     * Most values in LDAP are case-insensitive
    +     *
    +     * @return bool
    +     */
    +    public function isCaseSensitive()
    +    {
    +        return false;
    +    }
    +
    +    /**
    +     * Create a Search-String useable by adLDAPUsers::all($includeDescription = false, $search = "*", $sorted = true)
    +     *
    +     * @param array $filter
    +     * @return string
    +     */
    +    protected function constructSearchString($filter)
    +    {
    +        if (!$filter) {
    +            return '*';
    +        }
    +        $adldapUtils = new adLDAPUtils($this->initAdLdap(null));
    +        $result = '*';
    +        if (isset($filter['name'])) {
    +            $result .= ')(displayname=*' . $adldapUtils->ldapSlashes($filter['name']) . '*';
    +            unset($filter['name']);
    +        }
    +
    +        if (isset($filter['user'])) {
    +            $result .= ')(samAccountName=*' . $adldapUtils->ldapSlashes($filter['user']) . '*';
    +            unset($filter['user']);
    +        }
    +
    +        if (isset($filter['mail'])) {
    +            $result .= ')(mail=*' . $adldapUtils->ldapSlashes($filter['mail']) . '*';
    +            unset($filter['mail']);
    +        }
    +        return $result;
    +    }
    +
    +    /**
    +     * Return a count of the number of user which meet $filter criteria
    +     *
    +     * @param array $filter  $filter array of field/pattern pairs, empty array for no filter
    +     * @return int number of users
    +     */
    +    public function getUserCount($filter = [])
    +    {
    +        $adldap = $this->initAdLdap(null);
    +        if (!$adldap) {
    +            Logger::debug("authad/auth.php getUserCount(): _adldap not set.");
    +            return -1;
    +        }
    +        if ($filter == []) {
    +            $result = $adldap->user()->all();
    +        } else {
    +            $searchString = $this->constructSearchString($filter);
    +            $result = $adldap->user()->all(false, $searchString);
    +            if (isset($filter['grps'])) {
    +                $this->users = array_fill_keys($result, false);
    +                /** @var admin_plugin_usermanager $usermanager */
    +                $usermanager = plugin_load("admin", "usermanager", false);
    +                $usermanager->setLastdisabled(true);
    +                if (!isset($this->grpsusers[$this->filterToString($filter)])) {
    +                    $this->fillGroupUserArray($filter, $usermanager->getStart() + 3 * $usermanager->getPagesize());
    +                } elseif (
    +                    count($this->grpsusers[$this->filterToString($filter)]) <
    +                    $usermanager->getStart() + 3 * $usermanager->getPagesize()
    +                ) {
    +                    $this->fillGroupUserArray(
    +                        $filter,
    +                        $usermanager->getStart() +
    +                        3 * $usermanager->getPagesize() -
    +                        count($this->grpsusers[$this->filterToString($filter)])
    +                    );
    +                }
    +                $result = $this->grpsusers[$this->filterToString($filter)];
    +            } else {
    +                /** @var admin_plugin_usermanager $usermanager */
    +                $usermanager = plugin_load("admin", "usermanager", false);
    +                $usermanager->setLastdisabled(false);
    +            }
    +        }
    +
    +        if (!$result) {
    +            return 0;
    +        }
    +        return count($result);
    +    }
    +
    +    /**
    +     *
    +     * create a unique string for each filter used with a group
    +     *
    +     * @param array $filter
    +     * @return string
    +     */
    +    protected function filterToString($filter)
    +    {
    +        $result = '';
    +        if (isset($filter['user'])) {
    +            $result .= 'user-' . $filter['user'];
    +        }
    +        if (isset($filter['name'])) {
    +            $result .= 'name-' . $filter['name'];
    +        }
    +        if (isset($filter['mail'])) {
    +            $result .= 'mail-' . $filter['mail'];
    +        }
    +        if (isset($filter['grps'])) {
    +            $result .= 'grps-' . $filter['grps'];
    +        }
    +        return $result;
    +    }
    +
    +    /**
    +     * Create an array of $numberOfAdds users passing a certain $filter, including belonging
    +     * to a certain group and save them to a object-wide array. If the array
    +     * already exists try to add $numberOfAdds further users to it.
    +     *
    +     * @param array $filter
    +     * @param int $numberOfAdds additional number of users requested
    +     * @return int number of Users actually add to Array
    +     */
    +    protected function fillGroupUserArray($filter, $numberOfAdds)
    +    {
    +        if (isset($this->grpsusers[$this->filterToString($filter)])) {
    +            $actualstart = count($this->grpsusers[$this->filterToString($filter)]);
    +        } else {
    +            $this->grpsusers[$this->filterToString($filter)] = [];
    +            $actualstart = 0;
    +        }
    +
    +        $i = 0;
    +        $count = 0;
    +        $this->constructPattern($filter);
    +        foreach ($this->users as $user => &$info) {
    +            if ($i++ < $actualstart) {
    +                continue;
    +            }
    +            if ($info === false) {
    +                $info = $this->getUserData($user);
    +            }
    +            if ($this->filter($user, $info)) {
    +                $this->grpsusers[$this->filterToString($filter)][$user] = $info;
    +                if (($numberOfAdds > 0) && (++$count >= $numberOfAdds)) break;
    +            }
    +        }
    +        return $count;
    +    }
    +
    +    /**
    +     * Bulk retrieval of user data
    +     *
    +     * @author  Dominik Eckelmann 
    +     *
    +     * @param   int $start index of first user to be returned
    +     * @param   int $limit max number of users to be returned
    +     * @param   array $filter array of field/pattern pairs, null for no filter
    +     * @return array userinfo (refer getUserData for internal userinfo details)
    +     */
    +    public function retrieveUsers($start = 0, $limit = 0, $filter = [])
    +    {
    +        $adldap = $this->initAdLdap(null);
    +        if (!$adldap) return [];
    +
    +        //if (!$this->users) {
    +            //get info for given user
    +            $result = $adldap->user()->all(false, $this->constructSearchString($filter));
    +            if (!$result) return [];
    +            $this->users = array_fill_keys($result, false);
    +        //}
    +
    +        $i     = 0;
    +        $count = 0;
    +        $result = [];
    +
    +        if (!isset($filter['grps'])) {
    +            /** @var admin_plugin_usermanager $usermanager */
    +            $usermanager = plugin_load("admin", "usermanager", false);
    +            $usermanager->setLastdisabled(false);
    +            $this->constructPattern($filter);
    +            foreach ($this->users as $user => &$info) {
    +                if ($i++ < $start) {
    +                    continue;
    +                }
    +                if ($info === false) {
    +                    $info = $this->getUserData($user);
    +                }
    +                $result[$user] = $info;
    +                if (($limit > 0) && (++$count >= $limit)) break;
    +            }
    +        } else {
    +            /** @var admin_plugin_usermanager $usermanager */
    +            $usermanager = plugin_load("admin", "usermanager", false);
    +            $usermanager->setLastdisabled(true);
    +            if (
    +                !isset($this->grpsusers[$this->filterToString($filter)]) ||
    +                count($this->grpsusers[$this->filterToString($filter)]) < ($start + $limit)
    +            ) {
    +                if (!isset($this->grpsusers[$this->filterToString($filter)])) {
    +                    $this->grpsusers[$this->filterToString($filter)] = [];
    +                }
    +
    +                $this->fillGroupUserArray(
    +                    $filter,
    +                    $start + $limit - count($this->grpsusers[$this->filterToString($filter)]) + 1
    +                );
    +            }
    +            if (!$this->grpsusers[$this->filterToString($filter)]) return [];
    +            foreach ($this->grpsusers[$this->filterToString($filter)] as $user => &$info) {
    +                if ($i++ < $start) {
    +                    continue;
    +                }
    +                $result[$user] = $info;
    +                if (($limit > 0) && (++$count >= $limit)) break;
    +            }
    +        }
    +        return $result;
    +    }
    +
    +    /**
    +     * Modify user data
    +     *
    +     * @param   string $user      nick of the user to be changed
    +     * @param   array  $changes   array of field/value pairs to be changed
    +     * @return  bool
    +     */
    +    public function modifyUser($user, $changes)
    +    {
    +        $return = true;
    +        $adldap = $this->initAdLdap($this->getUserDomain($user));
    +        if (!$adldap) {
    +            msg($this->getLang('connectfail'), -1);
    +            return false;
    +        }
    +
    +        // password changing
    +        if (isset($changes['pass'])) {
    +            try {
    +                $return = $adldap->user()->password($this->getUserName($user), $changes['pass']);
    +            } catch (adLDAPException $e) {
    +                if ($this->conf['debug']) msg('AD Auth: ' . $e->getMessage(), -1);
    +                $return = false;
    +            }
    +            if (!$return) msg($this->getLang('passchangefail'), -1);
    +        }
    +
    +        // changing user data
    +        $adchanges = [];
    +        if (isset($changes['name'])) {
    +            // get first and last name
    +            $parts                     = explode(' ', $changes['name']);
    +            $adchanges['surname']      = array_pop($parts);
    +            $adchanges['firstname']    = implode(' ', $parts);
    +            $adchanges['display_name'] = $changes['name'];
    +        }
    +        if (isset($changes['mail'])) {
    +            $adchanges['email'] = $changes['mail'];
    +        }
    +        if ($adchanges !== []) {
    +            try {
    +                $return &= $adldap->user()->modify($this->getUserName($user), $adchanges);
    +            } catch (adLDAPException $e) {
    +                if ($this->conf['debug']) msg('AD Auth: ' . $e->getMessage(), -1);
    +                $return = false;
    +            }
    +            if (!$return) msg($this->getLang('userchangefail'), -1);
    +        }
    +
    +        return $return;
    +    }
    +
    +    /**
    +     * Initialize the AdLDAP library and connect to the server
    +     *
    +     * When you pass null as domain, it will reuse any existing domain.
    +     * Eg. the one of the logged in user. It falls back to the default
    +     * domain if no current one is available.
    +     *
    +     * @param string|null $domain The AD domain to use
    +     * @return adLDAP|bool true if a connection was established
    +     */
    +    protected function initAdLdap($domain)
    +    {
    +        if (is_null($domain) && is_array($this->opts)) {
    +            $domain = $this->opts['domain'];
    +        }
    +
    +        $this->opts = $this->loadServerConfig((string) $domain);
    +        if (isset($this->adldap[$domain])) return $this->adldap[$domain];
    +
    +        // connect
    +        try {
    +            $this->adldap[$domain] = new adLDAP($this->opts);
    +            return $this->adldap[$domain];
    +        } catch (Exception $e) {
    +            if ($this->conf['debug']) {
    +                msg('AD Auth: ' . $e->getMessage(), -1);
    +            }
    +            $this->success         = false;
    +            $this->adldap[$domain] = null;
    +        }
    +        return false;
    +    }
    +
    +    /**
    +     * Get the domain part from a user
    +     *
    +     * @param string $user
    +     * @return string
    +     */
    +    public function getUserDomain($user)
    +    {
    +        [, $domain] = sexplode('@', $user, 2, '');
    +        return $domain;
    +    }
    +
    +    /**
    +     * Get the user part from a user
    +     *
    +     * When an account suffix is set, we strip the domain part from the user
    +     *
    +     * @param string $user
    +     * @return string
    +     */
    +    public function getUserName($user)
    +    {
    +        if ($this->conf['account_suffix'] !== '') {
    +            [$user] = explode('@', $user, 2);
    +        }
    +        return $user;
    +    }
    +
    +    /**
    +     * Fetch the configuration for the given AD domain
    +     *
    +     * @param string $domain current AD domain
    +     * @return array
    +     */
    +    protected function loadServerConfig($domain)
    +    {
    +        // prepare adLDAP standard configuration
    +        $opts = $this->conf;
    +
    +        $opts['domain'] = $domain;
    +
    +        // add possible domain specific configuration
    +        if ($domain && is_array($this->conf[$domain] ?? '')) foreach ($this->conf[$domain] as $key => $val) {
    +            $opts[$key] = $val;
    +        }
    +
    +        // handle multiple AD servers
    +        $opts['domain_controllers'] = explode(',', $opts['domain_controllers']);
    +        $opts['domain_controllers'] = array_map('trim', $opts['domain_controllers']);
    +        $opts['domain_controllers'] = array_filter($opts['domain_controllers']);
    +
    +        // compatibility with old option name
    +        if (empty($opts['admin_username']) && !empty($opts['ad_username'])) {
    +            $opts['admin_username'] = $opts['ad_username'];
    +        }
    +        if (empty($opts['admin_password']) && !empty($opts['ad_password'])) {
    +            $opts['admin_password'] = $opts['ad_password'];
    +        }
    +        $opts['admin_password'] = conf_decodeString($opts['admin_password']); // deobfuscate
    +
    +        // we can change the password if SSL is set
    +        if ($opts['update_pass'] && ($opts['use_ssl'] || $opts['use_tls'])) {
    +            $this->cando['modPass'] = true;
    +        } else {
    +            $this->cando['modPass'] = false;
    +        }
    +
    +        // adLDAP expects empty user/pass as NULL, we're less strict FS#2781
    +        if (empty($opts['admin_username'])) $opts['admin_username'] = null;
    +        if (empty($opts['admin_password'])) $opts['admin_password'] = null;
    +
    +        // user listing needs admin priviledges
    +        if (!empty($opts['admin_username']) && !empty($opts['admin_password'])) {
    +            $this->cando['getUsers'] = true;
    +        } else {
    +            $this->cando['getUsers'] = false;
    +        }
    +
    +        return $opts;
    +    }
    +
    +    /**
    +     * Returns a list of configured domains
    +     *
    +     * The default domain has an empty string as key
    +     *
    +     * @return array associative array(key => domain)
    +     */
    +    public function getConfiguredDomains()
    +    {
    +        $domains = [];
    +        if (empty($this->conf['account_suffix'])) return $domains; // not configured yet
    +
    +        // add default domain, using the name from account suffix
    +        $domains[''] = ltrim($this->conf['account_suffix'], '@');
    +
    +        // find additional domains
    +        foreach ($this->conf as $key => $val) {
    +            if (is_array($val) && isset($val['account_suffix'])) {
    +                $domains[$key] = ltrim($val['account_suffix'], '@');
    +            }
    +        }
    +        Sort::ksort($domains);
    +
    +        return $domains;
    +    }
    +
    +    /**
    +     * Check provided user and userinfo for matching patterns
    +     *
    +     * The patterns are set up with $this->_constructPattern()
    +     *
    +     * @author Chris Smith 
    +     *
    +     * @param string $user
    +     * @param array  $info
    +     * @return bool
    +     */
    +    protected function filter($user, $info)
    +    {
    +        foreach ($this->pattern as $item => $pattern) {
    +            if ($item == 'user') {
    +                if (!preg_match($pattern, $user)) return false;
    +            } elseif ($item == 'grps') {
    +                if (!count(preg_grep($pattern, $info['grps']))) return false;
    +            } elseif (!preg_match($pattern, $info[$item])) {
    +                return false;
    +            }
    +        }
    +        return true;
    +    }
    +
    +    /**
    +     * Create a pattern for $this->_filter()
    +     *
    +     * @author Chris Smith 
    +     *
    +     * @param array $filter
    +     */
    +    protected function constructPattern($filter)
    +    {
    +        $this->pattern = [];
    +        foreach ($filter as $item => $pattern) {
    +            $this->pattern[$item] = '/' . str_replace('/', '\/', $pattern) . '/i'; // allow regex characters
    +        }
    +    }
    +}
    diff --git a/lib/plugins/authad/conf/default.php b/lib/plugins/authad/conf/default.php
    new file mode 100644
    index 0000000..dbfb49b
    --- /dev/null
    +++ b/lib/plugins/authad/conf/default.php
    @@ -0,0 +1,19 @@
    + 'danger');
    +$meta['base_dn']            = array('string','_caution' => 'danger');
    +$meta['domain_controllers'] = array('string','_caution' => 'danger');
    +$meta['sso']                = array('onoff','_caution' => 'danger');
    +$meta['sso_charset']        = array('string','_caution' => 'danger');
    +$meta['admin_username']     = array('string','_caution' => 'danger');
    +$meta['admin_password']     = array('password','_caution' => 'danger','_code' => 'base64');
    +$meta['real_primarygroup']  = array('onoff','_caution' => 'danger');
    +$meta['use_ssl']            = array('onoff','_caution' => 'danger');
    +$meta['use_tls']            = array('onoff','_caution' => 'danger');
    +$meta['debug']              = array('onoff','_caution' => 'security');
    +$meta['expirywarn']         = array('numeric', '_min' => 0,'_caution' => 'danger');
    +$meta['additional']         = array('string','_caution' => 'danger');
    +$meta['update_name']        = array('onoff','_caution' => 'danger');
    +$meta['update_mail']        = array('onoff','_caution' => 'danger');
    +$meta['update_pass']        = array('onoff','_caution' => 'danger');
    +$meta['recursive_groups']   = array('onoff','_caution' => 'danger');
    diff --git a/lib/plugins/authad/lang/ar/lang.php b/lib/plugins/authad/lang/ar/lang.php
    new file mode 100644
    index 0000000..e000a1b
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ar/lang.php
    @@ -0,0 +1,15 @@
    +
    + * @author Khalid 
    + * @author Mohamed Belhsine 
    + * @author Usama Akkad 
    + */
    +$lang['domain']                = 'مجال تسجيل الدخول';
    +$lang['authpwdexpire']         = 'ستنتهي صلاحية كلمة السر في %d . عليك بتغييرها سريعا.';
    +$lang['passchangefail']        = 'فشل تغيير كلمة المرور. قد يكون السبب عدم موافاة شروط كلمة المرور.';
    +$lang['userchangefail']        = 'فشل تغيير سمات المستخدم. ربما لا يمتلك حسابك أذونات لإجراء تغييرات؟';
    +$lang['connectfail']           = 'فشل الاتصال بخادم Active Directory';
    diff --git a/lib/plugins/authad/lang/ar/settings.php b/lib/plugins/authad/lang/ar/settings.php
    new file mode 100644
    index 0000000..ab3bf1b
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ar/settings.php
    @@ -0,0 +1,26 @@
    +
    + * @author Khalid 
    + * @author alhajr 
    + */
    +$lang['account_suffix']        = 'لاحقة الحساب الخاص بك. على سبيل المثال. @my.domain.org';
    +$lang['base_dn']               = 'DN الأساسي الخاص بك. على سبيل المثال.DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'قائمة مفصولة بفواصل من وحدات التحكم بالمجال. على سبيل المثال. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'مستخدم Active Directory متميز لديه حق الوصول إلى جميع بيانات المستخدم الآخر. اختياري ، ولكنه مطلوب لإجراءات معينة مثل إرسال رسائل الاشتراك.';
    +$lang['admin_password']        = 'كلمة المرور للمستخدم أعلاه.';
    +$lang['sso']                   = 'استخدام Kerberos أم NTLM لتسجيل الدخول الموحد؟';
    +$lang['sso_charset']           = 'ستقوم مجموعة الأحرف الخاصة بك بتمرير اسم مستخدم Kerberos أو NTLM فيها. فارغة ل UTF-8 أو اللاتينية -1. يتطلب ملحق iconv.';
    +$lang['real_primarygroup']     = 'ينبغي أن تحل المجموعة الأساسية الحقيقية بدلاً من افتراض "Domain Users" (أبطأ).';
    +$lang['use_ssl']               = 'استخدام الاتصال المشفر (SSL)؟ في حال استخدامه الرجاء عدم تفعيل (TLS) أسفله.';
    +$lang['use_tls']               = 'هل تستخدم اتصال TLS؟ إذا تم استخدامها ، فلا تقم بتمكين SSL أعلاه.';
    +$lang['debug']                 = 'عرض إخراج تصحيح الأخطاء الإضافية على الأخطاء؟	';
    +$lang['expirywarn']            = 'عدد الأيام المقدمة لتحذير المستخدم حول كلمة مرور منتهية الصلاحية. (0) للتعطيل.';
    +$lang['additional']            = 'قائمة مفصولة بفواصل لسمات AD الإضافية لجلبها من بيانات المستخدم. تستخدم من قبل بعض الإضافات.';
    +$lang['update_name']           = 'هل تسمح للمستخدمين بتحديث اسم عرض الإعلانات الخاص بهم؟';
    +$lang['update_mail']           = 'السماح للمستخدمين بتحديث عناوين بريدهم الإلكتروني؟';
    +$lang['update_pass']           = 'هل تسمح للمستخدمين بتحديث كلمة المرور الخاصة بهم؟ يتطلب SSL أو TLS أعلاه.';
    +$lang['recursive_groups']      = 'حل المجموعات المتداخلة لأعضائها المعنيين (أبطأ).';
    diff --git a/lib/plugins/authad/lang/bg/lang.php b/lib/plugins/authad/lang/bg/lang.php
    new file mode 100644
    index 0000000..816c495
    --- /dev/null
    +++ b/lib/plugins/authad/lang/bg/lang.php
    @@ -0,0 +1,8 @@
    +
    + */
    +$lang['authpwdexpire']         = 'Срока на паролата ви ще изтече след %d дни. Препоръчително е да я смените по-скоро.';
    diff --git a/lib/plugins/authad/lang/bg/settings.php b/lib/plugins/authad/lang/bg/settings.php
    new file mode 100644
    index 0000000..f77fc89
    --- /dev/null
    +++ b/lib/plugins/authad/lang/bg/settings.php
    @@ -0,0 +1,21 @@
    +
    + * @author Kiril 
    + */
    +$lang['account_suffix']        = 'Наставка на акаунта Ви. Например @някакъв.домейн.org';
    +$lang['base_dn']               = 'Вашият основен DN. Например DC=моят,DC=домейн,DC=org';
    +$lang['domain_controllers']    = 'Domain controller списък, разделете сървърите със запетая. Например сървър1.домейн.org,сървър2.домейн.org';
    +$lang['admin_username']        = 'Привилегирован Active Directory потребител с достъп до данните на останалите потребители. Не е задължително, но е необходимо за някои функционалности като изпращането на имейл за абонаменти.';
    +$lang['admin_password']        = 'Паролата на горния потребител.';
    +$lang['sso']                   = 'Да се ползва ли еднократно вписване чрез Kerberos или NTLM?';
    +$lang['real_primarygroup']     = 'Да се извлича ли истинската група вместо да се предполага "Domain Users" (по-бавно)';
    +$lang['use_ssl']               = 'Ползване на SSL свързаност? Не отбелязвайте TLS (по-долу) ако включите опцията.';
    +$lang['use_tls']               = 'Ползване на TLS свързаност? Не отбелязвайте SSL (по-горе) ако включите опцията.';
    +$lang['debug']                 = 'Показване на допълнителна debug информация при грешка?';
    +$lang['expirywarn']            = 'Предупреждаване на потребителите Х дни преди изтичане валидността на паролата им. Въведете 0 за изключване.';
    +$lang['additional']            = 'Списък с допълнителни AD атрибути за извличане от потребителските данни (разделяйте ги със запетая). Ползва се от няколко приставки.';
    +$lang['update_mail']           = 'Позволи на потребители да си сменят имейл адресите?';
    diff --git a/lib/plugins/authad/lang/ca/lang.php b/lib/plugins/authad/lang/ca/lang.php
    new file mode 100644
    index 0000000..5669205
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ca/lang.php
    @@ -0,0 +1,14 @@
    +
    + * @author Pauet 
    + * @author controlonline.net 
    + */
    +$lang['domain']                = 'Logo Domini';
    +$lang['authpwdexpire']         = 'La vostra contrasenya caducarà en %d dies, l\'hauríeu de canviar aviat.';
    +$lang['passchangefail']        = 'Ha fallat el canviar el password. Es possible que no s\'hagi complert la política de passwords';
    +$lang['userchangefail']        = 'Ha fallat el canvi d\'atributs. Pot ser no tinguis compte amb permisos per fer canvis.';
    +$lang['connectfail']           = 'Ha fallat la connexió amb servidor l\'Active Directory.';
    diff --git a/lib/plugins/authad/lang/ca/settings.php b/lib/plugins/authad/lang/ca/settings.php
    new file mode 100644
    index 0000000..b29c6df
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ca/settings.php
    @@ -0,0 +1,31 @@
    +
    + * @author Marc Zulet 
    + * @author Joan 
    + * @author David Surroca 
    + * @author Adolfo Jayme Barrientos 
    + * @author controlonline.net 
    + * @author Àngel Pérez Beroy 
    + */
    +$lang['account_suffix']        = 'El teu nom de compte. Ej.@my.domain.org';
    +$lang['base_dn']               = 'Nom base DN. Ej. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'Llista separada per coma dels controladors de domini. Ex. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Un usuari de Directori Actiu autoritzat a accedir a les dades de tots els usuaris. Opcional, però necessari per a certes accions, com enviar correus per subscripció.';
    +$lang['admin_password']        = 'La contrasenya de l\'usuari referit abans.
    +';
    +$lang['sso']                   = 'S\'hauria de fer servir Kerberos o NTLM per inici de sessió únic?';
    +$lang['sso_charset']           = 'El conjunt de caràcters del vostre servidor web passarà el nom d\'usuari Kerberos o NTLM. Buit per a UTF-8 o latin-1. Requereix l\'extensió iconv.';
    +$lang['real_primarygroup']     = 'S\'hauria de resoldre el grup principal real en lloc d\'assumir "Usuaris de domini" (més lent).';
    +$lang['use_ssl']               = 'Utilitzeu la connexió SSL? Si s\'usa, no activeu TLS a continuació.';
    +$lang['use_tls']               = 'Utilitzeu la connexió TLS? Si l\'useu, no activeu SSL a dalt.';
    +$lang['debug']                 = 'Mostrar informació addicional de depuració en cas d\'error?';
    +$lang['expirywarn']            = 'Dies per endavant en avisar l\'usuari sobre la caducitat de la contrasenya. 0 per desactivar.';
    +$lang['additional']            = 'Una llista separada per comes d\'atributs AD addicionals per obtenir de les dades d\'usuari. Utilitzat per alguns connectors.';
    +$lang['update_name']           = 'Voleu permetre als usuaris actualitzar el seu nom de visualització d\'AD?';
    +$lang['update_mail']           = 'Permetre els usuaris actualitzar la seva adreça de correu electrònic?';
    +$lang['update_pass']           = 'Permetre als usuaris actualitzar la seva clau? Es necessari SSL o TLS.';
    +$lang['recursive_groups']      = 'Resoleu els grups imbricats als seus respectius membres (més lentament).';
    diff --git a/lib/plugins/authad/lang/ckb/lang.php b/lib/plugins/authad/lang/ckb/lang.php
    new file mode 100644
    index 0000000..6e1168e
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ckb/lang.php
    @@ -0,0 +1,14 @@
    +
    + * @author Wrya 
    + */
    +$lang['domain']                = 'دەستکاری ی تۆمارکردن بکە';
    +$lang['authpwdexpire']         = 'نهێنوشەکەت بەسەردەچێت لە %d ڕۆژ، پێویستە زوو بیگۆڕیت.
    +';
    +$lang['passchangefail']        = 'گۆڕینی نهێنوشەکە سەرکەوتوو نەبوو. لەوانەیە سیاسەتی نهێنوشە کە نەدیتبێت؟';
    +$lang['userchangefail']        = 'سەرکەوتوو نەبوو لە گۆڕینی تایبەتمەندیەکانی بەکارهێنەر. لەوانەیە ئەژمێرەکەت مۆڵەتەکانی نەبێت بۆ گۆڕانکاری؟';
    +$lang['connectfail']           = 'پەیوەندی کردن بە سێرڤەری Active Directory سەرکەوتوو نەبوو.';
    diff --git a/lib/plugins/authad/lang/ckb/settings.php b/lib/plugins/authad/lang/ckb/settings.php
    new file mode 100644
    index 0000000..d877cba
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ckb/settings.php
    @@ -0,0 +1,23 @@
    +
    + */
    +$lang['account_suffix']        = 'پاشگری ئەژمێرەکەت. ئێگ @my.domain.org';
    +$lang['base_dn']               = 'Your base DN. Eg. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'لیستی بۆر جیاکراوەی کۆنترۆڵەکانی دۆمەین. وەک srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'بەکارهێنەرێکی ڕێنیشاندەرێکی چالاک کە توانای چوونە ژورەوەی بۆ هەموو داتاکانی بەکارهێنەری تر هەیە. ئارەزوومەندانە، بەڵام پێویستە بۆ هەندێک چالاکی وەک ناردنی پۆستی ئابوونە.';
    +$lang['admin_password']        = 'تێپەڕوشەی بەکارهێنەری سەرەوە.';
    +$lang['sso']                   = 'پێویستە چوونەناو تاک لە ڕێگای Kerberos یان NTLM بەکار بهێنرێت؟';
    +$lang['sso_charset']           = 'ئەو پشکانەی وێبسێرڤەرەکەت ناوی بەکارهێنەری Kerberos یان NTLM تێدەپەڕن. بەتاڵ بۆ UTF-8 یان لاتین-1. پێویستی بە درێژکراوەی ئایکۆنڤ هەیە.';
    +$lang['real_primarygroup']     = 'ئایا دەبێت گرووپی سەرەتایی ڕاستەقینە چارەسەر بکرێت لە جیاتی ئەوەی وا لە "بەکارهێنەرانی دۆمەین" (هێواشتر) بکرێت.';
    +$lang['use_ssl']               = 'بەکارهێنانی پەیوەندی SSL? ئەگەر بەکاربێت، TLS ی خوارەوە بەتوانا مەکە.';
    +$lang['use_tls']               = 'بەکارهێنانی پەیوەندی TLS؟ ئەگەر بەکارهات، SSL لەسەرەوە چالاک مەکە.';
    +$lang['debug']                 = 'دەرهاودەرە ڕاستکەرەوە زیادەکان نیشان بدە لەسەر هەڵەکان؟';
    +$lang['expirywarn']            = 'ڕۆژ لە پێشەکی بۆ ئاگادارکردنەوەی بەکارهێنەر دەربارەی تێپەڕەوشە. 0 بۆ ناچالاککردن.';
    +$lang['additional']            = 'لیستی بۆرە جیاکراوە لە تایبەتمەندیەکانی AD زیاتر بۆ هێنانی لە زانیاری بەکارهێنەر. بەکارهێنراوە لەلایەن هەندێک پێوەکراو.';
    +$lang['update_name']           = 'ڕێگە بە بەکارهێنەران بدە ناوی پیشاندانی AD نوێ بکەن؟';
    +$lang['update_mail']           = 'ڕێگە بە بەکارهێنەران بدە ناونیشانی ئیمەیڵیان نوێ بکەن؟';
    +$lang['recursive_groups']      = 'چارەسەرکردنی گروپە هێلانەکان بۆ ئەندامە بەڕێزەکانیان (هێواشتر).';
    diff --git a/lib/plugins/authad/lang/cs/lang.php b/lib/plugins/authad/lang/cs/lang.php
    new file mode 100644
    index 0000000..91e91d0
    --- /dev/null
    +++ b/lib/plugins/authad/lang/cs/lang.php
    @@ -0,0 +1,13 @@
    +
    + * @author Miroslav Svoboda 
    + */
    +$lang['domain']                = 'Přihlašovací doména';
    +$lang['authpwdexpire']         = 'Platnost vašeho hesla vyprší za %d dní, měli byste ho změnit co nejdříve.';
    +$lang['passchangefail']        = 'Změna hesla selhala. Možná nebyla dodržena pravidla pro jejich tvorbu?';
    +$lang['userchangefail']        = 'Změna atributů uživatele selhala. Možná nemá váš účet dostatečná oprávnění pro provádění změn. ';
    +$lang['connectfail']           = 'Připojení k serveru Active Directory selhalo.';
    diff --git a/lib/plugins/authad/lang/cs/settings.php b/lib/plugins/authad/lang/cs/settings.php
    new file mode 100644
    index 0000000..a8874cd
    --- /dev/null
    +++ b/lib/plugins/authad/lang/cs/settings.php
    @@ -0,0 +1,29 @@
    +
    + * @author Robert Surý 
    + * @author mkucera66 
    + * @author Jaroslav Lichtblau 
    + * @author Daniel Slováček 
    + * @author Martin Růžička 
    + */
    +$lang['account_suffix']        = 'Přípona vašeho účtu, tj. @moje.domena.org';
    +$lang['base_dn']               = 'Vaše doménové jméno DN. tj. DC=moje,DC=domena,DC=org';
    +$lang['domain_controllers']    = 'Seznam čárkou oddělených kontrolérů, tj. srv1.domena.org,srv2.domena.org';
    +$lang['admin_username']        = 'Privilegovaný uživatel Active Directory s přístupem ke všem datům. Volitelně, ale nutné pro určité akce typu zasílání mailů.';
    +$lang['admin_password']        = 'Heslo uživatele výše';
    +$lang['sso']                   = 'Chcete přihlašování Single-Sign-On pomocí jádra Kerberos nebo NTLM ( autentizační protokol obvyklý ve Windows)?';
    +$lang['sso_charset']           = 'Znaková sada kterou bude webserverem přenášeno uživatelské jméno pro Kerberos nebo NTLM. Prázdné pro UTF-8 nebo latin-1. Vyžaduje rozšíření iconv.';
    +$lang['real_primarygroup']     = 'Má být zjištěna primární skupina namísto vyhodnocení hodnoty "doménoví uživatelé" (pomalejší)';
    +$lang['use_ssl']               = 'Použít spojení SSL? Pokud ano, nevyužívejte TLS níže.';
    +$lang['use_tls']               = 'Použít spojení TLS? Pokud ano, nevyužívejte SSL výše.';
    +$lang['debug']                 = 'Zobrazit dodatečné debugovací výstupy při chybách?';
    +$lang['expirywarn']            = 'Dny mezi varováním o vypršení hesla uživatele a jeho vypršením. 0 značí vypnuto.';
    +$lang['additional']            = 'Čárkou oddělený seznam dodatečných atributů získávaných z uživatelských dat. Využito některými pluginy.';
    +$lang['update_name']           = 'Povolit uživatelům upravit jejich AD zobrazované jméno?';
    +$lang['update_mail']           = 'Povolit uživatelům upravit svou emailovou adresu?';
    +$lang['update_pass']           = 'Povolit uživatelům změnit jejich heslo? Vyžaduje SSL nebo TLS výše.';
    +$lang['recursive_groups']      = 'Vyřešte vnořené skupiny do jejich příslušných členů (pomalejší).';
    diff --git a/lib/plugins/authad/lang/cy/lang.php b/lib/plugins/authad/lang/cy/lang.php
    new file mode 100644
    index 0000000..8cc3746
    --- /dev/null
    +++ b/lib/plugins/authad/lang/cy/lang.php
    @@ -0,0 +1,16 @@
    +
    + * @author Alan Davies 
    + */
    +
    +$lang['domain']          = 'Parth Mewngofnodi';
    +$lang['authpwdexpire']   = 'Bydd eich cyfrinair yn dod i ben mewn %d diwrnod, dylech chi ei newid e\'n fuan.';
    +$lang['passchangefail']  = 'Methodd newid y cyfrinair. Posib roedd y cyfrinair yn annilys?';
    +$lang['userchangefail']  = 'Methodd newid priodoleddau defnyddiwr. Posib \'sdim hawliau \'da chi i wneud newidiadau?';
    +$lang['connectfail']     = 'Methodd y cysylltiad i weinydd yr Active Directory.';
    +
    +//Setup VIM: ex: et ts=4 :
    diff --git a/lib/plugins/authad/lang/cy/settings.php b/lib/plugins/authad/lang/cy/settings.php
    new file mode 100644
    index 0000000..e343485
    --- /dev/null
    +++ b/lib/plugins/authad/lang/cy/settings.php
    @@ -0,0 +1,15 @@
    +@my.domain.org';
    +$lang['base_dn']            = 'Sail eich DN. Eg. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers'] = 'Rhestr gwahanwyd gan goma o reolwyr Parth. Ee. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']     = 'Defnyddiwr Active Directory breintiedig gyda mynediad i ddata pob defnyddiwr arall. Yn opsiynol, ond yn hanfodol ar gyfer gweithredoedd penodol fel anfon ebyst tanysgrifio.';
    +$lang['admin_password']     = 'Cyfrinair y defnyddiwr uchod.';
    +$lang['sso']                = 'A ddylai Mewngofnodi-Unigol gan Kerberos neu NTLM gael ei ddefnyddio?';
    +$lang['sso_charset']        = 'Y set nod mae\'ch gweinydd gwe yn pasio defnyddair Kerberos neu NTLM ynddi. Gwag ar gyfer UTF-8 neu latin-1. Bydd angen estyniad iconv.';
    +$lang['real_primarygroup']  = 'Os ydy\'r prif grŵp real yn cael ei hadfer yn hytrach na thybio "Defnyddwyr Parth" (arafach).';
    +$lang['use_ssl']            = 'Defnyddio cysylltiad SSL? Os ydych chi\'n defnyddio hwn, peidiwch â galluogi TLS isod.';
    +$lang['use_tls']            = 'Defnyddio cysylltiad TLS? Os ydych chi\'n defnyddio hwn, peidiwch â galluogi SSL uchod.';
    +$lang['debug']              = 'Dangos allbwn dadfygio ychwanegol ar wallau?';
    +$lang['expirywarn']         = 'Diwrnodau o flaen llaw i rybuddio defnyddwyr o ran cyfrinair yn dod i ben. 0 i analluogi.';
    +$lang['additional']         = 'Rhestr a wahanwyd gan goma o briodoleddau AD ychwanegol i nôl o ddata defnyddiwr. Defnyddiwyd gan rai ategion.';
    diff --git a/lib/plugins/authad/lang/da/lang.php b/lib/plugins/authad/lang/da/lang.php
    new file mode 100644
    index 0000000..c6a8778
    --- /dev/null
    +++ b/lib/plugins/authad/lang/da/lang.php
    @@ -0,0 +1,13 @@
    +
    + * @author Mikael Lyngvig 
    + */
    +$lang['domain']                = 'Logondomæne';
    +$lang['authpwdexpire']         = 'Din adgangskode vil udløbe om %d dage, du bør ændre den snart.';
    +$lang['passchangefail']        = 'Kunne ikke skifte adgangskoden. Måske blev adgangskodepolitikken ikke opfyldt?';
    +$lang['userchangefail']        = 'Kunne ikke ændre brugerkontoen. Din konto har muligvis ikke rettigheder til at lave ændringer.';
    +$lang['connectfail']           = 'Kunne ikke forbinde til Active Directory serveren.';
    diff --git a/lib/plugins/authad/lang/da/settings.php b/lib/plugins/authad/lang/da/settings.php
    new file mode 100644
    index 0000000..e93f979
    --- /dev/null
    +++ b/lib/plugins/authad/lang/da/settings.php
    @@ -0,0 +1,25 @@
    +
    + * @author Soren Birk 
    + * @author Jens Hyllegaard 
    + */
    +$lang['account_suffix']        = 'Dit konto suffiks. F.eks. @mit.domæne.dk';
    +$lang['base_dn']               = 'Dit grund DN. F.eks. DC=mit,DC=domæne,DC=dk';
    +$lang['domain_controllers']    = 'En kommasepareret liste over domænecontrollere. F.eks. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'En privilegeret Active Directory bruger med adgang til alle andre brugeres data. Valgfri, men skal bruges til forskellige handlinger såsom at sende abonnement e-mails.';
    +$lang['admin_password']        = 'Adgangskoden til den ovenstående brugerkonto.';
    +$lang['sso']                   = 'Skal der benyttes Single-Sign-On via Kerberos eller NTLM?';
    +$lang['sso_charset']           = 'Tegnsættet din webserver leverer Kerberos eller NTLM brugernavnet i. Efterlad blank for UTF-8 eller latin-1. Kræver iconv udvidelsen.';
    +$lang['real_primarygroup']     = 'Bør den korrekte primære gruppe findes i stedet for at antage "Domain Users" (langsommere)';
    +$lang['use_ssl']               = 'Benyt SSL forbindelse? Hvis ja, vælg ikke TLS herunder.';
    +$lang['use_tls']               = 'Benyt TLS forbindelse? Hvis ja, vælg ikke SSL herover.';
    +$lang['debug']                 = 'Vis yderligere debug output ved fejl?';
    +$lang['expirywarn']            = 'Dage før udløb af adgangskode brugere skal advares. Angiv 0 for at deaktivere notifikation.';
    +$lang['additional']            = 'En kommasepareret liste over yderligere AD attributter der skal hentes fra brugerdata. Brug af nogen udvidelser.';
    +$lang['update_name']           = 'Tillad at brugere opdaterer deres visningnavn i AD?';
    +$lang['update_mail']           = 'Tillad at brugere opdaterer deres e-mail adresse?';
    +$lang['recursive_groups']      = 'Opslå nedarvede grupper til deres individuelle medlemmer (langsommere)';
    diff --git a/lib/plugins/authad/lang/de-informal/lang.php b/lib/plugins/authad/lang/de-informal/lang.php
    new file mode 100644
    index 0000000..3166798
    --- /dev/null
    +++ b/lib/plugins/authad/lang/de-informal/lang.php
    @@ -0,0 +1,13 @@
    +
    + * @author rnck 
    + */
    +$lang['domain']                = 'Login Domäne';
    +$lang['authpwdexpire']         = 'Dein Passwort läuft in %d Tag(en) ab. Du solltest es es frühzeitig ändern.';
    +$lang['passchangefail']        = 'Das Passwort konnte nicht geändert werden. Eventuell wurde die Passwort-Richtlinie nicht eingehalten.';
    +$lang['userchangefail']        = 'Nutzerattribute konnten nicht geändert werden. Möglicherweise hat Dein Account nicht die erforderlichen Berechtigungen.';
    +$lang['connectfail']           = 'Verbindung zum Active Directory Server fehlgeschlagen.';
    diff --git a/lib/plugins/authad/lang/de-informal/settings.php b/lib/plugins/authad/lang/de-informal/settings.php
    new file mode 100644
    index 0000000..b73b668
    --- /dev/null
    +++ b/lib/plugins/authad/lang/de-informal/settings.php
    @@ -0,0 +1,28 @@
    +
    + * @author Frank Loizzi 
    + * @author Matthias Schulte 
    + * @author Volker Bödker 
    + * @author rnck 
    + * @author Felix 
    + */
    +$lang['account_suffix']        = 'Dein Account-Suffix. Z.B. @my.domain.org';
    +$lang['base_dn']               = 'Dein Base-DN. Z.B. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'Eine Komma-separierte Liste von Domänen-Controllern. Z.B. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Ein privilegierter Active Directory-Benutzer mit Zugriff zu allen anderen Benutzerdaten. Optional, aber wird benötigt für Aktionen wie z. B. dass Senden von Benachrichtigungs-Mails.';
    +$lang['admin_password']        = 'Das Passwort des obigen Benutzers.';
    +$lang['sso']                   = 'Soll Single-Sign-On via Kerberos oder NTLM benutzt werden?';
    +$lang['sso_charset']           = 'Der Zeichensatz in dem Kerberos oder NTLM den Usernamen übergibt. Leer lassen für UTF-8 oder latin-1. Erfordert die Erweiterung iconv.';
    +$lang['real_primarygroup']     = 'Soll die echte primäre Gruppe aufgelöst werden anstelle der Annahme "Domain Users" (langsamer)';
    +$lang['use_ssl']               = 'SSL-Verbindung benutzen? Falls ja, TLS unterhalb nicht aktivieren.';
    +$lang['use_tls']               = 'TLS-Verbindung benutzen? Falls ja, SSL oberhalb nicht aktivieren.';
    +$lang['debug']                 = 'Zusätzliche Debug-Informationen bei Fehlern anzeigen?';
    +$lang['expirywarn']            = 'Tage im Voraus um Benutzer über ablaufende Passwörter zu informieren. 0 zum Ausschalten.';
    +$lang['additional']            = 'Eine Komma-separierte Liste von zusätzlichen AD-Attributen, die von den Benutzerobjekten abgefragt werden. Wird von einigen Plugins benutzt.';
    +$lang['update_name']           = 'Nutzern erlauben ihren AD Anzeigenamen zu aktualisieren?';
    +$lang['update_mail']           = 'Nutzern erlauben ihre E-Mail-Adresse zu aktualisieren?';
    +$lang['recursive_groups']      = 'Auflösen verschachtelter Gruppen für ihre jeweiligen Mitglieder (langsamer).';
    diff --git a/lib/plugins/authad/lang/de/lang.php b/lib/plugins/authad/lang/de/lang.php
    new file mode 100644
    index 0000000..335cd61
    --- /dev/null
    +++ b/lib/plugins/authad/lang/de/lang.php
    @@ -0,0 +1,14 @@
    +
    + * @author Philip Knack 
    + * @author Uwe Benzelrath 
    + */
    +$lang['domain']                = 'Anmelde-Domäne';
    +$lang['authpwdexpire']         = 'Ihr Passwort läuft in %d Tag(en) ab. Sie sollten es frühzeitig ändern.';
    +$lang['passchangefail']        = 'Kennwortänderung fehlgeschlagen. Entspricht das Kennwort der Richtlinie?';
    +$lang['userchangefail']        = 'Änderung der Nutzerattribute fehlgeschlagen. Möglicherweise hat ihr Benutzerkonto nicht die nötigen Rechte um diese Änderungen durchzuführen';
    +$lang['connectfail']           = 'Verbindung zum Active Directory Server fehlgeschlagen.';
    diff --git a/lib/plugins/authad/lang/de/settings.php b/lib/plugins/authad/lang/de/settings.php
    new file mode 100644
    index 0000000..1241475
    --- /dev/null
    +++ b/lib/plugins/authad/lang/de/settings.php
    @@ -0,0 +1,30 @@
    +
    + * @author C!own77 
    + * @author Frank Loizzi 
    + * @author Matthias Schulte 
    + * @author Ben Fey 
    + * @author Jonas Gröger 
    + * @author Carsten Perthel 
    + */
    +$lang['account_suffix']        = 'Ihr Account-Suffix. Z. B. @my.domain.org';
    +$lang['base_dn']               = 'Ihr Base-DN. Z. B. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'Eine Komma-separierte Liste von Domänen-Controllern. Z. B. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Ein priviligierter Active Directory-Benutzer mit Zugriff zu allen anderen Benutzerdaten. Optional, aber wird benötigt für Aktionen wie z. B. dass Senden von Benachrichtigungs-Mails.';
    +$lang['admin_password']        = 'Das Passwort des obigen Benutzers.';
    +$lang['sso']                   = 'Soll Single-Sign-On via Kerberos oder NTLM benutzt werden?';
    +$lang['sso_charset']           = 'Der Zeichensatz, mit dem der Server den Kerberos- oder NTLM-Benutzernamen versendet. Leer lassen für UTF-8 oder latin-1. Benötigt die iconv-Erweiterung.';
    +$lang['real_primarygroup']     = 'Soll die echte primäre Gruppe aufgelöst werden anstelle der Annahme "Domain Users" (langsamer)';
    +$lang['use_ssl']               = 'SSL-Verbindung benutzen? Falls ja, TLS unterhalb nicht aktivieren.';
    +$lang['use_tls']               = 'TLS-Verbindung benutzen? Falls ja, SSL oberhalb nicht aktivieren.';
    +$lang['debug']                 = 'Zusätzliche Debug-Informationen bei Fehlern anzeigen?';
    +$lang['expirywarn']            = 'Tage im Voraus um Benutzer über ablaufende Passwörter zu informieren. 0 zum Ausschalten.';
    +$lang['additional']            = 'Eine Komma-separierte Liste von zusätzlichen AD-Attributen, die von den Benutzerobjekten abgefragt werden. Wird von einigen Plugins benutzt.';
    +$lang['update_name']           = 'Benutzern erlauben, ihren AD Anzeige-Namen zu ändern?';
    +$lang['update_mail']           = 'Benutzern erlauben, ihre E-Mail-Adresse zu ändern?';
    +$lang['update_pass']           = 'Nutzern erlauben ihr Passwort zu ändern? Benötigt SSL oder TLS.';
    +$lang['recursive_groups']      = 'Auflösen verschachtelter Gruppen für ihre jeweiligen Mitglieder (langsamer).';
    diff --git a/lib/plugins/authad/lang/el/lang.php b/lib/plugins/authad/lang/el/lang.php
    new file mode 100644
    index 0000000..2728d01
    --- /dev/null
    +++ b/lib/plugins/authad/lang/el/lang.php
    @@ -0,0 +1,13 @@
    +
    + * @author Vasileios Karavasilis 
    + */
    +$lang['domain']                = 'Logon Domain';
    +$lang['authpwdexpire']         = 'Ο κωδικός πρόσβασης θα λήξει σε %d ημέρες. Προτείνουμε να τον αλλάξετε σύντομα.';
    +$lang['passchangefail']        = 'Ο κωδικός πρόσβασης δεν μπόρεσε να αλλάξει. Μήπως δεν ακολουθήθηκαν οι κατάλληλες οδηγίες της πολιτικής κωδικού πρόσβασης?';
    +$lang['userchangefail']        = 'Αποτυχία αλλαγής των στοιχείων του χρήστη. Μπορεί ο λογαριασμός σας να μην έχει άδεια να κάνει αλλαγές. ';
    +$lang['connectfail']           = 'Δεν μπόρεσε να συνδέσει στον διακομιστή Active Directory (Ενεργή Λίστα διευθύνσεων).';
    diff --git a/lib/plugins/authad/lang/el/settings.php b/lib/plugins/authad/lang/el/settings.php
    new file mode 100644
    index 0000000..381b593
    --- /dev/null
    +++ b/lib/plugins/authad/lang/el/settings.php
    @@ -0,0 +1,24 @@
    +
    + * @author chris taklis 
    + */
    +$lang['account_suffix']        = 'Το πρόσημο του λογαριασμού σας. Π.χ @my.domain.org';
    +$lang['base_dn']               = 'Το βασικό σας DN. Eg. DC=my,DC=domain,DC=org	';
    +$lang['domain_controllers']    = 'Μία λίστα χωρισμένη με κόμμα, των ελεγκτών του Domain. Π.χ. srv1.domain.org,srv2.domain.org	 ';
    +$lang['admin_username']        = 'Ένας προνομιούχος χρήστης της Ενεργούς Λίστας Διευθύνσεων με πρόσβαση στα δεδομένα άλλων χρηστών. Προαιρετικό, αλλά χρειάζεται για ορισμένες ενέργειες όπως αποστολή ηλεκτρονικών μηνυμάτων εγγραφής. ';
    +$lang['admin_password']        = 'Ο κωδικός του παραπάνω χρήστη.';
    +$lang['sso']                   = 'Πρέπει να χρησιμοποιηθεί το Single-Sign-On μέσω Kerberos ή το NTLM ?	';
    +$lang['sso_charset']           = 'To \'\'charset\'\' που ο διακομιστής ιστοσελίδας σας θα περάσει το Kerberos ή το όνομα χρήστη NTLM . Είναι άδειο για το UTF-8 η το λατινικό -1. Χρειάζεται την προέκταση inconv. ';
    +$lang['real_primarygroup']     = 'Πρέπει να ισχύσει η βασική ομάδα αντί να ληφθεί υπόψη το \'\'Domain Users\'\' (πιο αργό).';
    +$lang['use_ssl']               = 'Να γίνει χρήση της σύνδεσης SSL? Αν χρησιμοποιείται μην ενεργοποιείστε το TLS πιο κάτω. ';
    +$lang['use_tls']               = 'Να γίνει  σύνδεση του TLS?Αν ήδη χρησιμοποιείται, μην ενεργοποιείστε το SSL πιο πάνω. ';
    +$lang['debug']                 = 'Να προβληθεί το επιπλέον σύστημα ανίχνευσης λαθών ?';
    +$lang['expirywarn']            = 'Πρέπει να προειδοποιηθεί ο χρήστης πριν λίγες ημέρες για την λήξη του κωδικού πρόσβασης. 0 για να απενεργοποιείστε.';
    +$lang['additional']            = 'Μία λίστα που χωρίζεται με κόμμα, με AD επιπλέον ιδιότητες για να φέρουν στοιχεία από τον χρήστη. Χρησιμοποιείται από κάποια επιπρόσθετα.';
    +$lang['update_name']           = 'Να επιτρέπεται στους χρήστες να ενημερώνουν το AD όνομα τους που προβάλλεται?';
    +$lang['update_mail']           = 'Να επιτρέπεται στους χρήστες να ενημερώνουν την διεύθυνση ηλεκτρονικού τους ταχυδρομείου?';
    +$lang['recursive_groups']      = 'Να γίνεται καταχώρηση των μελών των ομάδων?';
    diff --git a/lib/plugins/authad/lang/en/lang.php b/lib/plugins/authad/lang/en/lang.php
    new file mode 100644
    index 0000000..3e8a9e2
    --- /dev/null
    +++ b/lib/plugins/authad/lang/en/lang.php
    @@ -0,0 +1,15 @@
    +
    + */
    +
    +$lang['domain']          = 'Logon Domain';
    +$lang['authpwdexpire']   = 'Your password will expire in %d days, you should change it soon.';
    +$lang['passchangefail']  = 'Failed to change the password. Maybe the password policy was not met?';
    +$lang['userchangefail']  = 'Failed to change user attributes. Maybe your account does not have permissions to make changes?';
    +$lang['connectfail']     = 'Failed to connect to Active Directory server.';
    +
    +//Setup VIM: ex: et ts=4 :
    diff --git a/lib/plugins/authad/lang/en/settings.php b/lib/plugins/authad/lang/en/settings.php
    new file mode 100644
    index 0000000..efa6f4b
    --- /dev/null
    +++ b/lib/plugins/authad/lang/en/settings.php
    @@ -0,0 +1,19 @@
    +@my.domain.org';
    +$lang['base_dn']            = 'Your base DN. Eg. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers'] = 'A comma separated list of Domain controllers. Eg. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']     = 'A privileged Active Directory user with access to all other user\'s data. Optional, but needed for certain actions like sending subscription mails.';
    +$lang['admin_password']     = 'The password of the above user.';
    +$lang['sso']                = 'Should Single-Sign-On via Kerberos or NTLM be used?';
    +$lang['sso_charset']        = 'The charset your webserver will pass the Kerberos or NTLM username in. Empty for UTF-8 or latin-1. Requires the iconv extension.';
    +$lang['real_primarygroup']  = 'Should the real primary group be resolved instead of assuming "Domain Users" (slower).';
    +$lang['use_ssl']            = 'Use SSL connection? If used, do not enable TLS below.';
    +$lang['use_tls']            = 'Use TLS connection? If used, do not enable SSL above.';
    +$lang['debug']              = 'Display additional debugging output on errors?';
    +$lang['expirywarn']         = 'Days in advance to warn user about expiring password. 0 to disable.';
    +$lang['additional']         = 'A comma separated list of additional AD attributes to fetch from user data. Used by some plugins.';
    +$lang['update_name']        = 'Allow users to update their AD display name?';
    +$lang['update_mail']        = 'Allow users to update their email address?';
    +$lang['update_pass']        = 'Allow users to update their password? Requires SSL or TLS above.';
    +$lang['recursive_groups']   = 'Resolve nested groups to their respective members (slower).';
    diff --git a/lib/plugins/authad/lang/eo/lang.php b/lib/plugins/authad/lang/eo/lang.php
    new file mode 100644
    index 0000000..1960099
    --- /dev/null
    +++ b/lib/plugins/authad/lang/eo/lang.php
    @@ -0,0 +1,15 @@
    +
    + * @author Erik Bjørn Pedersen 
    + * @author Florian 
    + * @author Robert Bogenschneider 
    + */
    +$lang['domain']                = 'Ensaluta domajno';
    +$lang['authpwdexpire']         = 'Via pasvorto malvalidos post %d tagoj, prefere ŝanĝu ĝin baldaũ.';
    +$lang['passchangefail']        = 'Oni malsukcesis ŝanĝi la pasvorton. Ĉu la regularo pri pasvortoj eble ne plenumiĝis?';
    +$lang['userchangefail']        = 'Malsukcesis ŝanĝi uzantajn atributojn. Eble via konto ne havas permesojn fari ŝanĝojn?';
    +$lang['connectfail']           = 'Malsukcesis konekti al Aktivan Dosierumon servilo.';
    diff --git a/lib/plugins/authad/lang/eo/settings.php b/lib/plugins/authad/lang/eo/settings.php
    new file mode 100644
    index 0000000..b60dec1
    --- /dev/null
    +++ b/lib/plugins/authad/lang/eo/settings.php
    @@ -0,0 +1,26 @@
    +
    + * @author Florian 
    + * @author Robert Bogenschneider 
    + */
    +$lang['account_suffix']        = 'Via konto-aldonaĵo, ekz. @mia.domajno.lando';
    +$lang['base_dn']               = 'Via baza DN, ekz. DC=mia,DC=domajno,DC=lando';
    +$lang['domain_controllers']    = 'Komodisigita listo de domajno-serviloj, ekz. srv1.domajno.lando,srv2.domajno.lando';
    +$lang['admin_username']        = 'Privilegiita Aktiv-Dosieruja uzanto kun aliro al ĉiuj uzantaj datumoj. Libervole, sed necesa por iuj agadoj kiel sendi abonan retpoŝton.';
    +$lang['admin_password']        = 'La pasvorto de tiu uzanto.';
    +$lang['sso']                   = 'Ĉu uzi Sola Aliro tra Kerberos aŭ NTLM?';
    +$lang['sso_charset']           = 'Per kiu karaktraro via retservilo pludonas uzantonomojn al Kerberos aŭ NTLM? Malplena por UTF-8 aŭ latin-1. Bezonas iconv-aldonaĵon.';
    +$lang['real_primarygroup']     = 'Ĉu trovi la veran ĉefan grupon anstataŭ supozi "Domajnuzantoj" (pli malrapida)?';
    +$lang['use_ssl']               = 'Ĉu uzi SSL-konekton? Se jes, ne aktivigu TLS sube.';
    +$lang['use_tls']               = 'Ĉu uzi TLS-konekton? Se jes, ne aktivigu SSL supre.';
    +$lang['debug']                 = 'Ĉu montri aldonajn informojn dum eraroj?';
    +$lang['expirywarn']            = 'Tagoj da antaŭaverto pri malvalidiĝonta pasvorto. 0 por malebligi.';
    +$lang['additional']            = 'Komodisigita listo de aldonaj AD-atributoj por preni el uzantaj datumoj. Uzita de iuj kromaĵoj.';
    +$lang['update_name']           = 'Ĉu permesi uzantojn aktualigi sian AD-montran nomon?';
    +$lang['update_mail']           = 'Ĉu permesi uzantoj ĝisdatigi siajn retardesojn?';
    +$lang['update_pass']           = 'Ĉu permesi uzantojn aktualigi sian pasvorton? Postulas SSL aŭ TLS supre.';
    +$lang['recursive_groups']      = 'Solvu nestitajn grupojn al iliaj respektivaj membroj (pli malrapide).';
    diff --git a/lib/plugins/authad/lang/es/lang.php b/lib/plugins/authad/lang/es/lang.php
    new file mode 100644
    index 0000000..381db9f
    --- /dev/null
    +++ b/lib/plugins/authad/lang/es/lang.php
    @@ -0,0 +1,15 @@
    +
    + * @author Gerardo Zamudio 
    + * @author Mauricio Segura 
    + * @author Romano 
    + */
    +$lang['domain']                = 'Dominio de inicio';
    +$lang['authpwdexpire']         = 'Su contraseña caducara en %d días, debería cambiarla lo antes posible';
    +$lang['passchangefail']        = 'Error al cambiar la contraseña. ¿Tal vez no se cumplió la directiva de contraseñas?';
    +$lang['userchangefail']        = 'Falló al intentar modificar los atributos del usuario.  Puede ser que su cuenta no tiene permisos para realizar cambios?';
    +$lang['connectfail']           = 'Error al conectar con el servidor de Active Directory.';
    diff --git a/lib/plugins/authad/lang/es/settings.php b/lib/plugins/authad/lang/es/settings.php
    new file mode 100644
    index 0000000..f8f36da
    --- /dev/null
    +++ b/lib/plugins/authad/lang/es/settings.php
    @@ -0,0 +1,30 @@
    +
    + * @author Liliana 
    + * @author monica 
    + * @author Antonio Bueno 
    + * @author Juan De La Cruz 
    + * @author Eloy 
    + * @author David Roy 
    + */
    +$lang['account_suffix']        = 'Su cuenta, sufijo. Ejem.  @ my.domain.org ';
    +$lang['base_dn']               = 'Su base DN. Ejem. DC=my,DC=dominio,DC=org';
    +$lang['domain_controllers']    = 'Una lista separada por coma de los controladores de dominios. Ejem. srv1.dominio.org,srv2.dominio.org';
    +$lang['admin_username']        = 'Un usuario con privilegios de Active Directory con acceso a los datos de cualquier otro usuario. Opcional, pero es necesario para determinadas acciones como el envío de suscripciones de correos electrónicos.';
    +$lang['admin_password']        = 'La contraseña del usuario anterior.';
    +$lang['sso']                   = 'En caso de inicio de sesión usará ¿Kerberos o NTLM?';
    +$lang['sso_charset']           = 'La codificación con que tu servidor web pasará el nombre de usuario Kerberos o NTLM. Si es UTF-8 o latin-1 dejar en blanco. Requiere la extensión iconv.';
    +$lang['real_primarygroup']     = 'Resolver el grupo primario real en vez de asumir "Domain Users" (más lento)';
    +$lang['use_ssl']               = '¿Usar conexión SSL? Si se usa, no habilitar TLS abajo.';
    +$lang['use_tls']               = '¿Usar conexión TLS? Si se usa, no habilitar SSL arriba.';
    +$lang['debug']                 = 'Mostrar información adicional de depuración sobre los errores?';
    +$lang['expirywarn']            = 'Días por adelantado para avisar al usuario de que contraseña expirará. 0 para deshabilitar.';
    +$lang['additional']            = 'Una lista separada por comas de atributos AD adicionales a obtener de los datos de usuario. Usado por algunos plugins.';
    +$lang['update_name']           = '¿Permitir a los usuarios actualizar su nombre de AD?';
    +$lang['update_mail']           = '¿Permitir a los usuarios actualizar su email?';
    +$lang['update_pass']           = '¿Permitir a los usuarios actualizar su contraseña? Requiere SSL o TLS por encima.';
    +$lang['recursive_groups']      = 'Restituir los grupos anidados a sus respectivos miembros (más lento)';
    diff --git a/lib/plugins/authad/lang/et/lang.php b/lib/plugins/authad/lang/et/lang.php
    new file mode 100644
    index 0000000..94fe9ed
    --- /dev/null
    +++ b/lib/plugins/authad/lang/et/lang.php
    @@ -0,0 +1,8 @@
    +
    + */
    +$lang['authpwdexpire']         = 'Sinu salasõna aegub %d päeva pärast, võiksid seda peatselt muuta.';
    diff --git a/lib/plugins/authad/lang/eu/lang.php b/lib/plugins/authad/lang/eu/lang.php
    new file mode 100644
    index 0000000..6c694bb
    --- /dev/null
    +++ b/lib/plugins/authad/lang/eu/lang.php
    @@ -0,0 +1,10 @@
    +
    + * @author Osoitz 
    + */
    +$lang['authpwdexpire']         = 'Zure pasahitza %d egun barru iraungiko da, laster aldatu beharko zenuke.';
    +$lang['connectfail']           = 'Huts egin du Active Directory zerbitzarira konektatzean';
    diff --git a/lib/plugins/authad/lang/eu/settings.php b/lib/plugins/authad/lang/eu/settings.php
    new file mode 100644
    index 0000000..e6852b2
    --- /dev/null
    +++ b/lib/plugins/authad/lang/eu/settings.php
    @@ -0,0 +1,13 @@
    +
    + */
    +$lang['account_suffix']        = 'Zure kontuaren atzizkia. Esaterako @niredomeinua.eus';
    +$lang['admin_password']        = 'Goiko erabiltzailearen pasahitza';
    +$lang['use_ssl']               = 'SSL konexioa darabilzu? Hala bada, ez gaitu TLS behean.';
    +$lang['use_tls']               = 'Erabili TLS konexioa? Erabiltzekotan, ez gaitu SSL goian.';
    +$lang['expirywarn']            = 'Pasahitza iraungitzear dagoela abisatzeko aurretia egunetan. 0 desgaitzeko.';
    +$lang['update_mail']           = 'Baimendu erabiltzaileei bere email helbidea eguneratzea?';
    diff --git a/lib/plugins/authad/lang/fa/lang.php b/lib/plugins/authad/lang/fa/lang.php
    new file mode 100644
    index 0000000..e5ff05d
    --- /dev/null
    +++ b/lib/plugins/authad/lang/fa/lang.php
    @@ -0,0 +1,14 @@
    +
    + * @author Milad DZand 
    + * @author Mohmmad Razavi 
    + */
    +$lang['domain']                = 'دامنه‌ی ورود';
    +$lang['authpwdexpire']         = 'کلمه عبور شما در %d روز منقضی خواهد شد ، شما باید آن را زود تغییر دهید';
    +$lang['passchangefail']        = 'تغیر رمزعبور با خطا مواجه شد. شاید سیاستهای مربوط به گذاشتن نام کاربری درست رعایت نشده است.';
    +$lang['userchangefail']        = 'تغییر ویژگی‌های کابر با خطا مواجه شد. شاید حساب کاربری شما مجاز به انجام این تغییرات نیست.';
    +$lang['connectfail']           = 'ارتباط با سرور Active Directory با خطا مواجه شد.';
    diff --git a/lib/plugins/authad/lang/fa/settings.php b/lib/plugins/authad/lang/fa/settings.php
    new file mode 100644
    index 0000000..79d62e7
    --- /dev/null
    +++ b/lib/plugins/authad/lang/fa/settings.php
    @@ -0,0 +1,24 @@
    +
    + * @author Mohmmad Razavi 
    + * @author Masoud Sadrnezhaad 
    + */
    +$lang['account_suffix']        = 'پسوند حساب کاربری شما. به عنوان مثال @my.domain.org';
    +$lang['base_dn']               = 'DN پایه شما. به عنوان مثال DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'لیست کنترل کننده‌های دامنه که با کاما ازهم جدا شده اند. به عنوان مثال srv1.domain.org,srv2.domain.org
    + */
    +$lang['authpwdexpire']         = 'Salasanasi vanhenee %d pv:n päästä, vaihda salasanasi pikaisesti.';
    diff --git a/lib/plugins/authad/lang/fi/settings.php b/lib/plugins/authad/lang/fi/settings.php
    new file mode 100644
    index 0000000..f0b5276
    --- /dev/null
    +++ b/lib/plugins/authad/lang/fi/settings.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['debug']                 = 'Näytä lisää debug-koodia virheistä?';
    +$lang['expirywarn']            = 'Montako päivää etukäteen varoitetaan salasanan vanhenemissta. 0 poistaa.';
    diff --git a/lib/plugins/authad/lang/fr/lang.php b/lib/plugins/authad/lang/fr/lang.php
    new file mode 100644
    index 0000000..ba51235
    --- /dev/null
    +++ b/lib/plugins/authad/lang/fr/lang.php
    @@ -0,0 +1,15 @@
    +
    + * @author Yannick Aure 
    + * @author Pietroni 
    + * @author Schplurtz le Déboulonné 
    + */
    +$lang['domain']                = 'Domaine de connexion';
    +$lang['authpwdexpire']         = 'Votre mot de passe expirera dans %d jours, vous devriez le changer bientôt.';
    +$lang['passchangefail']        = 'Impossible de changer le mot de passe. Il est possible que les règles de sécurité des mots de passe n\'aient pas été respectées.';
    +$lang['userchangefail']        = 'Impossible de modifier les attributs de l\'utilisateur. Votre compte n\'a peut-être pas les permissions d\'effectuer des changements.';
    +$lang['connectfail']           = 'Impossible de se connecter au serveur Active Directory.';
    diff --git a/lib/plugins/authad/lang/fr/settings.php b/lib/plugins/authad/lang/fr/settings.php
    new file mode 100644
    index 0000000..0881120
    --- /dev/null
    +++ b/lib/plugins/authad/lang/fr/settings.php
    @@ -0,0 +1,28 @@
    +
    + * @author Philippe Verbeke 
    + * @author Schplurtz le Déboulonné 
    + * @author Bruno Veilleux 
    + * @author Momo50 
    + */
    +$lang['account_suffix']        = 'Le suffixe de votre compte. Ex. : @mon.domaine.org';
    +$lang['base_dn']               = 'Votre nom de domaine de base. DC=mon,DC=domaine,DC=org';
    +$lang['domain_controllers']    = 'Une liste de contrôleurs de domaine séparés par des virgules. Ex. : srv1.domaine.org,srv2.domaine.org';
    +$lang['admin_username']        = 'Un utilisateur Active Directory avec accès aux données de tous les autres utilisateurs. Facultatif, mais nécessaire pour certaines actions telles que l\'envoi de courriels d\'abonnement.';
    +$lang['admin_password']        = 'Le mot de passe de l\'utilisateur ci-dessus.';
    +$lang['sso']                   = 'Est-ce que l\'authentification unique (Single-Sign-On) par Kerberos ou NTLM doit être utilisée?';
    +$lang['sso_charset']           = 'Le jeu de caractères que votre serveur web utilisera pour transmettre le nom d\'utilisateur Kerberos ou NTLM. Vide pour UTF-8 ou latin-1. Nécessite l\'extension iconv.';
    +$lang['real_primarygroup']     = 'Est-ce que le véritable groupe principal doit être résolu au lieu de présumer "Domain Users" (plus lent)?';
    +$lang['use_ssl']               = 'Utiliser une connexion SSL? Si utilisée, n\'activez pas TLS ci-dessous.';
    +$lang['use_tls']               = 'Utiliser une connexion TLS? Si utilisée, n\'activez pas SSL ci-dessus.';
    +$lang['debug']                 = 'Afficher des informations de débogage supplémentaires pour les erreurs?';
    +$lang['expirywarn']            = 'Jours d\'avance pour l\'avertissement envoyé aux utilisateurs lorsque leur mot de passe va expirer. 0 pour désactiver.';
    +$lang['additional']            = 'Une liste séparée par des virgules d\'attributs AD supplémentaires à récupérer dans les données utilisateur. Utilisée par certains modules.';
    +$lang['update_name']           = 'Autoriser les utilisateurs à modifier leur nom affiché de l\'AD ?';
    +$lang['update_mail']           = 'Autoriser les utilisateurs à modifier leur adresse de courriel ?';
    +$lang['update_pass']           = 'Autoriser les utilisateurs à mettre à jour leur mot de passe ? Nécessite SSL ou TLS ci-dessus.';
    +$lang['recursive_groups']      = 'Résoudre les groupes imbriqués à leur membres respectifs (plus lent).';
    diff --git a/lib/plugins/authad/lang/gl/lang.php b/lib/plugins/authad/lang/gl/lang.php
    new file mode 100644
    index 0000000..b10126a
    --- /dev/null
    +++ b/lib/plugins/authad/lang/gl/lang.php
    @@ -0,0 +1,8 @@
    +
    + */
    +$lang['authpwdexpire']         = 'A túa contrasinal expirará en %d días, deberías cambiala pronto.';
    diff --git a/lib/plugins/authad/lang/he/lang.php b/lib/plugins/authad/lang/he/lang.php
    new file mode 100644
    index 0000000..ac8fbcb
    --- /dev/null
    +++ b/lib/plugins/authad/lang/he/lang.php
    @@ -0,0 +1,10 @@
    +
    + * @author Menashe Tomer 
    + */
    +$lang['authpwdexpire']         = 'הסיסמה שלך תפוג ב %d ימים, אתה צריך לשנות את זה בקרוב.';
    +$lang['passchangefail']        = 'שגיאה בשינוי סיסמה. האם הסיסמה תואמת למדיניות המערכת?';
    diff --git a/lib/plugins/authad/lang/he/settings.php b/lib/plugins/authad/lang/he/settings.php
    new file mode 100644
    index 0000000..d0d459c
    --- /dev/null
    +++ b/lib/plugins/authad/lang/he/settings.php
    @@ -0,0 +1,8 @@
    +
    + */
    +$lang['admin_password']        = 'סיסמת המשתמש המוזכן';
    diff --git a/lib/plugins/authad/lang/hr/lang.php b/lib/plugins/authad/lang/hr/lang.php
    new file mode 100644
    index 0000000..04268c2
    --- /dev/null
    +++ b/lib/plugins/authad/lang/hr/lang.php
    @@ -0,0 +1,12 @@
    +
    + */
    +$lang['domain']                = 'Domena za prijavu';
    +$lang['authpwdexpire']         = 'Vaša lozinka će isteći za %d dana, trebate ju promijeniti.';
    +$lang['passchangefail']        = 'Ne mogu izmijeniti lozinku. Možda nije zadovoljen set pravila za lozinke?';
    +$lang['userchangefail']        = 'Greška pri promjeni atributa korisnika. Možda Vaš korisnik nema autorizacije da bi radio promjene?';
    +$lang['connectfail']           = 'Ne mogu se povezati s Active Directory poslužiteljem.';
    diff --git a/lib/plugins/authad/lang/hr/settings.php b/lib/plugins/authad/lang/hr/settings.php
    new file mode 100644
    index 0000000..a34d89b
    --- /dev/null
    +++ b/lib/plugins/authad/lang/hr/settings.php
    @@ -0,0 +1,22 @@
    +
    + */
    +$lang['account_suffix']        = 'Vaš sufiks korisničkog imena. Npr. @my.domain.org';
    +$lang['base_dn']               = 'Vaš bazni DN. Npr. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'Zarezom odvojena lista domenskih kontrolera. Npr. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Privilegirani korisnik Active Directory-a s pristupom svim korisničkim podacima. Opcionalno, ali potrebno za određene akcije kao što je slanje pretplatničkih poruka.';
    +$lang['admin_password']        = 'Lozinka gore navedenoga korisnika.';
    +$lang['sso']                   = 'Da li će Single-Sign-On prijava biti korištena preko Kerberosa ili NTLM-a?';
    +$lang['sso_charset']           = 'Znakovni set koji će se koristiti Kerberos ili NTLM pri slanju imena korisnika. Prazno za UTF-8 ili latin-1. Zahtjeva iconv ekstenziju.';
    +$lang['real_primarygroup']     = 'Da li da se razluči stvarna primarna grupa umjesto pretpostavke da je to "Domain Users" (sporije !).';
    +$lang['use_ssl']               = 'Koristi SSL vezu? Ako da, dolje ne koristi TLS!';
    +$lang['use_tls']               = 'Koristi TLS vezu? Ako da, gore ne koristi SSL!';
    +$lang['debug']                 = 'Prikaži dodatni debug ispis u slučaju greške? ';
    +$lang['expirywarn']            = 'Upozori korisnike o isteku lozinke ovoliko dana. 0 za onemogućavanje. ';
    +$lang['additional']            = 'Zarezom odvojena lista dodatnih AD atributa koji se dohvaćaju iz korisničkih podataka. Koristi se u nekim dodatcima (plugin).';
    +$lang['update_name']           = 'Omogućiti korisnicima da izmjene svoje ime u AD-u?';
    +$lang['update_mail']           = 'Omogućiti korisnicima da izmjene svoju email adresu?';
    diff --git a/lib/plugins/authad/lang/hu/lang.php b/lib/plugins/authad/lang/hu/lang.php
    new file mode 100644
    index 0000000..1efb5e5
    --- /dev/null
    +++ b/lib/plugins/authad/lang/hu/lang.php
    @@ -0,0 +1,13 @@
    +
    + * @author Marton Sebok 
    + */
    +$lang['domain']                = 'Bejelentkezési tartomány';
    +$lang['authpwdexpire']         = 'A jelszavad %d nap múlva lejár, hamarosan meg kell változtatnod.';
    +$lang['passchangefail']        = 'A jelszó megváltoztatása sikertelen. Lehet, hogy nem felel meg a jelszóházirendnek?';
    +$lang['userchangefail']        = 'A felhasználó adatait nem sikerült módosítani. Lehetséges, hogy nincs jogosultságod a változtatásokhoz?';
    +$lang['connectfail']           = 'A csatlakozás az Active Directory szerverhez sikertelen.';
    diff --git a/lib/plugins/authad/lang/hu/settings.php b/lib/plugins/authad/lang/hu/settings.php
    new file mode 100644
    index 0000000..05edfde
    --- /dev/null
    +++ b/lib/plugins/authad/lang/hu/settings.php
    @@ -0,0 +1,26 @@
    +
    + * @author Hamp Gábor 
    + * @author Marton Sebok 
    + * @author Marina Vladi 
    + */
    +$lang['account_suffix']        = 'Felhasználói azonosító végződése, pl. @my.domain.org.';
    +$lang['base_dn']               = 'Bázis DN, pl. DC=my,DC=domain,DC=org.';
    +$lang['domain_controllers']    = 'Tartománykezelők listája vesszővel elválasztva, pl. srv1.domain.org,srv2.domain.org.';
    +$lang['admin_username']        = 'Privilegizált AD felhasználó, aki az összes feéhasználó adatait elérheti. Elhagyható, de bizonyos funkciókhoz, például a feliratkozási e-mailek kiküldéséhez szükséges.';
    +$lang['admin_password']        = 'Ehhez tartozó jelszó.';
    +$lang['sso']                   = 'Kerberos egyszeri bejelentkezés vagy NTLM használata?';
    +$lang['sso_charset']           = 'A webkiszolgáló karakterkészlete megfelel a Kerberos- és NTLM-felhasználóneveknek. Üres UTF-8 és Latin-1-hez. Szükséges az iconv bővítmény.';
    +$lang['real_primarygroup']     = 'A valódi elsődleges csoport feloldása a "Tartományfelhasználók" csoport használata helyett? (lassabb)';
    +$lang['use_ssl']               = 'SSL használata? Ha használjuk, tiltsuk le a TLS-t!';
    +$lang['use_tls']               = 'TLS használata? Ha használjuk, tiltsuk le az SSL-t!';
    +$lang['debug']                 = 'További hibakeresési üzenetek megjelenítése hiba esetén';
    +$lang['expirywarn']            = 'Felhasználók értesítése ennyi nappal a jelszavuk lejárata előtt. 0 a funkció kikapcsolásához.';
    +$lang['additional']            = 'Vesszővel elválasztott lista a további AD attribútumok lekéréséhez. Néhány bővítmény használhatja.';
    +$lang['update_name']           = 'Engedélyezed a felhasználóknak, hogy módosítsák az AD megjelenési nevüket?';
    +$lang['update_mail']           = 'A felhasználók frissíthetik (megváltozatathatják) az emailcímüket?';
    +$lang['update_pass']           = 'Engedélyezed a felhasználóknak a jelszavuk módosítását? Az SSL vagy TLS engedélyezése szükséges.';
    diff --git a/lib/plugins/authad/lang/it/lang.php b/lib/plugins/authad/lang/it/lang.php
    new file mode 100644
    index 0000000..ee97442
    --- /dev/null
    +++ b/lib/plugins/authad/lang/it/lang.php
    @@ -0,0 +1,13 @@
    +
    + * @author Torpedo 
    + */
    +$lang['domain']                = 'Dominio di accesso';
    +$lang['authpwdexpire']         = 'La tua password scadrà in %d giorni, dovresti cambiarla quanto prima.';
    +$lang['passchangefail']        = 'Cambio password fallito. Forse non sono state rispettate le regole adottate per le password';
    +$lang['userchangefail']        = 'Cambio attributi utente fallito. Forse il tuo account non ha i permessi per eseguire delle modifiche?';
    +$lang['connectfail']           = 'Connessione fallita al server Active Directory';
    diff --git a/lib/plugins/authad/lang/it/settings.php b/lib/plugins/authad/lang/it/settings.php
    new file mode 100644
    index 0000000..768e36b
    --- /dev/null
    +++ b/lib/plugins/authad/lang/it/settings.php
    @@ -0,0 +1,27 @@
    +
    + * @author Roberto Bellingeri 
    + * @author Edmondo Di Tucci 
    + * @author Torpedo 
    + */
    +$lang['account_suffix']        = 'Il suffisso del tuo account. Eg. @my.domain.org';
    +$lang['base_dn']               = 'Il tuo DN. base Eg. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'Elenco separato da virgole di Domain Controllers. Eg. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Utente privilegiato di Active Directory con accesso ai dati di tutti gli utenti. Opzionale ma necessario per alcune attività come mandare email di iscrizione.';
    +$lang['admin_password']        = 'La password dell\'utente soprascritto.';
    +$lang['sso']                   = 'Deve essere usato Single-Sign-On via Kerberos oppure NTLM?';
    +$lang['sso_charset']           = 'Il set di caratteri che il tuo web server passera nel nome utente Kerberos o NTLM. Lasciare vuoto per UTF-8 p latin-1. Richiesta estensione iconv. ';
    +$lang['real_primarygroup']     = 'Se il vero gruppo primario dovesse essere risolo invece di assumere "Domain Users" (lento).';
    +$lang['use_ssl']               = 'Usare la connessione SSL? Se usata, non abilitare TSL qui sotto.';
    +$lang['use_tls']               = 'Usare la connessione TSL? Se usata, non abilitare SSL qui sopra.';
    +$lang['debug']                 = 'Visualizzare output addizionale di debug per gli errori?';
    +$lang['expirywarn']            = 'Giorni di preavviso per la scadenza della password dell\'utente. 0 per disabilitare.';
    +$lang['additional']            = 'Valori separati da virgola di attributi AD addizionali da caricare dai dati utente. Usato da alcuni plugin.';
    +$lang['update_name']           = 'Permettere agli utenti di aggiornare il loro nome AD visualizzato? ';
    +$lang['update_mail']           = 'Permettere agli utenti di aggiornare il loro indirizzo e-mail?';
    +$lang['update_pass']           = 'Permettere agli utenti di aggiornare la password? Richiede SSL o TLS';
    +$lang['recursive_groups']      = 'Risolvi i gruppi nidificati ai rispettivi membri (più lento).';
    diff --git a/lib/plugins/authad/lang/ja/lang.php b/lib/plugins/authad/lang/ja/lang.php
    new file mode 100644
    index 0000000..602b079
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ja/lang.php
    @@ -0,0 +1,15 @@
    +
    + * @author Osaka 
    + * @author Ikuo Obataya 
    + * @author Hideaki SAWADA 
    + */
    +$lang['domain']                = 'ログオン時のドメイン';
    +$lang['authpwdexpire']         = 'あなたのパスワードは、あと%d日で有効期限が切れます。パスワードを変更してください。';
    +$lang['passchangefail']        = 'パスワードを変更できませんでした。パスワードのルールに合わなかったのかもしれません。';
    +$lang['userchangefail']        = 'ユーザー属性を変更できませんでした。おそらく、変更権限のないアカウントです。';
    +$lang['connectfail']           = 'Active Directoryサーバーに接続できませんでした。';
    diff --git a/lib/plugins/authad/lang/ja/settings.php b/lib/plugins/authad/lang/ja/settings.php
    new file mode 100644
    index 0000000..84f09b4
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ja/settings.php
    @@ -0,0 +1,26 @@
    +
    + * @author Satoshi Sahara 
    + * @author Hideaki SAWADA 
    + * @author PzF_X 
    + */
    +$lang['account_suffix']        = 'アカウントの接尾語(例:@my.domain.org)';
    +$lang['base_dn']               = 'ベースDN(例:DC=my,DC=domain,DC=org)';
    +$lang['domain_controllers']    = 'ドメインコントローラのカンマ区切り一覧(例:srv1.domain.org,srv2.domain.org)';
    +$lang['admin_username']        = '全ユーザーデータへのアクセス権のある特権Active Directoryユーザー(任意ですが、メール通知の登録等の特定の動作に必要となります。)';
    +$lang['admin_password']        = '上記ユーザーのパスワード';
    +$lang['sso']                   = 'Kerberos か NTLM を使ったシングルサインオン(SSO)をしますか?';
    +$lang['sso_charset']           = 'サーバーは空のUTF-8かLatin-1でKerberosかNTLMユーザネームを送信します。iconv拡張モジュールが必要です。';
    +$lang['real_primarygroup']     = '"Domain Users" を仮定する代わりに本当のプライマリグループを解決する(低速)';
    +$lang['use_ssl']               = 'SSL接続を使用する(使用する場合、下のTLSを有効にしないでください。)';
    +$lang['use_tls']               = 'TLS接続を使用する(使用する場合、上のSSLを有効にしないでください。)';
    +$lang['debug']                 = 'エラー時に追加のデバッグ出力を表示する';
    +$lang['expirywarn']            = '何日前からパスワードの有効期限をユーザーに警告するか(0 の場合は無効)';
    +$lang['additional']            = 'ユーザデータから取得する追加AD属性のカンマ区切り一覧(一部プラグインが使用します。)';
    +$lang['update_name']           = 'ユーザー自身にAD表示名の変更を許可する';
    +$lang['update_mail']           = 'ユーザー自身にメールアドレスの変更を許可する';
    +$lang['recursive_groups']      = 'それぞれのメンバーについて入れ子のグループを解決する(動作が遅くなります)';
    diff --git a/lib/plugins/authad/lang/ka/lang.php b/lib/plugins/authad/lang/ka/lang.php
    new file mode 100644
    index 0000000..474906c
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ka/lang.php
    @@ -0,0 +1,8 @@
    +
    + */
    +$lang['authpwdexpire']         = 'თქვენს პაროლს ვადა გაუვა %d დღეში, მალე შეცვლა მოგიწევთ.';
    diff --git a/lib/plugins/authad/lang/ko/lang.php b/lib/plugins/authad/lang/ko/lang.php
    new file mode 100644
    index 0000000..0a652ad
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ko/lang.php
    @@ -0,0 +1,13 @@
    +
    + * @author Erial 
    + */
    +$lang['domain']                = '로그온 도메인';
    +$lang['authpwdexpire']         = '비밀번호를 바꾼지 %d일이 지났으며, 비밀번호를 곧 바꿔야 합니다.';
    +$lang['passchangefail']        = '비밀번호를 바꾸는 데 실패했습니다. 비밀번호 정책을 따르지 않은 건 아닐까요?';
    +$lang['userchangefail']        = '사용자 특성을 바꾸는 데 실패했습니다. 당신의 계정에 바꿀 권한이 없는 건 아닐까요?';
    +$lang['connectfail']           = 'Active Directory 서버에 연결하는 데 실패했습니다.';
    diff --git a/lib/plugins/authad/lang/ko/settings.php b/lib/plugins/authad/lang/ko/settings.php
    new file mode 100644
    index 0000000..605819f
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ko/settings.php
    @@ -0,0 +1,23 @@
    +
    + * @author Garam 
    + */
    +$lang['account_suffix']        = '계정 접미어. 예를 들어 @my.domain.org';
    +$lang['base_dn']               = '기본 DN. 예를 들어 DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = '도메인 컨트롤러의 쉼표로 구분한 목록. 예를 들어 srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = '다른 모든 사용자의 데이터에 접근할 수 있는 권한이 있는 Active Directory 사용자. 선택적이지만 구독 메일을 보내는 등의 특정 작업에 필요합니다.';
    +$lang['admin_password']        = '위 사용자의 비밀번호.';
    +$lang['sso']                   = 'Kerberos나 NTLM을 통해 Single-Sign-On을 사용해야 합니까?';
    +$lang['sso_charset']           = '당신의 웹서버의 문자집합은 Kerberos나 NTLM 사용자 이름으로 전달됩니다. UTF-8이나 라린-1이 비어 있습니다. icov 확장 기능이 필요합니다.';
    +$lang['real_primarygroup']     = '실제 기본 그룹은 "도메인 사용자"를 가정하는 대신 해결될 것입니다. (느림)';
    +$lang['use_ssl']               = 'SSL 연결을 사용합니까? 사용한다면 아래 TLS을 활성화하지 마세요.';
    +$lang['use_tls']               = 'TLS 연결을 사용합니까? 사용한다면 위 SSL을 활성화하지 마세요.';
    +$lang['debug']                 = '오류에 대한 추가적인 디버그 정보를 보이겠습니까?';
    +$lang['expirywarn']            = '미리 비밀번호 만료를 사용자에게 경고할 날짜. 0일 경우 비활성화합니다.';
    +$lang['additional']            = '사용자 데이터에서 가져올 추가적인 AD 속성의 쉼표로 구분한 목록. 일부 플러그인이 사용합니다.';
    +$lang['update_name']           = '사용자가 자신의 AD 표시 이름을 업데이트할 수 있도록 하겠습니까?';
    +$lang['update_mail']           = '사용자가 자신의 이메일 주소를 업데이트할 수 있도록 하겠습니까?';
    diff --git a/lib/plugins/authad/lang/lv/lang.php b/lib/plugins/authad/lang/lv/lang.php
    new file mode 100644
    index 0000000..fd20d34
    --- /dev/null
    +++ b/lib/plugins/authad/lang/lv/lang.php
    @@ -0,0 +1,13 @@
    +
    + * @author Aivars Miška 
    + */
    +$lang['domain']                = 'Iežurnālēšanās domēns';
    +$lang['authpwdexpire']         = 'Tavai parolei pēc %d dienām biegsies termiņš, tā drīzumā jānomaina.';
    +$lang['passchangefail']        = 'Neizdevās nomainīt paroli. Varbūt parole neatbilst noteikumiem?';
    +$lang['userchangefail']        = 'Neizdevās labot lietotāju. Varbūt jūsu kontam nav nepieciešamās atļaujas?';
    +$lang['connectfail']           = 'Neizdevās savienotes ar aktīvās direktorijas serveri.';
    diff --git a/lib/plugins/authad/lang/lv/settings.php b/lib/plugins/authad/lang/lv/settings.php
    new file mode 100644
    index 0000000..72b9cf2
    --- /dev/null
    +++ b/lib/plugins/authad/lang/lv/settings.php
    @@ -0,0 +1,13 @@
    +
    + * @author Aivars Miška 
    + */
    +$lang['account_suffix']        = 'Jūsu konta sufikss. Piemēram, @my.domain.org';
    +$lang['base_dn']               = 'Jūsu bāzes DN. Piemēram, DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'Ar komatiem atdalīts domēna kontroleru saraksts. Piemēram, srv1.domain.org,srv2.domain.org';
    +$lang['admin_password']        = 'Minētā lietotāja parole.';
    +$lang['expirywarn']            = 'Cik dienas iepriekš brīdināt lietotāju par paroles termiņa beigām. Ierakstīt 0, lai atspējotu.';
    diff --git a/lib/plugins/authad/lang/nl/lang.php b/lib/plugins/authad/lang/nl/lang.php
    new file mode 100644
    index 0000000..1449b19
    --- /dev/null
    +++ b/lib/plugins/authad/lang/nl/lang.php
    @@ -0,0 +1,15 @@
    +
    + * @author Dion Nicolaas 
    + * @author Hugo Smet 
    + * @author Wesley de Weerd 
    + */
    +$lang['domain']                = 'Inlog Domein';
    +$lang['authpwdexpire']         = 'Je wachtwoord verloopt in %d dagen, je moet het binnenkort veranderen';
    +$lang['passchangefail']        = 'Wijziging van het paswoord is mislukt. Wellicht beantwoord het paswoord niet aan de voorwaarden. ';
    +$lang['userchangefail']        = 'Kan gebruiker attributen veranderen . Misschien heeft uw account geen rechten om wijzigingen aan te brengen?';
    +$lang['connectfail']           = 'Connectie met Active Directory server mislukt.';
    diff --git a/lib/plugins/authad/lang/nl/settings.php b/lib/plugins/authad/lang/nl/settings.php
    new file mode 100644
    index 0000000..b8b58a1
    --- /dev/null
    +++ b/lib/plugins/authad/lang/nl/settings.php
    @@ -0,0 +1,25 @@
    +
    + * @author Remon 
    + * @author Sjoerd 
    + */
    +$lang['account_suffix']        = 'Je account domeinnaam. Bijv @mijn.domein.org';
    +$lang['base_dn']               = 'Je basis DN. Bijv. DC=mijn,DC=domein,DC=org';
    +$lang['domain_controllers']    = 'Eeen kommagescheiden lijst van domeinservers. Bijv. srv1.domein.org,srv2.domein.org';
    +$lang['admin_username']        = 'Een geprivilegeerde Active Directory gebruiker die bij alle gebruikersgegevens kan komen. Dit is optioneel maar kan nodig zijn voor bepaalde acties, zoals het versturen van abonnementsmailtjes.';
    +$lang['admin_password']        = 'Het wachtwoord van bovenstaande gebruiker.';
    +$lang['sso']                   = 'Wordt voor Single-Sign-on Kerberos of NTLM gebruikt?';
    +$lang['sso_charset']           = 'Het tekenset waarin je webserver de Kerberos of NTLM gebruikersnaam doorsturen. Leeglaten voor UTF-8 of latin-1. Vereist de iconv extensie.';
    +$lang['real_primarygroup']     = 'Moet de echte primaire groep worden opgezocht in plaats van het aannemen van "Domeingebruikers" (langzamer)';
    +$lang['use_ssl']               = 'SSL verbinding gebruiken? Zo ja, activeer dan niet de TLS optie hieronder.';
    +$lang['use_tls']               = 'TLS verbinding gebruiken? Zo ja, activeer dan niet de SSL verbinding hierboven.';
    +$lang['debug']                 = 'Aanvullende debug informatie tonen bij fouten?';
    +$lang['expirywarn']            = 'Waarschuwingstermijn voor vervallen wachtwoord. 0 om te deactiveren.';
    +$lang['additional']            = 'Een kommagescheiden lijst van extra AD attributen van de gebruiker. Wordt gebruikt door sommige plugins.';
    +$lang['update_name']           = 'Sta gebruikers toe om hun getoonde AD naam bij te werken';
    +$lang['update_mail']           = 'Sta gebruikers toe hun email adres bij te werken';
    +$lang['recursive_groups']      = 'Zoek voor de geneste groepen hun respectievelijke leden op (langzamer).';
    diff --git a/lib/plugins/authad/lang/no/lang.php b/lib/plugins/authad/lang/no/lang.php
    new file mode 100644
    index 0000000..c702e9e
    --- /dev/null
    +++ b/lib/plugins/authad/lang/no/lang.php
    @@ -0,0 +1,16 @@
    +
    + * @author Thomas Juberg 
    + * @author Danny Buckhof 
    + * @author Patrick Sletvold 
    + * @author Arne Hanssen 
    + */
    +$lang['domain']                = 'Loggpå-domene';
    +$lang['authpwdexpire']         = 'Ditt passord går ut om %d dager, du bør endre det snarest.';
    +$lang['passchangefail']        = 'Feil ved endring av passord. Det kan være at passordet ikke er i tråd med passordpolicyen ';
    +$lang['userchangefail']        = 'Klarte ikke å endre brukerattributter. Kanskje gar ikke kontoen din rettigheter til å gjøre endringer?';
    +$lang['connectfail']           = 'Feil ved kontakt med Active Directory serveren.';
    diff --git a/lib/plugins/authad/lang/no/settings.php b/lib/plugins/authad/lang/no/settings.php
    new file mode 100644
    index 0000000..a374f38
    --- /dev/null
    +++ b/lib/plugins/authad/lang/no/settings.php
    @@ -0,0 +1,26 @@
    +
    + * @author Patrick 
    + * @author Danny Buckhof 
    + * @author Patrick Sletvold 
    + * @author Arne Hanssen 
    + */
    +$lang['account_suffix']        = 'Ditt konto-suffiks F. Eks. @my.domain.org';
    +$lang['base_dn']               = 'Din rot-DN. F.eks. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'En kommaseparert liste over domenekontrollere. Eks. srv1.domene.org,srv2.domene.org';
    +$lang['admin_username']        = 'En «Active Directory»-bruker med tilgang til alle andre brukeres data. Valgfritt, men nødvendig for visse handlinger f.eks. for utsendelse av e-poster til abonnenter.';
    +$lang['admin_password']        = 'Passordet til brukeren over.';
    +$lang['sso']                   = 'Skal engangspålogging via Kerberos eller NTLM bli brukt?';
    +$lang['sso_charset']           = 'Tegnsettet din web-server vil bruke for ditt Kerberos- eller NTLM-brukernavn. La stå tomt for UTF-8 eller ISO Latin-1. Avhengig av utvidelsen iconv.';
    +$lang['real_primarygroup']     = 'Skal en finne den virkelige gruppen i stedet for å anta at dette er "domene-brukere" (tregere).';
    +$lang['use_ssl']               = 'Bruk SSL tilknytning? Hvis denne brukes, ikke aktiver TLS nedenfor.';
    +$lang['use_tls']               = 'Bruk TLS tilknytning? Hvis denne brukes, ikke aktiver SSL over.';
    +$lang['debug']                 = 'Ved feil, vise tilleggsinformasjon for feilsøking?';
    +$lang['expirywarn']            = 'Antall dager på forhånd brukeren varsles om at passordet utgår. 0 for å deaktivere.';
    +$lang['additional']            = 'En kommaseparert liste med AD-attributter som skal hentes fra brukerdata. Blir brukt av enkelte programtillegg.';
    +$lang['update_name']           = 'Tillate at brukere endrer AD-visningsnavnet sitt?';
    +$lang['update_mail']           = 'Tillate at brukere endrer e-postadressen sin?';
    diff --git a/lib/plugins/authad/lang/pl/lang.php b/lib/plugins/authad/lang/pl/lang.php
    new file mode 100644
    index 0000000..8ea095a
    --- /dev/null
    +++ b/lib/plugins/authad/lang/pl/lang.php
    @@ -0,0 +1,13 @@
    +
    + * @author Aoi Karasu 
    + */
    +$lang['domain']                = 'Domena logowania';
    +$lang['authpwdexpire']         = 'Twoje hasło wygaśnie za %d dni. Należy je zmienić w krótkim czasie.';
    +$lang['passchangefail']        = 'Nie udało się zmienić hasła. Możliwe, że zasady dotyczące haseł nie zostały spełnione.';
    +$lang['userchangefail']        = 'Nie udało się zmienić atrybutów użytkownika. Możliwe, że twoje konto nie ma uprawnień do wprowadzania zmian.';
    +$lang['connectfail']           = 'Nie można połączyć się z serwerem Active Directory.';
    diff --git a/lib/plugins/authad/lang/pl/settings.php b/lib/plugins/authad/lang/pl/settings.php
    new file mode 100644
    index 0000000..300dcd7
    --- /dev/null
    +++ b/lib/plugins/authad/lang/pl/settings.php
    @@ -0,0 +1,36 @@
    +
    + * @author Michał 
    + * @author pavulondit 
    + * @author Bartek S 
    + * @author Przemek 
    + * @author Wojciech Lichota 
    + * @author Max 
    + * @author Tomasz Bosak 
    + * @author Paweł Jan Czochański 
    + * @author Mati 
    + * @author Maciej Helt 
    + * @author Kris Charatonik 
    + */
    +$lang['account_suffix']        = 'Przyrostek twojej nazwy konta np. @my.domain.org';
    +$lang['base_dn']               = 'Twoje bazowe DN. Na przykład: DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'Podzielona przecinkami lista kontrolerów domen np. srv1.domena.pl,srv2.domena.pl';
    +$lang['admin_username']        = 'Uprawniony użytkownik katalogu Active Directory z dostępem do danych wszystkich użytkowników.
    +Opcjonalne, ale wymagane dla niektórych akcji np. wysyłania emailowych subskrypcji.';
    +$lang['admin_password']        = 'Hasło dla powyższego użytkownika.';
    +$lang['sso']                   = 'Czy pojedyncze logowanie powinno korzystać z Kerberos czy NTML?';
    +$lang['sso_charset']           = 'Kodowanie znaków wykorzystywane do przesyłania nazwy użytkownika dla Kerberos lub NTLM. Pozostaw puste dla UTF-8 lub latin-1. Wymaga rozszerzenia iconv.';
    +$lang['real_primarygroup']     = 'Czy prawdziwa grupa podstawowa powinna zostać pobrana, zamiast  przyjmowania domyślnej wartości "Domain Users" (wolniej).';
    +$lang['use_ssl']               = 'Użyć połączenie SSL? Jeśli tak to nie aktywuj TLS poniżej.';
    +$lang['use_tls']               = 'Użyć połączenie TLS? Jeśli tak to nie aktywuj SSL powyżej.';
    +$lang['debug']                 = 'Wyświetlać dodatkowe informacje do debugowania w przypadku błędów?';
    +$lang['expirywarn']            = 'Dni poprzedzających powiadomienie użytkownika o wygasającym haśle. 0 aby wyłączyć.';
    +$lang['additional']            = 'Oddzielona przecinkami lista dodatkowych atrybutów AD do pobrania z danych użytkownika. Używane przez niektóre wtyczki.';
    +$lang['update_name']           = 'Zezwól użytkownikom na uaktualnianie nazwy wyświetlanej w AD?';
    +$lang['update_mail']           = 'Zezwól użytkownikom na uaktualnianie ich adresu email?';
    +$lang['update_pass']           = 'Zezwolić użytkownikom na aktualizację hasła? Wymaga SSL lub TLS powyżej.';
    +$lang['recursive_groups']      = 'Rozpatrz grupy zagnieżdżone dla odpowiednich członków (wolniej).';
    diff --git a/lib/plugins/authad/lang/pt-br/lang.php b/lib/plugins/authad/lang/pt-br/lang.php
    new file mode 100644
    index 0000000..8a30102
    --- /dev/null
    +++ b/lib/plugins/authad/lang/pt-br/lang.php
    @@ -0,0 +1,14 @@
    +
    + * @author Frederico Gonçalves Guimarães 
    + * @author Guilherme Cardoso 
    + */
    +$lang['domain']                = 'Domínio de "Logon"';
    +$lang['authpwdexpire']         = 'Sua senha vai expirar em %d dias. Você deve mudá-la assim que for possível.';
    +$lang['passchangefail']        = 'Não foi possível alterar a senha. Pode ser algum conflito com a política de senhas.';
    +$lang['userchangefail']        = 'Falha ao mudar os atributos do usuário. Talvez a sua conta não tenha permissões para fazer mudanças.';
    +$lang['connectfail']           = 'Não foi possível conectar ao servidor Active Directory.';
    diff --git a/lib/plugins/authad/lang/pt-br/settings.php b/lib/plugins/authad/lang/pt-br/settings.php
    new file mode 100644
    index 0000000..7674b0f
    --- /dev/null
    +++ b/lib/plugins/authad/lang/pt-br/settings.php
    @@ -0,0 +1,28 @@
    +
    + * @author Frederico Gonçalves Guimarães 
    + * @author Victor Westmann 
    + * @author Juliano Marconi Lanigra 
    + * @author Viliam Dias 
    + */
    +$lang['account_suffix']        = 'Sufixo de sua conta. Eg. @meu.domínio.org';
    +$lang['base_dn']               = 'Sua base DN. Eg. DC=meu,DC=domínio,DC=org';
    +$lang['domain_controllers']    = 'Uma lista de controles de domínios separada por vírgulas. Eg. srv1.domínio.org,srv2.domínio.org';
    +$lang['admin_username']        = 'Um usuário do Active Directory com privilégios para acessar os dados de todos os outros usuários. Opcional, mas necessário para realizar certas ações, tais como enviar mensagens de assinatura.';
    +$lang['admin_password']        = 'A senha do usuário acima.';
    +$lang['sso']                   = 'Usar Single-Sign-On através do Kerberos ou NTLM?';
    +$lang['sso_charset']           = 'A codificação de caracteres que seu servidor web passará o nome de usuário Kerberos ou NTLM. Vazio para UTF-8 ou latin-1. Requere a extensão iconv.';
    +$lang['real_primarygroup']     = 'O grupo primário real deve ser resolvido ao invés de assumirmos como "Usuários do Domínio" (mais lento)';
    +$lang['use_ssl']               = 'Usar conexão SSL? Se usar, não habilitar TLS abaixo.';
    +$lang['use_tls']               = 'Usar conexão TLS? se usar, não habilitar SSL acima.';
    +$lang['debug']                 = 'Mostrar saída adicional de depuração em mensagens de erros?';
    +$lang['expirywarn']            = 'Dias com antecedência para avisar o usuário de uma senha que vai expirar. 0 para desabilitar.';
    +$lang['additional']            = 'Uma lista separada de vírgulas de atributos adicionais AD para pegar dados de usuários. Usados por alguns plugins.';
    +$lang['update_name']           = 'Permitir aos usuários que atualizem seus nomes de exibição AD?';
    +$lang['update_mail']           = 'Permitir aos usuários que atualizem seu endereço de e-mail?';
    +$lang['update_pass']           = 'Permitir que os usuários atualizem suas senhas? Requer SSL ou TLS acima.';
    +$lang['recursive_groups']      = 'Resolver grupos aninhados para seus respectivos membros (mais lento).';
    diff --git a/lib/plugins/authad/lang/pt/lang.php b/lib/plugins/authad/lang/pt/lang.php
    new file mode 100644
    index 0000000..5d4a9a3
    --- /dev/null
    +++ b/lib/plugins/authad/lang/pt/lang.php
    @@ -0,0 +1,16 @@
    +
    + * @author Maykon Oliveira 
    + * @author Paulo Silva 
    + * @author André Neves 
    + * @author Paulo Carmino 
    + */
    +$lang['domain']                = 'Domínio de Login';
    +$lang['authpwdexpire']         = 'A sua senha expira dentro de %d dias, deve mudá-la em breve.';
    +$lang['passchangefail']        = 'Falha ao alterar a senha. Tente prosseguir com uma senha mais segura.';
    +$lang['userchangefail']        = 'Não foi possível alterar os atributos do usuário. Talvez sua conta não tenha permissões para fazer alterações?';
    +$lang['connectfail']           = 'Falha ao conectar com o servidor Active Directory.';
    diff --git a/lib/plugins/authad/lang/pt/settings.php b/lib/plugins/authad/lang/pt/settings.php
    new file mode 100644
    index 0000000..8c92330
    --- /dev/null
    +++ b/lib/plugins/authad/lang/pt/settings.php
    @@ -0,0 +1,31 @@
    +
    + * @author Paulo Schopf 
    + * @author Maykon Oliveira 
    + * @author André Neves 
    + * @author Murilo 
    + * @author Paulo Silva 
    + * @author Guido Salatino 
    + * @author Guilherme Sá 
    + */
    +$lang['account_suffix']        = 'O sufixo da sua conta. Por exemplo, @my.domain.org';
    +$lang['base_dn']               = 'Sua base DN. Eg.  DC=meu, DC=dominio, DC=org ';
    +$lang['domain_controllers']    = 'Uma lista separada por vírgulas de Controladores de Domínio (AD DC). Ex.: srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Um usuário com privilégios no Active Directory que tenha acesso aos dados de todos os outros usuários. Opcional, mas necessário para certas ações como enviar e-mails de subscrição.';
    +$lang['admin_password']        = 'A senha para o usuário acima.';
    +$lang['sso']                   = 'Deve ser usado o Single-Sign-On via Kerberos ou NTLM?';
    +$lang['sso_charset']           = 'O charset do seu servidor web vai passar o nome de usuário Kerberos ou NTLM  vazio para UTF-8 ou latin-1. Requer a extensão iconv.';
    +$lang['real_primarygroup']     = 'O grupo primário deveria ser resolvido ao invés de assumir "Usuários de Domínio" (mais lento).';
    +$lang['use_ssl']               = 'Usar conexão SSL? Se usada, não ative a TLS abaixo.';
    +$lang['use_tls']               = 'Usar conexão TLS? Se usada, não ative SSL abaixo.';
    +$lang['debug']                 = 'Deve-se mostrar saída adicional de depuração de erros?';
    +$lang['expirywarn']            = 'Número de dias de avanço para avisar o utilizador da expiração da senha. 0 para desativar.';
    +$lang['additional']            = 'Uma lista separada por vírgula de atributos adicionais de AD para buscar a partir de dados do usuário. Usado por alguns plugins.';
    +$lang['update_name']           = 'Permitir que os usuários atualizem seu nome de exibição do AD?';
    +$lang['update_mail']           = 'Permitir que usuários atualizem seus endereços de e-mail?';
    +$lang['update_pass']           = 'Permitir que os usuários atualizem suas senhas? Requer SSL ou TLS.';
    +$lang['recursive_groups']      = 'Resolve grupos aninhados para seus respectivos membros (mais lento).';
    diff --git a/lib/plugins/authad/lang/ro/lang.php b/lib/plugins/authad/lang/ro/lang.php
    new file mode 100644
    index 0000000..f08a22c
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ro/lang.php
    @@ -0,0 +1,11 @@
    +
    + * @author Adrian Vesa 
    + */
    +$lang['authpwdexpire']         = 'Parola va expira în %d zile, ar trebui să o schimbi în curând.';
    +$lang['passchangefail']        = 'Parola nu a putu fi schimbata. Poate politica pentru parole nu a fost indeplinita ?';
    +$lang['userchangefail']        = 'Nu am putu schimba atributiile pentru acest utilizator. Poate nu ai permisiunea sa faci aceste schimbari ?';
    diff --git a/lib/plugins/authad/lang/ro/settings.php b/lib/plugins/authad/lang/ro/settings.php
    new file mode 100644
    index 0000000..2a2541a
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ro/settings.php
    @@ -0,0 +1,8 @@
    +
    + */
    +$lang['admin_password']        = 'Parola utilizatorului de mai sus.';
    diff --git a/lib/plugins/authad/lang/ru/lang.php b/lib/plugins/authad/lang/ru/lang.php
    new file mode 100644
    index 0000000..0d398f7
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ru/lang.php
    @@ -0,0 +1,15 @@
    +
    + * @author Aleksandr Selivanov 
    + * @author Takumo <9206984@mail.ru>
    + * @author dimsharav 
    + */
    +$lang['domain']                = 'Домен';
    +$lang['authpwdexpire']         = 'Действие вашего пароля истекает через %d дней. Вы должны изменить его как можно скорее.';
    +$lang['passchangefail']        = 'Не удалось изменить пароль. Возможно, он не соответствует требованиям к паролю.';
    +$lang['userchangefail']        = 'Ошибка при изменении атрибутов пользователя. Возможно, у Вашей учетной записи недостаточно прав?';
    +$lang['connectfail']           = 'Невозможно соединиться с сервером Active Directory.';
    diff --git a/lib/plugins/authad/lang/ru/settings.php b/lib/plugins/authad/lang/ru/settings.php
    new file mode 100644
    index 0000000..e5abf8f
    --- /dev/null
    +++ b/lib/plugins/authad/lang/ru/settings.php
    @@ -0,0 +1,33 @@
    +
    + * @author Alexander Kh. <001.arx@gmail.com>
    + * @author Yuriy Skalko 
    + * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua)
    + * @author Artur 
    + * @author Erli Moen 
    + * @author Владимир 
    + * @author Type-kun 
    + * @author Vitaly Filatenko 
    + * @author Radimir 
    + */
    +$lang['account_suffix']        = 'Суффикс вашего аккаунта. Например, @my.domain.org';
    +$lang['base_dn']               = 'Ваш базовый DN. Например: DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'Список контроллеров домена, разделённых запятой. Например:srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Привилегированный пользователь Active Directory с доступом ко всем остальным пользовательским данным. Необязательно, однако необходимо для определённых действий вроде отправки почтовой подписки.';
    +$lang['admin_password']        = 'Пароль для указанного пользователя.';
    +$lang['sso']                   = 'Использовать SSO (Single-Sign-On) через Kerberos или NTLM?';
    +$lang['sso_charset']           = 'Кодировка, в которой веб-сервер передаёт имя пользователя Kerberos или NTLM. Для UTF-8 или latin-1 остаётся пустым. Требует расширение iconv.';
    +$lang['real_primarygroup']     = 'Должна ли использоваться настоящая первичная группа вместо “Domain Users” (медленнее).';
    +$lang['use_ssl']               = 'Использовать SSL? Если да, то не включайте TLS.';
    +$lang['use_tls']               = 'Использовать TLS? Если да, то не включайте SSL.';
    +$lang['debug']                 = 'Выводить дополнительную информацию при ошибках?';
    +$lang['expirywarn']            = 'За сколько дней нужно предупреждать пользователя о необходимости изменить пароль? Для отключения укажите 0 (ноль).';
    +$lang['additional']            = 'Дополнительные AD-атрибуты, разделённые запятой, для выборки из данных пользователя. Используется некоторыми плагинами.';
    +$lang['update_name']           = 'Разрешить пользователям изменять своё AD-имя?';
    +$lang['update_mail']           = 'Разрешить пользователям изменять свой электронный адрес?';
    +$lang['update_pass']           = 'Разрешить пользователям изменять свой пароль? Требуется SSL или TLS.';
    +$lang['recursive_groups']      = 'Разрешить вложенные группы их соответствующим членам.';
    diff --git a/lib/plugins/authad/lang/sk/lang.php b/lib/plugins/authad/lang/sk/lang.php
    new file mode 100644
    index 0000000..1ff338d
    --- /dev/null
    +++ b/lib/plugins/authad/lang/sk/lang.php
    @@ -0,0 +1,12 @@
    +
    + */
    +$lang['domain']                = 'Prihlasovacia doména';
    +$lang['authpwdexpire']         = 'Platnosť hesla vyprší za %d dní, mali by ste ho zmeniť čo najskôr.';
    +$lang['passchangefail']        = 'Nepodarilo sa zmeniť heslo. Možno neboli splnené podmienky';
    +$lang['userchangefail']        = 'Nepodarilo sa zmeniť atribúty používateľa. Možno tvoj účet nemá oprávnenia na vykonanie týchto zmien?';
    +$lang['connectfail']           = 'Nepodarilo sa pripojiť na Active Directory server.';
    diff --git a/lib/plugins/authad/lang/sk/settings.php b/lib/plugins/authad/lang/sk/settings.php
    new file mode 100644
    index 0000000..a8aabc7
    --- /dev/null
    +++ b/lib/plugins/authad/lang/sk/settings.php
    @@ -0,0 +1,22 @@
    +
    + */
    +$lang['account_suffix']        = 'Prípona používateľského účtu. Napr. @my.domain.org';
    +$lang['base_dn']               = 'Vaše base DN. Napr. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'Zoznam doménových radičov oddelených čiarkou. Napr. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Privilegovaný používateľ Active Directory s prístupom ku všetkým dátam ostatných používateľov. Nepovinné nastavenie, ale potrebné pre určité akcie ako napríklad zasielanie mailov o zmenách.';
    +$lang['admin_password']        = 'Heslo vyššie uvedeného používateľa.';
    +$lang['sso']                   = 'Použiť Single-Sign-On cez Kerberos alebo NTLM?';
    +$lang['sso_charset']           = 'Znaková sada, v ktorej bude webserver prenášať meno Kerberos or NTLM používateľa. Prázne pole znamená UTF-8 alebo latin-1. Vyžaduje iconv rozšírenie.';
    +$lang['real_primarygroup']     = 'Použiť skutočnú primárnu skupinu používateľa namiesto "Doménoví používatelia" (pomalšie).';
    +$lang['use_ssl']               = 'Použiť SSL pripojenie? Ak áno, nepovoľte TLS nižšie.';
    +$lang['use_tls']               = 'Použiť TLS pripojenie? Ak áno, nepovoľte SSL vyššie.';
    +$lang['debug']                 = 'Zobraziť dodatočné ladiace informácie pri chybe?';
    +$lang['expirywarn']            = 'Počet dní pred uplynutím platnosti hesla, počas ktorých používateľ dostáva upozornenie. 0 deaktivuje túto voľbu.';
    +$lang['additional']            = 'Zoznam dodatočných AD atribútov oddelených čiarkou získaných z údajov používateľa. Používané niektorými pluginmi.';
    +$lang['update_name']           = 'Povoliť používateľom zmenu ich zobrazovaného mena v AD?';
    +$lang['update_mail']           = 'Povoliť používateľom zmenu ich emailovej adresy?';
    diff --git a/lib/plugins/authad/lang/sl/lang.php b/lib/plugins/authad/lang/sl/lang.php
    new file mode 100644
    index 0000000..b4c8643
    --- /dev/null
    +++ b/lib/plugins/authad/lang/sl/lang.php
    @@ -0,0 +1,8 @@
    +
    + */
    +$lang['authpwdexpire']         = 'Geslo bo poteklo v %d dneh. Priporočljivo ga je zamenjati.';
    diff --git a/lib/plugins/authad/lang/sl/settings.php b/lib/plugins/authad/lang/sl/settings.php
    new file mode 100644
    index 0000000..f166309
    --- /dev/null
    +++ b/lib/plugins/authad/lang/sl/settings.php
    @@ -0,0 +1,11 @@
    +
    + * @author Jernej Vidmar 
    + */
    +$lang['admin_password']        = 'Geslo zgoraj omenjenega uporabnika';
    +$lang['use_tls']               = 'Uporabi TLS povezavo? Če da, ne vključi SSL povezave zgoraj.';
    +$lang['debug']                 = 'Ali naj bodo prikazane dodatne podrobnosti napak?';
    diff --git a/lib/plugins/authad/lang/sr/lang.php b/lib/plugins/authad/lang/sr/lang.php
    new file mode 100644
    index 0000000..d5ac17b
    --- /dev/null
    +++ b/lib/plugins/authad/lang/sr/lang.php
    @@ -0,0 +1,12 @@
    +
    + */
    +$lang['domain']                = 'Домен пријаве';
    +$lang['authpwdexpire']         = 'Ваша лозинка ће истећи за %d дан(а), требало би да је промените ускоро.';
    +$lang['passchangefail']        = 'Нисам успео да променим лозинку. Можда нису испоштована правила за промену лозинке.';
    +$lang['userchangefail']        = 'Нисам успео да променим корисничке особине. Можда ваш налог нема довољно овлашћења за прављење измена?';
    +$lang['connectfail']           = 'Нисам успео да се повежем на Active Directory сервер.';
    diff --git a/lib/plugins/authad/lang/sr/settings.php b/lib/plugins/authad/lang/sr/settings.php
    new file mode 100644
    index 0000000..41e3fa4
    --- /dev/null
    +++ b/lib/plugins/authad/lang/sr/settings.php
    @@ -0,0 +1,24 @@
    +
    + * @author Марко М. Костић 
    + */
    +$lang['account_suffix']        = 'Суфикс на вашем налогу. Нпр.: @moj.domen.rs';
    +$lang['base_dn']               = 'Ваше основно име домена. Нпр.: DC=moj,DC=domen,DC=org';
    +$lang['domain_controllers']    = 'Списак доменских контролера, одвојених зарезима. Нпр.: srv1.domen.org,srv2.domen.org';
    +$lang['admin_username']        = 'Повлашћени Active Directory корисник са приступом подацима свих корисника. Изборно али је потребно за одређене радње као што је слање мејлова о претплаћивању.';
    +$lang['admin_password']        = 'Лозинка за корисника изнад.';
    +$lang['sso']                   = 'Да ли треба да се користи Single-Sign-On преко Кербероса или NTLM-а?';
    +$lang['sso_charset']           = 'Znakovni kod u kom će vaš webserver proslediti Kerberos ili NTLM serveru vaše ime. Ostavite prazno za UTF-8 ili latin-1. Zahteva iconv ekstenziju.';
    +$lang['real_primarygroup']     = 'Da li treba razrešiti pravu primarnu grupu ili pretpostaviti grupu "Domain Users" (sporije)';
    +$lang['use_ssl']               = 'Користити SSL везу? Ако се користи, не омогућујте TLS испод.';
    +$lang['use_tls']               = 'Користити TLS везу? Ако се користи, не омогућујте SSL испод.';
    +$lang['debug']                 = 'Приказати додатан излаз за поправљање грешака код настанка грешака?';
    +$lang['expirywarn']            = 'Дана унапред за које треба упозорити корисника на истицање лозинке. 0 за искључивање.';
    +$lang['additional']            = 'Spisak dodatni AD atributa, razdvojen zarezima, koje treba preuzeti iz korisničkih podataka. Koristi se u nekim dodacima (plugin).';
    +$lang['update_name']           = 'Дозволити корисницима да ажурирају њихово AD приказно име?';
    +$lang['update_mail']           = 'Дозволити корисницима да ажурирају њихове мејл адрсе?';
    +$lang['recursive_groups']      = 'Razrešenje ugnježdenih grupa do nivoa pripadajućih članova (sporije)';
    diff --git a/lib/plugins/authad/lang/sv/lang.php b/lib/plugins/authad/lang/sv/lang.php
    new file mode 100644
    index 0000000..35b6d06
    --- /dev/null
    +++ b/lib/plugins/authad/lang/sv/lang.php
    @@ -0,0 +1,13 @@
    +
    + * @author Smorkster Andersson 
    + */
    +$lang['domain']                = 'Inloggningsdomän';
    +$lang['authpwdexpire']         = 'Ditt lösenord kommer att bli ogiltigt om %d dagar, du bör ändra det snart.';
    +$lang['passchangefail']        = 'Kunde inte ändra lösenord. Kanske var inte lösenordspolicyn uppfylld?';
    +$lang['userchangefail']        = 'Kunde inte ändra användaregenskaper. Kanske har ditt konto inte behörighet att göra ändringar?';
    +$lang['connectfail']           = 'Kunde inte ansluta till Active Directory-server.';
    diff --git a/lib/plugins/authad/lang/sv/settings.php b/lib/plugins/authad/lang/sv/settings.php
    new file mode 100644
    index 0000000..278ab46
    --- /dev/null
    +++ b/lib/plugins/authad/lang/sv/settings.php
    @@ -0,0 +1,27 @@
    +
    + * @author Patrik K Lundberg 
    + * @author Tor Härnqvist 
    + * @author Smorkster Andersson 
    + */
    +$lang['account_suffix']        = 'Ditt konto suffix. T.ex. min.domän.org';
    +$lang['base_dn']               = 'Din bas-DN. T ex DC=min,DC=domän,DC=org';
    +$lang['domain_controllers']    = 'En kommaseparerad lista av Domain controllers. T ex srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Anpassad';
    +$lang['admin_password']        = 'Lösenord för användare ovan.';
    +$lang['sso']                   = 'Ska Single-Sign-On via Kerberos eller NTLM användas?';
    +$lang['sso_charset']           = 'Alla namespaces';
    +$lang['real_primarygroup']     = 'Alla tider';
    +$lang['use_ssl']               = 'Använda SSL anslutning? Om använd, möjliggör inte TLS nedan.';
    +$lang['use_tls']               = 'Använda TLS anslutning? Om använd, möjliggör inte SSL ovan.';
    +$lang['debug']                 = 'Visa utökad avlusningsinformation för fel?';
    +$lang['expirywarn']            = 'Antakl dagar i förväg att varna användare om utgående lösenord. 0 för att inaktivera.';
    +$lang['additional']            = 'En komma-separerad lista på extra AT-attibut att hämta från användardata. Används av vissa plugin.';
    +$lang['update_name']           = 'Tillåt användare att uppdatera deras AD-visningsnamn?';
    +$lang['update_mail']           = 'Tillåt användare att uppdatera deras e-postadresser?';
    +$lang['update_pass']           = 'Tillåt användare att uppdatera sitt lösenord? SSL eller TLS krävs.';
    +$lang['recursive_groups']      = 'Senaste veckan';
    diff --git a/lib/plugins/authad/lang/tr/lang.php b/lib/plugins/authad/lang/tr/lang.php
    new file mode 100644
    index 0000000..2ab16cb
    --- /dev/null
    +++ b/lib/plugins/authad/lang/tr/lang.php
    @@ -0,0 +1,12 @@
    +
    + * @author farukerdemoncel 
    + */
    +$lang['domain']                = 'Oturum alanadı';
    +$lang['authpwdexpire']         = 'Şifreniz %d gün sonra geçersiz hale gelecek, yakın bir zamanda değiştirmelisiniz.';
    +$lang['passchangefail']        = 'Şifre değiştirilemedi. Şifre gereklilikleri yerine getirilmemiş olabilir mi?';
    +$lang['connectfail']           = 'Active Directory sunucusuna bağlanılamadı';
    diff --git a/lib/plugins/authad/lang/tr/settings.php b/lib/plugins/authad/lang/tr/settings.php
    new file mode 100644
    index 0000000..a07793f
    --- /dev/null
    +++ b/lib/plugins/authad/lang/tr/settings.php
    @@ -0,0 +1,15 @@
    +
    + * @author Hakan 
    + * @author mahir 
    + */
    +$lang['admin_password']        = 'Yukarıdaki kullanıcının şifresi.';
    +$lang['use_ssl']               = 'SSL bağlantısı kullan? Eğer kullanılırsa aşağıdaki TLS\'i açma.';
    +$lang['use_tls']               = 'TLS bağlantısı kullan? Eğer kullanılırsa yukarıdaki SSL\'i açma.';
    +$lang['debug']                 = 'Hatalarda ek hata ayıklama çıktısı gösterilsin mi?';
    +$lang['update_name']           = 'Kullanıcıların AD görünen adlarını güncellemelerine izin verilsin mi?';
    +$lang['update_mail']           = 'Kullanıcıların e-posta adresini güncellemelerine izin verilsin mi?';
    diff --git a/lib/plugins/authad/lang/uk/lang.php b/lib/plugins/authad/lang/uk/lang.php
    new file mode 100644
    index 0000000..7e685a9
    --- /dev/null
    +++ b/lib/plugins/authad/lang/uk/lang.php
    @@ -0,0 +1,14 @@
    +
    + * @author Vitaly 
    + * @author Nina Zolotova 
    + */
    +$lang['domain']                = 'Домен';
    +$lang['authpwdexpire']         = 'Дія вашого паролю завершится через %d днів, вам необхідно змінити його щонайвшидше.';
    +$lang['passchangefail']        = 'Не вдалося змінити пароль. Можливо, політика пароля не була застосована?';
    +$lang['userchangefail']        = 'Не вийшло змінити атрибути користувача. Можливо, у вашого акаунту немає дозволу на внесення змін?';
    +$lang['connectfail']           = 'Не вийшло з\'єднатися с сервером Active Directory.';
    diff --git a/lib/plugins/authad/lang/uk/settings.php b/lib/plugins/authad/lang/uk/settings.php
    new file mode 100644
    index 0000000..1e0bd3d
    --- /dev/null
    +++ b/lib/plugins/authad/lang/uk/settings.php
    @@ -0,0 +1,19 @@
    +
    + * @author Oleksii 
    + * @author Nina Zolotova 
    + */
    +$lang['account_suffix']        = 'Суфікс вашого облікового запису. Щось на шквалт: @my.domain.org';
    +$lang['base_dn']               = 'Ваш DN. Щось на шквалт: DC=my,DC=domain,DC=org';
    +$lang['admin_password']        = 'Пароль вказаного користувача.';
    +$lang['sso']                   = 'Чи потрібно використовувати Single-Sign-On через Kerberos чи NTLM?';
    +$lang['use_ssl']               = 'Використовуєте SSL-з\'єднання? Якщо так, не вмикайте TLS нижче.';
    +$lang['use_tls']               = 'Використовуєте TLS-з\'єднання? Якщо так, не вмикайте SSL нижче.';
    +$lang['debug']                 = 'Показати додаткові відомості щодо помилок?';
    +$lang['expirywarn']            = 'Кількість днів за яких попереджати про закінчення дії пароля користувача. 0 - не попереджати.';
    +$lang['update_name']           = 'Дозволити користувачам оновлювати ім\'я AD, яке відображається?';
    +$lang['update_mail']           = 'Дозволити користувачам оновлювати їх адреси електронної пошлти?';
    diff --git a/lib/plugins/authad/lang/vi/lang.php b/lib/plugins/authad/lang/vi/lang.php
    new file mode 100644
    index 0000000..989f904
    --- /dev/null
    +++ b/lib/plugins/authad/lang/vi/lang.php
    @@ -0,0 +1,12 @@
    +
    + */
    +$lang['domain']                = 'Đăng nhập tên miền';
    +$lang['authpwdexpire']         = 'Mật khẩu của bạn sẽ hết hạn sau %d ngày, bạn nên thay đổi sớm.';
    +$lang['passchangefail']        = 'Không thể thay đổi mật khẩu. Có lẽ chưa đáp ứng được chính sách mật khẩu?';
    +$lang['userchangefail']        = 'Không thể thay đổi thuộc tính thành viên. Có lẽ tài khoản của bạn không có quyền thực hiện thay đổi?';
    +$lang['connectfail']           = 'Không thể kết nối với máy chủ Active Directory.';
    diff --git a/lib/plugins/authad/lang/vi/settings.php b/lib/plugins/authad/lang/vi/settings.php
    new file mode 100644
    index 0000000..84718d0
    --- /dev/null
    +++ b/lib/plugins/authad/lang/vi/settings.php
    @@ -0,0 +1,25 @@
    +
    + * @author Thien Hau 
    + */
    +$lang['account_suffix']        = 'Hậu tố tài khoản của bạn. VD. @my.domain.org';
    +$lang['base_dn']               = 'DN cơ sở của bạn. VD. DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = 'Một danh sách các bộ điều khiển miền được phân tách bằng dấu phẩy. VD. srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Thành viên Active Directory đặc quyền có quyền truy cập vào tất cả dữ liệu của thành viên khác. Tùy chọn, nhưng cần thiết cho một số hành động nhất định như gửi thư đăng ký.';
    +$lang['admin_password']        = 'Mật khẩu của thành viên trên.';
    +$lang['sso']                   = 'Nên đăng nhập một lần qua Kerberos hoặc NTLM?';
    +$lang['sso_charset']           = 'Bộ ký tự máy chủ web của bạn sẽ chuyển tên người dùng Kerberos hoặc NTLM. Để trống cho UTF-8 hoặc latin-1. Yêu cầu phần mở rộng iconv.';
    +$lang['real_primarygroup']     = 'Nên giải quyết nhóm chính thực sự thay vì giả sử "Tên miền thành viên" (chậm hơn).';
    +$lang['use_ssl']               = 'Sử dụng kết nối SSL? Nếu được sử dụng, không kích hoạt TLS bên dưới.';
    +$lang['use_tls']               = 'Sử dụng kết nối TLS? Nếu được sử dụng, không kích hoạt SSL ở trên.';
    +$lang['debug']                 = 'Hiển thị đầu ra gỡ lỗi bổ sung về lỗi?';
    +$lang['expirywarn']            = 'Báo trước ngày để cảnh báo thành viên về việc hết hạn mật khẩu. Đặt thành 0 để vô hiệu hóa.';
    +$lang['additional']            = 'Một danh sách được phân tách bằng dấu phẩy của các thuộc tính AD bổ sung để tìm nạp dữ liệu thành viên. Được sử dụng bởi một số plugin.';
    +$lang['update_name']           = 'Cho phép thành viên cập nhật tên hiển thị AD?';
    +$lang['update_mail']           = 'Cho phép thành viên cập nhật địa chỉ thư điện tử?';
    +$lang['update_pass']           = 'Cho phép người dùng nâng cấp thay đổi mật khẩu của họ? Yêu cầu SSL hoặc TLS như trên.';
    +$lang['recursive_groups']      = 'Giải quyết những nhóm lồng nhau cho các thành viên tương ứng (chậm hơn).';
    diff --git a/lib/plugins/authad/lang/zh-tw/lang.php b/lib/plugins/authad/lang/zh-tw/lang.php
    new file mode 100644
    index 0000000..285c8aa
    --- /dev/null
    +++ b/lib/plugins/authad/lang/zh-tw/lang.php
    @@ -0,0 +1,10 @@
    +
    + * @author syaoranhinata 
    + */
    +$lang['domain']                = '登入網域';
    +$lang['authpwdexpire']         = '您的密碼將在 %d 天內到期,請馬上更換新密碼。';
    diff --git a/lib/plugins/authad/lang/zh-tw/settings.php b/lib/plugins/authad/lang/zh-tw/settings.php
    new file mode 100644
    index 0000000..4460763
    --- /dev/null
    +++ b/lib/plugins/authad/lang/zh-tw/settings.php
    @@ -0,0 +1,21 @@
    +
    + * @author June-Hao Hou 
    + */
    +$lang['account_suffix']        = '您的帳號後綴。如: @my.domain.org';
    +$lang['base_dn']               = '您的基本識別名。如: DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = '以逗號分隔的域名控制器列表。如: srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = 'Active Directory 的特權使用者,可以查看所有使用者的數據。(非必要,但對發送訂閱郵件等活動來說,這是必須的。)';
    +$lang['admin_password']        = '上述使用者的密碼。';
    +$lang['sso']                   = '是否使用 Kerberos 或 NTLM 的單一登入系統 (Single-Sign-On)?';
    +$lang['sso_charset']           = '你的網站伺服器傳遞 Kerberos 或 NTML 帳號名稱所用的語系編碼。空白表示 UTF-8 或 latin-1。此設定需要用到 iconv 套件。';
    +$lang['real_primarygroup']     = '是否視作真正的主要群組,而不是假設為網域使用者 (比較慢)';
    +$lang['use_ssl']               = '使用 SSL 連接嗎?如果要使用,請不要啟用下方的 TLS。';
    +$lang['use_tls']               = '使用 TLS 連接嗎?如果要使用,請不要啟用上方的 SSL。';
    +$lang['debug']                 = '有錯誤時,顯示額外除錯資訊嗎?';
    +$lang['expirywarn']            = '提前多少天警告使用者密碼即將到期。輸入0表示停用。';
    +$lang['additional']            = '從使用者數據中取得額外 AD 屬性列表,以供某些附加元件使用。列表以逗號分隔。';
    diff --git a/lib/plugins/authad/lang/zh/lang.php b/lib/plugins/authad/lang/zh/lang.php
    new file mode 100644
    index 0000000..4b2c885
    --- /dev/null
    +++ b/lib/plugins/authad/lang/zh/lang.php
    @@ -0,0 +1,14 @@
    +
    + * @author Errol 
    + * @author phy25 
    + */
    +$lang['domain']                = '登录域';
    +$lang['authpwdexpire']         = '您的密码将在 %d 天内过期,请尽快更改。';
    +$lang['passchangefail']        = '密码更改失败。是不是密码规则不符合?';
    +$lang['userchangefail']        = '更改用户属性失败。或许您的帐号没有做此更改的权限?';
    +$lang['connectfail']           = '无法连接到Active Directory服务器。';
    diff --git a/lib/plugins/authad/lang/zh/settings.php b/lib/plugins/authad/lang/zh/settings.php
    new file mode 100644
    index 0000000..2833622
    --- /dev/null
    +++ b/lib/plugins/authad/lang/zh/settings.php
    @@ -0,0 +1,29 @@
    +
    + * @author HaoNan 
    + * @author lainme 
    + * @author oott123 
    + * @author JellyChen <451453325@qq.com>
    + * @author 高博 
    + */
    +$lang['account_suffix']        = '您的账户后缀。例如 @my.domain.org';
    +$lang['base_dn']               = '您的基本分辨名。例如 DC=my,DC=domain,DC=org';
    +$lang['domain_controllers']    = '逗号分隔的域名控制器列表。例如 srv1.domain.org,srv2.domain.org';
    +$lang['admin_username']        = '一个活动目录的特权用户,可以查看其他所有用户的数据。可选,但对某些活动例如发送订阅邮件是必须的。';
    +$lang['admin_password']        = '上述用户的密码。';
    +$lang['sso']                   = '是否使用经由 Kerberos 和 NTLM 的 Single-Sign-On?';
    +$lang['sso_charset']           = '服务器传入 Kerberos 或者 NTLM 用户名的编码。留空为 UTF-8 或 latin-1 。此功能需要服务器支持iconv扩展。';
    +$lang['real_primarygroup']     = ' 是否解析真实的主要组,而不是假设为“域用户” (较慢)';
    +$lang['use_ssl']               = '使用 SSL 连接?如果是,不要激活下面的 TLS。';
    +$lang['use_tls']               = '使用 TLS 连接?如果是 ,不要激活上面的 SSL。';
    +$lang['debug']                 = '有错误时显示额外的调试信息?';
    +$lang['expirywarn']            = '提前多少天警告用户密码即将到期。0 则禁用。';
    +$lang['additional']            = '需要从用户数据中获取的额外 AD 属性的列表,以逗号分隔。用于某些插件。';
    +$lang['update_name']           = '允许用户更新其AD显示名称?';
    +$lang['update_mail']           = '是否允许用户更新他们的电子邮件地址?';
    +$lang['update_pass']           = '是否允许用户更新其密码?需要上述 SSL 或 TLS。';
    +$lang['recursive_groups']      = '将嵌套组拆分为各自的成员(较慢)';
    diff --git a/lib/plugins/authad/plugin.info.txt b/lib/plugins/authad/plugin.info.txt
    new file mode 100644
    index 0000000..57e1387
    --- /dev/null
    +++ b/lib/plugins/authad/plugin.info.txt
    @@ -0,0 +1,7 @@
    +base   authad
    +author Andreas Gohr
    +email  andi@splitbrain.org
    +date   2015-07-13
    +name   Active Directory Auth Plugin
    +desc   Provides user authentication against a Microsoft Active Directory
    +url    http://www.dokuwiki.org/plugin:authad
    diff --git a/lib/plugins/authldap/auth.php b/lib/plugins/authldap/auth.php
    new file mode 100644
    index 0000000..213e43f
    --- /dev/null
    +++ b/lib/plugins/authldap/auth.php
    @@ -0,0 +1,703 @@
    +
    + * @author    Chris Smith 
    + * @author    Jan Schumann 
    + */
    +class auth_plugin_authldap extends AuthPlugin
    +{
    +    /* @var resource $con holds the LDAP connection */
    +    protected $con;
    +
    +    /* @var int $bound What type of connection does already exist? */
    +    protected $bound = 0; // 0: anonymous, 1: user, 2: superuser
    +
    +    /* @var array $users User data cache */
    +    protected $users;
    +
    +    /* @var array $pattern User filter pattern */
    +    protected $pattern;
    +
    +    /**
    +     * Constructor
    +     */
    +    public function __construct()
    +    {
    +        parent::__construct();
    +
    +        // ldap extension is needed
    +        if (!function_exists('ldap_connect')) {
    +            $this->debug("LDAP err: PHP LDAP extension not found.", -1, __LINE__, __FILE__);
    +            $this->success = false;
    +            return;
    +        }
    +
    +        // Add the capabilities to change the password
    +        $this->cando['modPass'] = $this->getConf('modPass');
    +    }
    +
    +    /**
    +     * Check user+password
    +     *
    +     * Checks if the given user exists and the given
    +     * plaintext password is correct by trying to bind
    +     * to the LDAP server
    +     *
    +     * @param string $user
    +     * @param string $pass
    +     * @return  bool
    +     * @author  Andreas Gohr 
    +     */
    +    public function checkPass($user, $pass)
    +    {
    +        // reject empty password
    +        if (empty($pass)) return false;
    +        if (!$this->openLDAP()) return false;
    +
    +        // indirect user bind
    +        if ($this->getConf('binddn') && $this->getConf('bindpw')) {
    +            // use superuser credentials
    +            if (!@ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')))) {
    +                $this->debug('LDAP bind as superuser: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +                return false;
    +            }
    +            $this->bound = 2;
    +        } elseif (
    +            $this->getConf('binddn') &&
    +            $this->getConf('usertree') &&
    +            $this->getConf('userfilter')
    +        ) {
    +            // special bind string
    +            $dn = $this->makeFilter(
    +                $this->getConf('binddn'),
    +                ['user' => $user, 'server' => $this->getConf('server')]
    +            );
    +        } elseif (strpos($this->getConf('usertree'), '%{user}')) {
    +            // direct user bind
    +            $dn = $this->makeFilter(
    +                $this->getConf('usertree'),
    +                ['user' => $user, 'server' => $this->getConf('server')]
    +            );
    +        } elseif (!@ldap_bind($this->con)) {
    +            // Anonymous bind
    +            msg("LDAP: can not bind anonymously", -1);
    +            $this->debug('LDAP anonymous bind: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +            return false;
    +        }
    +
    +        // Try to bind to with the dn if we have one.
    +        if (!empty($dn)) {
    +            // User/Password bind
    +            if (!@ldap_bind($this->con, $dn, $pass)) {
    +                $this->debug("LDAP: bind with $dn failed", -1, __LINE__, __FILE__);
    +                $this->debug('LDAP user dn bind: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +                return false;
    +            }
    +            $this->bound = 1;
    +            return true;
    +        } else {
    +            // See if we can find the user
    +            $info = $this->fetchUserData($user, true);
    +            if (empty($info['dn'])) {
    +                return false;
    +            } else {
    +                $dn = $info['dn'];
    +            }
    +
    +            // Try to bind with the dn provided
    +            if (!@ldap_bind($this->con, $dn, $pass)) {
    +                $this->debug("LDAP: bind with $dn failed", -1, __LINE__, __FILE__);
    +                $this->debug('LDAP user bind: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +                return false;
    +            }
    +            $this->bound = 1;
    +            return true;
    +        }
    +    }
    +
    +    /**
    +     * Return user info
    +     *
    +     * Returns info about the given user needs to contain
    +     * at least these fields:
    +     *
    +     * name string  full name of the user
    +     * mail string  email addres of the user
    +     * grps array   list of groups the user is in
    +     *
    +     * This LDAP specific function returns the following
    +     * addional fields:
    +     *
    +     * dn     string  distinguished name (DN)
    +     * uid    string  Posix User ID
    +     * inbind bool    for internal use - avoid loop in binding
    +     *
    +     * @param string $user
    +     * @param bool $requireGroups (optional) - ignored, groups are always supplied by this plugin
    +     * @return  array containing user data or false
    +     * @author  
    +     * @author  Stephane Chazelas 
    +     * @author  Steffen Schoch 
    +     *
    +     * @author  Andreas Gohr 
    +     * @author  Trouble
    +     * @author  Dan Allen 
    +     */
    +    public function getUserData($user, $requireGroups = true)
    +    {
    +        return $this->fetchUserData($user);
    +    }
    +
    +    /**
    +     * @param string $user
    +     * @param bool $inbind authldap specific, true if in bind phase
    +     * @return  array containing user data or false
    +     */
    +    protected function fetchUserData($user, $inbind = false)
    +    {
    +        global $conf;
    +        if (!$this->openLDAP()) return [];
    +
    +        // force superuser bind if wanted and not bound as superuser yet
    +        if ($this->getConf('binddn') && $this->getConf('bindpw') && $this->bound < 2) {
    +            // use superuser credentials
    +            if (!@ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')))) {
    +                $this->debug('LDAP bind as superuser: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +                return [];
    +            }
    +            $this->bound = 2;
    +        } elseif ($this->bound == 0 && !$inbind) {
    +            // in some cases getUserData is called outside the authentication workflow
    +            // eg. for sending email notification on subscribed pages. This data might not
    +            // be accessible anonymously, so we try to rebind the current user here
    +            [$loginuser, $loginsticky, $loginpass] = auth_getCookie();
    +            if ($loginuser && $loginpass) {
    +                $loginpass = auth_decrypt($loginpass, auth_cookiesalt(!$loginsticky, true));
    +                $this->checkPass($loginuser, $loginpass);
    +            }
    +        }
    +
    +        $info = [];
    +        $info['user'] = $user;
    +        $this->debug('LDAP user to find: ' . hsc($info['user']), 0, __LINE__, __FILE__);
    +
    +        $info['server'] = $this->getConf('server');
    +        $this->debug('LDAP Server: ' . hsc($info['server']), 0, __LINE__, __FILE__);
    +
    +        //get info for given user
    +        $base = $this->makeFilter($this->getConf('usertree'), $info);
    +        if ($this->getConf('userfilter')) {
    +            $filter = $this->makeFilter($this->getConf('userfilter'), $info);
    +        } else {
    +            $filter = "(ObjectClass=*)";
    +        }
    +
    +        $this->debug('LDAP Filter: ' . hsc($filter), 0, __LINE__, __FILE__);
    +
    +        $this->debug('LDAP user search: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +        $this->debug('LDAP search at: ' . hsc($base . ' ' . $filter), 0, __LINE__, __FILE__);
    +        $sr = $this->ldapSearch($this->con, $base, $filter, $this->getConf('userscope'), $this->getConf('attributes'));
    +        if ($sr === false) {
    +            $this->debug('User ldap_search failed. Check configuration.', 0, __LINE__, __FILE__);
    +            return false;
    +        }
    +
    +        $result = @ldap_get_entries($this->con, $sr);
    +
    +        // if result is not an array
    +        if (!is_array($result)) {
    +            // no objects found
    +            $this->debug('LDAP search returned non-array result: ' . hsc(print($result)), -1, __LINE__, __FILE__);
    +            return [];
    +        }
    +
    +        // Don't accept more or less than one response
    +        if ($result['count'] != 1) {
    +            $this->debug(
    +                'LDAP search returned ' . hsc($result['count']) . ' results while it should return 1!',
    +                -1,
    +                __LINE__,
    +                __FILE__
    +            );
    +            //for($i = 0; $i < $result["count"]; $i++) {
    +            //$this->_debug('result: '.hsc(print_r($result[$i])), 0, __LINE__, __FILE__);
    +            //}
    +            return [];
    +        }
    +
    +        $this->debug('LDAP search found single result !', 0, __LINE__, __FILE__);
    +
    +        $user_result = $result[0];
    +        ldap_free_result($sr);
    +
    +        // general user info
    +        $info['dn'] = $user_result['dn'];
    +        $info['gid'] = $user_result['gidnumber'][0] ?? null;
    +        $info['mail'] = $user_result['mail'][0];
    +        $info['name'] = $user_result['cn'][0];
    +        $info['grps'] = [];
    +
    +        // overwrite if other attribs are specified.
    +        if (is_array($this->getConf('mapping'))) {
    +            foreach ($this->getConf('mapping') as $localkey => $key) {
    +                if (is_array($key)) {
    +                    // use regexp to clean up user_result
    +                    // $key = array($key=>$regexp), only handles the first key-value
    +                    $regexp = current($key);
    +                    $key = key($key);
    +                    if ($user_result[$key]) foreach ($user_result[$key] as $grpkey => $grp) {
    +                        if ($grpkey !== 'count' && preg_match($regexp, $grp, $match)) {
    +                            if ($localkey == 'grps') {
    +                                $info[$localkey][] = $match[1];
    +                            } else {
    +                                $info[$localkey] = $match[1];
    +                            }
    +                        }
    +                    }
    +                } else {
    +                    $info[$localkey] = $user_result[$key][0];
    +                }
    +            }
    +        }
    +        $user_result = array_merge($info, $user_result);
    +
    +        //get groups for given user if grouptree is given
    +        if ($this->getConf('grouptree') || $this->getConf('groupfilter')) {
    +            $base = $this->makeFilter($this->getConf('grouptree'), $user_result);
    +            $filter = $this->makeFilter($this->getConf('groupfilter'), $user_result);
    +            $sr = $this->ldapSearch(
    +                $this->con,
    +                $base,
    +                $filter,
    +                $this->getConf('groupscope'),
    +                [$this->getConf('groupkey')]
    +            );
    +            $this->debug('LDAP group search: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +            $this->debug('LDAP search at: ' . hsc($base . ' ' . $filter), 0, __LINE__, __FILE__);
    +
    +            if (!$sr) {
    +                msg("LDAP: Reading group memberships failed", -1);
    +                return [];
    +            }
    +            $result = ldap_get_entries($this->con, $sr);
    +            ldap_free_result($sr);
    +
    +            if (is_array($result)) foreach ($result as $grp) {
    +                if (!empty($grp[$this->getConf('groupkey')])) {
    +                    $group = $grp[$this->getConf('groupkey')];
    +                    if (is_array($group)) {
    +                        $group = $group[0];
    +                    } else {
    +                        $this->debug('groupkey did not return a detailled result', 0, __LINE__, __FILE__);
    +                    }
    +                    if ($group === '') continue;
    +
    +                    $this->debug('LDAP usergroup: ' . hsc($group), 0, __LINE__, __FILE__);
    +                    $info['grps'][] = $group;
    +                }
    +            }
    +        }
    +
    +        // always add the default group to the list of groups
    +        if (!$info['grps'] || !in_array($conf['defaultgroup'], $info['grps'])) {
    +            $info['grps'][] = $conf['defaultgroup'];
    +        }
    +        return $info;
    +    }
    +
    +    /**
    +     * Definition of the function modifyUser in order to modify the password
    +     *
    +     * @param string $user nick of the user to be changed
    +     * @param array $changes array of field/value pairs to be changed (password will be clear text)
    +     * @return  bool   true on success, false on error
    +     */
    +    public function modifyUser($user, $changes)
    +    {
    +
    +        // open the connection to the ldap
    +        if (!$this->openLDAP()) {
    +            $this->debug('LDAP cannot connect: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +            return false;
    +        }
    +
    +        // find the information about the user, in particular the "dn"
    +        $info = $this->getUserData($user, true);
    +        if (empty($info['dn'])) {
    +            $this->debug('LDAP cannot find your user dn', 0, __LINE__, __FILE__);
    +            return false;
    +        }
    +        $dn = $info['dn'];
    +
    +        // find the old password of the user
    +        [$loginuser, $loginsticky, $loginpass] = auth_getCookie();
    +        if ($loginuser !== null) { // the user is currently logged in
    +            $secret = auth_cookiesalt(!$loginsticky, true);
    +            $pass = auth_decrypt($loginpass, $secret);
    +
    +            // bind with the ldap
    +            if (!@ldap_bind($this->con, $dn, $pass)) {
    +                $this->debug(
    +                    'LDAP user bind failed: ' . hsc($dn) . ': ' . hsc(ldap_error($this->con)),
    +                    0,
    +                    __LINE__,
    +                    __FILE__
    +                );
    +                return false;
    +            }
    +        } elseif ($this->getConf('binddn') && $this->getConf('bindpw')) {
    +            // we are changing the password on behalf of the user (eg: forgotten password)
    +            // bind with the superuser ldap
    +            if (!@ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')))) {
    +                $this->debug('LDAP bind as superuser: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +                return false;
    +            }
    +        } else {
    +            return false; // no otherway
    +        }
    +
    +        // Generate the salted hashed password for LDAP
    +        $phash = new PassHash();
    +        $hash = $phash->hash_ssha($changes['pass']);
    +
    +        // change the password
    +        if (!@ldap_mod_replace($this->con, $dn, ['userpassword' => $hash])) {
    +            $this->debug(
    +                'LDAP mod replace failed: ' . hsc($dn) . ': ' . hsc(ldap_error($this->con)),
    +                0,
    +                __LINE__,
    +                __FILE__
    +            );
    +            return false;
    +        }
    +
    +        return true;
    +    }
    +
    +    /**
    +     * Most values in LDAP are case-insensitive
    +     *
    +     * @return bool
    +     */
    +    public function isCaseSensitive()
    +    {
    +        return false;
    +    }
    +
    +    /**
    +     * Bulk retrieval of user data
    +     *
    +     * @param int $start index of first user to be returned
    +     * @param int $limit max number of users to be returned
    +     * @param array $filter array of field/pattern pairs, null for no filter
    +     * @return  array of userinfo (refer getUserData for internal userinfo details)
    +     * @author  Dominik Eckelmann 
    +     */
    +    public function retrieveUsers($start = 0, $limit = 0, $filter = [])
    +    {
    +        if (!$this->openLDAP()) return [];
    +
    +        if (is_null($this->users)) {
    +            // Perform the search and grab all their details
    +            if ($this->getConf('userfilter')) {
    +                $all_filter = str_replace('%{user}', '*', $this->getConf('userfilter'));
    +            } else {
    +                $all_filter = "(ObjectClass=*)";
    +            }
    +            $sr = ldap_search($this->con, $this->getConf('usertree'), $all_filter);
    +            $entries = ldap_get_entries($this->con, $sr);
    +            $users_array = [];
    +            $userkey = $this->getConf('userkey');
    +            for ($i = 0; $i < $entries["count"]; $i++) {
    +                $users_array[] = $entries[$i][$userkey][0];
    +            }
    +            Sort::asort($users_array);
    +            $result = $users_array;
    +            if (!$result) return [];
    +            $this->users = array_fill_keys($result, false);
    +        }
    +        $i = 0;
    +        $count = 0;
    +        $this->constructPattern($filter);
    +        $result = [];
    +
    +        foreach ($this->users as $user => &$info) {
    +            if ($i++ < $start) {
    +                continue;
    +            }
    +            if ($info === false) {
    +                $info = $this->getUserData($user);
    +            }
    +            if ($this->filter($user, $info)) {
    +                $result[$user] = $info;
    +                if (($limit > 0) && (++$count >= $limit)) break;
    +            }
    +        }
    +        return $result;
    +    }
    +
    +    /**
    +     * Make LDAP filter strings.
    +     *
    +     * Used by auth_getUserData to make the filter
    +     * strings for grouptree and groupfilter
    +     *
    +     * @param string $filter ldap search filter with placeholders
    +     * @param array $placeholders placeholders to fill in
    +     * @return  string
    +     * @author  Troels Liebe Bentsen 
    +     */
    +    protected function makeFilter($filter, $placeholders)
    +    {
    +        preg_match_all("/%{([^}]+)/", $filter, $matches, PREG_PATTERN_ORDER);
    +        //replace each match
    +        foreach ($matches[1] as $match) {
    +            //take first element if array
    +            if (is_array($placeholders[$match])) {
    +                $value = $placeholders[$match][0];
    +            } else {
    +                $value = $placeholders[$match];
    +            }
    +            $value = $this->filterEscape($value);
    +            $filter = str_replace('%{' . $match . '}', $value, $filter);
    +        }
    +        return $filter;
    +    }
    +
    +    /**
    +     * return true if $user + $info match $filter criteria, false otherwise
    +     *
    +     * @param string $user the user's login name
    +     * @param array $info the user's userinfo array
    +     * @return bool
    +     * @author Chris Smith 
    +     *
    +     */
    +    protected function filter($user, $info)
    +    {
    +        foreach ($this->pattern as $item => $pattern) {
    +            if ($item == 'user') {
    +                if (!preg_match($pattern, $user)) return false;
    +            } elseif ($item == 'grps') {
    +                if (!count(preg_grep($pattern, $info['grps']))) return false;
    +            } elseif (!preg_match($pattern, $info[$item])) {
    +                return false;
    +            }
    +        }
    +        return true;
    +    }
    +
    +    /**
    +     * Set the filter pattern
    +     *
    +     * @param $filter
    +     * @return void
    +     * @author Chris Smith 
    +     *
    +     */
    +    protected function constructPattern($filter)
    +    {
    +        $this->pattern = [];
    +        foreach ($filter as $item => $pattern) {
    +            $this->pattern[$item] = '/' . str_replace('/', '\/', $pattern) . '/i'; // allow regex characters
    +        }
    +    }
    +
    +    /**
    +     * Escape a string to be used in a LDAP filter
    +     *
    +     * Ported from Perl's Net::LDAP::Util escape_filter_value
    +     *
    +     * @param string $string
    +     * @return string
    +     * @author Andreas Gohr
    +     */
    +    protected function filterEscape($string)
    +    {
    +        // see https://github.com/adldap/adLDAP/issues/22
    +        return preg_replace_callback(
    +            '/([\x00-\x1F\*\(\)\\\\])/',
    +            static fn($matches) => "\\" . implode("", unpack("H2", $matches[1])),
    +            $string
    +        );
    +    }
    +
    +    /**
    +     * Opens a connection to the configured LDAP server and sets the wanted
    +     * option on the connection
    +     *
    +     * @author  Andreas Gohr 
    +     */
    +    protected function openLDAP()
    +    {
    +        if ($this->con) return true; // connection already established
    +
    +        if ($this->getConf('debug')) {
    +            ldap_set_option(null, LDAP_OPT_DEBUG_LEVEL, 7);
    +        }
    +
    +        $this->bound = 0;
    +
    +        $port = $this->getConf('port');
    +        $bound = false;
    +        $servers = explode(',', $this->getConf('server'));
    +        foreach ($servers as $server) {
    +            $server = trim($server);
    +            $this->con = @ldap_connect($server, $port);
    +            if (!$this->con) {
    +                continue;
    +            }
    +
    +            /*
    +             * When OpenLDAP 2.x.x is used, ldap_connect() will always return a resource as it does
    +             * not actually connect but just initializes the connecting parameters. The actual
    +             * connect happens with the next calls to ldap_* funcs, usually with ldap_bind().
    +             *
    +             * So we should try to bind to server in order to check its availability.
    +             */
    +
    +            //set protocol version and dependend options
    +            if ($this->getConf('version')) {
    +                if (
    +                    !@ldap_set_option(
    +                        $this->con,
    +                        LDAP_OPT_PROTOCOL_VERSION,
    +                        $this->getConf('version')
    +                    )
    +                ) {
    +                    msg('Setting LDAP Protocol version ' . $this->getConf('version') . ' failed', -1);
    +                    $this->debug('LDAP version set: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +                } else {
    +                    //use TLS (needs version 3)
    +                    if ($this->getConf('starttls')) {
    +                        if (!@ldap_start_tls($this->con)) {
    +                            msg('Starting TLS failed', -1);
    +                            $this->debug('LDAP TLS set: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +                        }
    +                    }
    +                    // needs version 3
    +                    if ($this->getConf('referrals') > -1) {
    +                        if (
    +                            !@ldap_set_option(
    +                                $this->con,
    +                                LDAP_OPT_REFERRALS,
    +                                $this->getConf('referrals')
    +                            )
    +                        ) {
    +                            msg('Setting LDAP referrals failed', -1);
    +                            $this->debug('LDAP referal set: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +                        }
    +                    }
    +                }
    +            }
    +
    +            //set deref mode
    +            if ($this->getConf('deref')) {
    +                if (!@ldap_set_option($this->con, LDAP_OPT_DEREF, $this->getConf('deref'))) {
    +                    msg('Setting LDAP Deref mode ' . $this->getConf('deref') . ' failed', -1);
    +                    $this->debug('LDAP deref set: ' . hsc(ldap_error($this->con)), 0, __LINE__, __FILE__);
    +                }
    +            }
    +            /* As of PHP 5.3.0 we can set timeout to speedup skipping of invalid servers */
    +            if (defined('LDAP_OPT_NETWORK_TIMEOUT')) {
    +                ldap_set_option($this->con, LDAP_OPT_NETWORK_TIMEOUT, 1);
    +            }
    +
    +            if ($this->getConf('binddn') && $this->getConf('bindpw')) {
    +                $bound = @ldap_bind($this->con, $this->getConf('binddn'), conf_decodeString($this->getConf('bindpw')));
    +                $this->bound = 2;
    +            } else {
    +                $bound = @ldap_bind($this->con);
    +            }
    +            if ($bound) {
    +                break;
    +            }
    +        }
    +
    +        if (!$bound) {
    +            msg("LDAP: couldn't connect to LDAP server", -1);
    +            $this->debug(ldap_error($this->con), 0, __LINE__, __FILE__);
    +            return false;
    +        }
    +
    +        $this->cando['getUsers'] = true;
    +        return true;
    +    }
    +
    +    /**
    +     * Wraps around ldap_search, ldap_list or ldap_read depending on $scope
    +     *
    +     * @param resource $link_identifier
    +     * @param string $base_dn
    +     * @param string $filter
    +     * @param string $scope can be 'base', 'one' or 'sub'
    +     * @param null|array $attributes
    +     * @param int $attrsonly
    +     * @param int $sizelimit
    +     * @return resource
    +     * @author Andreas Gohr 
    +     */
    +    protected function ldapSearch(
    +        $link_identifier,
    +        $base_dn,
    +        $filter,
    +        $scope = 'sub',
    +        $attributes = null,
    +        $attrsonly = 0,
    +        $sizelimit = 0
    +    ) {
    +        if (is_null($attributes)) $attributes = [];
    +
    +        if ($scope == 'base') {
    +            return @ldap_read(
    +                $link_identifier,
    +                $base_dn,
    +                $filter,
    +                $attributes,
    +                $attrsonly,
    +                $sizelimit
    +            );
    +        } elseif ($scope == 'one') {
    +            return @ldap_list(
    +                $link_identifier,
    +                $base_dn,
    +                $filter,
    +                $attributes,
    +                $attrsonly,
    +                $sizelimit
    +            );
    +        } else {
    +            return @ldap_search(
    +                $link_identifier,
    +                $base_dn,
    +                $filter,
    +                $attributes,
    +                $attrsonly,
    +                $sizelimit
    +            );
    +        }
    +    }
    +
    +    /**
    +     * Wrapper around msg() but outputs only when debug is enabled
    +     *
    +     * @param string $message
    +     * @param int $err
    +     * @param int $line
    +     * @param string $file
    +     * @return void
    +     */
    +    protected function debug($message, $err, $line, $file)
    +    {
    +        if (!$this->getConf('debug')) return;
    +        msg($message, $err, $line, $file);
    +    }
    +}
    diff --git a/lib/plugins/authldap/conf/default.php b/lib/plugins/authldap/conf/default.php
    new file mode 100644
    index 0000000..52fa1e6
    --- /dev/null
    +++ b/lib/plugins/authldap/conf/default.php
    @@ -0,0 +1,23 @@
    + 'danger');
    +$meta['port']        = array('numeric','_caution' => 'danger');
    +$meta['usertree']    = array('string','_caution' => 'danger');
    +$meta['grouptree']   = array('string','_caution' => 'danger');
    +$meta['userfilter']  = array('string','_caution' => 'danger');
    +$meta['groupfilter'] = array('string','_caution' => 'danger');
    +$meta['version']     = array('numeric','_caution' => 'danger');
    +$meta['starttls']    = array('onoff','_caution' => 'danger');
    +$meta['referrals']   = array('multichoice','_choices' => array(-1,0,1),'_caution' => 'danger');
    +$meta['deref']       = array('multichoice','_choices' => array(0,1,2,3),'_caution' => 'danger');
    +$meta['binddn']      = array('string','_caution' => 'danger');
    +$meta['bindpw']      = array('password','_caution' => 'danger','_code' => 'base64');
    +$meta['attributes']  = array('array');
    +//$meta['mapping']['name']  unsupported in config manager
    +//$meta['mapping']['grps']  unsupported in config manager
    +$meta['userscope']   = array('multichoice','_choices' => array('sub','one','base'),'_caution' => 'danger');
    +$meta['groupscope']  = array('multichoice','_choices' => array('sub','one','base'),'_caution' => 'danger');
    +$meta['userkey']     = array('string','_caution' => 'danger');
    +$meta['groupkey']    = array('string','_caution' => 'danger');
    +$meta['debug']       = array('onoff','_caution' => 'security');
    +$meta['modPass']     = array('onoff');
    diff --git a/lib/plugins/authldap/lang/ar/lang.php b/lib/plugins/authldap/lang/ar/lang.php
    new file mode 100644
    index 0000000..7396d10
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/ar/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['domainfail']            = 'يتعذر على LDAP العثور على اسم URL للمستخدم';
    +$lang['connectfail']           = 'يتعذر على LDAP الاتصال: %s';
    diff --git a/lib/plugins/authldap/lang/ar/settings.php b/lib/plugins/authldap/lang/ar/settings.php
    new file mode 100644
    index 0000000..10d6fbf
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/ar/settings.php
    @@ -0,0 +1,34 @@
    +
    + * @author alhajr 
    + */
    +$lang['server']                = 'خادم LDAP. إما اسم المضيف  (localhost) أو عنوان URL مؤهل بالكامل (ldap://server.tld:389)';
    +$lang['port']                  = 'LDAP المنفذ الملقم إذا لم يعط أي عنوان URL كامل أعلاه';
    +$lang['usertree']              = 'أين يمكن العثور على حسابات المستخدمين. مثل. ou=People, dc=server, dc=tld';
    +$lang['grouptree']             = 'أين يمكن العثور على مجموعات المستخدمين. مثل. ou=Group, dc=server, dc=tld';
    +$lang['userfilter']            = 'فلتر LDAP للبحث عن حسابات المستخدمين. مثل. <(&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'فلتر LDAP للبحث عن المجموعات. مثل. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'إصدار نسخة البروتوكول الستخدامه. قد تحتاج لتعيين هذه القيمة إلى 3';
    +$lang['starttls']              = 'استخدام اتصالات TLS؟';
    +$lang['referrals']             = 'يتبع الإحالات؟';
    +$lang['deref']                 = 'كيفية إلغاء مرجعية الأسماء المستعارة؟';
    +$lang['binddn']                = 'الاسم المميز لمستخدم الربط الاختياري إذا لم يكن الربط المجهول كافيا. مثل. < الرمز> cn = admin ، dc = my ، dc = home< / code>	';
    +$lang['bindpw']                = 'كلمة مرور المستخدم أعلاه';
    +$lang['attributes']            = 'السمات المطلوب استردادها باستخدام بحث LDAP.	';
    +$lang['userscope']             = 'تقييد نطاق البحث لبحث المستخدم	';
    +$lang['groupscope']            = 'تقييد نطاق البحث للبحث الجماعي	';
    +$lang['userkey']               = 'السمة التي تشير إلى اسم المستخدم ؛ يجب أن تكون متسقة مع فلتر المستخدم.	';
    +$lang['groupkey']              = 'عضوية المجموعة من أي سمة مستخدم (بدلا من مجموعات AD القياسية) على سبيل المثال مجموعة من القسم أو رقم الهاتف	';
    +$lang['modPass']               = 'هل يمكن تغيير كلمة مرور LDAP عبر دوكوويكي؟	';
    +$lang['debug']                 = 'عرض معلومات تصحيح الأخطاء الإضافية حول الأخطاء	';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER	';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING	';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING	';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS	';
    +$lang['referrals_o_-1']        = 'الافتراضي';
    +$lang['referrals_o_0']         = 'لا تتبع الإحالات	';
    +$lang['referrals_o_1']         = 'متابعة الإحالات	';
    diff --git a/lib/plugins/authldap/lang/bg/settings.php b/lib/plugins/authldap/lang/bg/settings.php
    new file mode 100644
    index 0000000..f301d1c
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/bg/settings.php
    @@ -0,0 +1,20 @@
    +
    + */
    +$lang['server']                = 'Вашият LDAP сървър. Име на хоста (localhost) или целият URL адрес (ldap://сървър.tld:389)';
    +$lang['port']                  = 'Порт на LDAP  сървъра, ако не сте въвели целия URL адрес по-горе';
    +$lang['usertree']              = 'Къде да се търси за потребителски акаунти. Например ou=People, dc=server, dc=tld';
    +$lang['grouptree']             = 'Къде да се търси за потребителски групи. Например ou=Group, dc=server, dc=tld';
    +$lang['userfilter']            = 'LDAP филтър за търсене на потребителски акаунти. Например (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'LDAP филтър за търсене на потребителски групи. Например (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'Коя версия на протокола да се ползва? Вероятно ще се наложи да зададете 3';
    +$lang['starttls']              = 'Ползване на TLS свързаност?';
    +$lang['referrals']             = 'Да бъдат ли следвани препратките (препращанията)?';
    +$lang['bindpw']                = 'Парола за горния потребител';
    +$lang['userscope']             = 'Ограничаване на обхвата за търсене на потребители';
    +$lang['groupscope']            = 'Ограничаване на обхвата за търсене на потребителски групи';
    +$lang['debug']                 = 'Показване на допълнителна debug информация при грешка';
    diff --git a/lib/plugins/authldap/lang/ca/lang.php b/lib/plugins/authldap/lang/ca/lang.php
    new file mode 100644
    index 0000000..f4431a3
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/ca/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'L\'LDAP no s\'ha pogut connectar: %s';
    +$lang['domainfail']            = 'L\'LDAP no ha trobat el teu nom distingit d\'usuari';
    diff --git a/lib/plugins/authldap/lang/ca/settings.php b/lib/plugins/authldap/lang/ca/settings.php
    new file mode 100644
    index 0000000..80460df
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/ca/settings.php
    @@ -0,0 +1,37 @@
    +
    + * @author David Surroca 
    + * @author Adolfo Jayme Barrientos 
    + * @author Àngel Pérez Beroy 
    + * @author Aniol Marti 
    + */
    +$lang['server']                = 'El vostre servidor LDAP. Nom d\'amfitrió (localhost) o URL qualificat complet (ldap://server.tld:389)';
    +$lang['port']                  = 'Port del servidor LDAP si no s\'ha donat cap URL complet més amunt';
    +$lang['usertree']              = 'On trobar els comptes d\'usuari. Per exemple. ou=People, dc=server, dc=tld';
    +$lang['grouptree']             = 'On trobar els grups d\'usuaris. Per exemple. ou=Grup, dc=servidor, dc=tld';
    +$lang['userfilter']            = 'Filtre LDAP per cercar comptes d\'usuari. Per exemple. (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'Filtre LDAP per cercar grups. Per exemple. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'La versió del protocol a utilitzar. Pot ser que hagueu d’establir-ho a 3';
    +$lang['starttls']              = 'Utilitzar connexions TLS?';
    +$lang['referrals']             = 'S\'han de seguir les referències?';
    +$lang['deref']                 = 'Com desreferenciar els àlies?';
    +$lang['binddn']                = 'DN d\'un usuari opcional enllaçat si l\'enllaç anònim no és suficient. Per exemple. cn=admin, dc=my, dc=home';
    +$lang['bindpw']                = 'Contrasenya de l\'usuari referit abans.';
    +$lang['attributes']            = 'Atributs a demanar a la consulta LDAP.';
    +$lang['userscope']             = 'Limiteu l\'abast de cerca per a la cerca d\'usuaris';
    +$lang['groupscope']            = 'Limiteu l\'abast de cerca per a la cerca de grups';
    +$lang['userkey']               = 'Atribut que denota el nom d\'usuari; ha de ser coherent amb el filtre d\'usuari.';
    +$lang['groupkey']              = 'Pertinença al grup des de qualsevol atribut d\'usuari (en lloc de grups AD estàndard), p. ex. grup del departament o número de telèfon';
    +$lang['modPass']               = 'Es pot canviar la contrasenya del LDAP mitjançant el Dokuwiki?';
    +$lang['debug']                 = 'Mostra informació addicional de depuració als errors.';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'ús per defecte';
    +$lang['referrals_o_0']         = 'no seguir les referències';
    +$lang['referrals_o_1']         = 'seguir les referències';
    diff --git a/lib/plugins/authldap/lang/ckb/lang.php b/lib/plugins/authldap/lang/ckb/lang.php
    new file mode 100644
    index 0000000..2beed47
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/ckb/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'LDAP ناتوانێت پەیوەندی بکات: %s';
    +$lang['domainfail']            = 'LDAP ناتوانێت dn ی بەکارهێنەرەکەت بدۆزێتەوە';
    diff --git a/lib/plugins/authldap/lang/ckb/settings.php b/lib/plugins/authldap/lang/ckb/settings.php
    new file mode 100644
    index 0000000..32dea98
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/ckb/settings.php
    @@ -0,0 +1,33 @@
    +
    + */
    +$lang['server']                = 'ڕاژەکاری LDAP ی تۆ. یان ناوی خانەخوێ (ناوخۆیی) یان URLی تەواو شیاو (ldap://server.tld:389)';
    +$lang['port']                  = 'دەرگای سێرڤەری LDAP ئەگەر هیچ URLێکی تەواو لە سەرەوە نەدرابێت';
    +$lang['usertree']              = 'لەکوێ ئەژمێرەکانی بەکارهێنەر بدۆزیتەوە. ئێگ ou=People, dc=server, dc=tld';
    +$lang['grouptree']             = 'لەکوێ گروپەکانی بەکارهێنەر بدۆزیتەوە. ئێگ ou=Group, dc=server, dc=tld';
    +$lang['userfilter']            = 'فلتەری LDAP بۆ گەڕان بۆ ئەژمێرەکانی بەکارهێنەر. ئێگ (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'فلتەری LDAP بۆ گەڕان بۆ گرووپەکان. ئێگ (&(objectClass=posixGroup)(|) gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'وەشانی پرۆتۆکۆل بۆ بەکارهێنان. لەوانەیە پێویستت بەوە بێت ئەمە ڕێک بخەیت بۆ 3';
    +$lang['starttls']              = 'بەکارهێنانی گرێدانەکانی TLS؟';
    +$lang['referrals']             = 'ئایا بەدوای دا بەهاوکردەوەکان دەکەون؟';
    +$lang['deref']                 = 'چۆن نازناوەکان بسڕنەوە؟';
    +$lang['binddn']                = 'DN ی بەکارهێنەری بەخۆوە ی بەستێنەر ئەگەر بەنادیارە بەینببەی بەش ناکات. ئێگ cn=admin, dc=my, dc=home';
    +$lang['bindpw']                = 'تێپەڕوشە بەکارهێنەری سەرەوە';
    +$lang['attributes']            = 'تایبەتمەندیەکان بۆ هێنانەوە لەگەڵ گەڕانی LDAP.';
    +$lang['userscope']             = 'سنووری بواری گەڕان بۆ گەڕانی بەکارهێنەر';
    +$lang['groupscope']            = 'سنووری بواری گەڕان بۆ گەڕانی گروپ';
    +$lang['userkey']               = 'تایبەتمەندی سڕینەوەی ناوی بەکارهێنەر; پێویستە هاوتەربێت لەگەڵ پاڵێوی بەکارهێنەر.';
    +$lang['groupkey']              = 'ئەندامێتی گرووپ لە هەر تایبەتمەندییەکی بەکارهێنەر (لەجیاتی گروپەستانداردەکانی AD) بۆ وێنە لە گرووپ لە بەشی یان ژمارەی تەلەفۆن';
    +$lang['modPass']               = 'ئایا دەکرێت تێپەڕوشەی LDAP بگۆڕدرێت لە لایەن دۆکوویکی ؟';
    +$lang['debug']                 = 'پیشاندانی زانیاری زیاتری ڕاستکردنەوەی هەڵە لەسەر هەڵەکان';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'بەکارهێنانی بنەڕەت';
    +$lang['referrals_o_0']         = 'بەدوای ئاماژەکان مەبە';
    +$lang['referrals_o_1']         = 'بە دوای ئاماژەکان بکەوە';
    diff --git a/lib/plugins/authldap/lang/cs/lang.php b/lib/plugins/authldap/lang/cs/lang.php
    new file mode 100644
    index 0000000..0fac2df
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/cs/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'LDAP připojení nefunkční: %s';
    +$lang['domainfail']            = 'LDAP nenalezlo uživatelské dn';
    diff --git a/lib/plugins/authldap/lang/cs/settings.php b/lib/plugins/authldap/lang/cs/settings.php
    new file mode 100644
    index 0000000..1bdaf29
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/cs/settings.php
    @@ -0,0 +1,36 @@
    +
    + * @author mkucera66 
    + * @author Jaroslav Lichtblau 
    + * @author Martin Růžička 
    + */
    +$lang['server']                = 'Váš server LDAP. Buď jméno hosta (localhost) nebo plně kvalifikovaný popis URL (ldap://server.tld:389)';
    +$lang['port']                  = 'Port serveru LDAP. Pokud není, bude využito URL výše';
    +$lang['usertree']              = 'Kde najít uživatelské účty, tj. ou=Lide, dc=server, dc=tld';
    +$lang['grouptree']             = 'Kde najít uživatelské skupiny, tj. ou=Skupina, dc=server, dc=tld';
    +$lang['userfilter']            = 'Filtr LDAPu pro vyhledávání uživatelských účtů, tj. (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'Filtr LDAPu pro vyhledávání uživatelských skupin, tj. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'Verze použitého protokolu. Můžete potřebovat jej nastavit na 3';
    +$lang['starttls']              = 'Využít spojení TLS?';
    +$lang['referrals']             = 'Přeposílat odkazy?';
    +$lang['deref']                 = 'Jak rozlišovat aliasy?';
    +$lang['binddn']                = 'Doménový název DN volitelně připojeného uživatele, pokus anonymní připojení není vyhovující, tj.  cn=admin, dc=muj, dc=domov';
    +$lang['bindpw']                = 'Heslo uživatele výše';
    +$lang['attributes']            = 'Atributy k načtení pomocí vyhledávání LDAP.';
    +$lang['userscope']             = 'Omezení rozsahu vyhledávání uživatele';
    +$lang['groupscope']            = 'Omezení rozsahu vyhledávání skupiny';
    +$lang['userkey']               = 'Atribut označující uživatelské jméno; musí být konzistetní s uživatelským filtrem.';
    +$lang['groupkey']              = 'Atribut členství uživatele ve skupinách (namísto standardních AD skupin), tj. skupina z oddělení nebo telefonní číslo';
    +$lang['modPass']               = 'Může být LDAP heslo změněno přes dokuwiki?';
    +$lang['debug']                 = 'Zobrazit dodatečné debugovací informace';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'použít výchozí';
    +$lang['referrals_o_0']         = 'nenásledovat odkazy';
    +$lang['referrals_o_1']         = 'následovat odkazy';
    diff --git a/lib/plugins/authldap/lang/cy/lang.php b/lib/plugins/authldap/lang/cy/lang.php
    new file mode 100644
    index 0000000..f6c5cf6
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/cy/lang.php
    @@ -0,0 +1,11 @@
    +localhost) neu\'r URL llawn (ldap://server.tld:389)';
    +$lang['port']        = 'Porth gweinydd LDAP os nac oes URL llawn wedi\'i gyflwyno uchod';
    +$lang['usertree']    = 'Ble i ddarganfod cyfrifon defnyddwyr. Ee. ou=People, dc=server, dc=tld';
    +$lang['grouptree']   = 'Ble i ddarganfod y grwpiau defnyddiwr. Eg. ou=Group, dc=server, dc=tld';
    +$lang['userfilter']  = 'Hidlydd LDAP i ddarganfod cyfrifon defnyddwyr. Eg. (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter'] = 'Hidlydd LDAP i chwilio am grwpiau. Eg. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']     = 'Y fersiwn protocol i\'w ddefnyddio. Efallai bydd angen gosod hwn i 3';
    +$lang['starttls']    = 'Defnyddio cysylltiadau TLS?';
    +$lang['referrals']   = 'Dilyn cyfeiriadau (referrals)?';
    +$lang['deref']       = 'Sut i ddadgyfeirio alias?'; //alias - enw arall?
    +$lang['binddn']      = 'DN rhwymiad defnyddiwr opsiynol os ydy rhwymiad anhysbys yn annigonol. Ee. cn=admin, dc=my, dc=home';
    +$lang['bindpw']      = 'Cyfrinair y defnyddiwr uchod';
    +$lang['userscope']   = 'Cyfyngu sgôp chwiliadau ar gyfer chwiliad defnyddwyr';
    +$lang['groupscope']  = 'Cyfyngu sgôp chwiliadau ar gyfer chwiliad grwpiau';
    +$lang['userkey']     = 'Priodoledd yn denodi\'r defnyddair; rhaid iddo fod yn gyson i \'r hidlydd defnyddwyr.';
    +$lang['groupkey']    = 'Aelodaeth grŵp o unrhyw briodoledd defnyddiwr (yn hytrach na grwpiau AD safonol) e.e. grŵp o adran neu rif ffôn';
    +$lang['modPass']     = 'Gall cyfrinair LDAP gael ei newid gan DokuWiki?';
    +$lang['debug']       = 'Dangos gwybodaeth dadfygio ychwanegol gyda gwallau';
    +
    +
    +$lang['deref_o_0']   = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']   = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']   = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']   = 'LDAP_DEREF_ALWAYS';
    +
    +$lang['referrals_o_-1'] = 'defnyddio\'r diofyn';
    +$lang['referrals_o_0']  = 'peidio dilyn cyfeiriadau';
    +$lang['referrals_o_1']  = 'dilyn cyfeiriadau';
    \ No newline at end of file
    diff --git a/lib/plugins/authldap/lang/da/lang.php b/lib/plugins/authldap/lang/da/lang.php
    new file mode 100644
    index 0000000..35249df
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/da/lang.php
    @@ -0,0 +1,10 @@
    +
    + * @author Jacob Palm 
    + */
    +$lang['connectfail']           = 'LDAP kan ikke forbinde: %s';
    +$lang['domainfail']            = 'LDAP kan ikke finde dit bruger dn';
    diff --git a/lib/plugins/authldap/lang/da/settings.php b/lib/plugins/authldap/lang/da/settings.php
    new file mode 100644
    index 0000000..f831a8f
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/da/settings.php
    @@ -0,0 +1,36 @@
    +
    + * @author Jon Theil Nielsen 
    + * @author Jens Hyllegaard 
    + * @author soer9648 
    + */
    +$lang['server']                = 'Din LDAP server. Enten værtsnavn (localhost) eller fuld kvalificeret URL (ldap://server.tld:389)';
    +$lang['port']                  = 'LDAP server port, hvis der ikke er angivet en komplet URL ovenfor.';
    +$lang['usertree']              = 'Sti til brugerkonti. F.eks. ou=Personer, dc=server, dc=tld';
    +$lang['grouptree']             = 'Sti til brugergrupper. F.eks. ou=Grupper, dc=server, dc=tld';
    +$lang['userfilter']            = 'LDAP filter der benyttes til at søge efter brugerkonti. F.eks. (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'LDAP filter tder benyttes til at søge efter grupper. F.eks. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'Protokol-version der skal benyttes. Det er muligvis nødvendigt at sætte denne til 3';
    +$lang['starttls']              = 'Benyt TLS forbindelser?';
    +$lang['referrals']             = 'Tillad henvisninger?';
    +$lang['deref']                 = 'Hvordan skal opslag renses for henvisninger?';
    +$lang['binddn']                = 'DN af en valgfri bindings-bruger, hvis ikke anonym binding er tilstrækkeligt. Fx cn=admin,dc=my,dc=home';
    +$lang['bindpw']                = 'Adgangskode til ovenstående bruger';
    +$lang['attributes']            = 'Attributter der skal hentes med LDAP søgning.';
    +$lang['userscope']             = 'Begræns søgekriterier for brugersøgning';
    +$lang['groupscope']            = 'Begræns søgekriterier for gruppesøgning';
    +$lang['userkey']               = 'Attribut der betegner brugernavnet; skal være i overensstemmelse med brugerfilteret.';
    +$lang['groupkey']              = 'Gruppemedlemskab fra hvilken som helst brugerattribut (i stedet for standard AD-grupper), fx gruppe fra afdeling eller telefonnummer';
    +$lang['modPass']               = 'Kan LDAP adgangskoden skiftes via DokuWiki?';
    +$lang['debug']                 = 'Vis yderligere debug output ved fejl';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'brug standardindstilling';
    +$lang['referrals_o_0']         = 'følg ikke henvisninger';
    +$lang['referrals_o_1']         = 'følg henvisninger';
    diff --git a/lib/plugins/authldap/lang/de-informal/lang.php b/lib/plugins/authldap/lang/de-informal/lang.php
    new file mode 100644
    index 0000000..79016fe
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/de-informal/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'LDAP kann sich nicht verbinden: %s';
    +$lang['domainfail']            = 'LDAP kann Deinen user dn nicht finden';
    diff --git a/lib/plugins/authldap/lang/de-informal/settings.php b/lib/plugins/authldap/lang/de-informal/settings.php
    new file mode 100644
    index 0000000..4810001
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/de-informal/settings.php
    @@ -0,0 +1,37 @@
    +
    + * @author Matthias Schulte 
    + * @author Volker Bödker 
    + * @author rnck 
    + * @author F. Mueller-Donath 
    + */
    +$lang['server']                = 'Adresse zum LDAP-Server. Entweder als Hostname (localhost) oder als FQDN (ldap://server.tld:389).';
    +$lang['port']                  = 'Port des LDAP-Servers, falls kein Port angegeben wurde.';
    +$lang['usertree']              = 'Zweig, in dem die die Benutzeraccounts gespeichert sind. Zum Beispiel: ou=People, dc=server, dc=tld.';
    +$lang['grouptree']             = 'Zweig, in dem die Benutzergruppen gespeichert sind. Zum Beispiel:  ou=Group, dc=server, dc=tld.';
    +$lang['userfilter']            = 'LDAP-Filter, um die Benutzeraccounts zu suchen. Zum Beispiel: (&(uid=%{user})(objectClass=posixAccount)).';
    +$lang['groupfilter']           = 'LDAP-Filter, um die Benutzergruppen zu suchen. Zum Beispiel:  (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user}))).';
    +$lang['version']               = 'Zu verwendende Protokollversion von LDAP.';
    +$lang['starttls']              = 'Verbindung über TLS aufbauen?';
    +$lang['referrals']             = 'Weiterverfolgen von LDAP-Referrals (Verweise)?';
    +$lang['deref']                 = 'Wie sollen Aliasse derefernziert werden?';
    +$lang['binddn']                = 'DN eines optionalen Benutzers, wenn der anonyme Zugriff nicht ausreichend ist. Zum Beispiel: cn=admin, dc=my, dc=home.';
    +$lang['bindpw']                = 'Passwort des angegebenen Benutzers.';
    +$lang['attributes']            = 'Attribute, die mit der LDAP-Suche abgerufen werden sollen.';
    +$lang['userscope']             = 'Die Suchweite nach Benutzeraccounts.';
    +$lang['groupscope']            = 'Die Suchweite nach Benutzergruppen.';
    +$lang['userkey']               = 'Attribut, das den Benutzernamen enthält; muss konsistent zum userfilter sein.';
    +$lang['groupkey']              = 'Gruppieren der Benutzeraccounts anhand eines beliebigen Benutzerattributes z. B. Telefonnummer oder Abteilung, anstelle der Standard-Gruppen).';
    +$lang['modPass']               = 'Kann das LDAP Passwort via dokuwiki geändert werden?';
    +$lang['debug']                 = 'Debug-Informationen beim Auftreten von Fehlern anzeigen?';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NIEMALS';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SUCHEN';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDEN';
    +$lang['deref_o_3']             = 'LDAP_DEREF_IMMER';
    +$lang['referrals_o_-1']        = 'benutze die Vorgabe';
    +$lang['referrals_o_0']         = 'keine Verweise erlauben';
    +$lang['referrals_o_1']         = 'folge Verweisen';
    diff --git a/lib/plugins/authldap/lang/de/lang.php b/lib/plugins/authldap/lang/de/lang.php
    new file mode 100644
    index 0000000..db6b891
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/de/lang.php
    @@ -0,0 +1,10 @@
    +
    + * @author Hella Breitkopf 
    + */
    +$lang['connectfail']           = 'LDAP-Verbindung scheitert: %s';
    +$lang['domainfail']            = 'LDAP kann Ihren Benutzer (DN) nicht finden';
    diff --git a/lib/plugins/authldap/lang/de/settings.php b/lib/plugins/authldap/lang/de/settings.php
    new file mode 100644
    index 0000000..b6622d5
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/de/settings.php
    @@ -0,0 +1,38 @@
    +
    + * @author Matthias Schulte 
    + * @author christian studer 
    + * @author Philip Knack 
    + * @author Anika Henke 
    + * @author Hella Breitkopf 
    + */
    +$lang['server']                = 'Adresse zum LDAP-Server. Entweder als Hostname (localhost) oder als FQDN (ldap://server.tld:389).';
    +$lang['port']                  = 'Port des LDAP-Servers, falls kein Port angegeben wurde.';
    +$lang['usertree']              = 'Zweig, in dem die die Benutzeraccounts gespeichert sind. Zum Beispiel: ou=People, dc=server, dc=tld.';
    +$lang['grouptree']             = 'Zweig, in dem die Benutzergruppen gespeichert sind. Zum Beispiel:  ou=Group, dc=server, dc=tld.';
    +$lang['userfilter']            = 'LDAP-Filter, um die Benutzeraccounts zu suchen. Zum Beispiel: (&(uid=%{user})(objectClass=posixAccount)).';
    +$lang['groupfilter']           = 'LDAP-Filter, um die Benutzergruppen zu suchen. Zum Beispiel:  (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user}))).';
    +$lang['version']               = 'Zu verwendende Protokollversion von LDAP.';
    +$lang['starttls']              = 'Verbindung über TLS aufbauen?';
    +$lang['referrals']             = 'Weiterverfolgen von LDAP-Referrals (Verweise)?';
    +$lang['deref']                 = 'Wie sollen Aliase aufgelöst werden?';
    +$lang['binddn']                = 'DN eines optionalen Benutzers, wenn der anonyme Zugriff nicht ausreichend ist. Zum Beispiel: cn=admin, dc=my, dc=home.';
    +$lang['bindpw']                = 'Passwort des angegebenen Benutzers.';
    +$lang['attributes']            = 'Attribute, die mit der LDAP-Suche abgerufen werden sollen.';
    +$lang['userscope']             = 'Die Suchweite nach Benutzeraccounts.';
    +$lang['groupscope']            = 'Die Suchweite nach Benutzergruppen.';
    +$lang['userkey']               = 'Attribut, das den Benutzernamen enthält; muss konsistent zum userfilter sein.';
    +$lang['groupkey']              = 'Gruppieren der Benutzeraccounts anhand eines beliebigen Benutzerattributes z. B. Telefonnummer oder Abteilung, anstelle der Standard-Gruppen).';
    +$lang['modPass']               = 'Darf über Dokuwiki das LDAP-Passwort geändert werden?';
    +$lang['debug']                 = 'Debug-Informationen beim Auftreten von Fehlern anzeigen?';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'Standard verwenden';
    +$lang['referrals_o_0']         = 'Referrals nicht folgen';
    +$lang['referrals_o_1']         = 'Referrals folgen';
    diff --git a/lib/plugins/authldap/lang/el/lang.php b/lib/plugins/authldap/lang/el/lang.php
    new file mode 100644
    index 0000000..3e2d26f
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/el/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'Δεν υπάρχει δυνατότητα σύνδεσης LDAP %s';
    +$lang['domainfail']            = 'To LDAO δεν μπορεί να εντοπίσει το dn του χρήστη σας ';
    diff --git a/lib/plugins/authldap/lang/el/settings.php b/lib/plugins/authldap/lang/el/settings.php
    new file mode 100644
    index 0000000..296dc24
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/el/settings.php
    @@ -0,0 +1,32 @@
    +
    + */
    +$lang['server']                = 'Ο διακομιστής σας LDAP. Είτε το κύριο όνομα ή ολόκληρο το URL ';
    +$lang['port']                  = 'Η πύλη διακομιστή LDAP αν δεν εδόθη ολόκληρο το URL ';
    +$lang['usertree']              = 'Πού μπορούν να βρεθούν οι λογαριασμοί χρήστη.. Π.χ . ou=Κοινό , dc=server, dc=tld	';
    +$lang['grouptree']             = 'Πού μπορούν να βρεθούν οι ομάδες χρήστη. Πχ. ou=Group, dc=server, dc=tld	';
    +$lang['userfilter']            = 'LDAP φίλτρο προς αναζήτηση λογαριασμών χρήστη Πχ . (&(uid=%{user})(objectClass=posixAccount))	';
    +$lang['groupfilter']           = 'LDAP φίλτρο προς αναζήτηση ομάδων . Πχ. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))	';
    +$lang['version']               = 'Η έκδοση πρωτοκόλλου προς χρήση. Μπορεί να χρειαστείτε να τοποθετήσετε αυτό στον <κωδικό> 3 ';
    +$lang['starttls']              = 'Να γίνει χρήση συνδέσεων TLS?';
    +$lang['referrals']             = 'Να ακολουθηθούν τα μέλη αναφοράς?';
    +$lang['deref']                 = 'Πώς να σβηστεί η αναφορά aliases?';
    +$lang['binddn']                = 'To DN ενός προαιρετικού επίσημου χρήστη αν ο ανώνυμος σύνδεσμος  δεν είναι επαρκής Πχ. cn=admin, dc=my, dc=home	';
    +$lang['bindpw']                = 'Ο κωδικός πρόσβασης του άνω χρήστη';
    +$lang['userscope']             = 'Περιορισμός του εύρους αναζήτησης χρήστη';
    +$lang['groupscope']            = 'Περιορίστε το εύρος της αναζήτησης για αναζήτηση ομάδας';
    +$lang['userkey']               = ' Η Καταχώρηση του ονόματος χρήστη πρέπει να είναι σύμφωνα με την ανάλυση (=φίλτρο) χρήστη.';
    +$lang['groupkey']              = 'Εγγραφή ομάδας ως μέλους από οιαδήποτε κατηγορία χρήστη (αντί των στάνταρ ομάδων AD) πχ ομάδα τμήματος ή αριθμός τηλεφώνου';
    +$lang['modPass']               = 'Μπορεί ο κωδικός πρόσβασης LDAP να αλλάξει μέσω του dokuwiki?';
    +$lang['debug']                 = 'Προβολή επιπλέον πληροφοριών για την ανεύρεση σφαλμάτων';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER	';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING	';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS	';
    +$lang['referrals_o_-1']        = 'προεπιλογή χρήσης';
    +$lang['referrals_o_0']         = 'μην ακολουθείτε τα νέα μέλη αναφοράς';
    +$lang['referrals_o_1']         = 'ακολουθείστε τα νέα μέλη αναφοράς ';
    diff --git a/lib/plugins/authldap/lang/en/lang.php b/lib/plugins/authldap/lang/en/lang.php
    new file mode 100644
    index 0000000..8185a84
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/en/lang.php
    @@ -0,0 +1,11 @@
    +localhost) or full qualified URL (ldap://server.tld:389)';
    +$lang['port']        = 'LDAP server port if no full URL was given above';
    +$lang['usertree']    = 'Where to find the user accounts. Eg. ou=People, dc=server, dc=tld';
    +$lang['grouptree']   = 'Where to find the user groups. Eg. ou=Group, dc=server, dc=tld';
    +$lang['userfilter']  = 'LDAP filter to search for user accounts. Eg. (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter'] = 'LDAP filter to search for groups. Eg. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']     = 'The protocol version to use. You may need to set this to 3';
    +$lang['starttls']    = 'Use TLS connections?';
    +$lang['referrals']   = 'Shall referrals be followed?';
    +$lang['deref']       = 'How to dereference aliases?';
    +$lang['binddn']      = 'DN of an optional bind user if anonymous bind is not sufficient. Eg. cn=admin, dc=my, dc=home';
    +$lang['bindpw']      = 'Password of above user';
    +$lang['attributes']  = 'Attributes to retrieve with the LDAP search.';
    +$lang['userscope']   = 'Limit search scope for user search';
    +$lang['groupscope']  = 'Limit search scope for group search';
    +$lang['userkey']     = 'Attribute denoting the username; must be consistent to userfilter.';
    +$lang['groupkey']    = 'Group membership from any user attribute (instead of standard AD groups) e.g. group from department or telephone number';
    +$lang['modPass']     = 'Can the LDAP password be changed via dokuwiki?';
    +$lang['debug']       = 'Display additional debug information on errors';
    +
    +
    +$lang['deref_o_0']   = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']   = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']   = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']   = 'LDAP_DEREF_ALWAYS';
    +
    +$lang['referrals_o_-1'] = 'use default';
    +$lang['referrals_o_0']  = 'don\'t follow referrals';
    +$lang['referrals_o_1']  = 'follow referrals';
    \ No newline at end of file
    diff --git a/lib/plugins/authldap/lang/eo/lang.php b/lib/plugins/authldap/lang/eo/lang.php
    new file mode 100644
    index 0000000..ef0e6f4
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/eo/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'LDAP ne povas konektiĝi: %s';
    +$lang['domainfail']            = 'LDAP ne povas trovi vian uzanton dn';
    diff --git a/lib/plugins/authldap/lang/eo/settings.php b/lib/plugins/authldap/lang/eo/settings.php
    new file mode 100644
    index 0000000..da00342
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/eo/settings.php
    @@ -0,0 +1,34 @@
    +
    + * @author Felipe Castro 
    + */
    +$lang['server']                = 'Via LDAP-servilo. Aŭ servila nomo (localhost) aŭ plene detala URL (ldap://servilo.lando:389)';
    +$lang['port']                  = 'LDAP-servila pordego, se vi supre ne indikis la plenan URL';
    +$lang['usertree']              = 'Kie trovi uzantajn kontojn, ekz. ou=Personoj, dc=servilo, dc=lando';
    +$lang['grouptree']             = 'Kie trovi uzantogrupojn, ekz. ou=Grupo, dc=servilo, dc=lando';
    +$lang['userfilter']            = 'LDAP-filtrilo por serĉi uzantokontojn, ekz. (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'LDAP-filtrilo por serĉi grupojn, ekz. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'La uzenda protokolversio. Eble necesas indiki 3';
    +$lang['starttls']              = 'Ĉu uzi TLS-konektojn?';
    +$lang['referrals']             = 'Ĉu sekvi referencojn?';
    +$lang['deref']                 = 'Kiel dereferencigi kromnomojn?';
    +$lang['binddn']                = 'DN de opcie bindita uzanto, se anonima bindado ne sufiĉas, ekz. cn=admin, dc=mia, dc=hejmo';
    +$lang['bindpw']                = 'Pasvorto de tiu uzanto';
    +$lang['attributes']            = 'Atributoj por preni per la LDAP-serĉo.';
    +$lang['userscope']             = 'Limigi serĉospacon de uzantaj serĉoj';
    +$lang['groupscope']            = 'Limigi serĉospacon por grupaj serĉoj';
    +$lang['userkey']               = 'Atributo indikanta la uzantnomon; devas esti konsekvenca al uzantfiltrilo.';
    +$lang['groupkey']              = 'Grupa membreco de iu uzanta atributo (anstataŭ standardaj AD-grupoj), ekz. grupo de departemento aŭ telefonnumero';
    +$lang['modPass']               = 'Ĉu la LDAP-pasvorto povas esti ŝanĝita per dokuwiki?';
    +$lang['debug']                 = 'Ĉu montri aldonajn erarinformojn?';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'uzu defaŭlton';
    +$lang['referrals_o_0']         = 'ne sekvu referencojn';
    +$lang['referrals_o_1']         = 'sekvu referencojn';
    diff --git a/lib/plugins/authldap/lang/es/lang.php b/lib/plugins/authldap/lang/es/lang.php
    new file mode 100644
    index 0000000..53db676
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/es/lang.php
    @@ -0,0 +1,10 @@
    +
    + * @author David Roy 
    + */
    +$lang['connectfail']           = 'LDAP no se puede conectar: %s';
    +$lang['domainfail']            = 'LDAP no puede encontrar el DN de tu usuario';
    diff --git a/lib/plugins/authldap/lang/es/settings.php b/lib/plugins/authldap/lang/es/settings.php
    new file mode 100644
    index 0000000..7a4090f
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/es/settings.php
    @@ -0,0 +1,37 @@
    +
    + * @author Antonio Bueno 
    + * @author Eloy 
    + * @author Alejandro Nunez 
    + * @author Enny Rodriguez 
    + */
    +$lang['server']                = 'Tu servidor LDAP. Puede ser el nombre del host  (localhost) o una URL completa (ldap://server.tld:389)';
    +$lang['port']                  = 'Servidor LDAP en caso de que no se diera la URL completa anteriormente.';
    +$lang['usertree']              = 'Donde encontrar cuentas de usuario. Ej. ou=People, dc=server, dc=tld';
    +$lang['grouptree']             = 'Donde encontrar grupos de usuarios. Ej. ou=Group, dc=server, dc=tld';
    +$lang['userfilter']            = 'Filtro LDAP para la busqueda de cuentas de usuario. P. E. (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'Filtro LDAP para la busqueda de grupos. P. E. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'La versión del protocolo a usar. Puede que necesites poner esto a 3';
    +$lang['starttls']              = 'Usar conexiones TLS?';
    +$lang['referrals']             = '¿Deben ser seguidas las referencias?';
    +$lang['deref']                 = '¿Cómo desreferenciar los alias?';
    +$lang['binddn']                = 'DN de un usuario de enlace opcional si el enlace anónimo no es suficiente. P. ej. cn=admin, dc=my, dc=home';
    +$lang['bindpw']                = 'Contraseña del usuario de arriba.';
    +$lang['attributes']            = 'Atributos a recuperar de la búsqueda en LDAP.';
    +$lang['userscope']             = 'Limitar ámbito de búsqueda para búsqueda de usuarios';
    +$lang['groupscope']            = 'Limitar ámbito de búsqueda para búsqueda de grupos';
    +$lang['userkey']               = 'Atributo que denota el nombre de usuario; debe ser coherente con el filtro.';
    +$lang['groupkey']              = 'Pertenencia al grupo desde cualquier atributo de usuario (en lugar de grupos AD estándar) p.e., grupo a partir departamento o número de teléfono';
    +$lang['modPass']               = 'Puede ser cambiara via dokuwiki la password LDAP?';
    +$lang['debug']                 = 'Mostrar información adicional para depuración de errores';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'usar default';
    +$lang['referrals_o_0']         = 'no seguir referencias';
    +$lang['referrals_o_1']         = 'seguir referencias';
    diff --git a/lib/plugins/authldap/lang/et/settings.php b/lib/plugins/authldap/lang/et/settings.php
    new file mode 100644
    index 0000000..9c869b1
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/et/settings.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['grouptree']             = 'Kus kohast kasutaja rühmi otsida. Nt. ou=Rühm, dc=server, dc=tld';
    +$lang['groupscope']            = 'Piiritle otsingu ulatus rühma otsinguga';
    diff --git a/lib/plugins/authldap/lang/eu/lang.php b/lib/plugins/authldap/lang/eu/lang.php
    new file mode 100644
    index 0000000..f68b6d1
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/eu/lang.php
    @@ -0,0 +1,8 @@
    +
    + */
    +$lang['connectfail']           = 'LDAP ezin da konektaku: %s';
    diff --git a/lib/plugins/authldap/lang/eu/settings.php b/lib/plugins/authldap/lang/eu/settings.php
    new file mode 100644
    index 0000000..cd3d62c
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/eu/settings.php
    @@ -0,0 +1,11 @@
    +
    + */
    +$lang['version']               = 'Erabiltzen duzun proitokoloaren bertsioa. 3 gisa jarri behar zenezake';
    +$lang['starttls']              = 'Erabili TLS konexioak?';
    +$lang['bindpw']                = 'Goiko erabiltzailearen pasahitza';
    +$lang['referrals_o_-1']        = 'erabili lehenetsitakoa';
    diff --git a/lib/plugins/authldap/lang/fa/lang.php b/lib/plugins/authldap/lang/fa/lang.php
    new file mode 100644
    index 0000000..a4e776b
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/fa/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'LDAP نمیتواند وصل شود: %s';
    +$lang['domainfail']            = 'LDAP نمیتواند کاربر شما را پیدا کند';
    diff --git a/lib/plugins/authldap/lang/fa/settings.php b/lib/plugins/authldap/lang/fa/settings.php
    new file mode 100644
    index 0000000..f41cf18
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/fa/settings.php
    @@ -0,0 +1,39 @@
    +
    + * @author علیرضا ایوز 
    + * @author Masoud Sadrnezhaad 
    + * @author Mohammad Sadegh 
    + * @author Omid Hezaveh 
    + * @author Mohmmad Razavi 
    + * @author sam01 
    + */
    +$lang['server']                = 'سرور LDAP شما. چه به صورت ';
    +$lang['port']                  = 'درگاه سرور LDAP اگر که URL کامل در بالا نوشته نشده';
    +$lang['usertree']              = 'محل حساب‌های کاربری. برای مثال ou=People, dc=server, dc=tld';
    +$lang['grouptree']             = 'محل گروه‌های کاربری. برای مثال ou=Group, dc=server, dc=tld';
    +$lang['userfilter']            = 'فیتلرهای LDAP برای جستجوی حساب‌های کاربری. برای مثال (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'فیلتر LDAP برای جستجوی گروه‌ها. برای مثال (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'نسخهٔ پروتوکل برای استفاده. احتمالا این را باید 3 وارد کنید.';
    +$lang['starttls']              = 'از تی‌ال‌اس (TLS) استفاده می‌کنید؟';
    +$lang['referrals']             = 'آیا ارجاعات باید دنبال شوند؟';
    +$lang['deref']                 = 'نام‌های مستعار چطور ارجاع یابی شوند؟';
    +$lang['binddn']                = ' DN برای کاربر اتصال اگر اتصال ناشناخته کافی نیست. مثال
    +cn=admin, dc=my, dc=home';
    +$lang['bindpw']                = 'رمزعبور کاربر بالا';
    +$lang['userscope']             = 'محدود کردن محدودهٔ جستجو به جستجوی کاربر';
    +$lang['groupscope']            = 'محدود کردن محدودهٔ جستجو به جستجوی گروه';
    +$lang['userkey']               = 'صفتی که نشان‌دهندهٔ نام کاربر است؛ باید با userfilter نامتناقض باشد.';
    +$lang['groupkey']              = 'عضویت در گروه برمبنای هر کدام از صفات کاربر (به جای گروه‌های استاندارد AD) برای مثال گروه برمبنای دپارتمان یا شماره تلفن';
    +$lang['modPass']               = 'آیا پسورد LDAP می‌تواند توسط داکو ویکی تغییر کند؟';
    +$lang['debug']                 = 'نمایش اطلاعات بیشتر برای خطایابی در ارورها';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'استفاده از پیشفرض';
    +$lang['referrals_o_0']         = 'ارجاعات را دنبال نکن';
    +$lang['referrals_o_1']         = 'ارجاعات را دنبال کن';
    diff --git a/lib/plugins/authldap/lang/fi/settings.php b/lib/plugins/authldap/lang/fi/settings.php
    new file mode 100644
    index 0000000..c322d24
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/fi/settings.php
    @@ -0,0 +1,11 @@
    +
    + */
    +$lang['starttls']              = 'Käytä TLS yhteyttä';
    +$lang['bindpw']                = 'Ylläolevan käyttäjän salasana';
    +$lang['userscope']             = 'Etsi vain käyttäjiä';
    +$lang['groupscope']            = 'Etsi vain ryhmiä';
    diff --git a/lib/plugins/authldap/lang/fr/lang.php b/lib/plugins/authldap/lang/fr/lang.php
    new file mode 100644
    index 0000000..ce26e86
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/fr/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'LDAP ne peux se connecter : %s';
    +$lang['domainfail']            = 'LDAP ne trouve pas l\'utilisateur dn';
    diff --git a/lib/plugins/authldap/lang/fr/settings.php b/lib/plugins/authldap/lang/fr/settings.php
    new file mode 100644
    index 0000000..ae3020d
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/fr/settings.php
    @@ -0,0 +1,37 @@
    +
    + * @author Schplurtz le Déboulonné 
    + * @author Pierre Henriot 
    + * @author PaliPalo 
    + * @author Bruno Veilleux 
    + */
    +$lang['server']                = 'Votre serveur LDAP. Soit le nom d\'hôte (localhost) ou l\'URL complète (ldap://serveur.dom:389)';
    +$lang['port']                  = 'Port du serveur LDAP si l\'URL complète n\'a pas été indiqué ci-dessus';
    +$lang['usertree']              = 'Où trouver les comptes utilisateur. Ex. : ou=Utilisateurs, dc=serveur, dc=dom';
    +$lang['grouptree']             = 'Où trouver les groupes d\'utilisateurs. Ex. : ou=Groupes, dc=serveur, dc=dom';
    +$lang['userfilter']            = 'Filtre LDAP pour rechercher les comptes utilisateur. Ex. : (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'Filtre LDAP pour rechercher les groupes. Ex. : (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'La version de protocole à utiliser. Il se peut que vous deviez utiliser 3';
    +$lang['starttls']              = 'Utiliser les connexions TLS?';
    +$lang['referrals']             = 'Suivre les références?';
    +$lang['deref']                 = 'Comment déréférencer les alias ?';
    +$lang['binddn']                = 'Nom de domaine d\'un utilisateur de connexion facultatif si une connexion anonyme n\'est pas suffisante. Ex. : cn=admin, dc=mon, dc=accueil';
    +$lang['bindpw']                = 'Mot de passe de l\'utilisateur ci-dessus.';
    +$lang['attributes']            = 'Attributs à récupérer avec la recherche LDAP.';
    +$lang['userscope']             = 'Limiter la portée de recherche d\'utilisateurs';
    +$lang['groupscope']            = 'Limiter la portée de recherche de groupes';
    +$lang['userkey']               = 'Attribut indiquant le nom d\'utilisateur. Doit être en accord avec le filtre d\'utilisateur.';
    +$lang['groupkey']              = 'Affiliation aux groupes à partir de n\'importe quel attribut utilisateur (au lieu des groupes AD standards), p. ex. groupes par département ou numéro de téléphone';
    +$lang['modPass']               = 'Peut-on changer le mot de passe LDAP depuis DokiWiki ?';
    +$lang['debug']                 = 'Afficher des informations de débogage supplémentaires pour les erreurs';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'comportement par défaut';
    +$lang['referrals_o_0']         = 'ne pas suivre les références';
    +$lang['referrals_o_1']         = 'suivre les références';
    diff --git a/lib/plugins/authldap/lang/he/settings.php b/lib/plugins/authldap/lang/he/settings.php
    new file mode 100644
    index 0000000..8886446
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/he/settings.php
    @@ -0,0 +1,14 @@
    +
    + * @author matt carroll 
    + * @author Menashe Tomer 
    + */
    +$lang['starttls']              = 'השתמש בחיבורי TLS';
    +$lang['bindpw']                = 'סיסמה של המשתמש לעיל';
    +$lang['modPass']               = 'האם dokuwiki יכול ליצור סיסמאות LDAP?';
    +$lang['debug']                 = 'הצג מידע נוסף על שגיאות';
    +$lang['referrals_o_-1']        = 'ברירת מחדל';
    diff --git a/lib/plugins/authldap/lang/hr/lang.php b/lib/plugins/authldap/lang/hr/lang.php
    new file mode 100644
    index 0000000..fb915b4
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/hr/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'LDAP se ne može spojiti: %s';
    +$lang['domainfail']            = 'LDAP ne može pronaći Vaš korisnički dn';
    diff --git a/lib/plugins/authldap/lang/hr/settings.php b/lib/plugins/authldap/lang/hr/settings.php
    new file mode 100644
    index 0000000..0e5faa4
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/hr/settings.php
    @@ -0,0 +1,32 @@
    +
    + */
    +$lang['server']                = 'Vaš LDAP server. Upišite ili naziv računala (localhost) ili puni URL (ldap://server.tld:389)';
    +$lang['port']                  = 'LDAP server port, ako gore nije specificiran puni URL.';
    +$lang['usertree']              = 'Gdje da nađem korisničke prijave. Npr. ou=People, dc=server, dc=tld';
    +$lang['grouptree']             = 'Gdje da nađem korisničke grupe. Npr. ou=Group, dc=server, dc=tld';
    +$lang['userfilter']            = 'LDAP filter za pretragu korisničkih prijava. Npr. (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'LDAP filter za pretragu grupa. Npr. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'Protokol koji se koristi. Možda će te trebati postaviti na 3';
    +$lang['starttls']              = 'Korisni TLS vezu?';
    +$lang['referrals']             = 'Da li da slijedim uputnice?';
    +$lang['deref']                 = 'Kako da razlikujem aliase?';
    +$lang['binddn']                = 'DN opcionalnog korisnika ako anonimni korisnik nije dovoljan. Npr. cn=admin, dc=my, dc=home';
    +$lang['bindpw']                = 'Lozinka gore navedenog korisnika';
    +$lang['userscope']             = 'Ograniči područje za pretragu korisnika';
    +$lang['groupscope']            = 'Ograniči područje za pretragu grupa';
    +$lang['userkey']               = 'Atribut označava ime; mora biti u skladu s korisničkim filterom.';
    +$lang['groupkey']              = 'Članstvo grupa iz svih atributa korisnika (umjesto standardnih AD grupa) npr. grupa iz odjela ili telefonskog broja';
    +$lang['modPass']               = 'Da li LDAP lozinka može biti izmijenjena kroz dokuwiki?';
    +$lang['debug']                 = 'Prikaži dodatne informacije u slučaju greške';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'koristi podrazumijevano';
    +$lang['referrals_o_0']         = 'ne slijedi preporuke';
    +$lang['referrals_o_1']         = 'slijedi preporuke';
    diff --git a/lib/plugins/authldap/lang/hu/lang.php b/lib/plugins/authldap/lang/hu/lang.php
    new file mode 100644
    index 0000000..0736dc4
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/hu/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'Az LDAP nem tudott csatlakozni: %s';
    +$lang['domainfail']            = 'Az LDAP nem találta a felhasználód megkülönböztető nevét (DN)';
    diff --git a/lib/plugins/authldap/lang/hu/settings.php b/lib/plugins/authldap/lang/hu/settings.php
    new file mode 100644
    index 0000000..7540125
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/hu/settings.php
    @@ -0,0 +1,33 @@
    +
    + * @author Marina Vladi 
    + */
    +$lang['server']                = 'LDAP-szerver. Kiszolgálónév (localhost) vagy teljes URL-cím (ldap://server.tld:389)';
    +$lang['port']                  = 'LDAP-kiszolgáló portja, ha URL-cím nem lett megadva';
    +$lang['usertree']              = 'Hol találom a felhasználókat? Pl. ou=People, dc=server, dc=tld';
    +$lang['grouptree']             = 'Hol találom a csoportokat? Pl. ou=Group, dc=server, dc=tld';
    +$lang['userfilter']            = 'LDAP szűrő a felhasználók kereséséhez, pl. (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'LDAP szűrő a csoportok kereséséhez, pl. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'A használt protokollverzió. Valószínűleg a 3 megfelelő';
    +$lang['starttls']              = 'TLS használata?';
    +$lang['referrals']             = 'Hivatkozások követése?';
    +$lang['deref']                 = 'Hogyan fejtsük vissza az aliasokat?';
    +$lang['binddn']                = 'Egy hozzáféréshez használt felhasználó DN-je, ha nincs névtelen hozzáférés. Pl. cn=admin, dc=my, dc=home';
    +$lang['bindpw']                = 'Ehhez tartozó jelszó.';
    +$lang['userscope']             = 'A keresési tartomány korlátozása erre a felhasználókra való keresésnél';
    +$lang['groupscope']            = 'A keresési tartomány korlátozása erre a csoportokra való keresésnél';
    +$lang['userkey']               = 'A felhasználónevet leíró attribútum; konzisztensnek kell lennie a felhasználói szűrővel (userfilter).';
    +$lang['groupkey']              = 'Csoport meghatározása a következő attribútumból (az alapértelmezett AD csoporttagság helyett), pl. a szervezeti egység vagy a telefonszám';
    +$lang['modPass']               = 'Az LDAP jelszó megváltoztatható a DokuWiki-n keresztül?';
    +$lang['debug']                 = 'Továbi hibakeresési információk megjelenítése hiba esetén';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'alapértelmezett érték használata';
    +$lang['referrals_o_0']         = 'ne kövesse az átirányításokat (referral)';
    +$lang['referrals_o_1']         = 'kövesse az átirányításokat (referral)';
    diff --git a/lib/plugins/authldap/lang/it/lang.php b/lib/plugins/authldap/lang/it/lang.php
    new file mode 100644
    index 0000000..28c4bc8
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/it/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'LDAP non è in grado di connettere: %s';
    +$lang['domainfail']            = 'LDAP non è in grado di trovare il tuo DN utente';
    diff --git a/lib/plugins/authldap/lang/it/settings.php b/lib/plugins/authldap/lang/it/settings.php
    new file mode 100644
    index 0000000..84d8705
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/it/settings.php
    @@ -0,0 +1,37 @@
    +
    + * @author Edmondo Di Tucci 
    + * @author Claudio Lanconelli 
    + * @author Francesco 
    + * @author Torpedo 
    + */
    +$lang['server']                = 'Il tuo server LDAP. Inserire o l\'hostname (localhost) oppure un URL completo (ldap://server.tld:389)';
    +$lang['port']                  = 'Porta del server LDAP se non è stato fornito un URL completo più sopra.';
    +$lang['usertree']              = 'Dove cercare l\'account utente. Eg. ou=People, dc=server, dc=tld';
    +$lang['grouptree']             = 'Dove cercare i gruppi utente. Eg. ou=Group, dc=server, dc=tld';
    +$lang['userfilter']            = 'Filtro per cercare l\'account utente LDAP. Eg. (&(uid=%{user})(objectClass=posixAccount))';
    +$lang['groupfilter']           = 'Filtro per cercare i gruppi LDAP. Eg. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))';
    +$lang['version']               = 'Versione protocollo da usare. Pu3';
    +$lang['starttls']              = 'Usare la connessione TSL?';
    +$lang['referrals']             = 'Possono i reindirizzamenti essere seguiti?';
    +$lang['deref']                 = 'Come differenziare un alias?';
    +$lang['binddn']                = 'DN di un utente bind opzionale se un bind anonimo non è sufficiente. E.g. cn=admin, dc=casa, dc=mia';
    +$lang['bindpw']                = 'Password del utente di cui sopra';
    +$lang['attributes']            = 'Attributi da mostrare con la ricerca LDAP.';
    +$lang['userscope']             = 'Limita il contesto di ricerca per la ricerca degli utenti';
    +$lang['groupscope']            = 'Limita il contesto di ricerca per la ricerca dei gruppi';
    +$lang['userkey']               = 'Attributo indicante il nome utente; deve essere consistente con il filtro utente.';
    +$lang['groupkey']              = 'Gruppo di appartenenza sulla base di qualunque attributo utente (invece di gruppo AD standard) e.g. gruppo in base al dipartimento o al numero di telefono';
    +$lang['modPass']               = 'Può la password LDAP essere cambiata attraverso DokuWiki?';
    +$lang['debug']                 = 'In caso di errori mostra ulteriori informazioni di debug';
    +$lang['deref_o_0']             = 'LDAP_DEREF_NEVER';
    +$lang['deref_o_1']             = 'LDAP_DEREF_SEARCHING';
    +$lang['deref_o_2']             = 'LDAP_DEREF_FINDING';
    +$lang['deref_o_3']             = 'LDAP_DEREF_ALWAYS';
    +$lang['referrals_o_-1']        = 'usa default';
    +$lang['referrals_o_0']         = 'non seguire i reindirizzamenti';
    +$lang['referrals_o_1']         = 'segui i reindirizzamenti';
    diff --git a/lib/plugins/authldap/lang/ja/lang.php b/lib/plugins/authldap/lang/ja/lang.php
    new file mode 100644
    index 0000000..c602b43
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/ja/lang.php
    @@ -0,0 +1,9 @@
    +
    + */
    +$lang['connectfail']           = 'LDAP に接続できません: %s';
    +$lang['domainfail']            = 'LDAP で user dn を発見できません。';
    diff --git a/lib/plugins/authldap/lang/ja/settings.php b/lib/plugins/authldap/lang/ja/settings.php
    new file mode 100644
    index 0000000..f9d16e7
    --- /dev/null
    +++ b/lib/plugins/authldap/lang/ja/settings.php
    @@ -0,0 +1,38 @@
    +
    + * @author lempel 
    + * @author Satoshi Sahara 
    + * @author Hideaki SAWADA 
    + * @author PzF_X 
    + * @author Ikuo Obataya 
    + */
    +$lang['server']                = 'LDAPサーバー
    ホスト名(localhost)又は完全修飾URL(ldap://server.tld:389)'; +$lang['port'] = '上記が完全修飾URLでない場合のLDAPサーバーポート'; +$lang['usertree'] = 'ユーザーアカウントを探す場所(例:ou=People, dc=server, dc=tld)'; +$lang['grouptree'] = 'ユーザーグループを探す場所(例:ou=Group, dc=server, dc=tld)'; +$lang['userfilter'] = 'ユーザーアカウントを探すためのLDAP抽出条件(例:(&(uid=%{user})(objectClass=posixAccount)))'; +$lang['groupfilter'] = 'グループを探すLDAP抽出条件(例:(&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user}))))'; +$lang['version'] = '使用するプロトコルのバージョン(場合によっては3を設定する必要があります。)'; +$lang['starttls'] = 'TLS接続を使用する'; +$lang['referrals'] = '紹介に従う'; +$lang['deref'] = 'どのように間接参照のエイリアスにするか'; +$lang['binddn'] = '匿名バインドでは不十分な場合の、オプションバインドユーザーのDN(例:cn=admin, dc=my, dc=home)'; +$lang['bindpw'] = '上記ユーザーのパスワード'; +$lang['attributes'] = 'LDAP検索で取得する属性。'; +$lang['userscope'] = 'ユーザー検索の範囲を限定させる'; +$lang['groupscope'] = 'グループ検索の範囲を限定させる'; +$lang['userkey'] = 'ユーザー名を示す属性(userfilter と一致している必要があります。)'; +$lang['groupkey'] = 'ユーザー属性をグループのメンバーシップから設定する(標準のADグループの代わり。例:部署や電話番号など)'; +$lang['modPass'] = 'DokuWiki から LDAP パスワードの変更が可能かどうか'; +$lang['debug'] = 'エラーに関して追加のデバッグ情報を表示する'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = 'デフォルトを使用する'; +$lang['referrals_o_0'] = 'referral に従わない'; +$lang['referrals_o_1'] = 'referral に従う'; diff --git a/lib/plugins/authldap/lang/ko/lang.php b/lib/plugins/authldap/lang/ko/lang.php new file mode 100644 index 0000000..1e1bef4 --- /dev/null +++ b/lib/plugins/authldap/lang/ko/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'LDAP가 연결할 수 없습니다: %s'; +$lang['domainfail'] = 'LDAP가 사용자 DN을 찾을 수 없습니다'; diff --git a/lib/plugins/authldap/lang/ko/settings.php b/lib/plugins/authldap/lang/ko/settings.php new file mode 100644 index 0000000..b988436 --- /dev/null +++ b/lib/plugins/authldap/lang/ko/settings.php @@ -0,0 +1,32 @@ + + */ +$lang['server'] = 'LDAP 서버. 호스트 이름(localhost)이나 전체 자격 URL(ldap://server.tld:389) 중 하나'; +$lang['port'] = '위에 주어진 전체 URL이 없을 때의 LDAP 서버 포트'; +$lang['usertree'] = '사용자 계정을 찾을 장소. 예를 들어 ou=People, dc=server, dc=tld'; +$lang['grouptree'] = '사용자 그룹을 찾을 장소. 예를 들어 ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = '사용자 계정을 찾을 LDAP 필터. 예를 들어 (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = '그룹을 찾을 LDAP 필터. 예를 들어 (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = '사용할 프로토콜 버전. 3으로 설정해야 할 수도 있습니다'; +$lang['starttls'] = 'TLS 연결을 사용하겠습니까?'; +$lang['referrals'] = '참조(referrals)를 허용하겠습니까? '; +$lang['deref'] = '어떻게 별명을 간접 참조하겠습니까?'; +$lang['binddn'] = '익명 바인드가 충분하지 않으면 선택적인 바인드 사용자의 DN. 예를 들어 cn=admin, dc=my, dc=home'; +$lang['bindpw'] = '위 사용자의 비밀번호'; +$lang['userscope'] = '사용자 검색에 대한 검색 범위 제한'; +$lang['groupscope'] = '그룹 검색에 대한 검색 범위 제한'; +$lang['userkey'] = '사용자 이름을 나타내는 특성; 사용자 필터에 일관성이 있어야 합니다.'; +$lang['groupkey'] = '(표준 AD 그룹 대신) 사용자 속성에서 그룹 구성원. 예를 들어 부서나 전화에서 그룹'; +$lang['modPass'] = 'LDAP 비밀번호를 도쿠위키를 통해 바꿀 수 있습니까?'; +$lang['debug'] = '오류에 대한 추가적인 디버그 정보를 보이기'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = '기본값 사용'; +$lang['referrals_o_0'] = '참조 (referral)를 따르지 않음'; +$lang['referrals_o_1'] = '참조 (referral)를 따름'; diff --git a/lib/plugins/authldap/lang/lv/settings.php b/lib/plugins/authldap/lang/lv/settings.php new file mode 100644 index 0000000..9ffb4e8 --- /dev/null +++ b/lib/plugins/authldap/lang/lv/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['starttls'] = 'Lietot TLS savienojumus?'; +$lang['bindpw'] = 'Lietotāja parole'; diff --git a/lib/plugins/authldap/lang/nl/lang.php b/lib/plugins/authldap/lang/nl/lang.php new file mode 100644 index 0000000..fab4870 --- /dev/null +++ b/lib/plugins/authldap/lang/nl/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'LDAP kan niet connecteren: %s'; +$lang['domainfail'] = 'LDAP kan je gebruikers dn niet vinden'; diff --git a/lib/plugins/authldap/lang/nl/settings.php b/lib/plugins/authldap/lang/nl/settings.php new file mode 100644 index 0000000..1a31202 --- /dev/null +++ b/lib/plugins/authldap/lang/nl/settings.php @@ -0,0 +1,36 @@ + + * @author Gerrit Uitslag + * @author Remon + * @author Johan Wijnker + */ +$lang['server'] = 'Je LDAP server. Of de servernaam (localhost) of de volledige URL (ldap://server.tld:389)'; +$lang['port'] = 'LDAP server poort als bij de entry hierboven geen volledige URL is opgegeven'; +$lang['usertree'] = 'Locatie van de gebruikersaccounts. Bijv. ou=Personen,dc=server,dc=tld'; +$lang['grouptree'] = 'Locatie van de gebruikersgroepen. Bijv. ou=Group,dc=server,dc=tld'; +$lang['userfilter'] = 'LDAP gebruikersfilter. Bijv. (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'LDAP groepsfilter. Bijv. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'Te gebruiken protocolversie. Mogelijk dat dit ingesteld moet worden op 3'; +$lang['starttls'] = 'Gebruik maken van TLS verbindingen?'; +$lang['referrals'] = 'Moeten verwijzingen worden gevolgd?'; +$lang['deref'] = 'Hoe moeten de verwijzing van aliases worden bepaald?'; +$lang['binddn'] = 'DN van een optionele bind gebruiker als anonieme bind niet genoeg is. Bijv. cn=beheer, dc=mijn, dc=thuis'; +$lang['bindpw'] = 'Wachtwoord van bovenstaande gebruiker'; +$lang['attributes'] = 'Welke onderdelen moeten in LDAP gezocht worden'; +$lang['userscope'] = 'Beperken scope van zoekfuncties voor gebruikers'; +$lang['groupscope'] = 'Beperken scope van zoekfuncties voor groepen'; +$lang['userkey'] = 'Attribuut aanduiding van de gebruikersnaam; moet consistent zijn met userfilter.'; +$lang['groupkey'] = 'Groepslidmaatschap van enig gebruikersattribuut (in plaats van standaard AD groepen), bijv. groep van afdeling of telefoonnummer'; +$lang['modPass'] = 'Kan het LDAP wachtwoord worden gewijzigd met DokuWiki?'; +$lang['debug'] = 'Tonen van aanvullende debuginformatie bij fouten'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = 'gebruik standaard'; +$lang['referrals_o_0'] = 'volg verwijzing niet'; +$lang['referrals_o_1'] = 'volg verwijzing'; diff --git a/lib/plugins/authldap/lang/no/lang.php b/lib/plugins/authldap/lang/no/lang.php new file mode 100644 index 0000000..72c0c6e --- /dev/null +++ b/lib/plugins/authldap/lang/no/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'LDAP klarte ikke koble til: %s'; +$lang['domainfail'] = 'LDAP greide ikke finne din bruker-dn (dist.name)'; diff --git a/lib/plugins/authldap/lang/no/settings.php b/lib/plugins/authldap/lang/no/settings.php new file mode 100644 index 0000000..3fd0969 --- /dev/null +++ b/lib/plugins/authldap/lang/no/settings.php @@ -0,0 +1,34 @@ + + * @author Patrick + * @author Arne Hanssen + */ +$lang['server'] = 'Din LDAP-server. Enten vertsnavnet (localhost) eller hele URL (ldap://server.tld:389)'; +$lang['port'] = 'LDAP serverport dersom ingen full URL var gitt over.'; +$lang['usertree'] = 'Hvor en kan finne brukerkontoer. F.eks. Eg. ou=People, dc=server, dc=tld'; +$lang['grouptree'] = 'Hvor en kan finne brukergrupper. F.eks. ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = 'LDAP-filter for å søke etter brukerkontoer. F.eks. (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'LDAP-filter for å søke etter grupper. F.eks.. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'Protokollversjonen som skal brukes. Mulig du må sette denne til 3'; +$lang['starttls'] = 'Bruke TLS-forbindelser?'; +$lang['referrals'] = 'Skal pekere som henviser til noe følges?'; +$lang['deref'] = 'Hvordan finne hva aliaser refererer til?'; +$lang['binddn'] = 'DN (Distinguished Name) til en valgfri bind-bruker, angis dersom annonym bind ikke er tilstrekkelig. f.eks.. cn=admin, dc=my, dc=home'; +$lang['bindpw'] = 'Passord til brukeren over'; +$lang['userscope'] = 'Begrens søk til brukere'; +$lang['groupscope'] = 'Begrens søk til grupper'; +$lang['userkey'] = 'Attributt som angir brukernavn; må være konsistent for brukerfiltrering.'; +$lang['groupkey'] = 'Gruppemedlemskap fra brukerattributt (i stedet for standard AD-grupper) f.eks gruppe fra avdeling, eller telefonnummer'; +$lang['modPass'] = 'Kan LDAP-passordet endres via DokuWiki?'; +$lang['debug'] = 'Ved feil, vis tilleggsinformasjon for feilsøking'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = 'bruk standard'; +$lang['referrals_o_0'] = 'ikke følg referanser'; +$lang['referrals_o_1'] = 'følg referanser'; diff --git a/lib/plugins/authldap/lang/pl/lang.php b/lib/plugins/authldap/lang/pl/lang.php new file mode 100644 index 0000000..a93252c --- /dev/null +++ b/lib/plugins/authldap/lang/pl/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'LDAP nie może się połączyć: %s'; +$lang['domainfail'] = 'LDAP nie może znaleźć DN użytkownika'; diff --git a/lib/plugins/authldap/lang/pl/settings.php b/lib/plugins/authldap/lang/pl/settings.php new file mode 100644 index 0000000..f3a6f2b --- /dev/null +++ b/lib/plugins/authldap/lang/pl/settings.php @@ -0,0 +1,36 @@ + + * @author Wojciech Lichota + * @author Paweł Jan Czochański + * @author Maciej Helt + */ +$lang['server'] = 'Twój serwer LDAP. Podaj nazwę hosta (localhost) albo pełen adres URL (ldap://server.tld:389).'; +$lang['port'] = 'Port serwera LDAP jeżeli nie podano pełnego adresu URL wyżej.'; +$lang['usertree'] = 'Gdzie szukać kont użytkownika? np. ou=People, dc=server, dc=tld'; +$lang['grouptree'] = 'Gdzie szukać grup użytkowników? np. ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = 'Filtr LDAP wykorzystany przy szukaniu kont użytkowników np. (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'Filtr LDAP wykorzystany przy szukaniu grup użytkowników np. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'Wykorzystywana wersja protokołu. Być może konieczne jest ustawienie tego na 3.'; +$lang['starttls'] = 'Użyć połączeń TLS?'; +$lang['referrals'] = 'Czy należy podążać za przekierowaniami?'; +$lang['deref'] = 'Jak rozwiązywać aliasy?'; +$lang['binddn'] = 'DN opcjonalnego użytkownika powiązanego, jeśli powiązanie anonimowe nie jest wystarczające, np. cn=admin, dc=my, dc=home'; +$lang['bindpw'] = 'Hasło powyższego użytkownika'; +$lang['attributes'] = 'Atrybuty do pobrania za pomocą wyszukiwania LDAP.'; +$lang['userscope'] = 'Ogranicz zakres wyszukiwania do wyszukiwania użytkowników'; +$lang['groupscope'] = 'Ogranicz zakres wyszukiwania do wyszukiwania grup użytkowników'; +$lang['userkey'] = 'Atrybut opisujący nazwę użytkownika; musi być zgodny z filtrem użytkownika.'; +$lang['groupkey'] = 'Przynależność do grupy z dowolnego atrybutu użytkownika (zamiast standardowych grup AD), np. grupa z działu lub numer telefonu'; +$lang['modPass'] = 'Czy hasło LDAP można zmienić za pomocą dokuwiki?'; +$lang['debug'] = 'Przy błędach wyświetl dodatkowe informacje debugujące.'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = 'użyj domyślnej wartości'; +$lang['referrals_o_0'] = 'nie podążaj za przekierowaniami'; +$lang['referrals_o_1'] = 'podążaj za przekierowaniami'; diff --git a/lib/plugins/authldap/lang/pt-br/lang.php b/lib/plugins/authldap/lang/pt-br/lang.php new file mode 100644 index 0000000..63e276a --- /dev/null +++ b/lib/plugins/authldap/lang/pt-br/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'Não foi possível conectar ao LDAP: %s'; +$lang['domainfail'] = 'Não foi possível encontrar o seu user dn no LDAP'; diff --git a/lib/plugins/authldap/lang/pt-br/settings.php b/lib/plugins/authldap/lang/pt-br/settings.php new file mode 100644 index 0000000..8b5cb37 --- /dev/null +++ b/lib/plugins/authldap/lang/pt-br/settings.php @@ -0,0 +1,36 @@ + + * @author Victor Westmann + * @author Frederico Guimarães + * @author Hudson FAS + */ +$lang['server'] = 'Seu servidor LDAP. Ou hostname (localhost) ou uma URL completa (ldap://server.tld:389)'; +$lang['port'] = 'Porta LDAP do servidor se nenhuma URL completa tiver sido fornecida acima'; +$lang['usertree'] = 'Onde encontrar as contas de usuários. Eg. ou=Pessoas, dc=servidor, dc=tld'; +$lang['grouptree'] = 'Onde encontrar os grupos de usuários. Eg. ou=Pessoas, dc=servidor, dc=tld'; +$lang['userfilter'] = 'Filtro LDAP para pesquisar por contas de usuários. Ex. (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'Filtro LDAP para pesquisar por grupos. Ex. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'A versão do protocolo para usar. Você talvez deva definir isto para 3'; +$lang['starttls'] = 'Usar conexões TLS?'; +$lang['referrals'] = 'Permitir que as referências sejam seguidas?'; +$lang['deref'] = 'Como dereferenciar os aliases?'; +$lang['binddn'] = 'DN de um vínculo opcional de usuário se vínculo anônimo não for suficiente. Eg. cn=admin, dc=my, dc=home'; +$lang['bindpw'] = 'Senha do usuário acima'; +$lang['attributes'] = 'Atributos a serem recuperados com a pesquisa LDAP.'; +$lang['userscope'] = 'Limitar escopo da busca para busca de usuário'; +$lang['groupscope'] = 'Limitar escopo da busca para busca de grupo'; +$lang['userkey'] = 'Atributo que indica o nome do usuário; deve ser consistente com userfilter.'; +$lang['groupkey'] = 'Membro de grupo vem de qualquer atributo do usuário (ao invés de grupos padrões AD) e.g. departamento de grupo ou número de telefone'; +$lang['modPass'] = 'A senha LDAP pode ser alterada pelo dokuwiki ?'; +$lang['debug'] = 'Mostrar informações adicionais de depuração em erros'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = 'use o padrão'; +$lang['referrals_o_0'] = 'não seguem referências'; +$lang['referrals_o_1'] = 'seguem referências'; diff --git a/lib/plugins/authldap/lang/pt/lang.php b/lib/plugins/authldap/lang/pt/lang.php new file mode 100644 index 0000000..7314d12 --- /dev/null +++ b/lib/plugins/authldap/lang/pt/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'Não foi possível conectar o LDAP: %s'; +$lang['domainfail'] = 'O LDAP não encontrou seu usuário'; diff --git a/lib/plugins/authldap/lang/pt/settings.php b/lib/plugins/authldap/lang/pt/settings.php new file mode 100644 index 0000000..d1c6724 --- /dev/null +++ b/lib/plugins/authldap/lang/pt/settings.php @@ -0,0 +1,39 @@ + + * @author Mario AlexandTeixeira dos Santos + * @author Maykon Oliveira + * @author André Neves + * @author Guido Salatino + * @author Romulo Pereira + * @author Paulo Carmino + */ +$lang['server'] = 'O seu servidor de LDAP. Ou hostname (localhost) ou URL qualificada completa (ldap://servidor.tld:389)'; +$lang['port'] = 'Porta de servidor de LDAP se a URL completa não foi fornecida acima'; +$lang['usertree'] = 'Onde encontrar as contas de usuário. Por exemplo ou=Pessoas, dc=servidor, dc=tld'; +$lang['grouptree'] = 'Onde encontrar os grupos de usuário. Por exemplo code>ou=Grupo, dc=servidor, dc=tld'; +$lang['userfilter'] = 'Filtro LDAP para procurar por contas de utilizador. Por exemplo (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'Filtro LDAP para procurar por grupos. Por exemplo (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'A versão do protocolo a utilizar. Pode precisar de alterar isto para 3'; +$lang['starttls'] = 'Usar conexões TLS?'; +$lang['referrals'] = 'Referrals devem ser seguidos?'; +$lang['deref'] = 'Como desreferenciar aliases?'; +$lang['binddn'] = 'DN de um usuário de ligação opcional, quando a ligação é anônima não é suficiente. Ex. cn = admin, dc = my, dc = home '; +$lang['bindpw'] = 'Senha do usuário acima'; +$lang['attributes'] = 'Atributos a serem recuperados com a pesquisa LDAP.'; +$lang['userscope'] = 'Escopo de pesquisa Limite para pesquisa de usuário'; +$lang['groupscope'] = 'Escopo de pesquisa limite para pesquisa de grupo'; +$lang['userkey'] = 'Atributo denotando o nome de usuário; deve ser consistente com o filtro do usuário.'; +$lang['groupkey'] = 'A participação no grupo a partir de qualquer atributo de usuário (em vez de AD padrão de grupos) ex: grupo de departamento ou número de telefone'; +$lang['modPass'] = 'Sua senha LDAP pode ser alterada via dokuwiki?'; +$lang['debug'] = 'Mostrar informação adicional de debug quando ocorrerem erros'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = 'usar padrão'; +$lang['referrals_o_0'] = 'não seguir as referências'; +$lang['referrals_o_1'] = 'seguir as referências'; diff --git a/lib/plugins/authldap/lang/ru/lang.php b/lib/plugins/authldap/lang/ru/lang.php new file mode 100644 index 0000000..1a90899 --- /dev/null +++ b/lib/plugins/authldap/lang/ru/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'Ошибка соединения LDAP с %s'; +$lang['domainfail'] = 'Не найдено имя пользователя LDAP (dn)'; diff --git a/lib/plugins/authldap/lang/ru/settings.php b/lib/plugins/authldap/lang/ru/settings.php new file mode 100644 index 0000000..7540d0d --- /dev/null +++ b/lib/plugins/authldap/lang/ru/settings.php @@ -0,0 +1,38 @@ + + * @author Ivan I. Udovichenko (sendtome@mymailbox.pp.ua) + * @author Erli Moen + * @author Владимир + * @author Vitaly Filatenko + * @author Alex P + */ +$lang['server'] = 'Ваш LDAP-сервер. Либо имя хоста (localhost), либо полный URL (ldap://server.tld:389)'; +$lang['port'] = 'Порт LDAP-сервера, если выше не был указан полный URL'; +$lang['usertree'] = 'Где искать аккаунты пользователей? Например: ou=People, dc=server, dc=tld'; +$lang['grouptree'] = 'Где искать группы пользователей? Например: ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = 'LDAP-фильтр для поиска аккаунтов пользователей. Например: (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'LDAP-фильтр для поиска групп. Например: (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'Версия протокола. Возможно, вам нужно указать 3'; +$lang['starttls'] = 'Использовать TLS-подключения?'; +$lang['referrals'] = 'Следовать за referrals?'; +$lang['deref'] = 'Как расшифровывать псевдонимы?'; +$lang['binddn'] = 'DN вторичного bind-пользователя, если anonymous bind недостаточно. Например: cn=admin, dc=my, dc=home'; +$lang['bindpw'] = 'Пароль для указанного пользователя'; +$lang['attributes'] = 'Атрибуты для извлечения с помощью поиска LDAP.'; +$lang['userscope'] = 'Ограничить область поиска при поиске пользователей'; +$lang['groupscope'] = 'Ограничить область поиска при поиске групп'; +$lang['userkey'] = 'Атрибут, означающий имя пользователя; должен быть таким же как в userfilter'; +$lang['groupkey'] = 'Использовать любой атрибут пользователя для включения в группу (вместо стандартного AD groups). Например, из атрибута department или telephone number'; +$lang['modPass'] = 'Может ли пароль LDAP быть изменён через «Докувики»?'; +$lang['debug'] = 'Показывать дополнительную отладочную информацию при ошибках'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = 'использовать по умолчанию'; +$lang['referrals_o_0'] = 'не следовать за referrals'; +$lang['referrals_o_1'] = 'следовать за referrals'; diff --git a/lib/plugins/authldap/lang/sk/lang.php b/lib/plugins/authldap/lang/sk/lang.php new file mode 100644 index 0000000..1cca469 --- /dev/null +++ b/lib/plugins/authldap/lang/sk/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'LDAP sa nemôže pripojiť: %s'; +$lang['domainfail'] = 'LDAP nemôže nájsť vaše meno (user dn)'; diff --git a/lib/plugins/authldap/lang/sk/settings.php b/lib/plugins/authldap/lang/sk/settings.php new file mode 100644 index 0000000..9d0456a --- /dev/null +++ b/lib/plugins/authldap/lang/sk/settings.php @@ -0,0 +1,33 @@ + + * @author Martin Michalek + */ +$lang['server'] = 'LDAP server. Adresa (localhost) alebo úplné URL (ldap://server.tld:389)'; +$lang['port'] = 'Port LDAP servera, ak nebolo vyššie zadané úplné URL'; +$lang['usertree'] = 'Umiestnenie účtov používateľov. Napr. ou=People, dc=server, dc=tld'; +$lang['grouptree'] = 'Umiestnenie skupín používateľov. Napr. ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = 'LDAP filter pre vyhľadávanie používateľských účtov. Napr. (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'LDAP filter pre vyhľadávanie skupín. Napr. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'Použitá verzia protokolu. Možno bude potrebné nastaviť na hodnotu 3'; +$lang['starttls'] = 'Použiť TLS pripojenie?'; +$lang['referrals'] = 'Majú byť nasledované odkazy na používateľov (referrals)?'; +$lang['deref'] = 'Ako previesť aliasy?'; +$lang['binddn'] = 'DN prípadného priradenia používateľa, ak anonymné priradenie nie je dostatočné. Napr. cn=admin, dc=my, dc=home'; +$lang['bindpw'] = 'Heslo vyššie uvedeného používateľa'; +$lang['userscope'] = 'Obmedzenie oblasti pri vyhľadávaní používateľa'; +$lang['groupscope'] = 'Obmedzenie oblasti pri vyhľadávaní skupiny'; +$lang['userkey'] = 'Atribút označujúci meno používateľa, musí byt konzistentný s používateľským filtrom.'; +$lang['groupkey'] = 'Príslušnost k skupine určená z daného atribútu používateľa (namiesto štandardnej AD skupiny) napr. skupiny podľa oddelenia alebo telefónneho čísla'; +$lang['modPass'] = 'Môže byť LDAP heslo zmenené prostredníctvom dokuwiki?'; +$lang['debug'] = 'Zobraziť dodatočné ladiace informácie pri chybe'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = 'použiť prednastavené'; +$lang['referrals_o_0'] = 'nesleduj odkazovače'; +$lang['referrals_o_1'] = 'sleduj odkazovače'; diff --git a/lib/plugins/authldap/lang/sl/settings.php b/lib/plugins/authldap/lang/sl/settings.php new file mode 100644 index 0000000..1711520 --- /dev/null +++ b/lib/plugins/authldap/lang/sl/settings.php @@ -0,0 +1,10 @@ + + * @author Jernej Vidmar + */ +$lang['starttls'] = 'Ali naj se uporabijo povezave TLS?'; +$lang['bindpw'] = 'Geslo uporabnika zgoraj'; diff --git a/lib/plugins/authldap/lang/sr/lang.php b/lib/plugins/authldap/lang/sr/lang.php new file mode 100644 index 0000000..9b78602 --- /dev/null +++ b/lib/plugins/authldap/lang/sr/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'LDAP - немогуће повезивање: %s'; +$lang['domainfail'] = 'LDAP - не могу наћи ваш кориснички dn'; diff --git a/lib/plugins/authldap/lang/sr/settings.php b/lib/plugins/authldap/lang/sr/settings.php new file mode 100644 index 0000000..6f99a53 --- /dev/null +++ b/lib/plugins/authldap/lang/sr/settings.php @@ -0,0 +1,26 @@ + + * @author Марко М. Костић + */ +$lang['server'] = 'Vaš LDAP server. Bilo po nazivu (localhost) ili po punoj URL putanju (ldap://server.tld:389)'; +$lang['port'] = 'Port LDAP servera ako nije zadat u više unetoj punoj URL putanji.'; +$lang['usertree'] = 'Mesto za potragu za korisničkim nalozima. Npr. ou=People, dc=server, dc=tld'; +$lang['grouptree'] = 'Mesto za potragu za korisničkim grupama. Npr. ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = 'LDAP filter za pretragu za korisničkim nalozima. Npr. (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'LDAP filter za pretragu za korisničkim grupama. Npr. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'Verzija protokola. Može biti neophodno da ovo postavite na vrednost 3'; +$lang['starttls'] = 'Користити TLS везе?'; +$lang['referrals'] = 'Да ли треба пратити реферале?'; +$lang['deref'] = 'Kako razrešiti pseudonime?'; +$lang['bindpw'] = 'Лозинка корисника изнад'; +$lang['userscope'] = 'Ограничи опсег претраживања за корисничке претраге'; +$lang['groupscope'] = 'Ограничи опсег претраживања за групне претраге'; +$lang['modPass'] = 'Омогућити измену LDAP лозинке преко докувикија?'; +$lang['debug'] = 'Прикажи додатне податке за поправљање грешака приликом настанка грешака'; +$lang['referrals_o_-1'] = 'користи подразумевано'; +$lang['referrals_o_0'] = 'не прати реферале'; +$lang['referrals_o_1'] = 'прати реферале'; diff --git a/lib/plugins/authldap/lang/sv/lang.php b/lib/plugins/authldap/lang/sv/lang.php new file mode 100644 index 0000000..cdc6c33 --- /dev/null +++ b/lib/plugins/authldap/lang/sv/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'LDAP kan inte ansluta: %s'; +$lang['domainfail'] = 'LDAP kan inte hitta din användar-dn'; diff --git a/lib/plugins/authldap/lang/sv/settings.php b/lib/plugins/authldap/lang/sv/settings.php new file mode 100644 index 0000000..ae16311 --- /dev/null +++ b/lib/plugins/authldap/lang/sv/settings.php @@ -0,0 +1,34 @@ + + * @author Patrik K Lundberg + * @author Tor Härnqvist + * @author Smorkster Andersson + */ +$lang['server'] = 'Din LDAP server. Antingen värdnamn (localhost) eller giltig full URL (ldap://server.tld:389)'; +$lang['port'] = 'LDAP server port, om det inte angavs full URL ovan'; +$lang['usertree'] = 'Specificera var användarkonton finns. T.ex. ou=Användare, dc=server, dc=tld'; +$lang['grouptree'] = 'Specificera var grupper finns. T.ex. ou=Grupp, dc=server, dc=tld'; +$lang['userfilter'] = 'LDAP filter för att söka efter användarkonton. T.ex. (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'LDAP filter för att söka efter grupper. T.ex. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'Version av protokoll att använda. Du kan behöva sätta detta till 3'; +$lang['starttls'] = 'Använd TLS-anslutningar'; +$lang['referrals'] = 'Senaste månaden'; +$lang['deref'] = 'Senaste året'; +$lang['binddn'] = 'Sortera efter träffar'; +$lang['bindpw'] = 'Lösenord för användare ovan'; +$lang['attributes'] = 'Sortera efter senast modifierad'; +$lang['userscope'] = 'Begränsa sökomfattning för användarsökning'; +$lang['groupscope'] = 'Begränsa sökomfattning för gruppsökning'; +$lang['userkey'] = 'Lista av alla tillåtna extensions'; +$lang['groupkey'] = 'Gruppmedlemskap från något användarattribut (istället för standard AD grupp) t.ex. grupp från avdelning eller telefonnummer'; +$lang['modPass'] = 'Får LDAP-lösenordet ändras via DokuWiki?'; +$lang['debug'] = 'Visa ytterligare felsökningsinformation vid fel'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = 'använd standard'; diff --git a/lib/plugins/authldap/lang/tr/lang.php b/lib/plugins/authldap/lang/tr/lang.php new file mode 100644 index 0000000..09e37e3 --- /dev/null +++ b/lib/plugins/authldap/lang/tr/lang.php @@ -0,0 +1,8 @@ + + */ +$lang['connectfail'] = 'LDAP bağlanamadı: %s'; diff --git a/lib/plugins/authldap/lang/tr/settings.php b/lib/plugins/authldap/lang/tr/settings.php new file mode 100644 index 0000000..3b526ee --- /dev/null +++ b/lib/plugins/authldap/lang/tr/settings.php @@ -0,0 +1,8 @@ + + */ +$lang['bindpw'] = 'Üstteki kullanıcının şifresi'; diff --git a/lib/plugins/authldap/lang/uk/lang.php b/lib/plugins/authldap/lang/uk/lang.php new file mode 100644 index 0000000..9043121 --- /dev/null +++ b/lib/plugins/authldap/lang/uk/lang.php @@ -0,0 +1,10 @@ + + * @author Nina Zolotova + */ +$lang['connectfail'] = 'LDAP не може встановити з\'єднання: %s'; +$lang['domainfail'] = 'LDAP не знайшов Ваш dn'; diff --git a/lib/plugins/authldap/lang/uk/settings.php b/lib/plugins/authldap/lang/uk/settings.php new file mode 100644 index 0000000..2ae728b --- /dev/null +++ b/lib/plugins/authldap/lang/uk/settings.php @@ -0,0 +1,23 @@ + + * @author Nina Zolotova + */ +$lang['userfilter'] = 'Фільтр LDAP для відображення облікових записів. Щось на зразок (&(uid=%{user})(objectClass=posixAccount))'; +$lang['version'] = 'Використовувати версію протоколу. Можливо Вам доведеться вказати 3.'; +$lang['starttls'] = 'Використовуєте TLS з\'єднання?'; +$lang['referrals'] = 'Слід підтримувати перепосилання?'; +$lang['deref'] = 'Як скинути псевдоніми?'; +$lang['bindpw'] = 'Пароль вказаного користувача'; +$lang['userscope'] = 'Обмежити область пошуку користувачів'; +$lang['groupscope'] = 'Обмежити коло пошуку для групового запиту'; +$lang['userkey'] = 'Атрибут, який визначає ім\'я користувача, має бути узгодженим із правилами користувацьких фільтрів.'; +$lang['modPass'] = 'Можете змінити пароль в LDAP через DokuWiki?'; +$lang['debug'] = 'Показати додаткову інформацію про помилки'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['referrals_o_-1'] = 'Використовувати за замовчуванням'; diff --git a/lib/plugins/authldap/lang/vi/lang.php b/lib/plugins/authldap/lang/vi/lang.php new file mode 100644 index 0000000..c1f3289 --- /dev/null +++ b/lib/plugins/authldap/lang/vi/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'LDAP không thể kết nối : %s'; +$lang['domainfail'] = 'LDAP không thể tìm thấy dn thành viên của bạn'; diff --git a/lib/plugins/authldap/lang/vi/settings.php b/lib/plugins/authldap/lang/vi/settings.php new file mode 100644 index 0000000..5d37070 --- /dev/null +++ b/lib/plugins/authldap/lang/vi/settings.php @@ -0,0 +1,33 @@ + + */ +$lang['server'] = 'Máy chủ LDAP của bạn. Tên máy chủ (localhost) hoặc URL đầy đủ (ldap://server.tld:389)'; +$lang['port'] = 'Cổng máy chủ LDAP nếu không có URL đầy đủ được đưa ra bên trên'; +$lang['usertree'] = 'Nơi tìm tài khoản thành viên. VD. ou=People, dc=server, dc=tld'; +$lang['grouptree'] = 'Nơi tìm nhóm thành viên. VD. ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = 'Bộ lọc LDAP để tìm kiếm tài khoản thành viên. VD. (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = 'Bộ lọc LDAP để tìm kiếm nhóm thành viên. VD. (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = 'Phiên bản giao thức sử dụng. Bạn có thể cần đặt cái này thành 3'; +$lang['starttls'] = 'Sử dụng kết nối TLS?'; +$lang['referrals'] = 'Theo dõi Shall referrals?'; +$lang['deref'] = 'Làm thế nào để xóa bỏ bí danh?'; +$lang['binddn'] = 'DN của một thành viên liên kết tùy chọn nếu liên kết ẩn danh là không đủ. VD. cn=admin, dc=my, dc=home'; +$lang['bindpw'] = 'Mật khẩu của thành viên trên'; +$lang['attributes'] = 'Các thuộc tính truy xuất với tìm kiếm LDAP.'; +$lang['userscope'] = 'Giới hạn phạm vi tìm kiếm cho tìm kiếm thành viên'; +$lang['groupscope'] = 'Giới hạn phạm vi tìm kiếm cho tìm kiếm nhóm'; +$lang['userkey'] = 'Thuộc tính biểu thị tên thành viên; phải phù hợp với bộ lọc thành viên.'; +$lang['groupkey'] = 'Thành viên nhóm từ bất kỳ thuộc tính thành viên nào (thay vì các nhóm AD tiêu chuẩn), VD. nhóm từ bộ phận hoặc số điện thoại'; +$lang['modPass'] = 'Có thể thay đổi mật khẩu LDAP qua dokuwiki không?'; +$lang['debug'] = 'Hiển thị thông tin gỡ lỗi bổ sung về lỗi'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = 'sử dụng mặc định'; +$lang['referrals_o_0'] = 'không theo dõi referrals'; +$lang['referrals_o_1'] = 'theo dõi referrals'; diff --git a/lib/plugins/authldap/lang/zh-tw/settings.php b/lib/plugins/authldap/lang/zh-tw/settings.php new file mode 100644 index 0000000..6853222 --- /dev/null +++ b/lib/plugins/authldap/lang/zh-tw/settings.php @@ -0,0 +1,26 @@ + + */ +$lang['server'] = '您的 LDAP 伺服器。填寫主機名稱 (localhost) 或完整的 URL (ldap://server.tld:389)'; +$lang['port'] = 'LDAP 伺服器端口 (若上方沒填寫完整的 URL)'; +$lang['usertree'] = '到哪裏尋找使用者帳號?如: ou=People, dc=server, dc=tld'; +$lang['grouptree'] = '到哪裏尋找使用者群組?如: ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = '用於搜索使用者賬號的 LDAP 篩選器。如: (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = '用於搜索群組的 LDAP 篩選器。例如 (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = '使用的通訊協定版本。您可能要設置為 3'; +$lang['starttls'] = '使用 TLS 連接嗎?'; +$lang['referrals'] = '是否允許引用 (referrals)?'; +$lang['binddn'] = '非必要綁定使用者 (optional bind user) 的 DN (匿名綁定不能滿足要求時使用)。如: cn=admin, dc=my, dc=home'; +$lang['bindpw'] = '上述使用者的密碼'; +$lang['userscope'] = '限制使用者搜索的範圍'; +$lang['groupscope'] = '限制群組搜索的範圍'; +$lang['groupkey'] = '以其他使用者屬性 (而非標準 AD 群組) 來把使用者分組,例如以部門或電話號碼分類'; +$lang['debug'] = '有錯誤時,顯示額外除錯資訊'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; diff --git a/lib/plugins/authldap/lang/zh/lang.php b/lib/plugins/authldap/lang/zh/lang.php new file mode 100644 index 0000000..c736056 --- /dev/null +++ b/lib/plugins/authldap/lang/zh/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'LDAP 无法连接: %s'; +$lang['domainfail'] = 'LDAP 无法找到你的用户 dn'; diff --git a/lib/plugins/authldap/lang/zh/settings.php b/lib/plugins/authldap/lang/zh/settings.php new file mode 100644 index 0000000..44d46c8 --- /dev/null +++ b/lib/plugins/authldap/lang/zh/settings.php @@ -0,0 +1,38 @@ + + * @author FENG.JIE + * @author lainme + * @author oott123 + * @author Errol + * @author phy25 + */ +$lang['server'] = '您的 LDAP 服务器。填写主机名 (localhost) 或者完整的 URL (ldap://server.tld:389)'; +$lang['port'] = 'LDAP 服务器端口 (如果上面没有给出完整的 URL)'; +$lang['usertree'] = '在何处查找用户账户。例如 ou=People, dc=server, dc=tld'; +$lang['grouptree'] = '在何处查找用户组。例如 ou=Group, dc=server, dc=tld'; +$lang['userfilter'] = '用于搜索用户账户的 LDAP 筛选器。例如 (&(uid=%{user})(objectClass=posixAccount))'; +$lang['groupfilter'] = '用于搜索组的 LDAP 筛选器。例如 (&(objectClass=posixGroup)(|(gidNumber=%{gid})(memberUID=%{user})))'; +$lang['version'] = '使用的协议版本。您或许需要设置为 3'; +$lang['starttls'] = '使用 TLS 连接?'; +$lang['referrals'] = '是否允许引用 (referrals)?'; +$lang['deref'] = '如何间接引用别名?'; +$lang['binddn'] = '一个可选的绑定用户的 DN (如果匿名绑定不满足要求)。例如 cn=admin, dc=my, dc=home'; +$lang['bindpw'] = '上述用户的密码'; +$lang['attributes'] = '使用LDAP搜索属性。'; +$lang['userscope'] = '限制用户搜索的范围'; +$lang['groupscope'] = '限制组搜索的范围'; +$lang['userkey'] = '表示用户名的属性;必须和用户过滤器保持一致。'; +$lang['groupkey'] = '根据任何用户属性得来的组成员(而不是标准的 AD 组),例如根据部门或者电话号码得到的组。'; +$lang['modPass'] = ' LDAP 密码可以通过 DokuWiki 修改吗?'; +$lang['debug'] = '有错误时显示额外的调试信息'; +$lang['deref_o_0'] = 'LDAP_DEREF_NEVER'; +$lang['deref_o_1'] = 'LDAP_DEREF_SEARCHING'; +$lang['deref_o_2'] = 'LDAP_DEREF_FINDING'; +$lang['deref_o_3'] = 'LDAP_DEREF_ALWAYS'; +$lang['referrals_o_-1'] = '默认'; +$lang['referrals_o_0'] = '不要跟随参照(referral)'; +$lang['referrals_o_1'] = '跟随参照(referral)'; diff --git a/lib/plugins/authldap/plugin.info.txt b/lib/plugins/authldap/plugin.info.txt new file mode 100644 index 0000000..e0c6144 --- /dev/null +++ b/lib/plugins/authldap/plugin.info.txt @@ -0,0 +1,7 @@ +base authldap +author Andreas Gohr +email andi@splitbrain.org +date 2015-07-13 +name LDAP Auth Plugin +desc Provides user authentication against an LDAP server +url http://www.dokuwiki.org/plugin:authldap diff --git a/lib/plugins/authpdo/auth.php b/lib/plugins/authpdo/auth.php new file mode 100644 index 0000000..7d39564 --- /dev/null +++ b/lib/plugins/authpdo/auth.php @@ -0,0 +1,787 @@ + + */ + +/** + * Class auth_plugin_authpdo + */ +class auth_plugin_authpdo extends AuthPlugin +{ + /** @var PDO */ + protected $pdo; + + /** @var null|array The list of all groups */ + protected $groupcache; + + /** + * Constructor. + */ + public function __construct() + { + parent::__construct(); // for compatibility + + if (!class_exists('PDO')) { + $this->debugMsg('PDO extension for PHP not found.', -1, __LINE__); + $this->success = false; + return; + } + + if (!$this->getConf('dsn')) { + $this->debugMsg('No DSN specified', -1, __LINE__); + $this->success = false; + return; + } + + try { + $this->pdo = new PDO( + $this->getConf('dsn'), + $this->getConf('user'), + conf_decodeString($this->getConf('pass')), + [ + PDO::ATTR_DEFAULT_FETCH_MODE => PDO::FETCH_ASSOC, // always fetch as array + PDO::ATTR_EMULATE_PREPARES => true, // emulating prepares allows us to reuse param names + PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION, // we want exceptions, not error codes + ] + ); + } catch (PDOException $e) { + $this->debugMsg($e); + msg($this->getLang('connectfail'), -1); + $this->success = false; + return; + } + + // can Users be created? + $this->cando['addUser'] = $this->checkConfig( + ['select-user', 'select-user-groups', 'select-groups', 'insert-user', 'insert-group', 'join-group'] + ); + + // can Users be deleted? + $this->cando['delUser'] = $this->checkConfig( + ['select-user', 'select-user-groups', 'select-groups', 'leave-group', 'delete-user'] + ); + + // can login names be changed? + $this->cando['modLogin'] = $this->checkConfig( + ['select-user', 'select-user-groups', 'update-user-login'] + ); + + // can passwords be changed? + $this->cando['modPass'] = $this->checkConfig( + ['select-user', 'select-user-groups', 'update-user-pass'] + ); + + // can real names be changed? + $this->cando['modName'] = $this->checkConfig( + ['select-user', 'select-user-groups', 'update-user-info:name'] + ); + + // can real email be changed? + $this->cando['modMail'] = $this->checkConfig( + ['select-user', 'select-user-groups', 'update-user-info:mail'] + ); + + // can groups be changed? + $this->cando['modGroups'] = $this->checkConfig( + ['select-user', 'select-user-groups', 'select-groups', 'leave-group', 'join-group', 'insert-group'] + ); + + // can a filtered list of users be retrieved? + $this->cando['getUsers'] = $this->checkConfig( + ['list-users'] + ); + + // can the number of users be retrieved? + $this->cando['getUserCount'] = $this->checkConfig( + ['count-users'] + ); + + // can a list of available groups be retrieved? + $this->cando['getGroups'] = $this->checkConfig( + ['select-groups'] + ); + + $this->success = true; + } + + /** + * Check user+password + * + * @param string $user the user name + * @param string $pass the clear text password + * @return bool + */ + public function checkPass($user, $pass) + { + + $userdata = $this->selectUser($user); + if ($userdata == false) return false; + + // password checking done in SQL? + if ($this->checkConfig(['check-pass'])) { + $userdata['clear'] = $pass; + $userdata['hash'] = auth_cryptPassword($pass); + $result = $this->query($this->getConf('check-pass'), $userdata); + if ($result === false) return false; + return (count($result) == 1); + } + + // we do password checking on our own + if (isset($userdata['hash'])) { + // hashed password + $passhash = new PassHash(); + return $passhash->verify_hash($pass, $userdata['hash']); + } else { + // clear text password in the database O_o + return ($pass === $userdata['clear']); + } + } + + /** + * Return user info + * + * Returns info about the given user needs to contain + * at least these fields: + * + * name string full name of the user + * mail string email addres of the user + * grps array list of groups the user is in + * + * @param string $user the user name + * @param bool $requireGroups whether or not the returned data must include groups + * @return array|bool containing user data or false + */ + public function getUserData($user, $requireGroups = true) + { + $data = $this->selectUser($user); + if ($data == false) return false; + + if (isset($data['hash'])) unset($data['hash']); + if (isset($data['clean'])) unset($data['clean']); + + if ($requireGroups) { + $data['grps'] = $this->selectUserGroups($data); + if ($data['grps'] === false) return false; + } + + return $data; + } + + /** + * Create a new User [implement only where required/possible] + * + * Returns false if the user already exists, null when an error + * occurred and true if everything went well. + * + * The new user HAS TO be added to the default group by this + * function! + * + * Set addUser capability when implemented + * + * @param string $user + * @param string $clear + * @param string $name + * @param string $mail + * @param null|array $grps + * @return bool|null + */ + public function createUser($user, $clear, $name, $mail, $grps = null) + { + global $conf; + + if (($info = $this->getUserData($user, false)) !== false) { + msg($this->getLang('userexists'), -1); + return false; // user already exists + } + + // prepare data + if ($grps == null) $grps = []; + array_unshift($grps, $conf['defaultgroup']); + $grps = array_unique($grps); + $hash = auth_cryptPassword($clear); + $userdata = ['user' => $user, 'clear' => $clear, 'hash' => $hash, 'name' => $name, 'mail' => $mail]; + + // action protected by transaction + $this->pdo->beginTransaction(); + { + // insert the user + $ok = $this->query($this->getConf('insert-user'), $userdata); + if ($ok === false) goto FAIL; + $userdata = $this->getUserData($user, false); + if ($userdata === false) goto FAIL; + + // create all groups that do not exist, the refetch the groups + $allgroups = $this->selectGroups(); + foreach ($grps as $group) { + if (!isset($allgroups[$group])) { + $ok = $this->addGroup($group); + if ($ok === false) goto FAIL; + } + } + $allgroups = $this->selectGroups(); + + // add user to the groups + foreach ($grps as $group) { + $ok = $this->joinGroup($userdata, $allgroups[$group]); + if ($ok === false) goto FAIL; + } + } + $this->pdo->commit(); + return true; + + // something went wrong, rollback + FAIL: + $this->pdo->rollBack(); + $this->debugMsg('Transaction rolled back', 0, __LINE__); + msg($this->getLang('writefail'), -1); + return null; // return error + } + + /** + * Modify user data + * + * @param string $user nick of the user to be changed + * @param array $changes array of field/value pairs to be changed (password will be clear text) + * @return bool + */ + public function modifyUser($user, $changes) + { + // secure everything in transaction + $this->pdo->beginTransaction(); + { + $olddata = $this->getUserData($user); + $oldgroups = $olddata['grps']; + unset($olddata['grps']); + + // changing the user name? + if (isset($changes['user'])) { + if ($this->getUserData($changes['user'], false)) goto FAIL; + $params = $olddata; + $params['newlogin'] = $changes['user']; + + $ok = $this->query($this->getConf('update-user-login'), $params); + if ($ok === false) goto FAIL; + } + + // changing the password? + if (isset($changes['pass'])) { + $params = $olddata; + $params['clear'] = $changes['pass']; + $params['hash'] = auth_cryptPassword($changes['pass']); + + $ok = $this->query($this->getConf('update-user-pass'), $params); + if ($ok === false) goto FAIL; + } + + // changing info? + if (isset($changes['mail']) || isset($changes['name'])) { + $params = $olddata; + if (isset($changes['mail'])) $params['mail'] = $changes['mail']; + if (isset($changes['name'])) $params['name'] = $changes['name']; + + $ok = $this->query($this->getConf('update-user-info'), $params); + if ($ok === false) goto FAIL; + } + + // changing groups? + if (isset($changes['grps'])) { + $allgroups = $this->selectGroups(); + + // remove membership for previous groups + foreach ($oldgroups as $group) { + if (!in_array($group, $changes['grps']) && isset($allgroups[$group])) { + $ok = $this->leaveGroup($olddata, $allgroups[$group]); + if ($ok === false) goto FAIL; + } + } + + // create all new groups that are missing + $added = 0; + foreach ($changes['grps'] as $group) { + if (!isset($allgroups[$group])) { + $ok = $this->addGroup($group); + if ($ok === false) goto FAIL; + $added++; + } + } + // reload group info + if ($added > 0) $allgroups = $this->selectGroups(); + + // add membership for new groups + foreach ($changes['grps'] as $group) { + if (!in_array($group, $oldgroups)) { + $ok = $this->joinGroup($olddata, $allgroups[$group]); + if ($ok === false) goto FAIL; + } + } + } + + } + $this->pdo->commit(); + return true; + + // something went wrong, rollback + FAIL: + $this->pdo->rollBack(); + $this->debugMsg('Transaction rolled back', 0, __LINE__); + msg($this->getLang('writefail'), -1); + return false; // return error + } + + /** + * Delete one or more users + * + * Set delUser capability when implemented + * + * @param array $users + * @return int number of users deleted + */ + public function deleteUsers($users) + { + $count = 0; + foreach ($users as $user) { + if ($this->deleteUser($user)) $count++; + } + return $count; + } + + /** + * Bulk retrieval of user data [implement only where required/possible] + * + * Set getUsers capability when implemented + * + * @param int $start index of first user to be returned + * @param int $limit max number of users to be returned + * @param array $filter array of field/pattern pairs, null for no filter + * @return array list of userinfo (refer getUserData for internal userinfo details) + */ + public function retrieveUsers($start = 0, $limit = -1, $filter = null) + { + if ($limit < 0) $limit = 10000; // we don't support no limit + if (is_null($filter)) $filter = []; + + if (isset($filter['grps'])) $filter['group'] = $filter['grps']; + foreach (['user', 'name', 'mail', 'group'] as $key) { + if (!isset($filter[$key])) { + $filter[$key] = '%'; + } else { + $filter[$key] = '%' . $filter[$key] . '%'; + } + } + $filter['start'] = (int)$start; + $filter['end'] = (int)$start + $limit; + $filter['limit'] = (int)$limit; + + $result = $this->query($this->getConf('list-users'), $filter); + if (!$result) return []; + $users = []; + if (is_array($result)) { + foreach ($result as $row) { + if (!isset($row['user'])) { + $this->debugMsg("list-users statement did not return 'user' attribute", -1, __LINE__); + return []; + } + $users[] = $this->getUserData($row['user']); + } + } else { + $this->debugMsg("list-users statement did not return a list of result", -1, __LINE__); + } + return $users; + } + + /** + * Return a count of the number of user which meet $filter criteria + * + * @param array $filter array of field/pattern pairs, empty array for no filter + * @return int + */ + public function getUserCount($filter = []) + { + if (is_null($filter)) $filter = []; + + if (isset($filter['grps'])) $filter['group'] = $filter['grps']; + foreach (['user', 'name', 'mail', 'group'] as $key) { + if (!isset($filter[$key])) { + $filter[$key] = '%'; + } else { + $filter[$key] = '%' . $filter[$key] . '%'; + } + } + + $result = $this->query($this->getConf('count-users'), $filter); + if (!$result || !isset($result[0]['count'])) { + $this->debugMsg("Statement did not return 'count' attribute", -1, __LINE__); + } + return (int)$result[0]['count']; + } + + /** + * Create a new group with the given name + * + * @param string $group + * @return bool + */ + public function addGroup($group) + { + $sql = $this->getConf('insert-group'); + + $result = $this->query($sql, [':group' => $group]); + $this->clearGroupCache(); + if ($result === false) return false; + return true; + } + + /** + * Retrieve groups + * + * Set getGroups capability when implemented + * + * @param int $start + * @param int $limit + * @return array + */ + public function retrieveGroups($start = 0, $limit = 0) + { + $groups = array_keys($this->selectGroups()); + if ($groups === false) return []; + + if (!$limit) { + return array_splice($groups, $start); + } else { + return array_splice($groups, $start, $limit); + } + } + + /** + * Select data of a specified user + * + * @param string $user the user name + * @return bool|array user data, false on error + */ + protected function selectUser($user) + { + $sql = $this->getConf('select-user'); + + $result = $this->query($sql, [':user' => $user]); + if (!$result) return false; + + if (count($result) > 1) { + $this->debugMsg('Found more than one matching user', -1, __LINE__); + return false; + } + + $data = array_shift($result); + $dataok = true; + + if (!isset($data['user'])) { + $this->debugMsg("Statement did not return 'user' attribute", -1, __LINE__); + $dataok = false; + } + if (!isset($data['hash']) && !isset($data['clear']) && !$this->checkConfig(['check-pass'])) { + $this->debugMsg("Statement did not return 'clear' or 'hash' attribute", -1, __LINE__); + $dataok = false; + } + if (!isset($data['name'])) { + $this->debugMsg("Statement did not return 'name' attribute", -1, __LINE__); + $dataok = false; + } + if (!isset($data['mail'])) { + $this->debugMsg("Statement did not return 'mail' attribute", -1, __LINE__); + $dataok = false; + } + + if (!$dataok) return false; + return $data; + } + + /** + * Delete a user after removing all their group memberships + * + * @param string $user + * @return bool true when the user was deleted + */ + protected function deleteUser($user) + { + $this->pdo->beginTransaction(); + { + $userdata = $this->getUserData($user); + if ($userdata === false) goto FAIL; + $allgroups = $this->selectGroups(); + + // remove group memberships (ignore errors) + foreach ($userdata['grps'] as $group) { + if (isset($allgroups[$group])) { + $this->leaveGroup($userdata, $allgroups[$group]); + } + } + + $ok = $this->query($this->getConf('delete-user'), $userdata); + if ($ok === false) goto FAIL; + } + $this->pdo->commit(); + return true; + + FAIL: + $this->pdo->rollBack(); + return false; + } + + /** + * Select all groups of a user + * + * @param array $userdata The userdata as returned by _selectUser() + * @return array|bool list of group names, false on error + */ + protected function selectUserGroups($userdata) + { + global $conf; + $sql = $this->getConf('select-user-groups'); + $result = $this->query($sql, $userdata); + if ($result === false) return false; + + $groups = [$conf['defaultgroup']]; // always add default config + if (is_array($result)) { + foreach ($result as $row) { + if (!isset($row['group'])) { + $this->debugMsg("No 'group' field returned in select-user-groups statement", -1, __LINE__); + return false; + } + $groups[] = $row['group']; + } + } else { + $this->debugMsg("select-user-groups statement did not return a list of result", -1, __LINE__); + } + + $groups = array_unique($groups); + Sort::sort($groups); + return $groups; + } + + /** + * Select all available groups + * + * @return array|bool list of all available groups and their properties + */ + protected function selectGroups() + { + if ($this->groupcache) return $this->groupcache; + + $sql = $this->getConf('select-groups'); + $result = $this->query($sql); + if ($result === false) return false; + + $groups = []; + if (is_array($result)) { + foreach ($result as $row) { + if (!isset($row['group'])) { + $this->debugMsg("No 'group' field returned from select-groups statement", -1, __LINE__); + return false; + } + + // relayout result with group name as key + $group = $row['group']; + $groups[$group] = $row; + } + } else { + $this->debugMsg("select-groups statement did not return a list of result", -1, __LINE__); + } + + Sort::ksort($groups); + return $groups; + } + + /** + * Remove all entries from the group cache + */ + protected function clearGroupCache() + { + $this->groupcache = null; + } + + /** + * Adds the user to the group + * + * @param array $userdata all the user data + * @param array $groupdata all the group data + * @return bool + */ + protected function joinGroup($userdata, $groupdata) + { + $data = array_merge($userdata, $groupdata); + $sql = $this->getConf('join-group'); + $result = $this->query($sql, $data); + if ($result === false) return false; + return true; + } + + /** + * Removes the user from the group + * + * @param array $userdata all the user data + * @param array $groupdata all the group data + * @return bool + */ + protected function leaveGroup($userdata, $groupdata) + { + $data = array_merge($userdata, $groupdata); + $sql = $this->getConf('leave-group'); + $result = $this->query($sql, $data); + if ($result === false) return false; + return true; + } + + /** + * Executes a query + * + * @param string $sql The SQL statement to execute + * @param array $arguments Named parameters to be used in the statement + * @return array|int|bool The result as associative array for SELECTs, affected rows for others, false on error + */ + protected function query($sql, $arguments = []) + { + $sql = trim($sql); + if (empty($sql)) { + $this->debugMsg('No SQL query given', -1, __LINE__); + return false; + } + + // execute + $params = []; + $sth = $this->pdo->prepare($sql); + $result = false; + try { + // prepare parameters - we only use those that exist in the SQL + foreach ($arguments as $key => $value) { + if (is_array($value)) continue; + if (is_object($value)) continue; + if ($key[0] != ':') $key = ":$key"; // prefix with colon if needed + if (strpos($sql, (string) $key) === false) continue; // skip if parameter is missing + + if (is_int($value)) { + $sth->bindValue($key, $value, PDO::PARAM_INT); + } else { + $sth->bindValue($key, $value); + } + $params[$key] = $value; //remember for debugging + } + + $sth->execute(); + // only report last line's result + $hasnextrowset = true; + $currentsql = $sql; + while ($hasnextrowset) { + if (str_starts_with(strtolower($currentsql), 'select')) { + $result = $sth->fetchAll(); + } else { + $result = $sth->rowCount(); + } + $semi_pos = strpos($currentsql, ';'); + if ($semi_pos) { + $currentsql = trim(substr($currentsql, $semi_pos + 1)); + } + try { + $hasnextrowset = $sth->nextRowset(); // run next rowset + } catch (PDOException $rowset_e) { + $hasnextrowset = false; // driver does not support multi-rowset, should be executed in one time + } + } + } catch (Exception $e) { + // report the caller's line + $trace = debug_backtrace(); + $line = $trace[0]['line']; + $dsql = $this->debugSQL($sql, $params, !defined('DOKU_UNITTEST')); + $this->debugMsg($e, -1, $line); + $this->debugMsg("SQL:
    $dsql
    ", -1, $line); + } + $sth->closeCursor(); + + return $result; + } + + /** + * Wrapper around msg() but outputs only when debug is enabled + * + * @param string|Exception $message + * @param int $err + * @param int $line + */ + protected function debugMsg($message, $err = 0, $line = 0) + { + if (!$this->getConf('debug')) return; + if (is_a($message, 'Exception')) { + $err = -1; + $msg = $message->getMessage(); + if (!$line) $line = $message->getLine(); + } else { + $msg = $message; + } + + if (defined('DOKU_UNITTEST')) { + printf("\n%s, %s:%d\n", $msg, __FILE__, $line); + } else { + msg('authpdo: ' . $msg, $err, $line, __FILE__); + } + } + + /** + * Check if the given config strings are set + * + * @param string[] $keys + * @return bool + * @author Matthias Grimm + * + */ + protected function checkConfig($keys) + { + foreach ($keys as $key) { + $params = explode(':', $key); + $key = array_shift($params); + $sql = trim($this->getConf($key)); + + // check if sql is set + if (!$sql) return false; + // check if needed params are there + foreach ($params as $param) { + if (strpos($sql, ":$param") === false) return false; + } + } + + return true; + } + + /** + * create an approximation of the SQL string with parameters replaced + * + * @param string $sql + * @param array $params + * @param bool $htmlescape Should the result be escaped for output in HTML? + * @return string + */ + protected function debugSQL($sql, $params, $htmlescape = true) + { + foreach ($params as $key => $val) { + if (is_int($val)) { + $val = $this->pdo->quote($val, PDO::PARAM_INT); + } elseif (is_bool($val)) { + $val = $this->pdo->quote($val, PDO::PARAM_BOOL); + } elseif (is_null($val)) { + $val = 'NULL'; + } else { + $val = $this->pdo->quote($val); + } + $sql = str_replace($key, $val, $sql); + } + if ($htmlescape) $sql = hsc($sql); + return $sql; + } +} + +// vim:ts=4:sw=4:et: diff --git a/lib/plugins/authpdo/conf/default.php b/lib/plugins/authpdo/conf/default.php new file mode 100644 index 0000000..de15979 --- /dev/null +++ b/lib/plugins/authpdo/conf/default.php @@ -0,0 +1,119 @@ + + */ + +$conf['debug'] = 0; +$conf['dsn'] = ''; +$conf['user'] = ''; +$conf['pass'] = ''; + +/** + * statement to select a single user identified by its login name + * + * input: :user + * return: user, name, mail, (clear|hash), [uid], [*] + */ +$conf['select-user'] = ''; + +/** + * statement to check the password in SQL, optional when above returned clear or hash + * + * input: :user, :clear, :hash, [uid], [*] + * return: * + */ +$conf['check-pass'] = ''; + +/** + * statement to select a single user identified by its login name + * + * input: :user, [uid] + * return: group + */ +$conf['select-user-groups'] = ''; + +/** + * Select all the existing group names + * + * return: group, [gid], [*] + */ +$conf['select-groups'] = ''; + +/** + * Create a new user + * + * input: :user, :name, :mail, (:clear|:hash) + */ +$conf['insert-user'] = ''; + +/** + * Remove a user + * + * input: :user, [:uid], [*] + */ +$conf['delete-user'] = ''; + +/** + * list user names matching the given criteria + * + * Make sure the list is distinct and sorted by user name. Apply the given limit and offset + * + * input: :user, :name, :mail, :group, :start, :end, :limit + * out: user + */ +$conf['list-users'] = ''; + +/** + * count user names matching the given criteria + * + * Make sure the counted list is distinct + * + * input: :user, :name, :mail, :group + * out: count + */ +$conf['count-users'] = ''; + +/** + * Update user data (except password and user name) + * + * input: :user, :name, :mail, [:uid], [*] + */ +$conf['update-user-info'] = ''; + +/** + * Update user name aka login + * + * input: :user, :newlogin, [:uid], [*] + */ +$conf['update-user-login'] = ''; + +/** + * Update user password + * + * input: :user, :clear, :hash, [:uid], [*] + */ +$conf['update-user-pass'] = ''; + +/** + * Create a new group + * + * input: :group + */ +$conf['insert-group'] = ''; + +/** + * Make user join group + * + * input: :user, [:uid], group, [:gid], [*] + */ +$conf['join-group'] = ''; + +/** + * Make user leave group + * + * input: :user, [:uid], group, [:gid], [*] + */ +$conf['leave-group'] = ''; diff --git a/lib/plugins/authpdo/conf/metadata.php b/lib/plugins/authpdo/conf/metadata.php new file mode 100644 index 0000000..bf427e5 --- /dev/null +++ b/lib/plugins/authpdo/conf/metadata.php @@ -0,0 +1,26 @@ + + */ + +$meta['debug'] = array('onoff', '_caution' => 'security'); +$meta['dsn'] = array('string', '_caution' => 'danger'); +$meta['user'] = array('string', '_caution' => 'danger'); +$meta['pass'] = array('password', '_caution' => 'danger', '_code' => 'base64'); +$meta['select-user'] = array('', '_caution' => 'danger'); +$meta['check-pass'] = array('', '_caution' => 'danger'); +$meta['select-user-groups'] = array('', '_caution' => 'danger'); +$meta['select-groups'] = array('', '_caution' => 'danger'); +$meta['insert-user'] = array('', '_caution' => 'danger'); +$meta['delete-user'] = array('', '_caution' => 'danger'); +$meta['list-users'] = array('', '_caution' => 'danger'); +$meta['count-users'] = array('', '_caution' => 'danger'); +$meta['update-user-info'] = array('', '_caution' => 'danger'); +$meta['update-user-login'] = array('', '_caution' => 'danger'); +$meta['update-user-pass'] = array('', '_caution' => 'danger'); +$meta['insert-group'] = array('', '_caution' => 'danger'); +$meta['join-group'] = array('', '_caution' => 'danger'); +$meta['leave-group'] = array('', '_caution' => 'danger'); diff --git a/lib/plugins/authpdo/lang/ar/lang.php b/lib/plugins/authpdo/lang/ar/lang.php new file mode 100644 index 0000000..9e19053 --- /dev/null +++ b/lib/plugins/authpdo/lang/ar/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'فشل الاتصال بقاعدة البيانات. '; +$lang['userexists'] = 'عذرا ، مستخدم لديه تسجيل الدخول هذا موجود بالفعل. '; +$lang['writefail'] = 'غير قادر على تعديل بيانات المستخدم. يرجى إبلاغ Wiki-Admin '; diff --git a/lib/plugins/authpdo/lang/ar/settings.php b/lib/plugins/authpdo/lang/ar/settings.php new file mode 100644 index 0000000..0915158 --- /dev/null +++ b/lib/plugins/authpdo/lang/ar/settings.php @@ -0,0 +1,13 @@ + + */ +$lang['debug'] = 'طباعة رسائل الخطأ التفصيلية. يجب تعطيله بعد الإعداد. '; +$lang['dsn'] = 'DSN للاتصال بقاعدة البيانات. '; +$lang['user'] = 'المستخدم لاتصال قاعدة البيانات أعلاه (فارغ ل sqlite) '; +$lang['pass'] = 'كلمة المرور لاتصال قاعدة البيانات أعلاه (فارغة ل sqlite) '; +$lang['select-user'] = 'عبارة SQL لتحديد بيانات مستخدم واحد '; +$lang['select-user-groups'] = 'عبارة SQL لتحديد كافة مجموعات مستخدم واحد '; diff --git a/lib/plugins/authpdo/lang/bg/lang.php b/lib/plugins/authpdo/lang/bg/lang.php new file mode 100644 index 0000000..220fbcd --- /dev/null +++ b/lib/plugins/authpdo/lang/bg/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['connectfail'] = 'Свързването с базата данни се провали.'; +$lang['userexists'] = 'За съжаление вече съществува потребител с това име.'; diff --git a/lib/plugins/authpdo/lang/ca/lang.php b/lib/plugins/authpdo/lang/ca/lang.php new file mode 100644 index 0000000..d8c6eda --- /dev/null +++ b/lib/plugins/authpdo/lang/ca/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Ha fallat la connexió a la base de dades.'; +$lang['userexists'] = 'Ja existeix un usuari amb aquest nom.'; +$lang['writefail'] = 'No es poden modificar les dades de l’usuari. Informeu d’això a l’administrador del wiki'; diff --git a/lib/plugins/authpdo/lang/ca/settings.php b/lib/plugins/authpdo/lang/ca/settings.php new file mode 100644 index 0000000..8de78d6 --- /dev/null +++ b/lib/plugins/authpdo/lang/ca/settings.php @@ -0,0 +1,10 @@ + + * @author Adolfo Jayme Barrientos + */ +$lang['debug'] = 'Mostra missatges d\'error detallats. S\'hauria de desactivar després de la configuració.'; +$lang['dsn'] = 'El DNS per a connectar a la base de dades.'; diff --git a/lib/plugins/authpdo/lang/ckb/lang.php b/lib/plugins/authpdo/lang/ckb/lang.php new file mode 100644 index 0000000..3196b72 --- /dev/null +++ b/lib/plugins/authpdo/lang/ckb/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'پەیوەندی کردن بە بنکەی زانیاری سەرکەوتوو نەبوو.'; +$lang['userexists'] = 'ببوورە، بەکارهێنەرێک بەم زانیارییە بوونی هەیە. '; +$lang['writefail'] = 'ناتوانێت دەستکاری داتای بەکارهێنەر بکات. تکایە ویکی-بەڕێوەبەرەکە بکەرەوە'; diff --git a/lib/plugins/authpdo/lang/ckb/settings.php b/lib/plugins/authpdo/lang/ckb/settings.php new file mode 100644 index 0000000..e61421c --- /dev/null +++ b/lib/plugins/authpdo/lang/ckb/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'چاپکردنی پەیامەکانی هەڵەی ورد. پێویستە لە کاربخرێت پاش ئامادەکردن.'; +$lang['dsn'] = 'DSN بۆ پەیوەندی کردن بە بنکەی زانیارێکان.'; +$lang['user'] = ' (sqliteبەکارهێنەربۆ گرێدانی بنکەی زانیاری سەرەوە (بەتاڵ بۆ '; +$lang['pass'] = ' (sqlite تێپەڕوشە بۆ گرێدانی بنکەی زانیاری سەرەوە (بەتاڵ بۆ'; +$lang['select-user'] = 'لێدوانی SQL بۆ دیاریکردنی داتای تاکە بەکارهێنەرێک'; +$lang['select-user-groups'] = 'لێدوانی SQL بۆ دیاریکردنی هەموو گرووپەکانی یەک بەکارهێنەر'; +$lang['select-groups'] = 'لێدوانی SQL بۆ دیاریکردنی هەموو گروپە بەردەستەکان'; +$lang['insert-user'] = 'SQL بەیاننامە بۆ دانانی بەکارهێنەرێکی نوێ بۆ ناو بنکەی زانیاری'; +$lang['delete-user'] = 'لێدوانی SQL بۆ لابردنی تاکە بەکارهێنەرێک لە بنکەی زانیارێکان'; +$lang['list-users'] = 'لێدوانی SQL بۆ لیستی بەکارهێنەران کە لەگەڵ فلتەرێکدا دەگونجێن'; +$lang['count-users'] = 'لێدوانی SQL بۆ ژماردنی بەکارهێنەران کە لەگەڵ فلتەرێکدا دەگونجێن'; +$lang['update-user-info'] = 'لێدوانی SQL بۆ نوێکردنەوەی ناوی تەواو و ناونیشانی ئیمەیلی تاکە بەکارهێنەرێک'; +$lang['update-user-login'] = 'لێدوانی SQL بۆ نوێکردنەوەی ناوی چوونەژوورەوەی تاکە بەکارهێنەرێک'; +$lang['update-user-pass'] = 'لێدوانی SQL بۆ نوێکردنەوەی نهێنوشەی تاکە بەکارهێنەرێک'; +$lang['insert-group'] = 'لێدوانی SQL بۆ دانانی گروپێکی نوێ بۆ ناو بنکەی زانیاری'; +$lang['join-group'] = 'لێدوانی SQL بۆ زیادکردنی بەکارهێنەرێک بۆ گروپی بەردەست'; +$lang['leave-group'] = 'لێدوانی SQL بۆ لابردنی بەکارهێنەرێک لە گروپێک'; +$lang['check-pass'] = 'SQL بەیاننامە بۆ پشکنینی نهێنوشە بۆ بەکارهێنەرێک. دەکرێت بە بەتاڵی بهێلدریت ئەگەر زانیاری نهێنوشە لە بەکارهێنەری دەسنیشانکراودا هێنرابێت.'; diff --git a/lib/plugins/authpdo/lang/cs/lang.php b/lib/plugins/authpdo/lang/cs/lang.php new file mode 100644 index 0000000..5cbc850 --- /dev/null +++ b/lib/plugins/authpdo/lang/cs/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Selhalo připojení k databázi.'; +$lang['userexists'] = 'Omlouváme se, ale uživatel s tímto jménem již existuje.'; +$lang['writefail'] = 'Nelze změnit údaje uživatele. Informujte prosím správce wiki'; diff --git a/lib/plugins/authpdo/lang/cs/settings.php b/lib/plugins/authpdo/lang/cs/settings.php new file mode 100644 index 0000000..08de953 --- /dev/null +++ b/lib/plugins/authpdo/lang/cs/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'Vytištění podrobných chybových zpráv. Po dokončení nastavení by mělo být deaktivováno.'; +$lang['dsn'] = 'DSN pro připojení k databázi.'; +$lang['user'] = 'Uživatel pro výše uvedené připojení k databázi (prázdný pro sqlite)'; +$lang['pass'] = 'Heslo pro výše uvedené připojení k databázi (prázdné pro sqlite)'; +$lang['select-user'] = 'Příkaz SQL pro výběr dat jednoho uživatele'; +$lang['select-user-groups'] = 'Příkaz SQL pro výběr všech skupin jednoho uživatele'; +$lang['select-groups'] = 'Příkaz SQL pro výběr všech dostupných skupin'; +$lang['insert-user'] = 'Příkaz SQL pro vložení nového uživatele do databáze'; +$lang['delete-user'] = 'Příkaz SQL pro odebrání jednoho uživatele z databáze'; +$lang['list-users'] = 'Příkaz SQL pro výpis seznamu uživatelů odpovídajících filtru'; +$lang['count-users'] = 'Příkaz SQL pro spočítání uživatelů odpovídajících filtru'; +$lang['update-user-info'] = 'Příkaz SQL pro aktualizaci celého jména a e-mailové adresy jednoho uživatele'; +$lang['update-user-login'] = 'Příkaz SQL pro aktualizaci přihlašovacího jména jednoho uživatele'; +$lang['update-user-pass'] = 'Příkaz SQL pro aktualizaci hesla jednoho uživatele'; +$lang['insert-group'] = 'Příkaz SQL pro vložení nové skupiny do databáze'; +$lang['join-group'] = 'Příkaz SQL pro přidání uživatele do existující skupiny'; +$lang['leave-group'] = 'Příkaz SQL pro odebrání uživatele ze skupiny'; +$lang['check-pass'] = 'Příkaz SQL ke kontrole hesla uživatele. Může zůstat prázdný, pokud jsou informace o heslech vyvolány ve vybraném uživateli.'; diff --git a/lib/plugins/authpdo/lang/cy/lang.php b/lib/plugins/authpdo/lang/cy/lang.php new file mode 100644 index 0000000..449e3ef --- /dev/null +++ b/lib/plugins/authpdo/lang/cy/lang.php @@ -0,0 +1,12 @@ + + */ +$lang['connectfail'] = 'Kunne ikke forbinde til database.'; +$lang['userexists'] = 'Beklager, en bruger med dette loginnavn findes allerede.'; +$lang['writefail'] = 'Kunne ikke ændre brugerdata. Informer venligst wikiens administrator.'; diff --git a/lib/plugins/authpdo/lang/da/settings.php b/lib/plugins/authpdo/lang/da/settings.php new file mode 100644 index 0000000..80b6e2e --- /dev/null +++ b/lib/plugins/authpdo/lang/da/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'Vis detaljerede fejlmeddelelser. Bør deaktiveres efter opsætning.'; +$lang['dsn'] = 'DSN der benyttes til at forbinde til databasen.'; +$lang['user'] = 'Brugerkonto til ovenstående databaseforbindelse (blank ved sqlite)'; +$lang['pass'] = 'Adgangskode til ovenstående databaseforbindelse (blank ved sqlite)'; +$lang['select-user'] = 'SQL statement til at selektere data for en enkelt bruger'; +$lang['select-user-groups'] = 'SQL statement til at selektere alle grupper en enkelt bruger er medlem af'; +$lang['select-groups'] = 'SQL statement til at selektere alle tilgængelige grupper'; +$lang['insert-user'] = 'SQL statement til at indsætte en ny bruger i databasen'; +$lang['delete-user'] = 'SQL statement til at fjerne en bruger fra databasen'; +$lang['list-users'] = 'SQL statement til at selektere brugere ud fra et filter'; +$lang['count-users'] = 'SQL statement til at tælle brugere der matcher et filter'; +$lang['update-user-info'] = 'SQL statement til at opdatere fulde navn og e-mail adresse på en enkelt bruger'; +$lang['update-user-login'] = 'SQL statement til at opdatere loginnavn på en enkelt bruger'; +$lang['update-user-pass'] = 'SQL statement til at opdatere adgangskode på en enkelt bruger'; +$lang['insert-group'] = 'SQL statement til at indsætte en ny gruppe i databasen'; +$lang['join-group'] = 'SQL statement til at tilføje en bruger til en eksisterende gruppe'; +$lang['leave-group'] = 'SQL statement til at fjerne en bruger fra en gruppe'; +$lang['check-pass'] = 'SQL statement til at kontrollere adgangskode for en bruger. Kan efterlades blank hvis adgangskode information hentes når brugeren selekteres.'; diff --git a/lib/plugins/authpdo/lang/de-informal/lang.php b/lib/plugins/authpdo/lang/de-informal/lang.php new file mode 100644 index 0000000..a3d9747 --- /dev/null +++ b/lib/plugins/authpdo/lang/de-informal/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Verbindung zur Datenbank fehlgeschlagen.'; +$lang['userexists'] = 'Der Benutzername existiert leider schon.'; +$lang['writefail'] = 'Die Benutzerdaten konnten nicht geändert werden. Bitte wenden Sie sich an den Wiki-Admin.'; diff --git a/lib/plugins/authpdo/lang/de-informal/settings.php b/lib/plugins/authpdo/lang/de-informal/settings.php new file mode 100644 index 0000000..c013988 --- /dev/null +++ b/lib/plugins/authpdo/lang/de-informal/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'Zeige detaillierte Fehlermeldungen. Diese sollten nach dem Setup deaktiviert werden.'; +$lang['dsn'] = 'Der DSN(Data Source Name) zur Verbindung mit der Datenbank'; +$lang['user'] = 'Der Benutzer für die obige Datenbankverbindung (leer lassen für SQLite)'; +$lang['pass'] = 'Das Passwort für die obige Datenbankverbindung (leer lassen für SQLite)'; +$lang['select-user'] = 'SQL Anweisung um einen einzelnen Benutzer abzufragen'; +$lang['select-user-groups'] = 'SQL Anweisung um alle Gruppen eines Benutzers abzufragen'; +$lang['select-groups'] = 'SQL Anweisung um alle verfügbaren Gruppen auszuwählen'; +$lang['insert-user'] = 'SQL Anweisung um einen neuen Benutzer in der Datenbank abzulegen'; +$lang['delete-user'] = 'SQL Anweisung um einen Benutzer aus der Datenbank zu entfernen'; +$lang['list-users'] = 'SQL Anweisung um eine Liste gefilterter Benutzer anzuzeigen'; +$lang['count-users'] = 'SQL Anweisung, welche die Anzahl der gefilterten Benutzer wiedergibt'; +$lang['update-user-info'] = 'SQL Anweisung um den vollen Namen sowie dessen E-Mail Adresse zu aktualisieren'; +$lang['update-user-login'] = 'SQL Anweisung um den Login-Namen eines Benutzers zu aktualisieren'; +$lang['update-user-pass'] = 'SQL Anweisung um das Passwort eines Benutzers zu aktualisieren'; +$lang['insert-group'] = 'SQL Anweisung um eine neue Gruppe in der Datenbank anzulegen'; +$lang['join-group'] = 'SQL Anweisung um einen Benutzer zu einer existierenden Gruppe hinzuzufügen'; +$lang['leave-group'] = 'SQL Anweisung um einen Benutzer aus einer Gruppe zu entfernen'; +$lang['check-pass'] = 'SQL Anweisung um das Passwort eines Benutzers zu überprüfen. Es kann leer gelassen werden wenn die Information über die Benutzerabfrage erhoben wurde.'; diff --git a/lib/plugins/authpdo/lang/de/lang.php b/lib/plugins/authpdo/lang/de/lang.php new file mode 100644 index 0000000..3fe2a44 --- /dev/null +++ b/lib/plugins/authpdo/lang/de/lang.php @@ -0,0 +1,12 @@ + + * @author Hendrik Diel + * @author Philip Knack + */ +$lang['connectfail'] = 'Verbindung zur Datenbank fehlgeschlagen.'; +$lang['userexists'] = 'Entschuldigung, aber dieser Benutzername ist bereits vergeben.'; +$lang['writefail'] = 'Die Benutzerdaten konnten nicht geändert werden. Bitte wenden Sie sich an den Wiki-Admin.'; diff --git a/lib/plugins/authpdo/lang/de/settings.php b/lib/plugins/authpdo/lang/de/settings.php new file mode 100644 index 0000000..d661d5c --- /dev/null +++ b/lib/plugins/authpdo/lang/de/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'Zeige detaillierte Fehlermeldungen. Diese sollten nach dem Setup deaktiviert werden.'; +$lang['dsn'] = 'Der DSN(Data Source Name) zur Verbindung mit der Datenbank'; +$lang['user'] = 'Der Benutzer für die obige Datenbankverbindung (leer lassen für SQLite)'; +$lang['pass'] = 'Das Passwort für die obige Datenbankverbindung (leer lassen für SQLite)'; +$lang['select-user'] = 'SQL Anweisung um einen Benutzer abzufragen'; +$lang['select-user-groups'] = 'SQL Anweisung um alle Gruppen eines Benutzers abzufragen'; +$lang['select-groups'] = 'SQL Anweisung um alle verfügbaren Gruppen auszuwählen'; +$lang['insert-user'] = 'SQL Anweisung um einen neuen Benutzer in der Datenbank abzulegen'; +$lang['delete-user'] = 'SQL Anweisung um einen Benutzer aus der Datenbank zu entfernen'; +$lang['list-users'] = 'SQL Anweisung um eine Liste gefilterter Benutzer anzuzeigen'; +$lang['count-users'] = 'SQL Anweisung, welche die Anzahl der gefilterten Benutzer wiedergibt'; +$lang['update-user-info'] = 'SQL Anweisung um den vollen Namen sowie dessen E-Mail Adresse zu aktualisieren'; +$lang['update-user-login'] = 'SQL Anweisung um den Login-Namen eines Benutzers zu aktualisieren'; +$lang['update-user-pass'] = 'SQL Anweisung um das Passwort eines Benutzers zu aktualisieren'; +$lang['insert-group'] = 'SQL Anweisung um eine neue Gruppe in der Datenbank anzulegen'; +$lang['join-group'] = 'SQL Anweisung um einen Benutzer zu einer existierenden Gruppe hinzuzufügen'; +$lang['leave-group'] = 'SQL Anweisung um einen Benutzer aus einer Gruppe zu entfernen'; +$lang['check-pass'] = 'SQL Anweisung um das Passwort eines Benutzers zu überprüfen. Es kann leer gelassen werden wenn die Information über die Benutzerabfrage erhoben wurde.'; diff --git a/lib/plugins/authpdo/lang/el/lang.php b/lib/plugins/authpdo/lang/el/lang.php new file mode 100644 index 0000000..fe944cf --- /dev/null +++ b/lib/plugins/authpdo/lang/el/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Δεν μπόρεσε να κάνει σύνδεση με την βάση δεδομένων'; +$lang['userexists'] = 'Συγγνώμη υπάρχει ήδη χρήστης με αυτά τα στοιχεία'; +$lang['writefail'] = 'Δεν μπορέσαμε τα τροποποιήσουμε τα στοιχεία χρήστη. Παρακαλώ ενημερώστε το Wiki-Admin'; diff --git a/lib/plugins/authpdo/lang/el/settings.php b/lib/plugins/authpdo/lang/el/settings.php new file mode 100644 index 0000000..531fefe --- /dev/null +++ b/lib/plugins/authpdo/lang/el/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'Εκτύπωση μηνυμάτων σφαλμάτων λεπτομερώς. Αυτή η ρύθμιση πρέπει μετά να απενεργοποιηθεί.'; +$lang['dsn'] = 'Να συνδεθεί το DSN με τη βάση δεδομένων'; +$lang['user'] = 'Ο συνδεδεμένος χρήστης με την άνω βάση δεδομένων'; +$lang['pass'] = 'Ο κωδικός πρόσβασης της άνω βάσης δεδομένων'; +$lang['select-user'] = 'SQL Αντίγραφο επιλογής δεδομένων ενός απλού χρήστη'; +$lang['select-user-groups'] = 'SQL Αντίγραφο to select all groups of a single user '; +$lang['select-groups'] = 'SQL Αντίγραφο για επιλογή όλων των διαθέσιμων ομάδων '; +$lang['insert-user'] = 'Δηλωτικό SQL για να εισάγει έναν νέο χρήστη στη βάση δεδομένων'; +$lang['delete-user'] = 'Δηλωτικό SQL για αφαίρεση χρήστη από την βάση δεδομένων'; +$lang['list-users'] = 'Δηλωτικό SQL για να ταξινομήσει τους χρήστες με προσαρμογή φίλτρου'; +$lang['count-users'] = 'Δηλωτικό SQL για να μετρήσει τον αριθμό των χρηστών με τη χρήση ενός φίλτρου'; +$lang['update-user-info'] = 'Δηλωτικό SQL για ενημέρωση του ονόματος και της διεύθυνσης email ενός χρήστη'; +$lang['update-user-login'] = 'Δηλωτικό SQL για ενημέρωση του ονόματος σύνδεσης ενός απλού χρήστη '; +$lang['update-user-pass'] = 'Δηλωτικό SQL για ενημέρωση του κωδικού πρόσβασης ενός χρήστη'; +$lang['insert-group'] = 'Δηλωτικό SQL για να εισάγει νέα ομάδα στην βάση δεδομένων'; +$lang['join-group'] = 'Δηλωτικό SQL για πρόσθεση χρήστη σε μια υπάρχουσα ομάδα'; +$lang['leave-group'] = 'Δηλωτικό SQL για αφαίρεση χρήστη από μια ομάδα'; +$lang['check-pass'] = 'Δηλωτικό SQL για να ελέγξει τον κωδικό πρόσβασης για έναν χρήστη. Μπορεί να μείνει κενό αν εισαχθεί κωδικός χρήστη στην ομάδα επιλογής χρήστη.'; diff --git a/lib/plugins/authpdo/lang/en/lang.php b/lib/plugins/authpdo/lang/en/lang.php new file mode 100644 index 0000000..3e1482e --- /dev/null +++ b/lib/plugins/authpdo/lang/en/lang.php @@ -0,0 +1,12 @@ + + */ + +$lang['debug'] = 'Print out detailed error messages. Should be disabled after setup.'; +$lang['dsn'] = 'The DSN to connect to the database.'; +$lang['user'] = 'The user for the above database connection (empty for sqlite)'; +$lang['pass'] = 'The password for the above database connection (empty for sqlite)'; +$lang['select-user'] = 'SQL Statement to select the data of a single user'; +$lang['select-user-groups'] = 'SQL Statement to select all groups of a single user'; +$lang['select-groups'] = 'SQL Statement to select all available groups'; +$lang['insert-user'] = 'SQL Statement to insert a new user into the database'; +$lang['delete-user'] = 'SQL Statement to remove a single user from the database'; +$lang['list-users'] = 'SQL Statement to list users matching a filter'; +$lang['count-users'] = 'SQL Statement to count users matching a filter'; +$lang['update-user-info'] = 'SQL Statement to update the full name and email address of a single user'; +$lang['update-user-login'] = 'SQL Statement to update the login name of a single user'; +$lang['update-user-pass'] = 'SQL Statement to update the password of a single user'; +$lang['insert-group'] = 'SQL Statement to insert a new group into the database'; +$lang['join-group'] = 'SQL Statement to add a user to an existing group'; +$lang['leave-group'] = 'SQL Statement to remove a user from a group'; +$lang['check-pass'] = 'SQL Statement to check the password for a user. Can be left empty if password info is fetched in select-user.'; diff --git a/lib/plugins/authpdo/lang/eo/lang.php b/lib/plugins/authpdo/lang/eo/lang.php new file mode 100644 index 0000000..0c3b2b6 --- /dev/null +++ b/lib/plugins/authpdo/lang/eo/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Malsukcesis konekti al datumbazo.'; +$lang['userexists'] = 'Pardonu, uzanto kun ĉi tiu salutnomo jam ekzistas.'; +$lang['writefail'] = 'Ne eblas modifi uzantajn datumojn. Bonvolu informi la Vikiadministranton'; diff --git a/lib/plugins/authpdo/lang/eo/settings.php b/lib/plugins/authpdo/lang/eo/settings.php new file mode 100644 index 0000000..7e46cb0 --- /dev/null +++ b/lib/plugins/authpdo/lang/eo/settings.php @@ -0,0 +1,12 @@ + + */ +$lang['debug'] = 'Presu detalajn erarmesaĝojn. Devus esti malŝaltita post agordo.'; +$lang['dsn'] = 'La DSN por konekti al la datumbazo.'; +$lang['user'] = 'La uzanto por ĉi-supra datumbaza konekto (malplena por sqlite)'; +$lang['pass'] = 'La pasvorto por la supra datumbaza konekto (malplena por sqlite)'; +$lang['select-user'] = 'SQL Statement por elekti la datumojn de ununura uzanto'; diff --git a/lib/plugins/authpdo/lang/es/lang.php b/lib/plugins/authpdo/lang/es/lang.php new file mode 100644 index 0000000..c382ebf --- /dev/null +++ b/lib/plugins/authpdo/lang/es/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Error al conectar con la base de datos.'; +$lang['userexists'] = 'Lo sentimos, ya existe un usuario con ese inicio de sesión.'; +$lang['writefail'] = 'No es posible modificar los datos del usuario. Por favor, informa al Administrador del Wiki'; diff --git a/lib/plugins/authpdo/lang/es/settings.php b/lib/plugins/authpdo/lang/es/settings.php new file mode 100644 index 0000000..f866fe1 --- /dev/null +++ b/lib/plugins/authpdo/lang/es/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'Imprime mensajes de error detallados. Debería ser deshabilitado después de la instalación.'; +$lang['dsn'] = 'El DSN para conectarse a la base de datos.'; +$lang['user'] = 'El usuario de la conexión de base de datos anterior (vacía para sqlite)'; +$lang['pass'] = 'La contraseña para la conexión de base de datos anterior (vacía para sqlite)'; +$lang['select-user'] = 'Declaración SQL para seleccionar los datos de un solo usuario'; +$lang['select-user-groups'] = 'Declaración SQL para seleccionar todos los grupos de un solo usuario'; +$lang['select-groups'] = 'Declaración SQL para seleccionar todos los grupos disponibles'; +$lang['insert-user'] = 'Declaración SQL para insertar un nuevo usuario en la base de datos'; +$lang['delete-user'] = 'Declaración SQL para eliminar un único usuario de la base de datos'; +$lang['list-users'] = 'Declaración SQL para mostrar los usuarios que coinciden con un filtro'; +$lang['count-users'] = 'Declaración SQL para contar usuarios que coinciden con un filtro'; +$lang['update-user-info'] = 'Declaración SQL para actualizar el nombre completo y la dirección de correo electrónico de un único usuario'; +$lang['update-user-login'] = 'Declaración SQL para actualizar el nombre de usuario de un solo usuario'; +$lang['update-user-pass'] = 'Declaración SQL para actualizar la contraseña de un solo usuario'; +$lang['insert-group'] = 'Declaración SQL para insertar un nuevo grupo en la base de datos'; +$lang['join-group'] = 'Declaración SQL para agregar un usuario a un grupo existente '; +$lang['leave-group'] = 'Declaración SQL para eliminar un usuario de un grupo'; +$lang['check-pass'] = 'Declaración SQL para verificar la contraseña de un usuario. Puede dejarse vacío si se busca información de contraseña en el usuario de selección.'; diff --git a/lib/plugins/authpdo/lang/fa/lang.php b/lib/plugins/authpdo/lang/fa/lang.php new file mode 100644 index 0000000..7f06df8 --- /dev/null +++ b/lib/plugins/authpdo/lang/fa/lang.php @@ -0,0 +1,11 @@ + + * @author Masoud Sadrnezhaad + */ +$lang['connectfail'] = 'خطا در اتصال به دیتابیس'; +$lang['userexists'] = 'با عرض پوزش، یک کاربر با این نام از قبل وجود دارد.'; +$lang['writefail'] = 'امکان تغییر داده کاربر وجود نداشت. لطفا مسئول Wiki را آگاه کنید.'; diff --git a/lib/plugins/authpdo/lang/fa/settings.php b/lib/plugins/authpdo/lang/fa/settings.php new file mode 100644 index 0000000..201687c --- /dev/null +++ b/lib/plugins/authpdo/lang/fa/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'جزئیات پیام‌های خطا را نمایش بده. باید بعد از تنظیم غیرفعال شود.'; +$lang['dsn'] = 'دی‌اس‌ان برای اتصال به پایگاه داده'; +$lang['user'] = 'کاربر برای اتصال پایگاه دادهٔ بالا (برای sqlite خالی)'; +$lang['pass'] = 'کلمهٔ عبور برای اتصال پایگاه دادهٔ بالا (برای sqlite خالی)'; +$lang['select-user'] = 'دستور SQL برای انتخاب داده‌ای از یک کاربر'; +$lang['select-user-groups'] = 'دستور SQL برای انتخاب همهٔ گروه‌های یک کاربر'; +$lang['select-groups'] = 'دستور SQL برای انتخاب گروه‌های موجود'; +$lang['insert-user'] = 'دستور SQL برای افزودن یک کاربر جدید به پایگاه داده'; +$lang['delete-user'] = 'دستور SQL برای ححذف یک کاربر از پایگاه داده'; +$lang['list-users'] = 'دستور SQL برای فهرست کردن کاربران دارای ویژگی مشخص'; +$lang['count-users'] = 'دستور SQL برای شمارش کاربران دارای ویژگی مشخص'; +$lang['update-user-info'] = 'دستور SQL برای به‌روزرسانی نام کامل و ایمیل یک کاربر'; +$lang['update-user-login'] = 'دستور SQL برای به‌روزرسانی نام ورود به سیستم برای یک کاربر'; +$lang['update-user-pass'] = 'دستور SQL برای به‌روزرسانی کلمهٔ عبور برای یک کاربر'; +$lang['insert-group'] = 'دستور SQL برای افزودن گروه جدید به پایگاه داده'; +$lang['join-group'] = 'دستور SQL برای افزودن یک کاربر به یک گروه موجود'; +$lang['leave-group'] = 'دستور SQL برای حذف یک کاربر از یک گروه'; +$lang['check-pass'] = 'دستور SQL برای چک کردن کلمهٔ عبور یک کاربر. اگر اطلاعات کلمهٔ عبور در دریافت کاربر گرفته شده می‌تواند خالی بماند.'; diff --git a/lib/plugins/authpdo/lang/fr/lang.php b/lib/plugins/authpdo/lang/fr/lang.php new file mode 100644 index 0000000..5473aa7 --- /dev/null +++ b/lib/plugins/authpdo/lang/fr/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Impossible de se connecter à la base de données.'; +$lang['userexists'] = 'Désolé, un utilisateur avec cet identifiant existe déjà.'; +$lang['writefail'] = 'Impossible de modifier les données utilisateur. Veuillez en informer l\'administrateur du Wiki.'; diff --git a/lib/plugins/authpdo/lang/fr/settings.php b/lib/plugins/authpdo/lang/fr/settings.php new file mode 100644 index 0000000..5c2704a --- /dev/null +++ b/lib/plugins/authpdo/lang/fr/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'Afficher des messages d\'erreur détaillés. Devrait être désactivé passé la configuration.'; +$lang['dsn'] = 'Le DSN de connexion à la base de données.'; +$lang['user'] = 'L\'utilisateur pour la connexion à la base de donnée ci-dessus (vide pour sqlite)'; +$lang['pass'] = 'Le mot de passe pour la connexion à la base de donnée ci-dessus (vide pour sqlite)'; +$lang['select-user'] = 'Instruction SQL pour sélectionner les données d\'un seul utilisateur'; +$lang['select-user-groups'] = 'Instruction SQL pour sélectionner tous les groupes d\'un utilisateur donné'; +$lang['select-groups'] = 'Instruction SQL pour sélectionner tous les groupes disponibles'; +$lang['insert-user'] = 'Instruction SQL pour insérer un nouvel utilisateur dans la base de données'; +$lang['delete-user'] = 'Instruction SQL pour retirer un utilisateur de la base de données'; +$lang['list-users'] = 'Instruction SQL pour lister les utilisateurs correspondant à un filtre'; +$lang['count-users'] = 'Instruction SQL pour compter les utilisateurs correspondant à un filtre'; +$lang['update-user-info'] = 'Instruction SQL pour mettre à jour le nom complet et l\'adresse de courriel d\'un utilisateur donné'; +$lang['update-user-login'] = 'Instruction SQL pour mettre à jour l\'identifiant d\'un utilisateur donné'; +$lang['update-user-pass'] = 'Instruction SQL pour mettre à jour le mot de passe d\'un utilisateur donné'; +$lang['insert-group'] = 'Instruction SQL pour mettre insérer un nouveau groupe dans la base de données'; +$lang['join-group'] = 'Instruction SQL pour ajouter un utilisateur à un groupe existant'; +$lang['leave-group'] = 'Instruction SQL pour retirer un utilisateur d\'un groupe'; +$lang['check-pass'] = 'Instruction SQL pour vérifier le mot de passe d\'un utilisateur. Peut être laissé vide si l\'information de mot de passe est obtenue lors de la sélection d\'un utilisateur.'; diff --git a/lib/plugins/authpdo/lang/hr/lang.php b/lib/plugins/authpdo/lang/hr/lang.php new file mode 100644 index 0000000..3acdbf4 --- /dev/null +++ b/lib/plugins/authpdo/lang/hr/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Ne mogu se spojiti na bazu.'; +$lang['userexists'] = 'Oprostite ali korisnik s ovom prijavom već postoji.'; +$lang['writefail'] = 'Ne mogu izmijeniti podatke. Molim obavijestite Wiki administratora'; diff --git a/lib/plugins/authpdo/lang/hu/lang.php b/lib/plugins/authpdo/lang/hu/lang.php new file mode 100644 index 0000000..2dd5255 --- /dev/null +++ b/lib/plugins/authpdo/lang/hu/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Az adatbázishoz való csatlakozás sikertelen.'; +$lang['userexists'] = 'Sajnos már létezik ilyen azonosítójú felhasználó.'; +$lang['writefail'] = 'A felhasználói adatok módosítása sikertelen. Kérlek, fordulj a wiki rendszergazdájához!'; diff --git a/lib/plugins/authpdo/lang/hu/settings.php b/lib/plugins/authpdo/lang/hu/settings.php new file mode 100644 index 0000000..8aeec74 --- /dev/null +++ b/lib/plugins/authpdo/lang/hu/settings.php @@ -0,0 +1,23 @@ + + */ +$lang['user'] = 'Felhasználónév az adatbáziskapcsolathoz (sqlite esetén üres)'; +$lang['pass'] = 'Jelszó az adatbáziskapcsolathoz (sqlite esetén üres)'; +$lang['select-user'] = 'SQL kifejezés egy felhasználó lekérdezéséhez'; +$lang['select-user-groups'] = 'SQL kifejezés egy felhasználó összes csoportjának lekérdezéséhez'; +$lang['select-groups'] = 'SQL kifejezés az összes elérhető csoport lekérdezéséhez'; +$lang['insert-user'] = 'SQL kifejezés egy új felhasználó rögzítéséhez'; +$lang['delete-user'] = 'SQL kifejezés egy felhasználó törléséhez'; +$lang['list-users'] = 'SQL kifejezés egy keresésnek megfelelő felhasználók listázásához'; +$lang['count-users'] = 'SQL kifejezés egy feltételnek megfelelő felhasználók megszámlálásához'; +$lang['update-user-info'] = 'SQL kifejezés egy felhasználó teljes nevének és e-mail címének frissítéséhez'; +$lang['update-user-login'] = 'SQL kifejezés egy felhasználó felhasználónevének frissítéséhez'; +$lang['update-user-pass'] = 'SQL kifejezés egy felhasználó jelszavának frissítéséhez'; +$lang['insert-group'] = 'SQL kifejezés egy új csoport létrehozásához'; +$lang['join-group'] = 'SQL kifejezés egy felhasználó csoporthoz adásához'; +$lang['leave-group'] = 'SQL kifejezés egy felhasználó egy csoportból való eltávolításához'; +$lang['check-pass'] = 'SQL kifejezés egy felhasználó jelszavának ellenőrzéséhez. Üresen hagyható, ha a felhasználó lekérdezése a jelszóinformációkat is tartalmazza.'; diff --git a/lib/plugins/authpdo/lang/it/lang.php b/lib/plugins/authpdo/lang/it/lang.php new file mode 100644 index 0000000..56b4a01 --- /dev/null +++ b/lib/plugins/authpdo/lang/it/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Connessione fallita al database.'; +$lang['userexists'] = 'Spiacente, esiste già un utente con queste credenziali.'; +$lang['writefail'] = 'Non è possibile cambiare le informazioni utente. Si prega di informare l\'Amministratore del wiki'; diff --git a/lib/plugins/authpdo/lang/it/settings.php b/lib/plugins/authpdo/lang/it/settings.php new file mode 100644 index 0000000..d539c4a --- /dev/null +++ b/lib/plugins/authpdo/lang/it/settings.php @@ -0,0 +1,26 @@ + + * @author Riccardo + */ +$lang['debug'] = 'Stampa messaggi di errore dettagliati. Dovrebbe essere disabilitato dopo l\'installazione.'; +$lang['dsn'] = 'Il DSN per connettersi al database.'; +$lang['user'] = 'L\'utente per la connessione al database sopra (vuoto per sqlite)'; +$lang['pass'] = 'La password per la connessione al database sopra (vuoto per sqlite)'; +$lang['select-user'] = 'Istruzione SQL per selezionare i dati di un singolo utente'; +$lang['select-user-groups'] = 'Istruzione SQL per selezionare tutti i gruppi di un singolo utente'; +$lang['select-groups'] = 'Istruzione SQL per selezionare tutti i gruppi disponibili'; +$lang['insert-user'] = 'Istruzione SQL per inserire un nuovo utente nel database'; +$lang['delete-user'] = 'Istruzione SQL per rimuovere un singolo utente dal database'; +$lang['list-users'] = 'Istruzione SQL per elencare gli utenti che corrispondono a un filtro'; +$lang['count-users'] = 'Istruzione SQL per contare gli utenti che corrispondono a un filtro'; +$lang['update-user-info'] = 'Istruzione SQL per aggiornare nome completo ed indirizzo email di un singolo utente'; +$lang['update-user-login'] = 'Istruzione SQL per aggiornare il nome di login di un singolo utente'; +$lang['update-user-pass'] = 'Istruzione SQL per aggiornare la password di un singolo utente'; +$lang['insert-group'] = 'Istruzione SQL per inserire un nuovo gruppo nel database'; +$lang['join-group'] = 'Istruzione SQL per aggiungere un utente ad un gruppo esistente'; +$lang['leave-group'] = 'Istruzione SQL per rimuovere un utente da un gruppo'; +$lang['check-pass'] = 'Istruzione SQL per cercare la password di un utente. Può essere omessa se l\'informazioni sulla password è recuperate dalla selezione utente.'; diff --git a/lib/plugins/authpdo/lang/ja/lang.php b/lib/plugins/authpdo/lang/ja/lang.php new file mode 100644 index 0000000..8893f2d --- /dev/null +++ b/lib/plugins/authpdo/lang/ja/lang.php @@ -0,0 +1,11 @@ + + * @author Hideaki SAWADA + */ +$lang['connectfail'] = 'データベースへの接続に失敗しました。'; +$lang['userexists'] = '恐れ入りますが、このログイン名のユーザーが既に存在しています。'; +$lang['writefail'] = 'ユーザーデータを変更できません。Wiki の管理者に連絡してください。'; diff --git a/lib/plugins/authpdo/lang/ja/settings.php b/lib/plugins/authpdo/lang/ja/settings.php new file mode 100644 index 0000000..b90db26 --- /dev/null +++ b/lib/plugins/authpdo/lang/ja/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = '詳細なエラーメッセージを出力する(セットアップ後、このオプションはオフにすべきです)'; +$lang['dsn'] = 'データベースにアクセスするDSN'; +$lang['user'] = '上記データベースに接続するユーザー名(sqliteの場合は空欄にしておいて下さい)'; +$lang['pass'] = '上記データベースに接続するパスワード(sqliteの場合は空欄にしておいて下さい)'; +$lang['select-user'] = '個々のユーザーのデータを選ぶSQL命令文'; +$lang['select-user-groups'] = '個々のユーザーが属する全てのグループを選ぶSQL命令文'; +$lang['select-groups'] = '利用可能な全グループを選ぶSQL命令文'; +$lang['insert-user'] = 'データベースに新規ユーザーを追加するSQL命令文'; +$lang['delete-user'] = '個々のユーザーをデータベースから取り除くSQL命令文'; +$lang['list-users'] = 'フィルターに一致するユーザーを一覧にするSQL命令文'; +$lang['count-users'] = 'フィルターに一致するユーザーを数えるSQL命令文'; +$lang['update-user-info'] = '個々のユーザーのフルネームとメールアドレスを更新するSQL命令文'; +$lang['update-user-login'] = '個々のユーザーのログイン名を更新するSQL命令文'; +$lang['update-user-pass'] = '個々のユーザーのパスワードを更新するSQL命令文'; +$lang['insert-group'] = 'データベースに新規グループを追加するSQL命令文'; +$lang['join-group'] = '既にあるグループにユーザーを追加するSQL命令文'; +$lang['leave-group'] = 'グループからユーザーを取り除くSQL命令文'; +$lang['check-pass'] = 'ユーザーのパスワードをチェックするSQL命令文(select-userでパスワード情報を呼び出す場合は空欄にしておけます)'; diff --git a/lib/plugins/authpdo/lang/ko/lang.php b/lib/plugins/authpdo/lang/ko/lang.php new file mode 100644 index 0000000..4a8a4d4 --- /dev/null +++ b/lib/plugins/authpdo/lang/ko/lang.php @@ -0,0 +1,11 @@ + + * @author Myeongjin + */ +$lang['connectfail'] = '데이터베이스에 연결하는 데 실패했습니다.'; +$lang['userexists'] = '죄송하지만 이 계정으로 이미 로그인한 사용자가 있습니다.'; +$lang['writefail'] = '사용자 데이터를 수정할 수 없습니다. 위키 관리자에게 문의하시기 바랍니다'; diff --git a/lib/plugins/authpdo/lang/ko/settings.php b/lib/plugins/authpdo/lang/ko/settings.php new file mode 100644 index 0000000..3afdab1 --- /dev/null +++ b/lib/plugins/authpdo/lang/ko/settings.php @@ -0,0 +1,31 @@ + + * @author merefox + * @author pavement + * @author Traend + */ +$lang['debug'] = '자세한 오류 메시지를 출력합니다. 설정 후 비활성화해야 합니다.'; +$lang['dsn'] = '데이터베이스에 연결할 DSN'; +$lang['user'] = '위의 데이터베이스 연결에 대한 사용자(sqlite의 경우 비어 있음)'; +$lang['pass'] = '위의 데이터베이스 연결에 대한 암호(sqlite의 경우 비어 있음)'; +$lang['select-user'] = '단일 사용자의 데이터를 선택하기 위한 SQL 문 +'; +$lang['select-user-groups'] = '단일 사용자의 모든 그룹을 선택하기 위한 SQL 문'; +$lang['select-groups'] = '사용 가능한 모든 그룹을 선택하기 위한 SQL 문 +'; +$lang['insert-user'] = '데이터베이스에 새 사용자를 삽입하는 SQL 문 +'; +$lang['delete-user'] = '데이터베이스에서 단일 사용자를 제거하기 위한 SQL 문'; +$lang['list-users'] = '필터와 일치하는 사용자를 나열하는 SQL 문'; +$lang['count-users'] = '필터와 일치하는 사용자를 계산하는 SQL 문'; +$lang['update-user-info'] = '단일 사용자의 전체 이름과 이메일 주소를 업데이트하는 SQL 문'; +$lang['update-user-login'] = '단일 사용자의 로그인 이름을 업데이트하는 SQL 문'; +$lang['update-user-pass'] = '단일 사용자의 암호를 업데이트하는 SQL 문'; +$lang['insert-group'] = '데이터베이스에 새 그룹을 삽입하는 SQL 문'; +$lang['join-group'] = '기존 그룹에 사용자를 추가하는 SQL 문'; +$lang['leave-group'] = '그룹에서 사용자를 제거하는 SQL 문'; +$lang['check-pass'] = '사용자의 암호를 확인하는 SQL 문입니다. 선택 사용자에서 암호 정보를 가져오는 경우 비워 둘 수 있습니다.'; diff --git a/lib/plugins/authpdo/lang/nl/lang.php b/lib/plugins/authpdo/lang/nl/lang.php new file mode 100644 index 0000000..c0c688d --- /dev/null +++ b/lib/plugins/authpdo/lang/nl/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Connectie met de database mislukt.'; +$lang['userexists'] = 'Sorry, een gebruiker met deze login bestaat reeds.'; +$lang['writefail'] = 'Onmogelijk om de gebruikers data te wijzigen. Gelieve de Wiki-Admin te informeren.'; diff --git a/lib/plugins/authpdo/lang/nl/settings.php b/lib/plugins/authpdo/lang/nl/settings.php new file mode 100644 index 0000000..4929e91 --- /dev/null +++ b/lib/plugins/authpdo/lang/nl/settings.php @@ -0,0 +1,26 @@ + + * @author Andy + */ +$lang['debug'] = 'Geef gedetailleerde foutmeldingen weer. Dit zou uitgeschakeld moeten zijn na de installatie.'; +$lang['dsn'] = 'De DSN om verbinding te maken met de database.'; +$lang['user'] = 'De gebruikersnaam voor de bovengenoemde database verbinding (laat leeg voor sqlite)'; +$lang['pass'] = 'Het wachtwoord voor de bovengenoemde database verbinding (laat leeg voor sqlite)'; +$lang['select-user'] = 'SQL Statement om de data te selecteren van één gebruiker'; +$lang['select-user-groups'] = 'SQL Statement om alle groepen van één gebruiker te selecteren'; +$lang['select-groups'] = 'SQL Statement om alle beschikbare groepen te selecteren'; +$lang['insert-user'] = 'SQL Statement om een nieuwe gebruiker in de database in te voeren'; +$lang['delete-user'] = 'SQL Statement om één gebruiker uit de database te verwijderen'; +$lang['list-users'] = 'SQL-instructie om gebruikers weer te geven die overeenkomen met een filter'; +$lang['count-users'] = 'SQL-instructie om gebruikers te tellen die overeenkomen met een filter'; +$lang['update-user-info'] = 'SQL-instructie om de volledige naam en e-mailadres van een enkele gebruiker bij te werken'; +$lang['update-user-login'] = 'SQL-instructie om de inlognaam van een enkele gebruiker bij te werken'; +$lang['update-user-pass'] = 'SQL-instructie om het wachtwoord van een enkele gebruiker bij te werken'; +$lang['insert-group'] = 'SQL-instructie om een nieuwe groep aan de database toe te voegen'; +$lang['join-group'] = 'SQL-instructie om een gebruiker aan een bestaande groep toe te voegen'; +$lang['leave-group'] = 'SQL-instructie om een gebruiker uit een groep te verwijderen'; +$lang['check-pass'] = 'SQL-instructie om het wachtwoord van een gebruiker te controleren. Kan leeg gelaten worden als de wachtwoordinformatie wordt opgehaald in select-user'; diff --git a/lib/plugins/authpdo/lang/pl/lang.php b/lib/plugins/authpdo/lang/pl/lang.php new file mode 100644 index 0000000..fd813f1 --- /dev/null +++ b/lib/plugins/authpdo/lang/pl/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Błąd łącznie się z bazą danych'; +$lang['userexists'] = 'Przepraszamy, użytkownik o tym loginie już istnieje'; +$lang['writefail'] = 'Nie można zmodyfikować danych użytkownika. Proszę skontaktować się z Administratorem'; diff --git a/lib/plugins/authpdo/lang/pl/settings.php b/lib/plugins/authpdo/lang/pl/settings.php new file mode 100644 index 0000000..f0676c2 --- /dev/null +++ b/lib/plugins/authpdo/lang/pl/settings.php @@ -0,0 +1,28 @@ + + * @author pavulondit + * @author Bartek S + * @author Przemek + */ +$lang['debug'] = 'Wyświetlanie szczegółowej wiadomości o błędzie. Powinno być wyłączone po '; +$lang['dsn'] = 'Nazwa źródła danych do łączenia się z bazą danych'; +$lang['user'] = 'Użytkownik do powyższego połączenia z bazą danych (puste dla sqlite)'; +$lang['pass'] = 'Hasło do powyższego połączenia z bazą danych (puste dla sqlite)'; +$lang['select-user'] = 'Zapytanie SQL, aby wybrać dane jednego użytkownika'; +$lang['select-user-groups'] = 'Zapytanie SQL aby wybrać wszystkie grupy jednego użytkownika'; +$lang['select-groups'] = 'Instrukcja SQL do wybrania wszystkich dostępnych grup'; +$lang['insert-user'] = 'Instrukcja SQL do wstawienia nowego użytkownika do bazy danych'; +$lang['delete-user'] = 'Instrukcja SQL do usunięcia pojedynczego użytkownika z bazy danych'; +$lang['list-users'] = 'Instrukcja SQL do wyświetlenia listy użytkowników pasujących do filtra'; +$lang['count-users'] = 'Instrukcja SQL do zliczenia użytkowników pasujących do filtra'; +$lang['update-user-info'] = 'Wyrażenie SQL aby zaktualizować imię oraz adres email dla pojedynczego użytkownika'; +$lang['update-user-login'] = 'Wyrażenie SQL aby zaktualizować login dla pojedynczego użytkownika'; +$lang['update-user-pass'] = 'Zapytanie SQL do zaktualizowania hasła dla pojedynczego użytkownika'; +$lang['insert-group'] = 'Zapytanie SQL aby dodać nową grupę do bazy danych'; +$lang['join-group'] = 'Zapytanie SQL aby dodać użytkownika do istniejącej grupy'; +$lang['leave-group'] = 'Zapytanie SQL aby usunąć użytkownika z grupy'; +$lang['check-pass'] = 'Zapytanie SQL aby sprawdzić hasło użytkownika. Można pozostawić puste, jeśli informacje o haśle są pobierane w select-user.'; diff --git a/lib/plugins/authpdo/lang/pt-br/lang.php b/lib/plugins/authpdo/lang/pt-br/lang.php new file mode 100644 index 0000000..8f44086 --- /dev/null +++ b/lib/plugins/authpdo/lang/pt-br/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Não foi possível conectar ao banco de dados.'; +$lang['userexists'] = 'Desculpe, mas já existe esse nome de usuário.'; +$lang['writefail'] = 'Não foi possível modificar os dados do usuário. Por favor, informe ao administrador do Wiki.'; diff --git a/lib/plugins/authpdo/lang/pt-br/settings.php b/lib/plugins/authpdo/lang/pt-br/settings.php new file mode 100644 index 0000000..b1d285b --- /dev/null +++ b/lib/plugins/authpdo/lang/pt-br/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'Exibir mensagens de erro detalhadas. Deve ser desabilitado após a configuração.'; +$lang['dsn'] = 'O DSN para conectar ao banco de dados.'; +$lang['user'] = 'O usuário para a conexão ao banco de dados acima (em branco para sqlite)'; +$lang['pass'] = 'A senha para a conexão ao banco de dados acima (em branco para sqlite)'; +$lang['select-user'] = 'Declaração SQL para selecionar os dados de um único usuário'; +$lang['select-user-groups'] = 'Declaração SQL para selecionar todos os grupos de um único usuário'; +$lang['select-groups'] = 'Declaração SQL para selecionar todos os grupos disponíveis'; +$lang['insert-user'] = 'Declaração SQL para inserir um novo usuário no banco de dados'; +$lang['delete-user'] = 'Declaração SQL para remover um único usuário do banco de dados'; +$lang['list-users'] = 'Declaração SQL para listar usuários correspondentes a um filtro'; +$lang['count-users'] = 'Declaração SQL para contar usuários correspondentes a um filtro'; +$lang['update-user-info'] = 'Declaração SQL para atualizar o nome completo e endereço de e-mail de um único usuário'; +$lang['update-user-login'] = 'Declaração SQL para atualizar o nome de usuário de e-mail de um único usuário'; +$lang['update-user-pass'] = 'Declaração SQL para atualizar a senha de um único usuário'; +$lang['insert-group'] = 'Declaração SQL para inserir um novo grupo no banco de dados'; +$lang['join-group'] = 'Declaração SQL para adicionar um usuário a um grupo existente'; +$lang['leave-group'] = 'Declaração SQL para remover um usuário de um grupo'; +$lang['check-pass'] = 'Declaração SQL para verificar a senha de um usuário. Pode ser deixada em branco se a informação da senha for obtida a partir do usuário selecionado.'; diff --git a/lib/plugins/authpdo/lang/pt/lang.php b/lib/plugins/authpdo/lang/pt/lang.php new file mode 100644 index 0000000..3e7ed62 --- /dev/null +++ b/lib/plugins/authpdo/lang/pt/lang.php @@ -0,0 +1,12 @@ + + * @author Maykon Oliveira + * @author Paulo Carmino + */ +$lang['connectfail'] = 'Erro ao conectar o banco de dados.'; +$lang['userexists'] = 'Desculpe, esse login já está sendo usado.'; +$lang['writefail'] = 'Não é possível modificar os dados do usuário. Por favor, informe o Wiki-Admin'; diff --git a/lib/plugins/authpdo/lang/pt/settings.php b/lib/plugins/authpdo/lang/pt/settings.php new file mode 100644 index 0000000..45d259b --- /dev/null +++ b/lib/plugins/authpdo/lang/pt/settings.php @@ -0,0 +1,26 @@ + + * @author Maykon Oliveira + */ +$lang['debug'] = 'Imprima mensagens de erro detalhadas. Deve ser desativado após a configuração.'; +$lang['dsn'] = 'O DSN para se conectar ao banco de dados.'; +$lang['user'] = 'O usuário para a conexão de banco de dados acima (vazio para sqlite)'; +$lang['pass'] = 'A senha para a conexão de banco de dados acima (vazia para sqlite)'; +$lang['select-user'] = 'Instrução SQL para selecionar os dados de um único usuário'; +$lang['select-user-groups'] = 'Instrução SQL para selecionar todos os grupos de um único usuário'; +$lang['select-groups'] = 'Instrução SQL para selecionar todos os grupos disponíveis'; +$lang['insert-user'] = 'Instrução SQL para inserir um novo usuário no banco de dados'; +$lang['delete-user'] = 'Instrução SQL para remover um usuário do banco de dados'; +$lang['list-users'] = 'Instrução SQL para listar usuários que correspondam a um filtro'; +$lang['count-users'] = 'Instrução SQL para contar usuários que correspondam a um filtro'; +$lang['update-user-info'] = 'Instrução SQL para atualizar o nome completo e e-mail de um usuário'; +$lang['update-user-login'] = 'Instrução SQL para atualizar o nome de login de um usuário'; +$lang['update-user-pass'] = 'Instrução SQL para atualizar a senha de um usuário'; +$lang['insert-group'] = 'Instrução SQL para inserir um novo grupo no banco de dados'; +$lang['join-group'] = 'Instrução SQL para adicionar um usuário a um grupo existente'; +$lang['leave-group'] = 'Instrução SQL para remover um usuário de um grupo'; +$lang['check-pass'] = 'Instrução SQL para verificar a senha de um usuário. Pode ser deixado em branco se a informação da senha for buscada no usuário selecionado.'; diff --git a/lib/plugins/authpdo/lang/ru/lang.php b/lib/plugins/authpdo/lang/ru/lang.php new file mode 100644 index 0000000..9dc8326 --- /dev/null +++ b/lib/plugins/authpdo/lang/ru/lang.php @@ -0,0 +1,11 @@ + + * @author Aleksandr Selivanov + */ +$lang['connectfail'] = 'Ошибка соединения с базой данных.'; +$lang['userexists'] = 'Извините, пользователь с таким логином уже существует.'; +$lang['writefail'] = 'Невозможно изменить данные пользователя. Сообщите об этом администратору вики.'; diff --git a/lib/plugins/authpdo/lang/ru/settings.php b/lib/plugins/authpdo/lang/ru/settings.php new file mode 100644 index 0000000..144763a --- /dev/null +++ b/lib/plugins/authpdo/lang/ru/settings.php @@ -0,0 +1,26 @@ + + * @author Vyacheslav Strenadko + */ +$lang['debug'] = 'Выводить подробные сообщения об ошибках. Должно быть отключено после настройки.'; +$lang['dsn'] = 'DSN (имя источника данных) для подключения к базе данных'; +$lang['user'] = 'Имя пользователя для подключения к базе данных (пустое для SQLite)'; +$lang['pass'] = 'Пароль для подключения к базе данных (пустой для SQLite)'; +$lang['select-user'] = 'SQL-выражение для выбора данных одного пользователя'; +$lang['select-user-groups'] = 'SQL-выражение для выбора всех групп одного пользователя'; +$lang['select-groups'] = 'SQL-выражение для выбора всех доступных групп'; +$lang['insert-user'] = 'SQL-выражение для добавления нового пользователя в базу данных'; +$lang['delete-user'] = 'SQL-выражение для удаления одного пользователя из базы данных'; +$lang['list-users'] = 'SQL-выражение для перечисления пользователей, соответствующих фильтру'; +$lang['count-users'] = 'SQL-выражение для подсчёта пользователей, соответствующих фильтру'; +$lang['update-user-info'] = 'SQL-выражение для обновления полного имени и адреса эл. почты одного пользователя'; +$lang['update-user-login'] = 'SQL-выражение для обновления логина одного пользователя'; +$lang['update-user-pass'] = 'SQL-выражение для обновления пароля одного пользователя'; +$lang['insert-group'] = 'SQL-выражение для добавления новой группы в базу данных'; +$lang['join-group'] = 'SQL-выражение для добавления пользователя в существующую группу'; +$lang['leave-group'] = 'SQL-выражение для удаления пользователя из группы'; +$lang['check-pass'] = 'SQL-выражение для проверки пароля пользователя. Может быть пустым, если информация о пароле выбрана пользователем. (Can be left empty if password info is fetched in select-user.)'; diff --git a/lib/plugins/authpdo/lang/sk/lang.php b/lib/plugins/authpdo/lang/sk/lang.php new file mode 100644 index 0000000..9f70381 --- /dev/null +++ b/lib/plugins/authpdo/lang/sk/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Nepodarilo sa pripojiť k databáze.'; +$lang['userexists'] = 'Ľutujem, ale používateľ s týmto prihlasovacím menom už existuje.'; +$lang['writefail'] = 'Nie je možné zmeniť údaje používateľa, informujte prosím administrátora Wiki.'; diff --git a/lib/plugins/authpdo/lang/sk/settings.php b/lib/plugins/authpdo/lang/sk/settings.php new file mode 100644 index 0000000..0fdbfa4 --- /dev/null +++ b/lib/plugins/authpdo/lang/sk/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'Výpis podrobných chybových hlásení. Po nastavení by sa malo vypnúť.'; +$lang['dsn'] = 'DSN pre pripojenie k databáze.'; +$lang['user'] = 'Používateľ uvedeného databázového pripojenia (prázdne pre sqllite)'; +$lang['pass'] = 'Heslo uvedeného databázového pripojenia (prázdne pre sqllite)'; +$lang['select-user'] = 'SQL príkaz pre výber údajov používateľa'; +$lang['select-user-groups'] = 'SQL príkaz pre výber všetkých skupín používateľa'; +$lang['select-groups'] = 'SQL príkaz pre výber dostupných skupín'; +$lang['insert-user'] = 'SQL príkaz pre vloženie údajov používateľa do databázy'; +$lang['delete-user'] = 'SQL príkaz pre odstránenie používateľa z databázy'; +$lang['list-users'] = 'SQL príkaz pre výpis používateľov podľa filtra'; +$lang['count-users'] = 'SQL príkaz pre spočítanie používateľov podľa filtra'; +$lang['update-user-info'] = 'SQL príkaz pre aktualizáciu mena a emailu používateľa'; +$lang['update-user-login'] = 'SQL príkaz pre aktualizáciu prihlasovacieho mena používateľa'; +$lang['update-user-pass'] = 'SQL príkaz pre aktualizáciu hesla používateľa'; +$lang['insert-group'] = 'SQL príkaz pre vloženie údajov skupiny do databázy'; +$lang['join-group'] = 'SQL príkaz pre pridanie používateľa do existujúcej skupiny'; +$lang['leave-group'] = 'SQL príkaz pre odstránenie používateľa zo skupiny'; +$lang['check-pass'] = 'SQL príkaz pre kontrolu hesla používateľa. Môže zostať prázdny, ak je informácia o hesle pripojená k výberu údajov používateľa.'; diff --git a/lib/plugins/authpdo/lang/sv/lang.php b/lib/plugins/authpdo/lang/sv/lang.php new file mode 100644 index 0000000..d8c017b --- /dev/null +++ b/lib/plugins/authpdo/lang/sv/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Misslyckades med att ansluta databas.'; +$lang['userexists'] = 'PHP mail() saknas eller är inaktiverad. Följande mejl skickades inte:'; +$lang['writefail'] = 'Wiki Markup'; diff --git a/lib/plugins/authpdo/lang/sv/settings.php b/lib/plugins/authpdo/lang/sv/settings.php new file mode 100644 index 0000000..56a904f --- /dev/null +++ b/lib/plugins/authpdo/lang/sv/settings.php @@ -0,0 +1,23 @@ + + */ +$lang['user'] = 'Användaren för databasen ovan (tom för sqlite)'; +$lang['pass'] = 'Lösenordet för databasen ovan (tom för sqlite)'; +$lang['select-user'] = 'SQL uttryck för att välja datan för en enda användare'; +$lang['select-user-groups'] = 'SQL uttryck för att välja alla grupper för en enda användare'; +$lang['select-groups'] = 'SQL uttryck för att välja alla tillgängliga grupper'; +$lang['insert-user'] = 'SQL uttryck för att lägga till en ny användare i databasen'; +$lang['delete-user'] = 'SQL uttryck för att ta bort en enda användare från databasen'; +$lang['list-users'] = 'SQL uttryck för att lista användare som matchar filtret'; +$lang['count-users'] = 'SQL uttryck för att räkna användare som matchar filtret'; +$lang['update-user-info'] = 'SQL uttryck för att uppdatera det fullständiga namnet och mejladressen för en användare'; +$lang['update-user-login'] = 'SQL uttryck för att uppdatera användarnamnet för en användare'; +$lang['update-user-pass'] = 'SQL uttryck för att uppdatera lösenordet för en användare'; +$lang['insert-group'] = 'SQL uttryck för att lägga till en ny grupp i databasen'; +$lang['join-group'] = 'SQL uttryck för att lägga till en användare i en existerande grupp'; +$lang['leave-group'] = 'SQL uttryck för att ta bort en användare från en grupp'; +$lang['check-pass'] = 'SQL uttryck för att kontrollera en användares lösenord. Kan lämnas tomt utifall informationen hämtas i "select-user".'; diff --git a/lib/plugins/authpdo/lang/tr/lang.php b/lib/plugins/authpdo/lang/tr/lang.php new file mode 100644 index 0000000..6e90716 --- /dev/null +++ b/lib/plugins/authpdo/lang/tr/lang.php @@ -0,0 +1,8 @@ + + */ +$lang['connectfail'] = 'Veritabanına bağlantı kurulamadı.'; diff --git a/lib/plugins/authpdo/lang/uk/lang.php b/lib/plugins/authpdo/lang/uk/lang.php new file mode 100644 index 0000000..e5b9d65 --- /dev/null +++ b/lib/plugins/authpdo/lang/uk/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Не вдалося підключитися до бази даних.'; +$lang['userexists'] = 'На жаль, користувач із цим логіном вже існує.'; +$lang['writefail'] = 'Неможливо змінити дані користувача. Будь-ласка, повідомте про це Wiki-Адміністратора'; diff --git a/lib/plugins/authpdo/lang/uk/settings.php b/lib/plugins/authpdo/lang/uk/settings.php new file mode 100644 index 0000000..94abd89 --- /dev/null +++ b/lib/plugins/authpdo/lang/uk/settings.php @@ -0,0 +1,15 @@ + + */ +$lang['dsn'] = 'DSN для підключення до бази даних.'; +$lang['user'] = 'Користувач для вищевказаного з\'єднання з базою даних (порожній для sqlite)'; +$lang['pass'] = 'Пароль для вищезазначеного з\'єднання з базою даних (порожній для sqlite)'; +$lang['select-user'] = 'Запит SQL для вибору даних одного користувача'; +$lang['select-user-groups'] = 'Запит SQL для вибору всіх груп одного користувача'; +$lang['select-groups'] = 'Запит SQL для вибору всіх доступних груп'; +$lang['insert-user'] = 'Запит SQL для вставки нового користувача в базу даних'; +$lang['delete-user'] = 'Запит SQL для видалення одного користувача з бази даних'; diff --git a/lib/plugins/authpdo/lang/vi/lang.php b/lib/plugins/authpdo/lang/vi/lang.php new file mode 100644 index 0000000..0d8c4ca --- /dev/null +++ b/lib/plugins/authpdo/lang/vi/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = 'Không thể kết nối với cơ sở dữ liệu.'; +$lang['userexists'] = 'Xin lỗi, thành viên có thông tin đăng nhập này đã tồn tại.'; +$lang['writefail'] = 'Không thể sửa đổi dữ liệu thành viên. Vui lòng thông báo cho Quản trị viên Wiki'; diff --git a/lib/plugins/authpdo/lang/vi/settings.php b/lib/plugins/authpdo/lang/vi/settings.php new file mode 100644 index 0000000..cc15ab2 --- /dev/null +++ b/lib/plugins/authpdo/lang/vi/settings.php @@ -0,0 +1,25 @@ + + */ +$lang['debug'] = 'In ra các thông báo lỗi chi tiết. Nên bị vô hiệu hóa sau khi thiết lập.'; +$lang['dsn'] = 'DSN để kết nối với cơ sở dữ liệu.'; +$lang['user'] = 'Thành viên cho kết nối cơ sở dữ liệu trên (trống cho sqlite)'; +$lang['pass'] = 'Mật khẩu cho kết nối cơ sở dữ liệu trên (trống cho sqlite)'; +$lang['select-user'] = 'Câu lệnh SQL để chọn dữ liệu của một thành viên'; +$lang['select-user-groups'] = 'Câu lệnh SQL để chọn tất cả các nhóm của một thành viên'; +$lang['select-groups'] = 'Câu lệnh SQL để chọn tất cả các nhóm có sẵn'; +$lang['insert-user'] = 'Câu lệnh SQL để chèn thành viên mới vào cơ sở dữ liệu'; +$lang['delete-user'] = 'Câu lệnh SQL để xóa một thành viên khỏi cơ sở dữ liệu'; +$lang['list-users'] = 'Câu lệnh SQL để liệt kê thành viên khớp với bộ lọc'; +$lang['count-users'] = 'Câu lệnh SQL để đếm thành viên khớp với bộ lọc'; +$lang['update-user-info'] = 'Câu lệnh SQL để cập nhật tên đầy đủ và địa chỉ thư điện tử của một thành viên'; +$lang['update-user-login'] = 'Câu lệnh SQL để cập nhật tên đăng nhập của một thành viên'; +$lang['update-user-pass'] = 'Câu lệnh SQL để cập nhật mật khẩu của một thành viên'; +$lang['insert-group'] = 'Câu lệnh SQL để chèn một nhóm mới vào cơ sở dữ liệu'; +$lang['join-group'] = 'Câu lệnh SQL để thêm thành viên vào một nhóm hiện có'; +$lang['leave-group'] = 'Câu lệnh SQL để xóa thành viên khỏi một nhóm'; +$lang['check-pass'] = 'Câu lệnh SQL để kiểm tra mật khẩu của thành viên. Có thể để trống nếu thông tin mật khẩu được tìm nạp trong thành viên chọn.'; diff --git a/lib/plugins/authpdo/lang/zh/lang.php b/lib/plugins/authpdo/lang/zh/lang.php new file mode 100644 index 0000000..be66754 --- /dev/null +++ b/lib/plugins/authpdo/lang/zh/lang.php @@ -0,0 +1,10 @@ + + */ +$lang['connectfail'] = '连接数据库失败'; +$lang['userexists'] = '抱歉,用户名已被使用。'; +$lang['writefail'] = '无法修改用户数据。请通知管理员'; diff --git a/lib/plugins/authpdo/lang/zh/settings.php b/lib/plugins/authpdo/lang/zh/settings.php new file mode 100644 index 0000000..9374b75 --- /dev/null +++ b/lib/plugins/authpdo/lang/zh/settings.php @@ -0,0 +1,26 @@ + + * @author Aaron Zhou + */ +$lang['debug'] = '打印详细的错误信息。应该在设定完成后禁用。'; +$lang['dsn'] = '连接到数据库的DSN'; +$lang['user'] = '以上数据库连接的用户名(sqlite 留空)'; +$lang['pass'] = '以上数据库连接的密码 (sqlite 留空)'; +$lang['select-user'] = '选择单一用户数据的SQL语句'; +$lang['select-user-groups'] = '选择单一用户所有用户组的SQL语句'; +$lang['select-groups'] = '选择所有有效组的SQL语句'; +$lang['insert-user'] = '向数据库插入一个新用户的SQL语句'; +$lang['delete-user'] = '从数据库中移除单个用户的SQL语句'; +$lang['list-users'] = '列出与筛选条件匹配用户的SQL语句'; +$lang['count-users'] = '统计与筛选条件匹配的用户数量的SQL语句'; +$lang['update-user-info'] = '更新单一用户全名和email地址的SQL语句'; +$lang['update-user-login'] = '更新单一用户登录名的SQL语句'; +$lang['update-user-pass'] = '更新单一用户密码的SQL语句'; +$lang['insert-group'] = '向数据库中插入一个新组的SQL语句'; +$lang['join-group'] = '把用户增加到现有用户组的 SQL 语句'; +$lang['leave-group'] = '把用户移除出现有用户组的 SQL 语句'; +$lang['check-pass'] = '查询用户密码的 SQL 语句(如密码在 select-user 查询时已经获取,则本设置可留空)'; diff --git a/lib/plugins/authpdo/plugin.info.txt b/lib/plugins/authpdo/plugin.info.txt new file mode 100644 index 0000000..e60ff0b --- /dev/null +++ b/lib/plugins/authpdo/plugin.info.txt @@ -0,0 +1,7 @@ +base authpdo +author Andreas Gohr +email andi@splitbrain.org +date 2016-08-20 +name authpdo plugin +desc Authenticate against a database via PDO +url https://www.dokuwiki.org/plugin:authpdo diff --git a/lib/plugins/authplain/auth.php b/lib/plugins/authplain/auth.php new file mode 100644 index 0000000..bc4ba33 --- /dev/null +++ b/lib/plugins/authplain/auth.php @@ -0,0 +1,489 @@ + + * @author Chris Smith + * @author Jan Schumann + */ +class auth_plugin_authplain extends AuthPlugin +{ + /** @var array user cache */ + protected $users; + + /** @var array filter pattern */ + protected $pattern = []; + + /** @var bool safe version of preg_split */ + protected $pregsplit_safe = false; + + /** + * Constructor + * + * Carry out sanity checks to ensure the object is + * able to operate. Set capabilities. + * + * @author Christopher Smith + */ + public function __construct() + { + parent::__construct(); + global $config_cascade; + + if (!@is_readable($config_cascade['plainauth.users']['default'])) { + $this->success = false; + } else { + if (@is_writable($config_cascade['plainauth.users']['default'])) { + $this->cando['addUser'] = true; + $this->cando['delUser'] = true; + $this->cando['modLogin'] = true; + $this->cando['modPass'] = true; + $this->cando['modName'] = true; + $this->cando['modMail'] = true; + $this->cando['modGroups'] = true; + } + $this->cando['getUsers'] = true; + $this->cando['getUserCount'] = true; + $this->cando['getGroups'] = true; + } + } + + /** + * Check user+password + * + * Checks if the given user exists and the given + * plaintext password is correct + * + * @author Andreas Gohr + * @param string $user + * @param string $pass + * @return bool + */ + public function checkPass($user, $pass) + { + $userinfo = $this->getUserData($user); + if ($userinfo === false) return false; + + return auth_verifyPassword($pass, $this->users[$user]['pass']); + } + + /** + * Return user info + * + * Returns info about the given user needs to contain + * at least these fields: + * + * name string full name of the user + * mail string email addres of the user + * grps array list of groups the user is in + * + * @author Andreas Gohr + * @param string $user + * @param bool $requireGroups (optional) ignored by this plugin, grps info always supplied + * @return array|false + */ + public function getUserData($user, $requireGroups = true) + { + if ($this->users === null) $this->loadUserData(); + return $this->users[$user] ?? false; + } + + /** + * Creates a string suitable for saving as a line + * in the file database + * (delimiters escaped, etc.) + * + * @param string $user + * @param string $pass + * @param string $name + * @param string $mail + * @param array $grps list of groups the user is in + * @return string + */ + protected function createUserLine($user, $pass, $name, $mail, $grps) + { + $groups = implode(',', $grps); + $userline = [$user, $pass, $name, $mail, $groups]; + $userline = str_replace('\\', '\\\\', $userline); // escape \ as \\ + $userline = str_replace(':', '\\:', $userline); // escape : as \: + $userline = str_replace('#', '\\#', $userline); // escape # as \ + $userline = implode(':', $userline) . "\n"; + return $userline; + } + + /** + * Create a new User + * + * Returns false if the user already exists, null when an error + * occurred and true if everything went well. + * + * The new user will be added to the default group by this + * function if grps are not specified (default behaviour). + * + * @author Andreas Gohr + * @author Chris Smith + * + * @param string $user + * @param string $pwd + * @param string $name + * @param string $mail + * @param array $grps + * @return bool|null|string + */ + public function createUser($user, $pwd, $name, $mail, $grps = null) + { + global $conf; + global $config_cascade; + + // user mustn't already exist + if ($this->getUserData($user) !== false) { + msg($this->getLang('userexists'), -1); + return false; + } + + $pass = auth_cryptPassword($pwd); + + // set default group if no groups specified + if (!is_array($grps)) $grps = [$conf['defaultgroup']]; + + // prepare user line + $userline = $this->createUserLine($user, $pass, $name, $mail, $grps); + + if (!io_saveFile($config_cascade['plainauth.users']['default'], $userline, true)) { + msg($this->getLang('writefail'), -1); + return null; + } + + $this->users[$user] = [ + 'pass' => $pass, + 'name' => $name, + 'mail' => $mail, + 'grps' => $grps + ]; + return $pwd; + } + + /** + * Modify user data + * + * @author Chris Smith + * @param string $user nick of the user to be changed + * @param array $changes array of field/value pairs to be changed (password will be clear text) + * @return bool + */ + public function modifyUser($user, $changes) + { + global $ACT; + global $config_cascade; + + // sanity checks, user must already exist and there must be something to change + if (($userinfo = $this->getUserData($user)) === false) { + msg($this->getLang('usernotexists'), -1); + return false; + } + + // don't modify protected users + if (!empty($userinfo['protected'])) { + msg(sprintf($this->getLang('protected'), hsc($user)), -1); + return false; + } + + if (!is_array($changes) || $changes === []) return true; + + // update userinfo with new data, remembering to encrypt any password + $newuser = $user; + foreach ($changes as $field => $value) { + if ($field == 'user') { + $newuser = $value; + continue; + } + if ($field == 'pass') $value = auth_cryptPassword($value); + $userinfo[$field] = $value; + } + + $userline = $this->createUserLine( + $newuser, + $userinfo['pass'], + $userinfo['name'], + $userinfo['mail'], + $userinfo['grps'] + ); + + if (!io_replaceInFile($config_cascade['plainauth.users']['default'], '/^' . $user . ':/', $userline, true)) { + msg('There was an error modifying your user data. You may need to register again.', -1); + // FIXME, io functions should be fail-safe so existing data isn't lost + $ACT = 'register'; + return false; + } + + if (isset($this->users[$user])) unset($this->users[$user]); + $this->users[$newuser] = $userinfo; + return true; + } + + /** + * Remove one or more users from the list of registered users + * + * @author Christopher Smith + * @param array $users array of users to be deleted + * @return int the number of users deleted + */ + public function deleteUsers($users) + { + global $config_cascade; + + if (!is_array($users) || $users === []) return 0; + + if ($this->users === null) $this->loadUserData(); + + $deleted = []; + foreach ($users as $user) { + // don't delete protected users + if (!empty($this->users[$user]['protected'])) { + msg(sprintf($this->getLang('protected'), hsc($user)), -1); + continue; + } + if (isset($this->users[$user])) $deleted[] = preg_quote($user, '/'); + } + + if ($deleted === []) return 0; + + $pattern = '/^(' . implode('|', $deleted) . '):/'; + if (!io_deleteFromFile($config_cascade['plainauth.users']['default'], $pattern, true)) { + msg($this->getLang('writefail'), -1); + return 0; + } + + // reload the user list and count the difference + $count = count($this->users); + $this->loadUserData(); + $count -= count($this->users); + return $count; + } + + /** + * Return a count of the number of user which meet $filter criteria + * + * @author Chris Smith + * + * @param array $filter + * @return int + */ + public function getUserCount($filter = []) + { + + if ($this->users === null) $this->loadUserData(); + + if ($filter === []) return count($this->users); + + $count = 0; + $this->constructPattern($filter); + + foreach ($this->users as $user => $info) { + $count += $this->filter($user, $info); + } + + return $count; + } + + /** + * Bulk retrieval of user data + * + * @author Chris Smith + * + * @param int $start index of first user to be returned + * @param int $limit max number of users to be returned + * @param array $filter array of field/pattern pairs + * @return array userinfo (refer getUserData for internal userinfo details) + */ + public function retrieveUsers($start = 0, $limit = 0, $filter = []) + { + + if ($this->users === null) $this->loadUserData(); + + Sort::ksort($this->users); + + $i = 0; + $count = 0; + $out = []; + $this->constructPattern($filter); + + foreach ($this->users as $user => $info) { + if ($this->filter($user, $info)) { + if ($i >= $start) { + $out[$user] = $info; + $count++; + if (($limit > 0) && ($count >= $limit)) break; + } + $i++; + } + } + + return $out; + } + + /** + * Retrieves groups. + * Loads complete user data into memory before searching for groups. + * + * @param int $start index of first group to be returned + * @param int $limit max number of groups to be returned + * @return array + */ + public function retrieveGroups($start = 0, $limit = 0) + { + $groups = []; + + if ($this->users === null) $this->loadUserData(); + foreach ($this->users as $info) { + $groups = array_merge($groups, array_diff($info['grps'], $groups)); + } + Sort::ksort($groups); + + if ($limit > 0) { + return array_splice($groups, $start, $limit); + } + return array_splice($groups, $start); + } + + /** + * Only valid pageid's (no namespaces) for usernames + * + * @param string $user + * @return string + */ + public function cleanUser($user) + { + global $conf; + + return cleanID(str_replace([':', '/', ';'], $conf['sepchar'], $user)); + } + + /** + * Only valid pageid's (no namespaces) for groupnames + * + * @param string $group + * @return string + */ + public function cleanGroup($group) + { + global $conf; + + return cleanID(str_replace([':', '/', ';'], $conf['sepchar'], $group)); + } + + /** + * Load all user data + * + * loads the user file into a datastructure + * + * @author Andreas Gohr + */ + protected function loadUserData() + { + global $config_cascade; + + $this->users = $this->readUserFile($config_cascade['plainauth.users']['default']); + + // support protected users + if (!empty($config_cascade['plainauth.users']['protected'])) { + $protected = $this->readUserFile($config_cascade['plainauth.users']['protected']); + foreach (array_keys($protected) as $key) { + $protected[$key]['protected'] = true; + } + $this->users = array_merge($this->users, $protected); + } + } + + /** + * Read user data from given file + * + * ignores non existing files + * + * @param string $file the file to load data from + * @return array + */ + protected function readUserFile($file) + { + $users = []; + if (!file_exists($file)) return $users; + + $lines = file($file); + foreach ($lines as $line) { + $line = preg_replace('/(?splitUserData($line); + $row = str_replace('\\:', ':', $row); + $row = str_replace('\\\\', '\\', $row); + $row = str_replace('\\#', '#', $row); + + $groups = array_values(array_filter(explode(",", $row[4]))); + + $users[$row[0]]['pass'] = $row[1]; + $users[$row[0]]['name'] = urldecode($row[2]); + $users[$row[0]]['mail'] = $row[3]; + $users[$row[0]]['grps'] = $groups; + } + return $users; + } + + /** + * Get the user line split into it's parts + * + * @param string $line + * @return string[] + */ + protected function splitUserData($line) + { + $data = preg_split('/(? + * + * @param string $user User login + * @param array $info User's userinfo array + * @return bool + */ + protected function filter($user, $info) + { + foreach ($this->pattern as $item => $pattern) { + if ($item == 'user') { + if (!preg_match($pattern, $user)) return false; + } elseif ($item == 'grps') { + if (!count(preg_grep($pattern, $info['grps']))) return false; + } elseif (!preg_match($pattern, $info[$item])) { + return false; + } + } + return true; + } + + /** + * construct a filter pattern + * + * @param array $filter + */ + protected function constructPattern($filter) + { + $this->pattern = []; + foreach ($filter as $item => $pattern) { + $this->pattern[$item] = '/' . str_replace('/', '\/', $pattern) . '/i'; // allow regex characters + } + } +} diff --git a/lib/plugins/authplain/lang/af/lang.php b/lib/plugins/authplain/lang/af/lang.php new file mode 100644 index 0000000..29742cf --- /dev/null +++ b/lib/plugins/authplain/lang/af/lang.php @@ -0,0 +1,6 @@ + + */ +$lang['userexists'] = 'Вече съществува потребител с избраното име.'; +$lang['usernotexists'] = 'За съжаление потребителят не съществува.'; diff --git a/lib/plugins/authplain/lang/bn/lang.php b/lib/plugins/authplain/lang/bn/lang.php new file mode 100644 index 0000000..a90c370 --- /dev/null +++ b/lib/plugins/authplain/lang/bn/lang.php @@ -0,0 +1,7 @@ + + */ +$lang['userexists'] = 'ببوورە، بەکارهێنەرێک کە ئەم چوونەژوورەوەی هەیە.'; +$lang['usernotexists'] = 'ببوورە، ئەم بەکارهێنەرە بوونی نییە.'; +$lang['writefail'] = 'ناتوانێت دەستکاری داتای بەکارهێنەر بکات. تکایە ویکی-بەڕێوەبەرەکە بکەرەوە'; +$lang['protected'] = 'داتای بەکارهێنەر %s پارێزراوە و ناتوانرێت دەستکاری بکرێت یان بسڕدرێتەوە.'; diff --git a/lib/plugins/authplain/lang/cs/lang.php b/lib/plugins/authplain/lang/cs/lang.php new file mode 100644 index 0000000..4eaacdc --- /dev/null +++ b/lib/plugins/authplain/lang/cs/lang.php @@ -0,0 +1,12 @@ + + * @author Daniel Slováček + */ +$lang['userexists'] = 'Uživatel se stejným jménem už je zaregistrován.'; +$lang['usernotexists'] = 'Omlouváme se, uživatel tohoto jména neexistuje.'; +$lang['writefail'] = 'Nelze změnit údaje uživatele. Informujte prosím správce wiki'; +$lang['protected'] = 'Data pro uživatele %s jsou chráněna a nemůžou být upravena nebo smazána.'; diff --git a/lib/plugins/authplain/lang/cy/lang.php b/lib/plugins/authplain/lang/cy/lang.php new file mode 100644 index 0000000..7f789e5 --- /dev/null +++ b/lib/plugins/authplain/lang/cy/lang.php @@ -0,0 +1,8 @@ + + * @author Kenneth Schack Banner + */ +$lang['userexists'] = 'Dette brugernavn er allerede i brug.'; +$lang['usernotexists'] = 'Beklager, brugeren eksisterer ikke.'; +$lang['writefail'] = 'Ude af stand til at redigere bruger data. Kontakt venligst Wiki-Administratoren'; +$lang['protected'] = 'Data for brugeren %s er beskyttet, og kan ikke ændres eller slettes.'; diff --git a/lib/plugins/authplain/lang/de-informal/lang.php b/lib/plugins/authplain/lang/de-informal/lang.php new file mode 100644 index 0000000..c087073 --- /dev/null +++ b/lib/plugins/authplain/lang/de-informal/lang.php @@ -0,0 +1,11 @@ + + */ +$lang['userexists'] = 'Der Benutzername existiert leider schon.'; +$lang['usernotexists'] = 'Entschuldigung, dieser Nutzer existiert nicht.'; +$lang['writefail'] = 'Konnte Nutzer-Daten nicht modifizieren. Bitte informiere einen Admin.'; +$lang['protected'] = 'Die Daten für den Nutzer %s sind geschützt und können nicht verändert oder gelöscht werden.'; diff --git a/lib/plugins/authplain/lang/de/lang.php b/lib/plugins/authplain/lang/de/lang.php new file mode 100644 index 0000000..e524372 --- /dev/null +++ b/lib/plugins/authplain/lang/de/lang.php @@ -0,0 +1,12 @@ + + * @author Carsten Perthel + */ +$lang['userexists'] = 'Der Benutzername existiert leider schon.'; +$lang['usernotexists'] = 'Dieser Benutzer existiert nicht.'; +$lang['writefail'] = 'Kann Benutzerdaten nicht ändern. Bitte informieren Sie den Wiki-Administratoren'; +$lang['protected'] = 'Die Daten des Benutzers %s sind geschützt und können nicht verändert oder gelöscht werden.'; diff --git a/lib/plugins/authplain/lang/el/lang.php b/lib/plugins/authplain/lang/el/lang.php new file mode 100644 index 0000000..d5b65ff --- /dev/null +++ b/lib/plugins/authplain/lang/el/lang.php @@ -0,0 +1,11 @@ + + */ +$lang['userexists'] = 'Αυτός ο λογαριασμός υπάρχει ήδη.'; +$lang['usernotexists'] = 'Λυπάμαι, αυτός ο χρήστης δεν υπάρχει.'; +$lang['writefail'] = 'Δεν μπόρεσε να τροποποιήσει τα δεδομένα χρήστη. Παρακαλώ ενημερώστε το Wiki-Admin'; +$lang['protected'] = ' Τα δεδομένα χρήστη %s είναι εμπιστευτικά και δεν μπορούν να τροποποιηθούν ή απαλειφθούν.'; diff --git a/lib/plugins/authplain/lang/en/lang.php b/lib/plugins/authplain/lang/en/lang.php new file mode 100644 index 0000000..7108f38 --- /dev/null +++ b/lib/plugins/authplain/lang/en/lang.php @@ -0,0 +1,9 @@ + + */ +$lang['userexists'] = 'Pardonu, ĉi tiu uzanto-nomo jam ekzistas.'; +$lang['usernotexists'] = 'Pardonu, tiu uzanto ne ekzistas.'; diff --git a/lib/plugins/authplain/lang/es/lang.php b/lib/plugins/authplain/lang/es/lang.php new file mode 100644 index 0000000..b81bbb8 --- /dev/null +++ b/lib/plugins/authplain/lang/es/lang.php @@ -0,0 +1,12 @@ + + * @author Enny Rodriguez + */ +$lang['userexists'] = 'Lo siento, ya existe un usuario con este nombre.'; +$lang['usernotexists'] = 'Lo sentimos, no existe ese usuario.'; +$lang['writefail'] = 'No es posible modificar los datos del usuario. Por favor, informa al Administrador del Wiki'; +$lang['protected'] = 'Los datos del usuario %s están protegidos y no pueden ser modificados o eliminados.'; diff --git a/lib/plugins/authplain/lang/et/lang.php b/lib/plugins/authplain/lang/et/lang.php new file mode 100644 index 0000000..610703f --- /dev/null +++ b/lib/plugins/authplain/lang/et/lang.php @@ -0,0 +1,7 @@ + + * @author sam01 + */ +$lang['userexists'] = 'نام کاربری‌ای که وارد کردید قبلن استفاده شده است. خواهشمندیم یک نام دیگر انتخاب کنید.'; +$lang['usernotexists'] = 'متاسفانه این کاربر وجود ندارد.'; +$lang['writefail'] = 'امکان ویرایش اطلاعات کاربر وجود ندارد. لطفا ادمین ویکی را مطلع نمایید.'; +$lang['protected'] = 'داده‌ها برای کاربر %s محافظت شده و قابل تغییر نیست یا حذف شده اند.'; diff --git a/lib/plugins/authplain/lang/fi/lang.php b/lib/plugins/authplain/lang/fi/lang.php new file mode 100644 index 0000000..efd96ea --- /dev/null +++ b/lib/plugins/authplain/lang/fi/lang.php @@ -0,0 +1,7 @@ + + * @author Nicolas Friedli + * @author Schplurtz le Déboulonné + */ +$lang['userexists'] = 'Désolé, ce nom d\'utilisateur est déjà pris.'; +$lang['usernotexists'] = 'Désolé, cet utilisateur n\'existe pas.'; +$lang['writefail'] = 'Impossible de modifier les données utilisateur. Merci d\'en informer l\'administrateur du wiki.'; +$lang['protected'] = 'Les données du compte d\'utilisateur %s sont protégées et ne peuvent être ni modifiées ni supprimées.'; diff --git a/lib/plugins/authplain/lang/gl/lang.php b/lib/plugins/authplain/lang/gl/lang.php new file mode 100644 index 0000000..35138d3 --- /dev/null +++ b/lib/plugins/authplain/lang/gl/lang.php @@ -0,0 +1,6 @@ + + */ +$lang['userexists'] = 'Korisnik s tim korisničkim imenom već postoji.'; +$lang['usernotexists'] = 'Nažalost korisnik ne postoji'; +$lang['writefail'] = 'Ne mogu izmijeniti korisničke podatke. Molim obavijestite svog Wiki administratora'; +$lang['protected'] = 'Podaci za korisnika %s su zaštićeni i ne mogu biti izmijenjeni ili obrisani.'; diff --git a/lib/plugins/authplain/lang/hu/lang.php b/lib/plugins/authplain/lang/hu/lang.php new file mode 100644 index 0000000..289a090 --- /dev/null +++ b/lib/plugins/authplain/lang/hu/lang.php @@ -0,0 +1,12 @@ + + * @author Marton Sebok + */ +$lang['userexists'] = 'Sajnáljuk, ilyen azonosítójú felhasználónk már van.'; +$lang['usernotexists'] = 'Sajnos ez a felhasználó nem létezik.'; +$lang['writefail'] = 'A felhasználói adatok módosítása sikertelen. Kérlek, fordulj a wiki rendszergazdájához!'; +$lang['protected'] = 'A %s felhasználó adatai védettek, nem lehet módosítani vagy törölni.'; diff --git a/lib/plugins/authplain/lang/ia/lang.php b/lib/plugins/authplain/lang/ia/lang.php new file mode 100644 index 0000000..7596f3f --- /dev/null +++ b/lib/plugins/authplain/lang/ia/lang.php @@ -0,0 +1,6 @@ + + * @author Riccardo + */ +$lang['userexists'] = 'Il nome utente inserito esiste già.'; +$lang['usernotexists'] = 'Spiacente, quell\'utente non esiste.'; +$lang['writefail'] = 'Impossibile modificare i dati utente. Per favore informa l\'Amministratore del Wiki'; +$lang['protected'] = 'I dati relativi all\'utente %s sono protetti e non possono essere modificati o cancellati.'; diff --git a/lib/plugins/authplain/lang/ja/lang.php b/lib/plugins/authplain/lang/ja/lang.php new file mode 100644 index 0000000..cfaca13 --- /dev/null +++ b/lib/plugins/authplain/lang/ja/lang.php @@ -0,0 +1,12 @@ + + * @author Hideaki SAWADA + */ +$lang['userexists'] = '恐れ入りますが、このユーザー名は既に存在しています。'; +$lang['usernotexists'] = '恐れ入りますが、このユーザーは未登録です。'; +$lang['writefail'] = 'ユーザーデータを変更できません。管理者に問い合わせてください。'; +$lang['protected'] = 'ユーザ %s のデータは保護されており、変更・削除はできません。'; diff --git a/lib/plugins/authplain/lang/ka/lang.php b/lib/plugins/authplain/lang/ka/lang.php new file mode 100644 index 0000000..1a1a297 --- /dev/null +++ b/lib/plugins/authplain/lang/ka/lang.php @@ -0,0 +1,7 @@ + + */ +$lang['userexists'] = '죄송하지만 같은 이름을 사용하는 사용자가 있습니다.'; +$lang['usernotexists'] = '죄송하지만 해당 사용자가 존재하지 않습니다.'; +$lang['writefail'] = '사용자 데이터를 수정할 수 없습니다. 위키 관리자에게 문의하시기 바랍니다'; +$lang['protected'] = '%s 사용자의 데이터는 잠겨 있어 수정하거나 삭제할 수 없습니다.'; diff --git a/lib/plugins/authplain/lang/ku/lang.php b/lib/plugins/authplain/lang/ku/lang.php new file mode 100644 index 0000000..43406d6 --- /dev/null +++ b/lib/plugins/authplain/lang/ku/lang.php @@ -0,0 +1,7 @@ + + * @author Sjoerd + */ +$lang['userexists'] = 'Er bestaat al een gebruiker met deze loginnaam.'; +$lang['usernotexists'] = 'Sorry, deze gebruiker bestaat niet.'; +$lang['writefail'] = 'Onmogelijk om de gebruikers data te wijzigen. Gelieve de Wiki-Admin te informeren.'; +$lang['protected'] = 'Gegevens van gebruiker %s zijn beschermd en kunnen niet worden veranderd of verwijderd'; diff --git a/lib/plugins/authplain/lang/no/lang.php b/lib/plugins/authplain/lang/no/lang.php new file mode 100644 index 0000000..a92c262 --- /dev/null +++ b/lib/plugins/authplain/lang/no/lang.php @@ -0,0 +1,11 @@ + + */ +$lang['userexists'] = 'Det finnes allerede en konto med dette brukernavnet.'; +$lang['usernotexists'] = 'Beklager, denne bruker fins ikke.'; +$lang['writefail'] = 'Klarte ikke endre brukerdata. Dette bør meldes til wikiens administrator'; +$lang['protected'] = 'Data for bruker %s er beskyttet og kan ikke endres eller slettes.'; diff --git a/lib/plugins/authplain/lang/pl/lang.php b/lib/plugins/authplain/lang/pl/lang.php new file mode 100644 index 0000000..95b46fe --- /dev/null +++ b/lib/plugins/authplain/lang/pl/lang.php @@ -0,0 +1,11 @@ + + */ +$lang['userexists'] = 'Użytkownik o tej nazwie już istnieje.'; +$lang['usernotexists'] = 'Przepraszamy, użytkownik nie istnieje'; +$lang['writefail'] = 'Nie można modyfikować danych użytkownika. Proszę skontaktować się z administratorem '; +$lang['protected'] = 'Dane użytkownika %s są chronione, nie mogą być modyfikowane oraz usuwane'; diff --git a/lib/plugins/authplain/lang/pt-br/lang.php b/lib/plugins/authplain/lang/pt-br/lang.php new file mode 100644 index 0000000..ee42b83 --- /dev/null +++ b/lib/plugins/authplain/lang/pt-br/lang.php @@ -0,0 +1,12 @@ + + * @author Felipe Castro + */ +$lang['userexists'] = 'Desculpe, mas já existe um usuário com esse nome.'; +$lang['usernotexists'] = 'Desculpe, mas esse usuário não existe.'; +$lang['writefail'] = 'Não foi possível modificar os dados do usuário. Por favor, informe ao administrador do Wiki.'; +$lang['protected'] = 'Dados para o usuário %s estão protegidos e não podem ser modificados ou apagados.'; diff --git a/lib/plugins/authplain/lang/pt/lang.php b/lib/plugins/authplain/lang/pt/lang.php new file mode 100644 index 0000000..583c6b7 --- /dev/null +++ b/lib/plugins/authplain/lang/pt/lang.php @@ -0,0 +1,13 @@ + + * @author Paulo Carmino + * @author Guilherme Sá + */ +$lang['userexists'] = 'Este nome de usuário já existe. Escolha outro.'; +$lang['usernotexists'] = 'Desculpe, esse usuário não existe.'; +$lang['writefail'] = 'Não foi possível modificar dados do usuário. Favor informar ao Wiki-Admin.'; +$lang['protected'] = 'Os dados do usuário %s estão protegidos e não podem ser modificados ou excluídos.'; diff --git a/lib/plugins/authplain/lang/ro/lang.php b/lib/plugins/authplain/lang/ro/lang.php new file mode 100644 index 0000000..d549e1f --- /dev/null +++ b/lib/plugins/authplain/lang/ro/lang.php @@ -0,0 +1,7 @@ + + * @author Aleksandr Selivanov + * @author Radimir + */ +$lang['userexists'] = 'Извините, пользователь с таким логином уже существует.'; +$lang['usernotexists'] = 'Этот пользователь не зарегистрирован.'; +$lang['writefail'] = 'Невозможно обновить данные пользователя. Свяжитесь с администратором вики'; +$lang['protected'] = 'Данные пользователя %s защищены и не могут быть изменены или удалены.'; diff --git a/lib/plugins/authplain/lang/sk/lang.php b/lib/plugins/authplain/lang/sk/lang.php new file mode 100644 index 0000000..d1cfbfd --- /dev/null +++ b/lib/plugins/authplain/lang/sk/lang.php @@ -0,0 +1,11 @@ + + */ +$lang['userexists'] = 'Užívateľ s rovnakým menom je už zaregistrovaný.'; +$lang['usernotexists'] = 'Ľutujem, daný používateľ neexistuje.'; +$lang['writefail'] = 'Nie je možné zmeniť údaje používateľa, informujte prosím administrátora Wiki.'; +$lang['protected'] = 'Údaje používateľa %s sú chránené a nemôžu by zmenené alebo vymazané.'; diff --git a/lib/plugins/authplain/lang/sl/lang.php b/lib/plugins/authplain/lang/sl/lang.php new file mode 100644 index 0000000..46eb4bf --- /dev/null +++ b/lib/plugins/authplain/lang/sl/lang.php @@ -0,0 +1,7 @@ + + * @author Tor Härnqvist + */ +$lang['userexists'] = 'Det finns redan en användare med det användarnamnet.'; +$lang['usernotexists'] = 'Tyvärr, den användaren existerar inte.'; +$lang['writefail'] = 'Kunde inte ändra användardata. Var god informera Wiki-administratören'; +$lang['protected'] = 'Datan för användare %s är skyddad och kan inte modifieras eller raderas.'; diff --git a/lib/plugins/authplain/lang/th/lang.php b/lib/plugins/authplain/lang/th/lang.php new file mode 100644 index 0000000..9e9e104 --- /dev/null +++ b/lib/plugins/authplain/lang/th/lang.php @@ -0,0 +1,7 @@ + + */ +$lang['userexists'] = 'Користувач з таким іменем вже існує.'; +$lang['usernotexists'] = 'Вибачте, такого користувача не існує.'; diff --git a/lib/plugins/authplain/lang/vi/lang.php b/lib/plugins/authplain/lang/vi/lang.php new file mode 100644 index 0000000..ac8995b --- /dev/null +++ b/lib/plugins/authplain/lang/vi/lang.php @@ -0,0 +1,11 @@ + + */ +$lang['userexists'] = 'Xin lỗi, thành viên có thông tin đăng nhập này đã tồn tại.'; +$lang['usernotexists'] = 'Xin lỗi, thành viên đó không tồn tại.'; +$lang['writefail'] = 'Không thể sửa đổi dữ liệu thành viên. Vui lòng thông báo cho Quản trị viên Wiki'; +$lang['protected'] = 'Dữ liệu cho thành viên %s được bảo vệ và không thể sửa đổi hoặc xóa.'; diff --git a/lib/plugins/authplain/lang/zh-tw/lang.php b/lib/plugins/authplain/lang/zh-tw/lang.php new file mode 100644 index 0000000..8171465 --- /dev/null +++ b/lib/plugins/authplain/lang/zh-tw/lang.php @@ -0,0 +1,7 @@ + + * @author tai + */ +$lang['userexists'] = '对不起,该用户名已经存在。'; +$lang['usernotexists'] = '抱歉,该用户不存在'; +$lang['writefail'] = '无法修改用户数据。请联系维基管理员'; +$lang['protected'] = '用户 %s 的数据被保护和无法被编辑或删除。'; diff --git a/lib/plugins/authplain/plugin.info.txt b/lib/plugins/authplain/plugin.info.txt new file mode 100644 index 0000000..c09dbcb --- /dev/null +++ b/lib/plugins/authplain/plugin.info.txt @@ -0,0 +1,7 @@ +base authplain +author Andreas Gohr +email andi@splitbrain.org +date 2015-07-18 +name Plain Auth Plugin +desc Provides user authentication against DokuWiki's local password storage +url http://www.dokuwiki.org/plugin:authplain diff --git a/lib/plugins/bureaucracy/LICENSE b/lib/plugins/bureaucracy/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/lib/plugins/bureaucracy/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/lib/plugins/bureaucracy/action.php b/lib/plugins/bureaucracy/action.php new file mode 100644 index 0000000..a4a7a4e --- /dev/null +++ b/lib/plugins/bureaucracy/action.php @@ -0,0 +1,60 @@ + + * @author Adrian Lang + */ +// must be run within Dokuwiki +if (!defined('DOKU_INC')) die(); + +/** + * Class action_plugin_bureaucracy + */ +class action_plugin_bureaucracy extends DokuWiki_Action_Plugin { + + /** + * Registers a callback function for a given event + */ + public function register(Doku_Event_Handler $controller) { + $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'ajax'); + } + + /** + * @param Doku_Event$event + * @param $param + */ + public function ajax(Doku_Event $event, $param) { + if ($event->data !== 'bureaucracy_user_field') { + return; + } + $event->stopPropagation(); + $event->preventDefault(); + + $search = $_REQUEST['search']; + + /** @var DokuWiki_Auth_Plugin $auth */ + global $auth; + $users = array(); + foreach($auth->retrieveUsers() as $username => $data) { + if ($search === '' || // No search + stripos($username, $search) === 0 || // Username (prefix) + stripos($data['name'], $search) !== false) { // Full name + $users[$username] = $data['name']; + } + if (count($users) === 10) { + break; + } + } + + if (count($users) === 1 && key($users) === $search) { + $users = array(); + } + + echo json_encode($users); + } +} diff --git a/lib/plugins/bureaucracy/conf/default.php b/lib/plugins/bureaucracy/conf/default.php new file mode 100644 index 0000000..ed0463f --- /dev/null +++ b/lib/plugins/bureaucracy/conf/default.php @@ -0,0 +1,4 @@ + + */ +class helper_plugin_bureaucracy_action extends syntax_plugin_bureaucracy { + + /** + * Return false to prevent DokuWiki reusing instances of the plugin + * + * @return bool + */ + public function isSingleton() { + return false; + } + + /** + * Handle the user input [required] + * + * This function needs to be implemented to accept the user data collected + * from the form. Data has to be grabbed from $_POST['bureaucracy'] using + * the indicies in the 'idx' members of the $data items. + * + * @param helper_plugin_bureaucracy_field[] $fields the list of fields in the form + * @param string $thanks the thank you message as defined in the form + * or default one. Might be modified by the action + * before returned + * @param array $argv additional arguments passed to the action + * @return bool|string false on error, $thanks on success + */ + public function run($fields, $thanks, $argv){ + msg('ERROR: called action %s did not implement a run() function'); + return false; + } + + /** + * Adds some language related replacement patterns + */ + function prepareLanguagePlaceholder() { + global $ID; + global $conf; + + $this->patterns['__lang__'] = '/@LANG@/'; + $this->values['__lang__'] = $conf['lang']; + + $this->patterns['__trans__'] = '/@TRANS@/'; + $this->values['__trans__'] = ''; + + /** @var helper_plugin_translation $trans */ + $trans = plugin_load('helper', 'translation'); + if (!$trans) return; + + $this->values['__trans__'] = $trans->getLangPart($ID); + $this->values['__lang__'] = $trans->realLC(''); + } + + /** + * Adds replacement pattern for fieldlabels (e.g @@Label@@) + * + * @param helper_plugin_bureaucracy_field $field + */ + function prepareFieldReplacement($field) { + $label = $field->getParam('label'); + + if(!is_null($label)) { + $this->patterns[$label] = $field->getReplacementPattern(); + $this->values[$label] = $field->getReplacementValue(); + } + } + + /** + * Adds to replacement patterns + */ + function prepareNoincludeReplacement() { + $this->patterns['__noinclude__'] = '/(.*?)<\/noinclude>/is'; + $this->values['__noinclude__'] = ''; + } + + /** + * Generate field replacements + * + * @param helper_plugin_bureaucracy_field[] $fields List of field objects + * @return array + */ + function prepareFieldReplacements($fields) { + foreach ($fields as $field) { + //field replacements + $this->prepareFieldReplacement($field); + } + } + + /** + * Returns ACL access level of the user or the (virtual) 'runas' user + * + * @param string $id pageid + * @return int + */ + protected function aclcheck($id) { + $runas = $this->getConf('runas'); + + if($runas) { + $auth = auth_aclcheck($id, $runas, array()); + } else { + $auth = auth_quickaclcheck($id); + } + return $auth; + + } + + /** + * Available methods + * + * @return array + */ + public function getMethods() { + $result = array(); + $result[] = array( + 'name' => 'run', + 'desc' => 'Handle the user input', + 'params' => array( + 'fields' => 'helper_plugin_bureaucracy_field[]', + 'thanks' => 'string', + 'argv' => 'array' + ), + 'return' => array('false on error, thanks message on success' => 'bool|string') + ); + return $result; + } + +} diff --git a/lib/plugins/bureaucracy/helper/actionmail.php b/lib/plugins/bureaucracy/helper/actionmail.php new file mode 100644 index 0000000..698e6c0 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/actionmail.php @@ -0,0 +1,212 @@ +prepareNamespacetemplateReplacements(); + $this->prepareDateTimereplacements(); + $this->prepareLanguagePlaceholder(); + $this->prepareNoincludeReplacement(); + $this->prepareFieldReplacements($fields); + + $evdata = [ + 'fields' => $fields, + 'values' => &$this->values + ]; + $event = new Doku_Event('PLUGIN_BUREAUCRACY_EMAIL_SEND', $evdata); + if($event->advise_before()) { + //set default subject + $this->subject = sprintf($this->getLang('mailsubject'), $ID); + + //build html&text table, collect replyto and subject + list($table_html, $table_text) = $this->processFieldsBuildTable($fields, $mail); + + //Body + if($this->mailtemplate) { + //show template + $this->patterns['__tablehtml__'] = '/@TABLEHTML@/'; + $this->patterns['__tabletext__'] = '/@TABLETEXT@/'; + $this->values['__tablehtml__'] = $table_html; + $this->values['__tabletext__'] = $table_text; + + list($this->_mail_html, $this->_mail_text) = $this->getContent(); + + } else { + //show simpel listing + $this->_mail_html .= sprintf($this->getLang('mailintro')."

    ", dformat()); + $this->_mail_html .= $table_html; + + $this->_mail_text .= sprintf($this->getLang('mailintro')."\n\n", dformat()); + $this->_mail_text .= $table_text; + } + $mail->setBody($this->_mail_text,null,null,$this->_mail_html); + + // Reply-to + if(!empty($this->replyto)) { + $replyto = $mail->cleanAddress($this->replyto); + $mail->setHeader('Reply-To', $replyto, false); + } + + // To + $to = $this->replace(implode(',',$argv)); // get recipient address(es) + $to = $mail->cleanAddress($to); + $mail->to($to); + + // From + $mail->from($conf['mailfrom']); + + // Subject + $this->subject = $this->replace($this->subject); + $mail->subject($this->subject); + + if(!$mail->send()) { + throw new Exception($this->getLang('e_mail')); + } + } + $event->advise_after(); + + return '

    ' . $thanks . '

    '; + } + + /** + * Create html and plain table of the field + * and collect values for subject and replyto + * + * @param helper_plugin_bureaucracy_field[] $fields + * @param Mailer $mail + * @return array of html and text table + */ + protected function processFieldsBuildTable($fields, $mail) { + global $ID; + + $table_html = ''; + $table_text = ''; + + foreach($fields as $field) { + $html = $text = ''; + $value = $field->getParam('value'); + $label = $field->getParam('label'); + + switch($field->getFieldType()) { + case 'fieldset': + if(!empty($field->depends_on)) { + //print fieldset only if depend condition is true + foreach($fields as $field_tmp) { + if($field_tmp->getParam('label') === $field->depends_on[0] && $field_tmp->getParam('value') === $field->depends_on[1] ) { + list($html, $text) = $this->mail_buildRow($label); + } + } + } else { + list($html, $text) = $this->mail_buildRow($label); + } + break; + case 'file': + if($value === null || $label === null) break; //print attachment only if field was visible + $file = $field->getParam('file'); + if(!$file['size']) { + $message = $this->getLang('attachmentMailEmpty'); + } else if($file['size'] > $this->getConf('maxEmailAttachmentSize')) { + $message = $file['name'] . ' ' . $this->getLang('attachmentMailToLarge'); + msg(sprintf($this->getLang('attachmentMailToLarge_userinfo'), hsc($file['name']), filesize_h($this->getConf('maxEmailAttachmentSize'))), 2); + } else { + $message = $file['name']; + $mail->attachFile($file['tmp_name'], $file['type'], $file['name']); + } + list($html, $text) = $this->mail_buildRow($label, $message); + break; + case 'subject': + $this->subject = $label; + break; + case 'usemailtemplate': + if (!is_null($field->getParam('template')) ) { + $this->mailtemplate = $this->replace($field->getParam('template')); + resolve_pageid(getNS($ID), $this->mailtemplate, $ignored); + } + break; + + default: + if($value === null || $label === null) break; + if(is_array($value)) $value = implode(', ', $value); + list($html, $text) = $this->mail_buildRow($label, $value); + + if(!is_null($field->getParam('replyto'))) { + $this->replyto[] = $value; + } + } + $table_html .= $html; + $table_text .= $text; + } + $table_html .= '
    '; + + return array($table_html, $table_text); + } + + /** + * Build a row + * + * @param $column1 + * @param null $column2 + * @return array of html and text row + */ + protected function mail_buildRow($column1,$column2=null) { + if($column2 === null) { + $html = ''.hsc($column1).''; + $text = "\n=====".$column1.'====='; + } else { + $html = ''.hsc($column1).''.hsc($column2).''; + $text = "\n $column1 \t\t $column2"; + } + return array($html, $text); + } + + /** + * Parse mail template in html and text, and perform replacements + * + * @return array html and text content + */ + protected function getContent() { + $content = rawWiki($this->mailtemplate); + $html = ''; + $text = ''; + + if(preg_match_all('#(.*?)#is', $content, $matches)) { + foreach($matches[1] as $index => $codeoptions) { + list($syntax,) = explode(' ', trim($codeoptions), 2); + if($syntax == 'html') { + $html = $matches[2][$index]; + } + if($syntax == 'text' || $syntax == '') { + $text = $matches[2][$index]; + } + } + } + return array( + $this->replace($html), + $this->replace($text) + ); + } +} +// vim:ts=4:sw=4:et:enc=utf-8: diff --git a/lib/plugins/bureaucracy/helper/actionscript.php b/lib/plugins/bureaucracy/helper/actionscript.php new file mode 100644 index 0000000..f308721 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/actionscript.php @@ -0,0 +1,62 @@ +validateScriptName($scriptName)) { + $cleanedScriptName = hsc($scriptName); + throw new InvalidArgumentException("The supplied scriptname \"$cleanedScriptName\" is invalid! It must conform to {hsc($this->scriptNamePattern)}!"); + } + + $path = DOKU_CONF . 'plugin/bureaucracy/' . $scriptName; + + if (!file_exists($path)) { + $shortPath = 'conf/plugin/bureaucracy/' . $scriptName; + throw new InvalidArgumentException("Script $shortPath doesn't exist!"); + } + + require $path; + + $classFragment = substr($scriptName, 0, strpos($scriptName, '.')); + $className = 'helper_plugin_bureaucracy_handler_' . $classFragment; + + $deprecatedClassName = 'bureaucracy_handler_' . $classFragment; + if (!class_exists($className) && class_exists($deprecatedClassName)) { + msg("Please change this script's class-name to $className. +Your current scheme $deprecatedClassName is deprecated and will stop working in the future.", 2); + $className = $deprecatedClassName; + } + + /** @var dokuwiki\plugin\bureaucracy\interfaces\bureaucracy_handler_interface $handler */ + $handler = new $className; + + if (!is_a($handler, dokuwiki\plugin\bureaucracy\interfaces\bureaucracy_handler_interface::class)) { + throw new InvalidArgumentException('The handler must implement the interface dokuwiki\\plugin\\bureaucracy\\interfaces\\bureaucracy_handler_interface !'); + } + + return $handler->handleData($fields, $thanks); + } + + /** + * @param $scriptName + * + * @return bool + */ + protected function validateScriptName($scriptName) { + $valid = preg_match($this->scriptNamePattern, $scriptName); + return $valid === 1; + } + +} diff --git a/lib/plugins/bureaucracy/helper/actiontemplate.php b/lib/plugins/bureaucracy/helper/actiontemplate.php new file mode 100644 index 0000000..2d78ac8 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/actiontemplate.php @@ -0,0 +1,464 @@ + + */ + +class helper_plugin_bureaucracy_actiontemplate extends helper_plugin_bureaucracy_action { + + var $targetpages; + var $pagename; + + /** + * Performs template action + * + * @param helper_plugin_bureaucracy_field[] $fields array with form fields + * @param string $thanks thanks message + * @param array $argv array with entries: template, pagename, separator + * @return array|mixed + * + * @throws Exception + */ + public function run($fields, $thanks, $argv) { + global $conf; + + [$tpl, $this->pagename] = $argv; + $sep = $argv[2] ?? $conf['sepchar']; + + $this->patterns = array(); + $this->values = array(); + $this->targetpages = array(); + + $this->prepareNamespacetemplateReplacements(); + $this->prepareDateTimereplacements(); + $this->prepareLanguagePlaceholder(); + $this->prepareNoincludeReplacement(); + $this->prepareFieldReplacements($fields); + + $evdata = array( + 'patterns' => &$this->patterns, + 'values' => &$this->values, + 'fields' => $fields, + 'action' => $this + ); + + $event = new Doku_Event('PLUGIN_BUREAUCRACY_PAGENAME', $evdata); + if ($event->advise_before()) { + $this->buildTargetPagename($fields, $sep); + } + $event->advise_after(); + + //target&template(s) from addpage fields + $this->getAdditionalTargetpages($fields); + //target&template(s) from action field + $tpl = $this->getActionTargetpages($tpl); + + if(empty($this->targetpages)) { + throw new Exception(sprintf($this->getLang('e_template'), $tpl)); + } + + $this->checkTargetPageNames(); + + $this->processUploads($fields); + $this->replaceAndSavePages($fields); + + $ret = $this->buildThankYouPage($thanks); + + return $ret; + } + + /** + * Prepare and resolve target page + * + * @param helper_plugin_bureaucracy_field[] $fields List of field objects + * @param string $sep Separator between fields for page id + * @throws Exception missing pagename + */ + protected function buildTargetPagename($fields, $sep) { + global $ID; + + foreach ($fields as $field) { + $pname = $field->getParam('pagename'); + if (!is_null($pname)) { + if (is_array($pname)) $pname = implode($sep, $pname); + $this->pagename .= $sep . $pname; + } + } + + $resolver = new PageResolver(getNS($ID)); + $this->pagename = $resolver->resolveId($this->replace($this->pagename)); + + if ($this->pagename === '') { + throw new Exception($this->getLang('e_pagename')); + } + } + + /** + * Handle templates from addpage field + * + * @param helper_plugin_bureaucracy_field[] $fields List of field objects + * @return array + */ + function getAdditionalTargetpages($fields) { + global $ID; + $ns = getNS($ID); + + foreach ($fields as $field) { + if (!is_null($field->getParam('page_tpl')) && !is_null($field->getParam('page_tgt')) ) { + $resolver = new PageResolver($ns); + + //template + $templatepage = $this->replace($field->getParam('page_tpl')); + $templatepage = $resolver->resolveId($templatepage); + + //target + $relativetargetpage = $resolver->resolveId($field->getParam('page_tgt')); + $targetpage = "$this->pagename:$relativetargetpage"; + + $auth = $this->aclcheck($templatepage); // runas + if ($auth >= AUTH_READ ) { + $this->addParsedTargetpage($targetpage, $templatepage); + } + } + } + } + + /** + * Returns raw pagetemplate contents for the ID's namespace + * + * @param string $id the id of the page to be created + * @return string raw pagetemplate content + */ + protected function rawPageTemplate($id) { + global $conf; + + $path = dirname(wikiFN($id)); + if(file_exists($path.'/_template.txt')) { + $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')) { + $tplfile = $path.'/__template.txt'; + break; + } + $path = substr($path, 0, strrpos($path, '/')); + } + } + + $tpl = io_readFile($tplfile); + return $tpl; + } + + /** + * Load template(s) for targetpage as given via action field + * + * @param string $tpl template name as given in form + * @return string parsed templatename + */ + protected function getActionTargetpages($tpl) { + global $USERINFO; + global $conf; + global $ID; + $runas = $this->getConf('runas'); + + if ($tpl == '_') { + // use namespace template + if (!isset($this->targetpages[$this->pagename])) { + $raw = $this->rawPageTemplate($this->pagename); + $this->noreplace_save($raw); + $this->targetpages[$this->pagename] = pageTemplate(array($this->pagename)); + } + } elseif ($tpl !== '!') { + $tpl = $this->replace($tpl); + + // resolve templates, but keep references to whole namespaces intact (ending in a colon) + $resolver = new PageResolver(getNS($ID)); + if(substr($tpl, -1) == ':') { + $tpl = $tpl.'xxx'; // append a fake page name + $tpl = $resolver->resolveId($tpl); + $tpl = substr($tpl, 0, -3); // cut off fake page name again + } else { + $tpl = $resolver->resolveId($tpl); + } + + $backup = array(); + if ($runas) { + // Hack user credentials. + $backup = array($_SERVER['REMOTE_USER'], $USERINFO['grps']); + $_SERVER['REMOTE_USER'] = $runas; + $USERINFO['grps'] = array(); + } + + $template_pages = array(); + //search checks acl (as runas) + $opts = array( + 'depth' => 0, + 'listfiles' => true, + 'showhidden' => true + ); + search($template_pages, $conf['datadir'], 'search_universal', $opts, str_replace(':', '/', getNS($tpl))); + + foreach ($template_pages as $template_page) { + $templatepageid = cleanID($template_page['id']); + // try to replace $tpl path with $this->pagename path in the founded $templatepageid + // - a single-page template will only match on itself and will be replaced, + // other newtargets are pages in same namespace, so aren't changed + // - a namespace as template will match at the namespaces-part of the path of pages in this namespace + // so these newtargets are changed + // if there exist a single-page and a namespace with name $tpl, both are selected + $newTargetpageid = preg_replace('/^' . preg_quote_cb(cleanID($tpl)) . '($|:)/', $this->pagename . '$1', $templatepageid); + + if ($newTargetpageid === $templatepageid) { + // only a single-page template or page in the namespace template + // which matches the $tpl path are changed + continue; + } + + if (!isset($this->targetpages[$newTargetpageid])) { + $this->addParsedTargetpage($newTargetpageid, $templatepageid); + } + } + + if ($runas) { + /* Restore user credentials. */ + list($_SERVER['REMOTE_USER'], $USERINFO['grps']) = $backup; + } + } + return $tpl; + } + + /** + * Checks for existance and access of target pages + * + * @return mixed + * @throws Exception + */ + protected function checkTargetPageNames() { + foreach (array_keys($this->targetpages) as $pname) { + // prevent overriding already existing pages + if (page_exists($pname)) { + throw new Exception(sprintf($this->getLang('e_pageexists'), html_wikilink($pname))); + } + + $auth = $this->aclcheck($pname); + if ($auth < AUTH_CREATE) { + throw new Exception($this->getLang('e_denied')); + } + } + } + + /** + * Perform replacements on the collected templates, and save the pages. + * + * Note: wrt runas, for changelog are used: + * - $INFO['userinfo']['name'] + * - $INPUT->server->str('REMOTE_USER') + */ + protected function replaceAndSavePages($fields) { + global $ID; + foreach ($this->targetpages as $pageName => $template) { + // set NSBASE var to make certain dataplugin constructs easier + $this->patterns['__nsbase__'] = '/@NSBASE@/'; + $this->values['__nsbase__'] = noNS(getNS($pageName)); + + $evdata = array( + 'patterns' => &$this->patterns, + 'values' => &$this->values, + 'id' => $pageName, + 'template' => $template, + 'form' => $ID, + 'fields' => $fields + ); + + $event = new Doku_Event('PLUGIN_BUREAUCRACY_TEMPLATE_SAVE', $evdata); + if($event->advise_before()) { + // save page + saveWikiText( + $evdata['id'], + cleanText($this->replace($evdata['template'], false)), + sprintf($this->getLang('summary'), $ID) + ); + } + $event->advise_after(); + } + } + + /** + * (Callback) Sorts first by namespace depth, next by page ids + * + * @param string $a + * @param string $b + * @return int positive if $b is in deeper namespace than $a, negative higher. + * further sorted by pageids + * + * return an integer less than, equal to, or + * greater than zero if the first argument is considered to be + * respectively less than, equal to, or greater than the second. + */ + public function _sorttargetpages($a, $b) { + $ns_diff = substr_count($a, ':') - substr_count($b, ':'); + return ($ns_diff === 0) ? strcmp($a, $b) : ($ns_diff > 0 ? -1 : 1); + } + + /** + * (Callback) Build content of item + * + * @param array $item + * @return string + */ + public function html_list_index($item){ + $ret = ''; + if($item['type']=='f'){ + $ret .= html_wikilink(':'.$item['id']); + } else { + $ret .= '' . trim(substr($item['id'], strrpos($item['id'], ':', -2)), ':') . ''; + } + return $ret; + } + + /** + * Build thanks message, trigger indexing and rendering of new pages. + * + * @param string $thanks + * @return string html of thanks message or when redirect the first page id of created pages + */ + protected function buildThankYouPage($thanks) { + global $ID; + $backupID = $ID; + + $html = "

    $thanks

    "; + + // Build result tree + $pages = array_keys($this->targetpages); + usort($pages, array($this, '_sorttargetpages')); + + $data = array(); + $last_folder = array(); + foreach ($pages as $ID) { + $lvl = substr_count($ID, ':'); + for ($n = 0; $n < $lvl; ++$n) { + if (!isset($last_folder[$n]) || strpos($ID, $last_folder[$n]['id']) !== 0) { + $last_folder[$n] = array( + 'id' => substr($ID, 0, strpos($ID, ':', ($n > 0 ? strlen($last_folder[$n - 1]['id']) : 0) + 1) + 1), + 'level' => $n + 1, + 'open' => 1, + 'type' => null, + ); + $data[] = $last_folder[$n]; + } + } + $data[] = array('id' => $ID, 'level' => 1 + substr_count($ID, ':'), 'type' => 'f'); + } + $index = new dokuwiki\Ui\Index(); + $html .= html_buildlist($data, 'idx', array($this, 'html_list_index'), array($index, 'tagListItem')); + + // Add indexer bugs for every just-created page + $html .= '
    '; + ob_start(); + foreach ($pages as $ID) { + // indexerWebBug uses ID and INFO[exists], but the bureaucracy form + // page always exists, as does the just-saved page, so INFO[exists] + // is correct in any case + tpl_indexerWebBug(); + + // the iframe will trigger real rendering of the pages to make sure + // any used plugins are initialized (eg. the do plugin) + echo ''; + } + $html .= ob_get_contents(); + ob_end_clean(); + $html .= '
    '; + + $ID = $backupID; + return $html; + } + + /** + * move the uploaded files to :FILENAME + * + * + * @param helper_plugin_bureaucracy_field[] $fields + * @throws Exception + */ + protected function processUploads($fields) { + foreach($fields as $field) { + + if($field->getFieldType() !== 'file') continue; + + $label = $field->getParam('label'); + $file = $field->getParam('file'); + $ns = $field->getParam('namespace'); + + //skip empty files + if(!$file['size']) { + $this->values[$label] = ''; + continue; + } + + $id = $ns.':'.$file['name']; + resolve_mediaid($this->pagename, $id, $ignored); // resolve relatives + + $auth = $this->aclcheck($id); // runas + $move = 'copy_uploaded_file'; + //prevent from is_uploaded_file() check + if(defined('DOKU_UNITTEST')) { + $move = 'copy'; + } + $res = media_save( + array('name' => $file['tmp_name']), + $id, + false, + $auth, + $move); + + if(is_array($res)) throw new Exception($res[0]); + + $this->values[$label] = $res; + + } + } + + /** + * Load page data and do default pattern replacements like namespace templates do + * and add it to list of targetpages + * + * Note: for runas the values of the real user are used for the placeholders + * @NAME@ => $USERINFO['name'] + * @MAIL@ => $USERINFO['mail'] + * and the replaced value: + * @USER@ => $INPUT->server->str('REMOTE_USER') + * + * @param string $targetpageid pageid of destination + * @param string $templatepageid pageid of template for this targetpage + */ + protected function addParsedTargetpage($targetpageid, $templatepageid) { + $tpl = rawWiki($templatepageid); + $this->noreplace_save($tpl); + + $data = array( + 'id' => $targetpageid, + 'tpl' => $tpl, + 'doreplace' => true, + ); + parsePageTemplate($data); + + //collect and apply some other replacements + $patterns = array(); + $values = array(); + $keys = array('__lang__', '__trans__', '__year__', '__month__', '__day__', '__time__'); + foreach($keys as $key) { + $patterns[$key] = $this->patterns[$key]; + $values[$key] = $this->values[$key]; + } + + $this->targetpages[$targetpageid] = preg_replace($patterns, $values, $data['tpl']); + } + +} +// vim:ts=4:sw=4:et:enc=utf-8: diff --git a/lib/plugins/bureaucracy/helper/field.php b/lib/plugins/bureaucracy/helper/field.php new file mode 100644 index 0000000..070e331 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/field.php @@ -0,0 +1,508 @@ + + **/ + +/** + * Class helper_plugin_bureaucracy_field + * + * base class for all the form fields + */ +class helper_plugin_bureaucracy_field extends syntax_plugin_bureaucracy { + + protected $mandatory_args = 2; + public $opt = array(); + /** @var string|array */ + protected $tpl; + protected $checks = array(); + public $hidden = false; + protected $error = false; + protected $checktypes = array( + '/' => 'match', + '<' => 'max', + '>' => 'min' + ); + + /** + * Construct a helper_plugin_bureaucracy_field object + * + * This constructor initializes a helper_plugin_bureaucracy_field object + * based on a given definition. + * + * The first two items represent: + * * the type of the field + * * and the label the field has been given. + * Additional arguments are type-specific mandatory extra arguments and optional arguments. + * + * The optional arguments may add constraints to the field value, provide a + * default value, mark the field as optional or define that the field is + * part of a pagename (when using the template action). + * + * Since the field objects are cached, this constructor may not reference + * request data. + * + * @param array $args The tokenized definition, only split at spaces + */ + public function initialize($args) { + $this->init($args); + $this->standardArgs($args); + } + + /** + * Return false to prevent DokuWiki reusing instances of the plugin + * + * @return bool + */ + public function isSingleton() { + return false; + } + + /** + * Checks number of arguments and store 'cmd', 'label' and 'display' values + * + * @param array $args array with the definition + */ + protected function init(&$args) { + if(count($args) < $this->mandatory_args){ + msg(sprintf($this->getLang('e_missingargs'), hsc($args[0]), + hsc($args[1])), -1); + return; + } + + // get standard arguments + $this->opt = array(); + foreach (array('cmd', 'label') as $key) { + if (count($args) === 0) break; + $this->opt[$key] = array_shift($args); + } + $this->opt['display'] = $this->opt['label']; // allow to modify display value independently + } + + /** + * Check for additional arguments and store their values + * + * @param array $args array with remaining definition arguments + */ + protected function standardArgs($args) { + // parse additional arguments + foreach($args as $arg){ + if ($arg[0] == '=') { + $this->setVal(substr($arg,1)); + } elseif ($arg == '!') { + $this->opt['optional'] = true; + } elseif ($arg == '^') { + //only one field has focus + if (helper_plugin_bureaucracy_field::hasFocus()) { + $this->opt['id'] = 'focus__this'; + } + } elseif($arg == '@') { + $this->opt['pagename'] = true; + } elseif($arg == '@@') { + $this->opt['replyto'] = true; + } elseif(preg_match('/x\d/', $arg)) { + $this->opt['rows'] = substr($arg,1); + } elseif($arg[0] == '.') { + $this->opt['class'] = substr($arg, 1); + } elseif(preg_match('/^0{2,}$/', $arg)) { + $this->opt['leadingzeros'] = strlen($arg); + } elseif($arg[0].$arg[1] == '**') { + $this->opt['matchexplanation'] = substr($arg,2); + } else { + $t = $arg[0]; + $d = substr($arg,1); + if (in_array($t, array('>', '<')) && !is_numeric($d)) { + break; + } + if ($t == '/') { + if (substr($d, -1) !== '/') { + break; + } + $d = substr($d, 0, -1); + } + if (!isset($this->checktypes[$t]) || !method_exists($this, 'validate_' . $this->checktypes[$t])) { + msg(sprintf($this->getLang('e_unknownconstraint'), hsc($t).' ('.hsc($arg).')'), -1); + return; + } + $this->checks[] = array('t' => $t, 'd' => $d); + } + } + } + + /** + * Add parsed element to Form which generates XHTML + * + * Outputs the represented field using the passed Doku_Form object. + * Additional parameters (CSS class & HTML name) are passed in $params. + * HTML output is created by passing the template $this->tpl to the simple + * template engine _parse_tpl. + * + * @param array $params Additional HTML specific parameters + * @param Doku_Form $form The target Doku_Form object + * @param int $formid unique identifier of the form which contains this field + */ + public function renderfield($params, Doku_Form $form, $formid) { + $this->_handlePreload(); + if(!$form->_infieldset){ + $form->startFieldset(''); + } + if ($this->error) { + $params['class'] = 'bureaucracy_error'; + } + + $params = array_merge($this->opt, $params); + $form->addElement($this->_parse_tpl($this->tpl, $params)); + } + + /** + * Only the first use get the focus, next calls not + * + * @return bool + */ + protected static function hasFocus(){ + static $focus = true; + if($focus) { + $focus = false; + return true; + } else { + return false; + } + } + + + /** + * Check for preload value in the request url + */ + protected function _handlePreload() { + $preload_name = '@' . strtr($this->getParam('label'),' .','__') . '@'; + if (isset($_GET[$preload_name])) { + $this->setVal($_GET[$preload_name]); + } + } + + /** + * Handle a post to the field + * + * Accepts and validates a posted value. + * + * (Overridden by fieldset, which has as argument an array with the form array by reference) + * + * @param string $value The passed value or array or null if none given + * @param helper_plugin_bureaucracy_field[] $fields (reference) form fields (POST handled upto $this field) + * @param int $index index number of field in form + * @param int $formid unique identifier of the form which contains this field + * @return bool Whether the passed value is valid + */ + public function handle_post($value, &$fields, $index, $formid) { + return $this->hidden || $this->setVal($value); + } + + /** + * Get the field type + * + * @return string + **/ + public function getFieldType() { + return $this->opt['cmd']; + } + + /** + * Get the replacement pattern used by action + * + * @return string + */ + public function getReplacementPattern() { + $label = $this->getParam('label'); + $value = $this->getParam('value'); + + if (is_array($value)) { + return '/(@@|##)' . preg_quote($label, '/') . + '(?:\((?P.*?)\))?' .//delimiter + '(?:\|(?P.*?))' . (count($value) == 0 ? '' : '?') . + '\1/si'; + } + + return '/(@@|##)' . preg_quote($label, '/') . + '(?:\|(.*?))' . (is_null($value) ? '' : '?') . + '\1/si'; + } + + /** + * Used as an callback for preg_replace_callback + * + * @param $matches + * @return string + */ + public function replacementMultiValueCallback($matches) { + $value = $this->opt['value']; + + //default value + if (is_null($value) || $value === false) { + if (isset($matches['default']) && $matches['default'] != '') { + return $matches['default']; + } + return $matches[0]; + } + + //check if matched string containts a pair of brackets + $delimiter = preg_match('/\(.*\)/s', $matches[0]) ? $matches['delimiter'] : ', '; + + return implode($delimiter, $value); + } + + /** + * Get the value used by action + * If value is a callback preg_replace_callback is called instead preg_replace + * + * @return mixed|string + */ + public function getReplacementValue() { + $value = $this->getParam('value'); + + if (is_array($value)) { + return array($this, 'replacementMultiValueCallback'); + } + + return is_null($value) || $value === false ? '$2' : $value; + } + + /** + * Validate value and stores it + * + * @param mixed $value value entered into field + * @return bool whether the passed value is valid + */ + protected function setVal($value) { + if ($value === '') { + $value = null; + } + $this->opt['value'] = $value; + try { + $this->_validate(); + $this->error = false; + } catch (Exception $e) { + msg($e->getMessage(), -1); + $this->error = true; + } + return !$this->error; + } + + /** + * Whether the field is true (used for depending fieldsets) + * + * @return bool whether field is set + */ + public function isSet_() { + return !is_null($this->getParam('value')); + } + + /** + * Validate value of field and throws exceptions for bad values. + * + * @throws Exception when field didn't validate. + */ + protected function _validate() { + $value = $this->getParam('value'); + if (is_null($value)) { + if(!isset($this->opt['optional'])) { + throw new Exception(sprintf($this->getLang('e_required'),hsc($this->opt['label']))); + } + return; + } + + foreach ($this->checks as $check) { + $checktype = $this->checktypes[$check['t']]; + if (!call_user_func(array($this, 'validate_' . $checktype), $check['d'], $value)) { + //replacement is custom explanation or just the regexp or the requested value + if(isset($this->opt['matchexplanation'])) { + $replacement = hsc($this->opt['matchexplanation']); + } elseif($checktype == 'match') { + $replacement = sprintf($this->getLang('checkagainst'), hsc($check['d'])); + } else { + $replacement = hsc($check['d']); + } + + throw new Exception(sprintf($this->getLang('e_' . $checktype), hsc($this->opt['label']), $replacement)); + } + } + } + + /** + * Get an arbitrary parameter + * + * @param string $name + * @return mixed|null + */ + public function getParam($name) { + if (!isset($this->opt[$name]) || $name === 'value' && $this->hidden) { + return null; + } + if ($name === 'pagename') { + // If $this->opt['pagename'] is set, return the escaped value of the field. + $value = $this->getParam('value'); + if (is_null($value)) { + return null; + } + global $conf; + if($conf['useslash']) $value = str_replace('/',' ',$value); + return str_replace(':',' ',$value); + } + return $this->opt[$name]; + } + + /** + * Parse a template with given parameters + * + * Replaces variables specified like @@VARNAME|default@@ using the passed + * value map. + * + * @param string|array $tpl The template as string or array + * @param array $params A hash mapping parameters to values + * + * @return string|array The parsed template + */ + protected function _parse_tpl($tpl, $params) { + // addElement supports a special array format as well. In this case + // not all elements should be escaped. + $is_simple = !is_array($tpl); + if ($is_simple) $tpl = array($tpl); + + foreach ($tpl as &$val) { + // Select box passes options as an array. We do not escape those. + if (is_array($val)) continue; + + // find all variables and their defaults or param values + preg_match_all('/@@([A-Z]+)(?:\|((?:[^@]|@$|@[^@])*))?@@/', $val, $pregs); + for ($i = 0 ; $i < count($pregs[2]) ; ++$i) { + if (isset($params[strtolower($pregs[1][$i])])) { + $pregs[2][$i] = $params[strtolower($pregs[1][$i])]; + } + } + // we now have placeholders in $pregs[0] and their values in $pregs[2] + $replacements = array(); // check if empty to prevent php 5.3 warning + if (!empty($pregs[0])) { + $replacements = array_combine($pregs[0], $pregs[2]); + } + + if($is_simple){ + // for simple string templates, we escape all replacements + $replacements = array_map('hsc', $replacements); + }else{ + // for the array ones, we escape the label and display only + if(isset($replacements['@@LABEL@@'])) $replacements['@@LABEL@@'] = hsc($replacements['@@LABEL@@']); + if(isset($replacements['@@DISPLAY@@'])) $replacements['@@DISPLAY@@'] = hsc($replacements['@@DISPLAY@@']); + } + + // we attach a mandatory marker to the display + if(isset($replacements['@@DISPLAY@@']) && !isset($params['optional'])){ + $replacements['@@DISPLAY@@'] .= ' *'; + } + $val = str_replace(array_keys($replacements), array_values($replacements), $val); + } + return $is_simple ? $tpl[0] : $tpl; + } + + /** + * Executed after performing the action hooks + */ + public function after_action() { + } + + /** + * Constraint function: value of field should match this regexp + * + * @param string $d regexp + * @param mixed $value + * @return int|bool + */ + protected function validate_match($d, $value) { + return @preg_match('/' . $d . '/i', $value); + } + + /** + * Constraint function: value of field should be bigger + * + * @param int|number $d lower bound + * @param mixed $value of field + * @return bool + */ + protected function validate_min($d, $value) { + return $value > $d; + } + + /** + * Constraint function: value of field should be smaller + * + * @param int|number $d upper bound + * @param mixed $value of field + * @return bool + */ + protected function validate_max($d, $value) { + return $value < $d; + } + + /** + * Available methods + * + * @return array + */ + public function getMethods() { + $result = array(); + $result[] = array( + 'name' => 'initialize', + 'desc' => 'Initiate object, first parameters are at least cmd and label', + 'params' => array( + 'params' => 'array' + ) + ); + $result[] = array( + 'name' => 'renderfield', + 'desc' => 'Add parsed element to Form which generates XHTML', + 'params' => array( + 'params' => 'array', + 'form' => 'Doku_Form', + 'formid' => 'integer' + ) + ); + $result[] = array( + 'name' => 'handle_post', + 'desc' => 'Handle a post to the field', + 'params' => array( + 'value' => 'array', + 'fields' => 'helper_plugin_bureaucracy_field[]', + 'index' => 'Doku_Form', + 'formid' => 'integer' + ), + 'return' => array('isvalid' => 'bool') + ); + $result[] = array( + 'name' => 'getFieldType', + 'desc' => 'Get the field type', + 'return' => array('fieldtype' => 'string') + ); + $result[] = array( + 'name' => 'isSet_', + 'desc' => 'Whether the field is true (used for depending fieldsets) ', + 'return' => array('isset' => 'bool') + ); + $result[] = array( + 'name' => 'getParam', + 'desc' => 'Get an arbitrary parameter', + 'params' => array( + 'name' => 'string' + ), + 'return' => array('Parameter value' => 'mixed|null') + ); + $result[] = array( + 'name' => 'after_action', + 'desc' => 'Executed after performing the action hooks' + ); + return $result; + } + +} diff --git a/lib/plugins/bureaucracy/helper/fieldaddpage.php b/lib/plugins/bureaucracy/helper/fieldaddpage.php new file mode 100644 index 0000000..0c024fd --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldaddpage.php @@ -0,0 +1,63 @@ +getLang('e_missingargs'), hsc($args[0]), + hsc($args[1])), -1); + return; + } + + // get standard arguments + $this->opt = array_combine(array('cmd', 'page_tpl', 'page_tgt'), $args); + } + + /** + * Nothing displayed + * + * @params array $params Additional HTML specific parameters + * @params Doku_Form $form The target Doku_Form object + * @params int $formid unique identifier of the form which contains this field + */ + function renderfield($params, Doku_Form $form, $formid) { + } + + /** + * Handle a post to the field + * + * @param string $value null + * @param helper_plugin_bureaucracy_field[] $fields (reference) form fields (POST handled upto $this field) + * @param int $index index number of field in form + * @param int $formid unique identifier of the form which contains this field + * @return bool Whether the passed value is valid + */ + function handle_post($value, &$fields, $index, $formid) { + return true; + } + + /** + * Get an arbitrary parameter + * + * @param string $name + * @return mixed|null + */ + function getParam($name) { + return ($name === 'value' || + (in_array($name, array('page_tpl', 'page_tgt')) && $this->hidden)) ? + null : + parent::getParam($name); + } +} diff --git a/lib/plugins/bureaucracy/helper/fielddate.php b/lib/plugins/bureaucracy/helper/fielddate.php new file mode 100644 index 0000000..6feae1c --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fielddate.php @@ -0,0 +1,42 @@ + 'datepicker edit', + 'maxlength'=>'10' + ); + if(!isset($this->opt['optional'])) { + $attr['required'] = 'required'; + $attr['class'] .= ' required'; + } + $this->tpl = form_makeTextField('@@NAME@@', '@@VALUE@@', '@@DISPLAY@@', '@@ID@@', '@@CLASS@@', $attr); + } + + /** + * Validate field input + * + * @throws Exception when empty or wrong date format + */ + protected function _validate() { + parent::_validate(); + + $value = $this->getParam('value'); + if (!is_null($value) && !preg_match('/^\d{4}-\d{2}-\d{2}$/', $value)) { + throw new Exception(sprintf($this->getLang('e_date'),hsc($this->getParam('display')))); + } + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldemail.php b/lib/plugins/bureaucracy/helper/fieldemail.php new file mode 100644 index 0000000..7857bd7 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldemail.php @@ -0,0 +1,30 @@ +getParam('value'); + if(!is_null($value) && $value !== '@MAIL@' && !mail_isvalid($value)){ + throw new Exception(sprintf($this->getLang('e_email'),hsc($this->getParam('display')))); + } + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldfieldset.php b/lib/plugins/bureaucracy/helper/fieldfieldset.php new file mode 100644 index 0000000..ddce2b6 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldfieldset.php @@ -0,0 +1,114 @@ +opt = array('cmd' => array_shift($args)); + + if (count($args) > 0) { + $this->opt['label'] = array_shift($args); + $this->opt['display'] = $this->opt['label']; + + $this->depends_on = $args; + } + } + + /** + * Render the top of the fieldset as XHTML + * + * @param array $params Additional HTML specific parameters + * @param Doku_Form $form The target Doku_Form object + * @param int $formid unique identifier of the form which contains this field + */ + function renderfield($params, Doku_Form $form, $formid) { + $form->startFieldset(hsc($this->getParam('display'))); + if (!empty($this->depends_on)) { + $dependencies = array_map('hsc',(array) $this->depends_on); + if (count($this->depends_on) > 1) { + $msg = 'Only edit this fieldset if ' . + '“%s” '. + 'is set to “%s”.'; + } else { + $msg = 'Only edit this fieldset if ' . + '“%s” is set.'; + } + + $form->addElement('

    ' . vsprintf($msg, $dependencies) . '

    '); + } + } + + /** + * Handle a post to the fieldset + * + * When fieldset is closed, set containing fields to hidden + * + * @param null $value field value of fieldset always empty + * @param helper_plugin_bureaucracy_field[] $fields (reference) form fields (POST handled upto $this field) + * @param int $index index number of field in form + * @param int $formid unique identifier of the form which contains this field + * @return bool Whether the passed value is valid + */ + public function handle_post($value, &$fields, $index, $formid) { + if(empty($this->depends_on)) { + return true; + } + + // search the field where fieldset depends on in fields before fieldset + $hidden = false; + for ($n = 0 ; $n < $index; ++$n) { + $field = $fields[$n]; + if ($field->getParam('label') != $this->depends_on[0]) { + continue; + } + if(count($this->depends_on) > 1) { + $hidden = $field->getParam('value') != $this->depends_on[1]; + } else { + $hidden = !$field->isSet_(); + } + break; + } + // mark fields after this fieldset as hidden + if ($hidden) { + $this->hidden = true; + for ($n = $index + 1 ; $n < count($fields) ; ++$n) { + $field = $fields[$n]; + if ($field->getFieldType() === 'fieldset') { + break; + } + $field->hidden = true; + } + } + return true; + } + + /** + * Get an arbitrary parameter + * + * @param string $name + * @return mixed|null + */ + function getParam($name) { + if($name === 'value') { + return null; + } else { + return parent::getParam($name); + } + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldfile.php b/lib/plugins/bureaucracy/helper/fieldfile.php new file mode 100644 index 0000000..285308e --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldfile.php @@ -0,0 +1,75 @@ +init($args); + + //default namespace for file upload (pagepath:file_name) + $this->opt['namespace'] = '.'; + + //check whenever the first argument is an upload namespace + if (isset($args[0]) && preg_match('/^[a-z.\-_:]+$/', $args[0])) { + $this->opt['namespace'] = array_shift($args); + } + $this->standardArgs($args); + + $attr = array(); + if(!isset($this->opt['optional'])) { + $attr['required'] = 'required'; + } + + $this->tpl = form_makeFileField('@@NAME@@', '@@DISPLAY@@', '@@ID@@', '@@CLASS@@', $attr); + + if(!isset($this->opt['optional'])){ + $this->tpl['class'] .= ' required'; + } + } + + /** + * Handle a post to the field + * + * Accepts and validates a posted value. + * + * @param array $value The passed value or array or null if none given + * @param helper_plugin_bureaucracy_field[] $fields (reference) form fields (POST handled upto $this field) + * @param int $index index number of field in form + * @param int $formid unique identifier of the form which contains this field + * @return bool Whether the passed filename is valid + */ + public function handle_post($value, &$fields, $index, $formid) { + $this->opt['file'] = $value; + + return parent::handle_post($value['name'], $fields, $index, $formid); + } + + /** + * @throws Exception max size, required or upload error + */ + protected function _validate() { + global $lang; + parent::_validate(); + + $file = $this->getParam('file'); + if($file['error'] == 1 || $file['error'] == 2) { + throw new Exception(sprintf($lang['uploadsize'],filesize_h(php_to_byte(ini_get('upload_max_filesize'))))); + } else if($file['error'] == 4) { + if(!isset($this->opt['optional'])) { + throw new Exception(sprintf($this->getLang('e_required'),hsc($this->opt['label']))); + } + } else if( $file['error'] || !is_uploaded_file($file['tmp_name'])) { + throw new Exception(hsc($this->opt['label']) .' '. $lang['uploadfail'] . ' (' .$file['error'] . ')' ); + } + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldhidden.php b/lib/plugins/bureaucracy/helper/fieldhidden.php new file mode 100644 index 0000000..dd63753 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldhidden.php @@ -0,0 +1,47 @@ +_handlePreload(); + $form->addHidden($params['name'], $this->getParam('value') . ''); + } + + /** + * Get an arbitrary parameter + * + * @param string $name + * @return mixed|null + */ + function getParam($name) { + if (!isset($this->opt[$name]) || in_array($name, array('pagename', 'value')) && $this->hidden) { + return null; + } + if ($name === 'pagename') { + // If $this->opt['pagename'] is set, return the value of the field, + // UNESCAPED. + $name = 'value'; + } + return $this->opt[$name]; + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldhiddenautoinc.php b/lib/plugins/bureaucracy/helper/fieldhiddenautoinc.php new file mode 100644 index 0000000..787e081 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldhiddenautoinc.php @@ -0,0 +1,35 @@ +_handlePreload(); + $form->addHidden($params['name'], $this->getParam('value') . ''); + } + +} diff --git a/lib/plugins/bureaucracy/helper/fieldmultiselect.php b/lib/plugins/bureaucracy/helper/fieldmultiselect.php new file mode 100644 index 0000000..5311d90 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldmultiselect.php @@ -0,0 +1,62 @@ +init($args); + $this->opt['args'] = array_map('trim', explode('|',array_shift($args))); + $this->standardArgs($args); + if (isset($this->opt['value'])) { + $this->opt['value'] = array_map('trim', explode(',', $this->opt['value'])); + } else { + $this->opt['value'] = array(); + } + } + + /** + * Render the field as XHTML + * + * Outputs the represented field using the passed Doku_Form object. + * Additional parameters (CSS class & HTML name) are passed in $params. + * + * @params array $params Additional HTML specific parameters + * @params Doku_Form $form The target Doku_Form object + * @params int $formid unique identifier of the form which contains this field + */ + public function renderfield($params, Doku_Form $form, $formid) { + $this->_handlePreload(); + if(!$form->_infieldset){ + $form->startFieldset(''); + } + if ($this->error) { + $params['class'] = 'bureaucracy_error'; + } + $params = array_merge($this->opt, $params); + $form->addElement(call_user_func_array('form_makeListboxField', + $this->_parse_tpl( + array( + '@@NAME@@[]', + $params['args'], + $this->opt['value'], + '@@DISPLAY@@', + '@@ID@@', + '@@CLASS@@', + array('multiple' => 'multiple') + ), + $params + ))); + } +} \ No newline at end of file diff --git a/lib/plugins/bureaucracy/helper/fieldnumber.php b/lib/plugins/bureaucracy/helper/fieldnumber.php new file mode 100644 index 0000000..93a2242 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldnumber.php @@ -0,0 +1,119 @@ +autoinc = true; + } + + parent::initialize($args); + + if ($this->autoinc) { + global $ID; + $key = $this->get_key(); + $c_val = p_get_metadata($ID, 'bureaucracy ' . $key); + if (is_null($c_val)) { + if (!isset($this->opt['value'])) { + $this->opt['value'] = 0; + } + p_set_metadata($ID, array('bureaucracy' => array($key => $this->opt['value']))); + } else { + $this->opt['value'] = $c_val; + } + } + $this->opt['value'] = $this->addLeadingzeros($this->opt['value']); + } + + /** + * Validate field value + * + * @throws Exception when not a number + */ + protected function _validate() { + $value = $this->getParam('value'); + if (!is_null($value) && !is_numeric($value)){ + throw new Exception(sprintf($this->getLang('e_numeric'),hsc($this->getParam('display')))); + } + + parent::_validate(); + } + + /** + * Handle a post to the field + * + * Accepts and validates a posted value. + * + * @param string $value The passed value or array or null if none given + * @param array $fields (reference) form fields (POST handled upto $this field) + * @param int $index index number of field in form + * @param int $formid unique identifier of the form which contains this field + * @return bool Whether the passed value is valid + */ + public function handle_post($value, &$fields, $index, $formid) { + $value = $this->addLeadingzeros($value); + + return parent::handle_post($value, $fields, $index, $formid); + } + + /** + * Returns the cleaned key for this field required for metadata + * + * @return string key + */ + private function get_key() { + return preg_replace('/\W/', '', $this->opt['label']) . '_autoinc'; + } + + /** + * Executed after performing the action hooks + * + * Increases counter and purge cache + */ + public function after_action() { + if ($this->autoinc) { + global $ID; + p_set_metadata($ID, array('bureaucracy' => array($this->get_key() => $this->opt['value'] + 1))); + // Force rerendering by removing the instructions cache file + $cache_fn = getCacheName(wikiFN($ID).$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'],'.'.'i'); + if (file_exists($cache_fn)) { + unlink($cache_fn); + } + } + } + + /** + * Add leading zeros, depending on the corresponding field option + * + * @param int|string $value number + * @return string + */ + protected function addLeadingzeros(&$value) { + if (isset($this->opt['leadingzeros'])) { + $length = strlen($value); + for($i = $length; $i < $this->opt['leadingzeros']; $i++) { + $value = '0' . $value; + } + return $value; + } + return $value; + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldonoff.php b/lib/plugins/bureaucracy/helper/fieldonoff.php new file mode 100644 index 0000000..d73177b --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldonoff.php @@ -0,0 +1,16 @@ +opt['optional'])) { + $attr['required'] = 'required'; + } + $this->tpl = form_makePasswordField('@@NAME@@', '@@DISPLAY@@', '@@ID@@', '@@CLASS@@', $attr); + + if(!isset($this->opt['optional'])){ + $this->tpl['class'] .= ' required'; + } + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldradio.php b/lib/plugins/bureaucracy/helper/fieldradio.php new file mode 100644 index 0000000..e2b466d --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldradio.php @@ -0,0 +1,82 @@ +init($args); + $this->opt['args'] = array_filter(array_map('trim', explode('|',array_shift($args)))); + $this->standardArgs($args); + } + + /** + * Render the field as XHTML + * + * Outputs the represented field using the passed Doku_Form object. + * Additional parameters (CSS class & HTML name) are passed in $params. + * + * @params array $params Additional HTML specific parameters + * @params Doku_Form $form The target Doku_Form object + * @params int $formid unique identifier of the form which contains this field + */ + public function renderfield($params, Doku_Form $form, $formid) { + $this->_handlePreload(); + if(!$form->_infieldset){ + $form->startFieldset(''); + } + if ($this->error) { + $params['class'] = 'bureaucracy_error'; + } + $params = array_merge($this->opt, $params); + + list($name, $entries, $value, $label, $id, $class) = $this->_parse_tpl( + array( + '@@NAME@@', + $params['args'], + '@@VALUE@@', + '@@DISPLAY@@', + '@@ID@@', + '@@CLASS@@' + ), + $params + ); + + $value = (in_array($value, $entries) ? $value : null); + $valueoffieldwithid = ($value !== null ? $value : current($entries)); + // label + $s = ''; + $s .= ''; + $form->addElement($s); + + // radio fields + foreach($entries as $val) { + if($value === $val) { + $attrs = array('checked' => 'checked'); + } else { + $attrs = array(); + } + if($valueoffieldwithid === $val) { + $_id = $id; //e.g. autofocus with 'focus__this' id + } else { + $_id = ''; + } + $form->addElement(form_makeRadioField($name, $val, $val, $_id, $class, $attrs)); + } + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldselect.php b/lib/plugins/bureaucracy/helper/fieldselect.php new file mode 100644 index 0000000..391e562 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldselect.php @@ -0,0 +1,61 @@ +init($args); + $this->opt['args'] = array_map('trim', explode('|',array_shift($args))); + $this->standardArgs($args); + if (!isset($this->opt['value']) && isset($this->opt['optional'])) { + array_unshift($this->opt['args'],' '); + } + } + + /** + * Render the field as XHTML + * + * Outputs the represented field using the passed Doku_Form object. + * Additional parameters (CSS class & HTML name) are passed in $params. + * + * @params array $params Additional HTML specific parameters + * @params Doku_Form $form The target Doku_Form object + * @params int $formid unique identifier of the form which contains this field + */ + public function renderfield($params, Doku_Form $form, $formid) { + $this->_handlePreload(); + if(!$form->_infieldset){ + $form->startFieldset(''); + } + if ($this->error) { + $params['class'] = 'bureaucracy_error'; + } + $params = array_merge($this->opt, $params); + $form->addElement(call_user_func_array('form_makeListboxField', + $this->_parse_tpl( + array( + '@@NAME@@', + $params['args'], + '@@VALUE|' . $params['args'][0] . '@@', + '@@DISPLAY@@', + '@@ID@@', + '@@CLASS@@' + ), + $params + ))); + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldstatic.php b/lib/plugins/bureaucracy/helper/fieldstatic.php new file mode 100644 index 0000000..191be72 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldstatic.php @@ -0,0 +1,60 @@ +@@DISPLAY@@

    '; + + /** + * Arguments: + * - cmd + * - text + * + * @param array $args The tokenized definition, only split at spaces + */ + public function initialize($args) { + parent::initialize($args); + // make always optional to prevent being marked as required + $this->opt['optional'] = true; + } + + /** + * Handle a post to the field + * + * @param string $value The passed value + * @param helper_plugin_bureaucracy_field[] $fields (reference) form fields (POST handled upto $this field) + * @param int $index index number of field in form + * @param int $formid unique identifier of the form which contains this field + * @return bool Whether the passed value is valid + */ + public function handle_post($value, &$fields, $index, $formid) { + return true; + } + + /** + * Get an arbitrary parameter + * + * @param string $name + * @return mixed|null + */ + public function getParam($name) { + return ($name === 'value') ? null : parent::getParam($name); + } + + /** + * Render the field as XHTML + * + * @params array $params Additional HTML specific parameters + * @params Doku_Form $form The target Doku_Form object + * @params int $formid unique identifier of the form which contains this field + */ + public function renderfield($params, Doku_Form $form, $formid) { + if (!isset($this->opt['display'])) { + $this->opt['display'] = $this->opt['label']; + } + parent::renderfield($params, $form, $formid); + } + +} diff --git a/lib/plugins/bureaucracy/helper/fieldsubject.php b/lib/plugins/bureaucracy/helper/fieldsubject.php new file mode 100644 index 0000000..f49c2b7 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldsubject.php @@ -0,0 +1,37 @@ +_handlePreload(); + } + + /** + * Handle a post to the field + * + * @param string $value null + * @param helper_plugin_bureaucracy_field[] $fields (reference) form fields (POST handled upto $this field) + * @param int $index index number of field in form + * @param int $formid unique identifier of the form which contains this field + * @return bool Whether the passed value is valid + */ + function handle_post($value, &$fields, $index, $formid) { + return true; + } +} \ No newline at end of file diff --git a/lib/plugins/bureaucracy/helper/fieldsubmit.php b/lib/plugins/bureaucracy/helper/fieldsubmit.php new file mode 100644 index 0000000..b9f2e45 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldsubmit.php @@ -0,0 +1,89 @@ +opt['optional'] = true; + } + + /** + * Render the field as XHTML + * + * @params array $params Additional HTML specific parameters + * @params Doku_Form $form The target Doku_Form object + * @params int $formid unique identifier of the form which contains this field + */ + public function renderfield($params, Doku_Form $form, $formid) { + if(!isset(helper_plugin_bureaucracy_fieldsubmit::$captcha_displayed[$formid])) { + helper_plugin_bureaucracy_fieldsubmit::$captcha_displayed[$formid] = true; + /** @var helper_plugin_captcha $helper */ + $helper = null; + if(@is_dir(DOKU_PLUGIN.'captcha')) $helper = plugin_load('helper','captcha'); + if(!is_null($helper) && $helper->isEnabled()){ + $form->addElement($helper->getHTML()); + } + } + $attr = array(); + if(isset($this->opt['id'])) { + $attr['id'] = $this->opt['id']; + } + $this->tpl = form_makeButton('submit','', '@@DISPLAY|' . $this->getLang('submit') . '@@', $attr); + parent::renderfield($params, $form, $formid); + } + + /** + * Handle a post to the field + * + * Accepts and validates a posted captcha value. + * + * @param string $value The passed value + * @param helper_plugin_bureaucracy_field[] $fields (reference) form fields (POST handled upto $this field) + * @param int $index index number of field in form + * @param int $formid unique identifier of the form which contains this field + * @return bool Whether the posted form has a valid captcha + */ + public function handle_post($value, &$fields, $index, $formid) { + if ($this->hidden) { + return true; + } + if(!isset(helper_plugin_bureaucracy_fieldsubmit::$captcha_checked[$formid])) { + helper_plugin_bureaucracy_fieldsubmit::$captcha_checked[$formid] = true; + // check CAPTCHA + /** @var helper_plugin_captcha $helper */ + $helper = null; + if(@is_dir(DOKU_PLUGIN.'captcha')) $helper = plugin_load('helper','captcha'); + if(!is_null($helper) && $helper->isEnabled()){ + return $helper->check(); + } + } + return true; + } + + /** + * Get an arbitrary parameter + * + * @param string $name + * @return mixed|null + */ + public function getParam($name) { + return ($name === 'value') ? null : parent::getParam($name); + } + +} diff --git a/lib/plugins/bureaucracy/helper/fieldtextarea.php b/lib/plugins/bureaucracy/helper/fieldtextarea.php new file mode 100644 index 0000000..0dfcce2 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldtextarea.php @@ -0,0 +1,29 @@ +opt['class'])) { + $this->opt['class'] = ''; + } + $this->opt['class'] .= ' textareafield'; + } + + protected $tpl = +''; + +} diff --git a/lib/plugins/bureaucracy/helper/fieldtextbox.php b/lib/plugins/bureaucracy/helper/fieldtextbox.php new file mode 100644 index 0000000..430cc2d --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldtextbox.php @@ -0,0 +1,34 @@ +opt['optional'])) { + $attr['required'] = 'required'; + } + + $this->tpl = form_makeTextField('@@NAME@@', '@@VALUE@@', '@@DISPLAY@@', '@@ID@@', '@@CLASS@@', $attr); + if(isset($this->opt['class'])){ + $this->tpl['class'] .= ' '.$this->opt['class']; + } + if(!isset($this->opt['optional'])){ + $this->tpl['class'] .= ' required'; + } + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldtime.php b/lib/plugins/bureaucracy/helper/fieldtime.php new file mode 100644 index 0000000..164e71f --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldtime.php @@ -0,0 +1,42 @@ + 'timefield edit', + 'maxlength'=>'8' + ); + if(!isset($this->opt['optional'])) { + $attr['required'] = 'required'; + $attr['class'] .= ' required'; + } + $this->tpl = form_makeTextField('@@NAME@@', '@@VALUE@@', '@@DISPLAY@@', '@@ID@@', '@@CLASS@@', $attr); + } + + /** + * Validate field input + * + * @throws Exception when empty or wrong time format + */ + protected function _validate() { + parent::_validate(); + + $value = $this->getParam('value'); + if (!is_null($value) && !preg_match('/^\d{1,2}:\d{2}(?::\d{2})?$/', $value)) { + throw new Exception(sprintf($this->getLang('e_time'),hsc($this->getParam('display')))); + } + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldusemailtemplate.php b/lib/plugins/bureaucracy/helper/fieldusemailtemplate.php new file mode 100644 index 0000000..775f87b --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldusemailtemplate.php @@ -0,0 +1,62 @@ +getLang('e_missingargs'), hsc($args[0]), + hsc($args[1])), -1); + return; + } + + // get standard arguments + $this->opt = array_combine(array('cmd', 'template'), $args); + } + + /** + * Nothing displayed + * + * @params array $params Additional HTML specific parameters + * @params Doku_Form $form The target Doku_Form object + * @params int $formid unique identifier of the form which contains this field + */ + function renderfield($params, Doku_Form $form, $formid) { + } + + /** + * Handle a post to the field + * + * @param string $value null + * @param helper_plugin_bureaucracy_field[] $fields (reference) form fields (POST handled upto $this field) + * @param int $index index number of field in form + * @param int $formid unique identifier of the form which contains this field + * @return bool Whether the passed value is valid + */ + function handle_post($value, &$fields, $index, $formid) { + return true; + } + + /** + * Get an arbitrary parameter + * + * @param string $name + * @return mixed|null + */ + function getParam($name) { + return ($name === 'value' || + (in_array($name, array('template')) && $this->hidden)) ? + null : + parent::getParam($name); + } +} diff --git a/lib/plugins/bureaucracy/helper/fielduser.php b/lib/plugins/bureaucracy/helper/fielduser.php new file mode 100644 index 0000000..49608e1 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fielduser.php @@ -0,0 +1,99 @@ +tpl['class'] .= ' userpicker'; + } + + /** + * Allow receiving user attributes by ".". Ex. user.name + * You can pass an optional argument to user.grps enclosed in brackets, used as an groups delimiter Ex. user.grps(, ) + * + * @return string + */ + public function getReplacementPattern() { + $label = $this->opt['label']; + + return '/(@@|##)' . preg_quote($label, '/') . + '(?:\.(.*?))?' . //match attribute after "." + '(?:\((.*?)\))?' . //match parameter enclosed in "()". Used for grps separator + '\1/si'; + } + + /** + * Used as an callback for preg_replace_callback + * + * @param $matches + * @return string + */ + public function replacementValueCallback($matches) { + /** @var DokuWiki_Auth_Plugin $auth */ + global $auth; + + $value = $this->opt['value']; + //attr doesn't exists + if (!isset($matches[2])) { + return is_null($value) || $value === false ? '' : $value; + } + $attr = $matches[2]; + + $udata = $auth->getUserData($value); + //no such user + if ($udata === false) { + return $matches[0]; + } + + switch($attr) { + case 'name': + case 'mail': + return $udata[$attr]; + case 'grps': + $delitmiter = ', '; + if (isset($matches[3])) { + $delitmiter = $matches[3]; + } + return implode($delitmiter, $udata['grps']); + default: + return $matches[0]; + } + } + + /** + * Return the callback for user replacement + * + * @return array + */ + public function getReplacementValue() { + return array($this, 'replacementValueCallback'); + } + + /** + * Validate value of field + * + * @throws Exception when user not exists + */ + protected function _validate() { + parent::_validate(); + + /** @var DokuWiki_Auth_Plugin $auth */ + global $auth; + $value = $this->getParam('value'); + if (!is_null($value) && $auth->getUserData($value) === false) { + throw new Exception(sprintf($this->getLang('e_user'),hsc($this->getParam('display')))); + } + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldusers.php b/lib/plugins/bureaucracy/helper/fieldusers.php new file mode 100644 index 0000000..bd5dce7 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldusers.php @@ -0,0 +1,96 @@ +tpl['class'] .= ' userspicker'; + } + + /** + * Allow receiving user attributes by ".". Ex. user.name + * You can pass an optional argument to user.grps enclosed in brackets, used as an groups delimiter Ex. user.grps(, ) + * + * @return string + */ + public function getReplacementPattern() { + $label = $this->opt['label']; + return '/(@@|##)' . preg_quote($label, '/') . + '(?:\((?P.*?)\))?' .//delimiter + '(?:\.(?P.*?))?' . //match attribute after "." + '\1/si'; + } + + /** + * Used as an callback for preg_replace_callback + * + * @param $matches + * @return string + */ + public function replacementValueCallback($matches) { + /** @var DokuWiki_Auth_Plugin $auth */ + global $auth; + + $value = $this->opt['value']; + //copy the value by default + if (isset($matches[2]) && is_array($matches[2]) && count($matches[2]) == 2) { + return is_null($value) || $value === false ? $matches[0] : $value; + } + + $attribute = isset($matches['attribute']) ? $matches['attribute'] : ''; + //check if matched string containts a pair of brackets + $delimiter = preg_match('/\(.*\)/s', $matches[0]) ? $matches['delimiter'] : ', '; + $users = array_map('trim', explode(',', $value)); + + switch($attribute) { + case '': + return implode($delimiter, $users); + case 'name': + case 'mail': + return implode($delimiter, array_map(function ($user) use ($auth, $attribute) { + return $auth->getUserData($user)[$attribute]; + }, $users)); + default: + return $matches[0]; + } + } + + /** + * Return the callback for user replacement + * + * @return array + */ + public function getReplacementValue() { + return array($this, 'replacementValueCallback'); + } + + /** + * Validate value of field + * + * @throws Exception when user not exists + */ + protected function _validate() { + parent::_validate(); + + /** @var DokuWiki_Auth_Plugin $auth */ + global $auth; + $users = array_filter(preg_split('/\s*,\s*/', $this->getParam('value'))); + foreach ($users as $user) { + if ($auth->getUserData($user) === false) { + throw new Exception(sprintf($this->getLang('e_users'), hsc($this->getParam('display')))); + } + } + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldwiki.php b/lib/plugins/bureaucracy/helper/fieldwiki.php new file mode 100644 index 0000000..dada855 --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldwiki.php @@ -0,0 +1,70 @@ +@@LABEL@@

    '; + + /** + * Arguments: + * - cmd + * - wiki text + * + * @param array $args The tokenized definition, only split at spaces + */ + public function initialize($args) { + parent::initialize($args); + // make always optional to prevent being marked as required + $this->opt['optional'] = true; + } + + /** + * Handle a post to the field + * + * @param null $value empty + * @param helper_plugin_bureaucracy_field[] $fields (reference) form fields (POST handled upto $this field) + * @param int $index index number of field in form + * @param int $formid unique identifier of the form which contains this field + * @return bool Whether the passed value is valid + */ + public function handle_post($value, &$fields, $index, $formid) { + return true; + } + + /** + * Get an arbitrary parameter + * + * @param string $name + * @return mixed|null + */ + public function getParam($name) { + return ($name === 'value') ? null : parent::getParam($name); + } + + /** + * Returns parsed wiki instructions + * + * @param string|array $tpl The template as string + * @param array $params A hash mapping parameters to values + * + * @return string The parsed template + */ + protected function _parse_tpl($tpl, $params) { + $ins = p_get_instructions($params['display']); + // remove document and p instructions (opening and closing) + $start = 2; + $end = 2; + // check if struct instructions have to be removed as well from the beginning or end + if (isset($ins[1][1][0]) && $ins[1][1][0] === 'struct_output') { + $start = 3; + } elseif (isset($ins[count($ins) - 2][1][0]) && $ins[count($ins) - 2][1][0] === 'struct_output') { + $end = 3; + } + $ins = array_slice($ins, $start, -$end); + $tpl = p_render('xhtml', $ins, $byref_ignore); + return '

    '.$tpl.'

    '; + } +} diff --git a/lib/plugins/bureaucracy/helper/fieldyesno.php b/lib/plugins/bureaucracy/helper/fieldyesno.php new file mode 100644 index 0000000..77b83de --- /dev/null +++ b/lib/plugins/bureaucracy/helper/fieldyesno.php @@ -0,0 +1,98 @@ +init($args); + $newargs = array(); + foreach ($args as $arg) { + switch ($arg[0]) { + case '=': + if($arg == '==1') { + $this->opt['value'] = '1'; + }elseif($arg == '==0') { + $this->opt['value'] = '0'; + }else{ + $this->opt['true_value'] = substr($arg, 1); + } + break; + case '!': + $this->opt['false_value'] = substr($arg, 1); + break; + default: + $newargs[] = $arg; + } + } + $this->standardArgs($newargs); + $this->opt['optional'] = true; + } + + /** + * Get an arbitrary parameter + * + * @param string $key + * @return mixed|null + */ + public function getParam($key) { + if ($key === 'value') { + if ($this->opt['value'] === '1') { + return isset($this->opt['true_value']) ? + $this->opt['true_value'] : + null; + } elseif ($this->opt['value'] === '0') { + return isset($this->opt['false_value']) ? + $this->opt['false_value'] : + null; + } + } + return parent::getParam($key); + } + + /** + * Whether the field is true (used for depending fieldsets) + * + * @return bool whether field is set + */ + public function isSet_() { + return $this->opt['value'] === '1'; + } + + /** + * Render the field as XHTML + * + * @params array $params Additional HTML specific parameters + * @params Doku_Form $form The target Doku_Form object + * @params int $formid unique identifier of the form which contains this field + */ + public function renderfield($params, Doku_Form $form, $formid) { + $id = 'bureaucracy__'.md5(rand()); + if(isset($this->opt['id'])) { + $id = $this->opt['id']; + } + $params = array_merge( + array('value' => false), + $this->opt, + $params + ); + $check = $params['value'] ? 'checked="checked"' : ''; + $this->tpl = ''; + parent::renderfield($params, $form, $formid); + } +} diff --git a/lib/plugins/bureaucracy/interfaces/bureaucracy_handler_interface.php b/lib/plugins/bureaucracy/interfaces/bureaucracy_handler_interface.php new file mode 100644 index 0000000..41c461f --- /dev/null +++ b/lib/plugins/bureaucracy/interfaces/bureaucracy_handler_interface.php @@ -0,0 +1,19 @@ + + */ +$lang['e_unknowntype'] = 'Unbekannter Typ "%s"'; +$lang['e_unknownaction'] = 'Unbekannte Aktion "%s"'; +$lang['e_missingargs'] = 'Nicht genug Argumente für %s %s'; +$lang['e_noaction'] = 'Keine Aktion definiert - wohin sollen die Daten gesendet werden?'; +$lang['e_mail'] = 'Beim Versenden der Daten ist ein Fehler aufgetreten'; +$lang['e_unknownconstraint'] = 'Unbekannter Feld-Parameter %s'; +$lang['e_labelpage'] = 'Seite mit Feldnamen %s nicht gefunden'; +$lang['e_required'] = '"%s" muss ausgefüllt werden.'; +$lang['e_match'] = '"%s" wurde nicht korrekt ausgefüllt. %s'; +$lang['checkagainst'] = '(überprüft gegen /%s/)'; +$lang['e_email'] = '"%s" muss eine gültige E-Mail Adresse sein.'; +$lang['e_numeric'] = '"%s" muss eine Nummer sein.'; +$lang['e_date'] = '"%s" muss ein gültiges Datum im Format jjjj-mm-tt sein.'; +$lang['e_time'] = '"%s" muss eine gültige Zeit im Format (h)h:mm(:ss) sein.'; +$lang['e_user'] = '"%s" muss der Name eines existierenden Benutzers sein.'; +$lang['e_users'] = '"%s" muss eine komma-separierte Liste existierender Benutzer sein.'; +$lang['e_min'] = '"%s" muss größer sein als %s.'; +$lang['e_max'] = '"%s" muss kleiner sein als %s.'; +$lang['e_pagename'] = 'Seitenname nicht angegeben.'; +$lang['e_pageexists'] = 'Die Seite "%s" exisistiert bereits. Bitte wählen Sie einen anderen Namen.'; +$lang['e_template'] = 'Das Template "%s" konnte nicht geladen werden. Möglicherweise existiert es nicht oder Sie verfügen nicht über die benötigten Rechte.'; +$lang['e_denied'] = 'Sie sind nicht berechtigt diese Seite anzulegen. Haben Sie vielleicht vergessen sich anzumelden?'; +$lang['mailsubject'] = 'Formulardaten übermittelt von %s'; +$lang['mailintro'] = 'Die folgenden Daten wurden am %s abgeschickt.'; +$lang['mail_thanks'] = 'Ihre Daten wurden erfolgreich versandt. Vielen Dank.'; +$lang['template_thanks'] = 'Die Seite wurde angelegt, folgen Sie dem Link um die neue Seite aufzurufen.'; +$lang['summary'] = 'Erstellt mit dem Formular %s'; +$lang['attachmentMailEmpty'] = '(Datei nicht angegeben)'; +$lang['attachmentMailToLarge'] = '(Datei zu groß für Mail-Anhang)'; +$lang['attachmentMailToLarge_userinfo'] = 'Die Datei "%s" ist zu groß als Mail-Anhang (>%s) (E-Mail ohne Datei gesendet)'; +$lang['submit'] = 'Absenden'; diff --git a/lib/plugins/bureaucracy/lang/de/settings.php b/lib/plugins/bureaucracy/lang/de/settings.php new file mode 100644 index 0000000..f81c634 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/de/settings.php @@ -0,0 +1,8 @@ +%s) (mail was sent nevertheless)'; + +$lang['submit'] = 'Submit'; diff --git a/lib/plugins/bureaucracy/lang/en/settings.php b/lib/plugins/bureaucracy/lang/en/settings.php new file mode 100644 index 0000000..9c8f365 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/en/settings.php @@ -0,0 +1,5 @@ + + */ +$lang['e_unknowntype'] = 'Tipo desconocido "%s"'; +$lang['e_unknownaction'] = 'Acción desconocida "%s"'; +$lang['e_missingargs'] = 'Faltan argumentos para %s %s'; +$lang['e_noaction'] = 'Falta definir la acción - ¿Dónde enviamos los datos?'; +$lang['e_mail'] = 'Algún problema al enviar los datos'; +$lang['e_unknownconstraint'] = 'Faltan los límites del campo %s'; +$lang['e_labelpage'] = 'Pagina de LABELS "%s" no encontrada'; +$lang['e_required'] = '"%s" es necesario'; +$lang['e_match'] = '"%s" no esta completado correctamente. %s'; +$lang['checkagainst'] = '(Comprobado con /%s/i)'; +$lang['e_email'] = '"%s" tiene que ser un eMail válido.'; +$lang['e_numeric'] = '"%s" debe ser numérico.'; +$lang['e_date'] = '"%s" debe que ser una fecha válida con formato yyyy-mm-dd'; +$lang['e_time'] = '"%s" debe ser una hora válida con formato (h)h:mm(:ss)'; +$lang['e_user'] = '"%s" debe ser el nombre de un usuario existente.'; +$lang['e_users'] = '"%s" tiene que contener una lista de usuarios existentes separados por comas.'; +$lang['e_min'] = '"%s" debe ser mayor de %s.'; +$lang['e_max'] = '"%s" debe ser menor de %s.'; +$lang['e_pagename'] = 'Falta el nombre de la página.'; +$lang['e_pageexists'] = 'La pagina "%s" existe. Escoja un nombre diferente.'; +$lang['e_template'] = 'No se puede leer la plantilla "%s". O no existe, o no tenemos permisos de lectura.'; +$lang['e_denied'] = 'No tiene permisos para crear la página, ¿Esta logueado?'; +$lang['mailsubject'] = 'Formulario enviado en %s'; +$lang['mailintro'] = 'Los siguientes datos enviados en %s'; +$lang['mail_thanks'] = 'Formulario enviado correctamente. Gracias.'; +$lang['template_thanks'] = 'La página esta creada, siga el enlace para abrirla.'; +$lang['summary'] = 'Creada desde el formulario en %s'; +$lang['attachmentMailEmpty'] = '(fichero no enviado)'; +$lang['attachmentMailToLarge'] = '(fichero demasiado largo para incrustarlo en un eMail)'; +$lang['attachmentMailToLarge_userinfo'] = 'Fichero "%s" demasiado largo para incrustarlo en un eMail (>%s) (eMail enviado de todas formas)'; +$lang['submit'] = 'Enviar'; diff --git a/lib/plugins/bureaucracy/lang/es/settings.php b/lib/plugins/bureaucracy/lang/es/settings.php new file mode 100644 index 0000000..e783e78 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/es/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['runas'] = 'Afecta el modo plantilla. Use los permisos de este usuario (virtual) cuando compruebe los ACLs para leer plantillas y crear páginas.'; +$lang['maxEmailAttachmentSize'] = 'Maximo tamaño, en Bytes, de los elementos incrustados en un eMail. (por fichero)'; diff --git a/lib/plugins/bureaucracy/lang/fa/lang.php b/lib/plugins/bureaucracy/lang/fa/lang.php new file mode 100644 index 0000000..95043e6 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/fa/lang.php @@ -0,0 +1,38 @@ + + */ +$lang['e_unknowntype'] = 'نوع ناشناخته "%s"'; +$lang['e_unknownaction'] = 'عمل ناشناخته "%s"'; +$lang['e_missingargs'] = 'آرگومانهای ناکافی برای %s %s'; +$lang['e_noaction'] = 'عملی تعریف نشده است- داده‌ها باید به کجا فرستاده شوند؟'; +$lang['e_mail'] = 'در فرستادن داده‌ها اشکالی پیش آمده است'; +$lang['e_unknownconstraint'] = 'قید فیلد ناشناخته %s'; +$lang['e_labelpage'] = 'صفحه برچسب %s یافته نشد'; +$lang['e_required'] = '"%s" ضروری است'; +$lang['e_match'] = '"%s" به درستی پر نشد. %s'; +$lang['checkagainst'] = '(بررسی شده نسبت به /%s/i)'; +$lang['e_email'] = '"%s" باید یک نشانی ایمیل صحیح باشد.'; +$lang['e_numeric'] = '"%s" باید یک عدد باشد.'; +$lang['e_date'] = '"%s" باید یک تاریخ صحیح با صورت yyyy-mm-dd باشد.'; +$lang['e_time'] = '"%s" باید یک زمان صحیح با صورت (h)h:mm(:ss) باشد.'; +$lang['e_user'] = '"%s" باید نام یک کاربر موجود باشد.'; +$lang['e_users'] = '"%s" باید یک لیست جداشده‌باکاما از نام کاربران موجود باشد.'; +$lang['e_min'] = '"%s" باید بزرگتر از %s باشد.'; +$lang['e_max'] = '"%s" باید کمتر از %s باشد.'; +$lang['e_pagename'] = 'نام صفحه فراموش شده است.'; +$lang['e_pageexists'] = 'صفحه "%s" هم‌اکنون موجود است. لطفاً یک نام صفحه متفاوت انتخاب کنید.'; +$lang['e_template'] = 'امکان خواندن قالب "%s" نبود. شاید وجود ندارد یا شما اجازه خواندن را ندارید.'; +$lang['e_denied'] = 'شما اجازه ایجاد این صفحه را ندارید، نکند فراموش کردید وارد حساب کاربری شوید؟'; +$lang['mailsubject'] = 'داده‌های فُرم در %s ارسال شدند. '; +$lang['mailintro'] = 'داده‌های زیر روی %s ارسال شدند. '; +$lang['mail_thanks'] = 'داده‌های شما با موفقیت فرستاده شدند. با تشکر از شما.'; +$lang['template_thanks'] = 'این صفحه ایجاد شده است، برای باز کردن آن روی پیوند کلیک کنید. '; +$lang['summary'] = 'ایجاد شده از فُرم در %s'; +$lang['attachmentMailEmpty'] = '(فایل ارسال نشد)'; +$lang['attachmentMailToLarge'] = '(فایل برای پیوست شدن به ایمیل بیش از حد بزرگ است)'; +$lang['attachmentMailToLarge_userinfo'] = 'فایل "%s" برای پیوست شدن به ایمیل بیش‌ازحد بزرگ است (>%s)(با این‌حال ایمیل فرستاده شد)'; +$lang['submit'] = 'ارسال'; diff --git a/lib/plugins/bureaucracy/lang/fa/settings.php b/lib/plugins/bureaucracy/lang/fa/settings.php new file mode 100644 index 0000000..8bfc3b8 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/fa/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['runas'] = 'روی حالت قالب اثر می‌گذارد. از این اجازه‌های کاربر (مجازی) وقتی استفاده کنید که ACL ها برای خواندن قالبها و ایجاد صفحات بررسی می‌شوند. '; +$lang['maxEmailAttachmentSize'] = 'اندازه حداکثر پیوست‌های ایمیل بر حسب بایت. (به ازای هر فایل)'; diff --git a/lib/plugins/bureaucracy/lang/fr/lang.php b/lib/plugins/bureaucracy/lang/fr/lang.php new file mode 100644 index 0000000..5bae4e0 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/fr/lang.php @@ -0,0 +1,38 @@ + + */ +$lang['e_unknowntype'] = 'Type inconu "%s"'; +$lang['e_unknownaction'] = 'Action inconnue "%s"'; +$lang['e_missingargs'] = 'Pas assez d\'arguments pour %s %s'; +$lang['e_noaction'] = 'Pas d\'action définie - que faire des données ?'; +$lang['e_mail'] = 'Erreur lors de l\'envoi des données'; +$lang['e_unknownconstraint'] = 'Contrainte de champ inconue %s'; +$lang['e_labelpage'] = 'Page de label %s non trouvée.'; +$lang['e_required'] = '"%s" est requis'; +$lang['e_match'] = '"%s" n\'est pas remplis correctement. %s'; +$lang['checkagainst'] = '(vérifié avec /%s/i)'; +$lang['e_email'] = '"%s" doit être une adresse de courriel valide.'; +$lang['e_numeric'] = '"%s" doit être un nombre.'; +$lang['e_date'] = '"%s" doit être une date valide au format yyyy-mm-dd.'; +$lang['e_time'] = '"%s" nécessite une heure valide au format (h)h:mm(:ss).'; +$lang['e_user'] = '"%s" doit être le nom d\'un utilisateur existant.'; +$lang['e_users'] = '"%s" doit être une liste à virgules de noms d\'utilisateurs.'; +$lang['e_min'] = '"%s" doit être plus grand que %s.'; +$lang['e_max'] = '"%s" doit être plus petit que %s.'; +$lang['e_pagename'] = 'Nom de page manquant.'; +$lang['e_pageexists'] = 'La page "%s" existe déjà. Veuillez choisir un autre nom.'; +$lang['e_template'] = 'Modèle "%s" introuvable. Il n\'existe pas ou vous n\'avez pas l\'autorisation de lecture.'; +$lang['e_denied'] = 'Vous n\'avez pas le droit de créer cette page, vous êtes vous connecté ?'; +$lang['mailsubject'] = 'Données du formulaire de la page %s'; +$lang['mailintro'] = 'Les données suivantes ont été envoyées le %s.'; +$lang['mail_thanks'] = 'Données envoyées avec succès. Merci.'; +$lang['template_thanks'] = 'La page est créée, suivez le lien pour l\'ouvrir.'; +$lang['summary'] = 'Créé depuis le formulaire %s'; +$lang['attachmentMailEmpty'] = '(fichier non envoyé)'; +$lang['attachmentMailToLarge'] = '(fichier trop grand comme pièce jointe de courriel)'; +$lang['attachmentMailToLarge_userinfo'] = 'fichier "%s" trop grand comme pièce jointe (>%s). Le message est tout de même parti.'; +$lang['submit'] = 'Envoyer'; diff --git a/lib/plugins/bureaucracy/lang/fr/settings.php b/lib/plugins/bureaucracy/lang/fr/settings.php new file mode 100644 index 0000000..72031df --- /dev/null +++ b/lib/plugins/bureaucracy/lang/fr/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['runas'] = 'Mode «template» : teste les ACL avec les permissions de cet utilisateur (virtuel) pour la lecture des modèles et la création de page.'; +$lang['maxEmailAttachmentSize'] = 'Taille max en octet des pièces jointes dans les courriels. (par fichier)'; diff --git a/lib/plugins/bureaucracy/lang/hr/lang.php b/lib/plugins/bureaucracy/lang/hr/lang.php new file mode 100644 index 0000000..339d3b8 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/hr/lang.php @@ -0,0 +1,38 @@ + + */ +$lang['e_unknowntype'] = 'Nepoznat tip "%s"'; +$lang['e_unknownaction'] = 'Nepoznata aktivnost "%s"'; +$lang['e_missingargs'] = 'Nema dovoljno argumenata za %s %s'; +$lang['e_noaction'] = 'Nema definirane akcije - gdje podaci trebaju biti poslani?'; +$lang['e_mail'] = 'Nešto je pošlo krivo s slanjem ovih podataka'; +$lang['e_unknownconstraint'] = 'Nepoznato ograničenje polja %s'; +$lang['e_labelpage'] = 'Stranica s labelama %s nije nađena'; +$lang['e_required'] = '"%s" je obvezan'; +$lang['e_match'] = '"%s" nije ispravno popunjen. %s'; +$lang['checkagainst'] = '(Provjereno prema /%s/i)'; +$lang['e_email'] = '"%s" treba biti valjana adresa e-pošte.'; +$lang['e_numeric'] = '"%s" treba biti broj.'; +$lang['e_date'] = '"%s" treba biti valjani datum u obliku gggg-mm-dd.'; +$lang['e_time'] = '"%s" treba biti u valjanom obliku (h)h:mm(:ss).'; +$lang['e_user'] = '"%s" treba biti ime postojećeg korisnika.'; +$lang['e_users'] = '"%s" treba biti zarezom odvojena lista imena postojećih korisnika.'; +$lang['e_min'] = '"%s" treba biti veći od %s.'; +$lang['e_max'] = '"%s" treba biti manji od %s.'; +$lang['e_pagename'] = 'Nedostaje ime stranice.'; +$lang['e_pageexists'] = 'Strnaica "%s" već postoji. Molimo odaberite drugo ime stranice.'; +$lang['e_template'] = 'Nemogu pročitati predložak "%s". Možda ne postoji ili nemate pravo čitanja?'; +$lang['e_denied'] = 'Nije Vam dopušteno stvaranje ove stranice, možda ste se zaboravili prijaviti?'; +$lang['mailsubject'] = 'Podaci proslijeđeni u %s'; +$lang['mailintro'] = 'Slijedeći podaci su proslijeđeni u %s.'; +$lang['mail_thanks'] = 'Vaši podaci su uspješno poslani. Hvala.'; +$lang['template_thanks'] = 'Stranica je kreirana, slijedi vezu za njeno otvaranje.'; +$lang['summary'] = 'Kreirano iz forme u %s'; +$lang['attachmentMailEmpty'] = '(datoteka nije poslana)'; +$lang['attachmentMailToLarge'] = '(datoteka prevelika za prilog pošte)'; +$lang['attachmentMailToLarge_userinfo'] = 'datoteka "%s" prevelika za prilog pošte (>%s) (pošta je ipak poslana)'; +$lang['submit'] = 'Proslijedi'; diff --git a/lib/plugins/bureaucracy/lang/hr/settings.php b/lib/plugins/bureaucracy/lang/hr/settings.php new file mode 100644 index 0000000..d9df8dd --- /dev/null +++ b/lib/plugins/bureaucracy/lang/hr/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['runas'] = 'Utječe na mod predloška. Koristi ove (virtualne) ovlasti kada provjeravaš ACL za čitanje predloška i stvaranje stranice.'; +$lang['maxEmailAttachmentSize'] = 'Maksimalna veličina priloga pošti u Bajtovima. (po datoteci)'; diff --git a/lib/plugins/bureaucracy/lang/it/lang.php b/lib/plugins/bureaucracy/lang/it/lang.php new file mode 100644 index 0000000..dcbbd0c --- /dev/null +++ b/lib/plugins/bureaucracy/lang/it/lang.php @@ -0,0 +1,19 @@ + + */ +$lang['e_unknowntype'] = '"%s" という型はありません。'; +$lang['e_unknownaction'] = '不明なアクション「%s」'; +$lang['e_missingargs'] = '%s %s には引数が十分ではありません。'; +$lang['e_noaction'] = 'action が定義されていません - どこにデータを送信するのですか?'; +$lang['e_mail'] = 'データの送信について何かがおかしいです。'; +$lang['e_unknownconstraint'] = '%s という項目制約がありません。'; +$lang['e_labelpage'] = '%s という Labelpage がありません。'; +$lang['e_required'] = '"%s" が必要です。'; +$lang['e_match'] = '"%s" が正しく記入されていません。%s'; +$lang['checkagainst'] = '(/%s/i と照合)'; +$lang['e_email'] = '"%s" は有効なメールアドレスである必要があります。'; +$lang['e_numeric'] = '"%s" は数字である必要があります。'; +$lang['e_date'] = '"%s" は yyyy-mm-dd 形式の日付である必要があります。'; +$lang['e_time'] = '「%s」は、型 (h)h:mm(:ss) に沿った適切な時刻である必要があります。'; +$lang['e_user'] = '"%s" 既存のユーザー名である必要があります。'; +$lang['e_users'] = '"%s" 既存のユーザー名のカンマ区切り一覧である必要があります。'; +$lang['e_min'] = '"%s" は %s より大きい必要があります。'; +$lang['e_max'] = '"%s" は %s より小さい必要があります。'; +$lang['e_pagename'] = 'ページ名がありません。'; +$lang['e_pageexists'] = '"%s" というページは既に存在します。別のページ名を選んで下さい。'; +$lang['e_template'] = '"%s" というテンプレートが読めません。存在しないか読み込み権限がないのではないですか?'; +$lang['e_denied'] = 'このページの作成は許可されません。ログインし忘れていませんか?'; +$lang['mailsubject'] = 'フォームのデータは %s へ送信されました。'; +$lang['mailintro'] = '以下のデータは %s に送信されました。'; +$lang['mail_thanks'] = 'データは正常に送信されました。ありがとう。'; +$lang['template_thanks'] = 'ページは作成されました。開くためにリンクをたどってください。'; +$lang['summary'] = '%s のフォームから作成されました。'; +$lang['attachmentMailEmpty'] = '(ファイル未選択)'; +$lang['attachmentMailToLarge'] = '(メールに添付するにはファイルが大き過ぎます)'; +$lang['attachmentMailToLarge_userinfo'] = 'ファイル「%s」はメールに添付するには大き過ぎます(>%s)(メール自体は送信されました)'; +$lang['submit'] = '送信'; diff --git a/lib/plugins/bureaucracy/lang/ja/settings.php b/lib/plugins/bureaucracy/lang/ja/settings.php new file mode 100644 index 0000000..ae1478a --- /dev/null +++ b/lib/plugins/bureaucracy/lang/ja/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['runas'] = 'テンプレートモードに影響があります。テンプレートを読み込み、ページを作成するために ACL チェックする場合、この(仮想)ユーザーの権限を使用してください。'; +$lang['maxEmailAttachmentSize'] = 'メールに添付するファイルの最大サイズ(バイト数/1ファイルごと)'; diff --git a/lib/plugins/bureaucracy/lang/lv/lang.php b/lib/plugins/bureaucracy/lang/lv/lang.php new file mode 100644 index 0000000..167971e --- /dev/null +++ b/lib/plugins/bureaucracy/lang/lv/lang.php @@ -0,0 +1,30 @@ + + */ +$lang['e_unknowntype'] = 'Onbekend type "%s"'; +$lang['e_unknownaction'] = 'Onbekende actie "%s"'; +$lang['e_missingargs'] = 'Onvoldoende argumenten voor %s %s'; +$lang['e_noaction'] = 'Geen aktie opgegeven - waar moeten de gegevens heen?'; +$lang['e_mail'] = 'Het versturen van de gegevens is mislukt'; +$lang['e_unknownconstraint'] = 'Onbekende veld voorwaarde %s'; +$lang['e_labelpage'] = 'Labelpagina %s is niet gevonden'; +$lang['e_required'] = '"%s" is verplicht'; +$lang['e_match'] = '"%s" heeft een ongeldige waarde. %s'; +$lang['checkagainst'] = '(Moet voldoen aan /%s/i)'; +$lang['e_email'] = '"%s" moet een geldig e-mail adres zijn.'; +$lang['e_numeric'] = '"%s" moet een nummer zijn.'; +$lang['e_date'] = '"%s" moet een geldige datum zijn in het formaat jjjj-mm-dd.'; +$lang['e_time'] = '"%s" moet een geldige tijdstip zijn in het formaat (u)u:mm(:ss)'; +$lang['e_user'] = '"%s" moet de naam van een bestaande gebruiker zijn.'; +$lang['e_users'] = '"%s" moet een komma-gescheiden lijst van bestaande gebruikers zijn.'; +$lang['e_min'] = '"%s" moet groter zijn dan %s.'; +$lang['e_max'] = '"%s" moet kleiner zijn dan %s.'; +$lang['e_pagename'] = 'Pagina naam ontbreekt.'; +$lang['e_pageexists'] = 'De pagina "%s" bestaat al. Kies een andere pagina naam.'; +$lang['e_template'] = 'Kon de template "%s" niet lezen. wellicht bestaat de pagina niet of zijn de rechten onvoldoende?'; +$lang['e_denied'] = 'Onvoldoende rechten om deze pagina te maken, niet ingelogd?'; +$lang['mailsubject'] = 'Formulier gegevens verstuurd op %s'; +$lang['mailintro'] = 'De volgende gegevens zijn verstuurd op %s.'; +$lang['mail_thanks'] = 'De gegevens zijn verstuurt. Bedankt.'; +$lang['template_thanks'] = 'De pagina is aangemaakt, volg de link om hem te openen.'; +$lang['summary'] = 'Gemaakt door het formulier op %s'; +$lang['attachmentMailEmpty'] = '(bestand niet ingediend)'; +$lang['attachmentMailToLarge'] = '(bestand te groot voor een e-mailbijlage)'; +$lang['attachmentMailToLarge_userinfo'] = 'bestand "%s" te groot voor de e-mailbijlage (>%s) (e-mail is niettemin verstuurd)'; +$lang['submit'] = 'Submit'; diff --git a/lib/plugins/bureaucracy/lang/nl/settings.php b/lib/plugins/bureaucracy/lang/nl/settings.php new file mode 100644 index 0000000..9a10022 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/nl/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['runas'] = 'Gebruikt in de template mode. Gebruik de rechten van deze (virtuele) gebruiker bij het controleren van de ACL gebruiker voor het lezen van templates en het maken van pagina\'s'; +$lang['maxEmailAttachmentSize'] = 'Max grootte van e-mailbijlages in Bytes. (per bestand)'; diff --git a/lib/plugins/bureaucracy/lang/no/lang.php b/lib/plugins/bureaucracy/lang/no/lang.php new file mode 100644 index 0000000..27916f4 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/no/lang.php @@ -0,0 +1,39 @@ + + */ +$lang['e_unknowntype'] = 'Tipo desconhecido "%s".'; +$lang['e_unknownaction'] = 'Ação desconhecida "%s"'; +$lang['e_missingargs'] = 'Argumentos insuficientes para %s %s.'; +$lang['e_noaction'] = 'Nenhuma ação definida - para onde deveriam os dados ser enviados?'; +$lang['e_mail'] = 'Ocorreu algum erro com o envio dos dados.'; +$lang['e_unknownconstraint'] = 'Restrição %s de campo desconhecida.'; +$lang['e_labelpage'] = 'Página de etiquetas "%s" não encontrada'; +$lang['e_required'] = '"%s" é requerido.'; +$lang['e_match'] = '"%s" não foi corretamente preenchido. %s'; +$lang['checkagainst'] = '(Comparado com /%s/i)'; +$lang['e_email'] = '"%s" tem de ser um endereço de email válido.'; +$lang['e_numeric'] = '"%s" tem de ser um número.'; +$lang['e_date'] = '"%s" tem de ser uma data válida no formato dd-mm-yyyy.'; +$lang['e_time'] = '"%s" tem de ser um horário válido no formato (h)h:mm(:ss).'; +$lang['e_user'] = '"%s" tem de ser o nome de um usuário existente.'; +$lang['e_users'] = '"%s" tem de ser uma lista de nomes de usuários existentes separados por vírgulas.'; +$lang['e_min'] = '"%s" tem de ser maior que %s.'; +$lang['e_max'] = '"%s" tem de ser menor que %s.'; +$lang['e_pagename'] = 'Falta o nome da página.'; +$lang['e_pageexists'] = 'A página "%s" já existe. Escolha outro nome de página.'; +$lang['e_template'] = 'O modelo "%s" não pode ser lido. Talvez não exista ou você não tem permissão de lê-lo?'; +$lang['e_denied'] = 'Você não pode criar esta página. Esqueceu-se de Entrar?'; +$lang['mailsubject'] = 'Formulário de dados submetido em %s.'; +$lang['mailintro'] = 'Os dados seguintes foram submetidos em %s.'; +$lang['mail_thanks'] = 'Seus dados foram enviados com sucesso. Obrigado.'; +$lang['template_thanks'] = 'A página foi criada, clique no link para abri-la.'; +$lang['summary'] = 'Criada a partir do formulário em %s.'; +$lang['attachmentMailEmpty'] = '(arquivo não enviado)'; +$lang['attachmentMailToLarge'] = '(arquivo muito grande para anexo de e-mail)'; +$lang['attachmentMailToLarge_userinfo'] = 'arquivo "%s" muito grande para anexo de e-mail (>%s) (mensagem enviada mesmo assim)'; +$lang['submit'] = 'Enviar'; diff --git a/lib/plugins/bureaucracy/lang/pt-br/settings.php b/lib/plugins/bureaucracy/lang/pt-br/settings.php new file mode 100644 index 0000000..6fe8367 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/pt-br/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['runas'] = 'Afeta o modo de template. Use estas permissões de usuário (virtual) quando verificando ACLs para leitura de templates e criação de páginas.'; +$lang['maxEmailAttachmentSize'] = 'Tamanho máximo para anexos de e-mail em Bytes. (por arquivo)'; diff --git a/lib/plugins/bureaucracy/lang/pt/lang.php b/lib/plugins/bureaucracy/lang/pt/lang.php new file mode 100644 index 0000000..bc7a494 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/pt/lang.php @@ -0,0 +1,39 @@ + + * @author Rafael Grando + */ +$lang['e_unknowntype'] = 'Tipo desconhecido "%s"'; +$lang['e_unknownaction'] = 'Ação desconhecida "%s"'; +$lang['e_missingargs'] = 'Argumentos insuficientes para %s %s'; +$lang['e_noaction'] = 'Nenhuma ação definida - para onde os dados devem ser enviados?'; +$lang['e_mail'] = 'Algo deu errado ao enviar esses dados'; +$lang['e_unknownconstraint'] = 'Restrição de campo desconhecida %s'; +$lang['e_labelpage'] = 'Labelpage %s não encontrada'; +$lang['e_required'] = '"%s" é obrigatório'; +$lang['e_match'] = '"%s" não foi preenchido corretamente. %s'; +$lang['checkagainst'] = '(Verificado contra /%s/i)'; +$lang['e_email'] = '"%s" precisa ser um endereço de email válido.'; +$lang['e_numeric'] = '"%s" precisa ser um número.'; +$lang['e_date'] = '"%s" precisa ser uma data válida no formato aaaa-mm-dd.'; +$lang['e_time'] = '"%s" precisa ser um horário válido no formato (h)h:mm:(:ss).'; +$lang['e_user'] = '"%s" precisa ser o nome de um usuário existente.'; +$lang['e_users'] = '"%s" precisa ser uma lista separada por vírgulas de nomes de usuários existentes.'; +$lang['e_min'] = '"%s" precisa ser maior que %s.'; +$lang['e_max'] = '"%s" precisa ser menor que %s.'; +$lang['e_pagename'] = 'Nome da página ausente.'; +$lang['e_pageexists'] = 'A página "%s" já existe. Por favor, escolha um nome diferente para a página.'; +$lang['e_template'] = 'Não foi possível ler o modelo "%s". Talvez ele não exista ou você não tenha permissões de leitura?'; +$lang['e_denied'] = 'Você não está autorizado a criar esta página. Talvez tenha esquecido de entrar?'; +$lang['mailsubject'] = 'Dados do formulário enviados às %s'; +$lang['mailintro'] = 'Os dados a seguir foram enviados em %s.'; +$lang['mail_thanks'] = 'Seus dados foram enviados com sucesso. Obrigado.'; +$lang['template_thanks'] = 'A página foi criada, siga o link para abri-la.'; +$lang['summary'] = 'Criado do formulário às %s.'; +$lang['attachmentMailEmpty'] = '(arquivo não enviado)'; +$lang['attachmentMailToLarge'] = '(arquivo muito grande para anexar ao email)'; +$lang['attachmentMailToLarge_userinfo'] = 'arquivo "%s" é muito grande para anexar ao email (>%s) (email enviado mesmo assim)'; +$lang['submit'] = 'Enviar'; diff --git a/lib/plugins/bureaucracy/lang/pt/settings.php b/lib/plugins/bureaucracy/lang/pt/settings.php new file mode 100644 index 0000000..174eb1c --- /dev/null +++ b/lib/plugins/bureaucracy/lang/pt/settings.php @@ -0,0 +1,9 @@ + + */ +$lang['runas'] = 'Afeta o modo template. Use essas permissões (virtuais) de usuário quando checar ACLs para ler modelos e criar páginas.'; +$lang['maxEmailAttachmentSize'] = 'Tamanho máximo de anexos em bytes. (por arquivo)'; diff --git a/lib/plugins/bureaucracy/lang/ru/lang.php b/lib/plugins/bureaucracy/lang/ru/lang.php new file mode 100644 index 0000000..61e27d9 --- /dev/null +++ b/lib/plugins/bureaucracy/lang/ru/lang.php @@ -0,0 +1,39 @@ + + * @author Yuriy Skalko + */ +$lang['e_unknowntype'] = 'Неизвестный тип «%s»'; +$lang['e_unknownaction'] = 'Неизвестное действие «%s»'; +$lang['e_missingargs'] = 'Недостаточно аргументов для %s %s'; +$lang['e_noaction'] = 'Не указано действие (action). Куда следует отправить данные?'; +$lang['e_mail'] = 'Что-то пошло не так при отправке данных'; +$lang['e_unknownconstraint'] = 'Неизвестный ограничитель поля %s'; +$lang['e_labelpage'] = 'Не найдена страница меток: %s'; +$lang['e_required'] = 'Поле «%s» обязательно для заполнения'; +$lang['e_match'] = 'Поле «%s» заполнено неверно. %s'; +$lang['checkagainst'] = '(Проверяется по /%s/i)'; +$lang['e_email'] = 'Поле «%s» должно содержать корректный адрес электронной почты.'; +$lang['e_numeric'] = 'Поле «%s» должно содержать число.'; +$lang['e_date'] = 'Поле «%s» должно содержать корректную дату в формате ГГГГ-ММ-ДД'; +$lang['e_time'] = 'Поле «%s» должно быть допустимым временем в формате (ч)ч:мм(:сс)'; +$lang['e_user'] = 'Поле «%s» должно содержать имя существующего пользователя.'; +$lang['e_users'] = 'Поле «%s» должно содержать разделённый запятыми перечень имён (логинов) зарегистрированных пользователей.'; +$lang['e_min'] = 'Поле «%s» должно быть больше %s.'; +$lang['e_max'] = 'Поле «%s» должно быть меньше %s.'; +$lang['e_pagename'] = 'Отсутствует имя страницы.'; +$lang['e_pageexists'] = 'Страница «%s» уже существует. Пожалуйста, выберите другое имя.'; +$lang['e_template'] = 'Невозможно прочитать шаблон «%s». Возможно, он не существует, или у вас не хватает прав для чтения.'; +$lang['e_denied'] = 'Вам не разрешено создавать эту страницу. Возможно, вы забыли войти?'; +$lang['mailsubject'] = 'Данные формы отправлены с %s'; +$lang['mailintro'] = 'Следующие данные отправлены %s.'; +$lang['mail_thanks'] = 'Ваши данные отправлены успешно. Спасибо.'; +$lang['template_thanks'] = 'Страница создана, следуйте по ссылке, чтобы открыть её.'; +$lang['summary'] = 'Создано по форме с %s'; +$lang['attachmentMailEmpty'] = '(файл не отправлен)'; +$lang['attachmentMailToLarge'] = '(файл слишком большой для почтового вложения)'; +$lang['attachmentMailToLarge_userinfo'] = 'файл «%s» слишком большой для почтового вложения (>%s) (само сообщение отправлено)'; +$lang['submit'] = 'Отправить'; diff --git a/lib/plugins/bureaucracy/lang/ru/settings.php b/lib/plugins/bureaucracy/lang/ru/settings.php new file mode 100644 index 0000000..cb8fe7b --- /dev/null +++ b/lib/plugins/bureaucracy/lang/ru/settings.php @@ -0,0 +1,10 @@ + + * @author Yuriy Skalko + */ +$lang['runas'] = '(Влияет на режим шаблона.) Использовать права этого (виртуального) пользователя при проверке доступа для чтения шаблонов и создания страниц.'; +$lang['maxEmailAttachmentSize'] = 'Максимальный размер почтовых вложений в байтах. (на файл)'; diff --git a/lib/plugins/bureaucracy/lang/zh/lang.php b/lib/plugins/bureaucracy/lang/zh/lang.php new file mode 100644 index 0000000..84d6c5b --- /dev/null +++ b/lib/plugins/bureaucracy/lang/zh/lang.php @@ -0,0 +1,39 @@ + + **/ + +jQuery(function () { + + jQuery('form.bureaucracy__plugin').each(function () { + + //show/hide fieldset and trigger depending children + function updateFieldset(input) { + jQuery.each(jQuery(input).data('dparray'), function (i, dp) { + var showOrHide = + input.parentNode.parentNode.style.display !== 'none' && // input/checkbox is displayed AND + ((input.checked === dp.tval) || // ( checkbox is checked + (input.type !== 'checkbox' && (dp.tval === true && input.value !== '')) || // OR no checkbox, but input is set + input.value === dp.tval); // OR input === dp.tval ) + + dp.fset.toggle(showOrHide); + + dp.fset.find('input,select') + .each(function () { + //toggle required attribute + var $inputelem = jQuery(this); + if($inputelem.hasClass('required')) { + if(showOrHide) { + $inputelem.attr('required', 'required'); + } else { + $inputelem.removeAttr('required') + } + } + //update dependencies + if ($inputelem.data('dparray')) { + $inputelem.change(); + } + }); + }); + } + + //look for p (with info about controller) in depending fieldsets + jQuery('p.bureaucracy_depends', this) + .each(function () { + //get controller info + var fname = jQuery(this).find('span.bureaucracy_depends_fname').html(), + fvalue = jQuery(this).find('span.bureaucracy_depends_fvalue'); + fvalue = (fvalue.length ? fvalue.html() : true); + + //get controller field and add info and change event to the input that controls depending fieldset + var fieldsetinfo = { + fset: jQuery(this).parent(), + tval: fvalue + }; + + jQuery("label") + .has(":first-child:contains('" + fname + "')").first() + .find("select,input:last") //yesno field contains first a hidden input + .each(function () { + if (!jQuery(this).data('dparray')) { + jQuery(this).data('dparray', [fieldsetinfo]); + } else { + jQuery(this).data('dparray').push(fieldsetinfo); + } + }) + .bind('change keyup', function () { + updateFieldset(this); + }) + .change(); + + }) + .hide(); //hide p.bureaucracy_depends in fieldset + + }); +}); diff --git a/lib/plugins/bureaucracy/script/user.js b/lib/plugins/bureaucracy/script/user.js new file mode 100644 index 0000000..9d5d806 --- /dev/null +++ b/lib/plugins/bureaucracy/script/user.js @@ -0,0 +1,90 @@ +/** + * Provides a list of matching user names while user inputs into a userpicker + * + * @author Adrian Lang + * @author Gerrit Uitslag + */ +jQuery(function () { + /** + * Ajax request for user suggestions + * + * @param {Object} request object, with single 'term' property + * @param {Function} response callback, argument: the data array to suggest to the user. + * @param {Function} getterm callback, argument: the request Object, returns: search term + */ + function ajaxsource(request, response, getterm) { + jQuery.getJSON( + DOKU_BASE + 'lib/exe/ajax.php', { + call: 'bureaucracy_user_field', + search: getterm(request) + }, function (data) { + response(jQuery.map(data, function (name, user) { + return { + label: name + ' (' + user + ')', + value: user + } + })) + } + ); + } + + function split(val) { + return val.split(/,\s*/); + } + + function extractLast(term) { + return split(term).pop(); + } + + + /** + * pick one user + */ + jQuery(".userpicker").autocomplete({ + source: function (request, response) { + ajaxsource(request, response, function (req) { + return req.term + }) + } + }); + + /** + * pick one or more users + */ + jQuery(".userspicker") + // don't navigate away from the field on tab when selecting an item + .bind("keydown", function (event) { + if (event.keyCode === jQuery.ui.keyCode.TAB && + jQuery(this).data("ui-autocomplete").menu.active) { + event.preventDefault(); + } + }) + .autocomplete({ + minLength: 0, + source: function (request, response) { + ajaxsource(request, response, function (req) { + return extractLast(req.term) + }) + }, + search: function () { + // custom minLength + var term = extractLast(this.value); + return term.length >= 2; + }, + focus: function () { + // prevent value inserted on focus + return false; + }, + select: function (event, ui) { + var terms = split(this.value); + // remove the current input + terms.pop(); + // add the selected item + terms.push(ui.item.value); + // add placeholder to get the comma-and-space at the end + terms.push(""); + this.value = terms.join(", "); + return false; + } + }); +}); diff --git a/lib/plugins/bureaucracy/style.css b/lib/plugins/bureaucracy/style.css new file mode 100644 index 0000000..966de61 --- /dev/null +++ b/lib/plugins/bureaucracy/style.css @@ -0,0 +1,101 @@ +/* Success message */ +.dokuwiki div.bureaucracy__plugin { + width: 50%; + font-size: 120%; + padding: 2em; +} + +/* Form */ +.dokuwiki form.bureaucracy__plugin { + width: 100%; + text-align: center; + margin: 2em 0; + display: block; +} + +.dokuwiki form.bureaucracy__plugin p { + font-size: 90%; + margin-top: 0.5em; +} + +.dokuwiki form.bureaucracy__plugin fieldset { + width: 80%; + text-align: left; + margin-top: 0.5em; + margin-bottom: 0.5em; +} + +.dokuwiki form.bureaucracy__plugin label { + display: block; + text-align: right; + line-height: 2em; +} + +.dokuwiki form.bureaucracy__plugin label>span { + display: inline-block; + width: 47%; + line-height: normal; +} +.dokuwiki form.bureaucracy__plugin label.textareafield { + text-align: left; +} +.dokuwiki form.bureaucracy__plugin label.textareafield>span { + width: 100%; +} + +.dokuwiki form.bureaucracy__plugin label input.edit, +.dokuwiki form.bureaucracy__plugin label select { + width: 50%; +} +.dokuwiki form.bureaucracy__plugin label input.datepicker, +.dokuwiki form.bureaucracy__plugin label input.timefield { + width: 25%; + margin-right: 25%; +} + +.dokuwiki form.bureaucracy__plugin label textarea.edit { + width: 100%; +} +.dokuwiki form.bureaucracy__plugin label input[type=checkbox] { + width: 5%; + margin-right: 45%; +} + +.dokuwiki form.bureaucracy__plugin input.button { + margin: 3px 0 3px 50%; + display: block; +} +.dokuwiki form.bureaucracy__plugin label.radiolabel span{ + width: 100%; + text-align: left; +} +.dokuwiki form.bureaucracy__plugin label input[type=radio]~span { + width: 50%; + display: inline-block; + text-align: left; + line-height: normal; +} + +.dokuwiki form.bureaucracy__plugin label.bureaucracy_error span { + color: #F00; +} + +.dokuwiki form.bureaucracy__plugin #plugin__captcha_wrapper label { + text-align: left; +} +/*responsive - small screen*/ +@media (max-width: 480px) { + .dokuwiki form.bureaucracy__plugin label { + text-align: left; + } + .dokuwiki form.bureaucracy__plugin label>span { + width: 100%; + } + .dokuwiki form.bureaucracy__plugin input.button { + margin-left: 0; + } + .dokuwiki form.bureaucracy__plugin label .edit, + .dokuwiki form.bureaucracy__plugin label select { + width: 100% !important; + } +} \ No newline at end of file diff --git a/lib/plugins/bureaucracy/syntax.php b/lib/plugins/bureaucracy/syntax.php new file mode 100644 index 0000000..454dd60 --- /dev/null +++ b/lib/plugins/bureaucracy/syntax.php @@ -0,0 +1,625 @@ + + * @author Adrian Lang + */ +// must be run within Dokuwiki +use dokuwiki\Utf8\PhpString; + +if(!defined('DOKU_INC')) die(); + +/** + * All DokuWiki plugins to extend the parser/rendering mechanism + * need to inherit from this class + */ +class syntax_plugin_bureaucracy extends DokuWiki_Syntax_Plugin { + + private $form_id = 0; + var $patterns = array(); + var $values = array(); + var $noreplace = null; + var $functions = array(); + + /** + * Prepare some replacements + */ + public function __construct() { + $this->prepareDateTimereplacements(); + $this->prepareNamespacetemplateReplacements(); + $this->prepareFunctions(); + } + + /** + * What kind of syntax are we? + */ + public function getType() { + return 'substition'; + } + + /** + * What about paragraphs? + */ + public function getPType() { + return 'block'; + } + + /** + * Where to sort in? + */ + public function getSort() { + return 155; + } + + /** + * Connect pattern to lexer + * + * @param string $mode + */ + public function connectTo($mode) { + $this->Lexer->addSpecialPattern('
    .*?
    ', $mode, 'plugin_bureaucracy'); + } + + /** + * Handler to prepare matched data for the rendering process + * + * @param string $match The text matched by the patterns + * @param int $state The lexer state for the match + * @param int $pos The character position of the matched text + * @param Doku_Handler $handler The Doku_Handler object + * @return bool|array Return an array with all data you want to use in render, false don't add an instruction + */ + public function handle($match, $state, $pos, Doku_Handler $handler) { + $match = substr($match, 6, -7); // remove form wrap + $lines = explode("\n", $match); + $actions = $rawactions = array(); + $thanks = ''; + $labels = ''; + + // parse the lines into an command/argument array + $cmds = array(); + while(count($lines) > 0) { + $line = trim(array_shift($lines)); + if(!$line) continue; + $args = $this->_parse_line($line, $lines); + $args[0] = $this->_sanitizeClassName($args[0]); + + if(in_array($args[0], array('action', 'thanks', 'labels'))) { + if(count($args) < 2) { + msg(sprintf($this->getLang('e_missingargs'), hsc($args[0]), hsc($args[1])), -1); + continue; + } + + // is action element? + if($args[0] == 'action') { + array_shift($args); + $rawactions[] = array('type' => array_shift($args), 'argv' => $args); + continue; + } + + // is thank you text? + if($args[0] == 'thanks') { + $thanks = $args[1]; + continue; + } + + // is labels? + if($args[0] == 'labels') { + $labels = $args[1]; + continue; + } + } + + if(strpos($args[0], '_') === false) { + $name = 'bureaucracy_field' . $args[0]; + } else { + //name convention: plugin_componentname + $name = $args[0]; + } + + /** @var helper_plugin_bureaucracy_field $field */ + $field = $this->loadHelper($name, false); + if($field && is_a($field, 'helper_plugin_bureaucracy_field')) { + $field->initialize($args); + $cmds[] = $field; + } else { + $evdata = array('fields' => &$cmds, 'args' => $args); + $event = new Doku_Event('PLUGIN_BUREAUCRACY_FIELD_UNKNOWN', $evdata); + if($event->advise_before()) { + msg(sprintf($this->getLang('e_unknowntype'), hsc($name)), -1); + } + } + + } + + // check if action is available + foreach($rawactions as $action) { + $action['type'] = $this->_sanitizeClassName($action['type']); + + if(strpos($action['type'], '_') === false) { + $action['actionname'] = 'bureaucracy_action' . $action['type']; + } else { + //name convention for other plugins: plugin_componentname + $action['actionname'] = $action['type']; + } + + list($plugin, $component) = explode('_', $action['actionname']); + $alternativename = $action['type'] . '_'. $action['type']; + + // bureaucracy_action or _ + if(!plugin_isdisabled($action['actionname']) || @file_exists(DOKU_PLUGIN . $plugin . '/helper/' . $component . '.php')) { + $actions[] = $action; + + // shortcut for other plugins with component name _ + } elseif(plugin_isdisabled($alternativename) || !@file_exists(DOKU_PLUGIN . $action['type'] . '/helper/' . $action['type'] . '.php')) { + $action['actionname'] = $alternativename; + $actions[] = $action; + + // not found + } else { + $evdata = array('actions' => &$actions, 'action' => $action); + $event = new Doku_Event('PLUGIN_BUREAUCRACY_ACTION_UNKNOWN', $evdata); + if($event->advise_before()) { + msg(sprintf($this->getLang('e_unknownaction'), hsc($action['actionname'])), -1); + } + } + } + + // action(s) found? + if(count($actions) < 1) { + msg($this->getLang('e_noaction'), -1); + } + + // set thank you message + if(!$thanks) { + $thanks = ""; + foreach($actions as $action) { + $thanks .= $this->getLang($action['type'] . '_thanks'); + } + } else { + $thanks = hsc($thanks); + } + return array( + 'fields' => $cmds, + 'actions' => $actions, + 'thanks' => $thanks, + 'labels' => $labels + ); + } + + /** + * Handles the actual output creation. + * + * @param string $format output format being rendered + * @param Doku_Renderer $R the current renderer object + * @param array $data data created by handler() + * @return boolean rendered correctly? (however, returned value is not used at the moment) + */ + public function render($format, Doku_Renderer $R, $data) { + if($format != 'xhtml') return false; + $R->info['cache'] = false; // don't cache + + /** + * replace some time and name placeholders in the default values + * @var $field helper_plugin_bureaucracy_field + */ + foreach($data['fields'] as &$field) { + if(isset($field->opt['value'])) { + $field->opt['value'] = $this->replace($field->opt['value']); + } + } + + if($data['labels']) $this->loadlabels($data); + + $this->form_id++; + if(isset($_POST['bureaucracy']) && checkSecurityToken() && $_POST['bureaucracy']['$$id'] == $this->form_id) { + $success = $this->_handlepost($data); + if($success !== false) { + $R->doc .= '
    ' . $success . '
    '; + return true; + } + } + + $R->doc .= $this->_htmlform($data['fields']); + + return true; + } + + /** + * Initializes the labels, loaded from a defined labelpage + * + * @param array $data all data passed to render() + */ + protected function loadlabels(&$data) { + global $INFO; + $labelpage = $data['labels']; + $exists = false; + resolve_pageid($INFO['namespace'], $labelpage, $exists); + if(!$exists) { + msg(sprintf($this->getLang('e_labelpage'), html_wikilink($labelpage)), -1); + return; + } + + // parse simple list (first level cdata only) + $labels = array(); + $instructions = p_cached_instructions(wikiFN($labelpage)); + $inli = 0; + $item = ''; + foreach($instructions as $instruction) { + if($instruction[0] == 'listitem_open') { + $inli++; + continue; + } + if($inli === 1 && $instruction[0] == 'cdata') { + $item .= $instruction[1][0]; + } + if($instruction[0] == 'listitem_close') { + $inli--; + if($inli === 0) { + list($k, $v) = explode('=', $item, 2); + $k = trim($k); + $v = trim($v); + if($k && $v) $labels[$k] = $v; + $item = ''; + } + } + } + + // apply labels to all fields + $len = count($data['fields']); + for($i = 0; $i < $len; $i++) { + if(isset($data['fields'][$i]->depends_on)) { + // translate dependency on fieldsets + $label = $data['fields'][$i]->depends_on[0]; + if(isset($labels[$label])) { + $data['fields'][$i]->depends_on[0] = $labels[$label]; + } + + } else if(isset($data['fields'][$i]->opt['label'])) { + // translate field labels + $label = $data['fields'][$i]->opt['label']; + if(isset($labels[$label])) { + $data['fields'][$i]->opt['display'] = $labels[$label]; + } + } + } + + if(isset($data['thanks'])) { + if(isset($labels[$data['thanks']])) { + $data['thanks'] = $labels[$data['thanks']]; + } + } + + } + + /** + * Validate posted data, perform action(s) + * + * @param array $data all data passed to render() + * @return bool|string + * returns thanks message when fields validated and performed the action(s) succesfully; + * otherwise returns false. + */ + private function _handlepost($data) { + $success = true; + foreach($data['fields'] as $index => $field) { + /** @var $field helper_plugin_bureaucracy_field */ + + $isValid = true; + if($field->getFieldType() === 'file') { + $file = array(); + foreach($_FILES['bureaucracy'] as $key => $value) { + $file[$key] = $value[$index]; + } + $isValid = $field->handle_post($file, $data['fields'], $index, $this->form_id); + + } elseif($field->getFieldType() === 'fieldset' || !$field->hidden) { + $isValid = $field->handle_post($_POST['bureaucracy'][$index] ?? null, $data['fields'], $index, $this->form_id); + } + + if(!$isValid) { + // Do not return instantly to allow validation of all fields. + $success = false; + } + } + if(!$success) { + return false; + } + + $thanks_array = array(); + + foreach($data['actions'] as $actionData) { + /** @var helper_plugin_bureaucracy_action $action */ + $action = $this->loadHelper($actionData['actionname'], false); + + // action helper found? + if(!$action) { + msg(sprintf($this->getLang('e_unknownaction'), hsc($actionData['actionname'])), -1); + return false; + } + + try { + $thanks_array[] = $action->run( + $data['fields'], + $data['thanks'], + $actionData['argv'] + ); + } catch(Exception $e) { + msg($e->getMessage(), -1); + return false; + } + } + + // Perform after_action hooks + foreach($data['fields'] as $field) { + $field->after_action(); + } + + // create thanks string + $thanks = implode('', array_unique($thanks_array)); + + return $thanks; + } + + /** + * Create the form + * + * @param helper_plugin_bureaucracy_field[] $fields array with form fields + * @return string html of the form + */ + private function _htmlform($fields) { + global $INFO; + + $form = new Doku_Form(array('class' => 'bureaucracy__plugin', + 'id' => 'bureaucracy__plugin' . $this->form_id, + 'enctype' => 'multipart/form-data')); + $form->addHidden('id', $INFO['id']); + $form->addHidden('bureaucracy[$$id]', $this->form_id); + + foreach($fields as $id => $field) { + $field->renderfield(array('name' => 'bureaucracy[' . $id . ']'), $form, $this->form_id); + } + + return $form->getForm(); + } + + /** + * Parse a line into (quoted) arguments + * Splits line at spaces, except when quoted + * + * @author William Fletcher + * + * @param string $line line to parse + * @param array $lines all remaining lines + * @return array with all the arguments + */ + private function _parse_line($line, &$lines) { + $args = array(); + $inQuote = false; + $escapedQuote = false; + $arg = ''; + do { + $len = strlen($line); + for($i = 0; $i < $len; $i++) { + if($line[$i] == '"') { + if($inQuote) { + if($escapedQuote) { + $arg .= '"'; + $escapedQuote = false; + continue; + } + if($i + 1 < $len && $line[$i + 1] == '"') { + $escapedQuote = true; + continue; + } + array_push($args, $arg); + $inQuote = false; + $arg = ''; + continue; + } else { + $inQuote = true; + continue; + } + } else if($line[$i] == ' ') { + if($inQuote) { + $arg .= ' '; + continue; + } else { + if(strlen($arg) < 1) continue; + array_push($args, $arg); + $arg = ''; + continue; + } + } + $arg .= $line[$i]; + } + if(!$inQuote || count($lines) === 0) break; + $line = array_shift($lines); + $arg .= "\n"; + } while(true); + if(strlen($arg) > 0) array_push($args, $arg); + return $args; + } + + /** + * Clean class name + * + * @param string $classname + * @return string cleaned name + */ + private function _sanitizeClassName($classname) { + return preg_replace('/[^\w\x7f-\xff]/', '', strtolower($classname)); + } + + /** + * Save content in tags into $this->noreplace + * + * @param string $input The text to work on + */ + protected function noreplace_save($input) { + $pattern = '/(.*?)<\/noreplace>/is'; + //save content of tags + preg_match_all($pattern, $input, $matches); + $this->noreplace = $matches[1]; + } + + /** + * Apply replacement patterns and values as prepared earlier + * (disable $strftime to prevent double replacements with default strftime() replacements in nstemplate) + * + * @param string $input The text to work on + * @param bool $strftime Apply strftime() replacements + * @return string processed text + */ + function replace($input, $strftime = true) { + //in helper_plugin_struct_field::setVal $input can be an array + //just return $input in that case + if (!is_string($input)) return $input; + if (is_null($this->noreplace)) $this->noreplace_save($input); + + foreach ($this->values as $label => $value) { + $pattern = $this->patterns[$label]; + if (is_callable($value)) { + $input = preg_replace_callback( + $pattern, + $value, + $input + ); + } else { + $input = preg_replace($pattern, $value, $input); + } + + } + + if($strftime) { + $input = preg_replace_callback( + '/%./', + function($m){return strftime($m[0]);}, + $input + ); + } + // user syntax: %%.(.*?) + // strftime() is already applied once, so syntax is at this point: %.(.*?) + $input = preg_replace_callback( + '/@DATE\((.*?)(?:,\s*(.*?))?\)@/', + array($this, 'replacedate'), + $input + ); + + //run functions + foreach ($this->functions as $name => $callback) { + $pattern = '/@' . preg_quote($name) . '\((.*?)\)@/'; + if (is_callable($callback)) { + $input = preg_replace_callback($pattern, function ($matches) use ($callback) { + return call_user_func($callback, $matches[1]); + }, $input); + } + } + + //replace tags with their original content + $pattern = '/.*?<\/noreplace>/is'; + if (is_array($this->noreplace)) foreach ($this->noreplace as $nr) { + $input = preg_replace($pattern, $nr, $input, 1); + } + + return $input; + } + + /** + * (callback) Replace date by request datestring + * e.g. '%m(30-11-1975)' is replaced by '11' + * + * @param array $match with [0]=>whole match, [1]=> first subpattern, [2] => second subpattern + * @return string + */ + function replacedate($match) { + global $conf; + + //no 2nd argument for default date format + $match[2] = $match[2] ?? $conf['dformat']; + + return strftime($match[2], strtotime($match[1])); + } + + /** + * Same replacements as applied at template namespaces + * + * @see parsePageTemplate() + */ + function prepareNamespacetemplateReplacements() { + /* @var Input $INPUT */ + global $INPUT; + global $INFO; + global $USERINFO; + global $conf; + global $ID; + + $this->patterns['__formpage_id__'] = '/@FORMPAGE_ID@/'; + $this->patterns['__formpage_ns__'] = '/@FORMPAGE_NS@/'; + $this->patterns['__formpage_curns__'] = '/@FORMPAGE_CURNS@/'; + $this->patterns['__formpage_file__'] = '/@FORMPAGE_FILE@/'; + $this->patterns['__formpage_!file__'] = '/@FORMPAGE_!FILE@/'; + $this->patterns['__formpage_!file!__'] = '/@FORMPAGE_!FILE!@/'; + $this->patterns['__formpage_page__'] = '/@FORMPAGE_PAGE@/'; + $this->patterns['__formpage_!page__'] = '/@FORMPAGE_!PAGE@/'; + $this->patterns['__formpage_!!page__'] = '/@FORMPAGE_!!PAGE@/'; + $this->patterns['__formpage_!page!__'] = '/@FORMPAGE_!PAGE!@/'; + $this->patterns['__user__'] = '/@USER@/'; + $this->patterns['__name__'] = '/@NAME@/'; + $this->patterns['__mail__'] = '/@MAIL@/'; + $this->patterns['__date__'] = '/@DATE@/'; + + // replace placeholders + $localid = isset($INFO['id']) ? $INFO['id'] : $ID; + $file = noNS($localid); + $page = strtr($file, $conf['sepchar'], ' '); + $this->values['__formpage_id__'] = $localid; + $this->values['__formpage_ns__'] = getNS($localid); + $this->values['__formpage_curns__'] = curNS($localid); + $this->values['__formpage_file__'] = $file; + $this->values['__formpage_!file__'] = PhpString::ucfirst($file); + $this->values['__formpage_!file!__'] = PhpString::strtoupper($file); + $this->values['__formpage_page__'] = $page; + $this->values['__formpage_!page__'] = PhpString::ucfirst($page); + $this->values['__formpage_!!page__'] = PhpString::ucwords($page); + $this->values['__formpage_!page!__'] = PhpString::strtoupper($page); + $this->values['__user__'] = $INPUT->server->str('REMOTE_USER'); + $this->values['__name__'] = $USERINFO['name'] ?? ''; + $this->values['__mail__'] = $USERINFO['mail'] ?? ''; + $this->values['__date__'] = strftime($conf['dformat']); + } + + /** + * Date time replacements + */ + function prepareDateTimereplacements() { + $this->patterns['__year__'] = '/@YEAR@/'; + $this->patterns['__month__'] = '/@MONTH@/'; + $this->patterns['__monthname__'] = '/@MONTHNAME@/'; + $this->patterns['__day__'] = '/@DAY@/'; + $this->patterns['__time__'] = '/@TIME@/'; + $this->patterns['__timesec__'] = '/@TIMESEC@/'; + $this->values['__year__'] = date('Y'); + $this->values['__month__'] = date('m'); + $this->values['__monthname__'] = date('B'); + $this->values['__day__'] = date('d'); + $this->values['__time__'] = date('H:i'); + $this->values['__timesec__'] = date('H:i:s'); + + } + + /** + * Functions that can be used after replacements + */ + function prepareFunctions() { + $this->functions['curNS'] = 'curNS'; + $this->functions['getNS'] = 'getNS'; + $this->functions['noNS'] = 'noNS'; + $this->functions['p_get_first_heading'] = 'p_get_first_heading'; + } +} diff --git a/lib/plugins/ckgedit/.gitignore b/lib/plugins/ckgedit/.gitignore new file mode 100644 index 0000000..209a504 --- /dev/null +++ b/lib/plugins/ckgedit/.gitignore @@ -0,0 +1 @@ +lib/plugins/ckgedit/ckeditor/ckeditor.js.4.9 diff --git a/lib/plugins/ckgedit/LICENSE b/lib/plugins/ckgedit/LICENSE new file mode 100644 index 0000000..d159169 --- /dev/null +++ b/lib/plugins/ckgedit/LICENSE @@ -0,0 +1,339 @@ + GNU GENERAL PUBLIC LICENSE + Version 2, June 1991 + + Copyright (C) 1989, 1991 Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The licenses for most software are designed to take away your +freedom to share and change it. By contrast, the GNU General Public +License is intended to guarantee your freedom to share and change free +software--to make sure the software is free for all its users. This +General Public License applies to most of the Free Software +Foundation's software and to any other program whose authors commit to +using it. (Some other Free Software Foundation software is covered by +the GNU Lesser General Public License instead.) You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +this service if you wish), that you receive source code or can get it +if you want it, that you can change the software or use pieces of it +in new free programs; and that you know you can do these things. + + To protect your rights, we need to make restrictions that forbid +anyone to deny you these rights or to ask you to surrender the rights. +These restrictions translate to certain responsibilities for you if you +distribute copies of the software, or if you modify it. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must give the recipients all the rights that +you have. You must make sure that they, too, receive or can get the +source code. And you must show them these terms so they know their +rights. + + We protect your rights with two steps: (1) copyright the software, and +(2) offer you this license which gives you legal permission to copy, +distribute and/or modify the software. + + Also, for each author's protection and ours, we want to make certain +that everyone understands that there is no warranty for this free +software. If the software is modified by someone else and passed on, we +want its recipients to know that what they have is not the original, so +that any problems introduced by others will not reflect on the original +authors' reputations. + + Finally, any free program is threatened constantly by software +patents. We wish to avoid the danger that redistributors of a free +program will individually obtain patent licenses, in effect making the +program proprietary. To prevent this, we have made it clear that any +patent must be licensed for everyone's free use or not licensed at all. + + The precise terms and conditions for copying, distribution and +modification follow. + + GNU GENERAL PUBLIC LICENSE + TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION + + 0. This License applies to any program or other work which contains +a notice placed by the copyright holder saying it may be distributed +under the terms of this General Public License. The "Program", below, +refers to any such program or work, and a "work based on the Program" +means either the Program or any derivative work under copyright law: +that is to say, a work containing the Program or a portion of it, +either verbatim or with modifications and/or translated into another +language. (Hereinafter, translation is included without limitation in +the term "modification".) Each licensee is addressed as "you". + +Activities other than copying, distribution and modification are not +covered by this License; they are outside its scope. The act of +running the Program is not restricted, and the output from the Program +is covered only if its contents constitute a work based on the +Program (independent of having been made by running the Program). +Whether that is true depends on what the Program does. + + 1. You may copy and distribute verbatim copies of the Program's +source code as you receive it, in any medium, provided that you +conspicuously and appropriately publish on each copy an appropriate +copyright notice and disclaimer of warranty; keep intact all the +notices that refer to this License and to the absence of any warranty; +and give any other recipients of the Program a copy of this License +along with the Program. + +You may charge a fee for the physical act of transferring a copy, and +you may at your option offer warranty protection in exchange for a fee. + + 2. You may modify your copy or copies of the Program or any portion +of it, thus forming a work based on the Program, and copy and +distribute such modifications or work under the terms of Section 1 +above, provided that you also meet all of these conditions: + + a) You must cause the modified files to carry prominent notices + stating that you changed the files and the date of any change. + + b) You must cause any work that you distribute or publish, that in + whole or in part contains or is derived from the Program or any + part thereof, to be licensed as a whole at no charge to all third + parties under the terms of this License. + + c) If the modified program normally reads commands interactively + when run, you must cause it, when started running for such + interactive use in the most ordinary way, to print or display an + announcement including an appropriate copyright notice and a + notice that there is no warranty (or else, saying that you provide + a warranty) and that users may redistribute the program under + these conditions, and telling the user how to view a copy of this + License. (Exception: if the Program itself is interactive but + does not normally print such an announcement, your work based on + the Program is not required to print an announcement.) + +These requirements apply to the modified work as a whole. If +identifiable sections of that work are not derived from the Program, +and can be reasonably considered independent and separate works in +themselves, then this License, and its terms, do not apply to those +sections when you distribute them as separate works. But when you +distribute the same sections as part of a whole which is a work based +on the Program, the distribution of the whole must be on the terms of +this License, whose permissions for other licensees extend to the +entire whole, and thus to each and every part regardless of who wrote it. + +Thus, it is not the intent of this section to claim rights or contest +your rights to work written entirely by you; rather, the intent is to +exercise the right to control the distribution of derivative or +collective works based on the Program. + +In addition, mere aggregation of another work not based on the Program +with the Program (or with a work based on the Program) on a volume of +a storage or distribution medium does not bring the other work under +the scope of this License. + + 3. You may copy and distribute the Program (or a work based on it, +under Section 2) in object code or executable form under the terms of +Sections 1 and 2 above provided that you also do one of the following: + + a) Accompany it with the complete corresponding machine-readable + source code, which must be distributed under the terms of Sections + 1 and 2 above on a medium customarily used for software interchange; or, + + b) Accompany it with a written offer, valid for at least three + years, to give any third party, for a charge no more than your + cost of physically performing source distribution, a complete + machine-readable copy of the corresponding source code, to be + distributed under the terms of Sections 1 and 2 above on a medium + customarily used for software interchange; or, + + c) Accompany it with the information you received as to the offer + to distribute corresponding source code. (This alternative is + allowed only for noncommercial distribution and only if you + received the program in object code or executable form with such + an offer, in accord with Subsection b above.) + +The source code for a work means the preferred form of the work for +making modifications to it. For an executable work, complete source +code means all the source code for all modules it contains, plus any +associated interface definition files, plus the scripts used to +control compilation and installation of the executable. However, as a +special exception, the source code distributed need not include +anything that is normally distributed (in either source or binary +form) with the major components (compiler, kernel, and so on) of the +operating system on which the executable runs, unless that component +itself accompanies the executable. + +If distribution of executable or object code is made by offering +access to copy from a designated place, then offering equivalent +access to copy the source code from the same place counts as +distribution of the source code, even though third parties are not +compelled to copy the source along with the object code. + + 4. You may not copy, modify, sublicense, or distribute the Program +except as expressly provided under this License. Any attempt +otherwise to copy, modify, sublicense or distribute the Program is +void, and will automatically terminate your rights under this License. +However, parties who have received copies, or rights, from you under +this License will not have their licenses terminated so long as such +parties remain in full compliance. + + 5. You are not required to accept this License, since you have not +signed it. However, nothing else grants you permission to modify or +distribute the Program or its derivative works. These actions are +prohibited by law if you do not accept this License. Therefore, by +modifying or distributing the Program (or any work based on the +Program), you indicate your acceptance of this License to do so, and +all its terms and conditions for copying, distributing or modifying +the Program or works based on it. + + 6. Each time you redistribute the Program (or any work based on the +Program), the recipient automatically receives a license from the +original licensor to copy, distribute or modify the Program subject to +these terms and conditions. You may not impose any further +restrictions on the recipients' exercise of the rights granted herein. +You are not responsible for enforcing compliance by third parties to +this License. + + 7. If, as a consequence of a court judgment or allegation of patent +infringement or for any other reason (not limited to patent issues), +conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot +distribute so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you +may not distribute the Program at all. For example, if a patent +license would not permit royalty-free redistribution of the Program by +all those who receive copies directly or indirectly through you, then +the only way you could satisfy both it and this License would be to +refrain entirely from distribution of the Program. + +If any portion of this section is held invalid or unenforceable under +any particular circumstance, the balance of the section is intended to +apply and the section as a whole is intended to apply in other +circumstances. + +It is not the purpose of this section to induce you to infringe any +patents or other property right claims or to contest validity of any +such claims; this section has the sole purpose of protecting the +integrity of the free software distribution system, which is +implemented by public license practices. Many people have made +generous contributions to the wide range of software distributed +through that system in reliance on consistent application of that +system; it is up to the author/donor to decide if he or she is willing +to distribute software through any other system and a licensee cannot +impose that choice. + +This section is intended to make thoroughly clear what is believed to +be a consequence of the rest of this License. + + 8. If the distribution and/or use of the Program is restricted in +certain countries either by patents or by copyrighted interfaces, the +original copyright holder who places the Program under this License +may add an explicit geographical distribution limitation excluding +those countries, so that distribution is permitted only in or among +countries not thus excluded. In such case, this License incorporates +the limitation as if written in the body of this License. + + 9. The Free Software Foundation may publish revised and/or new versions +of the General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + +Each version is given a distinguishing version number. If the Program +specifies a version number of this License which applies to it and "any +later version", you have the option of following the terms and conditions +either of that version or of any later version published by the Free +Software Foundation. If the Program does not specify a version number of +this License, you may choose any version ever published by the Free Software +Foundation. + + 10. If you wish to incorporate parts of the Program into other free +programs whose distribution conditions are different, write to the author +to ask for permission. For software which is copyrighted by the Free +Software Foundation, write to the Free Software Foundation; we sometimes +make exceptions for this. Our decision will be guided by the two goals +of preserving the free status of all derivatives of our free software and +of promoting the sharing and reuse of software generally. + + NO WARRANTY + + 11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY +FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW. EXCEPT WHEN +OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES +PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED +OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. THE ENTIRE RISK AS +TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU. SHOULD THE +PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING, +REPAIR OR CORRECTION. + + 12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR +REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, +INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING +OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED +TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY +YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER +PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE +POSSIBILITY OF SUCH DAMAGES. + + END OF TERMS AND CONDITIONS + + How to Apply These Terms to Your New Programs + + If you develop a new program, and you want it to be of the greatest +possible use to the public, the best way to achieve this is to make it +free software which everyone can redistribute and change under these terms. + + To do so, attach the following notices to the program. It is safest +to attach them to the start of each source file to most effectively +convey the exclusion of warranty; and each file should have at least +the "copyright" line and a pointer to where the full notice is found. + + + Copyright (C) + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License along + with this program; if not, write to the Free Software Foundation, Inc., + 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. + +Also add information on how to contact you by electronic and paper mail. + +If the program is interactive, make it output a short notice like this +when it starts in an interactive mode: + + Gnomovision version 69, Copyright (C) year name of author + Gnomovision comes with ABSOLUTELY NO WARRANTY; for details type `show w'. + This is free software, and you are welcome to redistribute it + under certain conditions; type `show c' for details. + +The hypothetical commands `show w' and `show c' should show the appropriate +parts of the General Public License. Of course, the commands you use may +be called something other than `show w' and `show c'; they could even be +mouse-clicks or menu items--whatever suits your program. + +You should also get your employer (if you work as a programmer) or your +school, if any, to sign a "copyright disclaimer" for the program, if +necessary. Here is a sample; alter the names: + + Yoyodyne, Inc., hereby disclaims all copyright interest in the program + `Gnomovision' (which makes passes at compilers) written by James Hacker. + + , 1 April 1989 + Ty Coon, President of Vice + +This General Public License does not permit incorporating your program into +proprietary programs. If your program is a subroutine library, you may +consider it more useful to permit linking proprietary applications with the +library. If this is what you want to do, use the GNU Lesser General +Public License instead of this License. diff --git a/lib/plugins/ckgedit/README.md b/lib/plugins/ckgedit/README.md new file mode 100644 index 0000000..2bd113b --- /dev/null +++ b/lib/plugins/ckgedit/README.md @@ -0,0 +1,14 @@ +ckgedit is a WYSIWYG editor for Dokuwiki. It is an implementation of fckgLite which replaces the +FCKEditor with the more current CKEditor. Whereas the base directory for fckgLite is named fckg, the +base directory for this version is ckgedit. However, only one of the two can +be enabled at any one time. + +This version of ckgeditor should work with Linux, Windows, and versions of Dokuwiki installed with the +Ubuntu/Debian package manager. + +This branch uses CKEditor 4.11.4 + + + + + diff --git a/lib/plugins/ckgedit/action/delete.php b/lib/plugins/ckgedit/action/delete.php new file mode 100644 index 0000000..4b89a97 --- /dev/null +++ b/lib/plugins/ckgedit/action/delete.php @@ -0,0 +1,29 @@ + + */ + +class action_plugin_ckgedit_delete extends DokuWiki_Action_Plugin { + + + function register(Doku_Event_Handler $controller) { + $controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'ckgedit_delete_preprocess'); + } + + function ckgedit_delete_preprocess(Doku_Event $event){ + global $ACT; + if (! is_array($ACT) || !(isset($ACT['delete']))) return; + global $TEXT; + $TEXT = NULL; + unset($ACT['delete']); + $ACT['save'] = "Speichern"; + } + + +} //end of action class +?> diff --git a/lib/plugins/ckgedit/action/edit.php b/lib/plugins/ckgedit/action/edit.php new file mode 100644 index 0000000..bd32bfb --- /dev/null +++ b/lib/plugins/ckgedit/action/edit.php @@ -0,0 +1,1349 @@ + + */ + +class action_plugin_ckgedit_edit extends DokuWiki_Action_Plugin { + + var $fck_location = "ckeditor"; + var $helper = false; + var $ckgedit_bak_file = ""; + var $debug = false; + var $test = false; + var $page_from_template; + var $draft_found = false; + var $draft_text; + var $draft_started; + var $captcha; + /** + * Constructor + */ + function __construct() + { + $this->setupLocale(); + $this->helper = plugin_load('helper', 'ckgedit'); + if(!plugin_isdisabled('captcha')) { + $this->captcha = plugin_load('helper', 'captcha'); + } + else $this->captcha = false; + + } + + + function register(Doku_Event_Handler $controller) + { + global $INPUT; + $version = explode('.', phpversion()); + define('PHP_VERSION_NUM', $version[0] * 10+ $version[1]); + + if($this->helper->is_outOfScope()) return; + + global $FCKG_show_preview; + $FCKG_show_preview = true; + + if(isset($_REQUEST['mode']) && $_REQUEST['mode'] == 'dwiki') { + $FCKG_show_preview = true; + return; + } + elseif(isset($_COOKIE['FCKG_USE'])) { + preg_match('/_\w+_/', $_COOKIE['FCKG_USE'], $matches); + if($matches[0] == '_false_') { + $FCKG_show_preview = true; + return; + } + } + $Fck_NmSp = "!!NONSET!!"; + if(isset($_COOKIE['FCK_NmSp'])) { + $Fck_NmSp = $_COOKIE['FCK_NmSp']; + } + $dwedit_ns = $this->getConf('dwedit_ns'); + if(isset($dwedit_ns) && $dwedit_ns) { + $ns_choices = explode(',',$dwedit_ns); + foreach($ns_choices as $ns) { + $ns = trim($ns); + $id = $INPUT->str('id'); + if(($id && preg_match("/$ns/",$id)) || ($Fck_NmSp && preg_match("/$ns/",$Fck_NmSp))) { + $FCKG_show_preview = true; + return; + } + } + } + $controller->register_hook('COMMON_PAGE_FROMTEMPLATE', 'AFTER', $this, 'pagefromtemplate', array()); + $controller->register_hook('COMMON_PAGETPL_LOAD', 'AFTER', $this, 'pagefromtemplate', array()); + + $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'ckgedit_edit'); + $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'ckgedit_edit_meta'); + } + + /** + * function pagefromtemplate + * Capture template text output by Template Event handler instead of pageTemplate() + * @author Myron Turner + * + */ + function pagefromtemplate(Doku_Event $event) { + if($event->data['tpl']) { + $this->page_from_template = $event->data['tpl']; + } + } + + /** + * ckgedit_edit_meta + * + * load fck js + * @author Pierre Spring + * @author Myron Turner + * @param mixed $event + * @access public + * @return void + */ + function ckgedit_edit_meta(Doku_Event $event) + { + global $ACT; + // we only change the edit behaviour + if ($ACT != 'edit'){ + return; + } + global $ID; + global $REV; + global $INFO; + global $conf; + $event->data['script'][] = + array( + 'type'=>'text/javascript', + 'charset'=>'utf-8', + '_data'=>'', + 'src'=>DOKU_BASE.'lib/plugins/ckgedit/' .$this->fck_location. '/ckeditor.js' + )+([ 'defer' => 'defer']); + + if(isset($conf['fnencode']) && $conf['fnencode'] == 'safe') { + $event->data['script'][] = + array( + 'type'=>'text/javascript', + 'charset'=>'utf-8', + '_data'=>'', + 'src'=>'lib/plugins/ckgedit/scripts/safeFN_cmpr.js' + ) + ([ 'defer' => 'defer']); + } + $ua = strtolower ($_SERVER['HTTP_USER_AGENT']); + if(strpos($ua, 'msie') !== false) { + echo "\n" . '' ."\n"; + } + + if($this->test) { + $nval = substr(md5(time()), -20); + $parse_url = DOKU_URL . 'lib/plugins/ckgedit/scripts/parse_wiki.js.unc'; + } + else $parse_url = DOKU_BASE . 'lib/plugins/ckgedit/scripts/parse_wiki-cmpr.js'; + $event->data['script'][] = + array( + 'type'=>'text/javascript', + 'charset'=>'utf-8', + '_data'=>'', + 'src'=> $parse_url + ) + ([ 'defer' => 'defer']); + + return; + } + + /** + * function ckgedit_edit + * @author Pierre Spring + * edit screen using fck + * + * @param & $event + * @access public + * @return void + */ + function ckgedit_edit(Doku_Event $event) + { + + global $INFO; + + // we only change the edit behaviour + if ($event->data != 'edit') { + return; + } + // load xml and acl + if (!$this->_preprocess()){ + return; + } + // print out the edit screen + $this->_print(); + // prevent Dokuwiki normal processing of $ACT (it would clean the variable and destroy our 'index' value. + $event->preventDefault(); + // index command belongs to us, there is no need to hold up Dokuwiki letting other plugins see if its for them + $event->stopPropagation(); + } + + /** + * function _preprocess + * @author Myron Turner + */ + function _preprocess($draft_text = "") + { + global $ID; + global $REV; + global $DATE; + global $RANGE; + global $PRE; + global $SUF; + global $INFO; + global $SUM; + global $lang; + global $conf; + global $ckgedit_lang; + //set summary default + if(!$SUM){ + if($REV){ + $SUM = $lang['restored']; + }elseif(!$INFO['exists']){ + $SUM = $lang['created']; + } + } + if(!$draft_text) { + if($INFO['exists']){ + if($RANGE){ + list($PRE,$text,$SUF) = rawWikiSlices($RANGE,$ID,$REV); + }else{ + $text = rawWiki($ID,$REV); + } + }else{ + //try to load a pagetemplate + $text = pageTemplate($ID); + //Check for text from template event handler + if(!$text && $this->page_from_template) $text = $this->page_from_template; + } + } + else $text = $draft_text; + + $text = str_replace('¬ags', '&amp;notags',$text); + $text = preg_replace_callback( + '/(~~NOCACHE~~|~~NOTOC~~|\{\{rss>http(s?):\/\/.*?\}\})/ms', + function($matches) { + $matches[0] = preg_replace("#{{rss>http(s?):\/\/#", "{ { rss>$1Feed:", $matches[0]); + $matches[0] = str_replace("~", "~ ", $matches[0]); + return $matches[0]; + },$text); + + if($this->getConf('smiley_hack')) { + $new_addr = $_SERVER['SERVER_NAME'] . DOKU_BASE; + $text=preg_replace("#(?<=http://)(.*?)(?=lib/plugins/ckgedit/ckeditor/plugins/smiley/images)#s", $new_addr,$text); + } + /*interwiki frasl refactoring*/ + +/* + $text = preg_replace_callback('/\[\[\w+>.*?\]\]/ms', + create_function( + '$matches', + 'return str_replace("/", "__IWIKI_FSLASH__" ,$matches[0]);' + ), $text); + */ + + global $useComplexTables; + if($this->getConf('complex_tables') || strrpos($text, '~~COMPLEX_TABLES~~') !== false) { + $useComplexTables=true; + } + else { + $useComplexTables=false; + } + + if(strpos($text, '%%') !== false || strpos($text, '\\\\') !== false || strpos($text, '|') !== false ) { + $text = preg_replace('/%%\s*\s*%%/ms', 'PERCNWPERC',$text); + $text = preg_replace('/%%\s*<(code|file)>\s*%%/ms', 'PERC' . "$1" . 'PERC',$text); + $text = preg_replace_callback( + "/<(nowiki|code|file)>(.*?)<\/(nowiki|code|file)/ms", + function ($matches) { + $matches[0] = str_replace('%%', 'DBLPERCENT',$matches[0]); + $matches[0] = str_replace('\\ ', 'DBLBACKSPLASH',$matches[0]); + $matches[0] = str_replace('|', 'NWPIPECHARACTER',$matches[0]); + return $matches[0]; + }, + $text + ); + + $text = preg_replace_callback( + "/(?)%%(.*?)%%/ms", + function($matches) { + return '' . $matches[1] . ''; + }, + $text + ); + + $text = str_replace('DBLPERCENT','%%',$text); + } + + $pos = strpos($text, '<'); + + if($pos !== false) { + +/* skipentity support */ + $text = preg_replace_callback( + '/``(.*?)``/ms', + function($matches) { + $needles = array('[',']', '/', '.', '*', '_','\'','<','>','%', '{', '}', '\\' , '(' ); + $replacements = array('[',']','/', '.', '*', '_', ''', '<','>','%', '{','}', '\','('); + $matches[1] = str_replace($needles, $replacements, $matches[1]); + return '``' .$matches[1] .'``' ; + }, + $text + ); + + + $text = preg_replace_callback( + '/()(.*?)(<\/nowiki>)/ms', + function($matches) { + $needles = array("[","]", "/", ".", "*", "_","\'","<",">","%", "{", "}", "\\\\","("); + $replacements = array("[","]","/", ".", "*", "_", "'", "<",">","%", "{","}", "\","("); + $matches[2] = str_replace($needles, $replacements, $matches[2]); + return $matches[1] . $matches[2] . $matches[3]; + }, + $text + ); + + $text = preg_replace_callback( + '/<(code|file)(.*?)(>)(.*?)(<\/\1>)/ms', + function($matches) { + //file_put_contents("geshi.txt", print_r($matches,true)); + if(preg_match("/(^\s*geshi:\s*(\w+)(\s+\w+\.\w+)*\s*)$/m",$matches[0],$gmatch)){ + $gmatch[0] = preg_replace("/\s*geshi:\s+/","",$gmatch[0]); + $matches[1] .= " " . trim($gmatch[0]); + //file_put_contents("gmatch.txt", print_r($gmatch,true)); + $c=1; + $matches[4] = str_replace($gmatch[1],"",$matches[4],$c); + } + if(preg_match("/\w+/",$matches[2])) { + $matches[4] = str_replace("CHEVRONescC", ">>",$matches[4]); + $matches[4] = str_replace("CHEVRONescO", "<<",$matches[4]); + $matches[4] = preg_replace("/<(?!\s)/ms", "__GESHI_OPEN__", $matches[4]); + } + else { + if( preg_match("/MULTI/",$matches[0])) { + $open = "< "; + $close = " >"; + } + else { + $open = "<"; + $close = ">"; + } + $matches[4] = preg_replace("/<(?!\s)/ms", $open, $matches[4]); + $matches[4] = preg_replace("/(?/ms", $close, $matches[4]); + } + $matches[4] = str_replace("\"", "__GESHI_QUOT__", $matches[4]); + $matches[4] = preg_replace("/\\\\\\\\(\n|\s)/ms","CODE_BLOCK_EOL_MASK$1",$matches[4]); + return "<" . $matches[1] . $matches[2] . $matches[3] . $matches[4] . $matches[5]; + }, + $text + ); + + $text = preg_replace_callback( + '/~~START_HTML_BLOCK~~.*?CLOSE_HTML_BLOCK/ms', + function($matches) { + $matches[0] = str_replace("_ckgedit_NPBBR_","",$matches[0]); + return $matches[0]; + },$text); + + $text = preg_replace_callback( + '/(\|\s*)(|)(.*?)(<\/code>|<\/file>)\n_ckgedit_NPBBR_(?=.*?\|)/ms', + function($matches) { + $matches[2] = preg_replace("//ms", "TPRE_CODE", $matches[2]); + $matches[2] = preg_replace("//ms", "TPRE_FILE", $matches[2]); + $matches[4] = "TPRE_CLOSE"; + $matches[3] = preg_replace("/^\n+/", "TC_NL",$matches[3]); + $matches[3] = preg_replace("/\n/ms", "TC_NL",$matches[3]); + return $matches[1] . $matches[2] . trim($matches[3]) . $matches[4]; + }, + $text + ); + $text = preg_replace('/TPRE_CLOSE\s+/ms',"TPRE_CLOSE",$text); + $text = preg_replace('/<(?!code|file|nowiki|del|sup|sub|\/\/|\s|\/del|\/code|\/nowiki|\/file|\/sup|\/sub)/ms',"<",$text); + $text = str_replace(array('',''),array('NWIKISTART','NWIKICLOSE'),$text); + $text = str_replace('%%<', '%%<', $text); + } + + if($this->getConf('duplicate_notes')) { + $text = preg_replace_callback('/\(\((.*?)\)\)/ms', + function($matches) { + static $count = 0; + $count++; + $ins = "FNoteINSert" . $count; + $needles = array("[","]", "/", ".", "*", "_","\'","<",">","%", "{", "}", "\\","("); + $replacements = array("[","]","/", ".", "*", "_", "'", "<",">","%", "{","}", "\","("); + $matches[1] = str_replace($needles, $replacements, $matches[1]); + return "(($ins" . $matches[1] . "))" ; + }, $text + ); + } + $text = preg_replace('/^\>/ms',"_QUOT_",$text); // dw quotes + $text = str_replace('>>','CHEVRONescC',$text); + $text = str_replace('<<','CHEVRONescO',$text); + $text = preg_replace('/(={3,}.*?)(\{\{.*?\}\})(.*?={3,})/',"$1$3\n$2",$text); + $email_regex = '/\/\/\<\/\/(.*?@.*?)>/'; + $text = preg_replace($email_regex,"<$1>",$text); + + $text = preg_replace('/{{(.*)\.swf(\s*)}}/ms',"__SWF__$1.swf$2__FWS__",$text); + $text = preg_replace('/PERCNWPERC/ms', '%%< nowiki >%%',$text); + //$text = preg_replace('/%%\s*<(code|file)>\s*%%/ms', 'PERC' . "$1" . 'PERC',$text); + $text = preg_replace('/PERCcodePERC/ms','%%<code>%%', $text); + $text = preg_replace('/PERCfilePERC/ms','%%<file>%%', $text); + $divalign = false; + if($this->helper->has_plugin('divalign2') + ||$this->helper->has_plugin('divalign2_center')) { + $divalign = true; + $text = preg_replace_callback('/\n([;#]{3})/', + + function ($matches) { + return "divalNLine" . str_replace('#','CGEHASH',$matches[1]); + }, $text + ); + } + $text = preg_replace_callback( + '|((.*?<\/code>)|ms', + function($matches) { + $retstr = $matches[1] . ">\n/*" . $matches[2] . "*/\n" . $matches[3]; + return $retstr; + }, $text + ); + + $this->xhtml = $this->_render_xhtml($text); + + /*interwiki frasl refactoring*/ + // $this->xhtml = str_replace("__IWIKI_FSLASH__", "⁄", $this->xhtml); + if($this->getConf('duplicate_notes')) { + $this->xhtml = preg_replace("/FNoteINSert\d+/ms", "",$this->xhtml); + } + if($divalign) { + $this->xhtml = str_replace("CGEHASH", "#", $this->xhtml); + } + $this->xhtml = str_replace("__GESHI_QUOT__", '"', $this->xhtml); + $this->xhtml = str_replace("__GESHI_OPEN__", "< ", $this->xhtml); + $this->xhtml = str_replace('CHEVRONescC', '>>',$this->xhtml); + $this->xhtml = str_replace('CHEVRONescO', '<<',$this->xhtml); + $this->xhtml = preg_replace('/_QUOT_/ms','>',$this->xhtml); // dw quotes + $this->xhtml = preg_replace_callback( + "/^(>+)(.*?)$/ms", + function($matches) { + $matches[2] = str_ireplace('
    ',"",$matches[2]); + return $matches[1] . $matches[2] . "
    "; + }, + $this->xhtml + ); + + if($pos !== false) { + $this->xhtml = preg_replace_callback( + '/(TPRE_CODE|TPRE_FILE)(.*?)(TPRE_CLOSE)/ms', + function($matches) { + $matches[1] = preg_replace("/TPRE_CODE/","
    \n", $matches[1]);  
    +                    $matches[1] = preg_replace("/TPRE_FILE/","
    \n", $matches[1]);  
    +                    $matches[2] = preg_replace("/TC_NL/ms", "\n", $matches[2]);  
    +                    $matches[3] = "
    "; + return $matches[1] . $matches[2] . $matches[3]; + }, + $this->xhtml + ); + + } + + $this->xhtml = preg_replace_callback( + '/~~START_HTML_BLOCK~~[\n\s]*(.*?)CLOSE_HTML_BLOCK/ms', + function($matches) { + $matches[1] = str_replace("&","&",$matches[1]); + $matches[1] = html_entity_decode($matches[1],ENT_QUOTES, "UTF-8"); + $matches[1] = preg_replace("/<\/?code.*?>/", "",$matches[1]); + $matches[1] = preg_replace("/^\s*<\/p>/","",$matches[1]); + $tmp = explode("\n", $matches[1]); + for($n=0; $n<7; $n++) { + if( (preg_match("/(

    \s*)*( |\s+)<\/p>/",$tmp[$n])) || (preg_match("/^\s+$/",$tmp[$n]))) { + unset($tmp[$n]); + } + } + return "~~START_HTML_BLOCK~~" . implode("\n",$tmp) . "CLOSE_HTML_BLOCK"; + },$this->xhtml); + + $this->xhtml = preg_replace_callback( + '/()(.*?)(<\/pre>)/ms', + function($matches) { + $matches[4] = preg_replace("/(\||\^)[ ]+(\||\^)/ms","$1   $2" , $matches[4]); + return $matches[1] . $matches[2] . $matches[3] . $matches[4] . $matches[5]; + }, + $this->xhtml + ); + + $this->xhtml = preg_replace_callback( + '/~~MULTI_PLUGIN_OPEN~~(.*?)~~MULTI_PLUGIN_CLOSE~~/ms', + function($matches) { + return str_replace("<", "< ",$matches[0]); + }, + $this->xhtml + ); + //insures breaks are retained for single spacing + $this->xhtml = preg_replace('/

    \s*\s*<\/p>/ms', '
    ', $this->xhtml); + + if($this->draft_started) return $this->xhtml; + $cname = getCacheName($INFO['client'].$ID,'.draft.fckl'); + // msg($cname); + $this->draft_started = false; + if(file_exists($cname) && !$this->draft_started) { + + $this->draft_started = true; + + $cdata = unserialize(io_readFile($cname,false)); + $prefix = isset($cdata['prefix']) ? urldecode($cdata['prefix']) : "" ; + if($prefix) $prefix = $this-> _preprocess($prefix); + $text = urldecode($cdata['text']); + $suffix = isset($cdata['suffix']) ? urldecode($cdata['suffix']) : "" ; + + if($suffix) $suffix = $this-> _preprocess($suffix); + + preg_match_all("/<\/(.*?)\>/", $cdata['text'],$matches); + /* exclude drafts saved from preview mode */ + if (!in_array('code', $matches[1]) && !in_array('file', $matches[1]) && !in_array('nowiki', $matches[1])) { + //$this->draft_text = $cdata['text']; + $this->draft_text = $prefix . $text . $suffix; + $this->draft_found = true; + msg($this->getLang('draft_msg')) ; + } + unlink($cname); + } + if($this->draft_started) return $this->xhtml; + return true; + } + + + /** + Check for for alternate style sheet + */ + function alt_style_sheet() { + $stylesheet = DOKU_PLUGIN . 'ckgedit/ckeditor/css/_style.css'; + if(file_exists($stylesheet)) { + global $conf; + $tpl_name = $conf['template']; + if($fh = fopen($stylesheet,"r")) { + $line_num = 0; + while (!feof($fh) && $line_num < 4) { + $line = fgets($fh,1024); //msg($line); + if(strpos($line,$tpl_name)!==false) { + return DOKU_BASE . '/lib/plugins/ckgedit/ckeditor/css/_style.css' ; + break; + } + $line_num ++; + } + } + } + return ""; + } + + + /** + * function _print + * @author Myron Turner + */ + function _print() + { + global $INFO; + global $lang; + global $ckgedit_lang; + global $ID; + global $REV; + global $DATE; + global $PRE; + global $SUF; + global $SUM; + $wr = $INFO['writable']; + if($wr){ + if ($REV) print p_locale_xhtml('editrev'); + $ro=false; + }else{ + // check pseudo action 'source' + if(!actionOK('source')){ + msg('Command disabled: source',-1); + return false; + } + print p_locale_xhtml('read'); + $ro='readonly="readonly"'; + } + + if(!$DATE) $DATE = $INFO['lastmod']; + $guest_toolbar = $this->getConf('guest_toolbar'); + $guest_media = $this->getConf('guest_media'); + if(!isset($INFO['userinfo']) && !$guest_toolbar) { + $toolbar = "DokuwikiNoGuest"; + } + else if(!isset($INFO['userinfo']) && !$guest_media) { + $toolbar = "DokuwikiGuest"; + } + else $toolbar = 'Dokuwiki'; + +$height = isset($_COOKIE['ckgEdht']) && $_COOKIE['ckgEdht'] ? $_COOKIE['ckgEdht']: 250; +if(!is_numeric($height)) $height = 250; +$fbsz_increment = isset($_COOKIE['fbsz']) && $_COOKIE['fbsz'] ? $_COOKIE['fbsz'] : false; +$fbrowser_width = 1070; +$fbrowser_height = 660; +if($fbsz_increment) { + $fbrowser_width = $fbrowser_width + ($fbrowser_width*($fbsz_increment/100)); + $fbrowser_height =$fbrowser_height + ($fbrowser_height*($fbsz_increment/100)); +} + +$doku_base= rtrim(DOKU_BASE,'/'); +$ns = getNS($_COOKIE['FCK_NmSp']); + +//get user file browser if allowed +if ($this->getConf('allow_ckg_filebrowser') == 'all') { + $fb = $this->getUserFb(); +} else { + //use only allowed file browser + $fb = $this->getConf('allow_ckg_filebrowser'); +} + +//setup options +if ($fb == 'dokuwiki') { + $fbOptions = "filebrowserImageBrowseUrl: \"$doku_base/lib/exe/mediamanager.php?ns=$ns&edid=wiki__text&onselect=ckg_edit_mediaman_insert&ckg_media=img\", + filebrowserBrowseUrl: \"$doku_base/lib/exe/mediamanager.php?ns=$ns&edid=wiki__text&onselect=ckg_edit_mediaman_insertlink&ckg_media=link\""; +} else { + $fbOptions = "filebrowserImageBrowseUrl : \"$doku_base/lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/browser.html?Type=Image&Connector=$doku_base/lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/connector.php\", + filebrowserBrowseUrl: \"$doku_base/lib/plugins/ckgedit/fckeditor/editor/filemanager/browser/default/browser.html?Type=File&Connector=$doku_base/lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/php/connector.php\""; +} +if($this->getConf('style_sheet')) { + $contents_css = $this->alt_style_sheet(); +} +else { + $contents_css = ""; +} +//msg($contents_css); +$ckeditor_replace =<<helper->registerOnLoad($ckeditor_replace); + + global $skip_styling; + +?> +page_from_template) { + $ckg_template = 'tpl'; + } + else $ckg_template =""; + + if($INPUT->has('hid')) { + $hid = $INPUT->str('hid'); + } + else { + $hid = ""; + } + /* accommodates include plugin's redirect to original page after editing included page */ + $ckgedit_redirect = $INPUT->str('redirect_id', ""); + + ?> +

    +
    + + + + + + + + + + + + + + + + + +
    +xhtml=<<go to top | back to Index | Wiki start page ] +ERRTXT;*/ +?> + + + +helper->dw_edit_displayed(); +$is_ckgeditChrome = false; + if(stripos($_SERVER['HTTP_USER_AGENT'],'Chrome') !== false) { + preg_match("/Chrome\/(\d+)/", $_SERVER['HTTP_USER_AGENT'],$cmatch); + if((int)$cmatch[1] <26) $is_ckgeditChrome =true; +} + +?> + +
    + + +
    + + + /> + + + name="do[delete]" value="" + title="getLang('title_dw_delete') ?>" + style = "font-size: 100%;" + /> + + + + + + style = "font-size: 100%;" + type="submit" + name="do[save]" + value="getLang('btn_dw_edit')?>" + title="getLang('title_dw_edit')?>" + /> + + + getConf('allow_ckg_filebrowser') == 'all'): ?> + + +test ? 'inline' : 'none'; + $chrome_dwedit_link = 'DW Edit'; + $backup_btn =$this->getLang('dw_btn_backup') ? $this->getLang('dw_btn_backup') : $this->getLang('dw_btn_refresh'); + $backup_title = $this->getLang('title_dw_backup') ? $this->getLang('title_dw_backup') : $this->getLang('title_dw_refresh'); + $using_scayt = ($this->getConf('scayt')) == 'on'; + +?> + + + + + + + draft_found) { ?> + + + + + + + + + + +     + + +
    + + + + debug) { ?> + + +
    + + +
    +
    +
    +
          + + [ close ]    +
    + +
    + + + +    + px +    +   + + + title=" " /> + + + + + + + + +
    + + + +
    + + + +
    + + captcha && $this->captcha->isEnabled()) echo $this->captcha->getHTML(); ?> +
    + + + +
    + + + + + + */ + function _render_xhtml($text){ + $mode = 'ckgedit'; + + global $skip_styling, $INPUT; + $post_styling = $INPUT->post->str('styling'); + $skip_styling = $this->getConf('nofont_styling'); + + if(!$skip_styling && $post_styling == 'no_styles') { + $skip_styling = true; + } + + if(strpos($text,'~~NO_STYLING~~') !== false) { + $skip_styling = true; + } + // $text = preg_replace("/\\\\(\n|\s)/ms","CODE_BLOCK_EOL_MASK$1",$text); + $text = preg_replace_callback('/\[\[(.*?>)(.*?)\]\]/ms', + function ($matches) { + if(strpos($matches[0],"\n") !== false) return $matches[0]; + if(preg_match("#<(\w+)>.*?<\/\\1>#",$matches[0])) return $matches[0]; + list($name,$link_text) = explode('|',$matches[2]); + $retv = '[[' . $matches[1] . "oIWIKIo" . $name ."cIWIKIc"; + if(!empty($link_text)) { + $retv .= "|$link_text"; + } + return $retv . ']]'; + }, + $text); + + // try default renderer first: + $file = DOKU_INC."inc/parser/$mode.php"; + + if(@file_exists($file)){ + + require_once $file; + $rclass = "Doku_Renderer_$mode"; + + if ( !class_exists($rclass) ) { + trigger_error("Unable to resolve render class $rclass",E_USER_WARNING); + msg("Renderer for $mode not valid",-1); + return null; + } + $Renderer = new $rclass(); + } + else{ + // Maybe a plugin is available? + $Renderer = plugin_load('renderer',$mode); + if(is_null($Renderer)){ + msg("No renderer for $mode found",-1); + return null; + } + } +// aimed at wrap plugin which allows multiple newlines in a cell +$text = preg_replace_callback( + '#(\|.*?)\|.?[\n\r]#ms', + function ($matches) { + $matches[0] = preg_replace("#\\\\\\\\\s*[\r\n]#ms", " \\\\\\\\ ",$matches[0]); + return ($matches[0]); + }, + $text); + + // prevents utf8 conversions of quotation marks + $text = str_replace('"',"_ckgedit_QUOT_",$text); + + $text = preg_replace_callback('/()([^<]+)(<\/code>)/ms', + function($matches) { + $quot = str_replace("_ckgedit_QUOT_", "\"", $matches[2]); + $quot = str_replace("\\\\ ", "_ckgedit_NL", $quot); + $quot .= "_ckgedit_NL"; + return $matches[1] . $quot . $matches[3]; + }, $text); + + $text = preg_replace_callback('/()([^<]+)(<\/file>)/ms', + function($matches) { + $quot = str_replace("_ckgedit_QUOT_", "\"", $matches[2]); + $quot = str_replace("\\\\ ", "_ckgedit_NL", $quot); + $quot .= "_ckgedit_NL"; + return $matches[1] . $quot . $matches[3]; + }, $text); + + $text = preg_replace_callback('/\|([\s\S]+)\|/ms', // prevents extra backslash from hanging on a new line + function ($matches) { + if(!strpos($matches[1], "_ckgedit_NL")) return $matches[0]; + $matches[1] = str_replace("\\_ckgedit_NL","_ckgedit_NL",$matches[1]); + + return '|' . $matches[1] . '|'; + return $matches[0]; + }, + $text + ); + + $text = preg_replace_callback('/(|)([^<]+)(<\/code>|<\/file>)/ms', + function($matches) { + $matches[2] = str_replace("<font","ckgeditFONTOpen",$matches[2]); + $matches[2] = str_replace("font>","ckgeditFONTClose",$matches[2]); + return $matches[1] .$matches[2] . $matches[3]; + }, $text); + + $text = str_replace('CODE_BLOCK_EOL_MASK','\\', $text); + + $instructions = p_get_instructions("=== header ==="); // loads DOKU_PLUGINS array --M.T. Dec 22 2009 + + $instructions = p_get_instructions($text); + if(is_null($instructions)) return ''; + + $Renderer->notoc(); + if(!$this->getConf('smiley_as_text')) { + $Renderer->smileys = getSmileys(); + } + $Renderer->entities = getEntities(); + $Renderer->acronyms = array(); + $Renderer->interwiki = getInterwiki(); + + // Loop through the instructions + /* + By-passing plugin processing was sugested and first implemented + by Matti Lattu + It is a significant contribution to the functionality of ckgEdit + */ + foreach ( $instructions as $instruction ) { + if ($instruction[0] == 'plugin') { + $Renderer->doc .= $instruction[1][3]; + } else { + // Execute the callback against the Renderer + call_user_func_array(array(&$Renderer, $instruction[0]),$instruction[1]); + } + } + + //set info array + $info = $Renderer->info; + + // Post process and return the output + $data = array($mode,& $Renderer->doc); + if(class_exists('dokuwiki\Extension\Event')) { + Event::createAndTrigger('RENDERER_CONTENT_POSTPROCESS', $data); + } + else { + trigger_event('RENDERER_CONTENT_POSTPROCESS',$data); + } + + $xhtml = $Renderer->doc; + $xhtml = str_replace( + array('NWIKISTART','NWIKICLOSE'), + array('&lt;nowiki>','&lt;/nowiki>'),$xhtml); + + if(!$skip_styling) { // create font styles from font plugin markup for html display + $xhtml = preg_replace_callback( + '|&lt;font\s+(.*?)/([\w ,\-]+);;([\(\)),\w,\s\#]+);;([\(\)),\w,\s\#]+)>(.*?)&lt;/font>|ms', + function($matches) { + $count = 0; $str=''; + if($matches[3] && $matches[3] != 'inherit') { $str .= ''; $count++;} + if($matches[1] && $matches[1] != 'inherit') { $str .= ''; $count++; } + if($matches[2] && $matches[2] != 'inherit') { $str .= ''; $count++; } + if($matches[4] && $matches[4] != 'inherit') { $str .= ''; $count++; } + $str .= $matches[5]; + for($i =0; $i<$count; $i++) { + $str .= ''; + } + return $str; + }, $xhtml + ); + } + + /** + * Alternative to the one liner at 1179: $xhtml = str_replace(array('oiwikio','ciwikic'),array('oIWIKIo','cIWIKIc'),$xhtml); + * if it turns out that there are users using 'oiwikio','ciwikic' + $xhtml = preg_replace_callback( + '|class=\"interwiki.*?href=\".*?:oiwikiotowerciwikic\".*?title=\".*?oiwikiotowerciwikic\"|ms', + function($matches) { + $matches[0] = str_replace(array('oiwikio','ciwikic'),array('oIWIKIo','cIWIKIc'),$matches[0]); + return $matches[0]; + },$xhtml + ); + */ + if(stripos($xhtml,'oIWIKIo') !== false) { + $xhtml = str_replace(array('oiwikio','ciwikic'),array('oIWIKIo','cIWIKIc'),$xhtml); + $xhtml = preg_replace_callback( + '/oIWIKIo(.*?)cIWIKIc(?=<\/a>)/ms', + function($matches) { + return ">". $matches[1] ; + }, + $xhtml + ); + + } + + $pos = strpos($xhtml, 'MULTI_PLUGIN_OPEN'); + if($pos !== false) { + $xhtml = preg_replace_callback( + '|MULTI_PLUGIN_OPEN.*?MULTI_PLUGIN_CLOSE|ms', + function($matches) { + $matches[0] = str_replace("//",$matches[0]); + }, + $xhtml + ); + + $xhtml = preg_replace('/~\s*~\s*MULTI_PLUGIN_OPEN~\s*~/', "\n\n~~MULTI_PLUGIN_OPEN~~\n\n\n\n", $xhtml); + $xhtml = preg_replace('/~\s*~\s*MULTI_PLUGIN_CLOSE~\s*~/', "\n\n
    \n\n~~MULTI_PLUGIN_CLOSE~~\n\n", $xhtml); + + } + + + // remove empty paragraph: see _ckgedit_NPBBR_ comment above + $xhtml = preg_replace('/

    \s+_ckgedit_NPBBR_\s+<\/p>/ms',"\n",$xhtml); + $xhtml = str_replace('_ckgedit_NPBBR_', " ", $xhtml); + $xhtml = str_replace('_ckgedit_QUOT_', '"', $xhtml); + $xhtml = str_replace('_ckgedit_NL', "\n", $xhtml); + $xhtml = str_replace('

    ', "\n\n

     

    ", $xhtml); + // inserts p before an initial codeblock to enable text entry above block + $xhtml = preg_replace('/^
     

    \s+<\/(em|b|u|i)>/ms',"",$xhtml); + $xhtml = preg_replace("/col\d+\s+(\w+align)/ms", "$1",$xhtml); //remove col number for cell prpoerties dialog + $xhtml = str_replace('ckgeditFONTOpen', '&lt;font',$xhtml); // protect font markup in code blocks + $xhtml = str_replace('ckgeditFONTClose', 'font&gt;',$xhtml); + $xhtml = str_replace('DBLBACKSPLASH', '\\ ',$xhtml); + $xhtml = str_replace('NWPIPECHARACTER', '|',$xhtml); + $xhtml = str_replace('&lt;blockquote>','
    ',$xhtml); + $xhtml = str_replace('&lt;/blockquote>','
    ',$xhtml); + + $xhtml= preg_replace_callback( + '/(

    \s*)?

    (.*?)<\/blockquote>(\s*<\/p>)?/ms', + function($matches) { + $matches[0] = preg_replace("/(

    )?\s*(

    )\s*(<\/p>)?/m","

    $2",$matches[0]); + $matches[0] = preg_replace("/(

    )?\s*(<\/blockquote>)\s*(<\/p>)?/m","$2

    ",$matches[0]); + // $matches[0] = str_replace('
    ', '
    ', $matches[0]); + return $matches[0]; + }, $xhtml + ); + + $ua = strtolower ($_SERVER['HTTP_USER_AGENT']); + if(strpos($ua,'chrome') !== false) { + $xhtml = preg_replace_callback( + '/(?<=)/sm', + function($matches) { + $ret_str = " " . trim($matches[3]) . " " . trim($matches[2]) . " " . trim($matches[1]) ; + return $ret_str; + }, + $xhtml + ); + } + + return $xhtml; + } + + function write_debug($what,$line="") { + return; + $handle = fopen("ckgedit_php.txt", "a"); + // if(is_array($what)) $what = print_r($what,true); + if($line) $what = "line $line\n" . $what; + fwrite($handle,"$what\n"); + fclose($handle); + } + + function get_switch_fb_value() { + if ($this->getUserFb() == 'dokuwiki') { + $fbText = $this->getLang('btn_val_ckg_fb'); + } else { + $fbText = $this->getLang('btn_val_dw_fb'); + } + return $fbText; + } + + function get_switch_fb_title() { + if ($this->getUserFb() == 'dokuwiki') { + $fbText = $this->getLang('btn_title_ckg_fb'); + } else { + $fbText = $this->getLang('btn_title_dw_fb'); + } + return $fbText; + } + + function getUserFb() { + //get user file browser + if (!isset($_COOKIE['ckgFbOpt'])) { + $_COOKIE['ckgFbOpt'] = $this->getConf('default_ckg_filebrowser'); + } + return $_COOKIE['ckgFbOpt']; + } + +} //end of action class + +?> diff --git a/lib/plugins/ckgedit/action/ent.ser b/lib/plugins/ckgedit/action/ent.ser new file mode 100644 index 0000000..aa3ca6f --- /dev/null +++ b/lib/plugins/ckgedit/action/ent.ser @@ -0,0 +1 @@ +a:490:{i:8704;s:3:"∀";s:6:"forall";s:3:"∀";i:8706;s:3:"∂";s:4:"part";s:3:"∂";i:8707;s:3:"∃";s:5:"exist";s:3:"∃";i:8709;s:3:"∅";s:5:"empty";s:3:"∅";i:8711;s:3:"∇";s:5:"nabla";s:3:"∇";i:8712;s:3:"∈";s:4:"isin";s:3:"∈";i:8713;s:3:"∉";s:5:"notin";s:3:"∉";i:8715;s:3:"∋";s:2:"ni";s:3:"∋";i:8719;s:3:"∏";s:4:"prod";s:3:"∏";i:8721;s:3:"∑";s:3:"sum";s:3:"∑";i:8722;s:3:"−";s:5:"minus";s:3:"−";i:8727;s:3:"∗";s:6:"lowast";s:3:"∗";i:8730;s:3:"√";s:5:"radic";s:3:"√";i:8733;s:3:"∝";s:4:"prop";s:3:"∝";i:8734;s:3:"∞";s:5:"infin";s:3:"∞";i:8736;s:3:"∠";s:3:"ang";s:3:"∠";i:8743;s:3:"∧";s:3:"and";s:3:"∧";i:8744;s:3:"∨";s:2:"or";s:3:"™";i:8745;s:3:"∩";s:3:"cap";s:3:"∩";i:8746;s:3:"∪";s:3:"cup";s:3:"∪";i:8747;s:3:"∫";s:3:"int";s:3:"∫";i:8756;s:3:"∴";s:6:"there4";s:3:"∴";i:8764;s:3:"∼";s:3:"sim";s:3:"∼";i:8773;s:3:"≅";s:4:"cong";s:3:"≅";i:8776;s:3:"≈";s:5:"asymp";s:3:"≈";i:8800;s:3:"≠";s:2:"ne";s:3:"≠";i:8801;s:3:"≡";s:5:"equiv";s:3:"≡";i:8804;s:3:"≤";s:2:"le";s:3:"≤";i:8805;s:3:"≥";s:2:"ge";s:3:"≥";i:8834;s:3:"⊂";s:3:"sub";s:3:"⊂";i:8835;s:3:"⊃";s:3:"sup";s:3:"⊃";i:8836;s:3:"⊄";s:4:"nsub";s:3:"⊄";i:8838;s:3:"⊆";s:4:"sube";s:3:"⊆";i:8839;s:3:"⊇";s:4:"supe";s:3:"⊇";i:8853;s:3:"⊕";s:5:"oplus";s:3:"⊕";i:8855;s:3:"⊗";s:6:"otimes";s:3:"⊗";i:8869;s:3:"⊥";s:4:"perp";s:3:"⊥";i:8901;s:3:"⋅";s:4:"sdot";s:3:"⋅";i:913;s:2:"α";s:5:"Alpha";s:2:"Α";i:914;s:2:"β";s:4:"Beta";s:2:"Β";i:915;s:2:"γ";s:5:"Gamma";s:2:"Γ";i:916;s:2:"δ";s:5:"Delta";s:2:"Δ";i:917;s:2:"ε";s:7:"Epsilon";s:2:"Ε";i:918;s:2:"ζ";s:4:"Zeta";s:2:"Ζ";i:919;s:2:"η";s:3:"Eta";s:2:"Η";i:920;s:2:"θ";s:5:"Theta";s:2:"Θ";i:921;s:2:"ι";s:4:"Iota";s:2:"Ι";i:922;s:2:"κ";s:5:"Kappa";s:2:"Κ";i:923;s:2:"λ";s:6:"Lambda";s:2:"Λ";i:924;s:2:"μ";s:2:"Mu";s:2:"Μ";i:925;s:2:"ν";s:2:"Nu";s:2:"Ν";i:926;s:2:"ξ";s:2:"Xi";s:2:"Ξ";i:927;s:2:"ο";s:7:"Omicron";s:2:"Ο";i:928;s:2:"π";s:2:"Pi";s:2:"Π";i:929;s:2:"ρ";s:3:"Rho";s:2:"Ρ";i:931;s:2:"σ";s:5:"Sigma";s:2:"Σ";i:932;s:2:"τ";s:3:"Tau";s:2:"Τ";i:933;s:2:"υ";s:7:"Upsilon";s:2:"Υ";i:934;s:2:"φ";s:3:"Phi";s:2:"Φ";i:935;s:2:"χ";s:3:"Chi";s:2:"Χ";i:936;s:2:"ψ";s:3:"Psi";s:2:"Ψ";i:937;s:2:"ω";s:5:"Omega";s:2:"Ω";i:945;s:2:"α";s:5:"alpha";s:2:"α";i:946;s:2:"β";s:4:"beta";s:2:"β";i:947;s:2:"γ";s:5:"gamma";s:2:"γ";i:948;s:2:"δ";s:5:"delta";s:2:"δ";i:949;s:2:"ε";s:7:"epsilon";s:2:"ε";i:950;s:2:"ζ";s:4:"zeta";s:2:"ζ";i:951;s:2:"η";s:3:"eta";s:2:"η";i:952;s:2:"θ";s:5:"theta";s:2:"θ";i:953;s:2:"ι";s:4:"iota";s:2:"ι";i:954;s:2:"κ";s:5:"kappa";s:2:"κ";i:955;s:2:"λ";s:6:"lambda";s:2:"λ";i:956;s:2:"μ";s:2:"mu";s:2:"μ";i:957;s:2:"ν";s:2:"nu";s:2:"ν";i:958;s:2:"ξ";s:2:"xi";s:2:"ξ";i:959;s:2:"ο";s:7:"omicron";s:2:"ο";i:960;s:2:"π";s:2:"pi";s:2:"π";i:961;s:2:"ρ";s:3:"rho";s:2:"ρ";i:962;s:2:"ς";s:6:"sigmaf";s:2:"ς";i:963;s:2:"σ";s:5:"sigma";s:2:"σ";i:964;s:2:"τ";s:3:"tau";s:2:"τ";i:965;s:2:"υ";s:7:"upsilon";s:2:"υ";i:966;s:2:"φ";s:3:"phi";s:2:"φ";i:967;s:2:"χ";s:3:"chi";s:2:"χ";i:968;s:2:"ψ";s:3:"psi";s:2:"ψ";i:969;s:2:"ω";s:5:"omega";s:2:"ω";i:977;s:2:"ϑ";s:8:"thetasym";s:2:"ϑ";i:978;s:2:"ϒ";s:5:"upsih";s:2:"ϒ";i:982;s:2:"ϖ";s:3:"piv";s:2:"ϖ";i:338;s:2:"œ";s:5:"OElig";s:2:"Œ";i:339;s:2:"œ";s:5:"oelig";s:2:"œ";i:352;s:2:"š";s:6:"Scaron";s:2:"Š";i:353;s:2:"š";s:6:"scaron";s:2:"š";i:376;s:2:"ÿ";s:4:"Yuml";s:2:"Ÿ";i:402;s:2:"ƒ";s:4:"fnof";s:2:"ƒ";i:710;s:2:"ˆ";s:4:"circ";s:2:"ˆ";i:732;s:2:"˜";s:5:"tilde";s:2:"˜";i:8194;s:3:" ";s:4:"ensp";s:3:" ";i:8195;s:3:" ";s:4:"emsp";s:3:" ";i:8201;s:3:" ";s:6:"thinsp";s:3:" ";i:8204;s:3:"‌";s:4:"zwnj";s:3:"‌";i:8205;s:3:"‍";s:3:"zwj";s:3:"‍";i:8206;s:3:"‎";s:3:"lrm";s:3:"‎";i:8207;s:3:"‏";s:3:"rlm";s:3:"‏";i:8211;s:3:"–";s:5:"ndash";s:3:"–";i:8212;s:3:"—";s:5:"mdash";s:3:"—";i:8216;s:3:"‘";s:5:"lsquo";s:3:"‘";i:8217;s:3:"’";s:5:"rsquo";s:3:"’";i:8218;s:3:"‚";s:5:"sbquo";s:3:"‚";i:8220;s:3:"“";s:5:"ldquo";s:3:"“";i:8221;s:3:"”";s:5:"rdquo";s:3:"”";i:8222;s:3:"„";s:5:"bdquo";s:3:"„";i:8224;s:3:"†";s:6:"dagger";s:3:"†";i:8225;s:3:"†";s:6:"Dagger";s:3:"‡";i:8226;s:3:"•";s:4:"bull";s:3:"•";i:8230;s:3:"…";s:6:"hellip";s:3:"…";i:8240;s:3:"‰";s:6:"permil";s:3:"‰";i:8242;s:3:"′";s:5:"prime";s:3:"′";i:8243;s:3:"′";s:5:"Prime";s:3:"″";i:8249;s:3:"‹";s:6:"lsaquo";s:3:"‹";i:8250;s:3:"›";s:6:"rsaquo";s:3:"›";i:8254;s:3:"‾";s:5:"oline";s:3:"‾";i:8364;s:3:"€";s:4:"euro";s:3:"€";i:8482;s:3:"™";i:8592;s:3:"←";s:4:"larr";s:3:"←";i:8593;s:3:"↑";s:4:"uarr";s:3:"↑";i:8594;s:3:"→";s:4:"rarr";s:3:"→";i:8595;s:3:"↓";s:4:"darr";s:3:"↓";i:8596;s:3:"↔";s:4:"harr";s:3:"↔";i:8629;s:3:"↵";s:5:"crarr";s:3:"↵";i:8968;s:3:"⌈";s:5:"lceil";s:3:"⌈";i:8969;s:3:"⌉";s:5:"rceil";s:3:"⌉";i:8970;s:3:"⌊";s:6:"lfloor";s:3:"⌊";i:8971;s:3:"⌋";s:6:"rfloor";s:3:"⌋";i:9674;s:3:"◊";s:3:"loz";s:3:"◊";i:9824;s:3:"♠";s:6:"spades";s:3:"♠";i:9827;s:3:"♣";s:5:"clubs";s:3:"♣";i:9829;s:3:"♥";s:6:"hearts";s:3:"♥";i:9830;s:3:"♦";s:5:"diams";s:3:"♦";i:161;s:2:"¡";s:5:"iexcl";s:2:"¡";i:162;s:2:"¢";s:4:"cent";s:2:"¢";i:163;s:2:"£";s:5:"pound";s:2:"£";i:164;s:2:"¤";s:6:"curren";s:2:"¤";i:165;s:2:"¥";s:3:"yen";s:2:"¥";i:166;s:2:"¦";s:6:"brvbar";s:2:"¦";i:167;s:2:"§";s:4:"sect";s:2:"§";i:168;s:2:"¨";s:3:"uml";s:2:"¨";i:169;s:2:"©";s:4:"copy";s:2:"©";i:170;s:2:"ª";s:4:"ordf";s:2:"ª";i:171;s:2:"«";s:5:"laquo";s:2:"«";i:172;s:2:"¬";s:3:"not";s:2:"¬";i:173;s:2:"­";s:3:"shy";s:2:"­";i:174;s:2:"®";s:3:"reg";s:2:"®";i:175;s:2:"¯";s:4:"macr";s:2:"¯";i:176;s:2:"°";s:3:"deg";s:2:"°";i:177;s:2:"±";s:6:"plusmn";s:2:"±";i:178;s:2:"²";s:4:"sup2";s:2:"²";i:179;s:2:"³";s:4:"sup3";s:2:"³";i:180;s:2:"´";s:5:"acute";s:2:"´";i:181;s:2:"µ";s:5:"micro";s:2:"µ";i:182;s:2:"¶";s:4:"para";s:2:"¶";i:183;s:2:"·";s:6:"middot";s:2:"·";i:184;s:2:"¸";s:5:"cedil";s:2:"¸";i:185;s:2:"¹";s:4:"sup1";s:2:"¹";i:186;s:2:"º";s:4:"ordm";s:2:"º";i:187;s:2:"»";s:5:"raquo";s:2:"»";i:188;s:2:"¼";s:6:"frac14";s:2:"¼";i:189;s:2:"½";s:6:"frac12";s:2:"½";i:190;s:2:"¾";s:6:"frac34";s:2:"¾";i:191;s:2:"¿";s:6:"iquest";s:2:"¿";i:215;s:2:"×";s:5:"times";s:2:"×";i:247;s:2:"÷";s:6:"divide";s:2:"÷";i:192;s:2:"à";s:6:"Agrave";s:2:"À";i:193;s:2:"á";s:6:"Aacute";s:2:"Á";i:194;s:2:"â";s:5:"Acirc";s:2:"Â";i:195;s:2:"ã";s:6:"Atilde";s:2:"Ã";i:196;s:2:"Ä";s:4:"Auml";s:2:"Ä";i:197;s:2:"å";s:5:"Aring";s:2:"Å";i:198;s:2:"æ";s:5:"AElig";s:2:"Æ";i:199;s:2:"ç";s:6:"Ccedil";s:2:"Ç";i:200;s:2:"è";s:6:"Egrave";s:2:"È";i:201;s:2:"é";s:6:"Eacute";s:2:"É";i:202;s:2:"ê";s:5:"Ecirc";s:2:"Ê";i:203;s:2:"Ë";s:4:"Euml";s:2:"Ë";i:204;s:2:"ì";s:6:"Igrave";s:2:"Ì";i:205;s:2:"í";s:6:"Iacute";s:2:"Í";i:206;s:2:"î";s:5:"Icirc";s:2:"Î";i:207;s:2:"ï";s:4:"Iuml";s:2:"Ï";i:208;s:2:"ð";s:3:"ETH";s:2:"Ð";i:209;s:2:"ñ";s:6:"Ntilde";s:2:"Ñ";i:210;s:2:"ò";s:6:"Ograve";s:2:"Ò";i:211;s:2:"ó";s:6:"Oacute";s:2:"Ó";i:212;s:2:"ô";s:5:"Ocirc";s:2:"Ô";i:213;s:2:"õ";s:6:"Otilde";s:2:"Õ";i:214;s:2:"Ö";s:4:"Ouml";s:2:"Ö";i:216;s:2:"ø";s:6:"Oslash";s:2:"Ø";i:217;s:2:"ù";s:6:"Ugrave";s:2:"Ù";i:218;s:2:"ú";s:6:"Uacute";s:2:"Ú";i:219;s:2:"û";s:5:"Ucirc";s:2:"Û";i:220;s:2:"Ü";s:4:"Uuml";s:2:"Ü";i:221;s:2:"ý";s:6:"Yacute";s:2:"Ý";i:222;s:2:"þ";s:5:"THORN";s:2:"Þ";i:223;s:2:"ß";s:5:"szlig";s:2:"ß";i:224;s:2:"à";s:6:"agrave";s:2:"à";i:225;s:2:"á";s:6:"aacute";s:2:"á";i:226;s:2:"â";s:5:"acirc";s:2:"â";i:227;s:2:"ã";s:6:"atilde";s:2:"ã";i:228;s:2:"ä";s:4:"auml";s:2:"ä";i:229;s:2:"å";s:5:"aring";s:2:"å";i:230;s:2:"æ";s:5:"aelig";s:2:"æ";i:231;s:2:"ç";s:6:"ccedil";s:2:"ç";i:232;s:2:"è";s:6:"egrave";s:2:"è";i:233;s:2:"é";s:6:"eacute";s:2:"é";i:234;s:2:"ê";s:5:"ecirc";s:2:"ê";i:235;s:2:"ë";s:4:"euml";s:2:"ë";i:236;s:2:"ì";s:6:"igrave";s:2:"ì";i:237;s:2:"í";s:6:"iacute";s:2:"í";i:238;s:2:"î";s:5:"icirc";s:2:"î";i:239;s:2:"ï";s:4:"iuml";s:2:"ï";i:240;s:2:"ð";s:3:"eth";s:2:"ð";i:241;s:2:"ñ";s:6:"ntilde";s:2:"ñ";i:242;s:2:"ò";s:6:"ograve";s:2:"ò";i:243;s:2:"ó";s:6:"oacute";s:2:"ó";i:244;s:2:"ô";s:5:"ocirc";s:2:"ô";i:245;s:2:"õ";s:6:"otilde";s:2:"õ";i:246;s:2:"ö";s:4:"ouml";s:2:"ö";i:248;s:2:"ø";s:6:"oslash";s:2:"ø";i:249;s:2:"ù";s:6:"ugrave";s:2:"ù";i:250;s:2:"ú";s:6:"uacute";s:2:"ú";i:251;s:2:"û";s:5:"ucirc";s:2:"û";i:252;s:2:"ü";s:4:"uuml";s:2:"ü";i:253;s:2:"ý";s:6:"yacute";s:2:"ý";i:254;s:2:"þ";s:5:"thorn";s:2:"þ";i:255;s:2:"ÿ";s:4:"yuml";s:2:"ÿ";s:5:"trade";s:3:"™";i:32;s:1:" ";s:4:"nbsp";s:1:" ";s:4:"quot";s:1:""";i:34;s:1:""";s:3:"amp";s:1:"&";i:38;s:1:"&";s:2:"lt";s:1:"<";i:60;s:1:"<";s:2:"gt";s:1:">";i:62;s:1:">";s:5:"frasl";s:3:"⁄";i:8260;s:3:"⁄";i:8656;s:3:"⇐";i:8657;s:3:"↑";i:8658;s:3:"⇒";i:8659;s:3:"↓";i:8660;s:3:"⇔";s:4:"hArr";s:3:"⇔";s:4:"rArr";s:3:"⇒";s:4:"lArr";s:3:"⇐";} \ No newline at end of file diff --git a/lib/plugins/ckgedit/action/entities/ENTITIES.HOWTO b/lib/plugins/ckgedit/action/entities/ENTITIES.HOWTO new file mode 100644 index 0000000..806a5a5 --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/ENTITIES.HOWTO @@ -0,0 +1,55 @@ +Adding Entities to the Entities Defintions Array. + +You create an Entity definition file with the format illustrated below, and then run the php +script ents_seri.php + +Name your definitions file add.ent + +Then at the command line type: + php ents_seri.php + +Alternatively, you can give your entity definition file any name you want and feed +the file name to the script at the command line: + php ents_seri.php your_entity_file + +This creates a new entities file called ent.ser, which must then be copied to +the fckg/action subdirectory. You would be wise to first back up the original ent.ser +before over-writing it. + +There are two definition files in the action/entities: ents.data and fcked-ents.data. +These are required and must not be removed from the directory. + +The definition file has the following format: + +character +entity numeric code +entity character code + +character +entity numeric code +entity character code + +etc. + +There is one empty line between each definition. Here is an actual example. + +< +< +< + +> +> +> + + +¡ +¡ + + +¢ +¢ + + +£ +£ + diff --git a/lib/plugins/ckgedit/action/entities/ent.ser b/lib/plugins/ckgedit/action/entities/ent.ser new file mode 100644 index 0000000..aa3ca6f --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/ent.ser @@ -0,0 +1 @@ +a:490:{i:8704;s:3:"∀";s:6:"forall";s:3:"∀";i:8706;s:3:"∂";s:4:"part";s:3:"∂";i:8707;s:3:"∃";s:5:"exist";s:3:"∃";i:8709;s:3:"∅";s:5:"empty";s:3:"∅";i:8711;s:3:"∇";s:5:"nabla";s:3:"∇";i:8712;s:3:"∈";s:4:"isin";s:3:"∈";i:8713;s:3:"∉";s:5:"notin";s:3:"∉";i:8715;s:3:"∋";s:2:"ni";s:3:"∋";i:8719;s:3:"∏";s:4:"prod";s:3:"∏";i:8721;s:3:"∑";s:3:"sum";s:3:"∑";i:8722;s:3:"−";s:5:"minus";s:3:"−";i:8727;s:3:"∗";s:6:"lowast";s:3:"∗";i:8730;s:3:"√";s:5:"radic";s:3:"√";i:8733;s:3:"∝";s:4:"prop";s:3:"∝";i:8734;s:3:"∞";s:5:"infin";s:3:"∞";i:8736;s:3:"∠";s:3:"ang";s:3:"∠";i:8743;s:3:"∧";s:3:"and";s:3:"∧";i:8744;s:3:"∨";s:2:"or";s:3:"™";i:8745;s:3:"∩";s:3:"cap";s:3:"∩";i:8746;s:3:"∪";s:3:"cup";s:3:"∪";i:8747;s:3:"∫";s:3:"int";s:3:"∫";i:8756;s:3:"∴";s:6:"there4";s:3:"∴";i:8764;s:3:"∼";s:3:"sim";s:3:"∼";i:8773;s:3:"≅";s:4:"cong";s:3:"≅";i:8776;s:3:"≈";s:5:"asymp";s:3:"≈";i:8800;s:3:"≠";s:2:"ne";s:3:"≠";i:8801;s:3:"≡";s:5:"equiv";s:3:"≡";i:8804;s:3:"≤";s:2:"le";s:3:"≤";i:8805;s:3:"≥";s:2:"ge";s:3:"≥";i:8834;s:3:"⊂";s:3:"sub";s:3:"⊂";i:8835;s:3:"⊃";s:3:"sup";s:3:"⊃";i:8836;s:3:"⊄";s:4:"nsub";s:3:"⊄";i:8838;s:3:"⊆";s:4:"sube";s:3:"⊆";i:8839;s:3:"⊇";s:4:"supe";s:3:"⊇";i:8853;s:3:"⊕";s:5:"oplus";s:3:"⊕";i:8855;s:3:"⊗";s:6:"otimes";s:3:"⊗";i:8869;s:3:"⊥";s:4:"perp";s:3:"⊥";i:8901;s:3:"⋅";s:4:"sdot";s:3:"⋅";i:913;s:2:"α";s:5:"Alpha";s:2:"Α";i:914;s:2:"β";s:4:"Beta";s:2:"Β";i:915;s:2:"γ";s:5:"Gamma";s:2:"Γ";i:916;s:2:"δ";s:5:"Delta";s:2:"Δ";i:917;s:2:"ε";s:7:"Epsilon";s:2:"Ε";i:918;s:2:"ζ";s:4:"Zeta";s:2:"Ζ";i:919;s:2:"η";s:3:"Eta";s:2:"Η";i:920;s:2:"θ";s:5:"Theta";s:2:"Θ";i:921;s:2:"ι";s:4:"Iota";s:2:"Ι";i:922;s:2:"κ";s:5:"Kappa";s:2:"Κ";i:923;s:2:"λ";s:6:"Lambda";s:2:"Λ";i:924;s:2:"μ";s:2:"Mu";s:2:"Μ";i:925;s:2:"ν";s:2:"Nu";s:2:"Ν";i:926;s:2:"ξ";s:2:"Xi";s:2:"Ξ";i:927;s:2:"ο";s:7:"Omicron";s:2:"Ο";i:928;s:2:"π";s:2:"Pi";s:2:"Π";i:929;s:2:"ρ";s:3:"Rho";s:2:"Ρ";i:931;s:2:"σ";s:5:"Sigma";s:2:"Σ";i:932;s:2:"τ";s:3:"Tau";s:2:"Τ";i:933;s:2:"υ";s:7:"Upsilon";s:2:"Υ";i:934;s:2:"φ";s:3:"Phi";s:2:"Φ";i:935;s:2:"χ";s:3:"Chi";s:2:"Χ";i:936;s:2:"ψ";s:3:"Psi";s:2:"Ψ";i:937;s:2:"ω";s:5:"Omega";s:2:"Ω";i:945;s:2:"α";s:5:"alpha";s:2:"α";i:946;s:2:"β";s:4:"beta";s:2:"β";i:947;s:2:"γ";s:5:"gamma";s:2:"γ";i:948;s:2:"δ";s:5:"delta";s:2:"δ";i:949;s:2:"ε";s:7:"epsilon";s:2:"ε";i:950;s:2:"ζ";s:4:"zeta";s:2:"ζ";i:951;s:2:"η";s:3:"eta";s:2:"η";i:952;s:2:"θ";s:5:"theta";s:2:"θ";i:953;s:2:"ι";s:4:"iota";s:2:"ι";i:954;s:2:"κ";s:5:"kappa";s:2:"κ";i:955;s:2:"λ";s:6:"lambda";s:2:"λ";i:956;s:2:"μ";s:2:"mu";s:2:"μ";i:957;s:2:"ν";s:2:"nu";s:2:"ν";i:958;s:2:"ξ";s:2:"xi";s:2:"ξ";i:959;s:2:"ο";s:7:"omicron";s:2:"ο";i:960;s:2:"π";s:2:"pi";s:2:"π";i:961;s:2:"ρ";s:3:"rho";s:2:"ρ";i:962;s:2:"ς";s:6:"sigmaf";s:2:"ς";i:963;s:2:"σ";s:5:"sigma";s:2:"σ";i:964;s:2:"τ";s:3:"tau";s:2:"τ";i:965;s:2:"υ";s:7:"upsilon";s:2:"υ";i:966;s:2:"φ";s:3:"phi";s:2:"φ";i:967;s:2:"χ";s:3:"chi";s:2:"χ";i:968;s:2:"ψ";s:3:"psi";s:2:"ψ";i:969;s:2:"ω";s:5:"omega";s:2:"ω";i:977;s:2:"ϑ";s:8:"thetasym";s:2:"ϑ";i:978;s:2:"ϒ";s:5:"upsih";s:2:"ϒ";i:982;s:2:"ϖ";s:3:"piv";s:2:"ϖ";i:338;s:2:"œ";s:5:"OElig";s:2:"Œ";i:339;s:2:"œ";s:5:"oelig";s:2:"œ";i:352;s:2:"š";s:6:"Scaron";s:2:"Š";i:353;s:2:"š";s:6:"scaron";s:2:"š";i:376;s:2:"ÿ";s:4:"Yuml";s:2:"Ÿ";i:402;s:2:"ƒ";s:4:"fnof";s:2:"ƒ";i:710;s:2:"ˆ";s:4:"circ";s:2:"ˆ";i:732;s:2:"˜";s:5:"tilde";s:2:"˜";i:8194;s:3:" ";s:4:"ensp";s:3:" ";i:8195;s:3:" ";s:4:"emsp";s:3:" ";i:8201;s:3:" ";s:6:"thinsp";s:3:" ";i:8204;s:3:"‌";s:4:"zwnj";s:3:"‌";i:8205;s:3:"‍";s:3:"zwj";s:3:"‍";i:8206;s:3:"‎";s:3:"lrm";s:3:"‎";i:8207;s:3:"‏";s:3:"rlm";s:3:"‏";i:8211;s:3:"–";s:5:"ndash";s:3:"–";i:8212;s:3:"—";s:5:"mdash";s:3:"—";i:8216;s:3:"‘";s:5:"lsquo";s:3:"‘";i:8217;s:3:"’";s:5:"rsquo";s:3:"’";i:8218;s:3:"‚";s:5:"sbquo";s:3:"‚";i:8220;s:3:"“";s:5:"ldquo";s:3:"“";i:8221;s:3:"”";s:5:"rdquo";s:3:"”";i:8222;s:3:"„";s:5:"bdquo";s:3:"„";i:8224;s:3:"†";s:6:"dagger";s:3:"†";i:8225;s:3:"†";s:6:"Dagger";s:3:"‡";i:8226;s:3:"•";s:4:"bull";s:3:"•";i:8230;s:3:"…";s:6:"hellip";s:3:"…";i:8240;s:3:"‰";s:6:"permil";s:3:"‰";i:8242;s:3:"′";s:5:"prime";s:3:"′";i:8243;s:3:"′";s:5:"Prime";s:3:"″";i:8249;s:3:"‹";s:6:"lsaquo";s:3:"‹";i:8250;s:3:"›";s:6:"rsaquo";s:3:"›";i:8254;s:3:"‾";s:5:"oline";s:3:"‾";i:8364;s:3:"€";s:4:"euro";s:3:"€";i:8482;s:3:"™";i:8592;s:3:"←";s:4:"larr";s:3:"←";i:8593;s:3:"↑";s:4:"uarr";s:3:"↑";i:8594;s:3:"→";s:4:"rarr";s:3:"→";i:8595;s:3:"↓";s:4:"darr";s:3:"↓";i:8596;s:3:"↔";s:4:"harr";s:3:"↔";i:8629;s:3:"↵";s:5:"crarr";s:3:"↵";i:8968;s:3:"⌈";s:5:"lceil";s:3:"⌈";i:8969;s:3:"⌉";s:5:"rceil";s:3:"⌉";i:8970;s:3:"⌊";s:6:"lfloor";s:3:"⌊";i:8971;s:3:"⌋";s:6:"rfloor";s:3:"⌋";i:9674;s:3:"◊";s:3:"loz";s:3:"◊";i:9824;s:3:"♠";s:6:"spades";s:3:"♠";i:9827;s:3:"♣";s:5:"clubs";s:3:"♣";i:9829;s:3:"♥";s:6:"hearts";s:3:"♥";i:9830;s:3:"♦";s:5:"diams";s:3:"♦";i:161;s:2:"¡";s:5:"iexcl";s:2:"¡";i:162;s:2:"¢";s:4:"cent";s:2:"¢";i:163;s:2:"£";s:5:"pound";s:2:"£";i:164;s:2:"¤";s:6:"curren";s:2:"¤";i:165;s:2:"¥";s:3:"yen";s:2:"¥";i:166;s:2:"¦";s:6:"brvbar";s:2:"¦";i:167;s:2:"§";s:4:"sect";s:2:"§";i:168;s:2:"¨";s:3:"uml";s:2:"¨";i:169;s:2:"©";s:4:"copy";s:2:"©";i:170;s:2:"ª";s:4:"ordf";s:2:"ª";i:171;s:2:"«";s:5:"laquo";s:2:"«";i:172;s:2:"¬";s:3:"not";s:2:"¬";i:173;s:2:"­";s:3:"shy";s:2:"­";i:174;s:2:"®";s:3:"reg";s:2:"®";i:175;s:2:"¯";s:4:"macr";s:2:"¯";i:176;s:2:"°";s:3:"deg";s:2:"°";i:177;s:2:"±";s:6:"plusmn";s:2:"±";i:178;s:2:"²";s:4:"sup2";s:2:"²";i:179;s:2:"³";s:4:"sup3";s:2:"³";i:180;s:2:"´";s:5:"acute";s:2:"´";i:181;s:2:"µ";s:5:"micro";s:2:"µ";i:182;s:2:"¶";s:4:"para";s:2:"¶";i:183;s:2:"·";s:6:"middot";s:2:"·";i:184;s:2:"¸";s:5:"cedil";s:2:"¸";i:185;s:2:"¹";s:4:"sup1";s:2:"¹";i:186;s:2:"º";s:4:"ordm";s:2:"º";i:187;s:2:"»";s:5:"raquo";s:2:"»";i:188;s:2:"¼";s:6:"frac14";s:2:"¼";i:189;s:2:"½";s:6:"frac12";s:2:"½";i:190;s:2:"¾";s:6:"frac34";s:2:"¾";i:191;s:2:"¿";s:6:"iquest";s:2:"¿";i:215;s:2:"×";s:5:"times";s:2:"×";i:247;s:2:"÷";s:6:"divide";s:2:"÷";i:192;s:2:"à";s:6:"Agrave";s:2:"À";i:193;s:2:"á";s:6:"Aacute";s:2:"Á";i:194;s:2:"â";s:5:"Acirc";s:2:"Â";i:195;s:2:"ã";s:6:"Atilde";s:2:"Ã";i:196;s:2:"Ä";s:4:"Auml";s:2:"Ä";i:197;s:2:"å";s:5:"Aring";s:2:"Å";i:198;s:2:"æ";s:5:"AElig";s:2:"Æ";i:199;s:2:"ç";s:6:"Ccedil";s:2:"Ç";i:200;s:2:"è";s:6:"Egrave";s:2:"È";i:201;s:2:"é";s:6:"Eacute";s:2:"É";i:202;s:2:"ê";s:5:"Ecirc";s:2:"Ê";i:203;s:2:"Ë";s:4:"Euml";s:2:"Ë";i:204;s:2:"ì";s:6:"Igrave";s:2:"Ì";i:205;s:2:"í";s:6:"Iacute";s:2:"Í";i:206;s:2:"î";s:5:"Icirc";s:2:"Î";i:207;s:2:"ï";s:4:"Iuml";s:2:"Ï";i:208;s:2:"ð";s:3:"ETH";s:2:"Ð";i:209;s:2:"ñ";s:6:"Ntilde";s:2:"Ñ";i:210;s:2:"ò";s:6:"Ograve";s:2:"Ò";i:211;s:2:"ó";s:6:"Oacute";s:2:"Ó";i:212;s:2:"ô";s:5:"Ocirc";s:2:"Ô";i:213;s:2:"õ";s:6:"Otilde";s:2:"Õ";i:214;s:2:"Ö";s:4:"Ouml";s:2:"Ö";i:216;s:2:"ø";s:6:"Oslash";s:2:"Ø";i:217;s:2:"ù";s:6:"Ugrave";s:2:"Ù";i:218;s:2:"ú";s:6:"Uacute";s:2:"Ú";i:219;s:2:"û";s:5:"Ucirc";s:2:"Û";i:220;s:2:"Ü";s:4:"Uuml";s:2:"Ü";i:221;s:2:"ý";s:6:"Yacute";s:2:"Ý";i:222;s:2:"þ";s:5:"THORN";s:2:"Þ";i:223;s:2:"ß";s:5:"szlig";s:2:"ß";i:224;s:2:"à";s:6:"agrave";s:2:"à";i:225;s:2:"á";s:6:"aacute";s:2:"á";i:226;s:2:"â";s:5:"acirc";s:2:"â";i:227;s:2:"ã";s:6:"atilde";s:2:"ã";i:228;s:2:"ä";s:4:"auml";s:2:"ä";i:229;s:2:"å";s:5:"aring";s:2:"å";i:230;s:2:"æ";s:5:"aelig";s:2:"æ";i:231;s:2:"ç";s:6:"ccedil";s:2:"ç";i:232;s:2:"è";s:6:"egrave";s:2:"è";i:233;s:2:"é";s:6:"eacute";s:2:"é";i:234;s:2:"ê";s:5:"ecirc";s:2:"ê";i:235;s:2:"ë";s:4:"euml";s:2:"ë";i:236;s:2:"ì";s:6:"igrave";s:2:"ì";i:237;s:2:"í";s:6:"iacute";s:2:"í";i:238;s:2:"î";s:5:"icirc";s:2:"î";i:239;s:2:"ï";s:4:"iuml";s:2:"ï";i:240;s:2:"ð";s:3:"eth";s:2:"ð";i:241;s:2:"ñ";s:6:"ntilde";s:2:"ñ";i:242;s:2:"ò";s:6:"ograve";s:2:"ò";i:243;s:2:"ó";s:6:"oacute";s:2:"ó";i:244;s:2:"ô";s:5:"ocirc";s:2:"ô";i:245;s:2:"õ";s:6:"otilde";s:2:"õ";i:246;s:2:"ö";s:4:"ouml";s:2:"ö";i:248;s:2:"ø";s:6:"oslash";s:2:"ø";i:249;s:2:"ù";s:6:"ugrave";s:2:"ù";i:250;s:2:"ú";s:6:"uacute";s:2:"ú";i:251;s:2:"û";s:5:"ucirc";s:2:"û";i:252;s:2:"ü";s:4:"uuml";s:2:"ü";i:253;s:2:"ý";s:6:"yacute";s:2:"ý";i:254;s:2:"þ";s:5:"thorn";s:2:"þ";i:255;s:2:"ÿ";s:4:"yuml";s:2:"ÿ";s:5:"trade";s:3:"™";i:32;s:1:" ";s:4:"nbsp";s:1:" ";s:4:"quot";s:1:""";i:34;s:1:""";s:3:"amp";s:1:"&";i:38;s:1:"&";s:2:"lt";s:1:"<";i:60;s:1:"<";s:2:"gt";s:1:">";i:62;s:1:">";s:5:"frasl";s:3:"⁄";i:8260;s:3:"⁄";i:8656;s:3:"⇐";i:8657;s:3:"↑";i:8658;s:3:"⇒";i:8659;s:3:"↓";i:8660;s:3:"⇔";s:4:"hArr";s:3:"⇔";s:4:"rArr";s:3:"⇒";s:4:"lArr";s:3:"⇐";} \ No newline at end of file diff --git a/lib/plugins/ckgedit/action/entities/ents.data b/lib/plugins/ckgedit/action/entities/ents.data new file mode 100644 index 0000000..255e497 --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/ents.data @@ -0,0 +1,948 @@ +∀ +∀ +∀ + +∂ +∂ +∂ + +∃ +∃ +∃ + +∅ +∅ +∅ + +∇ +∇ +∇ + +∈ +∈ +∈ + +∉ +∉ +∉ + +∋ +∋ +∋ + +∏ +∏ +∏ + +∑ +∑ +∑ + +− +− +− + +∗ +∗ +∗ + +√ +√ +√ + +∝ +∝ +∝ + +∞ +∞ +∞ + +∠ +∠ +∠ + +∧ +∧ +∧ + +∨ +∨ +∨ + +∩ +∩ +∩ + +∪ +∪ +∪ + +∫ +∫ +∫ + +∴ +∴ +∴ + +∼ +∼ +∼ + +≅ +≅ +≅ + +≈ +≈ +≈ + +≠ +≠ +≠ + +≡ +≡ +≡ + +≤ +≤ +≤ + +≥ +≥ +≥ + +⊂ +⊂ +⊂ + +⊃ +⊃ +⊃ + +⊄ +⊄ +⊄ + +⊆ +⊆ +⊆ + +⊇ +⊇ +⊇ + +⊕ +⊕ +⊕ + +⊗ +⊗ +⊗ + +⊥ +⊥ +⊥ + +⋅ +⋅ +⋅ + +Α +Α +Α + +Β +Β +Β + +Γ +Γ +Γ + +Δ +Δ +Δ + +Ε +Ε +Ε + +Ζ +Ζ +Ζ + +Η +Η +Η + +Θ +Θ +Θ + +Ι +Ι +Ι + +Κ +Κ +Κ + +Λ +Λ +Λ + +Μ +Μ +Μ + +Ν +Ν +Ν + +Ξ +Ξ +Ξ + +Ο +Ο +Ο + +Π +Π +Π + +Ρ +Ρ +Ρ + +Σ +Σ +Σ + +Τ +Τ +Τ + +Υ +Υ +Υ + +Φ +Φ +Φ + +Χ +Χ +Χ + +Ψ +Ψ +Ψ + +Ω +Ω +Ω + +α +α +α + +β +β +β + +γ +γ +γ + +δ +δ +δ + +ε +ε +ε + +ζ +ζ +ζ + +η +η +η + +θ +θ +θ + +ι +ι +ι + +κ +κ +κ + +λ +λ +λ + +μ +μ +μ + +ν +ν +ν + +ξ +ξ +ξ + +ο +ο +ο + +π +π +π + +ρ +ρ +ρ + +ς +ς +ς + +σ +σ +σ + +τ +τ +τ + +υ +υ +υ + +φ +φ +φ + +χ +χ +χ + +ψ +ψ +ψ + +ω +ω +ω + +ϑ +ϑ +ϑ + +ϒ +ϒ +ϒ + +ϖ +ϖ +ϖ + +Œ +Œ +Œ + +œ +œ +œ + +Š +Š +Š + +š +š +š + +Ÿ +Ÿ +Ÿ + +ƒ +ƒ +ƒ + +ˆ +ˆ +ˆ + +˜ +˜ +˜ + +  +  +  + +  +  +  + +  +  +  + +‌ +‌ +‌ + +‍ +‍ +‍ + +‎ +‎ +‎ + +‏ +‏ +‏ + +– +– +– + +— +— +— + +‘ +‘ +‘ + +’ +’ +’ + +‚ +‚ +‚ + +“ +“ +“ + +” +” +” + +„ +„ +„ + +† +† +† + +‡ +‡ +‡ + +• +• +• + +… +… +… + +‰ +‰ +‰ + +′ +′ +′ + +″ +″ +″ + +‹ +‹ +‹ + +› +› +› + +‾ +‾ +‾ + +€ +€ +€ + +™ +™ +or + +← +← +← + +↑ +↑ +↑ + +→ +→ +→ + +↓ +↓ +↓ + +↔ +↔ +↔ + +↵ +↵ +↵ + +⌈ +⌈ +⌈ + +⌉ +⌉ +⌉ + +⌊ +⌊ +⌊ + +⌋ +⌋ +⌋ + +◊ +◊ +◊ + +♠ +♠ +♠ + +♣ +♣ +♣ + +♥ +♥ +♥ + +♦ +♦ +♦ + + +  +  + +¡ +¡ +¡ + +¢ +¢ +¢ + +£ +£ +£ + +¤ +¤ +¤ + +¥ +¥ +¥ + +¦ +¦ +¦ + +§ +§ +§ + +¨ +¨ +¨ + +© +© +© + +ª +ª +ª + +« +« +« + +¬ +¬ +¬ + +­­ +­ +­ + +® +® +® + +¯ +¯ +¯ + +° +° +° + +± +± +± + +² +² +² + +³ +³ +³ + +´ +´ +´ + +µ +µ +µ + +¶ +¶ +¶ + +· +· +· + +¸ +¸ +¸ + +¹ +¹ +¹ + +º +º +º + +» +» +» + +¼ +¼ +¼ + +½ +½ +½ + +¾ +¾ +¾ + +¿ +¿ +¿ + +× +× +× + +÷ +÷ +÷ + +À +À +À + +Á +Á +Á + + + + + +à +à +à + +Ä +Ä +Ä + +Å +Å +Å + +Æ +Æ +Æ + +Ç +Ç +Ç + +È +È +È + +É +É +É + +Ê +Ê +Ê + +Ë +Ë +Ë + +Ì +Ì +Ì + +Í +Í +Í + +Î +Î +Î + +Ï +Ï +Ï + +Ð +Ð +Ð + +Ñ +Ñ +Ñ + +Ò +Ò +Ò + +Ó +Ó +Ó + +Ô +Ô +Ô + +Õ +Õ +Õ + +Ö +Ö +Ö + +Ø +Ø +Ø + +Ù +Ù +Ù + +Ú +Ú +Ú + +Û +Û +Û + +Ü +Ü +Ü + +Ý +Ý +Ý + +Þ +Þ +Þ + +ß +ß +ß + +à +à +à + +á +á +á + +â +â +â + +ã +ã +ã + +ä +ä +ä + +å +å +å + +æ +æ +æ + +ç +ç +ç + +è +è +è + +é +é +é + +ê +ê +ê + +ë +ë +ë + +ì +ì +ì + +í +í +í + +î +î +î + +ï +ï +ï + +ð +ð +ð + +ñ +ñ +ñ + +ò +ò +ò + +ó +ó +ó + +ô +ô +ô + +õ +õ +õ + +ö +ö +ö + +ø +ø +ø + +ù +ù +ù + +ú +ú +ú + +û +û +û + +ü +ü +ü + +ý +ý +ý + +þ +þ +þ + +ÿ +ÿ +ÿ + +™ +™ +™ + diff --git a/lib/plugins/ckgedit/action/entities/ents_seri.php b/lib/plugins/ckgedit/action/entities/ents_seri.php new file mode 100644 index 0000000..1a8c80b --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/ents_seri.php @@ -0,0 +1,61 @@ + diff --git a/lib/plugins/ckgedit/action/entities/fcked-ents.data b/lib/plugins/ckgedit/action/entities/fcked-ents.data new file mode 100644 index 0000000..e0fb2c8 --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/fcked-ents.data @@ -0,0 +1,842 @@ +¡ +iexcl +161 + +¢ +cent +162 + +£ +pound +163 + +¤ +curren +164 + +¥ +yen +165 + +¦ +brvbar +166 + +§ +sect +167 + +¨ +uml +168 + +© +copy +169 + +ª +ordf +170 + +« +laquo +171 + +¬ +not +172 + +­ +shy +173 + +® +reg +174 + +¯ +macr +175 + +° +deg +176 + +± +plusmn +177 + +² +sup2 +178 + +³ +sup3 +179 + +´ +acute +180 + +µ +micro +181 + +¶ +para +182 + +· +middot +183 + +¸ +cedil +184 + +¹ +sup1 +185 + +º +ordm +186 + +» +raquo +187 + +¼ +frac14 +188 + +½ +frac12 +189 + +¾ +frac34 +190 + +¿ +iquest +191 + +à +agrave +192 + +á +aacute +193 + +â +acirc +194 + +ã +atilde +195 + +Ä +Auml +196 + +å +aring +197 + +æ +aelig +198 + +ç +ccedil +199 + +è +egrave +200 + +é +eacute +201 + +ê +ecirc +202 + +Ë +203 +Euml; + +ì +igrave +204 + +í +iacute +205 + +î +icirc +206 + +ï +iuml +207 + +ð +eth +208 + +ñ +ntilde +209 + +ò +ograve +210 + +ó +oacute +211 + +ô +ocirc +212 + +õ +otilde +213 + +Ö +Ouml +214 + +× +times +215 + +ø +oslash +216 + +ù +ugrave +217 + +ú +uacute +218 + +û +ucirc +219 + +Ü +Uuml +220 + +ý +yacute +221 + +þ +thorn +222 + +ß +szlig +223 + +à +agrave +224 + +á +aacute +225 + +â +acirc +226 + +ã +atilde +227 + +ä +auml +228 + +å +aring +229 + +æ +aelig +230 + +ç +ccedil +231 + +è +egrave +232 + +é +eacute +233 + +ê +ecirc +234 + +ë +euml +235 + +ì +igrave +236 + +í +iacute +237 + +î +icirc +238 + +ï +iuml +239 + +ð +eth +240 + +ñ +ntilde +241 + +ò +ograve +242 + +ó +oacute +243 + +ô +ocirc +244 + +õ +otilde +245 + +ö +ouml +246 + +÷ +divide +247 + +ø +oslash +248 + +ù +ugrave +249 + +ú +uacute +250 + +û +ucirc +251 + +ü +uuml +252 + +ý +yacute +253 + +þ +thorn +254 + +ÿ +yuml +255 + +" +quot +34 + +& +amp +38 + +< +lt +60 + +> +gt +62 + +œ +oelig +338 + +œ +oelig +339 + +š +scaron +352 + +š +scaron +353 + +ÿ +yuml +376 + +ˆ +circ +710 + +˜ +tilde +732 + +  +ensp +8194 + +  +emsp +8195 + +  +thinsp +8201 + +– +ndash +8211 + +— +mdash +8212 + +‘ +lsquo +8216 + +’ +rsquo +8217 + +‚ +sbquo +8218 + +“ +ldquo +8220 + +” +rdquo +8221 + +„ +bdquo +8222 + +† +dagger +8224 + +† +dagger +8225 + +‰ +permil +8240 + +‹ +lsaquo +8249 + +› +rsaquo +8250 + +€ +euro +8364 + +ƒ +fnof +402 + +α +alpha +913 + +β +beta +914 + +γ +gamma +915 + +δ +delta +916 + +ε +epsilon +917 + +ζ +zeta +918 + +η +eta +919 + +θ +theta +920 + +ι +iota +921 + +κ +kappa +922 + +λ +lambda +923 + +μ +mu +924 + +ν +nu +925 + +ξ +xi +926 + +ο +omicron +927 + +π +pi +928 + +ρ +rho +929 + +σ +sigma +931 + +τ +tau +932 + +υ +upsilon +933 + +φ +phi +934 + +χ +chi +935 + +ψ +psi +936 + +ω +omega +937 + +α +alpha +945 + +β +beta +946 + +γ +gamma +947 + +δ +delta +948 + +ε +epsilon +949 + +ζ +zeta +950 + +η +eta +951 + +θ +theta +952 + +ι +iota +953 + +κ +kappa +954 + +λ +lambda +955 + +μ +mu +956 + +ν +nu +957 + +ξ +xi +958 + +ο +omicron +959 + +π +pi +960 + +ρ +rho +961 + +ς +sigmaf +962 + +σ +sigma +963 + +τ +tau +964 + +υ +upsilon +965 + +φ +phi +966 + +χ +chi +967 + +ψ +psi +968 + +ω +omega +969 + +• +bull +8226 + +… +hellip +8230 + +′ +prime +8242 + +′ +prime +8243 + +‾ +oline +8254 + +⁄ +frasl +8260 + +← +larr +8592 + +↑ +uarr +8593 + +→ +rarr +8594 + +↓ +darr +8595 + +↔ +harr +8596 + +← +larr +8656 + +↑ +uarr +8657 + +→ +rarr +8658 + +↓ +darr +8659 + +↔ +harr +8660 + +∂ +part +8706 + +∏ +prod +8719 + +∑ +sum +8721 + +− +minus +8722 + +√ +radic +8730 + +∞ +infin +8734 + +∩ +cap +8745 + +∫ +int +8747 + +≈ +asymp +8776 + +≠ +ne +8800 + +≡ +equiv +8801 + +≤ +le +8804 + +≥ +ge +8805 + +◊ +loz +9674 + +♠ +spades +9824 + +♣ +clubs +9827 + +♥ +hearts +9829 + +♦ +diams +9830 + +⇔ +8660 +hArr + +⇒ +8658 +rArr + +⇐ +8656 +lArr + + + diff --git a/lib/plugins/ckgedit/action/entities/utils/entities.conf b/lib/plugins/ckgedit/action/entities/utils/entities.conf new file mode 100644 index 0000000..08a97de --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/utils/entities.conf @@ -0,0 +1,27 @@ +# Typography replacements +# +# Order does matter! +# +# You can use HTML entities here, but it is not recommended because it may break +# non-HTML renderers. Use UTF-8 chars directly instead. +# This adds four entities that are needed by the ckgeditor. Before substituting this file for +# Dokuwiki's make sure all of the entities in Dokuwiki's entities.conf are listed here. +<-> ↔ +<- ← +<=> ⇔ +<= ⇐ +<-> ↔ +-> → +<- ← +<=> ⇔ +=> ⇒ +<= ⇐ +>> » +<< « +--- — +-- – +(c) © +(tm) ™ +(r) ® +... … + diff --git a/lib/plugins/ckgedit/action/entities/utils/entities.html b/lib/plugins/ckgedit/action/entities/utils/entities.html new file mode 100644 index 0000000..8d0d588 --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/utils/entities.html @@ -0,0 +1,52 @@ + + + + + + + + + +
    + + + + diff --git a/lib/plugins/ckgedit/action/entities/utils/entities.pl b/lib/plugins/ckgedit/action/entities/utils/entities.pl new file mode 100644 index 0000000..c583051 --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/utils/entities.pl @@ -0,0 +1,711 @@ +use strict; + +my $count = 0; +my $skip = 0; + +while() { + next if /^\s+/; + + if ($skip) { + $skip=0; + next; + } + + $count++ if /^&#/; + $count++ if /^&\w/; + # print "$count: "; + print; + if($count == 2) { + $count = 0; + print "\n"; + $skip = 1; + } + + +} +# print $count, "\n"; + +__DATA__ +" +" +" +quotation mark + +' +' +' +apostrophe  + +& +& +& +ampersand + +< +< +< +less-than + +> +> +> +greater-than + +¡ +¡ +¡ +inverted exclamation mark + +¢ +¢ +¢ +cent + +£ +£ +£ +pound + +¤ +¤ +¤ +currency + +¥ +¥ +¥ +yen + +¦ +¦ +¦ +broken vertical bar + +§ +§ +§ +section + +¨ +¨ +¨ +spacing diaeresis + +© +© +© +copyright + +ª +ª +ª +feminine ordinal indicator + +« +« +« +angle quotation mark (left) + +¬ +¬ +¬ +negation +­ +­ +­ +soft hyphen + +® +® +® +registered trademark + +¯ +¯ +¯ +spacing macron + +° +° +° +degree + +± +± +± +plus-or-minus  + +² +² +² +superscript 2 + +³ +³ +³ +superscript 3 + +´ +´ +´ +spacing acute + +µ +µ +µ +micro + +¶ +¶ +¶ +paragraph + +· +· +· +middle dot + +¸ +¸ +¸ +spacing cedilla + +¹ +¹ +¹ +superscript 1 + +º +º +º +masculine ordinal indicator + +» +» +» +angle quotation mark (right) + +¼ +¼ +¼ +fraction 1/4 + +½ +½ +½ +fraction 1/2 + +¾ +¾ +¾ +fraction 3/4 + +¿ +¿ +¿ +inverted question mark + +× +× +× +multiplication + +÷ +÷ +÷ +division + +∀ +∀ +for all + +∂ +∂ +∂ +part + +∏ +∏ +∏ +prod + +∑ +∑ +∑ +sum + +− +− +− +minus + +∞ +∞ +∞ +infinity + +∩ +∩ +∩ +cap + +∫ +∫ +∫ +integral + +≈ +≈ +≈ +almost equal + +≠ +≠ +≠ +not equal +≡ +≡ +≡ +equivalent +≤ +≤ +≤ +less or equal +≥ +≥ +≥ +greater or equal + + +Α +Α +Α +Alpha + +Β +Β +Β +Beta + +Γ +Γ +Γ +Gamma + +Δ +Δ +Δ +Delta + +Ε +Ε +Ε +Epsilon + +Ζ +Ζ +Ζ +Zeta + +Η +Η +Η +Eta + +Θ +Θ +Θ +Theta + +Ι +Ι +Ι +Iota + +Κ +Κ +Κ +Kappa + +Λ +Λ +Λ +Lambda + +Μ +Μ +Μ +Mu + +Ν +Ν +Ν +Nu + +Ξ +Ξ +Ξ +Xi + +Ο +Ο +Ο +Omicron + +Π +Π +Π +Pi + +Ρ +Ρ +Ρ +Rho + +Σ +Σ +Σ +Sigma + +Τ +Τ +Τ +Tau + +Υ +Υ +Υ +Upsilon + +Φ +Φ +Φ +Phi + +Χ +Χ +Χ +Chi + +Ψ +Ψ +Ψ +Psi + +Ω +Ω +Ω +Omega +  +α +α +α +alpha + +β +β +β +beta + +γ +γ +γ +gamma + +δ +δ +δ +delta + +ε +ε +ε +epsilon + +ζ +ζ +ζ +zeta + +η +η +η +eta + +θ +θ +θ +theta + +ι +ι +ι +iota + +κ +κ +κ +kappa + +λ +λ +λ +lambda + +μ +μ +μ +mu +ν +ν +ν +nu +ξ +ξ +ξ +xi +ο +ο +ο +omicron +π +π +π +pi +ρ +ρ +ρ +rho +ς +ς +ς +sigmaf +σ +σ +σ +sigma +τ +τ +τ +tau +υ +υ +υ +upsilon +φ +φ +φ +phi +χ +χ +χ +chi +ψ +ψ +ψ +psi +ω +ω +ω +omega + +Œ +Œ +Œ +capital ligature OE +œ +œ +œ +small ligature oe +Š +Š +Š +capital S with caron +š +š +š +small S with caron +Ÿ +Ÿ +Ÿ +capital Y with diaeres +ƒ +ƒ +ƒ +f with hook +ˆ +ˆ +ˆ +modifier letter circumflex accent +˜ +˜ +˜ +small tilde +‌ +‌ +‌ +zero width non-joiner +‍ +‍ +‍ +zero width joiner +‎ +‎ +‎ +left-to-right mark +‏ +‏ +‏ +right-to-left mark + +– +– +– +en dash + +— +— +— +em dash + +‘ +‘ +‘ +left single quotation mark + +’ +’ +’ +right single quotation mark + +‚ +‚ +‚ +single low-9 quotation mark + +“ +“ +“ +left double quotation mark + +” +” +” +right double quotation mark + +„ +„ +„ +double low-9 quotation mark + +† +† +† +dagger + +‡ +‡ +‡ +double dagger + +• +• +• +bullet + +… +… +… +horizontal ellipsis + +‰ +‰ +‰ +per mille  + +′ +′ +′ +minutes + +″ +″ +″ +seconds + +‹ +‹ +‹ +single left angle quotation + +› +› +› +single right angle quotation + +‾ +‾ +‾ +overline + +€ +€ +€ +euro + +™ +™ +™ +trademark + +← +← +← +left arrow + +↑ +↑ +↑ +up arrow + +→ +→ +→ +right arrow + +↓ +↓ +↓ +down arrow + +↔ +↔ +↔ +left right arrow + +◊ +◊ +◊ +lozenge + +♠ +♠ +♠ +spade + +♣ +♣ +♣ +club + +♥ +♥ +♥ +heart + +♦ +♦ +♦ +diamond + + diff --git a/lib/plugins/ckgedit/action/entities/utils/entities.txt b/lib/plugins/ckgedit/action/entities/utils/entities.txt new file mode 100644 index 0000000..0d5cb67 --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/utils/entities.txt @@ -0,0 +1,718 @@ +" +" +" +quotation mark + +' +' +' (does not work in IE) +apostrophe  + +& +& +& +ampersand + +< +< +< +less-than + +> +> +> +greater-than +Note: Entity names are case sensitive! + +¡ +¡ +¡ +inverted exclamation mark + +¢ +¢ +¢ +cent + +£ +£ +£ +pound + +¤ +¤ +¤ +currency + +¥ +¥ +¥ +yen + +¦ +¦ +¦ +broken vertical bar + +§ +§ +§ +section + +¨ +¨ +¨ +spacing diaeresis + +© +© +© +copyright + +ª +ª +ª +feminine ordinal indicator + +« +« +« +angle quotation mark (left) + +¬ +¬ +¬ +negation +­ +­ +­ +soft hyphen + +® +® +® +registered trademark + +¯ +¯ +¯ +spacing macron + +° +° +° +degree + +± +± +± +plus-or-minus  + +² +² +² +superscript 2 + +³ +³ +³ +superscript 3 + +´ +´ +´ +spacing acute + +µ +µ +µ +micro + +¶ +¶ +¶ +paragraph + +· +· +· +middle dot + +¸ +¸ +¸ +spacing cedilla + +¹ +¹ +¹ +superscript 1 + +º +º +º +masculine ordinal indicator + +» +» +» +angle quotation mark (right) + +¼ +¼ +¼ +fraction 1/4 + +½ +½ +½ +fraction 1/2 + +¾ +¾ +¾ +fraction 3/4 + +¿ +¿ +¿ +inverted question mark + +× +× +× +multiplication + +÷ +÷ +÷ +division + +∀ +∀ +for all + +∂ +∂ +∂ +part + +∏ +∏ +∏ +prod + +∑ +∑ +∑ +sum + +− +− +− +minus + +∞ +∞ +∞ +infinity + +∩ +∩ +∩ +cap + +∫ +∫ +∫ +integral + +≈ +≈ +≈ +almost equal +≠ +≠ +≠ +not equal +≡ +≡ +≡ +equivalent +≤ +≤ +≤ +less or equal +≥ +≥ +≥ +greater or equal + + +Α +Α +Α +Alpha + +Β +Β +Β +Beta + +Γ +Γ +Γ +Gamma + +Δ +Δ +Δ +Delta + +Ε +Ε +Ε +Epsilon + +Ζ +Ζ +Ζ +Zeta + +Η +Η +Η +Eta + +Θ +Θ +Θ +Theta + +Ι +Ι +Ι +Iota + +Κ +Κ +Κ +Kappa + +Λ +Λ +Λ +Lambda + +Μ +Μ +Μ +Mu + +Ν +Ν +Ν +Nu + +Ξ +Ξ +Ξ +Xi + +Ο +Ο +Ο +Omicron + +Π +Π +Π +Pi + +Ρ +Ρ +Ρ +Rho + +Σ +Σ +Σ +Sigma + +Τ +Τ +Τ +Tau + +Υ +Υ +Υ +Upsilon + +Φ +Φ +Φ +Phi + +Χ +Χ +Χ +Chi + +Ψ +Ψ +Ψ +Psi + +Ω +Ω +Ω +Omega +  +α +α +α +alpha + +β +β +β +beta + +γ +γ +γ +gamma + +δ +δ +δ +delta + +ε +ε +ε +epsilon + +ζ +ζ +ζ +zeta + +η +η +η +eta + +θ +θ +θ +theta + +ι +ι +ι +iota + +κ +κ +κ +kappa + +λ +λ +λ +lambda + +μ +μ +μ +mu +ν +ν +ν +nu +ξ +ξ +ξ +xi +ο +ο +ο +omicron +π +π +π +pi +ρ +ρ +ρ +rho +ς +ς +ς +sigmaf +σ +σ +σ +sigma +τ +τ +τ +tau +υ +υ +υ +upsilon +φ +φ +φ +phi +χ +χ +χ +chi +ψ +ψ +ψ +psi +ω +ω +ω +omega +  +  +  +  +ϑ +ϑ +ϑ +theta symbol +ϒ +ϒ +ϒ +upsilon symbol +ϖ +ϖ +ϖ +pi symbol +Other Entities Supported by HTML +Character +Entity Number +Entity Name +Description +Œ +Œ +Œ +capital ligature OE +œ +œ +œ +small ligature oe +Š +Š +Š +capital S with caron +š +š +š +small S with caron +Ÿ +Ÿ +Ÿ +capital Y with diaeres +ƒ +ƒ +ƒ +f with hook +ˆ +ˆ +ˆ +modifier letter circumflex accent +˜ +˜ +˜ +small tilde +‌ +‌ +‌ +zero width non-joiner +‍ +‍ +‍ +zero width joiner +‎ +‎ +‎ +left-to-right mark +‏ +‏ +‏ +right-to-left mark + +– +– +– +en dash + +— +— +— +em dash + +‘ +‘ +‘ +left single quotation mark + +’ +’ +’ +right single quotation mark + +‚ +‚ +‚ +single low-9 quotation mark + +“ +“ +“ +left double quotation mark + +” +” +” +right double quotation mark + +„ +„ +„ +double low-9 quotation mark + +† +† +† +dagger + +‡ +‡ +‡ +double dagger + +• +• +• +bullet + +… +… +… +horizontal ellipsis + +‰ +‰ +‰ +per mille  + +′ +′ +′ +minutes + +″ +″ +″ +seconds + +‹ +‹ +‹ +single left angle quotation + +› +› +› +single right angle quotation + +‾ +‾ +‾ +overline + +€ +€ +€ +euro + +™ +™ +™ +trademark + +← +← +← +left arrow + +↑ +↑ +↑ +up arrow + +→ +→ +→ +right arrow + +↓ +↓ +↓ +down arrow + +↔ +↔ +↔ +left right arrow + +◊ +◊ +◊ +lozenge + +♠ +♠ +♠ +spade + +♣ +♣ +♣ +club + +♥ +♥ +♥ +heart + +♦ +♦ +♦ +diamond + +⇔ +⇔ +⇔ + +⇒ +⇒ +⇒ + +⇐ +⇐ +⇐ + +← +&8592; +← + diff --git a/lib/plugins/ckgedit/action/entities/utils/fcked-ents.pl b/lib/plugins/ckgedit/action/entities/utils/fcked-ents.pl new file mode 100644 index 0000000..df297bc --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/utils/fcked-ents.pl @@ -0,0 +1,231 @@ +use strict; + + + +while() { + chomp; + my($icon, $num, $character) = split; + next if !$icon || !$num || ! $character; +# $icon = trim($icon); +# $num = trim($num); +# $character=trim($character); + print "$icon\n$num\n$character\n\n"; +} + +sub trim { + my $str = shift; + $str =~ s/^\s+//; + $str =~ s/\s+$//; + return $str; +} + +__DATA__ + nbsp 160 +¡ iexcl 161 +¢ cent 162 +£ pound 163 +¤ curren 164 +¥ yen 165 +¦ brvbar 166 +§ sect 167 +¨ uml 168 +© copy 169 +ª ordf 170 +« laquo 171 +¬ not 172 +­ shy 173 +® reg 174 +¯ macr 175 +° deg 176 +± plusmn 177 +² sup2 178 +³ sup3 179 +´ acute 180 +µ micro 181 +¶ para 182 +· middot 183 +¸ cedil 184 +¹ sup1 185 +º ordm 186 +» raquo 187 +¼ frac14 188 +½ frac12 189 +¾ frac34 190 +¿ iquest 191 +à agrave 192 +á aacute 193 +â acirc 194 +ã atilde 195 +Ä Auml 196 +å aring 197 +æ aelig 198 +ç ccedil 199 +è egrave 200 +é eacute 201 +ê ecirc 202 +ë euml 203 +ì igrave 204 +í iacute 205 +î icirc 206 +ï iuml 207 +ð eth 208 +ñ ntilde 209 +ò ograve 210 +ó oacute 211 +ô ocirc 212 +õ otilde 213 +Ö Ouml 214 +× times 215 +ø oslash 216 +ù ugrave 217 +ú uacute 218 +û ucirc 219 +Ü Uuml 220 +ý yacute 221 +þ thorn 222 +ß szlig 223 +à agrave 224 +á aacute 225 +â acirc 226 +ã atilde 227 +ä auml 228 +å aring 229 +æ aelig 230 +ç ccedil 231 +è egrave 232 +é eacute 233 +ê ecirc 234 +ë euml 235 +ì igrave 236 +í iacute 237 +î icirc 238 +ï iuml 239 +ð eth 240 +ñ ntilde 241 +ò ograve 242 +ó oacute 243 +ô ocirc 244 +õ otilde 245 +ö ouml 246 +÷ divide 247 +ø oslash 248 +ù ugrave 249 +ú uacute 250 +û ucirc 251 +ü uuml 252 +ý yacute 253 +þ thorn 254 +ÿ yuml 255 +" quot 34 +& amp 38 +< lt 60 +> gt 62 +œ oelig 338 +œ oelig 339 +š scaron 352 +š scaron 353 +ÿ yuml 376 +ˆ circ 710 +˜ tilde 732 +  ensp 8194 +  emsp 8195 +  thinsp 8201 +– ndash 8211 +— mdash 8212 +‘ lsquo 8216 +’ rsquo 8217 +‚ sbquo 8218 +“ ldquo 8220 +” rdquo 8221 +„ bdquo 8222 +† dagger 8224 +† dagger 8225 +‰ permil 8240 +‹ lsaquo 8249 +› rsaquo 8250 +€ euro 8364 +ƒ fnof 402 +α alpha 913 +β beta 914 +γ gamma 915 +δ delta 916 +ε epsilon 917 +ζ zeta 918 +η eta 919 +θ theta 920 +ι iota 921 +κ kappa 922 +λ lambda 923 +μ mu 924 +ν nu 925 +ξ xi 926 +ο omicron 927 +π pi 928 +ρ rho 929 +σ sigma 931 +τ tau 932 +υ upsilon 933 +φ phi 934 +χ chi 935 +ψ psi 936 +ω omega 937 +α alpha 945 +β beta 946 +γ gamma 947 +δ delta 948 +ε epsilon 949 +ζ zeta 950 +η eta 951 +θ theta 952 +ι iota 953 +κ kappa 954 +λ lambda 955 +μ mu 956 +ν nu 957 +ξ xi 958 +ο omicron 959 +π pi 960 +ρ rho 961 +ς sigmaf 962 +σ sigma 963 +τ tau 964 +υ upsilon 965 +φ phi 966 +χ chi 967 +ψ psi 968 +ω omega 969 +• bull 8226 +… hellip 8230 +′ prime 8242 +′ prime 8243 +‾ oline 8254 +⁄ frasl 8260 +← larr 8592 +↑ uarr 8593 +→ rarr 8594 +↓ darr 8595 +↔ harr 8596 +← larr 8656 +↑ uarr 8657 +→ rarr 8658 +↓ darr 8659 +↔ harr 8660 +∂ part 8706 +∏ prod 8719 +∑ sum 8721 +− minus 8722 +√ radic 8730 +∞ infin 8734 +∩ cap 8745 +∫ int 8747 +≈ asymp 8776 +≠ ne 8800 +≡ equiv 8801 +≤ le 8804 +≥ ge 8805 +◊ loz 9674 +♠ spades 9824 +♣ clubs 9827 +♥ hearts 9829 +♦ diams 9830 + diff --git a/lib/plugins/ckgedit/action/entities/utils/fcked-ents.txt b/lib/plugins/ckgedit/action/entities/utils/fcked-ents.txt new file mode 100644 index 0000000..61c1c69 --- /dev/null +++ b/lib/plugins/ckgedit/action/entities/utils/fcked-ents.txt @@ -0,0 +1,209 @@ + nbsp 160 +¡ iexcl 161 +¢ cent 162 +£ pound 163 +¤ curren 164 +¥ yen 165 +¦ brvbar 166 +§ sect 167 +¨ uml 168 +© copy 169 +ª ordf 170 +« laquo 171 +¬ not 172 +­ shy 173 +® reg 174 +¯ macr 175 +° deg 176 +± plusmn 177 +² sup2 178 +³ sup3 179 +´ acute 180 +µ micro 181 +¶ para 182 +· middot 183 +¸ cedil 184 +¹ sup1 185 +º ordm 186 +» raquo 187 +¼ frac14 188 +½ frac12 189 +¾ frac34 190 +¿ iquest 191 +à agrave 192 +á aacute 193 +â acirc 194 +ã atilde 195 +Ä Auml 196 +å aring 197 +æ aelig 198 +ç ccedil 199 +è egrave 200 +é eacute 201 +ê ecirc 202 +ë euml 203 +ì igrave 204 +í iacute 205 +î icirc 206 +ï iuml 207 +ð eth 208 +ñ ntilde 209 +ò ograve 210 +ó oacute 211 +ô ocirc 212 +õ otilde 213 +Ö Ouml 214 +× times 215 +ø oslash 216 +ù ugrave 217 +ú uacute 218 +û ucirc 219 +Ü Uuml 220 +ý yacute 221 +þ thorn 222 +ß szlig 223 +à agrave 224 +á aacute 225 +â acirc 226 +ã atilde 227 +ä auml 228 +å aring 229 +æ aelig 230 +ç ccedil 231 +è egrave 232 +é eacute 233 +ê ecirc 234 +ë euml 235 +ì igrave 236 +í iacute 237 +î icirc 238 +ï iuml 239 +ð eth 240 +ñ ntilde 241 +ò ograve 242 +ó oacute 243 +ô ocirc 244 +õ otilde 245 +ö ouml 246 +÷ divide 247 +ø oslash 248 +ù ugrave 249 +ú uacute 250 +û ucirc 251 +ü uuml 252 +ý yacute 253 +þ thorn 254 +ÿ yuml 255 +" quot 34 +& amp 38 +< lt 60 +> gt 62 +œ oelig 338 +œ oelig 339 +š scaron 352 +š scaron 353 +ÿ yuml 376 +ˆ circ 710 +˜ tilde 732 +  ensp 8194 +  emsp 8195 +  thinsp 8201 +– ndash 8211 +— mdash 8212 +‘ lsquo 8216 +’ rsquo 8217 +‚ sbquo 8218 +“ ldquo 8220 +” rdquo 8221 +„ bdquo 8222 +† dagger 8224 +† dagger 8225 +‰ permil 8240 +‹ lsaquo 8249 +› rsaquo 8250 +€ euro 8364 +ƒ fnof 402 +α alpha 913 +β beta 914 +γ gamma 915 +δ delta 916 +ε epsilon 917 +ζ zeta 918 +η eta 919 +θ theta 920 +ι iota 921 +κ kappa 922 +λ lambda 923 +μ mu 924 +ν nu 925 +ξ xi 926 +ο omicron 927 +π pi 928 +ρ rho 929 +σ sigma 931 +τ tau 932 +υ upsilon 933 +φ phi 934 +χ chi 935 +ψ psi 936 +ω omega 937 +α alpha 945 +β beta 946 +γ gamma 947 +δ delta 948 +ε epsilon 949 +ζ zeta 950 +η eta 951 +θ theta 952 +ι iota 953 +κ kappa 954 +λ lambda 955 +μ mu 956 +ν nu 957 +ξ xi 958 +ο omicron 959 +π pi 960 +ρ rho 961 +ς sigmaf 962 +σ sigma 963 +τ tau 964 +υ upsilon 965 +φ phi 966 +χ chi 967 +ψ psi 968 +ω omega 969 +• bull 8226 +… hellip 8230 +′ prime 8242 +′ prime 8243 +‾ oline 8254 +⁄ frasl 8260 +← larr 8592 +↑ uarr 8593 +→ rarr 8594 +↓ darr 8595 +↔ harr 8596 +← larr 8656 +↑ uarr 8657 +→ rarr 8658 +↓ darr 8659 +↔ harr 8660 +∂ part 8706 +∏ prod 8719 +∑ sum 8721 +− minus 8722 +√ radic 8730 +∞ infin 8734 +∩ cap 8745 +∫ int 8747 +≈ asymp 8776 +≠ ne 8800 +≡ equiv 8801 +≤ le 8804 +≥ ge 8805 +◊ loz 9674 +♠ spades 9824 +♣ clubs 9827 +♥ hearts 9829 +♦ diams 9830 + diff --git a/lib/plugins/ckgedit/action/entities/utils/fckeditor_ents.doc b/lib/plugins/ckgedit/action/entities/utils/fckeditor_ents.doc new file mode 100644 index 0000000000000000000000000000000000000000..1fcc34bc9f5545c9e3a0daeb09d5e2f58401794e GIT binary patch literal 92672 zcmeI*3!F~X{`m1dV|a!%E=iK3Nem&4xfw!}TL{T5Ic_s%#>_Og=Hk{=NRk|hNOFXv zneJ|_n;m~&09~Ng> ztBK!C4annspYviZOU{@Ap5;-N=Z36zc`M5bXT#XmmL=tz%k~o_1LNVmey4m!@-LQK z@|8#GrQT;JKj+!Z*9l)q{m8-KY-c{pdJ95*?c;1`<}3B1KAe2ixUwue`8)YZJ`35< z%&$`M(dm@Kc`nO7er_EnKWG2zc->W5vHE+n>(}V8CCE9RoM)#z&UQ|o63%RFSvOFx zkwnVzCl6=6$2bn;;cV}OopdLD9qSYzlH<7_&(7;}dk(h#!CFBJJ=sb5xt^ABk)DMf z&mvEH%9s(E1Y1gQv1dd|b^)O%2|eS<%_+=ICKxTjC7uz5d3h<>gkvQ9tY@qph?T%n zPg35fq{KWD<0Sl?CqHF`FwCwDBN))IQrlarU6>S@`^F3(Gz z%*4A3a|qhyS?0;kA(K{iajy2{r?FWpyD-Z=c_||a*d=+zla)AvUAMA}vci*WC)wqA z)svf9n4d+VTiGR9>B%q5jUr?hxd_( zIOmpjv5tCjigRvh7wecO$D4CYyIBA6

    k-(k|Ez&u#XeXcCUkzk3SOvr_UsQ7!FK zo$%!3XC~&e@0ND4PI?NRec1&&T^0GZqQFg(;@Z^t^+K-B|%T?0QQBiiuN*X#U$}XDI&{0u#$x0eJD#|X|eovxz z*LJy_hK`D|%jGn5RJ2{Nl7^0owhQKK=xDoSzJ`vri&oOm9H!Kn)6mg&xqJ;BZ5Pbf z(9w3mN*X%aE}7HN(RRU#8#=}=mam~>>|*&EI>s)Ruc2e?VwE&>j9n~WL&w+!JMPJ` zYb3@l*8g~t(?_LqVnoH*#qzauj9o5YOUKwH^R;xWUAU5#jf&&@od@J ziYZC0V5eqjsj(%gl}RnI(#YGleH43cS+Yh|));4vCOw0=c=j8qI*?R>Ac8fkf?`qEmlmbWG@BQ2X(nn;<`innd4l&BWzS*6l_^-+iPOt!t7n$9WN z-nZ{7NzW^l?%RJ|((|n(WBYh=@|Le2>CzHv{!%MW`tL~3E0yl6(fXt(l}h)OKb&-V z^&|P0LQdXVk5X#gZ4F=DN0LXby>*s-+<5bdQA*jGHKdjjwbv2DvE#gsHmo7_q^}XH zO1id)RABAgo=bA{)yqcK$Sv8@S0`^0 zpT{eg_LnVub@DbTQqLnx+9_Ij-J3|2`tX)r?akgHrLa^RMJq?gyR0F{jrVm#D@WXW zq>NBfe6M`7y^WMd$|=XGbCmy;6nX6_mK;^yRNw0^eVoS7qdVK0$7zg`Z|UPSMyb!z z$7u}bkCX4uAE)ZMX&$HQS*ahVu}ZC%K2Bqmqs=@{)hk!&<1|*O_n$jXW0iVRkJDJC zj@08cR;eBJIE_{6<>!ynSmmfwkJC7%r_ztpIHgYBqWyixsq|E>DWR`7E`1!wDaWFI z9IL(G&mYHeO0DR}ahy^w`f(hm)Qo-{$0>DF`Z$hL>g6L|rLTv|XA~k=-qz&oJJvsD z9p}uG>#n5wj>#RQN)Ir~PLXkdbF?-Hm)^RNo=QeFk`kr7mIzX%XOz@*a`3JZt+Y)P zYvj_4q}ykqbEWd-|MTg-Ua&pe=h(StvmfvF>e1PW^i=Yf@q|-C_1LI$jfe3~3j3F< zt+#}7uKG$)gEgdda!vN`LC$nvKTwbKJW}L}Ci|DIeLYMAQVZ<;dq;1QuGU{H>9S=C zrF2>*p4`<@*bLT@D?uLrWDj!8`^xtisf9+WuYP8dDz9GM)^|OfMXFp|)KuRqdz@6c zLaV91SN11T<%;1;movwA4KPbBb>`dJEVZQijz+W8lIlAe%~DIMZ@*@#<=pa(&#VS= zJmlErc8=Lrr2Fb5m^I{joJYG!ZA+@J+!aVov9F`~O1iJ)747saawy@O zxhL5z>P=V2x1pq`+kKMEAY|_?mA0;IZ!Mz<8M8a-zSh3PPM7PPcS~PeRwG5uvmDyn zN%fVg2C4ZRMcxs)9R0o#YfaK*bRc7j{NioZamp2>XOiz|UX`y-)bT@I){x^QnOtOk zBV|+jfZvhsEt~iJlT_bps!yuyJym(l>UBSy^hDA}mgMYft;WS^&TEcQ@@+zz90%U= z#3)C=b)?8V&MA$0)o*I2Nl)o)=i6H|(xjx$aid=IV@UJ%!O~aA(I&N^o)K+XL#{rWl&h}nq%<8;KsUxQk?ne zeSOE?doug*wtQ=?4nwb%IvhdHGKZI%lre^{?3GEEdB2|SD}5Dv`&72gDLG!{>g;R9 zOY9sMaHP@O~ zrp`u2u*L|x=983kUw@fGx{MIK{jDzt-|J6h4e2>#*5{cnDq}0vW8l`K56?sz+mx6xAc4C2d~fwH-GF`Lh`Gz_|;VNkbJ`N&Z4 zoN89+j=@&Qrn6gvPK6w+bo!d{AyK8aDs!BC2FQ5SI?j$Rj|-~1qdF<_*|`!|m5!=c zI_h_&qoQ|IvVy8rsAk1D3yH@o@F^1e#d%*@WtzHS5UoDo_UpG3Cw==2^;~{PtuOb0_DQxG3Cc$9+h{3z1~I=r z17!<)@fXgJ|LWes3Nx?KiL`49)a!H(Ve?vDMBGWWDyJqWA+3?z19}E($L_w3mZE2% z9t_%QT0kkLz4$Y|;(v9UtH-+)Cha&L>bPqvVRP&?mpF6$brCPp6V!u2+mCxdA10`M zleUf7{@lFtW$WXKwT% zZEMbt_7Jxh>Ky4?!p=O&z4^2hy)DaqVwd-53beo4{_1@9ByDTXc|FWi&3W(T#L3*Z z{KGf(V9-W+?g8yuKI1$xFxy|f9{Sr@zzQ?(VKk&&&HEV9#F_UpZYEA2eW@2*t&!XV z7dQj;U~u25+5Z04=IZfog-JV__oZ$pu0QU;Kn%igBqJ3gk&bip@(D^UYpb~j^vi^L zG`Vl1rRW)`2ZOenQZnzNUyuLfKBU>!W;^GxP5}xr8sjk$58y#OipMY$kK<`9!eT7J zD|i(vu?idTCf>p({0$%BV{FG4_!9fDAK&8#9KkW1f!x>%LIs4OI%?oD)I)t-jcd>h z*P{g@(FSeN4mY7YdY~t6!ypXC5DY^GGLeNGjKw`D!hLuM4`V8(;R!s6d6{(@G1J@l@2d(E@q~ zXx%`?Rgu7w;y{?2rFVob<`%AOEWdgZq$QOVI{)=Tic+{po;9-V*V*v7i+u?WkT` zPZ2h+uT`ib^BP-+xC=adR}TiQmE8k+3DhB<`!;6#`&*l<$Ga6K?N|@$c&RaAbIcS+ zoH=efM<-qGD|WdvP>&|9pl18~_x)cP|8_xlsAJ#(gw1hqDsdTb#==^)YJm%T#h&2W zmfB9WfL;RiXbQBydjHRv(-hLK=Dg+s;>@|tEaIH`jaK3A0lg{IPTGANEk)0uyaz*| z{nhqY=c&)ow&q-QC2{6_bt7?`a6Y3i?Ydn44-lwFlQv9r518%G3-ROepWJ_twtN@w z;jj1zpI|$7;7fdk{rDO`;3$saID$Ofhd~G`p*m{fGF*;u@KpngkLz1}DBo&0QBOu$r3!yoV{=3zemh^O%aUcxdg#~Q4~ z>sXJ?*n;=56+5vDyYU(Rg>P{H2k}2RiBmX@ilLU}K`5%A7HZ=PT#0MZ2oY$4i+S%y z@;=x7AG7VZ(w=7fe@2{n3>+d(AAPIu%V}r1dqB@X?bzM7(NfMQ1M~d%@A1F1qj^66 zM4Wj}SLL`i&+ChLkuLwoMAf57E2!E2{yqMe{<$8^KDsG!W;L)8K+N{%V&})>e`!Z`Z2T-? zb9}stICG4=i8y`qrFPO5s|FwcMg9{-!?ZV~Njp1;$it)ZU7PZ8FK?`p@cwX%EQ0%xFJ<=uB`wm&DJ`K@Tb z`9zo%ChchU$1f0P_Q|V>GyCOpT%^lA-sC9gg4_PN2#q+#f`B)ItQBqB$bb0bS4)J&=S{q#+X% zF&R@Z4U4f9&tnTksQq6Vz9GuU-22OZ#lQE*5BwGX(RCm zP{+IRggc-MoH6e}mXnYQt-{>{?oHvojh3Qkkf1c6wwilD%Rt%OyXe>FzqF$>e;LE_ zL`;S=hndUrVl0I-k6FX=TR5N5mv$-sO)@as-@otwN;|%b&G-O2u@7J48yv(51oNlu zD`Mh9eoN$iRJ= zh)I}&`B;d>Sc*6B7B*oscHwjE#eN*a37ofFQAr@mP*5VCp#3sleV%&v2*o$L0fm1kxS~a*=gu1AY=7>ZT;?N1d<^3NykDa#u zkY%&Izb4LXb4%(OGt?2A`-ojj(S~9(B9)U-Tg^S7XP}NV+_%wElwI13{yqLT&)@pA zt9cH`6K9^sgNV~d-|AIfYb5u8o`Kqy?%QZ7dIsv@sI8_2%=Y*1@xQdA*(VneXZFj} zi8K3V?TUR^t=IC8|J8#*+mCyoj3rRZX)kB{^Y~A$vCqT2&b~{Wd9B?~oOZoct5Rzh zy(!e5L0io|aDg*WCxdFC1MTmOo2=@k$4>Q$GsjPDiF3wK?#-vAT;R4W@6i-!e|7w? zj)jNPw&r+v9C7BD_;KQ7TwMO~pL$+ugEaSmb}gTwUMAeP(NfIz_wVtaIloy+yP9*H z4~aA9IR}Z;M_=lBsWp;&K+ixu7~HqfQuGYURsysA{d@c;?P$(ft1>4w=dBHiGv}`7 z=;afXTGm!`4;)rDu_i<+A@^;xlrm+zr5gJ=u6578Cf(F^@B7{if-RE)xX zn21TxYF`VKu_?4|w1A$0IFzk05IP1~C1tHn8Dp0f>zlk@g`K7FAL-_B?F zu4kZL8MINpd%$de{~rIF{cl^^)$D@@5NGzoxy0$CZ}r618p%EIn`B_NzkiSar5(*{ z>U84F>*`A4%xkNAA6x#f?{!t0N!yQmKIK-nZx}pyTU?2t~4S5&^ zt-{>{dQ&7Q_3yromU3Y;Q12xzx#<~{tpsNK`}g?IY}Y8-H4gD;ivbvf!5EGLjKMhEhnbjzxtNa?ScTPCix2TJ zwqqv_;xLZjII3RGm;yCX8%@yyk%&Q8^gu84K`JtkiCj#=6imf*EXGnik7d||&Dequ zu@7J48yrM%ZNArvP*g<&M4$b15#ZQB(+;9PG9vus{-#}Oyj z-SXf6Rol{i#IB`i;7NnIPoy&IRl6@=Q^W^Q|CL!)vDA2dQ+(9rM8-TK+hmS*^&D;T8f@QjFLgAMZa!; zXWlxacImn6a^lSS>lWgiIjmOU?g70i%6%}X9}{%nsg|OZAkhBm_+PyjaiF&Me#8l$ zPvH!zUcr4C)I~jnqdDU6o7}$DuK(v#0<-=7d;BN&pVam?+gjSW4ca0B{V))NFcbwC zgK@YIGw?X(U>=rX1y*7;-o+MtfNj`^ukj5I;tYc8SXKx^Q5W?Qj)rK91av?b48&jz zMG{6~9Eva=b1)C{u@Eb;3ahae+prxwunPz99S-9dLawA7sDdzrqah;D6m5}!4(NhG z7>eOY#uyagK1{?M%)@*v#A^JO_y5fH?N0rhZJa@z+0K)RJE@*ZQ`L@LJ4xLGdIkwf zcJA9~DS8I+Wy(NV$zJsD@xQdAdCo2-&OC3|5oeye$JMITuCWu;rqEV%59k@FBR2PK zv=lu9*Al3OwwL{S{3m_zPMH1hG2+a=xH|n|T{!)*R{L6@j7_0!qXjN-2I{SaK>MrX zzi`@9uB%ZnudTg^Gq10i#5vbkt;O5}7q~6e>x}zOwG^!cf%aG1e;n=UjFqObY>tRPOW*8W;RyWqMvg|>|r&@)I-&RK0W_kf;3 zVEh+E75+?57pAu7M%r{I_TY2u!*QI#X;^jnt{m#1F6tu&@o0ng=!bzAgrOLPaVWxg z%*A{xz+$Y%TCBrHY{yRQ!sj@QV>pgesCgClBT)zS5QR9zqb>SjAO>M53NQxaP=xcp z*P&e+aYf4-#j#e-+xG7V5zL?9)>8Q}N<;?AlJXfL4N1jpx_% ze`&|MsE?+IK|I=^J-VYG24WC~A`^06mw)`9pfra2h+Rw326pH33na=e?M43{|C{~u zblP<;)INF{VY8p!LflEUDyOQ~Sgn!V19}E(&)~j|mU2EBsD+m0pSddfO^;xONjq-G zPV9nQbH9dp-3{g1XO+mCxd>*WKV|0vt|U&c^PV2-1@6K9U4GKf>h zQ)O+6i`SNAErEH?Yhk}R+kd8~3v3w_1o0Y!!mXAw(t@sDvF(QN6?@xV zvm(^f0N2h~Sg|1*t?+|-@avb@pH88ZmHe}H&^+i%>zfMSa2M&^k7`!P;k_O{;}KHj za44$=h43GLKX!z5$>As#@3(^Z7jm;4a24MSSMKM>AI4=Rkl*?SJi+W%iazYLk-k{+^g2CF`kc{!)1x+vV*xoad#<6Z2)@jMVTw>+b_|_Ors^ptSN*gQ5 zZoy>MX+XU-*6OV?+j;-_md@P*P8&LP;v5f7KIZeebCdQQY~4Vcb~4&jjxRGWCw%Ta z&t2zo6qdi%BTH)i!qw?8j)03@tCcysomzC3{%_Q@S77l0ORGc zapT6b#Gkd!+D|;Q#N(c;U)@A}QnyYw_p9?s=jqpkZHx@Uhc(3G)1o_hCM)2-HBJ1_Cwk|8Wh};*U91;mV!Pvu~o$C#e#CI2&xmTUD(}#@t+H?scq=-RoGx zx(0U$o#s?{ksuCF)WirADw|cXjhmrRGxy%Q{ ztuDp$NHZ__dt?=PYeM4XA}{wELc-5-8)4zNC%r2Z3N8srT7{C3MJS{sBxw~(LXuXg zBqV8`l8~f@`aySvi}dZ|F2;GA7cMs z(f+@Z{XaK12 zTtS&TBNtC$0}kOzUdJuSg}kQq_!9M~uMDg~bzWyGrYV(^` z@;hhpTUYXXH}ab&^1B!E+XwRfcli#qd=FN>3n|}+lkddH_afx8@!@>-Q9dIppOdUj z{mbX2c#llpJC*m(3BD3%a5k zx}yhrq8DyMZ`_VP=!YU&sKEamj`sN>buX`3UZa$0IL6=}%)%2`gr(Smt@t~3;|NZm zZ4h;Z?&ys{7>3cf2M=N@Hem}s#wXa0UD$`Oupb9-1V?cUCn5bvFe;!jYM>@A!xgw1 z;kX77h(s)ILTB8D{uqW7SMASb!1AK~I*pF{<6em%k67_=1a0S|<1A5|i3`P>9-@hA0xF1vT2h7D& zSc;dh8gk8g7w=;ScH?XO8^`e@DsfU?g4(zWUC|47Vi+=zi>a87Blr()#5rdo15xvj{Ly(9}*Th zo9p6Lh(J@sq76FZ7Tk{qF$1&l3RYnQ-a^Qw^pCg}5lBF1^hO_yLlK_Ab65%a+wX7U z9c;s=*o&|61O5Yx>v9OHp%$)2L)?H^B%lj!M}Oo%uIH~n{@(0Hco@+H1nS_w^B9m> z3BRSlXlg8@8F`m1oY7Mu%h`;C@)(tMWVAMz(U|_uqP(Y>$U4b9_hroj{-qNh$#`fm z%Q=jLWP8~%g}A%yxLm@ijI{1z1m`TJkcYfODR--fv97#Nm(NJjd!L`e*|R@7QA%l_ z(98$DBdIHRW{_1fY7J+(5w1fsG)D`_2vi+)%IK>Tx}rO7MNh~GvOn&Cj2dNhmWULL zL>e+6qdyt-IU_z9y%k|RCgK4+h^d&48F&mbx|@snSb(Ro2+!dqyo}{ofmK+8wRj!t z@h0BEd)SOE_z)jsJ3fVs6!%~+_Tel16W`(xzQ1qC{^BC?~Gf}72R<=`r{4^gp6K?BN?d}iF9Nm4+SWM zjBblC9ux5ZWTg8D9>rsriO2C2p2i|9#uB`QSMVxUVijJ;2E2*4unF(uZ}@=^ z3w()v*pGkXd;EYSIEGU=1B=s2M$s~Yu7WUBhm53U6kP}PP#;%AM$(PZ4A-LtWKxCvd*9X-$!GTI)1K^Tl77=~12AQM@TQFtN7;vN)1M&u9RAv}z!n1)$+0#8Cl z=kxIlp2G`x5zDX=tFZ<$N|zD(Mr^{ncn^QYR(ym{upK+_8NS3<*bf=aAHokfieosA zpAf_dx&q|Q7#ZbPMRnA~WsnhnJ%pnHu7!;Lo1z6G(Gt;Ujdr*R3Fv@s=!x6V8!}V4 z6GJcz!;yq^WFZH+kQu}n6yZMH51CC&##BthA0RV}Ihcp}_#>Xivv>h7VHsrRu?lOj z7BT}_k4@N&Es$A=%s{qdCw4(*BA?+a{0rYgW+O5aIg0!pZEbFYdsd7zCM#B_S1QNQcbIa#4U$7>%(Qk4cz} zhwv~S#VpLm9LNmrk646fumm!jdkM?20m&|2vaZ> z(=iLPF$XeZosUI$21_8b*JXGWuVEErCc6%A;%&$sPnp$zfRFGAwnJvPd+;T`!hXnX z_aJ`2Q5=KJd`~0DLtP>SG7GMX8n_I#AT#26xCYmvAtG=+q7Z{vv_gAyL}zq?%%X2Y zKMcSfkQw!Gq+le{AhYYcF$!Za7WZI09>hbK0-1e3idmSAIhczDSd1lj7SCZBR$wJw z!=LavHsDRX1-U!C1s`G?KEfy1jW6&e_F+H1#UXr;!;m`w$8id$@e{ZuZ&hS~S{aw1 zD#CCX`MqjEC?r9>pxo#vI603?Gu(idh=Sb3ibq?t$4$5yx8PRvL@&r)t~)UV!!R6j$14q)$VLw2?pGnk z;vN*?K0JUan2JXrcgG&blXwdAu>ec(0$##0EXOMR1+QZr-oPgO74PE%$lbN=_y=}l z4?f2~aR3K#2;bvBIEB;r31<<)owCZf1XU4+TDTHdp&sOpT?CrpdbEJty^BQ~v_(6} zoxD!yhFj4Ca#yb}24WC?54ppagpo)`2IOwv-57;27z?@cHvy9|1rOs9%)o3sfw_=7 zf=^=!mf|_QfaQ1%f5K|Wox=5ych5HA9mrk75AYE_!FI?U#Lut~`|(fw3kUH7j^Y@O z<1~V}2~a`q7@`uYq6RKQEy$h7dbkGHq9Nq2WHUq}3ek`|ls6&)9U$+L%H7JY=!x6V z8+~vG24g6OArUFaKqj(~gF=i$5$=WD^_+}H@CQtX+yR|~r|?HCz(PEW7qJX4L++6N z32U(q>mheb-^ONa!TZ>XkFWzf@el0A=lBZ$#Mk%+2k`@r;uwzO6wV@uyQRU9JF%g- z6xC22HE|{CBOKR2?$kC$bF{z>Xo)!7h<0cXxs%%kx1uL{LGJ4I#Xt^Qx1a}l;Wo$}>;d>ahF~a$BLx}AL>6+8k1-gBdvGr% z;bA<2X_$`3@g$ytyyL$B&*DWa!^?ODf5KXH)7pid0+iOw+)=nu-@ zAI#xi+}VU6K3XMr@Wkdu*+E3w%W^kQ;^Yx5A9b@Iyp3$})+fJ|V!tgXZy8zKqPIV% zSA5%3zI4=E)=03QWeo{)!`Xhevm{)-I9#*%xmNMBd{;u&uT%V7SDxi-RkGv$d{po* z$VUyc?N}*@^YE@EYg1(Ve|?$Hz*x7`o^TPRyfh)oqX&a5z&ti zD9TT&$cG+#@jRO6KI~V16egSWSn>(BDpm{%4)RnAt|)aP5BpVl7p?K~+?NkoW?9~! z6ya@%2z&3BR0;`}hwI*N=7W*x>?xBR8dxFL-Jw(JSckXqp{O)U&#nBU|40ow_K#Fq zmY=iX20dv_sN+!i)C5~ps4idfaUP-eI`*bST~on2tQOQ+EAU*F8VL0)thkB~YfhL@ zGg4pwQ1R)a$Nsty&1iouhNq|pYDhadN2XgoXV2QF5XnItquz)6hkM;qiZ}f&pU!aN zaz>RZf*iPeAAI`A$=lMZzw}tB)vWPr|B$*LLqZLnC4B~DOZl{|oajry2ej-@*2;&8 zHbYJg`P8hOt$QI=dkpgCcU3Zximb!4^jR@HOP`g%v-E5|c$W5+Pp`_Sk%#jvCy|_x z@|~|-o@M|0*{OV=PL{*zK4h6B9^PfitLNCfob2#^g?ZU2dAvX4TZj0P^^2FKckPvv zmz9{=A~~nP%9C`rJY=6OEpHxDrk?2|@^bQXQVYWG$jM6%Z{31QOCa9r^7ggzlpz1j zt+=~dhb=+&a@be(YOpNzCv_vw(y_?1bT0B7cm!%7Py>M)2-HBJ1_Ct@sDVHY1Zp5q z1A!U{)IgvH%3A|&^M9Gw27kKs)A=o~sy^!p=Ksx4F7HHKMI){`6YXz^mwCI)xziwX z^<2n30J)7R_W&kA?i);le53er$UIxVr7Ls#C6M{^GRXbNRggLNI!NAIAZ2pq`ri3{ zraeEF+io&Xmi@@H+!T`Mg;grs`(V-axjs9Wyd>{%t12N`k{Q3`)-SyvGsVtJ)|mlk zJ|51p#Kl9lNPv@%ly_L~Zk>j8?a{5*t$pouDfi99cZE~Vd%3M?=SP}6%eMvXXO^#q z+%wUC7uy>z`w2V(H4vzQKn(Cz4+ftB2n~ zX4f*m4aYTTfNRkZjSzvxXoBm|6wS~a*P{h)KqOis3eku`EaK1#GBvC9|Ld)2I5W(!tXH{LogJ> zFdT_U!U!ZI1*sT`G^8T~cOes5$VLuwaX0utgZ)cs1w0pG6h>nV&hR_g<9NOYMYtFD z;eL#Vq)+7e0ZhV!n2d)o1rK8?9>FyH0n_m)X5cZ*#4J3H*_eYTFc(i^9-hK{{1LLx zr+Hq8MOchyumsOS(x2n`dAxuZ@e-EdWk~u@#a=BAOPmNieq9a72kdhAEx>S&eEChl zJU%@4YaX@v^pLa13T#+Oe#n@|M*DyJRPrwI|K7Bv_2siJudzJ7IJOgKK!JT06i58Z zrz(8++1bB5mt}MN6;}7I*^;w1kuy;K4&3=X!nnH^#D-28%96(fR(hOI4u9mc75qHvg{98O51niDDeKJI{Db8{Mw}aTBZA= z$$8ZO0?Dqp{wtPx<-e{x@$5f@?0!xCFIDy*M9(iDG0mk%PqKSjNi6%LCi|Bo-h*FL z|I(++!@JiM`u_s1Cvq-IFJJaYZH_+YwY%-#Iq#fjHFr671O292gZ{M~MC(_m;yrfF zzPk>`hVgmEPB|kAvr@7P?9XfV>?@yfB+5RSWx0iu-Xh*Q)_SE3P6ChruWR7{0n-B= A5&!@I literal 0 HcmV?d00001 diff --git a/lib/plugins/ckgedit/action/iwiki.php b/lib/plugins/ckgedit/action/iwiki.php new file mode 100644 index 0000000..dc430fe --- /dev/null +++ b/lib/plugins/ckgedit/action/iwiki.php @@ -0,0 +1,45 @@ +register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax_call_unknown'); + + } + + /** + * @param Doku_Event $event event object by reference + * @param mixed $param [the parameters passed as fifth argument to register_hook() when this + * handler was registered] + * @return void + */ + + public function handle_ajax_call_unknown(Doku_Event &$event, $param) { + + if ($event->data !== 'iwiki_list') { + return; + } + + $event->stopPropagation(); + $event->preventDefault(); + $a = getInterwiki(); + ksort($a); + echo json_encode($a); + } + +} diff --git a/lib/plugins/ckgedit/action/mediamanager.php b/lib/plugins/ckgedit/action/mediamanager.php new file mode 100644 index 0000000..2e3c3ce --- /dev/null +++ b/lib/plugins/ckgedit/action/mediamanager.php @@ -0,0 +1,50 @@ +setupLocale(); + } + + + function register(Doku_Event_Handler $controller) + { + $controller->register_hook('MEDIAMANAGER_STARTED', 'AFTER', $this, 'mediaman_started'); + $controller->register_hook('MEDIA_UPLOAD_FINISH', 'BEFORE', $this, 'upload_finish'); + $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'handle_metafile'); + } + + function handle_metafile(Doku_Event $event) { + $event->data['script'][] = + array( + 'type'=>'text/javascript', + 'charset'=>'utf-8', + '_data'=>'', + 'src'=>DOKU_BASE.'lib/plugins/ckgedit/scripts/mediamgr.js' + ) + ([ 'defer' => 'defer']); + } + + function upload_finish(Doku_Event $event) { + if(!preg_match("#^image/#",$event->data[3]) && $_COOKIE['ckgFbType'] == 'image') { + if(!empty($event->data[3]) && strlen($event->data[3]) >30) { + $fname = substr($event->data[3],0,29) . '. . .'; + } + else $fname = $event->data[3]; + msg($this->getLang('mediamgr_imgonly') . $fname); + setcookieSameSite('ckgFbType', 'image',time()-10); + $event->preventDefault(); + } + } + + function mediaman_started(Doku_Event $event) { + if ($_GET["onselect"] == "ckg_edit_mediaman_insert") { + setcookieSameSite('ckgFbType', 'image'); + } else if ($_GET["onselect"] == "ckg_edit_mediaman_insertlink") { + setcookieSameSite('ckgFbType', 'link'); + } + } +} diff --git a/lib/plugins/ckgedit/action/meta.php b/lib/plugins/ckgedit/action/meta.php new file mode 100644 index 0000000..7390478 --- /dev/null +++ b/lib/plugins/ckgedit/action/meta.php @@ -0,0 +1,1033 @@ +helper = plugin_load('helper', 'ckgedit'); + $this->dokuwiki_priority = false; + $this->dw_priority_group = "NOT_SET"; + $this->dw_priority_metafn=metaFN(':ckgedit:dw_priority', '.ser'); + if(!file_exists($this->dw_priority_metafn)) { + io_saveFile($this->dw_priority_metafn, serialize(array())); + } + + } + /* + * Register its handlers with the dokuwiki's event controller + */ + function register(Doku_Event_Handler $controller) { + + if($this->helper->is_outOfScope()) return; + $controller->register_hook( 'TPL_METAHEADER_OUTPUT', 'AFTER', $this, 'loadScript'); + $controller->register_hook( 'HTML_EDITFORM_INJECTION', 'AFTER', $this, 'preprocess'); + $controller->register_hook( 'HTML_EDITFORM_OUTPUT', 'BEFORE', $this, 'insertFormElement'); + $controller->register_hook( 'FORM_EDIT_OUTPUT', 'BEFORE', $this, 'insertFormElement'); + $controller->register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'file_type'); + $controller->register_hook('TPL_CONTENT_DISPLAY', 'AFTER', $this, 'setupDWEdit'); + $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'reset_user_rewrite_check'); + $controller->register_hook('DOKUWIKI_DONE', 'BEFORE', $this, 'restore_conf'); + $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this,'_ajax_call'); + //$controller->register_hook('HTML_UPDATEPROFILEFORM_OUTPUT', 'BEFORE', $this, 'handle_profile_form'); + $controller->register_hook('ACTION_SHOW_REDIRECT', 'BEFORE', $this, 'handle_redirect'); + } + + function handle_redirect(Doku_Event $event, $param) { + global $INPUT; + $ckg_redirect = $INPUT->str('ckgedit_redirect',""); + if($ckg_redirect) $event->data['id'] = $ckg_redirect; + //msg($ckg_redirect); + } + + function handle_profile_form(Doku_Event $event, $param) { + if(!$this->getConf('dw_priority')) { return; } + global $INFO; + $client = $_SERVER['REMOTE_USER']; //$INFO['client']; + $ar = unserialize(file_get_contents($this->dw_priority_metafn)); + $which = $ar[$client]; + $dwed = ""; $cked = ""; + if($which == 'N') { + $cked = "checked"; + } + else if($which == 'Y') { + $dwed = "checked"; + } + + $pos = $event->data->findElementByAttribute('type', 'reset'); + $_form = '

    '; + $_form.= '
    ' . $this->getLang('uprofile_title') .''; + + $_form.= ' '; + $_form .=''; + + $_form.= '
    '; + $_form.= '

     "; + $_form.= ''; + $_form.= '
    '; + $event->data->insertElement($pos+2, $_form); + } + +function _ajax_call(Doku_Event $event, $param) { + + if ($event->data == 'cked_scaytchk') { + global $lang,$INPUT; + $event->stopPropagation(); + $event->preventDefault(); + $filename = metaFN('fckl:scayt','.meta'); + $msg = $this->locale_xhtml('scayt'); + if (!file_exists($filename)) { + io_saveFile($filename,'1'); + echo "$msg\n"; + return; + } + + + return; + } + if ($event->data == 'cked_upload') { + global $lang; + $event->stopPropagation(); + $event->preventDefault(); + global $INPUT; + $id = urldecode($INPUT->str('ckedupl_id')); + $id = str_replace('/', ':',$id); + $this->ajax_debug($id); + $fn = mediaFN($id); + $this->ajax_debug($fn); + $delete = $INPUT->str('ckedupl_del'); + if(file_exists($fn)) { + $size = filesize($fn); + $this->ajax_debug("$fn: $size"); + } + else $this->ajax_debug("$fn not found"); + + if($delete && $delete == 'D') { + $size = ""; $ft = ""; + $oldf = $id; + $size_tm = $INPUT->str('delsize'); + $this->ajax_debug('size_tm='.$size_tm); + if($size_tm != 'undefined' && isset($size_tm)) { + list($size,$ft) = explode(';',$size_tm); + $size=trim($size); + $ft=trim($ft); + $size = '-' . $size; + } + else if(file_exists($fn)) { + if(!$size) { + $size = filesize($fn); + $size = '-' . $size; + } + if(!$ft) { + $ft=filemtime($fn) ; + } + } + else { + $this->ajax_debug("$fn not found"); + return; + } + if(isset($ft) && file_exists($fn)) { + $newf = mediaFN($id,$ft); + $this->ajax_debug("newf: $newf fn: $fn"); + if(file_exists($fn)){ + $this->ajax_debug("old file: $oldf; $fn"); + } + else $this->ajax_debug("no old file: $fn"); + + io_makeFileDir($newf); + if(copy($fn, $newf)) { + $this->ajax_debug("Copying $fn to $newf"); + chmod($newf, $conf['fmode']); + $this->ajax_debug("deleting: $fn"); + if(!unlink($fn)) $this->ajax_debug("delete failed"); + } + else $this->ajax_debug("copy failed"); + } + if(file_exists($fn)) { + if(!copy($fn, $newf)) { + $this->ajax_debug ("(2nd try) could not copy $fn to $newf"); + return; + } + if(!unlink($fn)) { + $this->ajax_debug ("could not delete $fn"); + return; + } + } + addMediaLogEntry($ft, $id, DOKU_CHANGE_TYPE_DELETE, $lang['deleted'],'', null, $size); + } + else addMediaLogEntry(time(), $id, DOKU_CHANGE_TYPE_CREATE, $lang['created'],'', null, $size); + echo 'done'; + return; + } + //cked_deletedsize + if ($event->data == 'cked_deletedsize') { + $event->stopPropagation(); + $event->preventDefault(); + global $INPUT; + $id = urldecode($INPUT->str('cked_delid')); + $fn = mediaFN($id); + if(file_exists($fn)) { + $this->ajax_debug(filesize ($fn) . ';' .filemtime($fn) ); + } + else echo ("$fn not found"); + return; + } + if ($event->data == 'use_heads') { + $event->stopPropagation(); + $event->preventDefault(); + global $INPUT; + $page = $INPUT->str('dw_id'); + $page = urldecode($page); + $page = ltrim($page, ':'); + $t= trim(p_get_first_heading($page)); + echo $t; + return; + } + if ($event->data == 'wrap_lang') { // parse and return language file to ckeditor wrap plugin + $event->stopPropagation(); + $event->preventDefault(); + global $INPUT; + $which = $INPUT->str('lang'); + $path = DOKU_PLUGIN . 'wrap/lang/' . $which . '/lang.php'; + if(file_exists($path)) { + $data = file($path, FILE_IGNORE_NEW_LINES|FILE_SKIP_EMPTY_LINES ); + array_shift($data); + } + else { + $data = array(); + } + $result = array(); + for($i=0; $idata == 'cked_selector') { //choose profile editor priority + $event->stopPropagation(); + $event->preventDefault(); + global $INPUT, $USERINFO,$INFO; + if(!isset($USERINFO)) return; + + $ar = unserialize(file_get_contents($this->dw_priority_metafn)); + $dwp = $INPUT->str('dw_val'); + $client = $INPUT->str('dwp_client'); + $ar[$client] = $dwp; + $retv = file_put_contents($this->dw_priority_metafn,serialize($ar)); + if($retv === false) { + echo $this->dw_priority_metafn; + } + else echo "done"; + return; + } + + + if ($event->data == 'geshi_sel') { //get geshi file names , return as ;; separated string w/o php extensions + $event->stopPropagation(); + $event->preventDefault(); + + if( class_exists('GeSHi')) { + if(defined('GESHI_LANG_ROOT') ) $geshi_dir =GESHI_LANG_ROOT; + } + else { + echo "ENotfound\n"; + return ; + } + $gfiles = scandir ($geshi_dir); + $selects = array(); + foreach($gfiles as $gfile){ + if(is_dir($gfile)) continue; + $gfile = preg_replace("/\.php\n?$/","",$gfile); + $selects[] = $gfile; + } + $selects = implode ( ';;', $selects ); + echo $selects; + return; + } + + if ($event->data !== 'refresh_save') { // save ckgedit backups in native dw format + return; + } + + $event->stopPropagation(); + $event->preventDefault(); + global $INPUT; + + + $rsave_id = urldecode($INPUT->str('rsave_id')); + $path = pathinfo($rsave_id); + if($path['extension'] != 'ckgedit') { + echo "failed"; + return; + } + + $this->wiki_text = urldecode($INPUT->str('wikitext')); + + if(!preg_match('/^\s+(\-|\*)/',$this->wiki_text)){ + $this->wiki_text = trim($this->wiki_text); + } + + /* preserve newlines in code blocks */ + $this->wiki_text = preg_replace_callback( + '/(|)(.*?)(<\/code>|<\/file>)/ms', + function($matches) { + return str_replace("\n", "__code_NL__",$matches[0]); + }, + $this->wiki_text + ); + + $this->wiki_text = preg_replace('/^\s*[\r\n]$/ms',"__n__", $this->wiki_text); + $this->wiki_text = preg_replace('/\r/ms',"", $this->wiki_text); + $this->wiki_text = preg_replace('/^\s+(?=\^|\|)/ms',"", $this->wiki_text); + $this->wiki_text = preg_replace('/__n__/',"\n", $this->wiki_text); + $this->wiki_text = str_replace("__code_NL__","\n", $this->wiki_text); + + + $this->wiki_text .= "\n"; + + + $pos = strpos($this->wiki_text, 'MULTI_PLUGIN_OPEN'); + if($pos !== false) { + $this->wiki_text = preg_replace_callback( + '|MULTI_PLUGIN_OPEN.*?MULTI_PLUGIN_CLOSE|ms', + function($matches) { + return preg_replace("/\\\\\\\\/ms","\n",$matches[0]); + }, + $this->wiki_text + ); + + $this->wiki_text = preg_replace_callback( + '|MULTI_PLUGIN_OPEN.*?MULTI_PLUGIN_CLOSE|ms', + function($matches) { + return preg_replace("/^\s+/ms","",$matches[0]); + }, + $this->wiki_text + ); + + } + + $this->replace_entities(); + $this->wiki_text = preg_replace('/\<\?php/i', '<?php',$this->wiki_text) ; + $this->wiki_text = preg_replace('/\?>/i', '?>',$this->wiki_text) ; + file_put_contents($rsave_id, $this->wiki_text); + echo 'done'; + +} + +function replace_entities() { + global $ents; + $serialized = FCK_ACTION_SUBDIR . 'ent.ser'; + $ents = unserialize(file_get_contents($serialized)); + + $this->wiki_text = preg_replace_callback( + '|(&(\w+);)|', + function($matches) { + global $ents; return $ents[$matches[2]]; + }, + $this->wiki_text + ); + +} + + function insertFormElement(Doku_Event $event, $param) { + global $FCKG_show_preview; + + $param = array(); + + global $ID; + $dwedit_only = ''; + $disabled = ''; + $title = $this->getLang('btn_fck_edit'); + $dwedit_ns = $this->getConf('dwedit_ns'); + if(isset($dwedit_ns) && $dwedit_ns) { + $ns_choices = explode(',',$dwedit_ns); + foreach($ns_choices as $ns) { + $ns = trim($ns); + if(preg_match("/$ns/",$ID)) { + $dwedit_only = 'background-color: #bbb; color: #999'; + $disabled = 'disabled'; + $title = $this->getLang('btn_dw_edit'); + echo ""; + break; + } + } + } + $act = $event->data; + if(is_string($act) && $act != 'edit') { + return; + } + + // restore preview button if standard DW editor is in place + // $FCKG_show_preview is set in edit.php in the register() function +if($_REQUEST['fck_preview_mode'] != 'nil' && !isset($_COOKIE['FCKG_USE']) && !$FCKG_show_preview) { + echo ''; + } + elseif($FCKG_show_preview) { + echo ''; + } + else { + echo ''; + } + + global $ckgedit_lang; + + if($_REQUEST['fck_preview_mode']== 'preview'){ + return; + } + + $param = array(); + $this->preprocess($event, $param); // create the setDWEditCookie() js function + $button = array + ( + '_elem' => 'button', + 'type' => 'submit', + '_action' => 'cancel', + 'value' => $this->getLang('btn_fck_edit'), + 'class' => 'button', + 'id' => 'edbtn__edit', + 'style' => $dwedit_only, + 'disabled' => $disabled, + 'title' => $this->getLang('btn_fck_edit') + ); + + $pos = strpos($_SERVER['HTTP_USER_AGENT'], 'MSIE'); + if($pos === false) { + $button['onclick'] = 'return setDWEditCookie(1, this);'; + } + else { + $button['onmousedown'] = 'return setDWEditCookie(1, this);'; + } + + if(is_a($event->data,\dokuwiki\Form\Form::class)) { + $button = '  '; + $pos = $event->data->findPositionByAttribute('type','submit'); + $pos+=3; + $event->data->addHTML($button,$pos); + } + else { + $pos = $event->data->findElementByAttribute('type','submit'); + $event->data->insertElement(++$pos,$button); + } + + return; + + } + + + function preprocess(Doku_Event $event, $param) { + $act = $event->data; + + if(is_string($act) && $act != 'edit') { + return; + } + global $INFO, $ckgedit_lang; + + $discard = $this->getLang('discard_edits'); + echo "\n"; + echo << +SCRIPT; + + } + +function check_userfiles() { + + global $INFO; + global $conf; + + $save_dir = trim($conf['savedir']); + $animal = isset($conf['animal']) ? $conf['animal'] : 'userfiles'; + + $userfiles = DOKU_PLUGIN . "ckgedit/fckeditor/$animal/"; + if(isset($conf['animal']) && $conf['animal'] !== 'userfiles') { + setcookieSameSite('FCK_animal',$animal, $expire, '/'); + setcookieSameSite('FCK_animal_inc',$conf['animal_inc'], $expire, '/'); + preg_match('#^(.*?' . $conf['animal'] . ')#', $save_dir,$matches); + $save_dir=$matches[1] . '/data/pages'; + setcookieSameSite('FCK_farmlocal',$save_dir, $expire, '/'); + + return; + } +// msg('BASE='. DOKU_BASE); +// msg(DOKU_URL); +// msg('REL='. DOKU_REL); + if(!preg_match('#^\.\/data$#',$save_dir)) { + $data_media = $conf['savedir'] . '/media/'; + + $domain = trim(DOKU_BASE,'/'); + + $expire = null; + + if(! empty($domain )) { + list($prefix,$mdir) = explode(trim(DOKU_BASE, '/'),$userfiles); + $mdir = ltrim($mdir, '/'); + $media_dir = DOKU_BASE . $mdir . 'image/'; + } + else $media_dir = '/lib/plugins/ckgedit/fckeditor/'. $animal . '/image/'; + setcookieSameSite('FCK_media',$media_dir, $expire, '/'); + + } + else { + $data_media = DOKU_INC.'data/media/'; + } + + if($this->getConf('winstyle')) { + $htaccess = $data_media . '.htaccess'; + if(!file_exists($htaccess)) { + $security = $userfiles . '.htaccess.security'; + if(file_exists($security)) { + if(!copy($security, $htaccess)) { + msg($this->getLang("ws_cantcopy") . $htaccess); + } + else msg($this->getLang("ws_copiedhtaccess")); + } + } + return; + } + if(!is_readable($userfiles) && !is_writable($userfiles)){ + msg($this->getLang("userfiles_perm" ) . ' ' . $userfiles) ; + return; + } + $version = io_readFile(DOKU_PLUGIN . 'ckgedit/version'); + if(!$version) return; + $meta = metaFN('fckl:symchk','.meta'); + $symcheck = io_readFile($meta); + if($symcheck) { + if(trim($version)== trim($symcheck)) { //symlinks should already have been created + return; + } + } + + if (function_exists('php_uname')) { + $sys = php_uname() ; + if( preg_match('/Windows/i', $sys) ) { + preg_match('/build\s+(\d+)/',$sys, $matches); + if($matches[1] < 6000) { // we can make symlinks for vista (6000) or later + return; + } + + $winlinks = array(); + $userfiles = str_replace('/', '\\',$userfiles); + exec("dir " . $userfiles, $output); + foreach($output as $line) { + if(preg_match('/\s+(.*?)\s+\[/i',$line,$matches)) { + $winlinks[] = $matches[1]; + } + } + } + + } + else if( preg_match('/WINNT/i', PHP_OS) ) { // if we can't get php_uname and a build and this is Windows, just return + return; + } + + $show_msg = false; + if($INFO['isadmin'] || $INFO['ismanager'] ) { // only admins and mgrs get messages + $show_msg = true; + } + $link_names = array('flash', 'image', 'media', 'file', 'image'); + if(isset($winlinks) && is_array($winlinks) && count($winlinks)) { + $link_names = array_diff($link_names, $winlinks); + } + $links = array(); + foreach ($link_names as $ln) { + $links[$ln] = $userfiles . $ln; + } + + $bad_create = false; + $successes = array(); + if(@file_exists($userfiles)) { + foreach($links as $name => $path) { + if(!is_link($path)) { + if(file_exists($path) && is_file($path) ){ + unlink($path); + } + if(file_exists($path) && is_dir($path) ){ + rmdir($path); + } + if(!@symlink($data_media,$path) ) { + $bad_create = true; + if($show_msg) msg($this->getLang("sym_not created_1") . " $name link: $path",-1); + } + else { + $successes[] = $name; + } + } + } + } + else { + if($show_msg) { + msg($this->getLang("sym_not created_2") ." $userfiles",-1); + } + } + + + + if($bad_create) { + if($show_msg) { + msg($this->getLang("sym_not created_3") . " $userfiles"); + } + } + else { + if(count($successes)) { + $links_created = implode(', ',$successes); + msg($this->getLang("syms_created") . " $links_created",2); + } + } + io_saveFile($meta,$version); + chmod($meta, 0666); +} + + + function set_session() { + global $USERINFO, $INFO; + global $conf; + global $ID; + global $ACT; + + if($this->session_id) return; + + $cname = getCacheName($INFO['client'].$ID,'.draft'); + $fckl_draft = $cname . '.fckl'; + if((isset($ACT) && is_array($ACT)) || isset($_REQUEST['dwedit_preview'])) { + if(isset($ACT['draftdel']) || isset($ACT['cancel']) || isset($_REQUEST['dwedit_preview'])) { + @unlink($fckl_draft); + @unlink($cname); + } + } + + if(file_exists($cname)) { + if(file_exists($fckl_draft)) { + unlink($fckl_draft); + } + @rename($cname, $fckl_draft); + } + + + $session_string = session_id(); + $this->session_id = $session_string; + + + $_SESSION['dwfck_id'] = $session_string; + $default_fb = $this->getConf('default_fb'); + + if($default_fb == 'none') { + $acl = 255; + } + else { + $acl = auth_quickaclcheck($ID); + } + $_SESSION['dwfck_acl'] = $acl; + + if($this->getConf('openfb') || $acl == 255) { + $_SESSION['dwfck_openfb'] = 'y'; + } + else { + $_SESSION['dwfck_openfb'] = 'n'; + } + + $_SESSION['dwfck_grps'] = isset($USERINFO['grps']) ? $USERINFO['grps'] : array(); + $_SESSION['dwfck_client'] = $INFO['client']; + $_SESSION['dwfck_sepchar'] = $conf['sepchar'] ; + $_SESSION['dwfck_conf'] = array('sepchar'=> $conf['sepchar'], + 'isadmin'=>($INFO['isadmin'] || $INFO['ismanager']), + 'deaccent'=>$conf['deaccent'], 'useslash'=>$conf['useslash']); + $elems = explode(':', $ID); + array_pop($elems); + + $_SESSION['dwfck_ns'] = implode(':',$elems); + $_SESSION['dwfck_top'] = implode('/',$elems); + $_SESSION['dwfck_del'] = $this->getConf('acl_del'); + + // temp fix for puzzling encoding=url bug in frmresourceslist.html, + // where image loading is processed in GetFileRowHtml() + + if(preg_match('/ckgedit:fckeditor:userfiles:image/',$ID)) { + $_SESSION['dwfck_ns'] = ""; + $_SESSION['dwfck_top'] = ""; + + } + + $expire = time()+60*60*24*30; + // $expire = null; + setcookieSameSite('FCK_NmSp_acl',$session_string, $expire, '/'); + + setcookieSameSite('FCK_SCAYT',$this->getConf('scayt'), $expire, '/'); + setcookieSameSite('FCK_SCAYT_AUTO',$this->getConf('scayt_auto'), $expire, '/'); + $scayt_lang = $this->getConf('scayt_lang'); + if(isset($scayt_lang)) { + list($scayt_lang_title,$scayt_lang_code) = explode('/',$scayt_lang); + if($scayt_lang_code!="en_US") { + setcookieSameSite('FCK_SCAYT_LANG',$scayt_lang_code, $expire, '/'); + } + } + if ($this->getConf('winstyle')) { + setcookieSameSite('FCKConnector','WIN', $expire, DOKU_BASE); + } + + if ($this->dokuwiki_priority && $this->in_dwpriority_group() ) { + if(isset($_COOKIE['FCKG_USE']) && $_COOKIE['FCKG_USE'] == 'other') { //if other go to ckeditor + $expire = time() -60*60*24*30; + setcookieSameSite('FCKG_USE','_false_', $expire, '/'); + } + else { + setcookieSameSite('FCKG_USE','_false_', $expire, '/'); //turn off ckeditor + } + } + } + + function file_type(Doku_Event $event, $param) { + global $ACT; + global $ID; + global $JSINFO; + global $INPUT; + global $updateVersion; + global $conf, $USERINFO; + + if(isset($USERINFO)) { + $this->startup_msg(); + } + if((float)$updateVersion >= 51){ // HOGFATHER + + // $conf['plugin']['ckgedit']['allow_ckg_filebrowser'] = 'dokuwiki'; + // $conf['plugin']['ckgedit']['default_ckg_filebrowser'] = 'dokuwiki'; + } + + $auth = auth_quickaclcheck($ID); + $JSINFO['confirm_delete']= $this->getLang('confirm_delete'); + $JSINFO['doku_base'] = DOKU_BASE ; + $JSINFO['cg_rev'] = $INPUT->str('rev'); + $JSINFO['dw_version'] = (float)$updateVersion; + if(preg_match("/Chrome\/(\d+)/", $_SERVER['HTTP_USER_AGENT'],$cmatch)) { + $JSINFO['chrome_version'] = (float) $cmatch[1]; + } + else $JSINFO['chrome_version'] = 0; + $JSINFO['hide_captcha_error'] = $INPUT->str('ckged_captcha_err','none'); + $dbl_click_auth = $this->getConf('dw_edit_display'); + if($dbl_click_auth == 'none' || empty($_SERVER['REMOTE_USER'])) { + $JSINFO['ckg_dbl_click'] = ""; + } + else if($dbl_click_auth == 'all' ||$auth == 255 ) { + $JSINFO['ckg_dbl_click'] = "1"; + } + $onoff = $this->getConf('dblclk'); + if($onoff == 'off') $JSINFO['ckg_dbl_click'] = ""; + $JSINFO['ckg_canonical'] =$conf['canonical']; + $JSINFO['doku_base'] = DOKU_BASE; + $JSINFO['doku_url'] = DOKU_URL; + if($this->helper->has_plugin('tag')) $JSINFO['has_tags'] = "Tag"; + if($this->helper->has_plugin('wrap') && ! plugin_isdisabled('wrap')) { + $JSINFO['has_wrap'] = "Wrap"; + $wrap_helper = plugin_load('helper','wrap'); + if($wrap_helper ) { + $syntaxDiv = $wrap_helper->getConf('syntaxDiv'); + if(!empty($syntaxDiv)) { + $JSINFO['wrapDiv'] = $syntaxDiv; + } + else $JSINFO['wrapDiv'] = ""; + + $syntaxSpan = $wrap_helper->getConf('syntaxSpan'); + if(!empty($syntaxSpan)) { + $JSINFO['wrapSpan'] = $syntaxSpan; + } + else $JSINFO['wrapSpan'] = ""; + } + } + if(!isset($_COOKIE['ckgEdPaste'])) { + $JSINFO['ckgEdPaste'] = 'off'; + } + else { + $JSINFO['ckgEdPaste'] = $_COOKIE['ckgEdPaste']; + } + $JSINFO[ 'rel_links'] = $this->getConf('rel_links'); + $JSINFO['ckg_template'] = $conf['template']; + $this->check_userfiles(); + $this->profile_dwpriority=($this->dokuwiki_priority && $this->in_dwpriority_group()) ? 1 : 0; + if(isset($_COOKIE['FCK_NmSp'])) $this->set_session(); + /* set cookie to pass namespace to FCKeditor's media dialog */ + // $expire = time()+60*60*24*30; + $expire = null; + setcookieSameSite('FCK_NmSp',$ID, $expire, '/'); + + + + /* Remove TopLevel cookie */ + if(isset($_COOKIE['TopLevel'])) { + setcookieSameSite("TopLevel", $_REQUEST['TopLevel'], time()-3600, '/'); + } + + + if(!isset($_REQUEST['id']) || isset($ACT['preview'])) return; + if(isset($_REQUEST['do']) && isset($_REQUEST['do']['edit'])) { + $_REQUEST['do'] = 'edit'; + } + } + +function loadScript(Doku_Event $event) { + echo << + +SCRIPT; + +} + +/** + * Handle features need for DW Edit: + * 1. Re-label Cancel Button "Exit" when doing a preview + * 2. set up $REQUEST value to identify a preview when in DW Edit , used in + * set_session to remove ckgedit and DW drafts if present after a DW preview +*/ + function setupDWEdit(Doku_Event $event) { + global $ACT; + + // $url = DOKU_URL . 'lib/plugins/ckgedit/scripts/script-cmpr.js'; + echo << + +SCRIPT; + + if(isset($_REQUEST['do']) && is_array($_REQUEST['do'])) { + if(isset($_REQUEST['do']['preview'])) { + echo ''; + } + } + + + } + + + +function reset_user_rewrite_check() { + + global $ACT; + global $conf; + global $JSINFO,$USERINFO; + + if(isset($_COOKIE['FCKG_USE']) && $_COOKIE['FCKG_USE'] =='_false_' ) return; + if($ACT == 'edit') { + $this->user_rewrite = $conf['userewrite']; + $conf['userewrite'] = 0; + } + + if((isset($conf['htmlok'])&& $conf['htmlok']) || $this->getConf('htmlblock_ok')) { + $JSINFO['htmlok'] = 1; + } + else $JSINFO['htmlok'] = 0; + } + +function startup_msg() { + global $INFO; + global $ACT; + global $updateVersion; + $show_msg = false; + if($INFO['isadmin'] || $INFO['ismanager'] ) { // only admins and mgrs get messages + $show_msg = true; + } + if(!$show_msg) return; + + $filename = metaFN('fckl:scayt','.meta'); + $msg = $this->locale_xhtml('scayt'); + if (!file_exists($filename)) { + io_saveFile($filename,'1'); + msg($msg,MSG_MANAGERS_ONLY); + } + else { + if($this->getConf('scayt_auto') != 'off') return; + $this->startup_check_twice($filename, 'scayt'); + } + if( (float)$updateVersion < 51) { + return; + } + +/* + $filename = metaFN('fckl:hogfather','.meta'); + $msg = $this->locale_xhtml('hogfather'); + if (!file_exists($filename)) { + io_saveFile($filename,'1'); + msg($msg,MSG_MANAGERS_ONLY); + } */ + +} + +function startup_check_twice($filename, $which) { + global $ACT; + + if($ACT != 'login') return; + $msg = $this->locale_xhtml($which); + if (file_exists($filename)) { + $reps = io_readFile($filename); + if($reps <2) { + $reminder = $this->getLang('dblclk_reminder'); + msg("($reminder) " . $msg,2 ); + io_saveFile($filename,$reps+1); + return; + } + } +} +/** + checked for additional dw priority possibilities only if the dw priority option is set to true +*/ +function in_dwpriority_group() { + global $USERINFO,$INFO; + if(!isset($USERINFO)) return false; + if(empty($this->dw_priority_group)) return true; // all users get dw_priority if no dw_priority group has been set in config + $client = $_SERVER['REMOTE_USER']; + $ar = unserialize(file_get_contents($this->dw_priority_metafn)); // check user profile settings + $expire = time() -60*60*24*30; + if(isset($ar[$client])) { + if($ar[$client] =='Y') return true; // Y = dw_priority selected + if($ar[$client] =='N') { + setcookieSameSite('FCKG_USE','_false_', $expire, '/'); + return false; // N = CKEditor selected + } + } + $user_groups = $USERINFO['grps']; + + if(in_array($this->dw_priority_group, $user_groups) || in_array("admin", $user_groups)) { + return true; + } + + setcookieSameSite('FCKG_USE','_false_', $expire, '/'); + + return false; +} + +function restore_conf() { + global $conf; + global $ACT; + if($ACT == 'edit') { return; } + + if($this->user_rewrite !==false) { + $conf['userewrite'] = $this->user_rewrite; + } + +} +function ajax_debug($data) { + return; + echo "$data\n"; +} +function write_debug($data) { + return; + if (!$handle = fopen(DOKU_INC .'meta.txt', 'a')) { + return; + } + if(is_array($data)) { + $data = print_r($data,true); + } + // Write $somecontent to our opened file. + fwrite($handle, "$data\n"); + fclose($handle); + +} + +} + + + diff --git a/lib/plugins/ckgedit/action/save.php b/lib/plugins/ckgedit/action/save.php new file mode 100644 index 0000000..d90007e --- /dev/null +++ b/lib/plugins/ckgedit/action/save.php @@ -0,0 +1,491 @@ +register_hook('DOKUWIKI_STARTED', 'BEFORE', $this, 'ckgedit_save_preprocess'); + } + + function ckgedit_save_preprocess(Doku_Event $event){ + global $ACT,$INPUT; + $this->helper = $this->loadhelper('ckgedit'); + if (!isset($_REQUEST['ckgedit']) || ! is_array($ACT) || !(isset($ACT['save']) || isset($ACT['preview']))) return; + if (isset($_REQUEST["fontdel"]) ) { + msg($this->getLang("fontdel"),1); + } + if (isset($_REQUEST["formatdel"]) ) { + msg($this->getLang("formatdel"),1); + } + if (isset($_REQUEST["linkintbl"]) ) { + msg($this->getLang("list_in_table"),1); + } + $img_size = $INPUT->int('broken_image'); + if($img_size) msg($this->getLang('broken_image') . $img_size/1000000 . 'M' ); + + + global $TEXT, $conf; + + if (!$TEXT) return; + $preserve_enc = $this->getConf('preserve_enc'); + $deaccent = $conf['deaccent'] == 0 ? false : true; + $TEXT = $_REQUEST['fck_wikitext']; + + if(!preg_match('/^\s+(\-|\*)/',$TEXT)) { + $TEXT = trim($TEXT); + } + + + $TEXT = preg_replace_callback( + '|\{\{data:(.*?);base64|ms', + function($matches) { + if(!preg_match("/image/",$matches[1])) { + return "{{data:image/jpeg;base64"; + } + return $matches[0]; + },$TEXT); + + if(strpos($TEXT,'data:image') !== false) { + $TEXT = preg_replace_callback( + '|\{\{(\s*)data:image\/(\w+;base64,\s*)(.*?)\?nolink&(\s*)\}\}|ms', + function($matches) { + list($ext,$base) = explode(";",$matches[2]); + if($ext == "jpeg" || $ext == "tiff") $ext = "jpg"; + if(function_exists("imagecreatefromstring") && !imagecreatefromstring (base64_decode($matches[3]))) { + msg("Clipboard paste: invalid $ext image format"); + return "{{" . BROKEN_IMAGE . "}}"; + } + global $INFO,$conf,$ID; + $fn = $this->get_imgpaste_fname($ext); + if(!$fn) { + $ns = getNS($INFO["id"]); + $ns = trim($ns); + if(!empty($ns)) { + $ns = ":$ns:"; + $dir = str_replace(":","/",$ns); + } + else { // root namespace + $dir = "/"; + $ns = ":"; + } + $fn = md5($matches[3]) . ".$ext"; + $path = $conf["mediadir"] . $dir . $fn; + } + else { + $path = $conf["mediadir"] . "/$fn"; + $path = str_replace(':','/',$path); + } + + @io_makeFileDir($path); + if(!file_exists($path)) { + @file_put_contents($path, base64_decode($matches[3])); + global $lang; + $id = $dir . $fn; + $id = str_replace("/",":",$id); + addMediaLogEntry(time(), $id, DOKU_CHANGE_TYPE_CREATE, $lang["created"],"", null, strlen(base64_decode($matches[3]))); + } + else { + msg("file for this image previousely saved",2); + } + $left = "{{"; + $right = "}}"; + if($matches[1]) $left .= $matches[1]; + if($matches[4]) $right = $matches[4] . $right; + + $retv = "$left" . $ns. $fn . "$right"; + return $retv; + }, + $TEXT + ); + } + $TEXT = str_replace('%%', "FCKGPERCENTESC", $TEXT); + + if($deaccent || $preserve_enc) { + $TEXT = preg_replace_callback('/^(.*?)(\[\[.*?\]\])*(.*?)$/ms', + function($matches) { + $matches[1] = preg_replace("/%([A-F0-9]{1,3})/i", "URLENC_PERCENT$1", $matches[1]); + $matches[2] = preg_replace("/%([A-F0-9]{1,3})/i", "URLENC_PERCENT$1", $matches[2]); + $matches[3] = preg_replace("/%([A-F0-9]{1,3})/i", "URLENC_PERCENT$1", $matches[3]); + return $matches[1].$matches[2].$matches[3]; + }, + $TEXT + ); + } + + $TEXT = rawurldecode($TEXT); + $TEXT = preg_replace('/NOWIKI_%_NOWIKI_%_/', '%%',$TEXT); + $TEXT = preg_replace('/URLENC_PERCENT/', '%',$TEXT); + $TEXT = preg_replace('/NOWIKI_(.)_/', '$1',$TEXT); + + /* preserve newlines in code blocks */ + $TEXT = preg_replace_callback( + '/(|)(.*?)(<\/code>|<\/file>)/ms', + function($matches) { + return str_replace("\n", "__code_NL__",$matches[0]); + }, + $TEXT + ); + + $TEXT = preg_replace('/^\s*[\r\n]$/ms',"__n__", $TEXT); + $TEXT = preg_replace('/oIWIKIo|cIWIKIc/ms',"", $TEXT); + $TEXT = preg_replace('/\r/ms',"", $TEXT); + $TEXT = preg_replace('/^\s+(?=\^|\|)/ms',"", $TEXT); + $TEXT = preg_replace('/__n__/',"\n", $TEXT); + $TEXT = str_replace("__code_NL__","\n", $TEXT); + $TEXT = str_replace("FCKGPERCENTESC", '%%', $TEXT); + if($this->getConf('complex_tables')) { + $TEXT = str_replace('~~COMPLEX_TABLES~~','',$TEXT); + } + $TEXT .= "\n"; + // Removes relics of markup characters left over after acronym markup has been removed + //$TEXT = preg_replace('/([\*\/_]{2})\s+\\1\s*([A-Z]+)\s*\\1+/ms',"$2",$TEXT); + + $pos = strpos($TEXT, 'MULTI_PLUGIN_OPEN'); + if($pos !== false) { + $TEXT = preg_replace_callback( + '|MULTI_PLUGIN_OPEN.*?MULTI_PLUGIN_CLOSE|ms', + function($matches) { + return preg_replace("/\\\\\\\\/ms","\n",$matches[0]); + }, + $TEXT + ); + + $TEXT = preg_replace_callback( + '|MULTI_PLUGIN_OPEN.*?MULTI_PLUGIN_CLOSE|ms', + function($matches) { + return preg_replace("/^\s+/ms","",$matches[0]); + }, + $TEXT + ); + $TEXT = str_replace("~~MULTI_PLUGIN_OPEN~~","~~MULTI_PLUGIN_OPEN~~\n",$TEXT); + } + + if(strpos($TEXT,'L_PARgr') !== false) { + $TEXT = preg_replace_callback( + '|\(\((.*?)\)\)|ms', + function($matches) { + return "((" . trim($matches[1]) . "))"; + }, + $TEXT + ); + $TEXT = str_replace('L_PARgr', '(',$TEXT); + $TEXT = str_replace('R_PARgr', ')',$TEXT); + } +/* +Restructure numbered syntax highlighting 13/09/2019 +*/ +$TEXT = preg_replace_callback("#.*?(\[enable_line_numbers.*?\])\s*\*\/#ms", + function($matches) { + return ''; + }, $TEXT +) ; + + $this->replace_entities(); + /*Remove urls from linkonly images inserted after second and additional saves, resulting in multiple urls corrupting HTML output */ + $TEXT = preg_replace("/\{\{http:\/\/.*?fetch.php\?media=(.*?linkonly.*?)\}\}/",'{{' . "$1" .'}}',$TEXT); + $TEXT = str_replace('< nowiki >', '%%%%',$TEXT); + + + $TEXT = preg_replace_callback( + '#\[\[(.*?)\]\]#ms', + function($matches){ + if($this->helper->has_plugin('button') && strpos($matches[0], '[[{') === 0) { + return $matches[0]; + } + if(preg_match('/[\w\.]+\s*>/',$matches[0])) { + return $matches[0]; + } + if(preg_match('/([\w\.\-]+@[\w\.\-]+\.\w{2,3})\?.*?\|\1/i',$matches[0])) { + return $matches[0]; + } + global $ID, $conf; + $qs = ""; + if(preg_match("/\[\[http/",$matches[0])) return $matches[0]; //not an internal link + if(preg_match("#\[\[.*?\|\{\{.*?\}\}\]\]#", $matches[0],$matches_1)) { // media file + if(!$this->getConf('rel_links')) { + return $matches[0]; + } + $link = explode('?',$matches[1]); + list($link_id,$linktext) = explode('|', $link[0]); + $current_id = $this->abs2rel($link_id,$ID); + return preg_replace("#$link_id#",$current_id, $matches[0]); + } + + $link = explode('?',$matches[1]); + if($link[1]) { + $link_id = $link[0]; + list($qs,$linktext) = explode('|', $link[1]); + } + else list($link_id,$linktext) = explode('|', $link[0]); + if($this->getConf('rel_links')) + $current_id = $this->abs2rel($link_id,$ID); + else $current_id = $link_id; + if($qs) $current_id .= "?$qs"; + + //as in _getLinkTitle in xhtml.php + if(useHeading('content')) { + $tmp_linktext = p_get_first_heading($link_id); + if(trim($linktext) == trim($tmp_linktext)) { + $linktext = ""; + } + } + $tmp_ar = explode(':',$link_id); + $tmp_id = array_pop($tmp_ar); + if(!useHeading('content') && (trim($linktext,'.: ' ) == trim($tmp_id,'.: '))) + $linktext = ""; + + $current_id = $current_id.'|'.$linktext; + return '[[' . $current_id .']]'; + }, + $TEXT + ); + + if($this->getConf('rel_links')) { + $TEXT = preg_replace_callback( + '#\{\{(\s*)(.*?)(\s*)\}\}#ms', + function($matches) { + global $ID; + $link = explode('?',$matches[2]); + list($link_id,$linktext) = explode('|', $link[0]); + $rel = $this->abs2rel($link_id,$ID); + if(!empty($link[1])) $rel .= '?' . $link[1]; + if(!empty($linktext)) $rel = $rel.'|'.$linktext; + return '{{' .$matches[1] . $rel . $matches[3] .'}}'; + }, + $TEXT + ); + } + +/* 11 Dec 2013 see comment below +Remove discarded font syntax +*/ + $TEXT = preg_replace_callback( + '|_REMOVE_FONTS_START_(.*?)_REMOVE_FONTS_END_|ms', + function($matches) { + $matches[1] = preg_replace("//ms","",$matches[1]); + return preg_replace("/<\/font>/ms","",$matches[1]); + }, + $TEXT + ); + + /* +6 April 2013 +Removed newlines and spaces from beginnings and ends of text enclosed by font tags. Too subtle for javascript. + */ + $TEXT = preg_replace_callback( + '|()(.*?)(?=)|ms', + function($matches) { + $matches[2]=preg_replace("/^\s+/ms","",$matches[2]); + $matches[2]=preg_replace("/\s+$/ms","",$matches[2]); + return $matches[1]. $matches[2]; + }, + $TEXT + ); + /* insure space before and after ckgedit font oprning and closing tags*/ + $TEXT = preg_replace("/\s+<\/font>/","", $TEXT); + $TEXT = preg_replace("//ms"," ", $TEXT); + $TEXT = preg_replace('/\s{2,}{2,}/ms',' font> ',$TEXT); + + $TEXT = preg_replace('/__QUOTE__/ms',">",$TEXT); + $TEXT = preg_replace('/[\t\x20]+$/ms',"",$TEXT); + $TEXT = preg_replace('/\n{4,}/ms',"\n\n",$TEXT); + $TEXT = preg_replace('/\n{3,}/ms',"\n\n",$TEXT); + + /*first pass for blockquotes*/ + $TEXT = preg_replace_callback( + "#^>+(.*?)\\\\\\\\#ms", + function($matches) { + return str_replace('\\',"",$matches[0]); + }, + $TEXT + ); + + /* remove extra line-feeds following in-table code blocks + make sure cell-ending pipe not mistaken for a following link divider + */ + $TEXT = preg_replace_callback( + '#(/code|/file)\>.*?\n\|#ms', + function($matches) { + $matches[0] = preg_replace("/([\S\s\w\:])\\\\\\\\(\w)/ms","$1@#@$2",$matches[0]); //retain backslashes inside code blocks + $matches[0] = preg_replace("/(\w+)\\\\\\\\(\w)/ms","$1@#@",$matches[0]); + $matches[0] = preg_replace("/\\\\(\w+)/ms","@!@$1",$matches[0]); + $matches[0] = preg_replace("/(\w+)\\\\/ms","@!@$1",$matches[0]); + $matches[0] = str_replace("\\", "",$matches[0]); + $matches[0] = str_replace("@!@",'\\',$matches[0]); + return str_replace("@#@", "\\\\",$matches[0]); + }, + $TEXT + ); + /* reformat table cell after removing extra line-feeds, above */ + $TEXT = preg_replace_callback( + '#\|[\s\n]+(\)(.*?)(\<\/file>\s*.*?)\n?\|#ms', + function($matches) { + //$ret = '' . str_replace('\\',"",$matches[2]) . '|'; + $matches[3] = preg_replace('/\n+/',"",$matches[3] ); + $matches[3] = preg_replace('/\s+$/',"",$matches[3] ) . '|'; + return '|' . $matches[1] . $matches[2] . str_replace("\\ ","",$matches[3]); + }, + $TEXT + ); + + + /* Feb 23 2019 + remove spaces and line feeds between beginning of table cell and start of code block + */ + $TEXT = preg_replace_callback( + '#\|(.*?)[\s\n]+\<(code|file)\>#ms', + function($matches) { + return '|' . $matches[1] ."\n<". $matches[2] .'>' . "\n"; + },$TEXT + ); + /*remove line feeds following block */ + $TEXT = preg_replace_callback( + '#\<\/(code|file)\>([^\w\|]+)#ms', + function($matches) { + $matches[2] = str_replace(':\\', '~~WIN__DIR~~',$matches[2]); + $matches[2] = preg_replace('#([\w;.:=\:])\\\\#ms', "$1_bSL_",$matches[2]); //protect backslashes in Windows paths + $ret = '' . str_replace("\\","",$matches[2]); + $ret = str_replace( '_bSL_', '\\',$ret); + $ret = str_replace( '~~WIN__DIR~~', ':\\',$ret); + return "\n" .$ret; + },$TEXT + ); + $TEXT = str_replace('CBL__Bksl','\\',$TEXT); + $TEXT = preg_replace("/helper->has_plugin('imgpaste')) return; + if(!$this->getConf('imgpaste')) return; + $imgpaste = plugin_load('action','imgpaste'); + $filename = $imgpaste->getConf('filename'); + if(!$filename) return false; + $filename = str_replace( + array( + '@NS@', + '@ID@', + '@USER@', + '@PAGE@' + ), + array( + getNS($ID),// getNS($INPUT->post->str('id')), + $ID,// $INPUT->post->str('id'), + $_SERVER['REMOTE_USER'], + noNS($ID) //noNS($INPUT->post->str('id')) + ), + $filename + ); + $filename = strftime($filename); + $filename = cleanID($filename); + return $filename . '.' . $ext; +} + +function replace_entities() { +global $TEXT; +global $ents; + $serialized = FCK_ACTION_SUBDIR . 'ent.ser'; + $ents = unserialize(file_get_contents($serialized)); + + $TEXT = preg_replace_callback( + '|(&(\w+);)|', + function($matches) { + global $ents; return $ents[$matches[2]]; + }, + $TEXT + ); + +} + + +function write_debug($data) { + return; + if (!$handle = fopen(DOKU_INC . 'save.txt', 'a')) { + return; + } + + // Write $somecontent to our opened file. + fwrite($handle, "save.php: $data\n"); + fclose($handle); + +} +/* @auth Sergey Kotov */ +//linkPath is the link in the page +//pagePath is absolute path of the page (ns1:ns2:....:page or :ns1:ns2:....:page) +function abs2rel($linkPath,$pagePath){ + if ($linkPath[0]==='.'){ + // It's already relative + return $linkPath; + } + $aLink=explode(':',$linkPath); + $nLink=count($aLink); + if ($nLink<2){ + return $linkPath; + } + $aPage=explode(':',$pagePath); + if(empty($aLink[0])) { + // If linkPath is started by ':' + // Make canonical absolute path ns1:ns2:.....:pageLink (strip leading :) + array_shift($aLink); + if (--$nLink<2) { + return $linkPath; + } + } + + if(empty($aPage[0])) { + // If pagePath is started by ':' + // Make canonical absolute path ns1:ns2:.....:page (strip leading :) + array_shift($aPage); + } + $nPage=count($aPage); + $nslEqual=0; // count of equal namespaces from left to right + // Minimal length of these two arrays, page name is not included + $nMin=($nLink<$nPage ? $nLink : $nPage)-1 ; + for ($i=0;$i<$nMin;++$i){ + if ($aLink[$i]===$aPage[$i]){ + ++$nslEqual; + } + else { + break; + } + } + if ($nslEqual==0){ + // Link and page from different root namespaces + return $linkPath; + } + // Truncate equal lef namespaces + $aPageDiff=array_slice($aPage,$nslEqual); + $nPageDiff=count($aPageDiff); + $aLinkDiff=array_slice($aLink,$nslEqual); + + // Now we have to go up to nPageDiff-1 levels + $aResult=array(); + if ($nPageDiff>1){ + $aResult=array_fill(0,$nPageDiff-1,'..'); + } + else if($nPageDiff == 1) { + $aResult[] = '.'; + } + $aResult=array_merge($aResult,$aLinkDiff); + return implode(':', $aResult); +} + + +} //end of action class +?> diff --git a/lib/plugins/ckgedit/action/tagapi.php b/lib/plugins/ckgedit/action/tagapi.php new file mode 100644 index 0000000..fa9930f --- /dev/null +++ b/lib/plugins/ckgedit/action/tagapi.php @@ -0,0 +1,73 @@ + + */ + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); +class action_plugin_ckgedit_tagapi extends DokuWiki_Action_Plugin { + private $tagplugin = null; + /** + * Registers a callback function for a given event + * + * @param Doku_Event_Handler $controller DokuWiki's event controller object + * @return void + */ + public function register(Doku_Event_Handler $controller) { + + $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'handle_ajax_call_unknown'); + + } + + /** + * @param Doku_Event $event event object by reference + * @param mixed $param [the parameters passed as fifth argument to register_hook() when this + * handler was registered] + * @return void + */ + + public function handle_ajax_call_unknown(Doku_Event &$event, $param) { + if ($event->data !== 'tagapi_list') { + return; + } + $event->stopPropagation(); + $event->preventDefault(); + + if ($this->tagplugin = $this->loadHelper('tag')) { + $tags = $this->tagplugin->tagOccurrences(array(), NULL, true); + $a = print_r($tags,true); + // file_put_contents(DOKU_INC . 'tags.txt', $a); + } else { + $tags = array(); + } + + // sort tags by name ($tags is in the form $tag => $count) + ksort($tags); + echo '{"tags":['; + $firstelement = true; + foreach (array_keys($tags) as $tag) { + if ($firstelement) { + $firstelement = false; + } else { + echo ','; + } + echo '{"name":"'.$this->tagToName($tag).'","id":"'.$tag.'"}'; + } + echo']}'; + } + + private function tagToName($t) { + $exists = false; + $id = $t; + resolve_pageID($this->tagplugin->namespace, $id, $exists); + $name = p_get_first_heading($id, false); + if (empty($name)) { + $name = $t; + } else { + $name = $name; + } + return $name; + } +} \ No newline at end of file diff --git a/lib/plugins/ckgedit/admin.php b/lib/plugins/ckgedit/admin.php new file mode 100644 index 0000000..b72466e --- /dev/null +++ b/lib/plugins/ckgedit/admin.php @@ -0,0 +1,124 @@ + + * @license GPL 2 http://www.gnu.org/licenses/gpl-2.0.html +*/ + +require_once(DOKU_INC . 'lib/plugins/ckgedit/scripts/css6.php'); +class admin_plugin_ckgedit extends DokuWiki_Admin_Plugin { + + private $tpl_inc; + private $template; + private $alt; + function __construct() { + global $conf; + $this->template = $conf['template']; + $this->tpl_inc = tpl_incdir(); + } + + function handle() { + + if (!isset($_REQUEST['cmd'])) return; // first time - nothing to do + + $this->output = 'invalid'; + + if (!checkSecurityToken()) return; + if (!is_array($_REQUEST['cmd'])) return; + + switch (key($_REQUEST['cmd'])) { + case 'stylesheet' : { + $this->alt = ""; + $this->output = 'style_sheet_msg'; + break; + } + case 'alt_stylesheet' : { + $this->alt = $_REQUEST['templates']; + $this->output = 'alt_style_sheet_msg'; + break; + } + } + + + } + + /** + * output appropriate html + */ + function html() { + ptln(''); + ptln(''); + + ptln(''); + // output hidden values to ensure dokuwiki will return back to this plugin + ptln(' '); + ptln(' '); + formSecurityToken(); + + //Current style sheet + ptln('

    ' . $this->getLang('default_stylesheet') . ': (' .$this->template . ')
    '); + ptln(''); + ptln('  '); + ptln('

    '); + + // Other style sheet + $alt_val = isset($this->alt)?$this->alt: "" ; + ptln('

    ' . $this->getLang('alt_stylesheet') .'
    '); + ptln(''); + ptln(''); + ptln('

    '); + + if($this->output && $this->output == 'style_sheet_msg') { + $path = $this->tpl_inc; + ptln(htmlspecialchars($this->getLang($this->output)). " " .$this->template); + $retv = css_ckg_out($path); + $this->message($path, $retv); + + } + else if($this->output && $this->output == 'alt_style_sheet_msg') { + ptln(htmlspecialchars($this->getLang($this->output)). " " .$this->alt); + $path = str_replace('tpl/'.$this->template, 'tpl/'.$this->alt,$this->tpl_inc); + $retv = css_ckg_out($path,$this->alt); + $this->message($path, $retv); + } + + } + + function message($path, $which) { + $messages = array( + "Stylesheet saved to $path" . 'Styles/_style.css', + "Failed to save stylesheet to $path" . 'Styles/_style.css' + ); + $color = $which == 0? '#333': 'blue'; + ptln('
    '.htmlspecialchars($messages[$which]).''); + + } + + function templates($selected="") { + $dir = dirname($this->tpl_inc); + $files = scandir($dir); + $dir .= '/'; + $list = ""; + foreach ($files AS $file) { + if($file == '.' || $file == '..' || $file == $this->template) continue; + $entry = $dir . $file; + if(!is_writable($entry)) continue; + if(is_dir ($entry ) ) { + if($file == $selected) { + $list .= ""; + } + else $list .= ""; + } + } + + return $list; + } +} \ No newline at end of file diff --git a/lib/plugins/ckgedit/ckeditor/CHANGES.md b/lib/plugins/ckgedit/ckeditor/CHANGES.md new file mode 100644 index 0000000..9f37e50 --- /dev/null +++ b/lib/plugins/ckgedit/ckeditor/CHANGES.md @@ -0,0 +1,1703 @@ +CKEditor 4 Changelog +==================== + +## CKEditor 4.11.4 + +Fixed Issues: + +* [#589](https://github.com/ckeditor/ckeditor-dev/issues/589): Fixed: The editor causes memory leaks in create and destroy cycles. +* [#1397](https://github.com/ckeditor/ckeditor-dev/issues/1397): Fixed: Using the dialog to remove headers from a [table](https://ckeditor.com/cke4/addon/table) with one header row only throws an error. +* [#1479](https://github.com/ckeditor/ckeditor-dev/issues/1479): Fixed: [Justification](https://ckeditor.com/cke4/addon/justify) for styled content in BR mode is disabled. +* [#2816](https://github.com/ckeditor/ckeditor-dev/issues/2816): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) resize handler is visible in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html). +* [#2874](https://github.com/ckeditor/ckeditor-dev/issues/2874): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) resize handler is not created when the editor is initialized in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html). +* [#2775](https://github.com/ckeditor/ckeditor-dev/issues/2775): Fixed: [Clipboard](https://ckeditor.com/cke4/addon/clipboard) paste buttons have wrong state when [read-only](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html) mode is set by the mouse event listener with the [Div Editing Area](https://ckeditor.com/cke4/addon/divarea) plugin. +* [#1901](https://github.com/ckeditor/ckeditor-dev/issues/1901): Fixed: Cannot open the context menu over a [Widget](https://ckeditor.com/cke4/addon/widget) with the Shift+F10 keyboard shortcut. + +Other Changes: + +* Updated [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) and [SpellCheckAsYouType](https://ckeditor.com/cke4/addon/scayt) (SCAYT) plugins: + * Language dictionary update: German language was extended with over 600k new words. + * Language dictionary update: Swedish language was extended with over 300k new words. + * Grammar support added for Australian and New Zealand English, Polish, Slovak, Slovenian and Austrian languages. + * Changed wavy red and green lines that underline spelling and grammar errors to straight ones. + * [#55](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/55): Fixed: WSC does not use [`CKEDITOR.getUrl()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-getUrl) when referencing style sheets. + * [#166](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/166): Fixed: SCAYT does not use [`CKEDITOR.getUrl()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-getUrl) when referencing style sheets. + * [#56](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/56): [Chrome] Fixed: SCAYT/WSC throws errors when running inside a Chrome extension. + * Fixed: After removing a dictionary, the words are not underlined and considered as incorrect. + * Fixed: The Slovenian (`sl_SL`) language does not work. + * Fixed: Quotes with code `U+2019` (Right single quotation mark) are considered separators. + * Fixed: Wrong error message formatting when the service ID is invalid. + * Fixed: Absent languages in the Languages tab when using SCAYT with the [Shared Spaces](https://ckeditor.com/cke4/addon/sharedspace) plugin. + +## CKEditor 4.11.3 + +Fixed Issues: + +* [#2721](https://github.com/ckeditor/ckeditor-dev/issues/2721), [#487](https://github.com/ckeditor/ckeditor-dev/issues/487): Fixed: The order of sublist items is reversed when a higher level list item is removed. +* [#2527](https://github.com/ckeditor/ckeditor-dev/issues/2527): Fixed: [Emoji](https://ckeditor.com/cke4/addon/emoji) autocomplete order does not prioritize emojis with the name starting from the used string. +* [#2572](https://github.com/ckeditor/ckeditor-dev/issues/2572): Fixed: Icons in the [Emoji](https://ckeditor.com/cke4/addon/emoji) dropdown navigation groups are not centered. +* [#1191](https://github.com/ckeditor/ckeditor-dev/issues/1191): Fixed: Items in the [elements path](https://ckeditor.com/cke4/addon/elementspath) are draggable. +* [#2292](https://github.com/ckeditor/ckeditor-dev/issues/2292): Fixed: Dropping a list with a link on the editor's margin causes a console error and removes the dragged text from editor. +* [#2756](https://github.com/ckeditor/ckeditor-dev/issues/2756): Fixed: The [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin causes an error when typing in the [source editing mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_sourcearea.html). +* [#1986](https://github.com/ckeditor/ckeditor-dev/issues/1986): Fixed: The Cell Properties dialog from the [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin shows styles that are not allowed through [`config.allowedContent`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-allowedContent). +* [#2565](https://github.com/ckeditor/ckeditor-dev/issues/2565): [IE, Edge] Fixed: Buttons in the [editor toolbar](https://ckeditor.com/cke4/addon/toolbar) are activated by clicking them with the right mouse button. +* [#2792](https://github.com/ckeditor/ckeditor-dev/pull/2792): Fixed: A bug in the [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting) plugin that caused the following issues: + * [#2780](https://github.com/ckeditor/ckeditor-dev/issues/2780): Fixed: Undo steps disappear after multiple changes of selection. + * [#2470](https://github.com/ckeditor/ckeditor-dev/issues/2470): [Firefox] Fixed: Widget's nested editable gets blurred upon focus. + * [#2655](https://github.com/ckeditor/ckeditor-dev/issues/2655): [Chrome, Safari] Fixed: Widget's nested editable cannot be focused under certain circumstances. + +## CKEditor 4.11.2 + +Fixed Issues: + +* [#2403](https://github.com/ckeditor/ckeditor-dev/issues/2403): Fixed: Styling inline editor initialized inside a table with the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin is causing style leaks. +* [#2514](https://github.com/ckeditor/ckeditor-dev/issues/2403): Fixed: Pasting table data into inline editor initialized inside a table with the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin inserts pasted content into the wrapping table. +* [#2451](https://github.com/ckeditor/ckeditor-dev/issues/2451): Fixed: The [Remove Format](https://ckeditor.com/cke4/addon/removeformat) plugin changes selection. +* [#2546](https://github.com/ckeditor/ckeditor-dev/issues/2546): Fixed: The separator in the toolbar moves when buttons are focused. +* [#2506](https://github.com/ckeditor/ckeditor-dev/issues/2506): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) throws a type error when an empty `
    ` tag with an `image` class is upcasted. +* [#2650](https://github.com/ckeditor/ckeditor-dev/issues/2650): Fixed: [Table](https://ckeditor.com/cke4/addon/table) dialog validator fails when the `getValue()` function is defined in the global scope. +* [#2690](https://github.com/ckeditor/ckeditor-dev/issues/2690): Fixed: Decimal characters are removed from the inside of numbered lists when pasting content using the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#2205](https://github.com/ckeditor/ckeditor-dev/issues/2205): Fixed: It is not possible to add new list items under an item containing a block element. +* [#2411](https://github.com/ckeditor/ckeditor-dev/issues/2411), [#2438](https://github.com/ckeditor/ckeditor-dev/issues/2438) Fixed: Apply numbered list option throws a console error for a specific markup. +* [#2430](https://github.com/ckeditor/ckeditor-dev/issues/2430) Fixed: [Color Button](https://ckeditor.com/cke4/addon/colorbutton) and [List Block](https://ckeditor.com/cke4/addon/listblock) items are draggable. + +Other Changes: + +* Updated the [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugin: + * [#52](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/52) Fixed: Clicking "Finish Checking" without a prior action would hang the Spell Checking dialog. +* [#2603](https://github.com/ckeditor/ckeditor-dev/issues/2603): Corrected the GPL license entry in the `package.json` file. + +## CKEditor 4.11.1 + +Fixed Issues: + +* [#2571](https://github.com/ckeditor/ckeditor-dev/issues/2571): Fixed: Clicking the categories in the [Emoji](https://ckeditor.com/cke4/addon/emoji) dropdown panel scrolls the entire page. + +## CKEditor 4.11 + +**Security Updates:** + +* Fixed XSS vulnerability in the HTML parser reported by [maxarr](https://hackerone.com/maxarr). + + Issue summary: It was possible to execute XSS inside CKEditor after persuading the victim to: (i) switch CKEditor to source mode, then (ii) paste a specially crafted HTML code, prepared by the attacker, into the opened CKEditor source area, and (iii) switch back to WYSIWYG mode. + +**An upgrade is highly recommended!** + +New Features: + +* [#2062](https://github.com/ckeditor/ckeditor-dev/pull/2062): Added the emoji dropdown that allows the user to choose the emoji from the toolbar and search for them using keywords. +* [#2154](https://github.com/ckeditor/ckeditor-dev/issues/2154): The [Link](https://ckeditor.com/cke4/addon/link) plugin now supports phone number links. +* [#1815](https://github.com/ckeditor/ckeditor-dev/issues/1815): The [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin supports typing link completion. +* [#2478](https://github.com/ckeditor/ckeditor-dev/issues/2478): [Link](https://ckeditor.com/cke4/addon/link) can be inserted using the Ctrl/Cmd + K keystroke. +* [#651](https://github.com/ckeditor/ckeditor-dev/issues/651): Text pasted using the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin preserves indentation in paragraphs. +* [#2248](https://github.com/ckeditor/ckeditor-dev/issues/2248): Added support for justification in the [BBCode](https://ckeditor.com/cke4/addon/bbcode) plugin. Thanks to [Matěj Kmínek](https://github.com/KminekMatej)! +* [#706](https://github.com/ckeditor/ckeditor-dev/issues/706): Added a different cursor style when selecting cells for the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin. +* [#2072](https://github.com/ckeditor/ckeditor-dev/issues/2072): The [UI Button](https://ckeditor.com/cke4/addon/button) plugin supports custom `aria-haspopup` property values. The [Menu Button](https://ckeditor.com/cke4/addon/menubutton) `aria-haspopup` value is now `menu`, the [Panel Button](https://ckeditor.com/cke4/addon/panelbutton) and [Rich Combo](https://ckeditor.com/cke4/addon/richcombo) `aria-haspopup` value is now `listbox`. +* [#1176](https://github.com/ckeditor/ckeditor-dev/pull/1176): The [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) can now be attached to a selection instead of an element. +* [#2202](https://github.com/ckeditor/ckeditor-dev/issues/2202): Added the `contextmenu_contentsCss` configuration option to allow adding custom CSS to the [Context Menu](https://ckeditor.com/cke4/addon/contextmenu). + +Fixed Issues: + +* [#1477](https://github.com/ckeditor/ckeditor-dev/issues/1477): Fixed: On destroy, [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) does not destroy its content. +* [#2394](https://github.com/ckeditor/ckeditor-dev/issues/2394): Fixed: [Emoji](https://ckeditor.com/cke4/addon/emoji) dropdown does not show up with repeated symbols in a single line. +* [#1181](https://github.com/ckeditor/ckeditor-dev/issues/1181): [Chrome] Fixed: Opening the context menu in a read-only editor results in an error. +* [#2276](https://github.com/ckeditor/ckeditor-dev/issues/2276): [iOS] Fixed: [Button](https://ckeditor.com/cke4/addon/button) state does not refresh properly. +* [#1489](https://github.com/ckeditor/ckeditor-dev/issues/1489): Fixed: Table contents can be removed in read-only mode when the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin is used. +* [#1264](https://github.com/ckeditor/ckeditor-dev/issues/1264) Fixed: Right-click does not clear the selection created with the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin. +* [#586](https://github.com/ckeditor/ckeditor-dev/issues/586) Fixed: The `required` attribute is not correctly recognized by the [Form Elements](https://ckeditor.com/cke4/addon/forms) plugin dialog. Thanks to [Roli Züger](https://github.com/rzueger)! +* [#2380](https://github.com/ckeditor/ckeditor-dev/issues/2380) Fixed: Styling HTML comments in a top-level element results in extra paragraphs. +* [#2294](https://github.com/ckeditor/ckeditor-dev/issues/2294) Fixed: Pasting content from Microsoft Outlook and then bolding it results in an error. +* [#2035](https://github.com/ckeditor/ckeditor-dev/issues/2035) [Edge] Fixed: `Permission denied` is thrown when opening a [Panel](https://ckeditor.com/cke4/addon/panel) instance. +* [#965](https://github.com/ckeditor/ckeditor-dev/issues/965) Fixed: The [`config.forceSimpleAmpersand`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-forceSimpleAmpersand) option does not work. Thanks to [Alex Maris](https://github.com/alexmaris)! +* [#2448](https://github.com/ckeditor/ckeditor-dev/issues/2448): Fixed: The [`Escape HTML Entities`] plugin with custom [additional entities](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-entities_additional) configuration breaks HTML escaping. +* [#898](https://github.com/ckeditor/ckeditor-dev/issues/898): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) long alternative text protrudes into the editor when the image is selected. +* [#1113](https://github.com/ckeditor/ckeditor-dev/issues/1113): [Firefox] Fixed: Nested contenteditable elements path is not updated on focus with the [Div Editing Area](https://ckeditor.com/cke4/addon/divarea) plugin. +* [#1682](https://github.com/ckeditor/ckeditor-dev/issues/1682) Fixed: Hovering the [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) panel changes its size, causing flickering. +* [#421](https://github.com/ckeditor/ckeditor-dev/issues/421) Fixed: Expandable [Button](https://ckeditor.com/cke4/addon/button) puts the `(Selected)` text at the end of the label when clicked. +* [#1454](https://github.com/ckeditor/ckeditor-dev/issues/1454): Fixed: The [`onAbort`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-onAbort) method of the [Upload Widget](https://ckeditor.com/cke4/addon/uploadwidget) is not called when the loader is aborted. +* [#1451](https://github.com/ckeditor/ckeditor-dev/issues/1451): Fixed: The context menu is incorrectly positioned when opened with Shift+F10. +* [#1722](https://github.com/ckeditor/ckeditor-dev/issues/1722): [`CKEDITOR.filter.instances`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_filter.html#static-property-instances) is causing memory leaks. +* [#2491](https://github.com/ckeditor/ckeditor-dev/issues/2491): Fixed: The [Mentions](https://ckeditor.com/cke4/addon/mentions) plugin is not matching diacritic characters. +* [#2519](https://github.com/ckeditor/ckeditor-dev/issues/2519): Fixed: The [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) dialog should display all available keystrokes for a single command. + +API Changes: + +* [#2453](https://github.com/ckeditor/ckeditor-dev/issues/2453): The [`CKEDITOR.ui.panel.block.getItems`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_panel_block.html#method-getItems) method now also returns `input` elements in addition to links. +* [#2224](https://github.com/ckeditor/ckeditor-dev/issues/2224): The [`CKEDITOR.tools.convertToPx`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-convertToPx) function now converts negative values. +* [#2253](https://github.com/ckeditor/ckeditor-dev/issues/2253): The widget definition [`insert`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-insert) method now passes `editor` and `commandData`. Thanks to [marcparmet](https://github.com/marcparmet)! +* [#2045](https://github.com/ckeditor/ckeditor-dev/issues/2045): Extracted [`tools.eventsBuffer`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-eventsBuffer) and [`tools.throttle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-throttle) functions logic into a separate namespace. + * [`tools.eventsBuffer`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-eventsBuffer) was extracted into [`tools.buffers.event`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_buffers_event.html), + * [`tools.throttle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-throttle) was extracted into [`tools.buffers.throttle`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_buffers_throttle.html). +* [#2466](https://github.com/ckeditor/ckeditor-dev/issues/2466): The [`CKEDITOR.filter`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-constructor) constructor accepts an additional `rules` parameter allowing to bind the editor and filter together. +* [#2493](https://github.com/ckeditor/ckeditor-dev/issues/2493): The [`editor.getCommandKeystroke`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getCommandKeystroke) method accepts an additional `all` parameter allowing to retrieve an array of all command keystrokes. +* [#2483](https://github.com/ckeditor/ckeditor-dev/issues/2483): Button's DOM element created with the [`hasArrow`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui.html#method-addButton) definition option can by identified by the `.cke_button_expandable` CSS class. + +Other Changes: + +* [#1713](https://github.com/ckeditor/ckeditor-dev/issues/1713): Removed the redundant `lang.title` entry from the [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin. + +## CKEditor 4.10.1 + +Fixed Issues: + +* [#2114](https://github.com/ckeditor/ckeditor-dev/issues/2114): Fixed: [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) cannot be initialized before [`instanceReady`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-instanceReady). +* [#2107](https://github.com/ckeditor/ckeditor-dev/issues/2107): Fixed: Holding and releasing the mouse button is not inserting an [autocomplete](https://ckeditor.com/cke4/addon/autocomplete) suggestion. +* [#2167](https://github.com/ckeditor/ckeditor-dev/issues/2167): Fixed: Matching in [Emoji](https://ckeditor.com/cke4/addon/emoji) plugin is not case insensitive. +* [#2195](https://github.com/ckeditor/ckeditor-dev/issues/2195): Fixed: [Emoji](https://ckeditor.com/cke4/addon/emoji) shows the suggestion box when the colon is preceded with other characters than white space. +* [#2169](https://github.com/ckeditor/ckeditor-dev/issues/2169): [Edge] Fixed: Error thrown when pasting into the editor. +* [#1084](https://github.com/ckeditor/ckeditor-dev/issues/1084) Fixed: Using the "Automatic" option with [Color Button](https://ckeditor.com/cke4/addon/colorbutton) on a text with the color already defined sets an invalid color value. +* [#2271](https://github.com/ckeditor/ckeditor-dev/issues/2271): Fixed: Custom color name not used as a label in the [Color Button](https://ckeditor.com/cke4/addon/image2) plugin. Thanks to [Eric Geloen](https://github.com/egeloen)! +* [#2296](https://github.com/ckeditor/ckeditor-dev/issues/2296): Fixed: The [Color Button](https://ckeditor.com/cke4/addon/colorbutton) plugin throws an error when activated on content containing HTML comments. +* [#966](https://github.com/ckeditor/ckeditor-dev/issues/966): Fixed: Executing [`editor.destroy()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-destroy) during the [file upload](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-onUploading) throws an error. Thanks to [Maksim Makarevich](https://github.com/MaksimMakarevich)! +* [#1719](https://github.com/ckeditor/ckeditor-dev/issues/1719): Fixed: Ctrl/Cmd + A inadvertently focuses inline editor if it is starting and ending with a list. Thanks to [theNailz](https://github.com/theNailz)! +* [#1046](https://github.com/ckeditor/ckeditor-dev/issues/1046): Fixed: Subsequent new links do not include the `id` attribute. Thanks to [Nathan Samson](https://github.com/nathansamson)! +* [#1348](https://github.com/ckeditor/ckeditor-dev/issues/1348): Fixed: [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugin aspect ratio locking uses an old width and height on image URL change. +* [#1791](https://github.com/ckeditor/ckeditor-dev/issues/1791): Fixed: [Image](https://ckeditor.com/cke4/addon/image) and [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugins can be enabled when [Easy Image](https://ckeditor.com/cke4/addon/easyimage) is present. +* [#2254](https://github.com/ckeditor/ckeditor-dev/issues/2254): Fixed: [Image](https://ckeditor.com/cke4/addon/image) ratio locking is too precise for resized images. Thanks to [Jonathan Gilbert](https://github.com/logiclrd)! +* [#1184](https://github.com/ckeditor/ckeditor-dev/issues/1184): [IE8-11] Fixed: Copying and pasting data in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-readOnly) throws an error. +* [#1916](https://github.com/ckeditor/ckeditor-dev/issues/1916): [IE9-11] Fixed: Pressing the Delete key in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-readOnly) throws an error. +* [#2003](https://github.com/ckeditor/ckeditor-dev/issues/2003): [Firefox] Fixed: Right-clicking multiple selected table cells containing empty paragraphs removes the selection. +* [#1816](https://github.com/ckeditor/ckeditor-dev/issues/1816): Fixed: Table breaks when Enter is pressed over the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin. +* [#1115](https://github.com/ckeditor/ckeditor-dev/issues/1115): Fixed: The `` tag is not preserved when proper configuration is provided and a style is applied by the [Font](https://ckeditor.com/cke4/addon/font) plugin. +* [#727](https://github.com/ckeditor/ckeditor-dev/issues/727): Fixed: Custom styles may be invisible in the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin. +* [#988](https://github.com/ckeditor/ckeditor-dev/issues/988): Fixed: ACF-enabled custom elements prefixed with `object`, `embed`, `param` are removed from the editor content. + +API Changes: + +* [#2249](https://github.com/ckeditor/ckeditor-dev/issues/1791): Added the [`editor.plugins.detectConflict()`](https://ckeditor.com/docs/ckeditor4/latest/CKEDITOR_editor_plugins.html#method-detectConflict) method finding conflicts between provided plugins. + +## CKEditor 4.10 + +New Features: + +* [#1751](https://github.com/ckeditor/ckeditor-dev/issues/1751): Introduced the **Autocomplete** feature that consists of the following plugins: + * [Autocomplete](https://ckeditor.com/cke4/addon/autocomplete) – Provides contextual completion feature for custom text matches based on user input. + * [Text Watcher](https://ckeditor.com/cke4/addon/textWatcher) – Checks whether an editor's text change matches the chosen criteria. + * [Text Match](https://ckeditor.com/cke4/addon/textMatch) – Allows to search [`CKEDITOR.dom.range`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html) for matching text. +* [#1703](https://github.com/ckeditor/ckeditor-dev/issues/1703): Introduced the [Mentions](https://ckeditor.com/cke4/addon/mentions) plugin providing smart completion feature for custom text matches based on user input starting with a chosen marker character. +* [#1746](https://github.com/ckeditor/ckeditor-dev/issues/1703): Introduced the [Emoji](https://ckeditor.com/cke4/addon/emoji) plugin providing completion feature for emoji ideograms. +* [#1761](https://github.com/ckeditor/ckeditor-dev/issues/1761): The [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin now supports email links. + +Fixed Issues: + +* [#1458](https://github.com/ckeditor/ckeditor-dev/issues/1458): [Edge] Fixed: After blurring the editor it takes 2 clicks to focus a widget. +* [#1034](https://github.com/ckeditor/ckeditor-dev/issues/1034): Fixed: JAWS leaves forms mode after pressing the Enter key in an inline editor instance. +* [#1748](https://github.com/ckeditor/ckeditor-dev/pull/1748): Fixed: Missing [`CKEDITOR.dialog.definition.onHide`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dialog_definition.html#property-onHide) API documentation. Thanks to [sunnyone](https://github.com/sunnyone)! +* [#1321](https://github.com/ckeditor/ckeditor-dev/issues/1321): Fixed: Ideographic space character (`\u3000`) is lost when pasting text. +* [#1776](https://github.com/ckeditor/ckeditor-dev/issues/1776): Fixed: Empty caption placeholder of the [Image Base](https://ckeditor.com/cke4/addon/imagebase) plugin is not hidden when blurred. +* [#1592](https://github.com/ckeditor/ckeditor-dev/issues/1592): Fixed: The [Image Base](https://ckeditor.com/cke4/addon/imagebase) plugin caption is not visible after paste. +* [#620](https://github.com/ckeditor/ckeditor-dev/issues/620): Fixed: The [`config.forcePasteAsPlainText`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-forcePasteAsPlainText) option is not respected in internal and cross-editor pasting. +* [#1467](https://github.com/ckeditor/ckeditor-dev/issues/1467): Fixed: The resizing cursor of the [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin appearing in the middle of a merged cell. + +API Changes: + +* [#850](https://github.com/ckeditor/ckeditor-dev/issues/850): Backward incompatibility: Replaced the `replace` dialog from the [Find / Replace](https://ckeditor.com/cke4/addon/find) plugin with a `tabId` option in the `find` command. +* [#1582](https://github.com/ckeditor/ckeditor-dev/issues/1582): The [`CKEDITOR.editor.addCommand()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-addCommand) method can now accept a [`CKEDITOR.command`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_command.html) instance as a parameter. +* [#1712](https://github.com/ckeditor/ckeditor-dev/issues/1712): The [`extraPlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-extraPlugins), [`removePlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-removePlugins) and [`plugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-plugins) configuration options allow whitespace. +* [#1802](https://github.com/ckeditor/ckeditor-dev/issues/1802): The [`extraPlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-extraPlugins), [`removePlugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-removePlugins) and [`plugins`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-plugins) configuration options allow passing plugin names as an array. +* [#1724](https://github.com/ckeditor/ckeditor-dev/issues/1724): Added an option to the [`getClientRect()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_element.html#method-getClientRect) function allowing to retrieve an absolute bounding rectangle of the element, i.e. a position relative to the upper-left corner of the topmost viewport. +* [#1498](https://github.com/ckeditor/ckeditor-dev/issues/1498) : Added a new [`getClientRects()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-getClientRects) method to `CKEDITOR.dom.range`. It returns a list of rectangles for each selected element. +* [#1993](https://github.com/ckeditor/ckeditor-dev/issues/1993): Added the [`CKEDITOR.tools.throttle()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-throttle) function. + +Other Changes: + +* Updated [SCAYT](https://ckeditor.com/cke4/addon/scayt) (Spell Check As You Type) and [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugins: + * Language dictionary update: Added support for the Uzbek Latin language. + * Languages no longer supported as additional languages: Manx - Isle of Man (`gv_GB`) and Interlingua (`ia_XR`). + * Extended and improved language dictionaries: Georgian and Swedish. Also added the missing word _"Ensure"_ to the American, British and Canada English language. + * [#141](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/141) Fixed: SCAYT throws "Uncaught Error: Error in RangyWrappedRange module: createRange(): Parameter must be a Window object or DOM node". + * [#153](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/153) [Chrome] Fixed: Correcting a word in the widget in SCAYT moves focus to another editable. + * [#155](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/155) [IE8] Fixed: SCAYT throws an error and does not work. + * [#156](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/156) [IE10] Fixed: SCAYT does not seem to work. + * Fixed: After some text is dragged and dropped, the markup is not refreshed for grammar problems in SCAYT. + * Fixed: Request to FastCGI fails when the user tries to replace a word with non-English characters with a proper suggestion in WSC. + * [Firefox] Fixed: Ctrl+Z removes focus in SCAYT. + * Grammar support for default languages was improved. + * New application source URL was added in SCAYT. + * Removed green marks and legend related to grammar-supported languages in the Languages tab of SCAYT. Grammar is now supported for almost all the anguages in the list for an additional fee. + * Fixed: JavaScript error in the console: "Cannot read property 'split' of undefined" in SCAYT and WSC. + * [IE10] Fixed: Markup is not set for a specific case in SCAYT. + * Fixed: Accessibility issue: No `alt` attribute for the logo image in the About tab of SCAYT. + +## CKEditor 4.9.2 + +**Security Updates:** + +* Fixed XSS vulnerability in the [Enhanced Image](https://ckeditor.com/cke4/addon/image2) (`image2`) plugin reported by [Kyaw Min Thein](https://twitter.com/kyawminthein99). + + Issue summary: It was possible to execute XSS inside CKEditor using the `` tag and specially crafted HTML. Please note that the default presets (Basic/Standard/Full) do not include this plugin, so you are only at risk if you made a custom build and enabled this plugin. + +We would like to thank the [Drupal security team](https://www.drupal.org/drupal-security-team) for bringing this matter to our attention and coordinating the fix and release process! + +## CKEditor 4.9.1 + +Fixed Issues: + +* [#1835](https://github.com/ckeditor/ckeditor-dev/issues/1835): Fixed: Integration between [CKFinder](https://ckeditor.com/ckeditor-4/ckfinder/) and the [File Browser](https://ckeditor.com/cke4/addon/filebrowser) plugin does not work. + +## CKEditor 4.9 + +New Features: + +* [#932](https://github.com/ckeditor/ckeditor-dev/issues/932): Introduced Easy Image feature for inserting images that are automatically rescaled, optimized, responsive and delivered through a blazing-fast CDN. Three new plugins were added to support it: + * [Easy Image](https://ckeditor.com/cke4/addon/easyimage), + * [Cloud Services](https://ckeditor.com/cke4/addon/cloudservices) + * [Image Base](https://ckeditor.com/cke4/addon/imagebase) +* [#1338](https://github.com/ckeditor/ckeditor-dev/issues/1338): Keystroke labels are displayed for function keys (like F7, F8). +* [#643](https://github.com/ckeditor/ckeditor-dev/issues/643): The [File Browser](https://ckeditor.com/cke4/addon/filebrowser) plugin can now upload files using XHR requests. This allows for setting custom HTTP headers using the [`config.fileTools_requestHeaders`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-fileTools_requestHeaders) configuration option. +* [#1365](https://github.com/ckeditor/ckeditor-dev/issues/1365): The [File Browser](https://ckeditor.com/cke4/addon/filebrowser) plugin uses XHR requests by default. +* [#1399](https://github.com/ckeditor/ckeditor-dev/issues/1399): Added the possibility to set [`CKEDITOR.config.startupFocus`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-startupFocus) as `start` or `end` to specify where the editor focus should be after the initialization. +* [#1441](https://github.com/ckeditor/ckeditor-dev/issues/1441): The [Magic Line](https://ckeditor.com/cke4/addon/magicline) plugin line element can now be identified by the `data-cke-magic-line="1"` attribute. + +Fixed Issues: + +* [#595](https://github.com/ckeditor/ckeditor-dev/issues/595): Fixed: Pasting does not work on mobile devices. +* [#869](https://github.com/ckeditor/ckeditor-dev/issues/869): Fixed: Empty selection clears cached clipboard data in the editor. +* [#1419](https://github.com/ckeditor/ckeditor-dev/issues/1419): Fixed: The [Widget Selection](https://ckeditor.com/cke4/addon/widgetselection) plugin selects the editor content with the Alt+A key combination on Windows. +* [#1274](https://github.com/ckeditor/ckeditor-dev/issues/1274): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) does not match a single selected image using the [`contextDefinition.cssSelector`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_balloontoolbar_contextDefinition.html#property-cssSelector) matcher. +* [#1232](https://github.com/ckeditor/ckeditor-dev/issues/1232): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) buttons should be registered as focusable elements. +* [#1342](https://github.com/ckeditor/ckeditor-dev/issues/1342): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) should be re-positioned after the [`change`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-change) event. +* [#1426](https://github.com/ckeditor/ckeditor-dev/issues/1426): [IE8-9] Fixed: Missing [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) background in the [Kama](https://ckeditor.com/cke4/addon/kama) skin. Thanks to [Christian Elmer](https://github.com/keinkurt)! +* [#1470](https://github.com/ckeditor/ckeditor-dev/issues/1470): Fixed: [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) is not visible after drag and drop of a widget it is attached to. +* [#1048](https://github.com/ckeditor/ckeditor-dev/issues/1048): Fixed: [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) is not positioned properly when a margin is added to its non-static parent. +* [#889](https://github.com/ckeditor/ckeditor-dev/issues/889): Fixed: Unclear error message for width and height fields in the [Image](https://ckeditor.com/cke4/addon/image) and [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugins. +* [#859](https://github.com/ckeditor/ckeditor-dev/issues/859): Fixed: Cannot edit a link after a double-click on the text in the link. +* [#1013](https://github.com/ckeditor/ckeditor-dev/issues/1013): Fixed: [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) does not work correctly with the [`config.forcePasteAsPlainText`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-forcePasteAsPlainText) option. +* [#1356](https://github.com/ckeditor/ckeditor-dev/issues/1356): Fixed: [Border parse function](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_style_parse.html#method-border) does not allow spaces in the color value. +* [#1010](https://github.com/ckeditor/ckeditor-dev/issues/1010): Fixed: The CSS `border` shorthand property was incorrectly expanded ignoring the `border-color` style. +* [#1535](https://github.com/ckeditor/ckeditor-dev/issues/1535): Fixed: [Widget](https://ckeditor.com/cke4/addon/widget) mouseover border contrast is insufficient. +* [#1516](https://github.com/ckeditor/ckeditor-dev/issues/1516): Fixed: Fake selection allows removing content in read-only mode using the Backspace and Delete keys. +* [#1570](https://github.com/ckeditor/ckeditor-dev/issues/1570): Fixed: Fake selection allows cutting content in read-only mode using the Ctrl/Cmd + X keys. +* [#1363](https://github.com/ckeditor/ckeditor-dev/issues/1363): Fixed: Paste notification is unclear and it might confuse users. + +API Changes: + +* [#1346](https://github.com/ckeditor/ckeditor-dev/issues/1346): [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) [context manager API](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.plugins.balloontoolbar.contextManager.html) is now available in the [`pluginDefinition.init()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_pluginDefinition.html#method-init) method of the [requiring](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_pluginDefinition.html#property-requires) plugin. +* [#1530](https://github.com/ckeditor/ckeditor-dev/issues/1530): Added the possibility to use custom icons for [buttons](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_button.html.html). + +Other Changes: + +* Updated [SCAYT](https://ckeditor.com/cke4/addon/scayt) (Spell Check As You Type) and [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) (WSC) plugins: + * SCAYT [`scayt_minWordLength`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#scayt_minWordLength) configuration option now defaults to 3 instead of 4. + * SCAYT default number of suggested words in the context menu changed to 3. + * [#90](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/90): Fixed: Selection is lost on link creation if SCAYT highlights the word. + * Fixed: SCAYT crashes when the browser `localStorage` is disabled. + * [IE11] Fixed: `Unable to get property type of undefined or null reference` error in the browser console when SCAYT is disabled/enabled. + * [#46](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/46): Fixed: Editing is blocked when remote spell checker server is offline. + * Fixed: User Dictionary cannot be created in WSC due to `You already have the dictionary` error. + * Fixed: Words with apostrophe `'` on the replacement make the WSC dialog inaccessible. + * Fixed: SCAYT/WSC causes the `Uncaught TypeError` error in the browser console. +* [#1337](https://github.com/ckeditor/ckeditor-dev/issues/1337): Updated the samples layout with the new CKEditor 4 logo and color scheme. +* [#1591](https://github.com/ckeditor/ckeditor-dev/issues/1591): CKBuilder and language tools are now downloaded over HTTPS. Thanks to [August Detlefsen](https://github.com/augustd)! + +## CKEditor 4.8 + +**Important Notes:** + +* [#1249](https://github.com/ckeditor/ckeditor-dev/issues/1249): Enabled the [Upload Image](https://ckeditor.com/cke4/addon/uploadimage) plugin by default in standard and full presets. Also, it will no longer log an error in case of missing [`config.imageUploadUrl`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-imageUploadUrl) property. + +New Features: + +* [#933](https://github.com/ckeditor/ckeditor-dev/issues/933): Introduced [Balloon Toolbar](https://ckeditor.com/cke4/addon/balloontoolbar) plugin. +* [#662](https://github.com/ckeditor/ckeditor-dev/issues/662): Introduced image inlining for the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#468](https://github.com/ckeditor/ckeditor-dev/issues/468): [Edge] Introduced support for the Clipboard API. +* [#607](https://github.com/ckeditor/ckeditor-dev/issues/607): Manually inserted Hex color is prefixed with a hash character (`#`) if needed. It ensures a valid Hex color value is used when setting the table cell border or background color with the [Color Dialog](https://ckeditor.com/cke4/addon/colordialog) window. +* [#584](https://github.com/ckeditor/ckeditor-dev/issues/584): [Font size and Family](https://ckeditor.com/cke4/addon/font) and [Format](https://ckeditor.com/cke4/addon/format) drop-downs are not toggleable anymore. Default option to reset styles added. +* [#856](https://github.com/ckeditor/ckeditor-dev/issues/856): Introduced the [`CKEDITOR.tools.keystrokeToArray()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools.html#method-keystrokeToArray) method. It converts a keystroke into its string representation, returning every key name as a separate array element. +* [#1053](https://github.com/ckeditor/ckeditor-dev/issues/1053): Introduced the [`CKEDITOR.tools.object.merge()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_object.html#method-merge) method. It allows to merge two objects, returning the new object with all properties from both objects deeply cloned. +* [#1073](https://github.com/ckeditor/ckeditor-dev/issues/1073): Introduced the [`CKEDITOR.tools.array.every()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_tools_array.html#method-every) method. It invokes a given test function on every array element and returns `true` if all elements pass the test. + +Fixed Issues: + +* [#796](https://github.com/ckeditor/ckeditor-dev/issues/796): Fixed: A list is pasted from OneNote in the reversed order. +* [#834](https://github.com/ckeditor/ckeditor-dev/issues/834): [IE9-11] Fixed: The editor does not save the selected state of radio buttons inserted by the [Form Elements](https://ckeditor.com/cke4/addon/forms) plugin. +* [#704](https://github.com/ckeditor/ckeditor-dev/issues/704): [Edge] Fixed: Using Ctrl/Cmd + Z breaks widget structure. +* [#591](https://github.com/ckeditor/ckeditor-dev/issues/591): Fixed: A column is inserted in a wrong order inside the table if any cell has a vertical split. +* [#787](https://github.com/ckeditor/ckeditor-dev/issues/787): Fixed: Using Cut inside a nested table does not cut the selected content. +* [#842](https://github.com/ckeditor/ckeditor-dev/issues/842): Fixed: List style not restored when toggling list indent level in the [Indent List](https://ckeditor.com/cke4/addon/indentlist) plugin. +* [#711](https://github.com/ckeditor/ckeditor-dev/issues/711): Fixed: Dragging widgets should only work with the left mouse button. +* [#862](https://github.com/ckeditor/ckeditor-dev/issues/862): Fixed: The "Object Styles" group in the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin is visible only if the whole element is selected. +* [#994](https://github.com/ckeditor/ckeditor-dev/pull/994): Fixed: Typo in the [`CKEDITOR.focusManager.focus()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_focusManager.html#method-focus) API documentation. Thanks to [benjy](https://github.com/benjy)! +* [#1014](https://github.com/ckeditor/ckeditor-dev/issues/1014): Fixed: The [Table Tools](https://ckeditor.com/cke4/addon/tabletools) Cell Properties dialog is now [Advanced Content Filter](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_acf.html) aware — it is not possible to change the cell width or height if corresponding styles are disabled. +* [#877](https://github.com/ckeditor/ckeditor-dev/issues/877): Fixed: A list with custom bullets with exotic characters crashes the editor when [pasted from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#605](https://github.com/ckeditor/ckeditor-dev/issues/605): Fixed: Inline widgets do not preserve trailing spaces. +* [#1008](https://github.com/ckeditor/ckeditor-dev/issues/1008): Fixed: Shorthand Hex colors from the [`config.colorButton_colors`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-colorButton_colors) option are not correctly highlighted in the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) Text Color or Background Color panel. +* [#1094](https://github.com/ckeditor/ckeditor-dev/issues/1094): Fixed: Widget definition [`upcast`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-upcasts) methods are called for every element. +* [#1057](https://github.com/ckeditor/ckeditor-dev/issues/1057): Fixed: The [Notification](https://ckeditor.com/addon/notification) plugin overwrites Web Notifications API due to leakage to the global scope. +* [#1068](https://github.com/ckeditor/ckeditor-dev/issues/1068): Fixed: Upload widget paste listener ignores changes to the [`uploadWidgetDefinition`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.fileTools.uploadWidgetDefinition.html). +* [#921](https://github.com/ckeditor/ckeditor-dev/issues/921): Fixed: [Edge] CKEditor erroneously perceives internal copy and paste as type "external". +* [#1213](https://github.com/ckeditor/ckeditor-dev/issues/1213): Fixed: Multiple images uploaded using [Upload Image](https://ckeditor.com/cke4/addon/uploadimage) plugin are randomly duplicated or mangled. +* [#532](https://github.com/ckeditor/ckeditor-dev/issues/532): Fixed: Removed an outdated user guide link from the [About](https://ckeditor.com/cke4/addon/about) dialog. +* [#1221](https://github.com/ckeditor/ckeditor-dev/issues/1221): Fixed: Invalid CSS loaded by [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) plugin when [`config.skin`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-skin) is loaded using a custom path. +* [#522](https://github.com/ckeditor/ckeditor-dev/issues/522): Fixed: Widget selection is not removed when widget is inside table cell with [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin enabled. +* [#1027](https://github.com/ckeditor/ckeditor-dev/issues/1027): Fixed: Cannot add multiple images to the table with [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin in certain situations. +* [#1069](https://github.com/ckeditor/ckeditor-dev/issues/1069): Fixed: Wrong shape processing by [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#995](https://github.com/ckeditor/ckeditor-dev/issues/995): Fixed: Hyperlinked image gets inserted twice by [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#1287](https://github.com/ckeditor/ckeditor-dev/issues/1287): Fixed: [Widget](https://ckeditor.com/cke4/addon/widget) plugin throws exception if included in editor build but not loaded into editor's instance. + +API Changes: + +* [#1097](https://github.com/ckeditor/ckeditor-dev/issues/1097): Widget [`upcast`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget_definition.html#property-upcast) methods are now called in the [widget definition's](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_plugins_widget.html#property-definition) context. +* [#1118](https://github.com/ckeditor/ckeditor-dev/issues/1118): Added the `show` option in the [`balloonPanel.attach()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_ui_balloonPanel.html#method-attach) method, allowing to attach a hidden [Balloon Panel](https://ckeditor.com/cke4/addon/balloonpanel) instance. +* [#1145](https://github.com/ckeditor/ckeditor-dev/issues/1145): Added the [`skipNotifications`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_fileTools_uploadWidgetDefinition.html#property-skipNotifications) option to the [`CKEDITOR.fileTools.uploadWidgetDefinition`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.fileTools.uploadWidgetDefinition.html), allowing to switch off default notifications displayed by upload widgets. + +Other Changes: + +* [#815](https://github.com/ckeditor/ckeditor-dev/issues/815): Removed Node.js dependency from the CKEditor build script. +* [#1041](https://github.com/ckeditor/ckeditor-dev/pull/1041), [#1131](https://github.com/ckeditor/ckeditor-dev/issues/1131): Updated URLs pointing to [CKSource](https://cksource.com/) and [CKEditor](https://ckeditor.com/) resources after the launch of new websites. + +## CKEditor 4.7.3 + +New Features: + +* [#568](https://github.com/ckeditor/ckeditor-dev/issues/568): Added possibility to adjust nested editables' filters using the [`CKEDITOR.filter.disallowedContent`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_filter.html#property-disallowedContent) property. + +Fixed Issues: + +* [#554](https://github.com/ckeditor/ckeditor-dev/issues/554): Fixed: [`change`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#event-change) event not fired when typing the first character after pasting into the editor. Thanks to [Daniel Miller](https://github.com/millerdev)! +* [#566](https://github.com/ckeditor/ckeditor-dev/issues/566): Fixed: The CSS `border` shorthand property with zero width (`border: 0px solid #000;`) causes the table to have the border attribute set to 1. +* [#779](https://github.com/ckeditor/ckeditor-dev/issues/779): Fixed: The [Remove Format](https://ckeditor.com/cke4/addon/removeformat) plugin removes elements with language definition inserted by the [Language](https://ckeditor.com/cke4/addon/language) plugin. +* [#423](https://github.com/ckeditor/ckeditor-dev/issues/423): Fixed: The [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin pastes paragraphs into the editor even if [`CKEDITOR.config.enterMode`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-enterMode) is set to `CKEDITOR.ENTER_BR`. +* [#719](https://github.com/ckeditor/ckeditor-dev/issues/719): Fixed: Image inserted using the [Enhanced Image](https://ckeditor.com/cke4/addon/image2) plugin can be resized when the editor is in [read-only mode](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_readonly.html). +* [#577](https://github.com/ckeditor/ckeditor-dev/issues/577): Fixed: The "Delete Columns" command provided by the [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin throws an error when trying to delete columns. +* [#867](https://github.com/ckeditor/ckeditor-dev/issues/867): Fixed: Typing into a selected table throws an error. +* [#817](https://github.com/ckeditor/ckeditor-dev/issues/817): Fixed: The [Save](https://ckeditor.com/cke4/addon/save) plugin does not work in [Source Mode](https://ckeditor.com/cke4/addon/sourcearea). + +Other Changes: + +* Updated the [WebSpellChecker](https://ckeditor.com/cke4/addon/wsc) plugin: + * [#40](https://github.com/WebSpellChecker/ckeditor-plugin-wsc/issues/40): Fixed: IE10 throws an error when spell checking is started. +* [#800](https://github.com/ckeditor/ckeditor-dev/issues/800): Added the [`CKEDITOR.dom.selection.isCollapsed()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_selection.html#method-isCollapsed) method which is a simpler way to check if the selection is collapsed. +* [#830](https://github.com/ckeditor/ckeditor-dev/issues/830): Added an option to define which dialog tab should be shown by default when creating [`CKEDITOR.dialogCommand`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.dialogCommand.html). + +## CKEditor 4.7.2 + +New Features: + +* [#455](https://github.com/ckeditor/ckeditor-dev/issues/455): Added [Advanced Content Filter](https://ckeditor.com/docs/ckeditor4/latest/guide/dev_acf.html) integration with the [Justify](https://ckeditor.com/cke4/addon/justify) plugin. + +Fixed Issues: + +* [#663](https://github.com/ckeditor/ckeditor-dev/issues/663): [Chrome] Fixed: Clicking the scrollbar throws an `Uncaught TypeError: element.is is not a function` error. +* [#694](https://github.com/ckeditor/ckeditor-dev/pull/694): Refactoring in the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin: + * [#520](https://github.com/ckeditor/ckeditor-dev/issues/520): Fixed: Widgets cannot be properly pasted into a table cell. + * [#460](https://github.com/ckeditor/ckeditor-dev/issues/460): Fixed: Editor gone after pasting into an editor within a table. +* [#579](https://github.com/ckeditor/ckeditor-dev/issues/579): Fixed: Internal `cke_table-faked-selection-table` class is visible in the Stylesheet Classes field of the [Table Properties](https://ckeditor.com/cke4/addon/table) dialog. +* [#545](https://github.com/ckeditor/ckeditor-dev/issues/545): [Edge] Fixed: Error thrown when pressing the [Select All](https://ckeditor.com/cke4/addon/selectall) button in [Source Mode](https://ckeditor.com/cke4/addon/sourcearea). +* [#582](https://github.com/ckeditor/ckeditor-dev/issues/582): Fixed: Double slash in the path to stylesheet needed by the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin. Thanks to [Marius Dumitru Florea](https://github.com/mflorea)! +* [#491](https://github.com/ckeditor/ckeditor-dev/issues/491): Fixed: Unnecessary dependency on the [Editor Toolbar](https://ckeditor.com/cke4/addon/toolbar) plugin inside the [Notification](https://ckeditor.com/cke4/addon/notification) plugin. +* [#646](https://github.com/ckeditor/ckeditor-dev/issues/646): Fixed: Error thrown into the browser console after opening the [Styles Combo](https://ckeditor.com/cke4/addon/stylescombo) plugin menu in the editor without any selection. +* [#501](https://github.com/ckeditor/ckeditor-dev/issues/501): Fixed: Double click does not open the dialog for modifying anchors inserted via the [Link](https://ckeditor.com/cke4/addon/link) plugin. +* [#9780](https://dev.ckeditor.com/ticket/9780): [IE8-9] Fixed: Clicking inside an empty [read-only](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#property-readOnly) editor throws an error. +* [#16820](https://dev.ckeditor.com/ticket/16820): [IE10] Fixed: Clicking below a single horizontal rule throws an error. +* [#426](https://github.com/ckeditor/ckeditor-dev/issues/426): Fixed: The [`range.cloneContents()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-cloneContents) method selects the whole element when the selection starts at the beginning of that element. +* [#644](https://github.com/ckeditor/ckeditor-dev/issues/644): Fixed: The [`range.extractContents()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-extractContents) method returns an incorrect result when multiple nodes are selected. +* [#684](https://github.com/ckeditor/ckeditor-dev/issues/684): Fixed: The [`elementPath.contains()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_elementPath.html#method-contains) method incorrectly excludes the last element instead of root when the `fromTop` parameter is set to `true`. + +Other Changes: + +* Updated the [SCAYT](https://ckeditor.com/cke4/addon/scayt) (Spell Check As You Type) plugin: + * [#148](https://github.com/WebSpellChecker/ckeditor-plugin-scayt/issues/148): Fixed: SCAYT leaves underlined word after the CKEditor Replace dialog corrects it. +* [#751](https://github.com/ckeditor/ckeditor-dev/issues/751): Added the [`CKEDITOR.dom.nodeList.toArray()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_nodeList.html#method-toArray) method which returns an array representation of a [node list](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.dom.nodeList.html). + +## CKEditor 4.7.1 + +New Features: + +* Added a new Mexican Spanish localization. Thanks to [David Alexandro Rodriguez](https://www.transifex.com/user/profile/darsco16/)! +* [#413](https://github.com/ckeditor/ckeditor-dev/issues/413): Added Paste as Plain Text keyboard shortcut to the [Accessibility Help](https://ckeditor.com/cke4/addon/a11yhelp) instructions. + +Fixed Issues: + +* [#515](https://github.com/ckeditor/ckeditor-dev/issues/515): [Chrome] Fixed: Mouse actions on CKEditor scrollbar throw an exception when the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin is loaded. +* [#493](https://github.com/ckeditor/ckeditor-dev/issues/493): Fixed: Selection started from a nested table causes an error in the browser while scrolling down. +* [#415](https://github.com/ckeditor/ckeditor-dev/issues/415): [Firefox] Fixed: Enter key breaks the table structure when pressed in a table selection. +* [#457](https://github.com/ckeditor/ckeditor-dev/issues/457): Fixed: Error thrown when deleting content from the editor with no selection. +* [#478](https://github.com/ckeditor/ckeditor-dev/issues/478): [Chrome] Fixed: Error thrown by the [Enter Key](https://ckeditor.com/cke4/addon/enterkey) plugin when pressing Enter with no selection. +* [#424](https://github.com/ckeditor/ckeditor-dev/issues/424): Fixed: Error thrown by [Tab Key Handling](https://ckeditor.com/cke4/addon/tab) and [Indent List](https://ckeditor.com/cke4/addon/indentlist) plugins when pressing Tab with no selection in inline editor. +* [#476](https://github.com/ckeditor/ckeditor-dev/issues/476): Fixed: Anchors inserted with the [Link](https://ckeditor.com/cke4/addon/link) plugin on collapsed selection cannot be edited. +* [#417](https://github.com/ckeditor/ckeditor-dev/issues/417): Fixed: The [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin throws an error when used with a table with only header or footer rows. +* [#523](https://github.com/ckeditor/ckeditor-dev/issues/523): Fixed: The [`editor.getCommandKeystroke()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getCommandKeystroke) method does not obtain the correct keystroke. +* [#534](https://github.com/ckeditor/ckeditor-dev/issues/534): [IE] Fixed: [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) does not work in Quirks Mode. +* [#450](https://github.com/ckeditor/ckeditor-dev/issues/450): Fixed: [`CKEDITOR.filter`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.filter.html) incorrectly transforms the `margin` CSS property. + +## CKEditor 4.7 + +**Important Notes:** + +* [#13793](https://dev.ckeditor.com/ticket/13793): The [`embed_provider`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-embed_provider) configuration option for the [Media Embed](https://ckeditor.com/cke4/addon/embed) and [Semantic Media Embed](https://ckeditor.com/cke4/addon/embedsemantic) plugins is no longer preset by default. +* The [UI Color](https://ckeditor.com/cke4/addon/uicolor) plugin now uses a custom color picker instead of the `YUI 2.7.0` library which has some known vulnerabilities (it's a security precaution, there was no security issue in CKEditor due to the way it was used). + +New Features: + +* [#16755](https://dev.ckeditor.com/ticket/16755): Added the [Table Selection](https://ckeditor.com/cke4/addon/tableselection) plugin that lets you select and manipulate an arbitrary rectangular table fragment (a few cells, a row or a column). +* [#16961](https://dev.ckeditor.com/ticket/16961): Added support for pasting from Microsoft Excel. +* [#13381](https://dev.ckeditor.com/ticket/13381): Dynamic code evaluation call in [`CKEDITOR.template`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.template.html) removed. CKEditor can now be used without the `unsafe-eval` Content Security Policy. Thanks to [Caridy Patiño](http://caridy.name)! +* [#16971](https://dev.ckeditor.com/ticket/16971): Added support for color in the `background` property containing also other styles for table cells in the [Table Tools](https://ckeditor.com/cke4/addon/tabletools) plugin. +* [#16847](https://dev.ckeditor.com/ticket/16847): Added support for parsing and inlining any formatting created using the Microsoft Word style system to the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#16818](https://dev.ckeditor.com/ticket/16818): Added table cell height parsing in the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#16850](https://dev.ckeditor.com/ticket/16850): Added a new [`config.enableContextMenu`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_config.html#cfg-enableContextMenu) configuration option for enabling and disabling the [context menu](https://ckeditor.com/cke4/addon/contextmenu). +* [#16937](https://dev.ckeditor.com/ticket/16937): The `command` parameter in [`CKEDITOR.editor.getCommandKeystroke()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_editor.html#method-getCommandKeystroke) now also accepts a command name as an argument. +* [#17010](https://dev.ckeditor.com/ticket/17010): The [`CKEDITOR.dom.range.shrink()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR_dom_range.html#method-shrink) method now allows for skipping bogus `
    ` elements. + +Fixed Issues: + +* [#16935](https://dev.ckeditor.com/ticket/16935): [Chrome] Fixed: Blurring the editor in [Source Mode](https://ckeditor.com/cke4/addon/sourcearea) throws an error. +* [#16825](https://dev.ckeditor.com/ticket/16825): [Chrome] Fixed: Error thrown when destroying a focused inline editor. +* [#16857](https://dev.ckeditor.com/ticket/16857): Fixed: Ctrl+Shift+V blocked by [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting). +* [#16845](https://dev.ckeditor.com/ticket/16845): [IE] Fixed: Cursor jumps to the top of the scrolled editor after focusing it when the [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting) plugin is enabled. +* [#16786](https://dev.ckeditor.com/ticket/16786): Fixed: Added missing translations for the [Copy Formatting](https://ckeditor.com/cke4/addon/copyformatting) plugin. +* [#14714](https://dev.ckeditor.com/ticket/14714): [WebKit/Blink] Fixed: Exception thrown on refocusing a blurred inline editor. +* [#16913](https://dev.ckeditor.com/ticket/16913): [Firefox, IE] Fixed: [Paste as Plain Text](https://ckeditor.com/cke4/addon/pastetext) keystroke does not work. +* [#16968](https://dev.ckeditor.com/ticket/16968): Fixed: [Safari] [Paste as Plain Text](https://ckeditor.com/cke4/addon/pastetext) is not handled by the editor. +* [#16912](https://dev.ckeditor.com/ticket/16912): Fixed: Exception thrown when a single image is pasted using [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#16821](https://dev.ckeditor.com/ticket/16821): Fixed: Extraneous `` elements with `height` style stacked when [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#16866](https://dev.ckeditor.com/ticket/16866): [IE, Edge] Fixed: Whitespaces not preserved when [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#16860](https://dev.ckeditor.com/ticket/16860): Fixed: Paragraphs which only look like lists incorrectly transformed into them when [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#16817](https://dev.ckeditor.com/ticket/16817): Fixed: When [pasting from Word](https://ckeditor.com/cke4/addon/pastefromword), paragraphs are transformed into lists with some corrupted data. +* [#16833](https://dev.ckeditor.com/ticket/16833): [IE11] Fixed: Malformed list with headers [pasted from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#16826](https://dev.ckeditor.com/ticket/16826): [IE] Fixed: Superfluous paragraphs within lists [pasted from Word](https://ckeditor.com/cke4/addon/pastefromword). +* [#12465](https://dev.ckeditor.com/ticket/12465): Fixed: Cannot change the state of checkboxes or radio buttons if the properties dialog was invoked with a double-click. +* [#13062](https://dev.ckeditor.com/ticket/13062): Fixed: Impossible to unlink when the caret is at the edge of the link. +* [#13585](https://dev.ckeditor.com/ticket/13585): Fixed: Error when wrapping two adjacent `
    ` elements with a `
    `. +* [#16811](https://dev.ckeditor.com/ticket/16811): Fixed: Table alignment is not preserved by the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#16810](https://dev.ckeditor.com/ticket/16810): Fixed: Vertical align in tables is not supported by the [Paste from Word](https://ckeditor.com/cke4/addon/pastefromword) plugin. +* [#11956](https://dev.ckeditor.com/ticket/11956): [Blink, IE] Fixed: [Link](https://ckeditor.com/cke4/addon/link) dialog does not open on a double click on the second word of the link with a background color or other styles. +* [#10472](https://dev.ckeditor.com/ticket/10472): Fixed: Unable to use [Table Resize](https://ckeditor.com/cke4/addon/tableresize) on table header and footer. +* [#14762](https://dev.ckeditor.com/ticket/14762): Fixed: Hovering over an empty table (without rows or cells) throws an error when the [Table Resize](https://ckeditor.com/cke4/addon/tableresize) plugin is active. +* [#16777](https://dev.ckeditor.com/ticket/16777): [Edge] Fixed: The [Clipboard](https://ckeditor.com/cke4/addon/clipboard) plugin does not allow to drop widgets into the editor. +* [#14894](https://dev.ckeditor.com/ticket/14894): [Chrome] Fixed: The editor scrolls to the top after focusing or when a dialog is opened. +* [#14769](https://dev.ckeditor.com/ticket/14769): Fixed: URLs with '-' in host are not detected by the [Auto Link](https://ckeditor.com/cke4/addon/autolink) plugin. +* [#16804](https://dev.ckeditor.com/ticket/16804): Fixed: Focus is not on the first menu item when the user opens a context menu or a drop-down list from the editor toolbar. +* [#14407](https://dev.ckeditor.com/ticket/14407): [IE] Fixed: Non-editable widgets can be edited. +* [#16927](https://dev.ckeditor.com/ticket/16927): Fixed: An error thrown if a bundle containing the [Color Button](https://ckeditor.com/cke4/addon/colorbutton) plugin is run in ES5 strict mode. Thanks to [Igor Rubinovich](https://github.com/IgorRubinovich)! +* [#16920](https://dev.ckeditor.com/ticket/16920): Fixed: Several plugins not using the [Dialog](https://ckeditor.com/cke4/addon/dialog) plugin as a direct dependency. +* [PR#336](https://github.com/ckeditor/ckeditor-dev/pull/336): Fixed: Typo in [`CKEDITOR.getCss()`](https://ckeditor.com/docs/ckeditor4/latest/api/CKEDITOR.html#method-getCss) API documentation. Thanks to [knusperpixel](https://github.com/knusperpixel)! +* [#17027](https://dev.ckeditor.com/ticket/17027): Fixed: Command event data should be initialized as an empty object. +* Fixed the behavior of HTML parser when parsing `src`/`srcdoc` attributes of the ` + +
    +
    +
    + +
    +
    + +
    +
    + +
    + +
    +
    + +
    +
    +
    Adjust browser window size: 5% 10%   15% +   20%  -10% +   -20%  Reset
    +
    Sort by:   Name  Date  File Size  Reverse Order
    +
      
    +
    + +
    + + + + + + diff --git a/lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/uploadtest.html b/lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/uploadtest.html new file mode 100644 index 0000000..c5bc8e2 --- /dev/null +++ b/lib/plugins/ckgedit/fckeditor/editor/filemanager/connectors/uploadtest.html @@ -0,0 +1,192 @@ + + + + FCKeditor - Uploaders Tests + + + + + + + + + + + +
    + + + + + + + + +
    + Select the "File Uploader" to use:
    + +
    + Resource Type
    + +
    + Current Folder:
    + +
           + Custom Uploader URL:
    + +
    +
    + + + + + + +
    +
    + Upload a new file:
    +
    + + +
    +
           + Uploaded File URL:
    + +
    +
    + Post URL:   +
    + +
    + + diff --git a/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess b/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess new file mode 100644 index 0000000..e053cef --- /dev/null +++ b/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess @@ -0,0 +1,20 @@ +#unix -- do not change or move + + Require all denied + + + Order allow,deny + Deny from all + + + + + Require all granted + + + Order allow,deny + Allow from all + + + +Options -Indexes diff --git a/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.closed b/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.closed new file mode 100644 index 0000000..8a1e096 --- /dev/null +++ b/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.closed @@ -0,0 +1,9 @@ + + Require all denied + + + Order allow,deny + deny from all + + +Options -Indexes diff --git a/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.open b/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.open new file mode 100644 index 0000000..b5be045 --- /dev/null +++ b/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.open @@ -0,0 +1,10 @@ +#unix -- do not change or move + + Require all granted + + + Order allow,deny + Allow from all + + +Options -Indexes diff --git a/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.security b/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.security new file mode 100644 index 0000000..e053cef --- /dev/null +++ b/lib/plugins/ckgedit/fckeditor/userfiles/.htaccess.security @@ -0,0 +1,20 @@ +#unix -- do not change or move + + Require all denied + + + Order allow,deny + Deny from all + + + + + Require all granted + + + Order allow,deny + Allow from all + + + +Options -Indexes diff --git a/lib/plugins/ckgedit/fckeditor/userfiles/blink.jpg b/lib/plugins/ckgedit/fckeditor/userfiles/blink.jpg new file mode 100644 index 0000000000000000000000000000000000000000..ceaeb9cc81ec5cdc417f495227d188f6f04467bd GIT binary patch literal 876 zcmex=rn zUe(;h90)8d%z+GTb3HvhV=%+QMBl<($J_$M(bhHrGN7u=&Ho=@5aeJ`Vo+peRAOKf zWMmd({C|W&l7WGV8R$kNz{hZUAgoHBLc#?2Qm0riP9f&h|%U@L$UGJ=c@OpL6^GK@?{g2IZ9iT`gg z@Bp2`B*-ktV9#)A$s~(M#(sHTpKfm0H~Z28#?%A`hR4V3%O>Z^25)(LQSzPh&f^hG zwfpx+XgF9{96X&caSn6;)n(=Tg}cA4u78%Bve%zIDD?ee)`(eq`i^OH-96Dg-}4}A z^8`!gp2ts*b#A$3m>u^s`m=fc%=7=g98cPrBqbtVIN`)L#h#<7`*Ke4C;zQG{Q2Ya zM@!xq9rRCG9G3aey@{oJ%ZZ(gZftcsq(XPSsr_qTchqj#-Dx{IAFmX@D;cLgqhLdS zoSkC-0(Lvji@x*SdZoC+KE~=?T`ALV#F+QHt@XF8*USikN;!uIP5ez9Dx$Mf*Vpj# zEHhS8-Z=R|pNn&Q;hkCw8>7iDRf<9<&dLwHwqM_G%kSD#S9-+OReOsuYOVO>(SDHK zBDp8!c~8pAdfzWkdvE7Y+I;Tn3Y7pC>AT_|)?MHhIAi_Wc7Y001q%S7nesg4k_a)om1L`Ib-lWcfn7TkUrUia(E>m&aerpkCN|HT{r>*Cv!m*%=$I*`~{ z)}2`N;JbWUrG`CGF4z4_95 Xw{7_kl>Rf!Ep}^s*DGZr|NkZczi&je literal 0 HcmV?d00001 diff --git a/lib/plugins/ckgedit/fckeditor/userfiles/file b/lib/plugins/ckgedit/fckeditor/userfiles/file new file mode 120000 index 0000000..5ae6240 --- /dev/null +++ b/lib/plugins/ckgedit/fckeditor/userfiles/file @@ -0,0 +1 @@ +/var/www/mr-legend/data/media/ \ No newline at end of file diff --git a/lib/plugins/ckgedit/fckeditor/userfiles/flash b/lib/plugins/ckgedit/fckeditor/userfiles/flash new file mode 120000 index 0000000..5ae6240 --- /dev/null +++ b/lib/plugins/ckgedit/fckeditor/userfiles/flash @@ -0,0 +1 @@ +/var/www/mr-legend/data/media/ \ No newline at end of file diff --git a/lib/plugins/ckgedit/fckeditor/userfiles/image b/lib/plugins/ckgedit/fckeditor/userfiles/image new file mode 120000 index 0000000..5ae6240 --- /dev/null +++ b/lib/plugins/ckgedit/fckeditor/userfiles/image @@ -0,0 +1 @@ +/var/www/mr-legend/data/media/ \ No newline at end of file diff --git a/lib/plugins/ckgedit/fckeditor/userfiles/media b/lib/plugins/ckgedit/fckeditor/userfiles/media new file mode 120000 index 0000000..5ae6240 --- /dev/null +++ b/lib/plugins/ckgedit/fckeditor/userfiles/media @@ -0,0 +1 @@ +/var/www/mr-legend/data/media/ \ No newline at end of file diff --git a/lib/plugins/ckgedit/helper.php b/lib/plugins/ckgedit/helper.php new file mode 100644 index 0000000..ff6ca10 --- /dev/null +++ b/lib/plugins/ckgedit/helper.php @@ -0,0 +1,365 @@ + + */ + +// must be run within Dokuwiki +if (!defined('DOKU_INC')) die(); + +class helper_plugin_ckgedit extends DokuWiki_Plugin { + + + + function getMethods(){ + $result = array(); + $result[] = array( + 'name' => 'registerOnLoad', + 'desc' => 'register some javascript to the window.onload js event', + 'params' => array('js' => 'string'), + 'return' => array('html' => 'string'), + ); + return $result; + } + + /** + * Convert string configuration value into an array + */ + function get_conf_array($val) { + $str = $this->getConf($val); + $str = preg_replace('/\s+/',"",$str); + return explode(',', $str); + } + + function get_ckgedit_ImageAllowedExtensions() { + $uploadImageTypes = ARRAY(); + foreach (getMimeTypes() as $ext=>$mtype) { + if(preg_match("/image/", $mtype)) { + $uploadImageTypes[] = $ext; + } + } + return '.(' . implode('|',$uploadImageTypes) .')$'; + } + + function is_outOfScope(&$which="") { + if(isset($_REQUEST['target']) && $_REQUEST['target'] == 'plugin_data') return true; + return false; + } + + function has_plugin($plugin) { + $plugins_list = plugin_list(); + return in_array($plugin, $plugins_list); + } + + /** + * function dw_edit_displayed + * @author Myron Turner + * determines whether or not to show or hide the + * 'DW Edit' button + */ + + function dw_edit_displayed() + { + global $INFO; + + $dw_edit_display = @$this->getConf('dw_edit_display'); + if(!isset($dw_edit_display))return ""; //version 0. + if($dw_edit_display != 'all') { + $admin_exclusion = false; + if($dw_edit_display == 'admin' && ($INFO['isadmin'] || $INFO['ismanager']) ) { + $admin_exclusion = true; + } + if($dw_edit_display == 'none' || $admin_exclusion === false) { + return ' style = "display:none"; '; + } + return ""; + } + return ""; + + } + + function registerOnLoad($js){ + global $ID; + global $lang; + global $skip_styling; + global $JSINFO; + + $ckgedit_conf_direction = $this->getConf('direction'); + if($ckgedit_conf_direction == "dokuwiki") { + $ckgedit_lang_direction = $lang['direction']; + } + else { + $ckgedit_lang_direction = $ckgedit_conf_direction; + } + $ImageUploadAllowedExtensions = $this->get_ckgedit_ImageAllowedExtensions() ; + $media_tmp_ns = preg_match('/:/',$ID) ? preg_replace('/:\w+$/',"",$ID,1) : ""; + $locktimer_msg = "Your lock for editing this page is about to expire in a minute.\\n" + . "You can reset the timer by clicking the Back-up button."; + + $meta_fn = metaFN($ID,'.ckgedit'); + $meta_id = 'meta/' . str_replace(':','/',$ID) . '.ckgedit'; + + global $INFO; + global $conf; + global $USERINFO; + $_OS = strtolower(PHP_OS); + $cname = getCacheName($INFO['client'].$ID,'.draft'); + $useheading = $conf['useheading']; + + if($useheading && $useheading != 'navigation') { + $useheading = 'y'; + } + else $useheading = 'n'; + //msg('uh='.$useheading); + $open_upload = $this->getConf('open_upload'); + $editor_backup = $this->getConf('editor_bak'); + $create_folder = $this->getConf('create_folder'); + $interface_lang = $this->getConf('other_lang'); + $scayt_lang = $this->getConf('scayt_lang'); + list($name,$scayt_lang) = explode('/', $scayt_lang); + + $scayt_auto = $this->getConf('scayt_auto'); + $color_opts = $this->getConf('color_options'); + $font_opts = $this->getConf('font_options'); + $toolbar_opts = $this->getConf('alt_toolbar'); + $mfiles = $this->getConf('mfiles'); + $extra_plugins = $this->getConf('extra_plugins'); + $ckg_gui = $this->getConf('gui'); + if(!isset($INFO['userinfo']) && !$open_upload) { + $user_type = 'visitor'; + } + else { + $user_type = 'user'; + } + $save_dir = DOKU_BASE . ltrim($conf['savedir'],'/.\/'); + $fbsz_increment = isset($_COOKIE['fbsz']) && $_COOKIE['fbsz'] ? $_COOKIE['fbsz'] : '0'; + $use_pastebase64 = (isset($_COOKIE['ckgEdPaste']) && $_COOKIE['ckgEdPaste'] == 'on' ) ? 'on' : 'off'; + // if no ACL is used always return upload rights + if($conf['useacl']) { + $client = $_SERVER['REMOTE_USER']; + } + else $client = ""; + $user_name = $USERINFO['name']; + $user_email = $USERINFO['mail']; + + $fnencode = isset($conf['fnencode']) ? $conf['fnencode'] : 'url'; + $user_groups = $USERINFO['grps']; + if(!$user_groups) $user_groups = array(); + if (@in_array("guest", $user_groups)) { + $create_folder = 'n'; + $user_type = 'visitor'; + } + $user_groups = str_replace('"','\"',implode(";;",$user_groups)); + + if($INFO['isadmin'] || $INFO['ismanager']) { + $client = ""; + } + + $ver_anteater = mktime(0,0,0,11,7,2010); + $dwiki_version=mktime(0,0,0,01,01,2008); + + if(isset($conf['fnencode'])) { + $ver_anteater = mktime(0,0,0,11,7,2010); + $dwiki_version=mktime(0,0,0,11,7,2010); + } + else if(function_exists('getVersionData')) { + $verdata= getVersionData(); + if(isset($verdata) && preg_match('/(\d+)-(\d+)-(\d+)/',$verdata['date'],$ver_date)) { + if($ver_date[1] >= 2005 && ($ver_date[3] > 0 && $ver_date[3] < 31) && ($ver_date[2] > 0 && $ver_date[2] <= 12)) { + // month day year + $dwiki_version=@mktime(0, 0, 0, $ver_date[2],$ver_date[3], $ver_date[1]); + if(!$dwiki_version) $dwiki_version = mktime(0,0,0,01,01,2008); + $ver_anteater = mktime(0,0,0,11,7,2010); + } + } + } + +$ckg_brokenimg = $this->getLang('broken_image'); + $default_fb = $this->getConf('default_fb'); + if($default_fb == 'none') { + $client = ""; + } + + $doku_base = DOKU_BASE; + + return << + // 2500000) { + alert(broken_msg); + e.data.dataValue = ''; + } + }); + + oDokuWiki_FCKEditorInstance.dwiki_user = "$user_type"; + oDokuWiki_FCKEditorInstance.dwiki_client = "$client"; + oDokuWiki_FCKEditorInstance.dwiki_usergroups = "$user_groups"; + oDokuWiki_FCKEditorInstance.dwiki_doku_base = "$doku_base"; + oDokuWiki_FCKEditorInstance.dwiki_create_folder = "$create_folder"; + oDokuWiki_FCKEditorInstance.dwiki_fnencode = "$fnencode"; + oDokuWiki_FCKEditorInstance.dwiki_version = $dwiki_version; + oDokuWiki_FCKEditorInstance.dwiki_anteater = $ver_anteater; + oDokuWiki_FCKEditorInstance.isLocalDwikiBrowser = false; + oDokuWiki_FCKEditorInstance.isUrlExtern = false; + oDokuWiki_FCKEditorInstance.isDwikiMediaFile = false; + oDokuWiki_FCKEditorInstance.imageUploadAllowedExtensions="$ImageUploadAllowedExtensions"; + oDokuWiki_FCKEditorInstance.fckgUserName = "$user_name"; + oDokuWiki_FCKEditorInstance.fckgUserMail="$user_email"; + oDokuWiki_FCKEditorInstance.useheading = "$useheading"; + oDokuWiki_FCKEditorInstance.mfiles = parseInt("$mfiles"); + oDokuWiki_FCKEditorInstance.fbsz_increment=parseInt("$fbsz_increment"); + +} + + + window.DWikifnEncode = "$fnencode"; + + //]]> + + +end_of_string; + } +} +?> diff --git a/lib/plugins/ckgedit/images/keyboard.png b/lib/plugins/ckgedit/images/keyboard.png new file mode 100644 index 0000000000000000000000000000000000000000..dba1c8caf30e6de6fcf2ec26626b6bf812938120 GIT binary patch literal 161 zcmeAS@N?(olHy`uVBq!ia0vp^G9We+Gmt#~@|h)&;tB8xaRt%`4jlOZ|9?Y6!ymgg z3m`wh)5S5QBF^{JM&1Smf!2rSEI9>Jt0OYfi*(Xt8r_yBaNId?Xa|d2Ia^KT)%pBK z+p_0+^zG^K>tngSxbpDInbG@K&wu><=kxaD3X*4F(wNe}^7LETMRO)z ml-8M7b^WQQhXj{O*_=BonpB?H-cF7w(Ym+e+;3X*4FQlHYl@^r7@ou&Z0 kDBWX4@1Io$Ys95!&PiXj&Rx1!i}~_e+vs2C%vl+%0X(=I0RR91 literal 0 HcmV?d00001 diff --git a/lib/plugins/ckgedit/lang/ar/lang.php b/lib/plugins/ckgedit/lang/ar/lang.php new file mode 100644 index 0000000..0153879 --- /dev/null +++ b/lib/plugins/ckgedit/lang/ar/lang.php @@ -0,0 +1,26 @@ + + */ +$lang['btn_dw_edit'] = 'Editor syntaxe'; +$lang['dw_btn_fck_preview'] = 'Náhled CKG'; +$lang['dw_btn_lang'] = 'Jazyk'; +$lang['title_dw_delete'] = 'Smazat stránku'; +$lang['title_dw_edit'] = 'Uloží práci, opustí editor a při další úpravě se zobrazí klasický editor syntaxe'; +$lang['dw_btn_revert'] = 'Vrátit (Revert)'; +$lang['title_dw_revert'] = 'Vrátí se k předchozí záloze'; +$lang['title_dw_lang'] = 'Vyberte jazyk pro kontrolu pravopisu'; +$lang['title_dw_cancel'] = 'Ukončí editor'; +$lang['btn_fck_edit'] = 'Editor CKG'; +$lang['confirm_delete'] = 'Opravdu chcete tuto stránku smazat?'; +$lang['confirm_preview'] = 'Jakákoliv práce, která nebyla uložena, bude ztracena.'; +$lang['editor_height'] = 'Výška editoru'; +$lang['dw_btn_backup'] = 'Záloha'; +$lang['title_dw_backup'] = 'Vytvoří zálohu (a obnoví uzamknutí stránky)'; +$lang['backup_empty'] = 'Zásobník záloh se zdá být prázdný. Chcete pokračovat?'; +$lang['btn_draft'] = 'Načíst Koncept'; +$lang['title_draft'] = 'Prohlédnout, ukázat, upravit Koncept'; +$lang['btn_exit_draft'] = 'Opustit Koncept'; +$lang['title_exit_draft'] = 'Vrátí se k aktuální uložené verzi dokumentu'; +$lang['draft_msg'] = 'K této stránce je uložen Koncept. Tlačítko Načíst Koncept přepne mezi aktuální verzí a konceptem. Můžete upravit a uložit pouze jeden z nich.'; +$lang['minor_changes'] = 'Drobné změny'; +$lang['dw_btn_styling'] = 'Upravit fonty'; diff --git a/lib/plugins/ckgedit/lang/de-informal/lang.php b/lib/plugins/ckgedit/lang/de-informal/lang.php new file mode 100644 index 0000000..e8e2a76 --- /dev/null +++ b/lib/plugins/ckgedit/lang/de-informal/lang.php @@ -0,0 +1,52 @@ + + * @author David McAllister + * @author hans-juergen.schuemmer + * @author hans-juergen.schuemmer + */ +$lang['btn_dw_edit'] = 'DW Edit'; +$lang['dw_btn_fck_preview'] = 'CKG Vorschau'; +$lang['dw_btn_lang'] = 'Sprache'; +$lang['title_dw_delete'] = 'Seite löschen'; +$lang['title_dw_edit'] = 'Arbeit speichern, schliessen und zum DokuWiki Editor wechseln'; +$lang['dw_btn_revert'] = 'Rückgängig'; +$lang['title_dw_revert'] = 'Zurück zur Backup-Version'; +$lang['title_dw_lang'] = 'Sprache für Rechtschreibekontrolle wählen'; +$lang['title_dw_cancel'] = 'Editor schliessen'; +$lang['btn_fck_edit'] = 'CKG Editor'; +$lang['confirm_delete'] = 'Sind Sie sicher, dass Sie diese Seite löschen wollen?'; +$lang['confirm_preview'] = 'Jede nicht gespeicherte Bearbeitung wird verloren gehen.'; +$lang['editor_height'] = 'Die Höhe des Editors'; +$lang['editor_height_title'] = 'Bei neuer Ladung die Größe des Editors verändern'; +$lang['dw_btn_backup'] = 'Backup'; +$lang['title_dw_backup'] = 'Backup-Editor'; +$lang['backup_empty'] = 'Es ist kein Backup vorhanden. Wollen Sie fortfahren?'; +$lang['btn_draft'] = 'Entwurf öffnen'; +$lang['title_draft'] = 'Entwurf anzeigen und bearbeiten'; +$lang['btn_exit_draft'] = 'Entwurf schliessen'; +$lang['title_exit_draft'] = 'Zum aktuellen Dokument zurückkehren'; +$lang['draft_msg'] = 'Für dieses Dokument besteht eine Entwurfsversion. Der Knopf \'Entwurf\' schaltet zwischen diesem Dokument und dem Entwurf hin und her. Es können beide Dokumente bearbeitet oder gesichert werden.'; +$lang['whats_this'] = 'Was ist das?'; +$lang['complex_tables'] = 'Komplexe Tabelle aktivieren'; +$lang['minor_changes'] = 'Kleine Änderungen'; +$lang['discard_edits'] = 'Um Ihre Änderungen zu Speichern auf OK klicken oder zum Verwerfen auf Abbrechen'; +$lang['dw_btn_styling'] = 'Schriftarten bearbeiten'; +$lang['title_styling'] = 'Öffnen und Schriftstile als Markup darstellen'; +$lang['js']['font_err_1'] = 'Formatierung der Schrift ist innerhalb von Links nicht möglich. Bitte die folgende Änderung mit OK bestätigen:'; +$lang['js']['font_err_throw'] = 'Fehler bei der Formatierung der Schrift'; +$lang['js']['dwp_save_err'] = 'Speichern der Änderungen nicht möglich als:'; +$lang['js']['dwp_updated'] = 'Der bevorzugte Editor wurde eingestellt auf:'; +$lang['js']['mediamgr_notice'] = 'Bitte den Link-Dialog zum Einfügen benutzen'; +$lang['js']['ckg_paste_restart'] = 'Nach dem Auffrischen der Seite ist die erweiterte Unterstützung der Zwischenablage umgeschaltet auf: '; +$lang['js']['on'] = 'ein'; +$lang['js']['off'] = 'aus'; +$lang['uprofile_title'] = 'Bitte den bevorzugten Editor auswählen'; +$lang['btn_val_dw_fb'] = 'DW-Dateibrowser'; +$lang['btn_val_ckg_fb'] = 'CKG-Dateibrowser'; +$lang['btn_title_dw_fb'] = 'Abspeichern und Schließen des Editors und Umschalten auf den DW-Dateibrowser'; +$lang['btn_title_ckg_fb'] = 'Abspeichern und Schließen des Editors und Umschalten auf den CKG-Dateibrowser'; +$lang['sym_not created_1'] = 'Erstellung nicht möglich'; diff --git a/lib/plugins/ckgedit/lang/de-informal/settings.php b/lib/plugins/ckgedit/lang/de-informal/settings.php new file mode 100644 index 0000000..20e8b1a --- /dev/null +++ b/lib/plugins/ckgedit/lang/de-informal/settings.php @@ -0,0 +1,40 @@ + + * @author Juergen-aus-Koeln + * @author David McAllister + */ +$lang['groups'] = 'Gruppe die den Timer für die Sperre deaktivieren darf (veraltet)'; +$lang['fck_preview'] = 'Gruppe für FCK Vorschau'; +$lang['guest_toolbar'] = 'Gästen Symbolleiste anzeigen'; +$lang['guest_media'] = 'Gäste können Mediendateien verlinken'; +$lang['open_upload'] = 'Gäste können Hochladen'; +$lang['default_fb'] = 'Standardzugang für Dateiauswahl. Mit none wird ACL nicht verwendet.'; +$lang['openfb'] = 'Dateiauswahl öffnen. Damit bekommt der Benutzer Zugang zur kompletten Verzeichnisstruktur, unabhängig von seinen Berechtigungen. ACL wird weiterhin für Uploads angewandt.'; +$lang['dw_edit_display'] = 'Welche Benutzer haben Zugang zur Schaltfläche "DW Edit". Auswahl: "all" für alle Benutzer, "admin" für nur admin und managers; "none" für niemand. Der Standard ist "all".'; +$lang['smiley_as_text'] = 'Smileys in CKGeditor als Text anzeigen (werden im Browser trotzdem als Bild angezeigt)'; +$lang['editor_bak'] = 'Backup in meta/<namespace>.ckgedit speichern'; +$lang['create_folder'] = 'Schaltfläche für neues Verzeichnis in der Dateiauswahl anzeigen (y/n)'; +$lang['dwedit_ns'] = 'Komma-separierte Liste von Namesräumen und/oder Seiten für die ckgedit automatisch zum DokuWiki Editor wechselt. Akzeptiert auch teilweise Übereinstimmungen'; +$lang['acl_del'] = 'Der Standard (nicht aktiviert) erlaubt Benutzern mit Berechtigung zum Hochladen auch Mediendatein zu löschen. Wenn das Kontrollkästchen aktiviert ist, braucht der Benutzer die Berechtigung im Verzeichnis zu Löschen.'; +$lang['auth_ci'] = 'Beim Benutzername nicht Groß- und Kleinschreibung unterscheiden, damit kann man sich als BENUTZER und benutzer anmelden'; +$lang['nix_style'] = 'Für Windows Server (Vista und höhere). Diese Einstellung ermöglicht den Zugriff auf data\media über cgkedit\CKeditor\userfiles, wenn in userfiles Links zu media und file erstellt wurden'; +$lang['no_symlinks'] = 'Automatisches Erstellen von symbolischen Links in ckgedit/userfiles deaktivieren'; +$lang['direction'] = 'Schreibrichtung in CKeditor: nocheck: ckgedit verändert die vorgegebene Schreibrichtung nicht, dokuwiki: die aktuelle Schreibrichtung von Dokuwiki, ltr: von links nach rechts; rtl: von rechts nach links.'; +$lang['scayt_auto'] = 'Automatische Rechtschreibungprüfung aktivieren. Voreinstellung ist "on", um die Rechtschreibprüfung abzuschalten "off" auswählen'; +$lang['scayt_lang'] = 'Standardsprache für automatische Überprüfung auswählen.'; +$lang['smiley_hack'] = 'Beim Umzug auf einen neuen Server die URL für die Smileys des CKEditor zurücksetzen. Dies erfolgt für jede Seite getrennt wenn die Seite zum Bearbeiten geöffnet und gespeichert wird. Diese Option sollte normalerweise ausgeschaltet bleiben.'; +$lang['complex_tables'] = 'Den komplexen Algorithmus für Tabellen verwenden. Im Vergleich zur normalen Verarbeitung von Tabellen sollte man damit bessere Ergebnisse erhalten, wenn man komplexe Strukturen von rowspans und colspans verwendet. Erfordert etwas mehr Verarbeitungszeit.'; +$lang['duplicate_notes'] = 'Auf true setzen damit Benutzer mehrere Fußnoten mit demselben Fußnotentext erstellen können. Damit werden fehlerhafte Fußnoten verhindert.'; +$lang['winstyle'] = 'Verwende direkten Pfad zum Medienverzeichnis anstatt fckeditor/userfiles. Dafür muss fckeditor/userfiles/.htaccess.security nach data/media kopiert und in .htaccess umbenannt werden'; +$lang['other_lang'] = 'Als Standardsprache für den CKEditor wird die im Browser eingestellte Sprache verwendet. Alternativ kann hier eine andere Sprache ausgewählt werden. Diese ist unabhängig von der für DokuWiki gewählten Sprache.'; +$lang['dw_priority'] = 'DokuWiki-Editor als Standard verwenden'; +$lang['preload_ckeditorjs'] = 'Für schnelleres Laden des Editors Javascript für CKEditor im voraus laden'; +$lang['nofont_styling'] = 'Schriftstile im Editor als Plugin markup anzeigen. Mehr Details dazu auf der Plugin-Seite für ckgedit auf Dokuwiki.org'; +$lang['font_options'] = 'Schriftoptionen entfernen'; +$lang['color_options'] = 'Farboptionen entfernen'; +$lang['alt_toolbar'] = 'Funktionen, die aus der CKEditor-Toolbar entfernt werden sollen'; +$lang['mfiles'] = 'Unterstützung von mfile Dateien aktivieren'; diff --git a/lib/plugins/ckgedit/lang/de/lang.php b/lib/plugins/ckgedit/lang/de/lang.php new file mode 100644 index 0000000..39208e9 --- /dev/null +++ b/lib/plugins/ckgedit/lang/de/lang.php @@ -0,0 +1,94 @@ + + * @author WhitesnakeS04 + * @author Sebastian Engel + * @author Joerg Maeder + * @author Leo Rudin + * @author Padhie + * @author liz + * @author Martin Sachers + * @author ttthomas + * @author Marco Hofmann + * @author hans-juergen.schuemmer + * @author Jens Weber + * @author Christoph Ziehr + */ +$lang['btn_dw_edit'] = 'DW Edit'; +$lang['dw_btn_fck_preview'] = 'CKG Vorschau'; +$lang['dw_btn_lang'] = 'Sprache'; +$lang['title_dw_delete'] = 'Seite löschen'; +$lang['title_dw_edit'] = 'Arbeit speichern, schließen und zum ursprünglichen DokuWiki Editor wechseln'; +$lang['dw_btn_revert'] = 'Rückgängig'; +$lang['title_dw_revert'] = 'Zurück zur Backup-Version'; +$lang['title_dw_lang'] = 'Sprache für Rechtschreibkontrolle wählen'; +$lang['title_dw_cancel'] = 'Editor schließen'; +$lang['btn_fck_edit'] = 'CKG Editor'; +$lang['confirm_delete'] = 'Sind Sie sicher, dass Sie diese Seite löschen wollen?'; +$lang['confirm_preview'] = 'Jede nicht gespeicherte Bearbeitung wird verloren gehen.'; +$lang['editor_height'] = 'Editorhöhe'; +$lang['editor_height_title'] = 'Editor neuskalieren beim Neuladen'; +$lang['dw_btn_backup'] = 'Backup'; +$lang['title_dw_backup'] = 'Backup-Editor-Fenster & Renew-Zugangssperre'; +$lang['backup_empty'] = 'Es ist kein Backup vorhanden. Wollen Sie fortfahren?'; +$lang['btn_draft'] = 'Entwurf öffnen'; +$lang['title_draft'] = 'Entwurf anzeigen und bearbeiten'; +$lang['btn_exit_draft'] = 'Entwurf schließen'; +$lang['title_exit_draft'] = 'Zurück zum aktuellen Dokument.'; +$lang['draft_msg'] = 'Für dieses Dokument besteht eine Entwurfsversion. Der Knopf \'Entwurf\' schaltet zwischen diesem Dokument und dem Entwurf hin und her. Es können beide Dokumente bearbeitet oder gesichert werden.'; +$lang['whats_this'] = 'Was ist das?'; +$lang['complex_tables'] = 'Aktiviere komplexe Tabellen'; +$lang['minor_changes'] = 'Kleine Änderungen'; +$lang['discard_edits'] = 'Um Änderungen zu speichern klicke OK; um abzubrechen klicke Abbrechen.'; +$lang['dw_btn_styling'] = 'Schriftart bearbeiten'; +$lang['title_styling'] = 'Öffne mit Schriftart als markup'; +$lang['js']['font_err_1'] = 'Formatierungen können nicht in Links genutzt werden. Klicken Sie auf OK, um die folgende Korrektur zu akzeptieren:'; +$lang['js']['font_err_2'] = 'Um zu Überarbeiten, geben Sie den vollständigen Dokuwiki-Link unten, einschließlich Klammern ein. Um zum Editor zurückzukehren, klicken Sie auf Abbrechen.'; +$lang['js']['font_err_throw'] = 'Zeichenformatierungs-Fehler'; +$lang['js']['dwp_save_err'] = 'Speichern nicht möglich für:'; +$lang['js']['dwp_updated'] = 'Editor Priorität aktualisiert auf:'; +$lang['js']['dwp_not_sel'] = 'Editor-Priorität nicht ausgewählt: Es wird durch die Konfiguration der dw_users-Gruppe bestimmt'; +$lang['js']['mediamgr_notice'] = 'Verwenden Sie den Link Dialog um Links einzufügen'; +$lang['js']['font_conflict'] = 'Der Parser fand einen oder mehrere Link-Font-Konflikte. Wenn Sie auf OK klicken, können Sie zum Editor zurückkehren und die Schriftstile entfernen. Weitere Informationen finden Sie unter: https://www.dokuwiki.org/plugin:ckgedit:font_styling#conflicts_with_dokuwiki_links'; +$lang['mediamgr_imgonly'] = 'Benutzen Sie den Bild-Dialog nur für Bilder. Verwenden Sie den Link-Dialog für andere Dateitypen. Die betroffene Datei ist:'; +$lang['mediamgr_imgonly'] = 'Laden Sie nur Bilder hoch, wenn Sie den Bilddialog verwenden: '; +$lang['uprofile_title'] = 'Wählen Sie ihren Standard Editor'; +$lang['btn_val_dw_fb'] = 'DW Dateibrowser'; +$lang['btn_val_ckg_fb'] = 'CKG Dateibrowser'; +$lang['btn_title_dw_fb'] = 'Speichern und Editor schließen und zum DW Dateibrowser wechseln'; +$lang['btn_title_ckg_fb'] = 'Speichern und Editor schließen und zum CKG Dateibrowser wechseln'; +$lang['formatdel'] = 'Markup wurde aus Header(n) entfernt: Von DokuWiki nicht unterstützt'; +$lang['fontdel'] = 'Markup wurde aus Link(s) entfernt: Von DokuWiki nicht unterstützt'; +$lang['ws_cantcopy'] = 'Für das winstyle Setup: kann nicht kopiert werden nach'; +$lang['ws_copiedhtaccess'] = 'Für das winstyle Setup wurde das Security-aktivierte .htaccess nach data/media kopiert. Siehe ckgedit/fckeditor/userfiles/.htacess.security '; +$lang['userfiles_perm'] = 'Bitte überprüfen Sie die Berechtigungen; ckgedit hat keinen Zugriff'; +$lang['sym_not created_1'] = 'Kann nicht erstellt werden '; +$lang['sym_not created_2'] = 'Kann keine Symlinks für den Dateibrowser erstellen: kein Zugriff: '; +$lang['sym_not created_3'] = 'Es gab einen Fehler beim Versuch symbolische Links zu erstellen in'; +$lang['syms_created'] = 'Die folgenden Links wurden im Verzeichnis userfiles angelegt: '; +$lang['dblclk'] = 'Neues Feature: Doppelklick im Browserfenster um den DW Editor zum Bearbeiten eines Abschnitts an der Kursorposition zu öffnen. Siehe:
    direct_access_to_dokuwiki_editor. '; +$lang['dblclk_reminder'] = 'Erinnerung'; +$lang['ckg_img_paste'] = 'Zusätzliche Unterstützung beim Einfügen von Bildern aus der Zwischenablage'; +$lang['ckg_img_paste_title'] = 'Aus um doppeltes Einfügen zu verhindern, oder Ein, um Einfügen zu erlauben'; +$lang['js']['ckg_paste_restart'] = 'Beim Neuladen des Editors wird die zusätzliche Unterstützung für das Einfügen eingeschaltet.'; +$lang['on'] = 'Ein'; +$lang['off'] = 'Aus'; +$lang['js']['on'] = 'ein'; +$lang['js']['off'] = 'aus'; +$lang['broken_image'] = 'Benutze das ImagePaste Plugin mit dem Mediamanager oder versuche das MS Word Tool. STRG + V mit Bildern > 2,5M funktioniert evtl. nicht. Dieses Bild hat folgende Größe:'; +$lang['js']['broken_image_1'] = 'benutze das ImagePaste Plugin mit dem Dokuwiki Mediamanager oder versuche das MS Word Einfügen Tool'; +$lang['js']['broken_image_2'] = 'Bilder grösser 2,5M mit STRG + V einfügen funktioniert nicht. Dieses Bild hat folgende Größe:'; +$lang['menu'] = 'CKEditor CSS Tool'; +$lang['default_stylesheet'] = 'Ein Stylesheet für das aktuelle Template anlegen'; +$lang['alt_stylesheet'] = 'Ein Stylesheet für ein anderes Template anlegen'; +$lang['style_sheet'] = 'Stylesheet anlegen'; +$lang['style_sheet_msg'] = 'Ein Stylesheet für das aktuelle Template anlegen:'; +$lang['alt_style_sheet_msg'] = 'Stylesheet anlegen für:'; +$lang['checkbox'] = 'Nach ckeditor/css kopieren'; +$lang['stylesheet_oinfo'] = 'Info'; +$lang['stylesheet_cinfo'] = 'Info schließen'; +$lang['js']['stylesheet_oinfo'] = 'Info'; +$lang['js']['stylesheet_cinfo'] = 'Info schließen'; diff --git a/lib/plugins/ckgedit/lang/de/merger.txt b/lib/plugins/ckgedit/lang/de/merger.txt new file mode 100644 index 0000000..9bf0b91 --- /dev/null +++ b/lib/plugins/ckgedit/lang/de/merger.txt @@ -0,0 +1,6 @@ + + + - Diese Version von [[doku>plugin:ckgedit|ckgedit]] macht CKEditor Vers. 4.9 zur Vers. 4.10 mit aktuellem und besserem Javascript. + - Mit dem Upgrade auf 4.9 ging ckgedit mit [[doku>plugin:ckgdoku|ckgdoku]] zusammen. Siehe bei ckgdoku: [[doku>plugin:ckgdoku#configuration|configuration options]]. + +Evtl. Probleme melden bei [[https://github.com/turnermm/ckgedit/issues|ckgedit's issues]] auf github.// \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/de/scayt.txt b/lib/plugins/ckgedit/lang/de/scayt.txt new file mode 100644 index 0000000..5418108 --- /dev/null +++ b/lib/plugins/ckgedit/lang/de/scayt.txt @@ -0,0 +1 @@ +Die Scayt Rechtschreibprüfung stellt drei Auswahlmöglichkeiten zur Verfügung: An, Aus und Deaktiviert. Ab sofort ist die Standardeinstellung **Aus** statt **An**. Bei der Einstellung **An** werden die Inhalte des Bearbeitungsfensters von Scayt geparst und zur Rechtschreibprüfung an den Scayt-Server geschickt. Obwohl es keinen Grund gibt dies als Sicherheitsrisiko zu sehen, wurde diese Änderung für Benutzer mit privaten Wikis vorgenommen, die sich unwohl fühlen wenn deren Daten an einen entfernten Server geschickt werden. Wird die Einstellung "Deaktiviert" ausgewählt, wird die Rechtschreibprüfung vollständig entfernt. Weitere Informationen finden Sie auf der Konfigurations-Seite der ckgedit-Dokumentation unter https://www.dokuwiki.org/plugin:ckgedit:configuration#scayt_auto. diff --git a/lib/plugins/ckgedit/lang/de/settings.php b/lib/plugins/ckgedit/lang/de/settings.php new file mode 100644 index 0000000..272218a --- /dev/null +++ b/lib/plugins/ckgedit/lang/de/settings.php @@ -0,0 +1,60 @@ + + * @author Gunnar Lindenblatt + * @author WhitesnakeS04 + * @author Leo Rudin + * @author Juergen-aus-Koeln + * @author liz + * @author Christoph Ziehr + */ +$lang['fck_preview'] = 'FCK Vorschau Gruppe'; +$lang['guest_toolbar'] = 'Werkzeugleiste für Gäste anzeigen'; +$lang['guest_media'] = 'Gäste können Medien-Dateien verlinken'; +$lang['open_upload'] = 'Gäste können hochladen'; +$lang['default_fb'] = 'Standardmäßiger Zugang zum Durchsuchen der Dateien. Ohne diesen werden die Regeln der Zugangsverwaltung nicht angewendet.'; +$lang['openfb'] = 'Öffentlich alle Dateien durchsuchbar. Benutzer erhalten Zugang zur gesamten Verzeichnisstruktur, unabhängig von der jeweiligen Zugangsberechtigung. Die Zugriffsrechte gelten weiterhin bei Uploads.'; +$lang['dw_edit_display'] = 'Kontrolliert, welche Benutzer Zugang zur "DW Edit"-Taste haben. Möglichkeiten: "Alle" für alle Benutzer; "Admin" ausschließlich für Administratoren und Manager; "Niemand" für Keinen. Standardwert ist "Alle".'; +$lang['dw_edit_display_o_all'] = 'Alle'; +$lang['dw_edit_display_o_admin'] = 'Admin'; +$lang['dw_edit_display_o_none'] = 'Niemand'; +$lang['smiley_as_text'] = 'Smileys im CKeditor als Text anzeigen (wird im Browser weiterhin als Grafik angezeigt)'; +$lang['editor_bak'] = 'Sicherung auf meta/<namespace>.ckgedit speichern'; +$lang['create_folder'] = 'Aktiviere den neuen-Ordner-Button im Datei-Browser (y/n)'; +$lang['dwedit_ns'] = 'Komma-getrennte Liste aus Namensräumen und Seiten, bei welchen automatisch auf den ursprünglichen Dokuwiki-Editor umgeschaltet wird; Teilausdrücke werden akzeptiert.'; +$lang['acl_del'] = 'Default (kein Haken gesetzt) ermöglicht Benutzern mit Upload-Rechten media-Dateien zu löschen; wenn der Haken gesetzt wurde, benötigt der Benutzer die Berechtigung, aus dem Verzeichnis heraus zu löschen.'; +$lang['auth_ci'] = 'Die ID des Benutzer-Logins ist schreibungsunabhängig, d.h. beide Schreibweisen USER und user sind möglich.'; +$lang['nix_style'] = 'Für Windows-Server (Vista und später): Diese Einstellung ermöglicht den Zugang zu data\media durch ckgedit\CKeditor\userfiles, sofern Links zu media und file erfolgreich in userfiles angelegt wurden.'; +$lang['no_symlinks'] = 'Automatische Erstellung symbolischer Links unter ckgedit/userfiles deaktivieren.'; +$lang['direction'] = 'Einstellen der Sprach-Richtung in CKeditor: nocheck: ckgedit nimmt keine Einstellungsänderungen der Default-Richtung vor; dokuwiki: die aktuelle Dokuwiki Sprach-Richtung; ltr: von links nach rechts ; rtl: von rechts nach links.'; +$lang['scayt_auto'] = 'Aktiviere die SCAYT-Rechtschreibprüfung automatisch; Vorbelegt ist "An" = eingeschaltet. Zum Ausschalten von SCAYT auf "Aus" umstellen.'; +$lang['scayt_auto_o_on'] = 'An'; +$lang['scayt_auto_o_off'] = 'Aus'; +$lang['scayt_auto_o_disable'] = 'Deaktiviert'; +$lang['scayt_lang'] = 'Standard-Sprache für die SCAYT-Rechtschreibprüfung auswählen.'; +$lang['smiley_hack'] = 'Bei Umzug auf neuen Server, die URL für CKeditor\'s Smileys zurücksetzen. Dies passiert seitenweise, sobald die Seite zur Bearbeitung geladen und gespeichert wird. Diese Option sollte i.d.R. ausgeschaltet sein.'; +$lang['complex_tables'] = 'Den Algorithmus für komplexe Tabellen standardmäßig aktivieren. Im Gegensatz zur Standard-Syntaxanalyse von Tabellen, erreicht man hiermit bessere Ergebnisse, wenn Zellen miteinander über Zeilen oder Spalten hinweg verbunden werden. Jedoch auf Kosten leicht erhöhter Durchlaufzeit.'; +$lang['duplicate_notes'] = 'Setze dies auf "true", wenn Anwender mehrere, gleichlautende Fußnoten erstellen; verhindert, dass in diesem Fall die Funktionalität der Fußnoten beschädigt wird.'; +$lang['winstyle'] = 'Direkte Pfadangabe zum media-Verzeichnis verwenden anstatt fckeditor/userfiles. Dafür muss fckeditor/userfiles/.htaccess.security zu data/media kopiert und in .htaccess umbenannt werden.'; +$lang['other_lang'] = 'Ihre Standard-Sprache für den CKEditor ist die Sprache, die auch Ihr Browser besitzt. Sie können jedoch hier eine andere Sprache wählen; unabhängig von der Sprache im Dokuwiki Inteface.'; +$lang['dw_priority'] = 'Den Dokuwiki-Editor als Standard-Editor verwenden'; +$lang['preload_ckeditorjs'] = 'Die Javascript-Umgebung für den Ckeditor vorab laden, um den Editor-Aufruf zu beschleunigen'; +$lang['nofont_styling'] = 'Font Styles (= Schriftschnitt) im Editor als Plugin-Markup anzeigen. Weitere Informationen auf der ckgedit-Plugin-Seite unter Dokuwiki.org.'; +$lang['font_options'] = 'Entfernt die Option zum Einstellen der Schriftart.'; +$lang['color_options'] = 'Entfernt Farb-Optionen.'; +$lang['alt_toolbar'] = 'Funktionen, die nicht in der Werkzeugleiste angezeigt werden sollen'; +$lang['mfiles'] = 'mfile-Unterstützung einschalten.'; +$lang['extra_plugins'] = 'Durch Kommata getrennte Liste zusätzlicher CKeditor Plugins zum Einfügen in die Toolbar. Siehe Details bei "ckgedit plugin\'s" config page'; +$lang['dw_users'] = "Gruppenname der Benutzer, deren Standardeditor der DokuWiki-Editor ist, wenn dw_priority aktiviert ist. Wenn dieser Eintrag keinen Wert besitzt, haben alle Benutzer standardmäßig den DokuWiki-Editor, wenn dw_priority aktiviert ist."; +$lang['allow_ckg_filebrowser'] = 'Auswählen, welche(n) Datei/Medien Browser Benutzer verwenden können'; +$lang['default_ckg_filebrowser'] = 'Auswählen, welche(r) Datei/Medien Browser standardmäßig verwendet wird. Wenn der gewählte Browser unzulässig ist, wird überschrieben.'; +$lang['htmlblock_ok'] = 'Bei Verwendung von HTML_BLOCKs muss entweder diese Option oder die DokuWiki-Option htmlok eingeschaltet sein. Es stellt nicht das gleiche Sicherheitsrisiko dar wie htmlok. Dennoch sollte es nur in einer vertrauenswürdigen Benutzerumgebung und nicht in einem offenen Wiki verwendet werden. '; +$lang['dblclk'] = 'off schaltet das Bearbeiten einzelner Abschnitte (Sections) per Doppelklick mit dem DokuWiki-Editor aus (siehe: direct_access_to_dokuwiki_editor) '; +$lang['preserve_enc'] = 'Bewahre URL-Kodierung, falls die De-Akzent-Option von dokuwiki aktiv ist.'; +$lang['gui'] = 'Wähle CKEditor GUI (grafische Benutzeroberfläche)'; +$lang['rel_links'] = 'Aktiviere Unterstützung für relative interne Verknüpfungen und Bildverknüpfungen.'; +$lang['style_sheet'] = 'Ein alternatives Stylesheet für den CKEditor verwenden.' . + ' Für weitere Informationen siehe das CKEditor CSS Tool, unter weitere Plugins im Admin-Bereich.' . + ' Alternativ sind weitere Informationen auf der ckgedit plugin Seite zu finden.'; diff --git a/lib/plugins/ckgedit/lang/de/style.txt b/lib/plugins/ckgedit/lang/de/style.txt new file mode 100644 index 0000000..9d522ee --- /dev/null +++ b/lib/plugins/ckgedit/lang/de/style.txt @@ -0,0 +1,10 @@ +**Aktuelles Template Template** \\ + +Mit dieser App können Sie ein Stylesheet für das Bearbeitungsfenster des CKEditors anlegen, das auf Ihrem Template basiert. Das Stylesheet wird in Ihrem Template-Verzeichnis in einem Verzeichnis mit dem Namen **Styles** abgelegt, wenn Sie es speichern. Das Stylesheet wird den Namen *_styles.css** tragen. Um es zu aktivieren, müssen folgende Dinge getan werden: + + - es muss in **ckgedit/ckeditor/css** abgelegt werden. Dies wird automatisch geschehen, wenn Sie die Checkbox **Nach ckeditor/css kopieren** aktivieren. + - Die Option **Ein alternatives Stylesheet für den CKEditor verwenden.** in der Konfiguration muss aktiviert werden. + +**Weitere Templates, die installiert aber nicht aktiviert sind**\\ Sie können ebenfalls weitere Stylesheets für Templates anlegen, die in Ihrem tpl-Ordner vorhanden sind. Diese werden in den Styles-Ordner des entsprechenden Templates kopiert, nicht aber nach **ckeditor/css**. + +---- diff --git a/lib/plugins/ckgedit/lang/en.4.9.js.beautified b/lib/plugins/ckgedit/lang/en.4.9.js.beautified new file mode 100644 index 0000000..4f147a5 --- /dev/null +++ b/lib/plugins/ckgedit/lang/en.4.9.js.beautified @@ -0,0 +1,876 @@ +CKEDITOR.lang['en'] = { + "editor": "Rich Text Editor", + "editorPanel": "Rich Text Editor panel", + "common": { + "editorHelp": "Press ALT 0 for help", + "browseServer": "Browse Server", + "url": "URL", + "protocol": "Protocol", + "upload": "Upload", + "uploadSubmit": "Send it to the Server", + "image": "Image", + "flash": "Flash", + "form": "Form", + "checkbox": "Checkbox", + "radio": "Radio Button", + "textField": "Text Field", + "textarea": "Textarea", + "hiddenField": "Hidden Field", + "button": "Button", + "select": "Selection Field", + "imageButton": "Image Button", + "notSet": "", + "id": "Id", + "name": "Name", + "langDir": "Language Direction", + "langDirLtr": "Left to Right (LTR)", + "langDirRtl": "Right to Left (RTL)", + "langCode": "Language Code", + "longDescr": "Long Description URL", + "cssClass": "Stylesheet Classes", + "advisoryTitle": "Advisory Title", + "cssStyle": "Style", + "ok": "OK", + "cancel": "Cancel", + "close": "Close", + "preview": "Preview", + "resize": "Resize", + "generalTab": "General", + "advancedTab": "Advanced", + "validateNumberFailed": "This value is not a number.", + "confirmNewPage": "Any unsaved changes to this content will be lost. Are you sure you want to load new page?", + "confirmCancel": "You have changed some options. Are you sure you want to close the dialog window?", + "options": "Options", + "target": "Target", + "targetNew": "New Window (_blank)", + "targetTop": "Topmost Window (_top)", + "targetSelf": "Same Window (_self)", + "targetParent": "Parent Window (_parent)", + "langDirLTR": "Left to Right (LTR)", + "langDirRTL": "Right to Left (RTL)", + "styles": "Style", + "cssClasses": "Stylesheet Classes", + "width": "Width", + "height": "Height", + "align": "Alignment", + "left": "Left", + "right": "Right", + "center": "Center", + "justify": "Justify", + "alignLeft": "Align Left", + "alignRight": "Align Right", + "alignCenter": "Align Center", + "alignTop": "Top", + "alignMiddle": "Middle", + "alignBottom": "Bottom", + "alignNone": "None", + "invalidValue": "Invalid value.", + "invalidHeight": "Height must be a number.", + "invalidWidth": "Width must be a number.", + "invalidLength": "Value specified for the \"%1\" field must be a positive number with or without a valid measurement unit (%2).", + "invalidCssLength": "Value specified for the \"%1\" field must be a positive number with or without a valid CSS measurement unit (px, %, in, cm, mm, em, ex, pt, or pc).", + "invalidHtmlLength": "Value specified for the \"%1\" field must be a positive number with or without a valid HTML measurement unit (px or %).", + "invalidInlineStyle": "Value specified for the inline style must consist of one or more tuples with the format of \"name : value\", separated by semi-colons.", + "cssLengthTooltip": "Enter a number for a value in pixels or a number with a valid CSS unit (px, %, in, cm, mm, em, ex, pt, or pc).", + "unavailable": "%1, unavailable", + "keyboard": { + "8": "Backspace", + "13": "Enter", + "16": "Shift", + "17": "Ctrl", + "18": "Alt", + "32": "Space", + "35": "End", + "36": "Home", + "46": "Delete", + "112": "F1", + "113": "F2", + "114": "F3", + "115": "F4", + "116": "F5", + "117": "F6", + "118": "F7", + "119": "F8", + "120": "F9", + "121": "F10", + "122": "F11", + "123": "F12", + "124": "F13", + "125": "F14", + "126": "F15", + "127": "F16", + "128": "F17", + "129": "F18", + "130": "F19", + "131": "F20", + "132": "F21", + "133": "F22", + "134": "F23", + "135": "F24", + "224": "Command" + }, + "keyboardShortcut": "Keyboard shortcut", + "optionDefault": "Default" + }, + "about": { + "copy": "Copyright © $1. All rights reserved.", + "dlgTitle": "About CKEditor 4", + "moreInfo": "For licensing information please visit our web site:", + help: "Check $1 for help.", + userGuide: "CKEditor User's Guide" + }, + "basicstyles": { + "bold": "Bold", + "italic": "Italic", + "strike": "Strikethrough", + "subscript": "Subscript", + "superscript": "Superscript", + "underline": "Underline" + }, + "bidi": { + "ltr": "Text direction from left to right", + "rtl": "Text direction from right to left" + }, + "blockquote": { + "toolbar": "Block Quote" + }, + "notification": { + "closed": "Notification closed." + }, + "button": { + "selectedLabel": "%1 (Selected)" + }, + "toolbar": { + "toolbarCollapse": "Collapse Toolbar", + "toolbarExpand": "Expand Toolbar", + "toolbarGroups": { + "document": "Document", + "clipboard": "Clipboard/Undo", + "editing": "Editing", + "forms": "Forms", + "basicstyles": "Basic Styles", + "paragraph": "Paragraph", + "links": "Links", + "insert": "Insert", + "styles": "Styles", + "colors": "Colors", + "tools": "Tools" + }, + "toolbars": "Editor toolbars" + }, + "clipboard": { + "copy": "Copy", + "copyError": "Your browser security settings don't permit the editor to automatically execute copying operations. Please use the keyboard for that (Ctrl/Cmd+C).", + "cut": "Cut", + "cutError": "Your browser security settings don't permit the editor to automatically execute cutting operations. Please use the keyboard for that (Ctrl/Cmd+X).", + "paste": "Paste", + "pasteNotification": "Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.", + "pasteArea": "Paste Area", + "pasteMsg": "Paste your content inside the area below and press OK.", + "title": "Paste" + }, + "colorbutton": { + "auto": "Automatic", + "bgColorTitle": "Background Color", + "colors": { + "000": "Black", + "800000": "Maroon", + "8B4513": "Saddle Brown", + "2F4F4F": "Dark Slate Gray", + "008080": "Teal", + "000080": "Navy", + "4B0082": "Indigo", + "696969": "Dark Gray", + "B22222": "Fire Brick", + "A52A2A": "Brown", + "DAA520": "Golden Rod", + "006400": "Dark Green", + "40E0D0": "Turquoise", + "0000CD": "Medium Blue", + "800080": "Purple", + "808080": "Gray", + "F00": "Red", + "FF8C00": "Dark Orange", + "FFD700": "Gold", + "008000": "Green", + "0FF": "Cyan", + "00F": "Blue", + "EE82EE": "Violet", + "A9A9A9": "Dim Gray", + "FFA07A": "Light Salmon", + "FFA500": "Orange", + "FFFF00": "Yellow", + "00FF00": "Lime", + "AFEEEE": "Pale Turquoise", + "ADD8E6": "Light Blue", + "DDA0DD": "Plum", + "D3D3D3": "Light Grey", + "FFF0F5": "Lavender Blush", + "FAEBD7": "Antique White", + "FFFFE0": "Light Yellow", + "F0FFF0": "Honeydew", + "F0FFFF": "Azure", + "F0F8FF": "Alice Blue", + "E6E6FA": "Lavender", + "FFF": "White", + "1ABC9C": "Strong Cyan", + "2ECC71": "Emerald", + "3498DB": "Bright Blue", + "9B59B6": "Amethyst", + "4E5F70": "Grayish Blue", + "F1C40F": "Vivid Yellow", + "16A085": "Dark Cyan", + "27AE60": "Dark Emerald", + "2980B9": "Strong Blue", + "8E44AD": "Dark Violet", + "2C3E50": "Desaturated Blue", + "F39C12": "Orange", + "E67E22": "Carrot", + "E74C3C": "Pale Red", + "ECF0F1": "Bright Silver", + "95A5A6": "Light Grayish Cyan", + "DDD": "Light Gray", + "D35400": "Pumpkin", + "C0392B": "Strong Red", + "BDC3C7": "Silver", + "7F8C8D": "Grayish Cyan", + "999": "Dark Gray" + }, + "more": "More Colors...", + "panelTitle": "Colors", + "textColorTitle": "Text Color" + }, + "colordialog": { + "clear": "Clear", + "highlight": "Highlight", + "options": "Color Options", + "selected": "Selected Color", + "title": "Select color" + }, + "templates": { + "button": "Templates", + "emptyListMsg": "(No templates defined)", + "insertOption": "Replace actual contents", + "options": "Template Options", + "selectPromptMsg": "Please select the template to open in the editor", + "title": "Content Templates" + }, + "contextmenu": { + "options": "Context Menu Options" + }, + "copyformatting": { + "label": "Copy Formatting", + "notification": { + "copied": "Formatting copied", + "applied": "Formatting applied", + "canceled": "Formatting canceled", + "failed": "Formatting failed. You cannot apply styles without copying them first." + } + }, + "div": { + "IdInputLabel": "Id", + "advisoryTitleInputLabel": "Advisory Title", + "cssClassInputLabel": "Stylesheet Classes", + "edit": "Edit Div", + "inlineStyleInputLabel": "Inline Style", + "langDirLTRLabel": "Left to Right (LTR)", + "langDirLabel": "Language Direction", + "langDirRTLLabel": "Right to Left (RTL)", + "languageCodeInputLabel": " Language Code", + "remove": "Remove Div", + "styleSelectLabel": "Style", + "title": "Create Div Container", + "toolbar": "Create Div Container" + }, + "elementspath": { + "eleLabel": "Elements path", + "eleTitle": "%1 element" + }, + "filetools": { + "loadError": "Error occurred during file read.", + "networkError": "Network error occurred during file upload.", + "httpError404": "HTTP error occurred during file upload (404: File not found).", + "httpError403": "HTTP error occurred during file upload (403: Forbidden).", + "httpError": "HTTP error occurred during file upload (error status: %1).", + "noUrlError": "Upload URL is not defined.", + "responseError": "Incorrect server response." + }, + "find": { + "find": "Find", + "findOptions": "Find Options", + "findWhat": "Find what:", + "matchCase": "Match case", + "matchCyclic": "Match cyclic", + "matchWord": "Match whole word", + "notFoundMsg": "The specified text was not found.", + "replace": "Replace", + "replaceAll": "Replace All", + "replaceSuccessMsg": "%1 occurrence(s) replaced.", + "replaceWith": "Replace with:", + "title": "Find and Replace" + }, + "fakeobjects": { + "anchor": "Anchor", + "flash": "Flash Animation", + "hiddenfield": "Hidden Field", + "iframe": "IFrame", + "unknown": "Unknown Object" + }, + "flash": { + "access": "Script Access", + "accessAlways": "Always", + "accessNever": "Never", + "accessSameDomain": "Same domain", + "alignAbsBottom": "Abs Bottom", + "alignAbsMiddle": "Abs Middle", + "alignBaseline": "Baseline", + "alignTextTop": "Text Top", + "bgcolor": "Background color", + "chkFull": "Allow Fullscreen", + "chkLoop": "Loop", + "chkMenu": "Enable Flash Menu", + "chkPlay": "Auto Play", + "flashvars": "Variables for Flash", + "hSpace": "HSpace", + "properties": "Flash Properties", + "propertiesTab": "Properties", + "quality": "Quality", + "qualityAutoHigh": "Auto High", + "qualityAutoLow": "Auto Low", + "qualityBest": "Best", + "qualityHigh": "High", + "qualityLow": "Low", + "qualityMedium": "Medium", + "scale": "Scale", + "scaleAll": "Show all", + "scaleFit": "Exact Fit", + "scaleNoBorder": "No Border", + "title": "Flash Properties", + "vSpace": "VSpace", + "validateHSpace": "HSpace must be a number.", + "validateSrc": "URL must not be empty.", + "validateVSpace": "VSpace must be a number.", + "windowMode": "Window mode", + "windowModeOpaque": "Opaque", + "windowModeTransparent": "Transparent", + "windowModeWindow": "Window" + }, + "font": { + "fontSize": { + "label": "Size", + "voiceLabel": "Font Size", + "panelTitle": "Font Size" + }, + "label": "Font", + "panelTitle": "Font Name", + "voiceLabel": "Font" + }, + "forms": { + "button": { + "title": "Button Properties", + "text": "Text (Value)", + "type": "Type", + "typeBtn": "Button", + "typeSbm": "Submit", + "typeRst": "Reset" + }, + "checkboxAndRadio": { + "checkboxTitle": "Checkbox Properties", + "radioTitle": "Radio Button Properties", + "value": "Value", + "selected": "Selected", + "required": "Required" + }, + "form": { + "title": "Form Properties", + "menu": "Form Properties", + "action": "Action", + "method": "Method", + "encoding": "Encoding" + }, + "hidden": { + "title": "Hidden Field Properties", + "name": "Name", + "value": "Value" + }, + "select": { + "title": "Selection Field Properties", + "selectInfo": "Select Info", + "opAvail": "Available Options", + "value": "Value", + "size": "Size", + "lines": "lines", + "chkMulti": "Allow multiple selections", + "required": "Required", + "opText": "Text", + "opValue": "Value", + "btnAdd": "Add", + "btnModify": "Modify", + "btnUp": "Up", + "btnDown": "Down", + "btnSetValue": "Set as selected value", + "btnDelete": "Delete" + }, + "textarea": { + "title": "Textarea Properties", + "cols": "Columns", + "rows": "Rows" + }, + "textfield": { + "title": "Text Field Properties", + "name": "Name", + "value": "Value", + "charWidth": "Character Width", + "maxChars": "Maximum Characters", + "required": "Required", + "type": "Type", + "typeText": "Text", + "typePass": "Password", + "typeEmail": "Email", + "typeSearch": "Search", + "typeTel": "Telephone Number", + "typeUrl": "URL" + } + }, + "format": { + "label": "Format", + "panelTitle": "Paragraph Format", + "tag_address": "Address", + "tag_div": "Normal (DIV)", + "tag_h1": "Heading 1", + "tag_h2": "Heading 2", + "tag_h3": "Heading 3", + "tag_h4": "Heading 4", + "tag_h5": "Heading 5", + "tag_h6": "Heading 6", + "tag_p": "Normal", + "tag_pre": "Formatted" + }, + "horizontalrule": { + "toolbar": "Insert Horizontal Line" + }, + "iframe": { + "border": "Show frame border", + "noUrl": "Please type the iframe URL", + "scrolling": "Enable scrollbars", + "title": "IFrame Properties", + "toolbar": "IFrame" + }, + "image": { + "alt": "Alternative Text", + "border": "Border", + "btnUpload": "Send it to the Server", + "button2Img": "Do you want to transform the selected image button on a simple image?", + "hSpace": "HSpace", + "img2Button": "Do you want to transform the selected image on a image button?", + "infoTab": "Image Info", + "linkTab": "Link", + "lockRatio": "Lock Ratio", + "menu": "Image Properties", + "resetSize": "Reset Size", + "title": "Image Properties", + "titleButton": "Image Button Properties", + "upload": "Upload", + "urlMissing": "Image source URL is missing.", + "vSpace": "VSpace", + "validateBorder": "Border must be a whole number.", + "validateHSpace": "HSpace must be a whole number.", + "validateVSpace": "VSpace must be a whole number." + }, + "indent": { + "indent": "Increase Indent", + "outdent": "Decrease Indent" + }, + "smiley": { + "options": "Smiley Options", + "title": "Insert a Smiley", + "toolbar": "Smiley" + }, + "language": { + "button": "Set language", + "remove": "Remove language" + }, + "link": { + "acccessKey": "Access Key", + "advanced": "Advanced", + "advisoryContentType": "Advisory Content Type", + "advisoryTitle": "Advisory Title", + "anchor": { + "toolbar": "Anchor", + "menu": "Edit Anchor", + "title": "Anchor Properties", + "name": "Anchor Name", + "errorName": "Please type the anchor name", + "remove": "Remove Anchor" + }, + "anchorId": "By Element Id", + "anchorName": "By Anchor Name", + "charset": "Linked Resource Charset", + "cssClasses": "Stylesheet Classes", + "download": "Force Download", + "displayText": "Display Text", + "emailAddress": "E-Mail Address", + "emailBody": "Message Body", + "emailSubject": "Message Subject", + "id": "Id", + "info": "Link Info", + "langCode": "Language Code", + "langDir": "Language Direction", + "langDirLTR": "Left to Right (LTR)", + "langDirRTL": "Right to Left (RTL)", + "menu": "Edit Link", + "name": "Name", + "noAnchors": "(No anchors available in the document)", + "noEmail": "Please type the e-mail address", + "noUrl": "Please type the link URL", + "other": "", + "popupDependent": "Dependent (Netscape)", + "popupFeatures": "Popup Window Features", + "popupFullScreen": "Full Screen (IE)", + "popupLeft": "Left Position", + "popupLocationBar": "Location Bar", + "popupMenuBar": "Menu Bar", + "popupResizable": "Resizable", + "popupScrollBars": "Scroll Bars", + "popupStatusBar": "Status Bar", + "popupToolbar": "Toolbar", + "popupTop": "Top Position", + "rel": "Relationship", + "selectAnchor": "Select an Anchor", + "styles": "Style", + "tabIndex": "Tab Index", + "target": "Target", + "targetFrame": "", + "targetFrameName": "Target Frame Name", + "targetPopup": "", + "targetPopupName": "Popup Window Name", + "title": "Link", + "toAnchor": "Link to anchor in the text", + "toEmail": "E-mail", + "toUrl": "URL", + "toolbar": "Link", + "type": "Link Type", + "unlink": "Unlink", + "upload": "Upload" + }, + "list": { + "bulletedlist": "Insert/Remove Bulleted List", + "numberedlist": "Insert/Remove Numbered List" + }, + "liststyle": { + "armenian": "Armenian numbering", + "bulletedTitle": "Bulleted List Properties", + "circle": "Circle", + "decimal": "Decimal (1, 2, 3, etc.)", + "decimalLeadingZero": "Decimal leading zero (01, 02, 03, etc.)", + "disc": "Disc", + "georgian": "Georgian numbering (an, ban, gan, etc.)", + "lowerAlpha": "Lower Alpha (a, b, c, d, e, etc.)", + "lowerGreek": "Lower Greek (alpha, beta, gamma, etc.)", + "lowerRoman": "Lower Roman (i, ii, iii, iv, v, etc.)", + "none": "None", + "notset": "", + "numberedTitle": "Numbered List Properties", + "square": "Square", + "start": "Start", + "type": "Type", + "upperAlpha": "Upper Alpha (A, B, C, D, E, etc.)", + "upperRoman": "Upper Roman (I, II, III, IV, V, etc.)", + "validateStartNumber": "List start number must be a whole number." + }, + "magicline": { + "title": "Insert paragraph here" + }, + "maximize": { + "maximize": "Maximize", + "minimize": "Minimize" + }, + "newpage": { + "toolbar": "New Page" + }, + "pagebreak": { + "alt": "Page Break", + "toolbar": "Insert Page Break for Printing" + }, + "pastetext": { + "button": "Paste as plain text", + "pasteNotification": "Press %1 to paste. Your browser doesn‘t support pasting with the toolbar button or context menu option.", + "title": "Paste as Plain Text" + }, + "pastefromword": { + "confirmCleanup": "The text you want to paste seems to be copied from Word. Do you want to clean it before pasting?", + "error": "It was not possible to clean up the pasted data due to an internal error", + "title": "Paste from Word", + "toolbar": "Paste from Word" + }, + "preview": { + "preview": "Preview" + }, + "print": { + "toolbar": "Print" + }, + "removeformat": { + "toolbar": "Remove Format" + }, + "save": { + "toolbar": "Save" + }, + "selectall": { + "toolbar": "Select All" + }, + "showblocks": { + "toolbar": "Show Blocks" + }, + "sourcearea": { + "toolbar": "Source" + }, + "specialchar": { + "options": "Special Character Options", + "title": "Select Special Character", + "toolbar": "Insert Special Character" + }, + "scayt": { + "btn_about": "About SCAYT", + "btn_dictionaries": "Dictionaries", + "btn_disable": "Disable SCAYT", + "btn_enable": "Enable SCAYT", + "btn_langs": "Languages", + "btn_options": "Options", + "text_title": "Spell Check As You Type" + }, + "stylescombo": { + "label": "Styles", + "panelTitle": "Formatting Styles", + "panelTitle1": "Block Styles", + "panelTitle2": "Inline Styles", + "panelTitle3": "Object Styles" + }, + "table": { + "border": "Border size", + "caption": "Caption", + "cell": { + "menu": "Cell", + "insertBefore": "Insert Cell Before", + "insertAfter": "Insert Cell After", + "deleteCell": "Delete Cells", + "merge": "Merge Cells", + "mergeRight": "Merge Right", + "mergeDown": "Merge Down", + "splitHorizontal": "Split Cell Horizontally", + "splitVertical": "Split Cell Vertically", + "title": "Cell Properties", + "cellType": "Cell Type", + "rowSpan": "Rows Span", + "colSpan": "Columns Span", + "wordWrap": "Word Wrap", + "hAlign": "Horizontal Alignment", + "vAlign": "Vertical Alignment", + "alignBaseline": "Baseline", + "bgColor": "Background Color", + "borderColor": "Border Color", + "data": "Data", + "header": "Header", + "yes": "Yes", + "no": "No", + "invalidWidth": "Cell width must be a number.", + "invalidHeight": "Cell height must be a number.", + "invalidRowSpan": "Rows span must be a whole number.", + "invalidColSpan": "Columns span must be a whole number.", + "chooseColor": "Choose" + }, + "cellPad": "Cell padding", + "cellSpace": "Cell spacing", + "column": { + "menu": "Column", + "insertBefore": "Insert Column Before", + "insertAfter": "Insert Column After", + "deleteColumn": "Delete Columns" + }, + "columns": "Columns", + "deleteTable": "Delete Table", + "headers": "Headers", + "headersBoth": "Both", + "headersColumn": "First column", + "headersNone": "None", + "headersRow": "First Row", + "invalidBorder": "Border size must be a number.", + "invalidCellPadding": "Cell padding must be a positive number.", + "invalidCellSpacing": "Cell spacing must be a positive number.", + "invalidCols": "Number of columns must be a number greater than 0.", + "invalidHeight": "Table height must be a number.", + "invalidRows": "Number of rows must be a number greater than 0.", + "invalidWidth": "Table width must be a number.", + "menu": "Table Properties", + "row": { + "menu": "Row", + "insertBefore": "Insert Row Before", + "insertAfter": "Insert Row After", + "deleteRow": "Delete Rows" + }, + "rows": "Rows", + "summary": "Summary", + "title": "Table Properties", + "toolbar": "Table", + "widthPc": "percent", + "widthPx": "pixels", + "widthUnit": "width unit" + }, + "undo": { + "redo": "Redo", + "undo": "Undo" + }, + "widget": { + "move": "Click and drag to move", + "label": "%1 widget" + }, + "uploadwidget": { + "abort": "Upload aborted by the user.", + "doneOne": "File successfully uploaded.", + "doneMany": "Successfully uploaded %1 files.", + "uploadOne": "Uploading file ({percentage}%)...", + "uploadMany": "Uploading files, {current} of {max} done ({percentage}%)..." + }, + "wsc": { + "btnIgnore": "Ignore", + "btnIgnoreAll": "Ignore All", + "btnReplace": "Replace", + "btnReplaceAll": "Replace All", + "btnUndo": "Undo", + "changeTo": "Change to", + "errorLoading": "Error loading application service host: %s.", + "ieSpellDownload": "Spell checker not installed. Do you want to download it now?", + "manyChanges": "Spell check complete: %1 words changed", + "noChanges": "Spell check complete: No words changed", + "noMispell": "Spell check complete: No misspellings found", + "noSuggestions": "- No suggestions -", + "notAvailable": "Sorry, but service is unavailable now.", + "notInDic": "Not in dictionary", + "oneChange": "Spell check complete: One word changed", + "progress": "Spell check in progress...", + "title": "Spell Checker", + "toolbar": "Check Spelling" + } +}; +CKEDITOR.lang.en["indent"] = { + indent: "Nested List", + outdent: "Decrease Nesting" +}; +CKEDITOR.lang.en["stylescombo"]["label"] = "Code"; +CKEDITOR.lang.en.image.alt = "HoverTip"; +CKEDITOR.lang.en["fbrowser"] = { + FileBrowserError_101: "Folder already exists.", + FileBrowserError_102: "Invalid folder name", + FileBrowserError_103: "You have no permissions to create the folder.", + FileBrowserError_110: "Unknown error creating folder", + FileBrowserError_201: "A file with the same name is already available. The uploaded file has been renamed to: ", + FileBrowserError_202: "Invalid file", + FileBrowserError_203: "You do not have permission to upload files to this folder. If you think this is incorrect please notify your administrator.", + FileBrowserError_204: "Unable to delete the selected file", + FileBrowserError_205: "Unable to rename the selected file; check your directory/write permisssions", + FileBrowserError_206: " already exists; you must either delete or rename it. ", + FileBrowserError_default: "Error on your request. Error number: ", + FileBrowserError_Ajax: "Your browser does not support AJAX.", + FileBrowserError_XML: "The server didn't reply with a proper XML data. Please check your configuration.", + FileBrowserError_Folder_Submit: "Please type the folder name.", + FileBrowserError_File_Submit: "Please select a file from your computer", + FileBrowserError_Upload: "Error on upload. Error number: ", + FileBrowserError_Connector: "The connector is disabled. Check editor/filemanager/connectors/php/config.php", + FileBrowserError_Command: "Unsupported command: ", + FileBrowserError_Type: "Invalid type specified: ", + FolderMoveWarning: "You can only move files to a folder one level below the current directory", + FileBrowserError_301: "The uploaded file exceeds the upload_max_filesize directive in php.ini.", + FileBrowserError_302: "The uploaded file exceeds the MAX_FILE_SIZE directive that was specified in the HTML form.", + FileBrowserError_303: "The uploaded file was only partially uploaded.", + FileBrowserError_304: "No file was uploaded.", + FileBrowserError_306: "Missing a temporary folder.", + FileBrowserError_307: "Failed to write file to disk.", + FileBrowserError_308: "PHP does not provide a way to ascertain which extension caused the file upload to stop; examining the list of loaded extensions with phpinfo() may help.", + DlgFileBrowserUpMsg: "Upload a new file in this folder", + DlgFileBrowserRead: "read-only", + DlgFileBrowserWrite: "uploadable", + DlgFileBrowserNewFolder: "Create Folder", + DlgFileBrowserResourceType: "Resource Type", + DlgLnkUpload: "Upload", + DlgFileBrowserMove: "Move", + LinkText: "Link Display Text
    User defined Text (takes precedence over Page Name or ID)", + InternalLink: "internal link", + InternalMedia: "internal media", + MediaFileLink: "link to media file", + InterWikiLink: "Interwiki Link", + InterWikiType: "Interwiki Type", + InterwikiPlaceHolder: "Interwiki Replacement Text", + InterwikiInfo: "
    Dokuwiki's interwiki links are short-cuts which look like this: [[wp>Shakespeare]], which will create a link to the English Wikipedia article on Shakespeare. The wp part designates a link pattern; the text following the '>' will be inserted into the link, replacing a place holder, which is enclosed in curly brackets, as in {NAME}. When there is no place holder, the replacement text will be appended to the end of the link.
    ", + MediaFileLink: "link to media file", + SMBLabel: "Samba Share", + GetHeadingsLabel: "Get Headings", + QStringLabel: "Query String (For example: value_1=1&value_2=2) ", + ResetQS: "Reset Query String", + NotSetOption: "Not Set", + AdvancedInfo: "To create anchors from Dokuwiki headers, click on the Get Headings button, select the header, click OK. You can go back, select a new page and get new headers.", + AdvancedTabPrompt: "Use the advanced tab to create page anchors and query strings", + SMBExample: "Enter your share as: \\\\Server\\directory\\file", + DlgFileBrowserWaitingMsg: "Loading files, please wait.", + DlgFileBrowserAdjustSize: "Adjust browser size", + DlgFileBrowserReset: "Reset", + DlgFileBrowserSortBy: "Sort by", + DlgFileBrowserSortDate: "Date", + DlgFileBrowserSortSize: "File size", + DlgFileBrowserSortName: "Name", + DlgFileBrowserButtonHelp: "Help", + DlgFileBrowserResizeMsg: "The file browser window will be reset to the default size after your page is reloaded into the editor.", + DlgFileBrowserSearch: "Find file(s)", + DlgFileBrowserSortOrder: "Reverse order", + DlgFileBrowserInfo_1: "If you increase the zoom level of your browser, Ckgedit's file browser may exceed the size of its enclosing window, forcing scrollbars. To eliminate the scrollbars, you can enlarge the window up to 20%. The new size takes effect after you have closed and re-opened the editor. Resizing uses a cookie with a year's duration. ", + DlgFileBrowserInfo_2: "The file listings can be sorted by Name, Date, and File Size. By default they sort in ascending order, but Date and File Size can be sorted in descending order by checking the Reverse Order option. The sort functions are not supported by Internet Explorer but do work in Win 10 Edge.", + DlgFileBrowserInfo_3: "The search functions will search using whole or part of a file name." +}; +CKEDITOR.lang.en["footnote"] = { + FootNoteInfo: '
    • To create a footnote enter the footnote text into the editing box and click OK
    • To edit a footnote enter the footnote id into the id box and click the Load button.
      The footnote will appear in the editing box, where you can then edit it.
      When you are finished editing, click OK to save.
    • A footnote id has this form: fckgL_<n>, where n is the number of the note.
    ', + ToolTip: "Insert a footnote", + Settings: "Settings", + Header: "This dialog window lets you create and edit footnotes.", + Label_1: "Footnote Text (required)", + Label_2: "Footnote Id: ", + LoadButtonLabel: "Load Note In Editor", + Title: "Footnote Dialog", + Validate: "The footnote text field cannot be empty." +}; +CKEDITOR.lang.en["fontassist"] = { + Title: "Font Plugin Editor", + ToolTip: "Check and Revise Font Styling", + MainHeader: "View and optionally alter text styled with the font plugin .", + SelectColor: " Select Color", + SelectedTextColor: "Selected Text Color", + SelectedBGColor: "Selected Background Color", + BGColors: "Background Colors", + InfoText: '
    This tool works with the font plugin and is used to update the font plugin\'s syntax and/or view its enclosed text. Clicking anywhere on the plugin syntax or its text will enable you to check the appearance of the font, its colors, and its size.

    You can also update the plugin syntax in place. To do this you must select both the font syntax itself and the enclosed text:

    <font. . . >text</font>

    Then whatever changes you make with this tool can be inserted into the editor window, by clicking OK, and will replace the current font syntax.

    The font syntax will appear in the textbox below the display window and is updated with each change. Clicking on the text will select the text for copying.
    ', + Main: "Main", + Text: "Text", + IfChecked: " If checked, uncheck to activate OK button", + Fonts: "Fonts", + FontSizes: "Font Sizes (px)", + ResetFont: "Reset font", + ResetAll: "Reset all", + TextColors: "Text Colors", + Accept: "Accept", + Reset: "Reset", + none: "none" +}; +CKEDITOR.lang.en["signature"] = { + ToolTip: "Insert signature" +}; +CKEDITOR.lang.en.format["panelTitle"] = "Section Headers"; +CKEDITOR.lang.en.format["label"] = "Headlines"; +CKEDITOR.lang.en.stylescombo["panelTitle"] = "Formatting Code Styles"; +CKEDITOR.lang.en["stylescombo"]["label"] = "Code"; +CKEDITOR.lang.en.common.alignBaseLine = "Baseline"; +CKEDITOR.lang.en["indent"] = { + indent: "Nested List", + outdent: "Decrease Nesting" +}; +CKEDITOR.lang.en.common["noLink"] = "No link"; +CKEDITOR.lang.en.common["linkType"] = "Link type"; +CKEDITOR.lang.en.common["linkDetail"] = "Detail"; +CKEDITOR.lang.en.common["linkDirect"] = "Direct"; +CKEDITOR.lang.en.common["linkNoLink"] = "No Link"; +CKEDITOR.lang.en.common["linkOnly"] = "Link only"; \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/en/hogfather.txt b/lib/plugins/ckgedit/lang/en/hogfather.txt new file mode 100644 index 0000000..2ea6a3b --- /dev/null +++ b/lib/plugins/ckgedit/lang/en/hogfather.txt @@ -0,0 +1 @@ +This version of ckgedit has been adapted for the hogfather dokuwiki distribution. The most significant difference from previous versions is that it no longer has access to the ckgedit filebrowser. It uses instead the dokuwiki media app for media and its linkwiz for internal links. See [[doku>plugin:ckgedit#note_on_hogfather]] diff --git a/lib/plugins/ckgedit/lang/en/lang.php b/lib/plugins/ckgedit/lang/en/lang.php new file mode 100644 index 0000000..1622497 --- /dev/null +++ b/lib/plugins/ckgedit/lang/en/lang.php @@ -0,0 +1,80 @@ +New Feature: double click browser window to open DW Editor for section editing at cursor. See: direct_access_to_dokuwiki_editor. "; +$lang['dblclk_reminder'] = "Reminder "; +$lang['ckg_img_paste'] = 'Turn supplementary image paste support'; +$lang['ckg_img_paste_title'] = 'Off to prevent double pastes, or on to enable pastes'; +$lang['js']['ckg_paste_restart'] = 'On reloading the editor, supplementary paste support will be turned'; +$lang['on'] ='on'; +$lang['off'] ='off'; +$lang['js']['on'] ='on'; +$lang['js']['off'] ='off'; +$lang['broken_image'] = "Use the imagePaste plugin with the Dokuwiki Mediamanager or try the MS Word Paste Tool. Raw data of Ctrl-v images over 2.5M can hang. This image is: " ; +$lang['js']['broken_image_1'] = "Use the imagePaste plugin with the Dokuwiki Mediamanager or try the MS Word Paste Tool."; +$lang['js']['broken_image_2'] = "Ctrl-v images with raw data over 2.5M can hang. This image is: " ; +$lang['menu'] = 'CKEditor editor CSS tool'; +$lang['default_stylesheet'] = 'Create a style sheet for the current template'; +$lang['alt_stylesheet'] = 'Create a stylesheet for another template'; +$lang['style_sheet'] = 'Create Style sheet'; +$lang['style_sheet_msg'] = 'Creating Style sheet for the current template:'; +$lang['alt_style_sheet_msg'] = 'Creating Style sheet for:'; +$lang['checkbox'] = 'Copy to ckeditor/css'; +$lang['stylesheet_oinfo'] = 'Info'; +$lang['stylesheet_cinfo'] = 'Close Info'; +$lang['js']['stylesheet_oinfo'] = 'Info'; +$lang['js']['stylesheet_cinfo'] = 'Close Info'; +$lang['js']['lock_msg'] = "Your lock for editing this page is about to expire in one minute\n"; +$lang['js']['willexpire'] = 'Your lock for editing this page is about to expire in a minute.\nTo avoid conflicts use the backup button to reset the locktimer.'; +$lang['list_in_table'] = 'Dokuwiki does not support lists in tables. The list markup has been removed but the content retained'; diff --git a/lib/plugins/ckgedit/lang/en/scayt.txt b/lib/plugins/ckgedit/lang/en/scayt.txt new file mode 100644 index 0000000..550fce4 --- /dev/null +++ b/lib/plugins/ckgedit/lang/en/scayt.txt @@ -0,0 +1,3 @@ +The Scayt spellchecker offers three Configuration Options: on, off, disabled. As of now, the default setting will be **off** instead of **on**. With **on** the contents of the editor is parsed by Scayt and sent for spell-checking to a Scayt server. While there is no reason to believe this is a security risk, nevertheless this change is being made out of consideration for users with private wikis who may feel anxious having their data sent to a remote server. When set to “disable” The spell checker is removed entirely. Further information can be found in the Configuration Options page of the ckgedit documentation at https://www.dokuwiki.org/plugin:ckgedit:configuration#scayt_auto. + + diff --git a/lib/plugins/ckgedit/lang/en/settings.php b/lib/plugins/ckgedit/lang/en/settings.php new file mode 100644 index 0000000..cecf4e5 --- /dev/null +++ b/lib/plugins/ckgedit/lang/en/settings.php @@ -0,0 +1,58 @@ +nocheck
    : ckgedit will make no changes to the default direction setting; ' + . ' dokuwiki: the current Dokuwiki language direction; ltr: Left-to-right ; rtl: Right-to-left.'; +$lang['scayt_auto'] = 'Set whether or not the Scayt check-as-you-type spell checker is active at startup. Defaults to off; the user can re-enable spell checking on a per page basis.' . + ' To remove the Scayt spell checker completely, select disable. '. + '(See ckgedit:configuration#scayt_auto") '; +$lang['scayt_auto_o_on'] = 'on'; +$lang['scayt_auto_o_off'] = 'off'; +$lang['scayt_auto_o_disable'] = 'disable'; +$lang['scayt_lang']="Set SCAYT default language."; +$lang['smiley_hack'] = "Reset URL for CKeditor's smilies when moving to new server. This is done on a page by page basis when page is loaded for editing and saved. This option should normally be turned off."; +$lang['complex_tables'] ="Use the complex tables algorithm. As opposed to the standard parsing of tables, this should give better results when mixing complex arrangements of rowspans and colspans. But slightly more processing time."; +$lang['duplicate_notes'] = "Set this to true if users create multiple footnotes with the same footnote texts; required to prevent notes from being corrupted."; +$lang['winstyle'] = 'Use direct path to media directory instead of fckeditor/userfiles. This function copies
    fckeditor/userfiles/.htaccess.security to data/media/.htaccess; if not, this should be done manually'; +$lang['other_lang'] = 'Your default language for the CKEditor is the language set for your browser. You can, however, choose another language here; it is independent of the Dokuwiki interface language.'; +#$lang['dw_priority'] = "Make Dokuwiki editor the default editor: does not work in farms"; +$lang['nofont_styling'] = 'Display font styles in editor as plugin markup. See the ckgedit plugin page at Dokuwiki.org for details.'; +$lang['font_options'] = 'Remove font options.'; +$lang['color_options'] = 'Remove Color options.'; +$lang['alt_toolbar'] = 'Functions to remove from CKEditor toolbar.

    Any other functions can be removed by including them as a comma separated list in the text box:

    ' . + 'Bold, Italic, Underline, Strike, Subscript, Superscript, RemoveFormat, Find, Replace, SelectAll, Scayt, ' . + 'Image, Table, Tags, Link, Unlink, Format, Styles,TextColor, BGColor, NumberedList, BulletedList, ' . + 'Cut, Copy, Paste, PasteText, PasteFromWord, Undo, Redo, Source, Maximize, About.'; + +$lang['mfiles'] = 'Enable mfile support'; +$lang['extra_plugins'] = "Comma separated list of additional Ckeditor plugins to be added to toolbar. See ckgedit plugin's config page for details"; +#$lang['dw_users'] = "Group name of users whose editor defaults to Dokuwiki editor when dw_priority is selected. If not defined, then all users get the native Dokuwiki editor when dw_priority is selected."; +$lang['allow_ckg_filebrowser'] = 'Select which file/media browser(s) users can use'; +$lang['default_ckg_filebrowser'] = 'Select which file/media browser is the default. This will be overridden if the selected browser is not allowed'; +$lang['htmlblock_ok'] ='When using HTML_BLOCKs either this setting or Dokuwiki\'s htmlok option must be enabled. ' . + ' It doesn\'t pose the same level of security risk as htmlok. Nevertheless, it is should be used only in a trusted user environment, and not in an open wiki.'; +$lang['dblclk']="Set to off to turn off the double click feature which enables section editing using the Dokuwiki editor (see: direct_access_to_dokuwiki_editor)"; +$lang['preserve_enc'] ="Preserve urlencoding in urls when the dokuwiki deaccent option is active."; +$lang['gui'] = "Select CKEditor GUI."; +$lang['rel_links'] = "Activate support for relative internal and image links"; +$lang['style_sheet'] = 'Use an alternate style sheet for the Ckeditor editing window.' . + ' For more information see the CKEditor editor CSS tool, under Additional Plugins on the Admin page. Or ' . + ' see the ckgedit plugin page.'; +$lang['imgpaste'] = 'If the imgpaste plugin is installed, use the imgpaste naming system for naming your saved images.'; + diff --git a/lib/plugins/ckgedit/lang/en/style.txt b/lib/plugins/ckgedit/lang/en/style.txt new file mode 100644 index 0000000..bc72bd2 --- /dev/null +++ b/lib/plugins/ckgedit/lang/en/style.txt @@ -0,0 +1,11 @@ +**Current Template** \\ +With this app you can create a style sheet for the CKEditor's editing window that is based on your template. It will place the style sheet in your template folder in the directory named **Styles**, which will be created when the style sheet is saved. The style sheet will be named **_styles.css**. To activate this style sheet two things must be done: + + - it must be placed in **ckgedit/ckeditor/css**. This will automatically be done for you if you check off the checkbox labeled **Copy to ckeditor/css.** + - The **style_sheet** option in the ''Configuration Settings'' must be set to **true**. + +**Other templates: installed but not activated** \\ You can also create additional style sheets for other templates which you might have stored in your **tpl** folder. These will be copied to the Styles folder of the respective templates but not to **ckeditor/css**. + +---- + + diff --git a/lib/plugins/ckgedit/lang/eo/lang.php b/lib/plugins/ckgedit/lang/eo/lang.php new file mode 100644 index 0000000..0f3d43a --- /dev/null +++ b/lib/plugins/ckgedit/lang/eo/lang.php @@ -0,0 +1,33 @@ + + */ +$lang['btn_dw_edit'] = 'DW-Redakti'; +$lang['dw_btn_fck_preview'] = 'CKG-Antaŭrigardo'; +$lang['dw_btn_lang'] = 'Lingvo'; +$lang['title_dw_delete'] = 'Forigi paĝon'; +$lang['title_dw_edit'] = 'Konservi la laboron, Eliri kaj Ŝanĝi al la standarda DokuWiki-redaktilo'; +$lang['dw_btn_revert'] = 'Malfari'; +$lang['title_dw_revert'] = 'Reiri al antaŭa savkopio'; +$lang['title_dw_lang'] = 'Elekti lingvon de ortografikontrolo'; +$lang['title_dw_cancel'] = 'Forlasi la redaktilon'; +$lang['btn_fck_edit'] = 'CKG-Redaktilo'; +$lang['confirm_delete'] = 'Ĉu vi vere volas forigi ĉi-tiun paĝon?'; +$lang['confirm_preview'] = 'Ajna laboro estos perdita.'; +$lang['dw_btn_backup'] = 'Savkopio'; +$lang['title_dw_backup'] = 'Savkopia fenestro & bloki forigon'; +$lang['backup_empty'] = 'La savkopio ŝajnas malplena. Ĉu vi volas daŭrigi?'; +$lang['btn_draft'] = 'Akiri skizon'; +$lang['title_draft'] = 'Rigardi, Montri, Redakti skizon'; +$lang['btn_exit_draft'] = 'Forlasi la skizon'; +$lang['title_exit_draft'] = 'Reiri al la aktuala dokumento'; +$lang['draft_msg'] = 'Tiu dokumento havas skizon. La skizo-butono ŝaltas inter la dokumento kaj la skizo. Vi povas modifi kaj konservi unu el ambaŭ.'; +$lang['whats_this'] = 'kio estas tio?'; +$lang['complex_tables'] = 'Ebligi kompleksajn tabelojn'; +$lang['minor_changes'] = 'Etaj modifoj'; +$lang['discard_edits'] = 'Por konservi viajn modifojn klaku OK, por rezigni klaku Nuligi'; +$lang['dw_btn_styling'] = 'Modifi tiparojn'; +$lang['title_styling'] = 'Malfermi kun tipar-stiloj en markup-formato'; diff --git a/lib/plugins/ckgedit/lang/eo/settings.php b/lib/plugins/ckgedit/lang/eo/settings.php new file mode 100644 index 0000000..1fa6357 --- /dev/null +++ b/lib/plugins/ckgedit/lang/eo/settings.php @@ -0,0 +1,38 @@ + + * @author Robert Bogenschneider + */ +$lang['groups'] = 'Grupo, kiu rajtas malebligi la blokad-kalkulilon (malaktuala)'; +$lang['fck_preview'] = 'FCK Antaŭrigarda grupo'; +$lang['guest_toolbar'] = 'Montri la ilaron al gastoj'; +$lang['guest_media'] = 'Gastoj rajtas ligi al aŭdvidaj dosieroj'; +$lang['open_upload'] = 'Gastoj rajtas alŝuti'; +$lang['default_fb'] = 'Maniero de dosierrigardado. Sen tio ACL ne validas (ne okazas alirkontrolo).'; +$lang['openfb'] = 'Malferma rigardado de dosieroj. Tio ebligas uzantojn aliri kompletajn dosierujajn strukturojn, sendepende de legpermesoj. Alirkontrolo tamen validas por alŝutoj.'; +$lang['dw_edit_display'] = 'Difinas, kiuj uzantoj povas aliri la "DW Edit"-butonon. Elektoj: "all" por ĉiuj uzantoj; "admin" nur por la superuzanto kaj administrantoj; "none" por neniu. Standardo estas "all".'; +$lang['smiley_as_text'] = 'Montri ridetulojn kiel tekston en CKeditor (montriĝos tamen kiel bildo en foliumilo)'; +$lang['editor_bak'] = 'Konservi sekureckopion al meta/<namespace>.ckgedit'; +$lang['create_folder'] = 'Ĉu ebligi butonon por krei dosierujojn en la dosier-foliumilo (y/n)?'; +$lang['dwedit_ns'] = 'Komo-disigita listo de nomspacoj, kie ckgedit aŭtomate ŝaltas al la interna DokuWiki-editoro.'; +$lang['acl_del'] = 'La defaŭlto (sen marko) permesas al uzantoj kun alŝutpermeso forigi aŭdvidajn dosierojn; se la kesto estas markita, la uzanto bezonas forig-permeson por forigi ion el la dosierujo.'; +$lang['auth_ci'] = 'Ĉu ignori usklecon, tio signifas, ke vi povas ensaluti kaj kiel UZANTO kaj kiel uzanto?'; +$lang['nix_style'] = 'Por Vindozaj serviloj (Vista kaj poste). Tiu agordo ebligas aliri data\media tra ckgedit\CKeditor\userfiles, se ligiloj al dosieroj sukcese kreiĝis en userfiles'; +$lang['no_symlinks'] = 'Malebligi aŭtomatan kreadon de simbolaj ligiloj en ckgedit/userfiles.'; +$lang['direction'] = 'Indiki la direkton de la lingvo en CKeditor: nocheck: ckgedit faras neniujn ŝanĝojn en la standarda lingvodirekto; dokuwiki: la momenta lingvodirekto de Dokuwiki; ltr: Maldekstre-dekstren; rtl: Dekstre-maldekstren.'; +$lang['scayt_auto'] = 'Aŭtomate aktivigi la SCAYT-korektilon. Standardo estas "on". Por malŝalti SCAYT, elektu "off".'; +$lang['scayt_lang'] = 'Indiki la standardan lingvon por SCAYT.'; +$lang['smiley_hack'] = 'Nuligi URL por la ridetuloj de CKEditor dum translokiĝo al alia servilo. Ĉio okazas paĝon post paĝo, kiam paĝo estas ŝargata por modifado kaj konservata. Normale la opcio estu malŝaltita.'; +$lang['complex_tables'] = 'Uzi la algoritmon por kompleksaj tabeloj. Male al la standarda parsado se tabeloj, devus veni pli bonaj rezultoj kun kompleksaj aranĝoj de kombinitaj linioj kaj kolumnoj. Sed bezonas iom pli da prilabora tempo.'; +$lang['duplicate_notes'] = 'Diru jes al tio, se uzantoj kreas plurajn piednotojn el la sama piednota teksto; necesa por eviti fuŝadon de piednotoj.'; +$lang['winstyle'] = 'Uzi rektan padon al la aŭdvida dosierujo anstataŭ fckeditor/userfiles. Tio necesigas kopii fckeditor/userfiles/.htaccess.security al data/media kaj renomi ĝin .htaccess'; +$lang['other_lang'] = 'La standarda lingvo de la CKEditoro estas la lingvo instalita en via foliumilo. Vi povas tamen elekti alian lingvon ĉi tie; temas pri interfaca lingvo sendependa de DokuWiki.'; +$lang['dw_priority'] = 'Uzi la DokuWiki-editoron standarde'; +$lang['preload_ckeditorjs'] = 'Antaŭŝargi la javaskripton de ckeditor por rapidigi la ekstarton de la redaktilo'; +$lang['nofont_styling'] = 'Montri tipar-stilojn en la redaktilo en kromaĵ-formato. Vd. la ckgedit-paĝon ĉe dokuwiki.org pri detaloj.'; +$lang['font_options'] = 'Forigi tipar-opciojn.'; +$lang['color_options'] = 'Forigi kolor-opciojn.'; +$lang['alt_toolbar'] = 'Funkcioj forigendaj el la CKEditor-ilaro'; diff --git a/lib/plugins/ckgedit/lang/es/lang.php b/lib/plugins/ckgedit/lang/es/lang.php new file mode 100644 index 0000000..a8c40ad --- /dev/null +++ b/lib/plugins/ckgedit/lang/es/lang.php @@ -0,0 +1,73 @@ + + * @author Olaf Reitmaier + */ +$lang['btn_dw_edit'] = 'Editor DW'; +$lang['dw_btn_fck_preview'] = 'Prevista CKG'; +$lang['dw_btn_lang'] = 'Idioma'; +$lang['title_dw_delete'] = 'Borrar Página'; +$lang['title_dw_edit'] = 'Guardar, Salir y Cambia al Editor Nativo Dokuwiki'; +$lang['dw_btn_revert'] = 'Revertir'; +$lang['title_dw_revert'] = 'Revertir a un respaldo previo'; +$lang['title_dw_lang'] = 'Seleccione el idioma del corrector ortográfico'; +$lang['title_dw_cancel'] = 'Salir del Editor'; +$lang['btn_fck_edit'] = 'Editor CKG'; +$lang['confirm_delete'] = 'Seguro desea eliminar esta página?'; +$lang['confirm_preview'] = 'Cualquier cambio no guardado se perderá.'; +$lang['editor_height'] = 'Alto del Editor'; +$lang['editor_height_title'] = 'Ajustar tamaño del editor al recargar'; +$lang['dw_btn_backup'] = 'Respaldar'; +$lang['title_dw_backup'] = 'Respaldar la ventana del editor & Renovar el bloqueo'; +$lang['backup_empty'] = 'El buffer de respaldo para vacío. Desea continua?'; +$lang['btn_draft'] = 'Cargar Borrador'; +$lang['title_draft'] = 'Ver, Mostrar, Editar Borrador'; +$lang['btn_exit_draft'] = 'Salir del Borrador'; +$lang['title_exit_draft'] = 'Regresar al documento actual'; +$lang['draft_msg'] = 'Este documento tiene un borrador. El botón de borrar intercambia entre este documento y el borrador. Usted puede editar y guardar cualquier de los dos.'; +$lang['whats_this'] = 'Qué es esto?'; +$lang['complex_tables'] = 'Habilitar tablas complejas'; +$lang['minor_changes'] = 'Cambios menores'; +$lang['discard_edits'] = 'Para guardar los cambios presione OK; para descartar presione Cancel'; +$lang['dw_btn_styling'] = 'Editar Fuentes'; +$lang['title_styling'] = 'Abrir con las fuentes mostradas como etiquetas'; +$lang['js']['font_err_1'] = 'Estilos de fuentes no puede ser incluído en vínculos. Presione OK para aceptar la siguiente correción:'; +$lang['js']['font_err_2'] = 'Para revisar, ingrese debajo el vínculo Dokuwiki completo, incluyendo los corchetes. Para regresar al Editor presione Cancel.'; +$lang['js']['font_err_throw'] = 'Error de Formato de Fuente'; +$lang['js']['dwp_save_err'] = 'Imposible guardar los cambios en:'; +$lang['js']['dwp_updated'] = 'La prioridad del Editor ha sido actualizada a:'; +$lang['js']['dwp_not_sel'] = 'La prioridad del Editor no está seleccionada: será determinada por el parámetro de configuración dw_users_group'; +$lang['js']['mediamgr_notice'] = 'Use la ventana de vínculo para insertar'; +$lang['js']['font_conflict'] = 'El interprete encontró uno o más conflictos vínculos-fuentes. Presionando OK, retornará al editor y removerá los estilos de fuente. Para mayor información véa: https://www.dokuwiki.org/plugin:ckgedit:font_styling#conflicts_with_dokuwiki_links'; +$lang['js']['ckg_paste_restart'] = 'Al recargar el editor, el soporte de pegado suplementario se activará'; +$lang['js']['on'] = 'Encendido'; +$lang['js']['off'] = 'Apagado'; +$lang['js']['broken_image_1'] = 'Usa el plugin imagePaste con el Dokuwiki Mediamanager o prueba la herramienta MS Word Paste.'; +$lang['js']['broken_image_2'] = 'Se pueden colgar imágenes Ctrl-v con datos en bruto de más de 2.5M. Esta imagen es:'; +$lang['mediamgr_imgonly'] = 'Cargue imágenes solamente usando la ventana de imágenes:'; +$lang['uprofile_title'] = 'Seleccione Su Editor Predeterminado'; +$lang['btn_val_dw_fb'] = 'Explorador de Archivos DW'; +$lang['btn_val_ckg_fb'] = 'Explorador de Archivos CKG'; +$lang['btn_title_dw_fb'] = 'Guardar y cerrar el editor y cambiar al Explorador de Archivos DW'; +$lang['btn_title_ckg_fb'] = 'Guardar y cerrar el editor y cambiar al Explorador de Archivos CKG'; +$lang['formatdel'] = 'Etiquetas removidas de(los) encabezado(s): no soportados por Dokuwiki'; +$lang['fontdel'] = 'Etiquetas de Fuentes removidas de(los) vínculo(s): no soportados por Dokuwiki'; +$lang['ckgcke_conflict'] = 'Se ha detectado una copia de ckgedit. Tanto ckgedit como ckgedit deben ser desactivados. '; +$lang['ws_cantcopy'] = 'Para la configuración de winstyle: no se puede copiar a'; +$lang['ws_copiedhtaccess'] = 'Para la configuración de Winstyle, copiado el .htaccess de seguridad a los datos/medios de comunicación +Ver ckgedit/fckeditor/userfiles/.htacess.security '; +$lang['userfiles_perm'] = 'Por favor, compruebe los permisos; ckgedit no puede acceder '; +$lang['sym_not created_1'] = 'Incapaz de crear'; +$lang['sym_not created_2'] = 'No puede crear enlaces simbólicos para el navegador de archivos: no puede acceder: '; +$lang['sym_not created_3'] = 'Hubo un error al tratar de crear enlaces simbólicos en'; +$lang['syms_created'] = 'Los siguientes enlaces fueron creados en el directorio de archivos de usuario:'; +$lang['dblclk'] = 'Nueva Característica: doble click en la ventana del navegador para abrir el DW Editor para editar la sección en el cursor. Ver: direct_access_to_dokuwiki_editor.'; +$lang['dblclk_reminder'] = 'Recordatorio'; +$lang['ckg_img_paste'] = 'Girar el soporte suplementario de pegado de imágenes'; +$lang['ckg_img_paste_title'] = 'Apagado para evitar los pegados dobles, o encendido para permitir los pegados'; +$lang['on'] = 'Encendido'; +$lang['off'] = 'Apagado'; +$lang['broken_image'] = 'Usa el plugin imagePaste con el Dokuwiki Mediamanager o probar la herramienta MS Word Paste. Los datos en bruto de las imágenes Ctrl-v de más de 2.5M pueden colgarse. Esta imagen es: '; diff --git a/lib/plugins/ckgedit/lang/es/merger.txt b/lib/plugins/ckgedit/lang/es/merger.txt new file mode 100644 index 0000000..a06dcf0 --- /dev/null +++ b/lib/plugins/ckgedit/lang/es/merger.txt @@ -0,0 +1,4 @@ + - Esta versión de [[doku>plugin:ckgedit|ckgedit]] actualiza CKEditor de la 4.9 a la 4.10, lo que proporciona un javascript actualizado y mejorado. + - Con la actualización a 4.9, ckgedit se fusionó con [[doku>plugin:ckgdoku|ckgdoku]]. Ver las opciones de configuración de ckgdoku [[doku>plugin:ckgdoku#configuration|configuration options]]. + +Por favor, informe de cualquier problema a [[https://github.com/turnermm/ckgedit/issues|ckgedit's issues]] en github \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/es/scayt.txt b/lib/plugins/ckgedit/lang/es/scayt.txt new file mode 100644 index 0000000..de64463 --- /dev/null +++ b/lib/plugins/ckgedit/lang/es/scayt.txt @@ -0,0 +1 @@ +El corrector ortográfico Scayt ofrece tres opciones de configuración: encendido, apagado y desactivado. A partir de ahora, la configuración por defecto será **off** en lugar de **on**. Con **on** el contenido del editor es analizado por Scayt y enviado para el corrector ortográfico a un servidor Scayt. Aunque no hay razón para creer que esto sea un riesgo de seguridad, sin embargo este cambio se hace por consideración a los usuarios con wikis privados que pueden sentirse ansiosos de que sus datos sean enviados a un servidor remoto. Se puede encontrar más información en la página de Opciones de Configuración de la documentación de ckgedit en https://www.dokuwiki.org/plugin:ckgedit:configuration#scayt_lang. \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/es/settings.php b/lib/plugins/ckgedit/lang/es/settings.php new file mode 100644 index 0000000..3a7a7c8 --- /dev/null +++ b/lib/plugins/ckgedit/lang/es/settings.php @@ -0,0 +1,49 @@ + + * @author Olaf Reitmaier + */ +$lang['groups'] = 'Grupo al que se le permite deshabilitar el temporizador de bloqueos (obsoleto)'; +$lang['fck_preview'] = 'Previsualizar Grupo FCK'; +$lang['guest_toolbar'] = 'Mostrar Barra de Herramientas a los Invitados'; +$lang['guest_media'] = 'Pueden los Invitados Vincular Archivos Multimedia'; +$lang['open_upload'] = 'Pueden los Invitados Cargar'; +$lang['default_fb'] = 'Acceso de exploración de archivos Predeterminado. Con ninguno (none), las listas de control de acceso (acl) no aplican.'; +$lang['openfb'] = 'Abrir Explorador de Archivos. Otorga al usuario acceso a la estructura completa de directorios, sin importar si tiene o no permisos. Las listas de control de '; +$lang['dw_edit_display'] = 'Controla cuáles usuarios tienen acceso al botón "Editor DW". Opciones "all" para todos los usuarios; "admin" para admin y administradores solamente; "none" para ninguno. Por defecto en "all".'; +$lang['smiley_as_text'] = 'Mostrar emoticones como texto en el Editor CK (se mostrarán como imágenes en el navegador)'; +$lang['editor_bak'] = 'Guardar respaldo en meta/<namespace>.ckgedit'; +$lang['create_folder'] = 'Habilitar botón de creación de carpetas en explorador de archivos (y/n)'; +$lang['dwedit_ns'] = 'Lista separada de espacios de nombres y páginas donde ckgedit automáticamente cambie hacia el Editor nativo de DokuWiki; aceptar coincidencias parciales.'; +$lang['acl_del'] = 'Predeterminado (no chequeado) permite a los usuarios con permite de borrar archivos '; +$lang['auth_ci'] = 'El nombre de usuario (login id) es sensible a mayúsculas/minúsculas, es decir, usted puede iniciar sesión con ambos USUARIO y usuario'; +$lang['nix_style'] = 'Para servidores Windows (Vista y posteriores). Este parámetro hace posible acceder data\media a través de ckgedit\CKeditor\userfiles, si los enlaces a media y file han sido creados en userfiles'; +$lang['no_symlinks'] = 'Deshabiltiar la creación automática de enlaces simbólicos en ckgedit/userfiles.'; +$lang['direction'] = 'Define la dirección del lenguaje en el editor CK: nocheck: ckgedit no hará cambios en el sentido por defecto; dokuwiki: la dirección actual del lenguaje en Dokuwiki; ltr: Izquierda-a-derecha ; rtl: Derecha-a-izquierda.'; +$lang['scayt_auto'] = 'Automáticamente habilitar el corrector ortográfico SCAYT. Por defecto es "on". Para deshabilitarlo seleccione "off".'; +$lang['scayt_lang'] = 'Definir el lenguaje por defecto de SCAYT'; +$lang['smiley_hack'] = 'Reiniciar la URL de los emoticones del editor CK cuando se está moviendo a un nuevo servidor. Esto se hace página por página cuando se carga para editarla y se guarda. Esta opción debería normalmente estar apagada.'; +$lang['complex_tables'] = 'Usar el algoritmo de tablas complejas. Opuesto al estándar de interpretación de tablas, este debería dar mejores resultados cuando se mezclan arreglos complejos de rowspan y colspans. Per ligeramente con mayor tiempo de procesamiento.'; +$lang['duplicate_notes'] = 'Defina esto en true si los usuarios crean múltiples notas al pie con el mismo texto; requerido para prevenir que las notas al pie se corrompan.'; +$lang['winstyle'] = 'Utilizar la ruta directa al directorio media en lugar de fckeditor/userfiles. Esta función copia
    fckeditor/userfiles/.htaccess.security a data/media/.htaccess; si no, esto debe hacerse de forma manual.'; +$lang['other_lang'] = 'Por defecto, el idioma predeterminado del editor CK es el idioma del navegador. Sin embargo, usted puede seleccionar otro idioma aquí, esto es independiente del lenguaje de la interfaz de Dokuwiki'; +$lang['dw_priority'] = 'Hacer Dokuwiki el editor predeterminado: no funciona en farms'; +$lang['preload_ckeditorjs'] = 'Precargar el javascript del editor CK para acelerar las subsecuentes cargas del editor'; +$lang['nofont_styling'] = 'Mostrar los estilos de fuentes en el editor como etiquetas. Véa la página del plugin ckgedit en Dokuwiki.org para más detalles.'; +$lang['font_options'] = 'Deshabilitar las opciones de fuentes.'; +$lang['color_options'] = 'Deshabilitar las opciones de Color.'; +$lang['alt_toolbar'] = 'Funciones a ocultar en la barra de herramientas del Editor CK.

    Cualquier función puede ser ocultada incluyéndola como en una lista separada por comas:

    Bold, Italic, Underline, Strike, Subscript, Superscript, RemoveFormat, Find, Replace, SelectAll, Scayt, Image, Table, Tags, Link, Unlink, Format, Styles,TextColor, BGColor, NumberedList, BulletedList, Cut, Copy, Paste, PasteText, PasteFromWord, Undo, Redo, Source, Maximize, About.'; +$lang['mfiles'] = 'Habilita el soporte mfile'; +$lang['extra_plugins'] = 'Listado separado por comas de plugins adicionales del editor CK que serán añadidos a la barra de herramientas. Véa los plugins de ckgedit config page para más detalles.'; +$lang['dw_users'] = 'Nombre del grupo de usuarios para quienes el editor por defecto es el editor de Dokuwiki cuando dw_priority está seleccionado. Si no está definido, entonces todos los usuarios usan el editor nativo de Dokuwiki cuando dw_priority esté seleccionado.'; +$lang['allow_ckg_filebrowser'] = 'Seleccione los navegadores de archivos/medios que pueden utilizar los usuarios '; +$lang['default_ckg_filebrowser'] = 'Seleccione qué navegador de archivos/medios es el predeterminado. Esto se anulará si el navegador seleccionado no está permitido '; +$lang['captcha_auth'] = 'Nivel de ACL en el que el captcha se apaga cuando la opción parausuarios del plugin del captcha se ajusta a true. El valor por defecto es ACL_CREATE, lo que significa que cualquier usuario con ACL_EDIT o menos obtendrá el captcha, ACL_CREATE o más alto no lo hará. '; +$lang['htmlblock_ok'] = 'Cuando se usa HTML_BLOCKs esta configuración o la opción htmlok de Dokuwiki debe estar activada. No supone el mismo nivel de riesgo de seguridad que htmlok. Sin embargo, debe ser usado sólo en un entorno de usuario de confianza, y no en un wiki abierto. '; +$lang['dblclk'] = 'Configurar off para desactivar la característica de doble clic que permite la edición de secciones usando el editor de Dokuwiki (ver: direct_access_to_dokuwiki_editor) '; +$lang['preserve_enc'] = 'Preservar la codificación de url en las urls cuando la opción de desactivación de dokuwiki está activa.'; +$lang['gui'] = 'Seleccionar CKEditor GUI.'; +$lang['rel_links'] = 'Activar el soporte para los enlaces internos y de imagen relativos'; diff --git a/lib/plugins/ckgedit/lang/fa/lang.php b/lib/plugins/ckgedit/lang/fa/lang.php new file mode 100644 index 0000000..38dfd44 --- /dev/null +++ b/lib/plugins/ckgedit/lang/fa/lang.php @@ -0,0 +1,74 @@ + + */ +$lang['btn_dw_edit'] = 'ویرایش دوکوویکی'; +$lang['dw_btn_fck_preview'] = 'پیش‌نمایش CKG'; +$lang['dw_btn_lang'] = 'زبان'; +$lang['title_dw_delete'] = 'حذف صفحه'; +$lang['title_dw_edit'] = 'ذخیره کار، خروج، و انتقال به ویرایشگر اصلی دوکوویکی'; +$lang['dw_btn_revert'] = 'برگشت'; +$lang['title_dw_revert'] = 'برگشت به بکاپ قبلی'; +$lang['title_dw_lang'] = 'انتخاب زبان برای بررسی هِجی'; +$lang['title_dw_cancel'] = 'خروج از ویرایشگر'; +$lang['btn_fck_edit'] = 'ویرایش CKG'; +$lang['confirm_delete'] = 'آیا مطمئنید می‌خواهید این صفحه را حذف کنید؟'; +$lang['confirm_preview'] = 'هر کار که ذخیره نشده باشد از دست خواهد رفت.'; +$lang['editor_height'] = 'ارتفاع ویرایشگر'; +$lang['editor_height_title'] = 'اندازه ویرایشگر هنگام بارگذاری مجدد بِروز خواهد شد'; +$lang['dw_btn_backup'] = 'بکاپ'; +$lang['title_dw_backup'] = 'بکاپ‌گرفتن از پنجره ویرایشگر و تجدید قفل'; +$lang['backup_empty'] = 'حافظه بکاپ ظاهراً خالی است. آیا می‌خواهید ادامه دهید؟'; +$lang['btn_draft'] = 'دریافت پیش‌نویس'; +$lang['title_draft'] = 'دیدن، نمایش، ویرایش پیش‌نویس'; +$lang['btn_exit_draft'] = 'خروج از پیش‌نویس'; +$lang['title_exit_draft'] = 'بازگشت به سند فعلی'; +$lang['draft_msg'] = 'این سند یک فایل پیش‌نویس دارد. دکمه پیش‌نویس بین این سند و پیش‌نویس جابجا می‌کند. شما می‌توانید هر یک از این دو را ویرایش یا ذخیره کنید.'; +$lang['whats_this'] = 'این چیست؟'; +$lang['complex_tables'] = 'فعالسازی امکان جداول پیچیده'; +$lang['minor_changes'] = 'تغییرات جزئی'; +$lang['discard_edits'] = 'برای ذخیره ویرایش‌هایتان روی بلی کلیک کنید؛ برای حذف روی لغو کلیک کنید'; +$lang['dw_btn_styling'] = 'ویرایش فونت‌ها'; +$lang['title_styling'] = 'گشودن با نوع فونتهای نشان‌داده‌شده به عنوان مارکاپ'; +$lang['js']['font_err_1'] = 'نوه فونت نمی‌تواند در این پیوندها مشمول شود. برای پذیرفتن تصحیح زیر روی بلی کلیک کنید:'; +$lang['js']['font_err_2'] = 'جهت تجدیدنظر، مارکاپ کامل پیوند دوکوویکی را شامل براکت‌ها در پایین وارد کنید. +برای بازگشت به ویرایشگر روی لغو کلیک کنید'; +$lang['js']['font_err_throw'] = 'خطای فرمت‌دهی فونت'; +$lang['js']['dwp_save_err'] = 'عدم امکان ذخیره تغییرات در:'; +$lang['js']['dwp_updated'] = 'اولویت ویرایشگر بِروزسازی شد به:'; +$lang['js']['dwp_not_sel'] = 'اولویت ویرایشگر انتخاب نشد: این توسط تنظیمات config گروه dw_users تعیین می‌شود'; +$lang['js']['mediamgr_notice'] = 'از دیالوگ پیوند برای واردکردن استفاده کنید'; +$lang['js']['font_conflict'] = 'Parser دچار یک یا تعداد بیشتر مشکلات فونتِ پیوند شد. با کلیک روی بلی شما می‌توانید به ویرایشگر برگردید و نوعهای فونت را بردارید.برای اطلاعات بیشتر نگاه کنید به: https://www.dokuwiki.org/plugin:ckgedit:font_styling#conflicts_with_dokuwiki_links'; +$lang['js']['ckg_paste_restart'] = 'هنگام بارگذاری مجدد ویرایشگر، پشتیبانی اضافی paste به این صورت در می‌آید:'; +$lang['js']['on'] = 'روشن'; +$lang['js']['off'] = 'خاموش'; +$lang['js']['broken_image_1'] = 'از پلاگین ImagePaste به همراه مدیریت رسانه‌ای دوکوویکی استفاده شود یا ابزار paste نرم‌افزار MS Word امتحان شود.'; +$lang['js']['broken_image_2'] = 'Ctrl-v کردن تصاویر به همراه داده‌های خام با حجم بیش از ۲.۵ مگابایت می‌تواند هنگ کند. این تصویر عبارتست از:'; +$lang['mediamgr_imgonly'] = 'از دیالوگ تصاویر فقط برای تصواویر استفاده شود، برای سایر رسانه‌ها از دیالوگ پیوند. این فایل عبارتست از:'; +$lang['uprofile_title'] = 'ویرایشگر پیش‌فرض خود را انتخاب کنید'; +$lang['btn_val_dw_fb'] = 'مرورگر فایل دوکوویکی'; +$lang['btn_val_ckg_fb'] = 'مرورگر فایل CKG'; +$lang['btn_title_dw_fb'] = 'ذخیره و بستن ویرایشگر و انتقالبه مرورگر فایل دوکوویکی'; +$lang['btn_title_ckg_fb'] = 'ذخیره و بستن ویرایشگر و انتقالبه مرورگر فایل CKG'; +$lang['formatdel'] = 'مارکاپ از سرتیترها برداشته شد: توسط دوکوویکی پشتیبانی نمی‌شود'; +$lang['fontdel'] = 'مارکاپ فونت از پیوندها برداشته شد: توسط دوکوویکی پشتیبانی نمی‌شود'; +$lang['ckgcke_conflict'] = 'یک رونوشت از ckgedit شناسایی شد. یا ckgedit یا ckgedit باید غیرفعال شوند.'; +$lang['ws_cantcopy'] = 'برای نصب ویندوزمانند: نمی‌توان رونوشت کرد به:'; +$lang['ws_copiedhtaccess'] = 'برای نصب ویندوزمانند، فایل.htaccess فعال‌شده از نظر امنیت به data/media کپی شد. +نگاه کنید به ckgedit/fckeditor/userfiles/.htacess.security'; +$lang['userfiles_perm'] = 'لطفا اجازه‌های دسترسی را بررسی کنید؛ ckgedit نمی‌تواند دسترسی یابد'; +$lang['sym_not created_1'] = 'عدم امکان ایجاد'; +$lang['sym_not created_2'] = 'نمی‌تواند پیوندهای نمادین برای مرورگر فایل ایجاد کند: نمی‌تواند دسترسی یابد:'; +$lang['sym_not created_3'] = 'رخ‌دادن خطایی هنگام تلاش برای ایجاد پیوندهای نمادین در:'; +$lang['syms_created'] = 'پیوندهای زیر در پوشه userfiles ایجاد شدند:'; +$lang['dblclk'] = 'ویژگیهای جدید: +روی پنجره مرورگر کلیک دوتایی کنید تا ویرایشگر دوکوویکی برای ویرایش بخشی در محل مکان‌نما باز شود. نگاه کنید: direct_access_to_dokuwiki_editor. '; +$lang['dblclk_reminder'] = 'یادآور '; +$lang['ckg_img_paste'] = 'پشتیبانی اضافی paste تصویر'; +$lang['ckg_img_paste_title'] = 'خاموش جهت پیشگیری از paste دوتایی، یا فعال‌کردن paste ها'; +$lang['on'] = 'روشن'; +$lang['off'] = 'خاموش'; +$lang['broken_image'] = 'از پلاگین ImagePaste به همراه مدیریت رسانه‌ای دوکوویکی استفاده شود یا ابزار Paste نرم‌افزار MS Word امتحان شود. داده‌های خام Ctrl-v تصاویر بزرگتر از ۲.۵ مگابایت می‌تواند هنگ کند. این تصویر عبارتست از:'; diff --git a/lib/plugins/ckgedit/lang/fa/merger.txt b/lib/plugins/ckgedit/lang/fa/merger.txt new file mode 100644 index 0000000..4de1538 --- /dev/null +++ b/lib/plugins/ckgedit/lang/fa/merger.txt @@ -0,0 +1,5 @@ +- این نسخه از [[doku>plugin:ckgedit|ckgedit]] پلاگین CKGEditor را از ۴.۹ به ۴.۱۰ ارتقا می‌دهد، که جاوااسکریپت بِروز و بهبودیافته‌ای می‌دهد. +- با ارتقا به ۴.۹، ckgedit با [[doku>plugin:ckgdoku|ckgdoku]] یکی شد. نگاه‌کنید به [[doku>plugin:ckgdoku#configuration|گزینه‌های پیکربندی]] ckgdoku. + +لطفاً هر مشکلی را به +[[https://github.com/turnermm/ckgedit/issues|مسائل ckgedit]] گزارش دهید. \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/fa/scayt.txt b/lib/plugins/ckgedit/lang/fa/scayt.txt new file mode 100644 index 0000000..12ef465 --- /dev/null +++ b/lib/plugins/ckgedit/lang/fa/scayt.txt @@ -0,0 +1,2 @@ +بررسی‌کننده هِجی Scayt سه گزینه پیکربندی ارائه می‌کند: روشن، خاموش، غیرفعال. تاکنون گزینه پیش‌فرض **خاموش** بوده نه **روشن**. با **روشن** محتویات ویرلیشگر توسط Scayt تجزیه‌ شده و برای بررسی هجی به یک سِرور Scayt ارسال می‌شود. اگر چه هیچ دلیلی برای این فکر که این یک ریسک امنیتی باشد وجود ندارد، با اینحال این تغییر برای کاربرانی با ویکی خصوصی که نگران ارسال داده‌هایشان به یک سِرور دوردست هستند انجام شد. +اطلاعات بیشتر می‌تواند در صفحه گزینه‌های پیکربندی مستندات ckgedit در نشانی زیر یافت شود: https://www.dokuwiki.org/plugin:ckgedit:configuration#scayt_lang. \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/fa/settings.php b/lib/plugins/ckgedit/lang/fa/settings.php new file mode 100644 index 0000000..25a52d8 --- /dev/null +++ b/lib/plugins/ckgedit/lang/fa/settings.php @@ -0,0 +1,32 @@ + + */ +$lang['groups'] = 'گروه اجازه دارد تایمر قفل را غیرفعال کند (منسوخ)'; +$lang['fck_preview'] = 'گروه پیش‌نمایش FCK'; +$lang['guest_toolbar'] = 'نمایش نوارابزار به میهمانان'; +$lang['guest_media'] = 'میهمان بتواند به فایلهای رسانه‌ای پیوند دهد'; +$lang['open_upload'] = 'میهمان بتواند بارگذاری کند'; +$lang['default_fb'] = 'دسترسی مرور فایل پیش‌فرض. با هیچکدام، acl اِعمال نمی‌شود.'; +$lang['openfb'] = 'مرور فایل آزاد. این به کاربر دسترسی به کل ساختار دایرکتوری را می‌دهد، فارغ از آنکه کاربر اجازه داشته باشد یا نه. ACL همچنان درخصوص بارگذاریها اِعمال می‌شود.'; +$lang['dw_edit_display'] = 'کنترل می‌کند کدام کاربران به دکمه "ویرایشگر دوکوویکی" دسترسی داشته باشند.گزینه‌ها: "همه" برای همه کاربران؛ "ادمین" تنها برای ادمین‌ و مدیران؛ "هیچکدام" برای هیچ کس. پیش‌فرض روی "همه".'; +$lang['smiley_as_text'] = 'لبخندک‌ها در CKeditor به صورت متن نشان داده شود (در مرورگر همچنان به صورت تصویر نشان داده می‌شود)'; +$lang['editor_bak'] = 'ذخیره بکاپ در meta/<namespace>.ckgedit'; +$lang['create_folder'] = 'فعالسازی دکمه ایجاد پوشه در مرورگر فایل (y/n)'; +$lang['dwedit_ns'] = 'لیست با کاما جدا شده فضاهای نام و/یا صفحه‌هایی که ckgedit به صورت خودکار به ویرایشگر اصلی دوکوویکی شیفت کند؛ مطابقت‌های بخشی را هم می‌پذیرد.'; +$lang['acl_del'] = 'حالت پیش‌فرض (جعبه بدون تیک) به کاربران دارای اجازه بارگذاری امکان می‌دهد فایلهای رسانه‌ای را حذف کنند؛ اگر جعبه تیک زده شود، جهت حذف از پوشه، کاربر نیاز به اجازه حذف خواهد داشت.'; +$lang['auth_ci'] = 'شناسه ورود کاربر ناحساس به کوچک و بزرگ بودن حروف است، یعنی شما می‌توانید هم به عنوان USER و هم user وارد شوید.'; +$lang['nix_style'] = 'برای سِرورهای ویندوز (ویستا و بعدتر). این تنظیم ممکن می‌کند توسط ckgedit\CKeditor\userfiles به data\media دسترسی یافت، اگر پیوندها به رسانه و فایل در فایلهای کاربر با موفقیت ایجاد شده باشند.'; +$lang['no_symlinks'] = 'غیرفعالسازی ایجاد پیوندهای نمادین در ckgedit/userfiles. این گزینه هنگام بِروزسازی باید غیرفعال شود.'; +$lang['direction'] = 'تعیین راستای نوشتاری زبان: nocheck: ckgedit تغییری در تنظیمات راستای زبان پیش‌فرض نمی‌دهد; dokuwiki: راستای زبانی فعلی دوکوویکی; ltr: چپ به راست ; rtl: راست به چپ.'; +$lang['scayt_auto'] = 'تعیین کنید آیا بررسی‌کننده‌هجی‌هنگام‌نوشتن Scayt در هنگام آغاز فعال باشد یا نه. پیش‌فرض off است؛ کاربر می‌توان برای هر صفحه آنرا فعالسازی مجدد کند. برای حذف کامل بررسی‌کننده‌هجی Scayt گزینه disable را انتخاب کنید (نگاه کنید به ckgedit:configuration#scayt_auto")'; +$lang['scayt_lang'] = 'تعیین زبان پیش‌فرض SCAYT'; +$lang['smiley_hack'] = 'بازتنظیم URL برای لبخندک‌های CKedit وقتی به سِرور جدید نقل می‌شود. این‌کار بر مبنای صفحه به صفحه انجام می‌شود وقتی صفحه برای ویرایش لود و ذخیره می‌گردد. این گزینه باید در حالت طبیعی خاموش باشد.'; +$lang['complex_tables'] = 'از الگوریتم جداول پیچیده استفاده شود. در برابر تجزیه استاندارد جداول، اینکار وقتی چیدمانهای پیچیده بازه سطرها و بازه ستونها ترکیب می‌شوند، نتایج بهتری می‌دهد، اما با زمان کمی بیشتر.'; +$lang['duplicate_notes'] = 'این را true قرار دهید اگر کاربران چندین زیرنویس با متن زیرنویس مشابه ایجاد می‌کنند؛ جهت جلوگیری از تخریب یادداشتها لازم است.'; +$lang['winstyle'] = 'از مسیر مستقیم به دایرکتوری رسانه استفاده شود بجای fckeditor/userfiles. این تابع
    fckeditor/userfiles/.htaccess.security را به data/media/.htaccess کپی می‌کند؛ اگرنه اینکار باید به صورت دستی انجام شود.'; +$lang['other_lang'] = 'زبان پیش‌فرض شما برای CKEditor زبان تعیین شده برای مرورگرتان است.با اینحال می‌توانید اینجا زبان دیگری انتخاب کنید؛ این مستقل از زبان واسط دوکوویکی است.'; +$lang['dw_priority'] = 'ویرایشگر دوکوویکی را ویرایشگر پیش‌فرض قرار دهید: در مزرعه ویکی‌ها کار نمی‌کند.'; diff --git a/lib/plugins/ckgedit/lang/fr/lang.php b/lib/plugins/ckgedit/lang/fr/lang.php new file mode 100644 index 0000000..3002051 --- /dev/null +++ b/lib/plugins/ckgedit/lang/fr/lang.php @@ -0,0 +1,79 @@ + + * @author Hérisson grognon + * @author Schplurtz le Déboulonné + * @author salabdou + * @author TJ619 + * @author Laurent Marquet + * @author Blacklord049 + * @author Nicolas Friedli + */ +$lang['btn_dw_edit'] = 'Éditeur DW'; +$lang['dw_btn_fck_preview'] = 'Prévisualisation CKG'; +$lang['dw_btn_lang'] = 'Langue'; +$lang['title_dw_delete'] = 'Supprimer la page'; +$lang['title_dw_edit'] = 'Sauvegarder le travail, quitter et retourner sur l\'éditeur natif DokuWiki'; +$lang['dw_btn_revert'] = 'Restaurer la dernière sauvegarde'; +$lang['title_dw_revert'] = 'Revenir à la dernière sauvegarde'; +$lang['title_dw_lang'] = 'Sélectionner la langue pour la vérification orthographique'; +$lang['title_dw_cancel'] = 'Quitter l\'éditeur'; +$lang['btn_fck_edit'] = 'Éditeur CKG'; +$lang['confirm_delete'] = 'Êtes-vous sûr de vouloir supprimer cette page ?'; +$lang['confirm_preview'] = 'Tout travail non sauvegardé sera perdu.'; +$lang['editor_height'] = 'Hauteur de l\'éditeur : '; +$lang['editor_height_title'] = 'L\'éditeur se redimensionne au rechargement.'; +$lang['dw_btn_backup'] = 'Sauvegarde'; +$lang['title_dw_backup'] = 'Sauvegarde la fenêtre de l\'éditeur et renouvelle le verrou'; +$lang['backup_empty'] = 'Le tampon de sauvegarde est vide. Voulez-vous continuer ?'; +$lang['btn_draft'] = 'Obtenir le brouillon'; +$lang['title_draft'] = 'Voir, Afficher, Éditer le brouillon'; +$lang['btn_exit_draft'] = 'Quitter le brouillon'; +$lang['title_exit_draft'] = 'Retourner au document courant'; +$lang['draft_msg'] = 'Ce document a un brouillon. Le bouton Obtenir/Quitter le brouillon bascule entre ce document et le brouillon. Vous pouvez éditer et sauver l\'un ou l\'autre.'; +$lang['draft_msg'] = 'Ce document a un brouillon. Le bouton Obtenir/Quitter Brouillon bascule entre ce document et le brouillon. Vous pouvez éditer et sauver l\'un ou l\'autre.'; +$lang['whats_this'] = 'Qu\'est-ce que c\'est ?'; +$lang['complex_tables'] = 'Autoriser les tableaux complexes'; +$lang['minor_changes'] = 'Changements mineurs'; +$lang['discard_edits'] = 'Pour sauver vos modifcations, cliquez sur OK, sinon cliquez sur Annuler.'; +$lang['dw_btn_styling'] = 'Éditer la police d\'écriture'; +$lang['title_styling'] = 'Ouvrir avec les styles de police présentés comme balisage'; +$lang['js']['font_err_1'] = 'Les styles de police ne peuvent pas être inclus dans des liens. Cliquez sur OK pour accepter la correction suivante : '; +$lang['js']['font_err_2'] = 'Pour modifiez, saisissez ci-dessous la syntaxe complète de lien DokuWiki, en incluant les crochets. Pour retourner à l\'éditeur cliquez sur Annuler.'; +$lang['js']['font_err_throw'] = 'Erreur du formatage du texte'; +$lang['js']['dwp_save_err'] = 'Impossible de sauvegarder les changements de : '; +$lang['js']['dwp_updated'] = 'Priorité d\'éditeur mise à jour vers : '; +$lang['js']['dwp_not_sel'] = 'Priorité d\'éditeur non sélectionnée : cela sera déterminé par le paramètre "dw_users"'; +$lang['js']['mediamgr_notice'] = 'Ouvrir la boîte de dialogue des liens pour une insertion'; +$lang['js']['font_conflict'] = 'Le parseur a trouvé un ou plusieurs conflits. En cliquand sur OK, vous retournez à l\'éditeur pour y supprimer les styles de caratère. Pour plus d\'informations (en anglais): https://www.dokuwiki.org/plugin:ckgedit:font_styling#conflicts_with_dokuwiki_links'; +$lang['js']['ckg_paste_restart'] = 'Lors du rechargement de l\'éditeur, un article supplémentaire de support sera utilisé.'; +$lang['js']['on'] = 'Marche'; +$lang['js']['off'] = 'Arrêt'; +$lang['js']['broken_image_1'] = 'Utilisez le greffon imagePaste avec le gestionnaire de média de DokuWiki ou essayez l\'outil coller de MS Word (MS Word Paste Tool).'; +$lang['js']['broken_image_2'] = 'Coller des images de données brutes supérieures à 2,5M peut bloquer. Cette image fait :'; +$lang['mediamgr_imgonly'] = 'Envoyer des images en utilisant la boîte de dialogue spécifique:'; +$lang['uprofile_title'] = 'Sélectionnez votre éditeur par défaut'; +$lang['btn_val_dw_fb'] = 'Gestionnaire de fichiers DW'; +$lang['btn_val_ckg_fb'] = 'Gestionnaire de fichiers CKG'; +$lang['btn_title_dw_fb'] = 'Sauver, fermer l\'éditeur et passer au gestionnaire de fichiers DW'; +$lang['btn_title_ckg_fb'] = 'Sauver, fermer l\'éditeur et passer au gestionnaire de fichiers CKG'; +$lang['formatdel'] = 'Balisage supprimé des entêtes: indisponible dans DokuWiki'; +$lang['fontdel'] = 'Polices différentes supprimées des liens: indisponible dans DokuWiki'; +$lang['ckgcke_conflict'] = 'Une copie de ckgedit a été détectée. L\'un des Ckgedit et ckgedit doit être désactivé.'; +$lang['ws_cantcopy'] = 'Pour la configuration de Winstyle: impossible de copier vers'; +$lang['ws_copiedhtaccess'] = 'Pour l’installation de Winstyle, copiez le fichier .htaccess avec sécurité activée dans data/media +Voir ckgedit/fckeditor/userfiles/.htaccess.security'; +$lang['userfiles_perm'] = 'Veuillez vérifier les permissions; ckgedit ne peut accéder à'; +$lang['sym_not created_1'] = 'Impossible de créer'; +$lang['sym_not created_2'] = 'Ne peut créer de lien symbolique pour le gestionnaire de fichiers: Ne peut accéder à: '; +$lang['sym_not created_3'] = 'Il y a eu une erreur en essayant de créer des liens symboliques dans'; +$lang['syms_created'] = 'liens créés dans le dossier userfiles:'; +$lang['dblclk'] = 'Nouvelle fonctionnalité Un double clic dans le navigateur édite la section sous le curseur dans l\'éditeur DW. Voir, en anglais, direct_access_to_dokuwiki_editor.'; +$lang['dblclk_reminder'] = 'Rappel '; +$lang['ckg_img_paste'] = 'Activer la prise en charge supplémentaire du coller d\'image'; +$lang['ckg_img_paste_title'] = 'Arrêté pour prévenir les coller doubles, ou en marche pour activer les coller'; +$lang['on'] = 'Marche'; +$lang['off'] = 'Arrêt'; +$lang['broken_image'] = 'Utilisez le greffon imagePaste avec le gestionnaire de média de DokuWiki ou essayez l\'outil coller de MS Word (MS Word Paste Tool). Coller des images de données brutes supérieures à 2,5M peut bloquer. Cette image fait :'; diff --git a/lib/plugins/ckgedit/lang/fr/merger.txt b/lib/plugins/ckgedit/lang/fr/merger.txt new file mode 100644 index 0000000..124c7d7 --- /dev/null +++ b/lib/plugins/ckgedit/lang/fr/merger.txt @@ -0,0 +1,4 @@ +- Cette version de [[doku>plugin:ckgedit|ckgedit]] met à niveau CKEditor de la version 4.9 à 4.10, ce qui permet d'obtenir du javascript amélioré et mis à jour. +   - Avec la mise à niveau à 4.9, ckgedit a fusionné avec [[doku>plugin:ckgdoku|ckgdoku]]. Voir ckgdoku [[doku>plugin:ckgdoku#configuration|configuration option]]. + +Veuillez signaler tout problème à [[https://github.com/turnermm/ckgedit/issues|ckgedit]] sur github. \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/fr/scayt.txt b/lib/plugins/ckgedit/lang/fr/scayt.txt new file mode 100644 index 0000000..2b03b16 --- /dev/null +++ b/lib/plugins/ckgedit/lang/fr/scayt.txt @@ -0,0 +1,3 @@ +Le correcteur orthographique Scayt offre trois options de configuration : arrêté, en marche, désactivé. Pour l'instant, le réglage par défaut sera **arrêté** au lieu de **en marche**. Avec **en marche", le contenu de l'éditeur est analysé par Scayt et envoyé à un serveur Scayt pour vérification orthographique. Bien qu'il n'y ait aucune raison de penser qu'il s'agisse d'un risque de sécurité, ce changement est réalisé en considération du fait que des utilisateurs de wiki privé pourraient se sentir mal à l'aise de voir leur données envoyées à un serveur distant. De plus amples informormation sont disponibles sur la page de documenation de ckgedit consacrée aux options de configuration située à https://www.dokuwiki.org/plugin:ckgedit:configuration#scayt_lang. + + \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/fr/settings.php b/lib/plugins/ckgedit/lang/fr/settings.php new file mode 100644 index 0000000..5bbb8cb --- /dev/null +++ b/lib/plugins/ckgedit/lang/fr/settings.php @@ -0,0 +1,52 @@ + + * @author TJ619 + * @author Laurent Marquet + * @author Blacklord049 + * @author Schplurtz le Déboulonné + */ +$lang['groups'] = 'Groupe autorisé à désativer le verrou minuté (obsolète)'; +$lang['fck_preview'] = 'Groupe de prévisualisation FCK'; +$lang['guest_toolbar'] = 'Afficher la barre d\'outil pour les invités'; +$lang['guest_media'] = 'Les invités peuvent faire des liens sur les fichiers medias'; +$lang['open_upload'] = 'Les invités peuvent uploader'; +$lang['default_fb'] = 'Accès à la navigation des fichiers par défaut. Avec none, ACL ne s\'applique pas.'; +$lang['openfb'] = 'Ouvre la navigation des fichiers. Cela donne accès à l\'utilisateur à toute la structure de répertoires, qu\'il/elle ait les permissions ou pas. ACL s\'applique toujours pour l\'upload.'; +$lang['dw_edit_display'] = 'Contrôle quels utilisateurs ont accès au bouton "Éditeur DW". Choix: "all" pour tous les utilisateurs; "admin" pour les admin et gestionnaires seulement; "none" pour personne. "all" par défaut.'; +$lang['smiley_as_text'] = 'Affiche les émoticones comme du texte dans CKeditor (sera toujours affiché comme une image dans le navigateur)'; +$lang['editor_bak'] = 'Sauve le backup sur meta/<namespace>.ckgedit'; +$lang['create_folder'] = 'Activer le bouton de création de dossier dans le navigateur de fichier (o/n)'; +$lang['dwedit_ns'] = 'Liste des namespaces, séparés par des virgules, et/ou des pages où ckgedit bascule automatiquement sur l\'éditeur natif de DW; Accepte les correspondances partielles.'; +$lang['acl_del'] = 'Par défault (case non cochée) autorise les utilisateurs avec "upload permission" à supprimer les fichiers de media; Si la case est cochée, alors l\'utilisateur doit avoir la permission "delete" pour supprimer dans le répertoire.'; +$lang['auth_ci'] = 'L\'identifiant de l\'utilisateur est non-sensible à la casse, ce qui fait que l\'on peut s\'identifier avec UTILISATEUR et utilisateur'; +$lang['nix_style'] = 'Pour les serveurs Windows Servers (Vista et suivants). Ce paramètre rend possible l\'accès à "data\media" à travers "ckgedit\CKeditor\userfiles", si les liens aux medias et fichiers ont été créés avec succès dans "userfiles"'; +$lang['no_symlinks'] = 'Désactive la création automatique des liens symboliques dans ckgedit/userfiles'; +$lang['direction'] = 'Définit la direction de langue dans CKeditor: nocheck: ckgedit ne fera aucun changement au paramètre de direction par défaut; dokuwiki: le paramètre courant de Dokuwiki de direction de langue; ltr: Gauche-à-droite; rtl: Droite-à-gauche.'; +$lang['scayt_auto'] = 'Active automatiquement le vérificateur d\'orthographe SCAYT. Par défaut sur "on". Pour le désactiver, sélectionner "off"'; +$lang['scayt_lang'] = 'Définir le langage par défaut de SCAYT'; +$lang['smiley_hack'] = 'Mettre à zéro l\'URL pour les émoticones CKeditor\'s lors d\'un changement de serveur. C\'est fait, page par page, quand la page est chargée pour édition et sauveagrdée. Cette option devrait normalement être sur "off".'; +$lang['complex_tables'] = 'Utiliser l\'algorithme des tableaux complexes. À l\'opposé de la gestion standard des tableaux, cela donnera un meilleur résultat lors d\'arrangements complexes de "rowspans" et "colspans", mais cela demande beaucoup plus de temps de traitement.'; +$lang['duplicate_notes'] = 'Choisir "true" si les utilisateurs créent de multiples notes de bas de page avec le même texte; Requis pour éviter la corruption des notes.'; +$lang['winstyle'] = 'Utiliser le chemin direct au répertoire des medias à la place de "fckeditor/userfiles". Cela requiert de copier le fichier "fckeditor/userfiles/.htaccess.security" dans "data/media" et de le renommer ".htaccess".'; +$lang['other_lang'] = 'Votre langue par défaut pour CKEditor est la langue par défaut du navigateur. Vous pouvez, cependant, choisir une autre langue ici; C\'est indépendant de la langue d\'interface de Dokuwiki.'; +$lang['dw_priority'] = 'Définir l\'éditeur DokuWiki comme éditeur par défaut'; +$lang['preload_ckeditorjs'] = 'Pré-charger le fichier javascript de CKeditor pour accélérer le chargement ultérieur de l\'éditeur'; +$lang['nofont_styling'] = 'Affiche les styles de police dans l\'éditeur comme "plugin markup". Voir la page de plugin de CKGedit plugin sur Dokuwiki.org pour les détails.'; +$lang['font_options'] = 'Retire les options de police d\'écriture'; +$lang['color_options'] = 'Retire les options de colorations'; +$lang['alt_toolbar'] = 'Fonctions à retirer de la barre d\'outils CKEditor'; +$lang['mfiles'] = 'Activer la gestion des \'mfiles\''; +$lang['extra_plugins'] = 'Liste des extensions (séparées par des virgules) à ajouter dans la barre d\'outils de CKEditor. Voir la page à propos des plugins CKGEdit pour plus de détails.'; +$lang['dw_users'] = 'Nom du groupe d\'utilisateurs pour lesquels l\'éditeur par défaut est celui de DokuWiki quand dw_priority est sélectionné. Si non défini, tous les utilisateurs utiliseront l\'éditeur natif lorsque dw_priority est coché.'; +$lang['allow_ckg_filebrowser'] = 'Sélectionnez le ou les navigateurs de fichiers/médias que les utilisateurs peuvent utiliser'; +$lang['default_ckg_filebrowser'] = 'Sélectionnez quel navigateur de fichier/média est le navigateur par défaut. Ceci sera annulé si le navigateur sélectionné n\'est pas autorisé'; +$lang['captcha_auth'] = 'Niveau d\'ACL à partir duquel le captcha est désactivé lorsque l\'option forusers du greffon captcha est activée. Le défaut est ACL_CREATE, ce qui signifie que les utilisateurs n\'ayant que ACL_EDIT ou moins auront le captcha, et ceux qui ont ACL_CREATE ou plus ne l\'auront pas.'; +$lang['htmlblock_ok'] = 'Lors de l\'utilisation de HTML_BLOCK, il faut activer soit ce réglage, soit htmlok de DokuWiki.Cette option ci ne pose pas les mêmes risques de sécurité que htmlok. Néanmoins, il ne faudrait l\'utiliser que dans un environnement de confiance et pas dans un wiki ouvert.'; +$lang['dblclk'] = 'Réglez sur off pour désactiver la fonctionnalité d\'édition sur double clic dans l\'éditeur DokuWiki (voir direct_access_to_dokuwiki_editor, en anglais).'; +$lang['preserve_enc'] = 'Conservez le codage d’URL dans les URL lorsque l’option dokuwiki deaccent est active.'; +$lang['gui'] = 'Sélectionnez CKEditor GUI.'; +$lang['rel_links'] = 'Activer la prise en charge des liens relatifs internes et d\'image.'; diff --git a/lib/plugins/ckgedit/lang/hr/lang.php b/lib/plugins/ckgedit/lang/hr/lang.php new file mode 100644 index 0000000..1f7d4d6 --- /dev/null +++ b/lib/plugins/ckgedit/lang/hr/lang.php @@ -0,0 +1,71 @@ + + */ +$lang['btn_dw_edit'] = 'DW uređivač'; +$lang['dw_btn_fck_preview'] = 'CKG pretpregled'; +$lang['dw_btn_lang'] = 'Jezik'; +$lang['title_dw_delete'] = 'Obriši stranicu'; +$lang['title_dw_edit'] = 'Snimi napravljeno, izađi i prebaci na klasičan DokuWiki uređivač.'; +$lang['dw_btn_revert'] = 'Povrati'; +$lang['title_dw_revert'] = 'Povrati na prethodnu pohranu'; +$lang['title_dw_lang'] = 'Odaberi jezik za provjeru pravopisa'; +$lang['title_dw_cancel'] = 'Napusti uređivač'; +$lang['btn_fck_edit'] = 'CKG uređivač'; +$lang['confirm_delete'] = 'Jeste li sigurni da želite obrisati ovu stranicu?'; +$lang['confirm_preview'] = 'Svaka nesnimljena izmjena biti će izgubljena.'; +$lang['editor_height'] = 'Visina okna uređivača'; +$lang['editor_height_title'] = 'Izmjeni veličinu okna uređivača pri ponovnom učitavanju'; +$lang['dw_btn_backup'] = 'Pohrani'; +$lang['title_dw_backup'] = 'Pohrani sadržaj prozora uređivača i obnovi zaključavanje'; +$lang['backup_empty'] = 'Spremnik pohrane izgleda da je prazan. Da li želite nastaviti?'; +$lang['btn_draft'] = 'Preuzmi nacrt'; +$lang['title_draft'] = 'Vidi, prikaži, uredi nacrt'; +$lang['btn_exit_draft'] = 'Napusti nacrt'; +$lang['title_exit_draft'] = 'Povratak na trenutni dokument'; +$lang['draft_msg'] = 'Ovaj dokument ima pohranjen nacrt. Gumb nacrta prebacuje između ovog dokumenta i nacrta. Možete snimiti bilo koji od ta dva.'; +$lang['whats_this'] = 'što je ovo?'; +$lang['complex_tables'] = 'Omogući kompleksne tabele'; +$lang['minor_changes'] = 'Manje promjene'; +$lang['discard_edits'] = 'Pritisnite OK da snimite promjene ili Prekini da ih odbacite'; +$lang['dw_btn_styling'] = 'Uredi znakovlje'; +$lang['title_styling'] = 'Otvori sa stilovima znakovlja prikazanih kao oznake'; +$lang['js']['font_err_1'] = 'Stilovi fontova ne mogu biti uključeni u poveznice. Pritisnite OK da prihvatite slijedeće ispravke:'; +$lang['js']['font_err_2'] = 'Za izmjenu unesite punu Dokuwiki poveznicu, uključivši zagrade. Za povratak u uređivač pritisnite Cancel'; +$lang['js']['font_err_throw'] = 'Greška pri uređivanju fonta'; +$lang['js']['dwp_save_err'] = 'Ne mogu snimiti promjene u:'; +$lang['js']['dwp_updated'] = 'Prioritet uređivača promijenjen u:'; +$lang['js']['dwp_not_sel'] = 'Prioritet uređivača nije odabran: biti će određen pomoću dw_users grupne konfiguracijske postavke'; +$lang['js']['mediamgr_notice'] = 'Koristi odabir poveznica za ubacivanje'; +$lang['js']['font_conflict'] = 'Analizator je otkrio jedan ili više font-poveznica konflikata. Pritiskom na OK možete se vratiti na uređivanje i ukloniti stilove fontova. Za više informacija pogledajte: https://www.dokuwiki.org/plugin:ckgedit:font_styling#conflicts_with_dokuwiki_links'; +$lang['js']['ckg_paste_restart'] = 'Kod ponovnog učitavanja uređivača, dodatna podrška za lijepljenje biti će'; +$lang['js']['on'] = 'uključena'; +$lang['js']['off'] = 'isključena'; +$lang['js']['broken_image_1'] = 'Koristi imagePaste dodatak sa Dokuwiki upraviteljem medija ili probajte sa MS Word Paste Tool.'; +$lang['js']['broken_image_2'] = 'Ctrl-v slike sa neobrađenom veličinom preko 2,5M može zaglaviti. Ova slika je:'; +$lang['mediamgr_imgonly'] = 'Učitaj samo slike kada se koristi urednik slika:'; +$lang['uprofile_title'] = 'Odaberite svoj podrazumijevani uređivač'; +$lang['btn_val_dw_fb'] = 'DW uređivač datoteka'; +$lang['btn_val_ckg_fb'] = 'CKG uređivač datoteka'; +$lang['btn_title_dw_fb'] = 'Snimi i zatvori uređivač i prebaci na DW uređivač datoteka'; +$lang['btn_title_ckg_fb'] = 'Snimi i zatvori uređivač i prebaci na CKG uređivač datoteka'; +$lang['formatdel'] = 'Oznake uklonjene iz zaglavlja: nisu podržane u Dokuwiki-u'; +$lang['fontdel'] = 'Oznake fontova uklonjene iz poveznica: nisu podržane u Dokuwiki-u'; +$lang['ws_cantcopy'] = 'Za Win tip postavki:ne mogu kopirati u'; +$lang['ws_copiedhtaccess'] = 'Za Win tip postavki, kopirana sigurnosno omogućena .htaaccess u data/media. +Vidi ckgedit/fckeditor/userfiles/.htacess sigurnost'; +$lang['userfiles_perm'] = 'Molim provjerite dozvole: ckgedit ne može pristupiti'; +$lang['sym_not created_1'] = 'Ne mogu kreirati'; +$lang['sym_not created_2'] = 'Ne mogu kreirati simboličku poveznicu za urednik datoteka: ne mogu pristupiti'; +$lang['sym_not created_3'] = 'Dogodila se greška pri pokušaju kreiranja simboličke poveznice u'; +$lang['syms_created'] = 'Slijedeće poveznice su kreirane u userfiles mapi:'; +$lang['dblclk'] = 'Nova mogućnost: dvoklik na prozor browsera za ortvaranje DW Urednika za uređivanje odjeljka ispod pokazivača. Vidi: direct_access_to_dokuwiki_editor.'; +$lang['dblclk_reminder'] = 'Podsjetnik'; +$lang['ckg_img_paste'] = 'Uključi dodatnu podršku za lijepljenje slika'; +$lang['ckg_img_paste_title'] = 'Isključi za prevenciju dvostrukog lijepljenja, ili uključi za omogućavanje lijepljenja'; +$lang['on'] = 'uključi'; +$lang['off'] = 'isključi'; +$lang['broken_image'] = 'Koristi imagePaste dodatak sa Dokuwiki upraviteljem medija ili probajte sa MS Word Paste Tool. SIrova veličina Ctrl-v slike veća od 2,5M može zaglaviti. Ova slika je:'; diff --git a/lib/plugins/ckgedit/lang/hr/merger.txt b/lib/plugins/ckgedit/lang/hr/merger.txt new file mode 100644 index 0000000..f64770b --- /dev/null +++ b/lib/plugins/ckgedit/lang/hr/merger.txt @@ -0,0 +1,2 @@ + - Ova verzija [[doku>plugin:ckgedit|ckgedit]] nadograđuje CKEditor sa 4.9 na 4.10, što donosi aktualni i poboljšani javascript. + - S nadogradnjom na 4.9, ckgedit je spojen sa [[doku>plugin:ckgdoku|ckgdoku]]. Vidi ckgdoku [[doku>plugin:ckgdoku#configuration|opcije postavki]]. Molimo dojavite bilo kakav problem na [[https://github.com/turnermm/ckgedit/issues|ckgedit problemi]] na github-u. \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/hr/scayt.txt b/lib/plugins/ckgedit/lang/hr/scayt.txt new file mode 100644 index 0000000..c2dc2ea --- /dev/null +++ b/lib/plugins/ckgedit/lang/hr/scayt.txt @@ -0,0 +1,3 @@ +Scayt provjera pravopisa nudi tri podešavanja: uključeno, isključeno, onemogućeno. Od sada podrazumijevana postavka će biti **isključeno** umjesto **uključeno**. Sa **uključeno** sadržaj se obrađuje od strane Scayt i šalje se na provjeru pravopisa na Scayt server. Iako nema razloga vjerovati da je to sigurnosni rizik, ova promjena je učinjena radi korisnika sa privatnim Wiki-jima koji se mogu osjećati ugroženo sa slanjem njihovih podataka na vanjski server. Više informacija možete naći u opcijama Postavki ckedit dokumentacije na https://www.dokuwiki.org/plugin:ckgedit:configuration#scayt_lang. + + \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/hr/settings.php b/lib/plugins/ckgedit/lang/hr/settings.php new file mode 100644 index 0000000..5c6fd5f --- /dev/null +++ b/lib/plugins/ckgedit/lang/hr/settings.php @@ -0,0 +1,48 @@ + + */ +$lang['groups'] = 'Grupa koja može onemogućiti vrijeme zaključavanja (zastarjelo)'; +$lang['fck_preview'] = 'FCK grupa za pretpregled'; +$lang['guest_toolbar'] = 'Prikaži alatnu traku i gostima'; +$lang['guest_media'] = 'Gosti mogu se povezati na medijske datoteke'; +$lang['open_upload'] = 'Gosti mogu učitati'; +$lang['default_fb'] = 'Podrazumijevani pristup datotekama. Ako je ništa, ACL se ne primjenjuje.'; +$lang['openfb'] = 'Otvori pregled datoteka. Ovo omogućava korisnicima pristup cijeloj strukturi mapa, bez obzira na ovlaštenja. Ali ACL se ipak primjenjuje kod učitavanja.'; +$lang['dw_edit_display'] = 'Kontrolira tko ima pristup "DW uređivač" gumbu. Odabiri su: "all" za sve korisnike; "admin" samo za administratore i upravitelje; "none" za nikoga. Inicijalno je "all".'; +$lang['smiley_as_text'] = 'Prikazuj smješkiće kao tekst u CK uređivaču (u pregledniku će i dalje biti prikazani kao slike)'; +$lang['editor_bak'] = 'Snimi sigurnosnu kopiju u meta/<namespace>.ckgedit'; +$lang['create_folder'] = 'Omogući gumb za kreiranje mapa u pregledniku datoteka (y/n)'; +$lang['dwedit_ns'] = 'Zarezom odvojena lista imenskih prostora i/ili stranica gdje se isključivo koristi klasičan DokuWiki uređivač; prihvaća djelomična poklapanja'; +$lang['acl_del'] = 'Inicijalna postavka (neoznačeno) omogućava korisnicima s ovlastima učitavanja da brišu medijske datoteke; ako je označeno tada korisnik treba imati ovlasti brisanja da može brisati u mapi.'; +$lang['auth_ci'] = 'Korisnička prijava je neosjetljiva na mala/VELIKA slova, što znači je svejedno da li se prijavite kao KORISNIK i korisnik'; +$lang['nix_style'] = 'Za Windows poslužitelje (Vista i noviji). Ova postavka omogućava pristup data\media kroz ckgedit\CKeditor\userfiles, ako su uspješno napravljene poveznice prema media i file mapama u mapi userfiles.'; +$lang['no_symlinks'] = 'Onemogući automatsko kreiranje simboličkih veza u ckgedit/userfiles.'; +$lang['direction'] = 'Postavi smjer pisanja u CK uređivaču: nocheck: koristiti će se podrazumijevani smjer pisanja; dokuwiki: prema postavki jezika u Dokuwiki-u; ltr: S lijeva na desno; rtl: S desna na lijevo.'; +$lang['scayt_auto'] = 'Automatski omogući SCAYT provjeru pravopisa. Inicijalno je "on" odnosno uključeno. Odaberite "off" da ga isključite'; +$lang['scayt_lang'] = 'Postavite SCAYT jezik'; +$lang['smiley_hack'] = 'Resetirati URL adrese za smješke u CK uređivaču pri micanju na novi server. To se izvodi za svaku stranicu pri svakom njenom učitavanju i snimanju. Normalno ova opcija treba biti isključena.'; +$lang['complex_tables'] = 'Koristi algoritam za kompleksne tabele. Suprotno standardnoj obradi tabela, ovo treba dati bolje rezultate kada se koriste kompleksni oblici spojenih redova i kolona. Međutim zahtjeva više vremena za obradu.'; +$lang['duplicate_notes'] = 'Postavi na "true" ako korisnici kreiraju više fusnota s istim tekstom; obavezno kako bi se izbjegla oštećenja fusnota. '; +$lang['winstyle'] = 'Koristi direktne staze do medijskih datoteka umjesto kroz fckeditor/userfiles. Ovo zahtjeva da fckeditor/userfiles/.htaccess.security bude kopiran u data/media i preimenovan u .htaccess'; +$lang['other_lang'] = 'Vaš inicijalni jezik za CK uređivač je jezik postavljen u vašem pregledniku. Međutim vi možete ovdje odabrati drugi jezik; to je neovisno o jeziku postavljenom u Dokuwiki-u.'; +$lang['dw_priority'] = 'Postavi klasičan dokuwiki uređivač kao podrazumijevani'; +$lang['preload_ckeditorjs'] = 'Odmah učitati java skript kod CK uređivača da se ubrzaju naknadna učitavanja uređivača'; +$lang['nofont_styling'] = 'Prikaži stilove znakovlja u uređivaču kao oznake dodataka. Pogledajte detalje o ckgedit dodatku na Dokuwiki.org.'; +$lang['font_options'] = 'Ukloni opcije znakovlja.'; +$lang['color_options'] = 'Ukloni opcije boje.'; +$lang['alt_toolbar'] = 'Funkcije koje se uklanjaju iz alatne trake u CK uređivaču'; +$lang['mfiles'] = 'Omogući mfile podršku'; +$lang['extra_plugins'] = 'Zarezom odvojena lista dodatnih Ckeditor dodataka koji će biti dodani na alatnu traku. Pogledajte ckgedit uputu o podešavanju za detalje'; +$lang['dw_users'] = 'Ime grupe korisnika čiji je podrazumijevani Dokuwiki uređivač kada je odabran dw_priority. Ako nije definiran, tada će svima ugrađeni Dokuwiki uređivač biti podrazumijevani ako je odabran dw_priority.'; +$lang['allow_ckg_filebrowser'] = 'Odaberite koji datoteka/media pretraživač korisnici mogu koristiti'; +$lang['default_ckg_filebrowser'] = 'Odaberite koji datoteka/media pretraživač je podrazumijevani. Ovo će biti nadjačano ako odabrani pretraživač nije dopušten'; +$lang['captcha_auth'] = 'ACL nivo na kojem je captcha isključen kada je opcija captcha dodatka forusers uključena. Podrazumijevana vrijednost je ACL_CREATE, što znači da svi korisnici sa ACL_EDIT ili manje, će se prikazati captcha, za ACL_CREATE ili više neće.'; +$lang['htmlblock_ok'] = 'Kada se koristi HTML_BLOCK ili ova postavka ili Dokuwiki htmlok postavka mora biti omogućena. Ona ne znači isti nivo sigurnosnog rizika kao htmlok. Unatoč tome ona ipak bi trebal biti korištena samo u sigurnim korisničkim okolinama, a ne na otvorenom wiki-u.'; +$lang['dblclk'] = 'Postavi na isključi da se isključi mogućnost uređivanja odjeljka Dokuwiki urednikom dvoklikom (vidi: direct_access_to_dokuwiki_editor)'; +$lang['preserve_enc'] = 'Sačuvaj kodiranje URL veza kada je Dokuwiki deaccent opcija aktivna.'; +$lang['gui'] = 'Odaberi CKEditor GUI.'; +$lang['rel_links'] = 'Aktiviraj podršku za relativne interne i slikovne poveznice'; diff --git a/lib/plugins/ckgedit/lang/it/lang.php b/lib/plugins/ckgedit/lang/it/lang.php new file mode 100644 index 0000000..76d772f --- /dev/null +++ b/lib/plugins/ckgedit/lang/it/lang.php @@ -0,0 +1,24 @@ + + * @author HokkaidoPerson + * @author Hideaki SAWADA + */ +$lang['btn_dw_edit'] = 'テキストモードに変更'; +$lang['dw_btn_fck_preview'] = 'プレビュー'; +$lang['dw_btn_lang'] = '言語を選択'; +$lang['title_dw_delete'] = 'ページを削除'; +$lang['title_dw_edit'] = '内容を保存して編集を終わり、DokuWiki組み込みのエディタに切り替え'; +$lang['dw_btn_revert'] = '戻す'; +$lang['title_dw_revert'] = '以前のドラフトに戻す'; +$lang['title_dw_lang'] = 'スペルチェッカーの言語を選択'; +$lang['title_dw_cancel'] = '編集をキャンセル'; +$lang['btn_fck_edit'] = 'GUIモードに変更'; +$lang['confirm_delete'] = '本当にこのページを削除してもよろしいですか?'; +$lang['confirm_preview'] = '編集中の内容は保存されず失われます'; +$lang['editor_height'] = 'エディターの高さ'; +$lang['editor_height_title'] = 'エディターは、再読込時にサイズ変更する'; +$lang['dw_btn_backup'] = 'ドラフトを保存'; +$lang['title_dw_backup'] = '内容をドラフトに保存して、ロックの期限を更新'; +$lang['backup_empty'] = '以前のドラフトは存在しません。このまま戻すと編集中の内容はすべて失われますがよろしいですか?'; +$lang['btn_draft'] = 'ドラフトを表示'; +$lang['title_draft'] = 'ドラフトを表示して編集'; +$lang['btn_exit_draft'] = '現在の文書に戻る'; +$lang['title_exit_draft'] = '現在の文書に戻る'; +$lang['draft_msg'] = 'この文書にはドラフトが存在します。「ドラフトを表示」「現在の文書に戻る」ボタンでドラフトと現在の文書を交互に表示できます。編集したい方を編集してください。'; +$lang['whats_this'] = 'ヘルプ'; +$lang['complex_tables'] = '複雑な表を有効にする'; +$lang['minor_changes'] = '小さな変更'; +$lang['discard_edits'] = '編集内容を保存する場合はOKを、破棄する場合はキャンセルをクリックしてください。'; +$lang['dw_btn_styling'] = 'フォントの編集'; +$lang['title_styling'] = 'マークアップで指定されたフォントスタイルで表示する。'; +$lang['js']['font_err_1'] = 'フォントの装飾はリンクに含める事が出来ません。以下の修正を承諾するには「OK」をクリックして下さい。'; +$lang['js']['font_err_2'] = '修正するには、以下にDokuWikiのリンクの完全なマークアップを入力して下さい。ブラケットも含んで下さい。エディターに戻るには「キャンセル」をクリックして下さい。'; +$lang['js']['font_err_throw'] = 'フォント書式エラー'; +$lang['js']['dwp_save_err'] = '以下に変更を保存出来ません:'; +$lang['js']['dwp_updated'] = 'エディターの優先度は次の通り更新されました:'; +$lang['js']['dwp_not_sel'] = 'エディターの優先度が選択されていません。優先度はdw_usersグループの構成設定で指定します。'; +$lang['js']['mediamgr_notice'] = '挿入にリンクダイアログを使用する'; +$lang['js']['font_conflict'] = '分析した所、リンクフォントの競合が1つ以上見つかりました。「OK」をクリックすると、エディターに戻ってフォントスタイルを除去する事が出来ます。より詳しい情報については、https://www.dokuwiki.org/plugin:ckgedit:font_styling#conflicts_with_dokuwiki_links を参照して下さい。'; +$lang['js']['ckg_paste_restart'] = 'エディターを再読み込みすると、補助的な貼り付けサポートが有効になります'; +$lang['js']['on'] = 'ON'; +$lang['js']['off'] = 'OFF'; +$lang['mediamgr_imgonly'] = '画像ダイアログは、画像に対してのみ用いて下さい。他のメディアについてはリンクダイアログを用いて下さい。選択したファイル:'; +$lang['uprofile_title'] = '使いたいデフォルトのエディターを選択'; +$lang['btn_val_dw_fb'] = 'DWファイルブラウザー'; +$lang['btn_val_ckg_fb'] = 'CKGファイルブラウザー'; +$lang['btn_title_dw_fb'] = '保存してエディターを閉じ、DWファイルブラウザーに切り替える'; +$lang['btn_title_ckg_fb'] = '保存してエディターを閉じ、CKGファイルブラウザーに切り替える'; +$lang['formatdel'] = 'ヘッダーからマークアップを除去しました。DokuWikiでサポートされていません。'; +$lang['fontdel'] = 'リンクからフォントマークアップを除去しました。DokuWikiでサポートされていません。'; +$lang['ws_cantcopy'] = 'winstyleセットアップに際して:次に対してコピー出来ません:'; +$lang['ws_copiedhtaccess'] = 'winstyleセットアップに際して、セキュリティ設定された.htaccessファイルを、ディレクトリ data・mediaにコピーしました +ckgedit/fckeditor/userfiles/.htacess.security をご覧下さい'; +$lang['userfiles_perm'] = 'パーミッションを確認して下さい。ckgeditがアクセス出来ません。'; +$lang['sym_not created_1'] = '作成出来ません'; +$lang['sym_not created_2'] = 'シンボリックリンクをファイルブラウザーに作成出来ません。以下にアクセス出来ません:'; +$lang['sym_not created_3'] = '次に対しシンボリックリンクを作成しようとした際にエラーが発生しました:'; +$lang['syms_created'] = '以下のリンクがユーザーファイルのディレクトリに作成されました。'; +$lang['dblclk_reminder'] = 'リマインダー'; diff --git a/lib/plugins/ckgedit/lang/ja/settings.php b/lib/plugins/ckgedit/lang/ja/settings.php new file mode 100644 index 0000000..ebc28fe --- /dev/null +++ b/lib/plugins/ckgedit/lang/ja/settings.php @@ -0,0 +1,38 @@ + + * @author Hideaki SAWADA + */ +$lang['groups'] = 'ロックの期限を無効化できるグループ(廃止予定)'; +$lang['fck_preview'] = 'FCK プレビューグループ'; +$lang['guest_toolbar'] = 'ゲストに対してツールバーを表示'; +$lang['guest_media'] = 'ゲストはメディアファイルにリンク可能'; +$lang['open_upload'] = 'ゲストはメディアファイルをアップロード可能'; +$lang['default_fb'] = 'ファイルブラウザーのデフォルトのアクセス権。noneの場合、ACLは適用されません。'; +$lang['openfb'] = 'ファイルブラウザーをオープンにする。これによってユーザーはパーミッションに関係なくすべてのディレクトリ構造にアクセスできます。ただしアップロードにはACLが適用されます。'; +$lang['dw_edit_display'] = '"テキストモード"ボタンを使用できるユーザーを制限する。all: すべてのユーザー、admin: adminとmanagerのみ、none: 誰も使用できない。デフォルトはall。'; +$lang['smiley_as_text'] = 'CKeditorで顔文字を文字列で表示(この設定を有効にしても表示の際は画像として表示されます)'; +$lang['editor_bak'] = 'meta/<namespace>.ckgedit にバックアップを保存'; +$lang['create_folder'] = 'ファイルブラウザーでフォルダ作成ボタンを有効にする。 (y/n)'; +$lang['dwedit_ns'] = 'テキストモードに自動的に切り替える名前空間のリスト(カンマ区切り)'; +$lang['acl_del'] = 'デフォルト(チェックしない)の場合、アップロード権限を持つユーザーにメディアファイルを削除する権限を与えます。チェックした場合、フォルダからファイルを削除するには削除の権限が必要です。'; +$lang['auth_ci'] = 'ユーザーのログインIDは大文字小文字を区別しない。つまりUSERとuserのいずれでもログイン可能'; +$lang['nix_style'] = 'Windowsのサーバー(Vista以降)用の設定。この設定を有効にすると userfiles にメディアとファイルへのリンクを正常に作ることができる場合に、data\media に ckgedit\CKeditor\userfiles でアクセスできるようにします。'; +$lang['no_symlinks'] = 'ckgedit/userfiles にシンボリックリンクを自動で作成しない'; +$lang['direction'] = 'CKeditorでの文字の方向: nocheck: ckgeditはデフォルトの方向の設定を変更しない。 dokuwiki: Dokuwikiの文字の方向の設定に従う。 ltr: 左から右。 rtl: 右から左。'; +$lang['scayt_auto'] = 'スペルチェッカーを自動的に有効化。デフォルトは"on"。スペルチェッカーを無効にするには"off"を選択してください。'; +$lang['scayt_lang'] = 'スペルチェッカーのデフォルト言語'; +$lang['smiley_hack'] = '新しいサーバーに移動した時にCKeditorの顔文字のURLを初期化。これはページごとにページが編集のために読み込まれ、保存された時に行われます。このオプションは通常はoffにします。'; +$lang['complex_tables'] = '複雑な表のアルゴリズムを使用。通常の表のパースに比べて、rowspanやcolspanを使った複雑な表をより良くパースできますが、処理時間がやや長くなります。'; +$lang['duplicate_notes'] = 'ユーザーが同じ脚注テキストに対して複数の脚注を付ける場合にチェックしてください。脚注が衝突しないようにするために必要です。'; +$lang['winstyle'] = 'fckeditor/userfiles の代わりにメディアディレクトリへの直接のパスを使用。このためには fckeditor/userfiles/.htaccess.security を data/media にコピーして .htaccess にリネームする必要があります。'; +$lang['other_lang'] = 'CKEditorのデフォルト言語。デフォルトではブラウザの言語が使われますが、ここで他の言語を選択できます。この設定はDokuwikiのインターフェイスの言語とは独立しています。'; +$lang['dw_priority'] = 'Dokuwikiのエディタを標準に設定'; +$lang['preload_ckeditorjs'] = 'CKEditorを事前に読み込み、編集を始める時の遅延時間を減らします。'; +$lang['nofont_styling'] = 'エディター内はプラグインのマークアップで指定されたフォントスタイルで表示する。詳細は、Dokuwiki.org の ckgedit プラグインページを参照してください。'; +$lang['font_options'] = 'フォントのオプションを削除する。'; +$lang['color_options'] = '配色のオプションを削除する。'; +$lang['alt_toolbar'] = 'CKEditor のツールバーから削除する機能'; diff --git a/lib/plugins/ckgedit/lang/ko/lang.php b/lib/plugins/ckgedit/lang/ko/lang.php new file mode 100644 index 0000000..6c36859 --- /dev/null +++ b/lib/plugins/ckgedit/lang/ko/lang.php @@ -0,0 +1,42 @@ + + */ +$lang['btn_dw_edit'] = 'DW 편집'; +$lang['dw_btn_fck_preview'] = 'CKG 미리 보기'; +$lang['dw_btn_lang'] = '언어'; +$lang['title_dw_delete'] = '문서 삭제'; +$lang['title_dw_edit'] = '작업을 저장하고 종료한 다음 네이티브 도쿠위키 편집기로 전환'; +$lang['dw_btn_revert'] = '되돌리기'; +$lang['title_dw_revert'] = '이전 백업으로 되돌리기'; +$lang['title_dw_lang'] = '맞춤법 검사기를 위한 언어 선택'; +$lang['title_dw_cancel'] = '편집기 종료'; +$lang['btn_fck_edit'] = 'CKG 편집'; +$lang['confirm_delete'] = '정말로 이 문서를 삭제하겠습니까?'; +$lang['confirm_preview'] = '저장하지 않은 작업은 사라집니다.'; +$lang['editor_height'] = '편집기 높이'; +$lang['editor_height_title'] = '편집기를 다시 불러올 때 다시 크기 조절'; +$lang['dw_btn_backup'] = '백업'; +$lang['title_dw_backup'] = '편집기 창을 백업 및 잠금 갱신'; +$lang['backup_empty'] = '백업한 버퍼가 비어있는 것으로 나타납니다. 계속할까요?'; +$lang['btn_draft'] = '초안 얻기'; +$lang['title_draft'] = '초안을 보고 편집하기'; +$lang['btn_exit_draft'] = '초안 종료'; +$lang['title_exit_draft'] = '현재 문서로 돌아가기'; +$lang['draft_msg'] = '이 문서에 초안 파일이 있습니다. 초안 버튼은 이 문서와 초안 사이를 전환합니다. 둘 중 하나를 편집하고 저장할 수 있습니다.'; +$lang['whats_this'] = '이게 뭐죠?'; +$lang['complex_tables'] = '복잡한 표 활성화'; +$lang['minor_changes'] = '사소한 바뀜'; +$lang['discard_edits'] = '편집을 저장하려면 확인을, 버리려면 취소를 클릭하세요'; +$lang['dw_btn_styling'] = '글꼴 편집'; +$lang['title_styling'] = '글꼴 스타일을 마크업으로 보여지도록 열기'; +$lang['js']['font_err_1'] = '글꼴 스타일은 링크 안에 포함할 수 없습니다. 다음 수정을 받아들이려면 확인을 클릭하세요:'; +$lang['js']['font_err_2'] = '개정하려면, 괄호를 포함하여 아래에 전체 도쿠위키 링크 문법을 입력하세요. 편집기로 돌아가려면 취소를 클릭하세요.'; +$lang['js']['font_err_throw'] = '글꼴 서식 오류'; +$lang['js']['dwp_save_err'] = '바뀜을 저장할 수 없습니다:'; +$lang['js']['dwp_updated'] = '편집기 우선 순위 업데이트:'; +$lang['js']['dwp_not_sel'] = '편집기 우선 순위를 선택하지 않음: dw_users 그룹 환경 설정에 의해 결정될 것입니다'; +$lang['uprofile_title'] = '기본 편집기 선택'; diff --git a/lib/plugins/ckgedit/lang/ko/settings.php b/lib/plugins/ckgedit/lang/ko/settings.php new file mode 100644 index 0000000..79b5941 --- /dev/null +++ b/lib/plugins/ckgedit/lang/ko/settings.php @@ -0,0 +1,40 @@ + + */ +$lang['groups'] = '잠금 타이머를 비활성화하도록 허용하는 그룹 (사용되지 않음)'; +$lang['fck_preview'] = 'FCK 미리 보기 그룹'; +$lang['guest_toolbar'] = '손님에게 도구 모음을 표시'; +$lang['guest_media'] = '손님이 미디어 파일로 링크할 수 있음'; +$lang['open_upload'] = '손님이 올릴 수 있음'; +$lang['default_fb'] = '기본 파일 찾아보기 접근. none이면, acl이 적용되지 않습니다.'; +$lang['openfb'] = '파일 찾아보기를 엽니다. 사용자가 권한이 있는지 없는지에 따라 사용자에게 전체 디렉터리 구조에 접근할 수 있도록 줍니다. ACL은 여전히 올리기에 적용됩니다.'; +$lang['dw_edit_display'] = '"DW 편집" 버튼으로 접근할 수 있는 사용자를 제어합니다. 선택: "all"은 모든 사용자; "admin"은 admin 및 manager만; "none"은 아무도 없음. 기본값은 "all"입니다.'; +$lang['smiley_as_text'] = 'CKeditor에서 이모티콘을 텍스트로 표시 (여전히 브라우저에서는 그림으로 표시됩니다)'; +$lang['editor_bak'] = 'meta/<namespace>.ckgedit에 백업을 저장'; +$lang['create_folder'] = '파일 브라우저에서 폴더 만들기 버튼 활성화 (y/n)'; +$lang['dwedit_ns'] = 'ckgedit가 네이티브 도쿠위키 편집기로 자동으로 전환할 이름공간 및/또는 문서의 쉼표로 구분된 목록; 부분적인 일치를 허용합니다.'; +$lang['acl_del'] = '기본값 (상자가 체크되지 않음)으로 올리기 권한이 있는 사용자에게 미디어 파일을 삭제할 권한을 허용합니다; 상자게 체크되어 있으면, 사용자는 폴더에서 삭제하려면 삭제 권한이 필요합니다.'; +$lang['auth_ci'] = '사용자 로그인 id는 대소문자를 구분하지 않습니다, 즉 USER와 user 둘 다 로그인할 수 있습니다'; +$lang['nix_style'] = 'Windows 서버 (Vista 이상)를 위해 이 설정은 미디어와 파일로의 링크가 성공적으로 userfiles에 만들어지는 경우, ckgedit\CKeditor\userfiles를 통해 data/media에 접근할 수 있도록 합니다'; +$lang['no_symlinks'] = 'ckgedit/userfiles에 심볼릭 링크를 자동으로 만들기를 비활성화합니다.'; +$lang['direction'] = 'CKeditor에서의 언어 방향 설정: nocheck: ckgedit는 기본 방향 설정을 바꾸지 않습니다; dokuwiki: 현재 도쿠위키 언어 방향; ltr: 왼쪽에서 오른쪽; rtl: 오른쪽에서 왼쪽.'; +$lang['scayt_auto'] = 'SCAYT 맞춤법 검사기를 자동으로 활성화합니다. 기본값은 "on"입니다; SCAYT를 끄려면 "off"를 선택하세요'; +$lang['scayt_lang'] = 'SCAYT 기본 언어를 설정합니다.'; +$lang['smiley_hack'] = '새 서버로 이동했을 때 CKeditor 이모티콘의 URL을 재설정합니다. 문서별로 문서가 편집을 위해 불러오고, 저장되었을 때 이루어집니다. 이 옵션은 일반적으로 off로 설정해야 합니다.'; +$lang['complex_tables'] = '복잡한 표 알고리즘을 사용합니다. 표의 표준 구문 분석에 비해 rowspan과 colspan을 사용한 복잡한 표를 더 잘 표시해야 합니다. 그러나 처리 시간이 다소 길어집니다.'; +$lang['duplicate_notes'] = '사용자가 같은 각주 텍스트에 여러 각주를 붙이는 경우 이것을 true로 설정하세요; 각주가 충돌하지 않도록 하기 위해 필요합니다.'; +$lang['winstyle'] = 'fckeditor/userfiles 대신 미디어 디렉터리에 직접 경로를 사용합니다. 이를 위해서는 fckeditor/userfiles/.htaccess.security를 data/media에 복사하여 .htaccess 이름을 바꿀 필요가 있습니다.'; +$lang['other_lang'] = 'CKEditor의 기본 언어로 브라우저의 언어로 설정됩니다. 하지만, 여기에서 다른 언어를 선택할 수 있습니다; 이것은 도쿠위키의 인터페이스 언어와는 독립적입니다.'; +$lang['dw_priority'] = 'dw_priority: 도쿠위키 편집기를 기본 편집기로 사용'; +$lang['preload_ckeditorjs'] = 'CKEditor의 자바스크립트를 미리 읽어 편집기를 불러올 때의 지연 시간을 줄이기'; +$lang['nofont_styling'] = '편집기에서 글꼴 스타일을 플러그인 마크업으로 표시합니다. 자세한 내용은 Dokuwiki.org에서 ckgedit 플러그인 문서를 보세요.'; +$lang['font_options'] = '글꼴 옵션을 제거합니다.'; +$lang['color_options'] = '색 옵션을 제거합니다.'; +$lang['alt_toolbar'] = 'CKEditor 도구 모음에서 제거할 기능

    텍스트 상자에 쉼표로 구분된 목록으로 다른 기능들을 포함하여 제거할 수 있습니다:

    Bold, Italic, Underline, Strike, Subscript, Superscript, RemoveFormat, Find, Replace, SelectAll, Scayt, Image, Table, Tags, Link, Unlink, Format, Styles,TextColor, BGColor, NumberedList, BulletedList, Cut, Copy, Paste, PasteText, PasteFromWord, Undo, Redo, Source, Maximize, About.'; +$lang['mfiles'] = 'mfile 지원 활성화'; +$lang['extra_plugins'] = '도구 모음에 추가할 추가적인 Ckeditor 플러그인의 쉼표로 구분된 목록. 자세한 사항은 ckgedit 플러그인의 설정 문서를 보세요'; +$lang['dw_users'] = 'dw_priority가 선택되어 있을 때 편집기 기본값을 도쿠위키 편집기로 사용할 사용자의 그룹 이름. 정의하지 않으면, 모든 사용자가 dw_priority가 선택되어 있을 때 네이티브 도쿠위키 편집기를 사용합니다.'; diff --git a/lib/plugins/ckgedit/lang/nl/lang.php b/lib/plugins/ckgedit/lang/nl/lang.php new file mode 100644 index 0000000..8dc2621 --- /dev/null +++ b/lib/plugins/ckgedit/lang/nl/lang.php @@ -0,0 +1,75 @@ + + * @author Coen Eisma + * @author Mijndert + * @author Peter van Diest + */ +$lang['btn_dw_edit'] = 'DW Bewerkvenster'; +$lang['dw_btn_fck_preview'] = 'CKG Voorbeeld'; +$lang['dw_btn_lang'] = 'Taal'; +$lang['title_dw_delete'] = 'Pagina schrappen'; +$lang['title_dw_edit'] = 'Werk opslaan, Stop, en terugschakelen naar de originele DokuWiki Editor'; +$lang['dw_btn_revert'] = 'Terugkeren'; +$lang['title_dw_revert'] = 'Terugkeren naar vorige back-up'; +$lang['title_dw_lang'] = 'Selecteer taal voor spellingcontrole'; +$lang['title_dw_cancel'] = 'Stop Editor'; +$lang['btn_fck_edit'] = 'CKG Editor'; +$lang['confirm_delete'] = 'Wil je deze pagina schrappen? Zeker?'; +$lang['confirm_preview'] = 'Niet opgeslagen werk gaat verloren.'; +$lang['editor_height'] = 'Hoogte bewerkvenster'; +$lang['editor_height_title'] = 'De afmetingen van de editor worden opnieuw bepaald bij herladen'; +$lang['dw_btn_backup'] = 'Back-up'; +$lang['title_dw_backup'] = 'Maak een back-up van bewerkvenster & hernieuw vergrendeling'; +$lang['backup_empty'] = 'De back-up buffer is blijkbaar leeg. Verder gaan?'; +$lang['btn_draft'] = 'Ontwerp'; +$lang['title_draft'] = 'Bekijk, Toon, Bewerk ontwerp'; +$lang['btn_exit_draft'] = 'Stop ontwerp'; +$lang['title_exit_draft'] = 'Keer terug naar huidig document'; +$lang['draft_msg'] = 'Dit document heeft een ontwerp bestand. De ontwerp knop schakelt tussen dit document en het ontwerp. Je kan een van beide bewerken en bewaren.'; +$lang['whats_this'] = 'Wat is dit?'; +$lang['complex_tables'] = 'Complexe tabellen inschakelen'; +$lang['minor_changes'] = 'Kleine wijzigingen'; +$lang['discard_edits'] = 'Om je wijzigingen op te slaan klik OK; voor afkeuren klik Cancel'; +$lang['dw_btn_styling'] = 'Lettertypen aanpassen'; +$lang['title_styling'] = 'Open met de stijl van het lettertype getoond als markup'; +$lang['js']['font_err_1'] = 'Font styling niet toegestaan in links. Klik OK om de volgende correctie te accepteren.'; +$lang['js']['font_err_2'] = 'Om het bij te werken, voer de volledige syntaxis van de DokuWiki-link in, inclusief de haakjes. Om terug te keren naar het bewerkvenster klikt u op Annuleren.'; +$lang['js']['font_err_throw'] = 'Font-opmaakfout'; +$lang['js']['dwp_save_err'] = 'Niet mogelijk om veranderingen op te slaan in:'; +$lang['js']['dwp_updated'] = 'Prioriteitseditor geüpdatete naar:'; +$lang['js']['dwp_not_sel'] = 'Prioriteitseditor niet geselecteerd. Het zal bepaald worden op basis van de dw_user group config setting'; +$lang['js']['mediamgr_notice'] = 'Gebruik de linkdialoogvenster om in te voegen'; +$lang['js']['font_conflict'] = 'De parser heeft één of meer link-font-conflicten gevonden. Door op OK te klikken ga je terug naar de editor waar je de fontstijlen kunt verwijderen. Voor meer informatie kijk je op: https://www.dokuwiki.org/plugin:ckgedit:font_styling#conflicts_with_dokuwiki_links'; +$lang['js']['ckg_paste_restart'] = 'Bij het herladen van het bewerkvenster, wordt de ondersteuning voor plakken aangezet'; +$lang['js']['on'] = 'Aan'; +$lang['js']['off'] = 'Uit'; +$lang['js']['broken_image_1'] = 'Gebruik de imagePaste plugin met de DokuWiki Mediabeheerder of probeer de MS Word plak-functie'; +$lang['js']['broken_image_2'] = 'Ctrl+V van afbeeldingen met ruwe bestandsgrootte groter dan 2.5 MB kunnen blijven hangen. Deze afbeelding is:'; +$lang['mediamgr_imgonly'] = 'Upload alleen afbeeldingen wanneer je het afbeeldingsdialoogvenster gebruikt.'; +$lang['uprofile_title'] = 'Selecteer je standaard editor'; +$lang['btn_val_dw_fb'] = 'DW bestandsbrowser'; +$lang['btn_val_ckg_fb'] = 'CKG bestandsbrowser'; +$lang['btn_title_dw_fb'] = 'Sla op en sluit de editor en schakel over naar de DW bestandsbrowser'; +$lang['btn_title_ckg_fb'] = 'Sla op en sluit de editor en schakel over naar de CKG bestandsbrowser'; +$lang['formatdel'] = 'Opmaak verwijderd van de kopteksten: niet ondersteund door Dokuwiki'; +$lang['fontdel'] = 'Letteropmaak verwijderd uit links: niet ondersteund door Dokuwiki'; +$lang['ckgcke_conflict'] = 'Er is een kopie van ckgedit gedetecteerd. Ckgedit of ckgdoku moet zijn uitgeschakeld.'; +$lang['ws_cantcopy'] = 'Voor winstyle-instellingen: kan niet kopiëren naar'; +$lang['ws_copiedhtaccess'] = 'Voor winstyle-instellingen: de beveiligingsinstellingen van .htaccess zijn naar data/media gekopieerd +Kijk op ckgedit/fckeditor/userfiles/.htacess.security'; +$lang['userfiles_perm'] = 'Controleer de bestandsrechten: ckgedit heeft geen toegang tot'; +$lang['sym_not created_1'] = 'Niet mogelijk om aan te maken:'; +$lang['sym_not created_2'] = 'Niet mogelijk om symlinks voor de bestandsverkenner te creëren: geen toegang tot:'; +$lang['sym_not created_3'] = 'Er was een fout tijdens het creëren van symbolische links in'; +$lang['syms_created'] = 'De volgende links zijn gecreëerd in de gebruikersmap:'; +$lang['dblclk'] = 'Nieuwe optie: dubbelklik in de browser om de DW Editor te openen om de sectie waar de cursor staat te bewerken. Kijk op: direct_access_to_dokuwiki_editor. '; +$lang['dblclk_reminder'] = 'Herinnering'; +$lang['ckg_img_paste'] = 'Ondersteuning voor aanvullende afbeelding plakken aanzetten'; +$lang['ckg_img_paste_title'] = 'Uit om dubbel plakken te voorkomen of Aan om plakken in te schakelen'; +$lang['on'] = 'aan'; +$lang['off'] = 'uit'; +$lang['broken_image'] = 'Gebruik de imagePaste plugin met de DokuWiki Mediabeheerder of probeer de MS Word plak-functie. Ctrl+V van afbeeldingen met ruwe bestandsgrootte groter dan 2.5 MB kunnen blijven hangen. Deze afbeelding is:'; diff --git a/lib/plugins/ckgedit/lang/nl/merger.txt b/lib/plugins/ckgedit/lang/nl/merger.txt new file mode 100644 index 0000000..80be15d --- /dev/null +++ b/lib/plugins/ckgedit/lang/nl/merger.txt @@ -0,0 +1,5 @@ + + - Deze versie van [[doku>plugin:ckgedit|ckgedit]] updatet CKEditor van 4.9 naar 4.10, wat zorgt voor bijgewerkte en verbeterde javascript. + - Met de update naar 4.9, is ckgedit samengevoegd met [[doku>plugin:ckgdoku|ckgdoku]]. Zie ckgdoku's [[doku>plugin:ckgdoku#configuration|configuratieopties]]. + +Rapporteer problemen die je tegenkomt alstublieft op [[https://github.com/turnermm/ckgedit/issues|ckgedit's issuetracker]] op GitHub. \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/nl/scayt.txt b/lib/plugins/ckgedit/lang/nl/scayt.txt new file mode 100644 index 0000000..05e57a4 --- /dev/null +++ b/lib/plugins/ckgedit/lang/nl/scayt.txt @@ -0,0 +1,3 @@ +The Scayt Spellingcontrole heeft voor de 'scayt_auto' configuratie-instelling drie keuzes: aan, uit, uitgeschakeld. Vanaf nu is de standaardkeuze **uit** in plaats van **aan**. Met **aan** wordt de inhoud van het bewerkvenster verwerkt door Scayt en verzonden voor spellingscontrole naar een Scayt server. Ondanks dat er geen reden is om te geloven dat hier een veiligheidsrisico is, is desalniettemin deze aanpassing gemaakt voor gebruikers die zich bezorgd voelen over het feit dat hun data naar een externe server wordt gestuurd. Met de keuze **uitgeschakeld** wordt de spellingscontrole-functie helemaal verwijderd uit het bewerkvenster. U kunt meer informatie vinden op de Configuration Options pagina van de ckgedit documentatie via https://www.dokuwiki.org/plugin:ckgedit:configuration#scayt_auto. + + \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/nl/settings.php b/lib/plugins/ckgedit/lang/nl/settings.php new file mode 100644 index 0000000..ee3301d --- /dev/null +++ b/lib/plugins/ckgedit/lang/nl/settings.php @@ -0,0 +1,51 @@ + + * @author Coen Eisma + * @author Mijndert + * @author Peter van Diest + */ +$lang['groups'] = 'Groep met rechten om lock timer uit te schakelen (afgeschaft)'; +$lang['fck_preview'] = 'FCK Voorbeeld Groep'; +$lang['guest_toolbar'] = 'Toon werkbalk aan Gast'; +$lang['guest_media'] = 'Gast mag Media bestanden linken'; +$lang['open_upload'] = 'Gast mag uploaden'; +$lang['default_fb'] = 'Standaard bestandstoegang permissies. Als \'none\', dan wordt ACL niet toegepast.'; +$lang['openfb'] = 'Open bestandsbenadering. De gebruiker krijgt hierdoor toegang tot de volledige directory structuur, ongeacht de gebruikersrechten dit al dan niet toelaten. ACL is wel van toepassing op uploads.'; +$lang['dw_edit_display'] = 'Welke gebruikers mogen de "DW Editor" knop gebruiken. Selecteer: "all" voor alle gebruikers; "admin" voor administrator en beheerders; "none" voor niemand. Standaardwaarde is "all".'; +$lang['smiley_as_text'] = 'Toon smileys als tekst in FCKeditor (wordt wel als afbeelding getoond in de browser)'; +$lang['editor_bak'] = 'Sla backup op in meta/<namespace>.ckgedit'; +$lang['create_folder'] = 'Activeer knop Aanmaken map in bestandsverkenner (y/n)'; +$lang['dwedit_ns'] = 'Komma-gescheiden lijst van namespaces waarbij ckgedit automatisch terugschakelt naar de oorspronkelijke DokuWiki Editor.'; +$lang['acl_del'] = 'Standaardinstelling (niet aangevinkt) staat gebruikers met upload rechten toe om mediabestanden te verwijderen; indien aangevinkt, dan heeft gebruiker de verwijder-permissie nodig om het bestand uit de map te verwijderen.'; +$lang['auth_ci'] = 'De gebruikers login is niet hoofdletter gevoelig, dus je kan inloggen met zowel GEBRUIKER als gebruiker'; +$lang['nix_style'] = 'Voor Windows Servers (Vista en later). Deze parameter maakt het mogelijk om data\media te benaderen met ckgedit \ckeditor\userfiles, indien links naar media en bestand succesvol aangemaakt zijn in userfiles'; +$lang['no_symlinks'] = 'Deactiveert automatische creatie van symbolische links in ckgedit/userfiles. Deze optie moet uitgeschakeld worden tijdens updaten.'; +$lang['direction'] = 'Zet de schrijf- en lees richting van de taal in CKeditor: nocheck: geen wijziging van de standaard schrijfrichting in ckgedit; dokuwiki: gebruik de Dokuwiki taal schrijfrichting; ltr: Links-naar-rechts; rtl: Rechts-naar-links.'; +$lang['scayt_auto'] = 'Stelt in of de SCAYT spellingcontrole, tijdens-het-typen, al actief is bij openen van het bewerkvenster. Standaard op off; de gebruiker kan de spellingscontrole inschakelen per pagina. Om de Scayt spellingscontrole compleet te verwijderen, kies disable. (Zie voor meer achtergrond ckgedit:configuration#scayt_auto") '; +$lang['scayt_lang'] = 'Activeer de SCAYT standaard taalcode.'; +$lang['smiley_hack'] = 'Reset de URL voor FCKeditor\'s smilies bij verhuizing naar nieuwe server. Dit wordt pagina per pagina uitgevoerd bij het openen en bewaren van de pagina. Deze optie zou normaal uit moeten staan.'; +$lang['complex_tables'] = 'Gebruik het complex tables algorithm, in tegenstelling tot het standaard ontleding algoritme. Dit zou een beter resultaat geven wanneer complexe rowspans en colspans gemengd worden.'; +$lang['duplicate_notes'] = 'Zet deze optie op true (aanvinken) wanneer gebruikers meerdere voetnoten maken met dezelfde voettekst; deze optie is noodzakelijk om te voorkomen dat de voetnoten corrupt raken.'; +$lang['winstyle'] = 'Gebruik een direct pad naar de mediamap in plaats van fckeditor/userfiles. Deze functie kopieert
    fckeditor/userfiles/.htaccess.security naar data/media/.htaccess. Zo niet, dan moet dit handmatig gedaan worden.'; +$lang['other_lang'] = 'De standaardtaal voor de CKGEditor is de taal zoals ingesteld voor de browser. Je kunt echter een andere taal kiezen, onafhankelijk van de taal van het Dokuwiki-interface.'; +$lang['dw_priority'] = 'Maak DokuWiki editor de standaard editor'; +$lang['preload_ckeditorjs'] = 'Laad het javascript van de CKGeditor van tevoren om in het vervolg het laden van de editor te versnellen.'; +$lang['nofont_styling'] = 'Toon lettertypestijlen in de editor als plugin markup. Voor details, zie de ckgedit-pluginpagina van Dokuwiki.org.'; +$lang['font_options'] = 'Lettertype opties verwijderen'; +$lang['color_options'] = 'Kleur opties verwijderen'; +$lang['alt_toolbar'] = 'Functies om de CKEditor tool te verwijderen'; +$lang['mfiles'] = 'mfile-ondersteuning aanzetten'; +$lang['extra_plugins'] = 'Kommagescheiden lijst van aanvullende CKeditor plugins die aan de werkbalk toegevoegd worden. Zie de Configuration Page van de ckgedit plugin voor details'; +$lang['dw_users'] = 'Groepsnaam van de gebruikers voor wie de standaard Dokuwiki-bewerkvenster weergegeven wordt, als dw_priority wordt ingeschakeld. Als er geen groepsnaam wordt opgegeven, dan krijgen alle gebruikers het originele DokuWiki-bewerkvenster als de optie dw_priority wordt ingeschakeld.'; +$lang['allow_ckg_filebrowser'] = 'Selecteer welke bestandsbrowser(s) gebruikers kunnen gebruiken'; +$lang['default_ckg_filebrowser'] = 'Selecteer welke bestandsbrowser standaard wordt gebruikt. Dit wordt overschreven als de geselecteerde bestandsbrowser niet is toegestaan.'; +$lang['captcha_auth'] = 'ACL-niveau waarop de captcha wordt uitgeschakeld als de captcha plugin\'s forusers is ingeschakeld. De standaardwaarde is ACL_CREATE, dit betekent dat elke gebruiker met ACL_EDIT of lager een captcha krijgt, en met ACL_CREATE of hoger niet.'; +$lang['htmlblock_ok'] = 'Als HTML_BLOCK-blokken worden gebruikt, dan moet of deze instelling of DokuWiki\'s htmlok optie worden ingeschakeld. Deze instelling geeft niet hetzelfde veiligheidsrisico als htmlok. Desalniettemin moet deze instelling alleen gebruikt worden in een vertrouwde gebruikersomgeving, en niet in een open wiki.'; +$lang['dblclk'] = 'Kies uit om de dubbelklik-functie uit te schakelen die de gebruiker alinea\'s laat bewerken in het standaard DokuWiki\'s bewerkvenster (zie: direct_access_to_dokuwiki_editor)'; +$lang['preserve_enc'] = 'Behoud url-encodering in url\'s als DokuWiki\'s deaccent optie actief is'; +$lang['gui'] = 'Kies een CKEditor GUI'; +$lang['rel_links'] = 'Activateer ondersteuning voor relatieve interne verwijzingen en afbeeldingsverwijzingen'; diff --git a/lib/plugins/ckgedit/lang/pl/lang.php b/lib/plugins/ckgedit/lang/pl/lang.php new file mode 100644 index 0000000..4f8778d --- /dev/null +++ b/lib/plugins/ckgedit/lang/pl/lang.php @@ -0,0 +1,32 @@ + + */ +$lang['btn_dw_edit'] = 'Edycja DW'; +$lang['dw_btn_fck_preview'] = 'Podgląd CKG'; +$lang['dw_btn_lang'] = 'Język'; +$lang['title_dw_delete'] = 'Usuń stronę'; +$lang['title_dw_edit'] = 'Zapisz pracę, Wyjdź, i Przełącz do natywnego edytora DokuWiki'; +$lang['dw_btn_revert'] = 'Przywróć'; +$lang['title_dw_revert'] = 'Przywróć poprzednią kopię zapasową'; +$lang['title_dw_lang'] = 'Wybierz język dla sprawdzania pisowni'; +$lang['title_dw_cancel'] = 'Opuść edytor'; +$lang['btn_fck_edit'] = 'Edycja CKG'; +$lang['confirm_delete'] = 'Jesteś pewien że chcesz usunąć tę stronę?'; +$lang['confirm_preview'] = 'Każda niezapisana praca zostanie utracona.'; +$lang['editor_height'] = 'Wysokość edytora'; +$lang['dw_btn_backup'] = 'Kopia zapasowa'; +$lang['btn_draft'] = 'Pobierz wersję roboczą'; +$lang['btn_exit_draft'] = 'Wyjdź z wersji roboczej'; +$lang['title_exit_draft'] = 'Wróć do bieżącego dokumentu'; +$lang['whats_this'] = 'co to jest?'; +$lang['minor_changes'] = 'Drobne zmiany'; +$lang['discard_edits'] = 'Aby zapisać zmiany kliknij OK; aby anulować kliknij Cancel'; +$lang['dw_btn_styling'] = 'Edycja czcionek'; +$lang['js']['on'] = 'wlączone'; +$lang['js']['off'] = 'wyłączone'; +$lang['uprofile_title'] = 'Wybierz swój domyślny edytor'; +$lang['dblclk_reminder'] = 'Przypomnienie'; diff --git a/lib/plugins/ckgedit/lang/pt-br/lang.php b/lib/plugins/ckgedit/lang/pt-br/lang.php new file mode 100644 index 0000000..05189de --- /dev/null +++ b/lib/plugins/ckgedit/lang/pt-br/lang.php @@ -0,0 +1,25 @@ + + * @author Ianka Kryukov + * @author serg + * @author Artem Trutko + * @author Evgeniy Bekhterev + */ +$lang['btn_dw_edit'] = 'Переключить в DokuWiki Редактор'; +$lang['dw_btn_fck_preview'] = 'CKG предпросмотр'; +$lang['dw_btn_lang'] = 'Язык'; +$lang['title_dw_delete'] = 'Удалить страницу'; +$lang['title_dw_edit'] = 'Сохранить текущий текст, выйти и переключить редактор с CKEditor на обычный DokuWiki Editor. (Поменяется при следующем редактировании.)'; +$lang['dw_btn_revert'] = 'Вернуться'; +$lang['title_dw_revert'] = 'Вернуться к предыдущей резервной копии'; +$lang['title_dw_lang'] = 'Выбрать язык'; +$lang['title_dw_cancel'] = 'Выйти из редактроа'; +$lang['btn_fck_edit'] = 'Переключить в CKG Редактор'; +$lang['confirm_delete'] = 'Уверены что хотите удалить страницу?'; +$lang['confirm_preview'] = 'Вся несохраненная работа будет потерянв'; +$lang['editor_height'] = 'Высота редактора'; +$lang['editor_height_title'] = 'Изменение размера редактора после повторной загрузки'; +$lang['dw_btn_backup'] = 'Резервная копия'; +$lang['title_dw_backup'] = 'Окно резервного копирования и возобновления блокировки'; +$lang['backup_empty'] = 'Буфер резервной копии выглядит пустым. Продолжить?'; +$lang['btn_draft'] = 'Загрузить черновик'; +$lang['title_draft'] = 'Обзор, Показать, Редактировать черновик'; +$lang['btn_exit_draft'] = 'Выйти из черновика'; +$lang['title_exit_draft'] = 'Возврат к текущему документу'; +$lang['draft_msg'] = 'За этим документом закреплен файл черновика. Кнопка черновик осуществляет переключение между этим документом и черновиком. Вы можете редактировать и сохранять каждую из них.'; +$lang['whats_this'] = 'Что это?'; +$lang['complex_tables'] = 'Включить Комплексные Таблицы'; +$lang['minor_changes'] = 'Небольшое изменение'; +$lang['discard_edits'] = 'Для сохранения изменений нажмите ОК; для отмены нажмите Отмена'; +$lang['dw_btn_styling'] = 'Редактировать Шрифты'; +$lang['title_styling'] = 'Открыть с помощью стилей шрифта, как показано в разметки'; +$lang['js']['font_err_1'] = 'Стили шрифтов нельзя включить в ссылки. Нажмите OK чтобы принять следующие корректировки: '; +$lang['js']['font_err_2'] = 'Для пересмотра, введите полную разметку ссылок Dokuwiki ниже, включая скобки. Чтобы вернуться в редактор, нажмите кнопку Отмена.'; +$lang['js']['font_err_throw'] = 'Ошибка форматирования шрифта'; +$lang['js']['dwp_save_err'] = 'Невозможно сохранить изменения в:'; +$lang['js']['dwp_updated'] = 'Приоритет редактора обновлен до:'; +$lang['js']['dwp_not_sel'] = 'Приоритет редактора не выбран: он будет определяться настройкой конфигурации группы dw_users'; +$lang['js']['mediamgr_notice'] = 'Используйте диалоговое окно "ссылка" для вставки'; +$lang['js']['font_conflict'] = 'Парсер обнаружил один или несколько конфликтов ссылок-шрифтов. Нажав кнопку ОК, вы можете вернуться в редактор и удалить стили шрифтов. Для получения дополнительной информации см.: https://www.dokuwiki.org/plugin:ckgedit:font_styling#conflicts_with_dokuwiki_links'; +$lang['js']['ckg_paste_restart'] = 'При перезагрузке редактора будет включена дополнительная поддержка вставки'; +$lang['js']['on'] = 'вкл.'; +$lang['js']['off'] = 'выкл.'; +$lang['js']['broken_image_1'] = 'Используйте плагин imagePaste с Dokuwiki Mediamanager или попробуйте инструмент MS Word Paste.'; +$lang['js']['broken_image_2'] = 'Ctrl-v изображения с необработанными данными более 2,5М могут висеть. Это изображение является:'; +$lang['mediamgr_imgonly'] = 'Используйте Image Dialog только для изображений, Link Dialog-для других носителей. Этот файл является:'; +$lang['uprofile_title'] = 'Выберите редактор по умолчанию'; +$lang['btn_val_dw_fb'] = 'DW файловый браузер'; +$lang['btn_val_ckg_fb'] = 'CKG файловый браузер'; +$lang['btn_title_dw_fb'] = 'Сохраните и закройте редактор, а затем переключитесь на DW файловый браузер '; +$lang['btn_title_ckg_fb'] = 'Сохраните и закройте редактор и переключитесь на файловый браузер CKG'; +$lang['formatdel'] = 'Разметка, удаленная из заголовков: не поддерживается Dokuwiki'; +$lang['fontdel'] = 'Разметка шрифта удалена из ссылок: не поддерживается Dokuwiki'; +$lang['ckgcke_conflict'] = 'Обнаружена копия ckgedit. Либо ckgedit, либо ckgedit должны быть отключены.'; +$lang['ws_cantcopy'] = 'Для установки winstyle: не удается скопировать в'; +$lang['ws_copiedhtaccess'] = 'Для winstyle установки, скопированные с включенной безопасностью .htaccess в data/media +См. ckgedit/fckeditor/userfiles/.htacess.security'; +$lang['userfiles_perm'] = 'Пожалуйста, проверьте разрешения; ckgedit не может получить доступ'; +$lang['sym_not created_1'] = 'Невозможно создать'; +$lang['sym_not created_2'] = 'Не удается создать символические ссылки для filebrowser: не удается получить доступ:'; +$lang['sym_not created_3'] = 'Произошла ошибка при попытке создать символические ссылки в'; +$lang['syms_created'] = 'В каталоге userfiles были созданы следующие ссылки:'; +$lang['dblclk'] = 'Новая функция: дважды щелкните окно браузера, чтобы открыть редактор DW для редактирования раздела при наведении курсора. См.: direct_access_to_dokuwiki_editor'; +$lang['dblclk_reminder'] = 'Напоминание'; +$lang['ckg_img_paste'] = 'Включить дополнительную поддержку вставки изображений'; +$lang['ckg_img_paste_title'] = 'Во избежание двойной вставки, или для включения вставки'; +$lang['on'] = 'вкл.'; +$lang['off'] = 'выкл.'; +$lang['broken_image'] = 'Используйте плагин imagePaste с Dokuwiki Mediamanager или попробуйте инструмент MS Word Paste. Необработанные данные Ctrl-v изображений более 2,5М могут висеть. Это изображение является:'; diff --git a/lib/plugins/ckgedit/lang/ru/merger.txt b/lib/plugins/ckgedit/lang/ru/merger.txt new file mode 100644 index 0000000..4223e10 --- /dev/null +++ b/lib/plugins/ckgedit/lang/ru/merger.txt @@ -0,0 +1,4 @@ +- Эта версия [[doku>plugin:ckgedit|ckgedit]] обновляет CKEditor с 4.9 до 4.10, что дает современный и улучшенный javascript. +- С обновлением до 4.9 ckgedit переехал с [[doku>plugin:ckgdoku|ckgdoku]]. См. ckgdoku [[doku>plugin:ckgdoku#configuration|configuration options]]. + +Пожалуйста, сообщайте о любых проблемах [[https://github.com/turnermm/ckgedit/issues|ckgedit's issues]] на github. \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/ru/scayt.txt b/lib/plugins/ckgedit/lang/ru/scayt.txt new file mode 100644 index 0000000..3a13aec --- /dev/null +++ b/lib/plugins/ckgedit/lang/ru/scayt.txt @@ -0,0 +1 @@ +Scayt spellchecker предлагает три варианта Конфигурации: on, off, disabled. На данный момент настройкой по умолчанию будет **off** вместо **on**. С помощью **on** содержимое редактора анализируется Scayt и отправляется для проверки орфографии на сервер Scayt. Хотя нет никаких оснований полагать, что это представляет угрозу безопасности, тем не менее это изменение делается из соображений пользователей с частными вики-сайтами, которые могут испытывать беспокойство из-за отправки своих данных на удаленный сервер. Дополнительную информацию можно найти на странице Параметры конфигурации документации ckgedit по адресу https://www.dokuwiki.org/plugin:ckgedit:configuration#scayt_lang. diff --git a/lib/plugins/ckgedit/lang/ru/settings.php b/lib/plugins/ckgedit/lang/ru/settings.php new file mode 100644 index 0000000..0f484de --- /dev/null +++ b/lib/plugins/ckgedit/lang/ru/settings.php @@ -0,0 +1,52 @@ + + * @author Ianka Kryukov + * @author serg + * @author Artem Trutko + * @author Evgeniy Bekhterev + */ +$lang['groups'] = 'Разделенный запятыми список групп, которым разрешено отключать таймер блокировки'; +$lang['fck_preview'] = 'FCK предварительного просмотра группы'; +$lang['guest_toolbar'] = 'Отображать ли панель для гостей'; +$lang['guest_media'] = 'Могут ли гости вставлять ссылки на медиа файлы'; +$lang['open_upload'] = 'Могут ли гости загружать файлы'; +$lang['default_fb'] = 'Доступ для просмотра файлов по умолчанию. Если выбрать none, то ACL не будет использоваться.'; +$lang['openfb'] = 'Открытый просмотр файлов. Это дает пользователю доступ ко всей структуре папок, несмотря на то, имеет ли он права на это или нет. При этом ACL применяется для разрешения загрузки.'; +$lang['dw_edit_display'] = 'Выбрать, какие пользователи имеют доступ к кнопке "Редактор DokuWiki". Варианты: "all"- для всех; "admin"- только для администраторов и менеджеров; "none" - ни для кого'; +$lang['smiley_as_text'] = 'Отображение смайлов в виде текста в CKeditor (будут по-прежнему отображаться как изображения в браузере)'; +$lang['editor_bak'] = 'Сохранить резервную копию/<namespace>.ckgedit'; +$lang['create_folder'] = 'Включить кнопку создания папки в файловом браузере (да/нет)'; +$lang['dwedit_ns'] = 'Разделение запятыми список имен и/или страниц, где ckgedit автоматически переключается на родной Вики редактор; принимает частичные совпадения.'; +$lang['acl_del'] = 'По умолчанию (флажок не установлен) пользователи с разрешением на загрузку могут удалять медиафайлы; если флажок установлен, то для удаления из папки пользователю требуется разрешение на удаление.'; +$lang['auth_ci'] = 'Нечувствительный к регистру Логин id, так что можно войти и как USER и как user.'; +$lang['nix_style'] = 'Для серверов Windows (Vista и более поздние версии). Этот параметр делает возможным доступ к данным\медиа через ckgedit\CKeditor\Пользовательские файлы, если ссылки на медиа и файлы были успешно создан в пользовательских файлах.'; +$lang['no_symlinks'] = 'Отключить автоматическое создание символических ссылок в ckgedit/Пользовательских файлах.'; +$lang['direction'] = 'Установить языковое направление в CKeditor. nocheck: ckgedit оставит направление языка по умолчанию; dokuwiki: примет языковые настройки стандартного редактора Dokuwiki; ltr: С лева на право ; rtl: С права на лево.'; +$lang['scayt_auto'] = 'Автоматически включить SCAYT орфографии. По умолчанию используется "ВКЛ.". Чтобы отключить SCAYT выберите "Выкл."'; +$lang['scayt_lang'] = 'Установить SCAYT языком по умолчанию.'; +$lang['smiley_hack'] = 'Сбросьте URL-адрес для смайликов CKEditor при переходе на новый сервер. Это делается постранично, когда страница загружается для редактирования и сохраняется. Обычно эта опция должна быть отключена.'; +$lang['complex_tables'] = 'Используйте алгоритм сложных таблиц. В отличие от стандартного разбора таблиц, это должно дать лучшие результаты при смешивании сложных схем rowspans и colspans. Но немного больше времени обработки.'; +$lang['duplicate_notes'] = 'Установите это значение на true, если пользователи создают несколько сносок с одним и тем же текстом сноски; требуется для предотвращения повреждения заметок.'; +$lang['winstyle'] = 'Используйте прямой путь к каталогу media вместо fckeditor/userfiles. Эта функция копирует
    fckeditor/userfiles/.htaccess.security в data/media/.htaccess; если нет, то это должно быть сделано вручную'; +$lang['other_lang'] = 'Ваш язык по умолчанию для CKEditor-это язык, установленный для вашего браузера. Однако здесь вы можете выбрать другой язык; он не зависит от языка интерфейса Dokuwiki.'; +$lang['dw_priority'] = 'Сделать Dokuwiki редактором по-умолчанию.'; +$lang['preload_ckeditorjs'] = 'Подгрузить JavaScript ckeditor для ускорения последующей загрузки из редакторе.'; +$lang['nofont_styling'] = 'Отображение стилей шрифтов в редакторе в виде разметки плагина. Посмотреть страницу плагина ckgedit в Dokuwiki.org для получения подробной информации.'; +$lang['font_options'] = 'Удалить параметры шрифта.'; +$lang['color_options'] = 'Удалить цветовые варианты.'; +$lang['alt_toolbar'] = 'Функциями для того чтобы извлечь компоненты из панели инструментов'; +$lang['mfiles'] = 'Включить поддержку mfile'; +$lang['extra_plugins'] = 'Разделенный запятыми список дополнительных плагинов Ckeditor, которые будут добавлены на панель инструментов. См. Плагин ckgedit страница конфигурации для получения более подробной информации'; +$lang['dw_users'] = 'Имя группы пользователей, редактор которых по умолчанию использует редактор Dokuwiki при выборе dw_priority. Если не определено, то все пользователи получают собственный редактор Dokuwiki, когда выбран dw_priority.'; +$lang['allow_ckg_filebrowser'] = 'Выберите, какие файловый/медиа браузеры могут использовать пользователи'; +$lang['default_ckg_filebrowser'] = 'Выберите, какой файловый/медиа браузер используется по умолчанию. Это будет переопределено, если выбранный браузер не разрешен'; +$lang['captcha_auth'] = 'Уровень ACL, на котором капча отключается, когда параметр forusers плагина captcha установлен в true. Значение по умолчанию - ACL_CREATE, которая означает, что любой пользователь с помощью ACL_EDIT или меньше, будут получать капчу, ACL_CREATE или высшее не будет.'; +$lang['htmlblock_ok'] = 'При использовании HTML_BLOCKs необходимо включить либо этот параметр, либо опцию htmlok Dokuwiki. Он не представляет такого же уровня риска для безопасности, как htmlok. Тем не менее, он должен использоваться только в доверенной пользовательской среде, а не в открытой вики.'; +$lang['dblclk'] = 'Установите значение off, чтобы отключить функцию двойного щелчка, которая позволяет редактировать разделы с помощью редактора Dokuwiki (см.: direct_access_to_dokuwiki_editor) '; +$lang['preserve_enc'] = 'Сохранение urlencoding в URL-адресах, когда активна опция dokuwiki deaccent.'; +$lang['gui'] = 'Выберите графический интерфейс CKEditor.'; +$lang['rel_links'] = 'Активируйте поддержку относительных внутренних и графических ссылок'; diff --git a/lib/plugins/ckgedit/lang/sr/lang.php b/lib/plugins/ckgedit/lang/sr/lang.php new file mode 100644 index 0000000..d585f6c --- /dev/null +++ b/lib/plugins/ckgedit/lang/sr/lang.php @@ -0,0 +1,41 @@ + + */ +$lang['btn_dw_edit'] = 'DW уређивање'; +$lang['dw_btn_fck_preview'] = 'CKG претпреглед'; +$lang['dw_btn_lang'] = 'Језик'; +$lang['title_dw_delete'] = 'Обриши страницу'; +$lang['title_dw_edit'] = 'Сачувај урађено, изађи и пребаци ме на домаћи уређивач Докувикија'; +$lang['dw_btn_revert'] = 'Опозови'; +$lang['title_dw_revert'] = 'Опозови на претходну резерву'; +$lang['title_dw_lang'] = 'Изабери језик провере правописа'; +$lang['title_dw_cancel'] = 'Изађи из уређивача'; +$lang['btn_fck_edit'] = 'CKG уређивање'; +$lang['confirm_delete'] = 'Да ли сте сигурни да желите обрисати ову страницу?'; +$lang['confirm_preview'] = 'Несачувани рад ће бити изгубљен.'; +$lang['editor_height'] = 'Висина уређивача'; +$lang['editor_height_title'] = 'Промени величину уређивача при поновном учитавању'; +$lang['dw_btn_backup'] = 'Направи резерву'; +$lang['title_dw_backup'] = 'Направи резерву прозора уређивача и обнови катанац'; +$lang['backup_empty'] = 'Остава за резерве делује празно. Да ли желите да наставите?'; +$lang['btn_draft'] = 'Направи нацрт'; +$lang['title_draft'] = 'Погледај, прикажи, уреди нацрт'; +$lang['btn_exit_draft'] = 'Изађи из нацрта'; +$lang['title_exit_draft'] = 'Врати се на тренутни документ'; +$lang['draft_msg'] = 'Овај документ садржи нацрт датотеку. Дугме за нацрте ће мењати између приказа овог документа и нацрта. Можете мењати и сачувати било који примерак.'; +$lang['whats_this'] = 'шта је ово?'; +$lang['complex_tables'] = 'Омогући сложене табеле'; +$lang['minor_changes'] = 'Мање измене'; +$lang['discard_edits'] = 'Да сачувате ваше измене кликните на „У реду“, за одбацивање кликните на „Откажи“'; +$lang['dw_btn_styling'] = 'Уреди фонтове'; +$lang['title_styling'] = 'Отвори и прикажи стилове фонтова као маркап'; +$lang['js']['font_err_1'] = 'Стилизовање фонтова се не може укључити у везе. Кликните на „У реду“ да прихватите следећу исправку:'; +$lang['js']['font_err_throw'] = 'Грешка у форматирању фонта'; +$lang['js']['dwp_save_err'] = 'Не могу да сачувам измене у:'; +$lang['js']['on'] = 'укључено'; +$lang['js']['off'] = 'искључено'; +$lang['uprofile_title'] = 'Изаберите подразумеваног уређивача'; diff --git a/lib/plugins/ckgedit/lang/sv/lang.php b/lib/plugins/ckgedit/lang/sv/lang.php new file mode 100644 index 0000000..936cd19 --- /dev/null +++ b/lib/plugins/ckgedit/lang/sv/lang.php @@ -0,0 +1,34 @@ + + */ +$lang['btn_dw_edit'] = 'DW-redigerare'; +$lang['dw_btn_fck_preview'] = 'CKG-förhandsvisning'; +$lang['dw_btn_lang'] = 'Språk'; +$lang['title_dw_delete'] = 'Ta bort sida'; +$lang['dw_btn_revert'] = 'Återgå'; +$lang['title_dw_revert'] = 'Återgå till föregående säkerhetskopia'; +$lang['title_dw_lang'] = 'Välj språk för stavningskontroll'; +$lang['title_dw_cancel'] = 'Avsluta redigerare'; +$lang['confirm_delete'] = 'Är du säker på att du vill ta bort denna sida?'; +$lang['confirm_preview'] = 'Ändringar som inte sparats kommer att gå förlorade.'; +$lang['editor_height'] = 'Höjd på redigerare'; +$lang['dw_btn_backup'] = 'Säkerhetskopia'; +$lang['title_draft'] = 'Visa, redigera utkast'; +$lang['btn_exit_draft'] = 'Avsluta utkast'; +$lang['title_exit_draft'] = 'Återgå till nuvarande dokument'; +$lang['whats_this'] = 'vad är detta?'; +$lang['complex_tables'] = 'Aktivera komplexa tabeller'; +$lang['minor_changes'] = 'Mindre ändringar.'; +$lang['discard_edits'] = 'För att spara dina ändringar klicka OK; för att förkasta klicka på Avbryt'; +$lang['dw_btn_styling'] = 'Redigera fypsnitt'; +$lang['js']['dwp_save_err'] = 'Kunde inte spara ändringar till:'; +$lang['js']['on'] = 'på'; +$lang['js']['off'] = 'av'; +$lang['uprofile_title'] = 'Välj din standardredigerare'; +$lang['sym_not created_1'] = 'Kunde inte skapa'; +$lang['on'] = 'på'; +$lang['off'] = 'av'; diff --git a/lib/plugins/ckgedit/lang/sv/settings.php b/lib/plugins/ckgedit/lang/sv/settings.php new file mode 100644 index 0000000..00cc38c --- /dev/null +++ b/lib/plugins/ckgedit/lang/sv/settings.php @@ -0,0 +1,16 @@ + + */ +$lang['guest_toolbar'] = 'Visa verktygsfält för besökare'; +$lang['guest_media'] = 'Besökare kan länka till mediafiler'; +$lang['open_upload'] = 'Besökare kan ladda uopp'; +$lang['create_folder'] = 'Aktivera knapp för att skapa ny katalog i filhanteraren (j/n)'; +$lang['scayt_lang'] = 'Välj SCAYT-standardspråk'; +$lang['font_options'] = 'Ta bort typsnittsalternativ.'; +$lang['color_options'] = 'Ta bort färgalternativ.'; +$lang['mfiles'] = 'Aktivera mfile-stöd'; +$lang['rel_links'] = 'Aktivera stöd för relativa interna- och bildlänkar'; diff --git a/lib/plugins/ckgedit/lang/vi/lang.php b/lib/plugins/ckgedit/lang/vi/lang.php new file mode 100644 index 0000000..98050aa --- /dev/null +++ b/lib/plugins/ckgedit/lang/vi/lang.php @@ -0,0 +1,72 @@ + + */ +$lang['btn_dw_edit'] = 'Sửa đổi bằng DW'; +$lang['dw_btn_fck_preview'] = 'Xem trước bằng CKG'; +$lang['dw_btn_lang'] = 'Ngôn ngữ'; +$lang['title_dw_delete'] = 'Xóa trang'; +$lang['title_dw_edit'] = 'Lưu công việc, thoát và chuyển sang Trình soạn thảo DokuWiki gốc'; +$lang['dw_btn_revert'] = 'Lùi lại'; +$lang['title_dw_revert'] = 'Lùi về bản sao lưu trước'; +$lang['title_dw_lang'] = 'Chọn ngôn ngữ để kiểm tra chính tả'; +$lang['title_dw_cancel'] = 'Thoát Trình chỉnh sửa'; +$lang['btn_fck_edit'] = 'Trình sửa đổi CKG'; +$lang['confirm_delete'] = 'Bạn có chắc chắn muốn xóa trang này?'; +$lang['confirm_preview'] = 'Bất kỳ công việc chưa được lưu sẽ bị mất.'; +$lang['editor_height'] = 'Chiều cao Trình sửa đổi'; +$lang['editor_height_title'] = 'Kích thước lại Trình sửa đổi khi tải lại'; +$lang['dw_btn_backup'] = 'Sao lưu'; +$lang['title_dw_backup'] = 'Sao lưu cửa sổ trình sửa đổi và gia hạn mới khóa'; +$lang['backup_empty'] = 'Bộ đệm sao lưu dường như trống rỗng. Bạn có muốn tiếp tục?'; +$lang['btn_draft'] = 'Nhận bản nháp'; +$lang['title_draft'] = 'Xem, hiển thị, sửa đổi bản nháp'; +$lang['btn_exit_draft'] = 'Thoát bản nháp'; +$lang['title_exit_draft'] = 'Quay trở lại tài liệu hiện tại'; +$lang['draft_msg'] = 'Tài liệu này có một tập tin nháp. Nút bản nháp đảo chiều giữa tài liệu này và bản nháp. Bạn có thể sửa đổi và lưu một trong hai.'; +$lang['whats_this'] = 'đây là gì?'; +$lang['complex_tables'] = 'Kích hoạt bảng phức tạp'; +$lang['minor_changes'] = 'Thay đổi nhỏ'; +$lang['discard_edits'] = 'Nhấn OK để lưu các sửa đổi của bạn; nhấn Hủy bỏ để hủy bỏ.'; +$lang['dw_btn_styling'] = 'Sửa đổi phông chữ'; +$lang['title_styling'] = 'Mở với các kiểu phông chữ được hiển thị dưới dạng đánh dấu'; +$lang['js']['font_err_1'] = 'Kiểu phông chữ có thể được bao gồm trong các liên kết. Nhấn OK để chấp nhận điều chỉnh sau:'; +$lang['js']['font_err_2'] = 'Để xem lại, hãy nhập đánh dấu liên kết Dokuwiki đầy đủ bên dưới, bao gồm cả dấu ngoặc. Để quay về Trình chỉnh sửa, nhấp vào Hủy bỏ.'; +$lang['js']['font_err_throw'] = 'Lỗi định dạng phông chữ'; +$lang['js']['dwp_save_err'] = 'Không thể lưu các thay đổi thành:'; +$lang['js']['dwp_updated'] = 'Trình sửa đổi ưu tiên được cập nhật thành:'; +$lang['js']['dwp_not_sel'] = 'Chưa chọn Trình sửa đổi ưu tiên: nó sẽ được xác định bởi cài đặt cấu hình nhóm dw_users'; +$lang['js']['mediamgr_notice'] = 'Sử dụng hộp thoại liên kết để chèn'; +$lang['js']['font_conflict'] = 'Trình phân tích cú pháp tìm thấy một hoặc nhiều xung đột phông chữ liên kết. Bằng cách nhấn vào OK, bạn có thể quay lại trình sửa đổi và xóa các kiểu phông chữ. Để biết thêm thông tin xem: https://www.dokuwiki.org/plugin:ckgedit:font_styling#conflicts_with_dokuwiki_links'; +$lang['js']['ckg_paste_restart'] = 'Khi tải lại trình sửa đổi, hỗ trợ dán bổ sung sẽ được bật'; +$lang['js']['on'] = 'bật'; +$lang['js']['off'] = 'tắt'; +$lang['js']['broken_image_1'] = 'Sử dụng plugin imagePaste với Quản lý phương tiện Dokuwiki hoặc dùng thử Công cụ dán MS Word.'; +$lang['js']['broken_image_2'] = 'Hình ảnh Ctrl-v với dữ liệu thô trên 2,5M có thể bị treo. Hình ảnh này là:'; +$lang['mediamgr_imgonly'] = 'Chỉ sử dụng Hộp thoại Hình ảnh cho hình ảnh, Hộp thoại Liên kết cho các phương tiện khác. Tập tin này là:'; +$lang['uprofile_title'] = 'Chọn Trình sửa đổi mặc định của bạn'; +$lang['btn_val_dw_fb'] = 'Trình duyệt tập tin DW'; +$lang['btn_val_ckg_fb'] = 'Trình duyệt tập tin CKG'; +$lang['btn_title_dw_fb'] = 'Lưu và đóng trình sửa đổi và chuyển sang Trình duyệt tập tin DW'; +$lang['btn_title_ckg_fb'] = 'Lưu và đóng trình sửa đổi và chuyển sang Trình duyệt tập tin CKG'; +$lang['formatdel'] = 'Đánh dấu bị xóa khỏi (các) đầu đề: không được Dokuwiki hỗ trợ'; +$lang['fontdel'] = 'Xóa phông chữ đánh dấu khỏi (các) liên kết: không được Dokuwiki hỗ trợ'; +$lang['ckgcke_conflict'] = 'Một bản sao của ckgedit đã được phát hiện. Ckgedit này hoặc ckgedit kia phải bị vô hiệu hóa.'; +$lang['ws_cantcopy'] = 'Để thiết lập winstyle: không thể sao chép vào'; +$lang['ws_copiedhtaccess'] = 'Để thiết lập winstyle, sao chép .htaccess được kích hoạt bảo mật vào dữ liệu/phương tiện +Xem ckgedit/fckeditor/userfiles/.htacess.security'; +$lang['userfiles_perm'] = 'Vui lòng kiểm tra quyền; ckgedit không thể truy cập'; +$lang['sym_not created_1'] = 'Không thể tạo'; +$lang['sym_not created_2'] = 'Không thể tạo liên kết tượng trưng cho trình duyệt tập tin: không thể truy cập:'; +$lang['sym_not created_3'] = 'Đã xảy ra lỗi khi cố gắng tạo liên kết tượng trưng trong'; +$lang['syms_created'] = 'Các liên kết sau đã được tạo trong thư mục userfiles:'; +$lang['dblclk'] = 'Tính năng mới: nhấn đúp vào cửa sổ trình duyệt để sửa đổi phần tại con trỏ bằng Trình sửa đổi DW. Xem: direct_access_to_dokuwiki_editor. '; +$lang['dblclk_reminder'] = 'Nhắc nhở '; +$lang['ckg_img_paste'] = 'Bật hỗ trợ dán hình ảnh bổ sung'; +$lang['ckg_img_paste_title'] = 'Tắt để tránh dán hai lần hoặc bật để kích hoạt dán'; +$lang['on'] = 'bật'; +$lang['off'] = 'tắt'; +$lang['broken_image'] = 'Sử dụng plugin imagePaste với Quản lý phương tiện Dokuwiki hoặc dùng thử Công cụ dán của MS Word. Dữ liệu thô của hình ảnh Ctrl-v trên 2,5M có thể bị treo. Hình ảnh này là:'; diff --git a/lib/plugins/ckgedit/lang/vi/merger.txt b/lib/plugins/ckgedit/lang/vi/merger.txt new file mode 100644 index 0000000..ed57057 --- /dev/null +++ b/lib/plugins/ckgedit/lang/vi/merger.txt @@ -0,0 +1,2 @@ + - Phiên bản này của [[doku>plugin:ckgedit|ckgedit]] nâng cấp CKEditor từ 4.9 lên 4.10, giúp cập nhật và cải tiến javascript. + - Với bản nâng cấp lên 4.9, ckgedit được hợp nhất với [[doku>plugin:ckgdoku|ckgdoku]]. Xem ckgdoku's [[doku>plugin:ckgdoku#configuration|tùy chọn cấu hình]]. \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/vi/scayt.txt b/lib/plugins/ckgedit/lang/vi/scayt.txt new file mode 100644 index 0000000..3d95fdd --- /dev/null +++ b/lib/plugins/ckgedit/lang/vi/scayt.txt @@ -0,0 +1 @@ +Trình kiểm tra chính tả Scayt cung cấp ba Tùy chọn cấu hình: on (bật), off (tất), disabled (vô hiệu hóa). Bây giờ, cài đặt mặc định sẽ là **off** thay vì **on**. Với **on** nội dung của trình sửa đổi được Scayt phân tích cú pháp và gửi đến máy chủ Scayt để kiểm tra chính tả. Mặc dù không có lý do nào để tin rằng đây là rủi ro bảo mật, tuy nhiên thay đổi này đang được xem xét cho người dùng có wiki riêng có thể cảm thấy lo lắng khi dữ liệu của họ được gửi đến máy chủ từ xa. Thông tin thêm có thể được tìm thấy trong trang Tùy chọn cấu hình của tài liệu ckgedit tại https://www.dokuwiki.org/plugin:ckgedit:configuration#scayt_lang. \ No newline at end of file diff --git a/lib/plugins/ckgedit/lang/vi/settings.php b/lib/plugins/ckgedit/lang/vi/settings.php new file mode 100644 index 0000000..824bd8d --- /dev/null +++ b/lib/plugins/ckgedit/lang/vi/settings.php @@ -0,0 +1,48 @@ + + */ +$lang['groups'] = 'Nhóm được phép vô hiệu hóa bộ đếm thời gian khóa (lỗi thời)'; +$lang['fck_preview'] = 'Nhóm xem trước FCK'; +$lang['guest_toolbar'] = 'Hiển thị thanh công cụ cho Khách'; +$lang['guest_media'] = 'Khách có thể liên kết đến tập tin phương tiện'; +$lang['open_upload'] = 'Khách có thể tải lên'; +$lang['default_fb'] = 'Truy cập duyệt tập tin mặc định. Không có, acl không áp dụng.'; +$lang['openfb'] = 'Mở Duyệt Tập tin. Điều này cho phép thành viên truy cập vào toàn bộ cấu trúc đường dẫn, cho dù thành viên có quyền hay không. ACL vẫn áp dụng cho tải lên.'; +$lang['dw_edit_display'] = 'Kiểm soát những thành viên có quyền truy cập vào nút "Trình sửa đổi DW". Lựa chọn: "all" cho tất cả thành viên; "admin" chỉ dành cho quản trị viên và người quản lý; "none" không ai có thể truy cập. Mặc định là "all".'; +$lang['smiley_as_text'] = 'Hiển thị mặt cười dưới dạng văn bản trong CKeditor (vẫn sẽ hiển thị dưới dạng hình ảnh trong trình duyệt)'; +$lang['editor_bak'] = 'Lưu bản sao lưu vào meta/<namespace>.ckgedit'; +$lang['create_folder'] = 'Kích hoạt nút tạo thư mục trong trình duyệt tập tin (y/n)'; +$lang['dwedit_ns'] = 'Danh sách các không gian tên và/hoặc trang được phân tách bằng dấu phẩy nơi ckgedit tự động chuyển sang Trình sửa đổi DokuWiki gốc; chấp nhận một phần phù hợp.'; +$lang['acl_del'] = 'Mặc định (hộp không được đánh dấu) cho phép thành viên có quyền tải lên để xóa các tập tin phương tiện; nếu hộp được đánh dấu, thì thành viên cần xóa quyền xóa khỏi thư mục.'; +$lang['auth_ci'] = 'Id đăng nhập thành viên không phân biệt chữ hoa chữ thường, nghĩa là bạn có thể đăng nhập với tư cách là cả THÀNH VIÊN và thành viên'; +$lang['nix_style'] = 'Dành cho Windows Servers (Vista trở lên). Cài đặt này cho phép truy cập data\media thông qua ckgedit\CKeditor\userfiles, nếu liên kết đến phương tiện và tập tin đã được tạo thành công trong tập tin người dùng'; +$lang['no_symlinks'] = 'Vô hiệu hóa tự động tạo các liên kết tượng trưng trong ckgedit/userfiles. Tùy chọn này nên được tắt khi cập nhật.'; +$lang['direction'] = 'Đặt hướng ngôn ngữ trong CKeditor: nocheck: ckgedit sẽ không thay đổi cài đặt hướng mặc định; dokuwiki: hướng ngôn ngữ Dokuwiki hiện tại; ltr: Trái sang phải ; rtl: Phải sang trái.'; +$lang['scayt_auto'] = 'Đặt có hay không trình kiểm tra chính tả khi nhập Scayt đang hoạt động khi khởi động. Mặc định là off;người dùng có thể kích hoạt lại kiểm tra chính tả trên cơ sở mỗi trang. Để xóa hoàn toàn trình kiểm tra chính tả Scayt, chọn disable. (Xem ckgedit:configuration#scayt_auto") '; +$lang['scayt_lang'] = 'Đặt ngôn ngữ mặc định SCAYT.'; +$lang['smiley_hack'] = 'Đặt lại URL cho mặt cười của CKeditor khi chuyển sang máy chủ mới. Điều này được thực hiện trên một trang theo cơ sở trang khi trang được tải để sửa đổi và lưu. Tùy chọn này thường nên được tắt.'; +$lang['complex_tables'] = 'Sử dụng thuật toán bảng phức tạp. Trái ngược với phân tích cú pháp tiêu chuẩn của các bảng, điều này sẽ cho kết quả tốt hơn khi trộn các sắp xếp phức tạp của các rowspans và colspans. Nhưng thời gian xử lý nhiều hơn một chút.'; +$lang['duplicate_notes'] = 'Đặt điều này thành đúng nếu thành viên tạo nhiều chú thích với cùng một văn bản chú thích; cần thiết để ngăn ghi chú bị hỏng.'; +$lang['winstyle'] = 'Sử dụng đường dẫn trực tiếp đến đường dẫn phương tiện thay vì fckeditor/userfiles. Chức năng này sao chép
    fckeditor/userfiles/.htaccess.security đến data/media/.htaccess; nếu không, điều này nên được thực hiện thủ công'; +$lang['other_lang'] = 'Ngôn ngữ mặc định của bạn cho CKEditor là ngôn ngữ được đặt cho trình duyệt của bạn. Tuy nhiên, bạn có thể chọn một ngôn ngữ khác ở đây; nó độc lập với ngôn ngữ giao diện Dokuwiki.'; +$lang['dw_priority'] = 'Đặt trình sửa đổi Dokuwiki làm trình sửa đổi mặc định: không hoạt động trong các trang trại'; +$lang['preload_ckeditorjs'] = 'Tải trước javascript của ckeditor để tăng tốc độ tải trình sửa đổi sau'; +$lang['nofont_styling'] = 'Hiển thị kiểu phông chữ trong trình sửa đổi dưới dạng đánh dấu plugin. Xem trang plugin ckgedit tại Dokuwiki.org để biết chi tiết.'; +$lang['font_options'] = 'Xóa tùy chọn phông chữ.'; +$lang['color_options'] = 'Xóa tùy chọn màu.'; +$lang['alt_toolbar'] = 'Các chức năng muốn loại bỏ khỏi thanh công cụ CKEditor.

    Bất kỳ chức năng nào khác có thể được loại bỏ bằng cách đưa chúng vào danh sách được phân tách bằng dấu phẩy trong hộp văn bản:

    Bold (In đậm), Italic (In nghiêng), Underline (Gạch chân), Strike (Gạch xuyên ngang), Subscript (Chỉ số dưới), Superscript (Chỉ số trên), RemoveFormat (Xóa định dạng), Find (Tìm), Replace (Thay thế), SelectAll (Chọn tất cả), Scayt (Kiểm tra chính tả Scayt), Image (Hình ảnh), Table (Bảng), Tags (Thẻ), Link (Liên kết), Unlink (Bỏ liên kết), Format (Định dạng), Styles (Kiểu cách),TextColor (Màu văn bản), BGColor (Màu nền), NumberedList (Danh sách đánh số), BulletedList (Danh sách không đánh số), Cut (Cắt), Copy (Sao chép), Paste (Dán), PasteText (Dán văn bản thường), PasteFromWord (Dán từ Word), Undo (Hoàn tác), Redo (Làm lại), Source (Nguồn), Maximize (Phóng to), About (Về).'; +$lang['mfiles'] = 'Cho phép hỗ trợ mfile'; +$lang['extra_plugins'] = 'Danh sách các plugin Ckeditor được phân tách bằng dấu phẩy được thêm vào thanh công cụ. Xem trang cấu hình plugin của ckgedit để biết chi tiết'; +$lang['dw_users'] = 'Tên nhóm thành viên có trình sửa đổi mặc định cho trình soạn thảo Dokuwiki khi dw_priority được chọn. Nếu không được xác định, thì tất cả thành viên sẽ nhận được trình sửa đổi Dokuwiki riêng khi dw_priority được chọn'; +$lang['allow_ckg_filebrowser'] = 'Chọn trình duyệt Tập tin/phương tiện thành viên có thể sử dụng'; +$lang['default_ckg_filebrowser'] = 'Chọn trình duyệt Tập tin/phương tiện mặc định. Điều này sẽ bị ghi đè nếu trình duyệt được chọn không được phép'; +$lang['captcha_auth'] = 'Mức độ ACL mà captcha bị tắt khi tùy chọn forusers của plugin captcha được đặt thành đúng. Mặc định là ACL_CREATE, có nghĩa là bất kỳ thành viên nào với ACL_EDIT hoặc ít hơn sẽ có được captcha ACL_CREATE hoặc cao hơn sẽ không.'; +$lang['htmlblock_ok'] = 'Khi sử dụng HTML_BLOCKs cài đặt này hoặc tùy chọn htmlok của Dokuwiki phải được kích hoạt. Nó không gây ra mức độ rủi ro bảo mật tương tự như htmlok. Tuy nhiên, nó chỉ nên được sử dụng trong môi trường thành viên đáng tin cậy chứ không phải trong wiki mở.'; +$lang['dblclk'] = 'Đặt off để tắt tính năng nhấp đúp cho phép sửa đổi phần bằng trình sửa đổi Dokuwiki (xem: direct_access_to_dokuwiki_editor)'; +$lang['preserve_enc'] = 'Giữ nguyên urlencoding trong url khi tùy chọn vô hiệu hóa dokuwiki đang hoạt động.'; +$lang['gui'] = 'Chọn GUI CKEditor.'; +$lang['rel_links'] = 'Kích hoạt hỗ trợ cho các liên kết hình ảnh và nội bộ liên quan'; diff --git a/lib/plugins/ckgedit/lang/zh-tw/lang.php b/lib/plugins/ckgedit/lang/zh-tw/lang.php new file mode 100644 index 0000000..e753278 --- /dev/null +++ b/lib/plugins/ckgedit/lang/zh-tw/lang.php @@ -0,0 +1,34 @@ + + */ +$lang['btn_dw_edit'] = 'DW編輯'; +$lang['dw_btn_fck_preview'] = 'CKG預覽'; +$lang['dw_btn_lang'] = '語言'; +$lang['title_dw_delete'] = '刪除頁面'; +$lang['title_dw_edit'] = '存檔離開後切換到預設編輯器'; +$lang['dw_btn_revert'] = '還原'; +$lang['title_dw_revert'] = '還原備份檔'; +$lang['title_dw_lang'] = '選擇拼字檢查的語言'; +$lang['title_dw_cancel'] = '離開編輯器'; +$lang['btn_fck_edit'] = 'CKG編輯'; +$lang['confirm_delete'] = '確定要刪除頁面嗎?'; +$lang['confirm_preview'] = '你將會遺失尚未儲存的資料'; +$lang['editor_height'] = '編輯器高度'; +$lang['editor_height_title'] = '編輯器於頁面刷新時,重新調整大小'; +$lang['dw_btn_backup'] = '備份'; +$lang['title_dw_backup'] = '備份現在的資料並更新鎖定定時器'; +$lang['backup_empty'] = '備份暫存區沒有資料可提供還原,仍要繼續嗎?'; +$lang['btn_draft'] = '載入草稿'; +$lang['title_draft'] = '檢視並編輯草稿'; +$lang['btn_exit_draft'] = '編輯草稿'; +$lang['title_exit_draft'] = '返回現行的檔案'; +$lang['draft_msg'] = '有份編輯一半的草稿。請用下方的草稿鈕繼續編輯或移除'; +$lang['whats_this'] = '這是什麼?'; +$lang['complex_tables'] = '使用複雜性表格'; +$lang['minor_changes'] = '微小修訂'; +$lang['discard_edits'] = '按 OK 以儲存你的修改,按 Cancel 放棄你的修改'; +$lang['dw_btn_styling'] = '字形'; diff --git a/lib/plugins/ckgedit/lang/zh-tw/settings.php b/lib/plugins/ckgedit/lang/zh-tw/settings.php new file mode 100644 index 0000000..74ee2f7 --- /dev/null +++ b/lib/plugins/ckgedit/lang/zh-tw/settings.php @@ -0,0 +1,22 @@ + + * @author chenb + * @author 2576562185 <2576562185@qq.com> + */ +$lang['btn_dw_edit'] = 'DW 原生编辑器'; +$lang['dw_btn_fck_preview'] = 'CKG 预览'; +$lang['dw_btn_lang'] = '语言'; +$lang['title_dw_delete'] = '删除页面'; +$lang['title_dw_edit'] = '保存并退出,并切换回原生DokuWiki编辑器'; +$lang['dw_btn_revert'] = '回滚'; +$lang['title_dw_revert'] = '回滚到上次备份'; +$lang['title_dw_lang'] = '选择需拼写检查的语言'; +$lang['title_dw_cancel'] = '退出编辑器'; +$lang['btn_fck_edit'] = 'CKG 可视编辑器'; +$lang['confirm_delete'] = '您确定要删除这个页面吗?'; +$lang['confirm_preview'] = '未经存储的改动将会丢失。'; +$lang['editor_height'] = '编辑器高度'; +$lang['editor_height_title'] = '打开时重置编辑器大小'; +$lang['dw_btn_backup'] = '备份'; +$lang['title_dw_backup'] = "备份编辑器窗口和更新锁定"; +$lang['backup_empty'] = "备份缓冲区似乎为空。 你想继续吗?"; +$lang['btn_draft'] = '获取草稿'; +$lang['title_draft'] = '查看、展示、编辑草稿'; +$lang['btn_exit_draft'] = '退出草稿'; +$lang['title_exit_draft'] = '返回到当前文档'; +$lang['draft_msg'] = '此文档有一份草稿。“草稿”按钮可在文档与草稿间来回切换。你可以独立地编辑、保存它们。'; +$lang['whats_this'] = '这是什么?'; +$lang['complex_tables'] = '启用复杂型表格'; +$lang['minor_changes'] = '小修改'; +$lang['discard_edits'] = '点“确定”保存,点“取消”撤销修改'; +$lang['dw_btn_styling'] = '修改字体'; +$lang['title_styling'] = '以显示为Markup标记的字体样式打开'; +$lang['js']['font_err_1'] = '字体样式不能包含在链接中。 单击确定以接受以下更正:'; +$lang['js']['font_err_2'] = '要进行修订,请在下面输入完整的Dokuwiki链接标记,包括方括号。 要返回编辑器,请单击“取消”。'; +$lang['js']['font_err_throw'] = '字体格式错误'; +$lang['js']['dwp_save_err'] = '无法将更改保存到:'; +$lang['js']['dwp_updated'] = '编辑器优先级已更新为:'; +$lang['js']['dwp_not_sel'] = '未选择编辑器优先级:它将由dw_users组配置设置确定'; +$lang['js']['mediamgr_notice'] = '使用链接对话框插入'; +$lang['js']['font_conflict'] = "解析器发现一个或多个链接字体冲突。 通过单击“确定”,您可以返回到编辑器并删除字体样式。 有关更多信息,请参见:https://www.dokuwiki.org/plugin:ckgedit:font_styling#conflicts_with_dokuwiki_links"; +$lang['mediamgr_imgonly'] = '“图像对话框”仅用于图像,“链接对话框”用于其他媒体。 该文件是:'; +$lang['uprofile_title'] = '选择您的默认编辑器'; +$lang['btn_val_dw_fb'] = 'DW 文件浏览器'; +$lang['btn_val_ckg_fb'] = 'CKG 文件浏览器'; +$lang['btn_title_dw_fb'] = '保存并关闭当前编辑器并切换至 DW 文件浏览器'; +$lang['btn_title_ckg_fb'] = '保存并关闭当前编辑器并切换至 CKG 文件浏览器'; +$lang['formatdel'] = '从标题中删除Markup标记:Dokuwiki不支持'; +$lang["fontdel"] ='从链接中删除了字体Markup标记:Dokuwiki不支持'; +$lang["ws_cantcopy"] ='对于winstyle设置:无法复制到'; +$lang["ws_copiedhtaccess"] ='对于winstyle设置,复制 security-enabled .htaccess 到 data/media' ."\n" .'参见 ckgedit/fckeditor/userfiles/.htacess.security'; +$lang["userfiles_perm"] ='请检查权限; ckgedit无法访问'; +$lang['sym_not created_1'] = '无法创建'; +$lang["sym_not created_2"] = '无法为文件浏览器创建符号链接:无法访问:'; +$lang["sym_not created_3"] = '尝试在其中创建符号链接时发生错误'; +$lang["syms_created"] = '在userfiles目录中创建了以下链接:'; +$lang['dblclk'] ="新功能: 双击浏览器窗口以打开DW编辑器,以便在光标处进行章节编辑。 参见: direct_access_to_dokuwiki_editor. "; +$lang['dblclk_reminder'] = "提醒 "; +$lang['ckg_img_paste'] = '启用辅助图像粘贴支持'; +$lang['ckg_img_paste_title'] = '禁用以防止重复粘贴,或启用以允许粘贴'; +$lang['js']['ckg_paste_restart'] = '重新加载编辑器时,将允许补充粘贴支持'; +$lang['on'] = '启用'; +$lang['off'] = '禁用'; +$lang['js']['on'] = '启用'; +$lang['js']['off'] = '禁用'; +$lang['broken_image'] = "将imagePaste插件与Dokuwiki Mediamanager一起使用,或尝试使用MS Word Paste Tool。 超过2.5M的Ctrl-v图像原始数据可能会挂起。 该图像是:" ; +$lang['js']['broken_image_1'] = "将imagePaste插件与Dokuwiki Mediamanager一起使用,或尝试使用MS Word Paste Tool。"; +$lang['js']['broken_image_2'] = "超过2.5M的Ctrl-v图像原始数据可能会挂起。 该图像是: " ; +$lang['menu'] = 'CKEditor编辑器CSS工具'; +$lang['default_stylesheet'] = '为当前模板创建样式表'; +$lang['alt_stylesheet'] = '为另一个模板创建样式表'; +$lang['style_sheet'] = '创建样式表'; +$lang['style_sheet_msg'] = '为当前模板创建样式表:'; +$lang['alt_style_sheet_msg'] = '为以下对象创建样式表:'; +$lang['checkbox'] = '复制到ckeditor/css'; +$lang['stylesheet_oinfo'] = '信息'; +$lang['stylesheet_cinfo'] = '关闭信息'; +$lang['js']['stylesheet_oinfo'] = '信息'; +$lang['js']['stylesheet_cinfo'] = '关闭信息'; +$lang['js']['lock_msg'] = "您编辑此页面的锁将在一分钟后到期\n"; +$lang['js']['willexpire'] = '您编辑此页面的锁将在一分钟后到期\n 为避免冲突,请使用备份按钮重置锁定计时器。'; diff --git a/lib/plugins/ckgedit/lang/zh/settings.php b/lib/plugins/ckgedit/lang/zh/settings.php new file mode 100644 index 0000000..95ae870 --- /dev/null +++ b/lib/plugins/ckgedit/lang/zh/settings.php @@ -0,0 +1,10 @@ + + */ +$lang['openfb'] = 'Open the file to browse. This gives the user access to the entire directory structure, whether the user has permissions or not. The ACL still applies to uploads.'; +$lang['dw_edit_display'] = 'Control which users can access the "DW Edit" button. Choice: "All" for all users; "Administrator" applies only to administrators and managers; "None" for anyone. The default is "All".'; +$lang['smiley_as_text'] = 'Display emoticons as text in CKeditor (It will still appear as an image in the browser.)'; diff --git a/lib/plugins/ckgedit/locktimer.js b/lib/plugins/ckgedit/locktimer.js new file mode 100644 index 0000000..71bf603 --- /dev/null +++ b/lib/plugins/ckgedit/locktimer.js @@ -0,0 +1,192 @@ + if(window.dw_locktimer) { + var locktimer = dw_locktimer; +} + + var ourLockTimerRefreshID; + var ourLockTimerIsSet = true; + var ourLockTimerWarningtimerID; + var ourLockTimerIntervalID; + var dwfckTextChanged = false; + var ourLockTimerINI = false; + /** + * event handler + * handles some mousepresses and all keystrokes from CKEditor window + */ + + + function handlekeypress (e) { + if(e.data && e.data.keyCode == CKEDITOR.CTRL + 81) { + jQuery("#save_button").trigger("mousedown"); + } + if(ourLockTimerIsSet) { + lockTimerRefresh(); + } + window.dwfckTextChanged = true; + } + + + function unsetDokuWikiLockTimer() { + + if(window.locktimer && !ourLockTimerINI) { + locktimer.old_reset = locktimer.reset; + locktimer.old_warning = locktimer.warning; + ourLockTimerINI=true; + } + else { + window.setTimeout("unsetDokuWikiLockTimer()", 600); + + } + + locktimer.reset = function(){ + locktimer.clear(); // alert(locktimer.timeout); + window.clearTimeout(ourLockTimerWarningtimerID); + ourLockTimerWarningtimerID = window.setTimeout(function () { locktimer.warning(); }, locktimer.timeout); + }; + + locktimer.warning = function(){ + window.clearTimeout(ourLockTimerWarningtimerID); + if(ourLockTimerIsSet) { + alert(LANG.plugins.ckgedit.willexpire); + } + else { + alert(LANG.plugins.ckgedit.lock_msg); + } + }; + + + locktimer.ourLockTimerReset = locktimer.reset; + locktimer.our_lasttime = new Date(); + lockTimerRefresh(); + + } + + function lockTimerRefresh(bak) { + var now = new Date(); + if(!ourLockTimerINI) unsetDokuWikiLockTimer(); + + if((now.getTime() - locktimer.our_lasttime.getTime() > 45*1000) || bak){ + var dwform = GetE('dw__editform'); + window.clearTimeout(ourLockTimerWarningtimerID); + var params = 'call=lock&id='+locktimer.pageid; + if(CKEDITOR.instances) { + dwform.elements.wikitext.value = CKEDITOR.instances.wiki__text.getData(); + params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value); + params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value); + params += '&suffix='+encodeURIComponent(dwform.elements.suffix.value); + params += '&date='+encodeURIComponent(dwform.elements.date.value); + } + locktimer.our_lasttime = now; + jQuery.post( + DOKU_BASE + 'lib/exe/ajax.php', + params, + function (data) { + try { + var data = JSON.parse(data); + data.draft = data.draft + ' by ckgedit'; + } + catch(err) { + data = data.replace(/auto/,"") + ' by ckgedit'; + } + locktimer.response = data; + locktimer.refreshed(data); + }, + 'html' + ); + } + + } + function resetDokuWikiLockTimer(delete_checkbox) { + + var dom_checkbox = document.getElementById('ckgedit_timer'); + var dom_label = document.getElementById('ckgedit_timer_label'); + locktimer.clear(); + if(ourLockTimerIsSet) { + + ourLockTimerIsSet = false; + locktimer.reset = locktimer.old_reset; + locktimer.refresh(); + return; + } + + if(delete_checkbox) { + dom_checkbox.style.display = 'none'; + dom_label.style.display = 'none'; + } + + ourLockTimerIsSet = true; + locktimer.reset = locktimer.ourLockTimerReset; + lockTimerRefresh(); + + } + +function renewLock(bak) { + if(ourLockTimerIsSet) { + lockTimerRefresh(true); + } + else { + locktimer.refresh(); + } + locktimer.reset(); + + + if(bak) { + var id = "$ID"; + parse_wikitext('bakup'); + + var dwform = GetE('dw__editform'); + if(dwform.elements.fck_wikitext.value == '__false__' ) return; + GetE('saved_wiki_html').innerHTML = CKEDITOR.instances.wiki__text.getData(); // ourFCKEditorNode.innerHTML; + if(($editor_backup) == 0 ) { + return; + } + + var params = "rsave_id=" + encodeURIComponent("$meta_fn"); + params += '&wikitext='+encodeURIComponent(dwform.elements.fck_wikitext.value); + params += '&call=refresh_save'; + jQuery.post( + DOKU_BASE + 'lib/exe/ajax.php', + params, + function (data) { + if(data == 'done') { + show_backup_msg("$meta_id"); + } + else { + alert("error saving: " + id); + } + }, + 'html' + ); + } + +} +function dwfckKeypressInstallHandler() { + if(window.addEventListener){ + oDokuWiki_FCKEditorInstance.EditorDocument.addEventListener('keyup', handlekeypress , false) ; + } + else { + oDokuWiki_FCKEditorInstance.EditorDocument.attachEvent('onkeyup', handlekeypress ) ; + } +} + +function disableDokuWikiLockTimer() { + resetDokuWikiLockTimer(false); + if(ourLockTimerIntervalID) { + window.clearInterval(ourLockTimerIntervalID); + } + if(ourLockTimerIsSet) { + ourLockTimerIntervalID = window.setInterval(function () { locktimer.refresh(); }, 30000); + } +} + +// Make sure that show buttons in top and/or bottom clear the fckl file + function get_showButtons() { + var inputs = document.getElementsByTagName('input'); + + for(var i=0; i + * @author Myron Turner + */ +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +// we inherit from the XHTML renderer instead directly of the base renderer +require_once DOKU_INC.'inc/parser/xhtml.php'; + +/** + * The Renderer + */ +class renderer_plugin_ckgedit extends Doku_Renderer_xhtml +{ + + var $ver_anteater; + var $dwiki_version; + +/** + * Establish version in constructor + * @author Myron Turner + */ + + function __construct() { + global $conf; + $this->ver_anteater = mktime(0,0,0,11,7,2010); + $this->dwiki_version=mktime(0,0,0,01,01,2008); + + if(isset($conf['fnencode'])) { + $this->ver_anteater = mktime(0,0,0,11,7,2010); + $this->dwiki_version=mktime(0,0,0,11,7,2010); + } + else if(function_exists('getVersionData')) { + $verdata= getVersionData(); + if(isset($verdata) && preg_match('/(\d+)-(\d+)-(\d+)/',$verdata['date'],$ver_date)) { + if($ver_date[1] >= 2005 && ($ver_date[3] > 0 && $ver_date[3] < 31) && ($ver_date[2] > 0 && $ver_date[2] <= 12)) { + // month day year + $this->dwiki_version=@mktime(0, 0, 0, $ver_date[2],$ver_date[3], $ver_date[1]); + if(!$this->dwiki_version) $this->dwiki_version = mktime(0,0,0,01,01,2008); + $this->ver_anteater = mktime(0,0,0,11,7,2010); + } + } + } + } + + + /** + * the format we produce + */ + function getFormat() + { + // this should be 'ckgedit' usally, but we inherit from the xhtml renderer + // and produce XHTML as well, so we can gain magically compatibility + // by saying we're the 'xhtml' renderer here. + return 'xhtml'; + } + + + + + /* + * The standard xhtml renderer adds anchors we do not need. + */ + function header($text, $level, $pos, $returnonly = false) { + // write the header + $this->doc .= DOKU_LF.''; + $this->doc .= $this->_xmlEntities($text); + $this->doc .= "".DOKU_LF; + } + + /* + * The FCKEditor prefers over + */ + function strong_open() + { + + $this->doc .= ''; + } + function strong_close() + { + $this->doc .= ''; + } + + /* + * The FCKEditor prefers over + */ + function deleted_open() + { + $this->doc .= ''; + } + function deleted_close() + { + $this->doc .= ''; + } + + /** + * isolate table from bottom and top editor window margins + * @author Myron Turner + */ + function table_close($pos = NULL) + { + global $conf; + $this->doc .= "\n \n"; + if($this->dwiki_version >= $this->ver_anteater) { + $this->doc .= "
    "; + } + } + + function table_open($maxcols = null, $numrows = null, $pos = null, $classes = NULL){ + $this->doc .= "\n \n"; + parent::table_open($maxcols, $numrows, $pos,$classes); + } + /* + * Dokuwiki displays __underlines__ as follows + * underlines + * in the fck editor this conflicts with + * the //italic// style that is displayed as + * italic + * which makes the rathe obvious + */ + function underline_open() + { + $this->doc .= ''; + } + function underline_close() + { + $this->doc .= ''; + } + + function listcontent_open() + { + } + + function listcontent_close() + { + } +} diff --git a/lib/plugins/ckgedit/script.js b/lib/plugins/ckgedit/script.js new file mode 100644 index 0000000..d6d3553 --- /dev/null +++ b/lib/plugins/ckgedit/script.js @@ -0,0 +1,507 @@ +/* + * HTML Parser By John Resig (ejohn.org) + * Original code by Erik Arvidsson, Mozilla Public License + * http://erik.eae.net/simplehtmlparser/simplehtmlparser.js + * @license GPL 3 or later (http://www.gnu.org/licenses/gpl.html) +*/ + +var HTMLParser; +var HTMLParserInstalled=true; +var HTMLParser_Elements = new Array(); +(function(){ + + // Regular Expressions for parsing tags and attributes + var startTag = /^<(\w+)((?:\s+[\w-]+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/, + endTag = /^<\/(\w+)[^>]*>/, + attr = /([\w-]+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g; + + // Empty Elements - HTML 4.01 + var empty = makeMap("br,col,hr,img"); + // HTMLParser_Elements['empty'] = empty; + + // Block Elements - HTML 4.01 + var block = makeMap("blockquote,center,del,div,dl,dt,hr,iframe,ins,li,ol,p,pre,table,tbody,td,tfoot,th,thead,tr,ul"); + // HTMLParser_Elements['block'] = block; + + // Inline Elements - HTML 4.01 + var inline = makeMap("a,abbr,acronym,b,big,br,cite,code,del,em,font,h1,h2,h3,h4,h5,h6,i,img,ins,kbd,q,s,samp,small,span,strike,strong,sub,sup,tt,u,var"); + + // Elements that you can, intentionally, leave open + // (and which close themselves) + var closeSelf = makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr"); + + // Attributes that have their values filled in disabled="disabled" + var fillAttrs = makeMap("checked,disabled,ismap,noresize,nowrap,readonly,selected"); + + // Special Elements (can contain anything) + var special = makeMap("script,style"); + + //define ('BROKEN_IMAGE', DOKU_URL . 'lib/plugins/ckgedit/fckeditor/userfiles/blink.jpg?nolink&33x34'); + var broken_image ='http://' + location.host + DOKU_BASE + '/lib/plugins/ckgedit/fckeditor/userfiles/blink.jpg?nolink&33x34'; + HTMLParser = this.HTMLParser = function( html, handler ) { + var index, chars, match, stack = [], last = html; + + html = html.replace(/()/gm, + function(match, p1, p2) { + var skip = false; + if(p1.match(/msword/) ) { + skip = true; + match = match.replace(/msword/,""); + } + if(p2.length > 2500000 && !skip ) { + jQuery('#dw__editform').append(''); + return '{{' + broken_image + '}}'; + } + return match; + }); + html = html.replace(/~~OPEN_HTML_BLOCK~~/gm , '~~START_HTML_BLOCK~~') ; + html = html.replace(/~~END_HTML_BLOCK~~/gm , '~~CLOSE_HTML_BLOCK~~') ; + + if(html.match(/~~START_HTML_BLOCK~~/gm) ){ //adopted [\s\S] from Goyvaerts, Reg. Exp. Cookbook (O'Reilly) + if(!JSINFO['htmlok']) { + html = html.replace(/~~START_HTML_BLOCK~~|~~CLOSE_HTML_BLOCK~~/gm,""); + } + + html = html.replace(/(

    )*\s*~~START_HTML_BLOCK~~\s*(<\/p>)*([\s\S]+)~~CLOSE_HTML_BLOCK~~\s*(<\/p>)*/gm, function(match,p,p1,text,p2) { + text = text.replace(/<\/?div.*?>/gm,""); + text = text.replace(//gm,""); + text = text.replace(/<\/code>/gm,""); + text = text.replace(/fckgL\d+\s*\<\/sup\>)\<\/a\>/gm, function(match,sup,a) { + return( '' +sup); + } + ); + /* remove html5 attributes */ + var pos = html.indexOf('data-'); + if(pos != -1) { + html = html.replace(/(<\w+)([^>]+)>/gm,function(match,tag,atts){ + atts = atts.replace(/data-[\w\-]+\s*=\s*(\"|\')\w+(\"|\')/,""); + //alert(atts); + return tag + atts+ '>'; + }); + } + stack.last = function(){ + return this[ this.length - 1 ]; + }; + + while ( html ) { + chars = true; + + // Make sure we're not in a script or style element + if ( !stack.last() || !special[ stack.last() ] ) { + + // Comment + if ( html.indexOf(""); + + if ( index >= 0 ) { + if ( handler.comment ) + handler.comment( html.substring( 4, index ) ); + html = html.substring( index + 3 ); + chars = false; + } + + // end tag + } else if ( html.indexOf("]*>"), function(all, text){ + text = text.replace(//g, "$1") + .replace(//g, "$1"); + + if ( handler.chars ) + handler.chars( text ); + + return ""; + }); + + parseEndTag( "", stack.last() ); + } + + if ( html == last ) + throw "Parse Error: " + html; + last = html; + } + + // Clean up any remaining tags + parseEndTag(); + + function parseStartTag( tag, tagName, rest, unary ) { + if ( block[ tagName ] ) { + while ( stack.last() && inline[ stack.last() ] ) { + parseEndTag( "", stack.last() ); + } + } + + if ( closeSelf[ tagName ] && stack.last() == tagName ) { + parseEndTag( "", tagName ); + } + + unary = empty[ tagName ] || !!unary; + + if ( !unary ) + stack.push( tagName ); + + if ( handler.start ) { + var attrs = []; + + rest.replace(attr, function(match, name) { + var value = arguments[2] ? arguments[2] : + arguments[3] ? arguments[3] : + arguments[4] ? arguments[4] : + fillAttrs[name] ? name : ""; + + attrs.push({ + name: name, + value: value, + escaped: value.replace(/(^|[^\\])"/g, '$1\\\"') //" + }); + }); + + if ( handler.start ) + handler.start( tagName, attrs, unary ); + } + } + + function parseEndTag( tag, tagName ) { + // If no tag name is provided, clean shop + if ( !tagName ) + var pos = 0; + + // Find the closest opened tag of the same type + else + for ( var pos = stack.length - 1; pos >= 0; pos-- ) + if ( stack[ pos ] == tagName ) + break; + + if ( pos >= 0 ) { + // Close all the open elements, up the stack + for ( var i = stack.length - 1; i >= pos; i-- ) + if ( handler.end ) + handler.end( stack[ i ] ); + + // Remove the open elements from the stack + stack.length = pos; + } + } + }; + + + function makeMap(str){ + var obj = {}, items = str.split(","); + for ( var i = 0; i < items.length; i++ ) + obj[ items[i] ] = true; + return obj; + } +})(); + + +function HTMLParser_test_result(results) { + +var test_str = ""; +for ( i=0; i < results.length; i++) { + var character = results.charAt(i); + if(results.charCodeAt(i) == 10) + character ='\\n'; + if(results.charCodeAt(i) == 32) + character ='SP'; + var entry = character + ' '; + + test_str += entry; + if(results.charCodeAt(i) == 10) { + test_str += "\n"; + } +} + +if(!confirm(test_str)) return false; +return true; + +} + +function hide_backup_msg() { + document.getElementById("backup_msg").style.display="none"; + return false; +} + +function show_backup_msg(msg) { + document.getElementById("backup_msg").style.display="block"; + document.getElementById("backup_msg_area").innerHTML = "Backed up to: " + msg; + + return false; +} + + // legacy functions + function remove_draft(){ + } + +function dwedit_draft_delete() { +} + // legacy functions end + + function setEdHeight(h) { + h = parseInt(h); + document.cookie = 'ckgEdht=' + h +';expires=0;path=' +JSINFO['doku_base'] + ';SameSite=Lax;'; + } + + /* enable disable image paste */ + function ckgd_setImgPaste(which) { + var state = JSINFO['ckgEdPaste'] ? JSINFO['ckgEdPaste'] : ""; + if(state == 'on') { + which = 'off' + } + else which = 'on'; + JSINFO['ckgEdPaste'] = which; + document.cookie = 'ckgEdPaste=' + which +';expires="Thu, 18 Dec 2575 12:00:00 UTC";path=' +JSINFO['doku_base']; + alert(LANG.plugins.ckgedit.ckg_paste_restart + ' ' + LANG.plugins.ckgedit[which]); + } + + function ckg_RawImgMsg() { + return LANG.plugins.ckgedit.broken_image_1 + "\n" + LANG.plugins.ckgedit.broken_image_2 ; + } + function GetE(e) { + return document.getElementById(e); + } +var dokuBase = location.host + DOKU_BASE; + + if(window.getSelection != undefined) { + var doku_ckg_getSelection = window.getSelection; + window.getSelection = function(ta) { + if(!ta) ta = GetE("wiki__text"); + return doku_ckg_getSelection(ta); + }; + } + + function ckgedit_seteditor_priority(m,client,dw_val_obj) { + var which = {'Y': 'Dokuwiki', 'N': 'CKEditor'}; + + if (typeof m === "undefined") { // Safari + if(dw_val_obj[0].checked) { + m= dw_val_obj[0].value; + } + else if(dw_val_obj[1].checked) { + m = dw_val_obj[1].value; + } + } + var params = "dw_val=" + m; params += '&call=cked_selector'; params += "&dwp_client=" + client; + jQuery.post( DOKU_BASE + 'lib/exe/ajax.php', params, + function (data) { + if(data == 'done') { + if(!m) + alert(LANG.plugins.ckgedit.dwp_not_sel); + else + alert(LANG.plugins.ckgedit.dwp_updated + which[m]); + } + else { + alert(LANG.plugins.ckgedit.dwp_save_err + data); + } + }, + 'html' + ); + } + + /* gets both size and filetime: "size||filetime" */ + function ckged_get_unlink_size(id) { + var params = 'call=cked_deletedsize'; params += "&cked_delid=" + id; + jQuery.post( DOKU_BASE + 'lib/exe/ajax.php', params, + function (data) { + if(data) { + JSINFO['ckg_del_sz'] = data; + //console.log(data); + } + else { + // alert(LANG.plugins.ckgedit.dwp_save_err + data); + } + }, + 'html' + ); + + } + + function ckged_setmedia(id,del, refresh_cb) { + + var params = 'call=cked_upload'; params += "&ckedupl_id=" + id; + if(del) params += "&ckedupl_del=D&delsize="+JSINFO['ckg_del_sz']; + jQuery.post( DOKU_BASE + 'lib/exe/ajax.php', params, + function (data) { + if(data) { + if(refresh_cb) { + refresh_cb.postMessage(JSINFO['doku_url'], JSINFO['doku_url']); + } + // console.log(data); + } + else { + // alert(LANG.plugins.ckgedit.dwp_save_err + data); + } + }, + 'html' + ); + } + +jQuery(function() { + if(JSINFO['hide_captcha_error'] =='hide') { + jQuery("div.error").hide(); + } + }); + + +jQuery(function() { + jQuery( "#editor_height" ).keydown(function(event) { + if ( event.which == 13 ) { + event.preventDefault(); + } + }); + + $dokuWiki = jQuery('.dokuwiki'); + jQuery('.editbutton_table button').click(function() { + var f = this.form; + jQuery('').attr('type','hidden').attr('name','mode').attr('value','dwiki').appendTo(jQuery(f)); + jQuery('').attr('type','hidden').attr('name','fck_preview_mode').attr('value','nil').appendTo(jQuery(f)); + }); + + if(typeof(JSINFO['dbl_click_auth'] !== 'undefined') && JSINFO['dbl_click_auth'] == "") return; + if(!JSINFO['ckg_dbl_click']) return; + + /** + * If one or more edit section buttons exist? + * This makes sure this feature is enabled only on the edit page and for users with page edit rights. + */ + if (jQuery('.editbutton_section', $dokuWiki).length > 0) { + + // register double click event for all headings and section divs + jQuery('[class^="sectionedit"], div[class^="level"]', $dokuWiki).dblclick(function(){ + // find the closest edit button form to the element double clicked (downwards) and submit the form + var f = jQuery(this).nextAll('.editbutton_section:eq(0)').children('form:eq(0)'); + //alert(jQuery(f).hasClass('button')); + jQuery('').attr('type','hidden').attr('name','mode').attr('value','dwiki').appendTo(jQuery(f)); + jQuery('').attr('type','hidden').attr('name','fck_preview_mode').attr('value','nil').appendTo(jQuery(f)); + f.submit(); + }) + } + + if(JSINFO['ckg_template'].match(/bootstrap/) && jQuery('div.editButtons').length>0) { + // var n=jQuery('div.editButtons input').length; + jQuery( "div.editButtons input").each(function( index ) { + if(jQuery(this).hasClass('btn-success')) { + jQuery(this).removeClass('btn-success') + } + if(jQuery(this).hasClass('btn-danger')) { + jQuery(this).removeClass('btn-danger'); + } + + }); + + } + +}); + +function ckg_edit_mediaman_insert(edid, id, opts, dw_align) { + var link, width, s, align; + + //parse option string + var options = opts.substring(1).split('&'); + + //get width and link options + link = 'detail'; + for (var i in options) { + var opt = options[i]; + if (typeof opt !== 'string') { + continue; + } + if (opt.match(/^\d+$/)) { + width = opt; + } else if (opt.match(/^\w+$/)) { + link = opt; + } + } + + //get alignment option + switch (dw_align) { + case '2': + align = 'medialeft'; + break; + case '3': + align = 'mediacenter'; + break; + case '4': + align = 'mediaright'; + break; + default: + align = ''; + break; + } + + var funcNum = CKEDITOR.instances.wiki__text._.filebrowserFn; + var fileUrl = DOKU_BASE + 'lib/exe/fetch.php?media=' + id; + CKEDITOR.tools.callFunction(funcNum, fileUrl, function() { + var dialog = this.getDialog(); + if ( dialog.getName() == "image" ) { + if (align != null) { + dialog.getContentElement("info", "cmbAlign").setValue(align); + } + if (link != null) { + dialog.getContentElement("info", "cmbLinkType").setValue(link); + } + if (width != null) { + dialog.getContentElement("info", "txtWidth").setValue(width); + dialog.dontResetSize = true; + } + } + }); +} + +function ckg_edit_mediaman_insertlink(edid, id, opts, dw_align) { + var funcNum = CKEDITOR.instances.wiki__text._.filebrowserFn; + CKEDITOR.tools.callFunction(funcNum, id, function() { + var dialog = this.getDialog(); + if (dialog.getName() == "link") { + dialog.getContentElement('info', 'media').setValue(id); + } + }); +} + +function getCookie(name) { + var re = new RegExp(name + "=([^;]+)"); + var value = re.exec(document.cookie); + return (value != null) ? decodeURIComponent(value[1]) : null; +} +function ckg_admininfo(t){ + if(t.innerHTML == LANG.plugins.ckgedit.stylesheet_cinfo) + t.innerHTML = LANG.plugins.ckgedit.stylesheet_oinfo; + else t.innerHTML = LANG.plugins.ckgedit.stylesheet_cinfo; +} + + /* DOKUWIKI:include_once locktimer.js */ + diff --git a/lib/plugins/ckgedit/scripts/add_v_animal.sh b/lib/plugins/ckgedit/scripts/add_v_animal.sh new file mode 100644 index 0000000..01c9a1e --- /dev/null +++ b/lib/plugins/ckgedit/scripts/add_v_animal.sh @@ -0,0 +1,54 @@ +#!/bin/bash +# This script is under public domain do with it whatever you want (yes, that includes eating it). +if [ $# -lt 1 ]; then + echo "Usage: $(basename $0) [animal domain or directory]" + exit 1 +fi + + +ANIMAL=${PWD}/${1} +ANIMAL_TITLE=$1 + +if [ -d $ANIMAL ]; then + echo "ERROR: $ANIMAL exists already!" + exit 1 +fi + +echo ">> adding animal $1" + +echo ">> creating directory structure ..." +mkdir -p ${ANIMAL}/{data/{attic,cache,index,locks,media,media_attic,media_meta,meta,pages,tmp},conf} +find ${ANIMAL}/ -type d -exec chmod 777 {} \; +touch ${ANIMAL}/conf/{local.php,local.protected.php,acl.auth.php,users.auth.php,plugins.local.php} +chmod 666 ${ANIMAL}/conf/{local.php,acl.auth.php,users.auth.php,plugins.local.php} + +echo ">> creating basic configuration ..." +echo " ${ANIMAL}/conf/local.php + +echo ">> setting fixed configuration ..." +echo " ${ANIMAL}/conf/local.protected.php + +echo ">> setting basic permissions ..." +echo "# +* @admin 255 +* @ALL 1" > ${ANIMAL}/conf/acl.auth.php + +echo ">> adding admin user ..." +echo '# +admin:$1$cce258b2$U9o5nK0z4MhTfB5QlKF23/:admin:admin@mail.org:admin,user' > ${ANIMAL}/conf/users.auth.php + +echo ">> IMPORTANT: Don't forget to change your admin username + password!" +echo ">> finished!" +echo ">> bye!" + +exit 0 + +# vim:ts=4:sw=4:noet:enc=utf-8: \ No newline at end of file diff --git a/lib/plugins/ckgedit/scripts/addanimal.sh b/lib/plugins/ckgedit/scripts/addanimal.sh new file mode 100644 index 0000000..8f42bc8 --- /dev/null +++ b/lib/plugins/ckgedit/scripts/addanimal.sh @@ -0,0 +1,61 @@ +#!/bin/bash +# This script is under public domain do with it whatever you want (yes, that includes eating it). +if [ $# -lt 1 ]; then + echo "Usage: $(basename $0) [animal domain or directory]" + exit 1 +fi + +# set_basedir +# Author: Myron Turner +set_basedir() { +BARN=`pwd | awk -F/ '{ print $NF }'` +echo "'/"$BARN"/$1/'" +} + +ANIMAL=${PWD}/${1} +ANIMAL_TITLE=$1 + +if [ -d $ANIMAL ]; then + echo "ERROR: $ANIMAL exists already!" + exit 1 +fi + +echo ">> adding animal $1" + +echo ">> creating directory structure ..." +mkdir -p ${ANIMAL}/{data/{attic,cache,index,locks,media,media_attic,media_meta,meta,pages,tmp},conf} +find ${ANIMAL}/ -type d -exec chmod 777 {} \; +touch ${ANIMAL}/conf/{local.php,local.protected.php,acl.auth.php,users.auth.php,plugins.local.php} +chmod 666 ${ANIMAL}/conf/{local.php,acl.auth.php,users.auth.php,plugins.local.php} + +echo ">> creating basic configuration ..." +echo " ${ANIMAL}/conf/local.php + +echo ">> setting fixed configuration ..." +echo " ${ANIMAL}/conf/local.protected.php + +echo ">> setting basic permissions ..." +echo "# +* @admin 255 +* @ALL 1" > ${ANIMAL}/conf/acl.auth.php + +echo ">> adding admin user ..." +echo '# +admin:$1$cce258b2$U9o5nK0z4MhTfB5QlKF23/:admin:admin@mail.org:admin,user' > ${ANIMAL}/conf/users.auth.php + +echo ">> IMPORTANT: Don't forget to change your admin username + password!" +echo ">> finished!" +echo ">> bye!" + +exit 0 + +# vim:ts=4:sw=4:noet:enc=utf-8: \ No newline at end of file diff --git a/lib/plugins/ckgedit/scripts/css6.php b/lib/plugins/ckgedit/scripts/css6.php new file mode 100644 index 0000000..0da730b --- /dev/null +++ b/lib/plugins/ckgedit/scripts/css6.php @@ -0,0 +1,524 @@ + + */ + +if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../../../../').'/'); +require_once(DOKU_INC.'inc/init.php'); + +// ---------------------- functions ------------------------------ + +/** + * Output all needed Styles + * + * @author Andreas Gohr + */ +function css_ckg_out($path, $tpl = "") +{ + global $conf; + global $lang; + global $config_cascade; + global $INPUT; + $copy = $INPUT->str('ckg_save_ss',FALSE); + chdir($path); + + $mediatypes = array('screen', 'all'); + $type = ''; + + if(!$tpl) { + $tpl = $conf['template']; + + if($copy) { + $copy_path = DOKU_PLUGIN . 'ckgedit/ckeditor/css/_style.css'; + msg($copy_path,1); + } + } + + // load styl.ini + $styleini = css_ckg_styleini($tpl); + + // if old 'default' userstyle setting exists, make it 'screen' userstyle for backwards compatibility + if (isset($config_cascade['userstyle']['default'])) { + $config_cascade['userstyle']['screen'] = $config_cascade['userstyle']['default']; + } + + // Array of needed files and their web locations, the latter ones + // are needed to fix relative paths in the stylesheets + $files = array(); + foreach($mediatypes as $mediatype) { + $files[$mediatype] = array(); + // load core styles + $files[$mediatype][DOKU_INC.'lib/styles/'.$mediatype.'.css'] = DOKU_BASE.'lib/styles/'; + + // load template styles + if (isset($styleini['stylesheets'][$mediatype])) { + $files[$mediatype] = array_merge($files[$mediatype], $styleini['stylesheets'][$mediatype]); + } + // load user styles + if(!empty($config_cascade['userstyle'][$mediatype])) { + foreach($config_cascade['userstyle'][$mediatype] as $userstyle) { + $files[$mediatype][$userstyle] = DOKU_BASE; + } + } + } + + $css=""; + + // build the stylesheet + foreach ($mediatypes as $mediatype) { + + // print the default classes for interwiki links and file downloads + if ($mediatype == 'screen') { + $css .= '@media screen {'; + css_ckg_interwiki($css); + css_ckg_filetypes($css); + $css .= '}'; + } + + $xcl = 'plugins|popup|fileuploader|toc|search|recent|diff|edit|form|admin|manager|media|modal'; + + // load files + $css_ckg_content = ''; + foreach($files[$mediatype] as $file => $location) { + if(preg_match('#' .$xcl . '#',$file) ) { + continue; + } + $display = str_replace(fullpath(DOKU_INC), '', fullpath($file)); + $css_ckg_content .= "\n/* XXXXXXXXX $display XXXXXXXXX */\n"; + $css_ckg_content .= css_ckg_loadfile($file, $location); + } + switch ($mediatype) { + case 'screen': + $css .= NL.'@media screen { /* START screen styles */'.NL.$css_ckg_content.NL.'} /* /@media END screen styles */'.NL; + break; + case 'all': + default: + $css .= NL.'/* START rest styles */ '.NL.$css_ckg_content.NL.'/* END rest styles */'.NL; + break; + } + } + + // apply style replacements + $css = css_ckg_applystyle($css, $styleini['replacements']); + // parse less + $css = css_ckg_parseless($css); + + // embed small images right into the stylesheet + if($conf['cssdatauri']){ + $base = preg_quote(DOKU_BASE,'#'); + $css = preg_replace_callback('#(url\([ \'"]*)('.$base.')(.*?(?:\.(png|gif)))#i','css_ckg_datauri',$css); + } + + $css = preg_replace("/(\#?|\.?|div\.)dokuwiki\.?/", '', $css); + + $css = "@import 'additional.css';\n/* template: $tpl */\n@media screen {\n.$tpl{color:#ccc;}\n}\n" . $css; + $css .= ' + span.multi_p_open { + display: block; + } + body,html { + background-color: #fff; + background-image:none; + } + blockquote { + padding-left: .5em; + margin-left: 1.5em; + } +' . "\n"; + + if( io_saveFile($path . 'Styles/_style.css' ,$css)) { + if(isset($copy_path)) { ; + $retv = io_saveFile($copy_path,$css); + if(!$retv) msg("failed: " . $copy_path); + } + return 0; + } + else { + return 1; + } +} + +/** + * Uses phpless to parse LESS in our CSS + * + * most of this function is error handling to show a nice useful error when + * LESS compilation fails + * + * @param $css + * @return string + */ +function css_ckg_parseless($css) { + $less = new lessc(); + $less->importDir[] = DOKU_INC; + + try { + return $less->compile($css); + } catch(Exception $e) { + // get exception message + $msg = str_replace(array("\n", "\r", "'"), array(), $e->getMessage()); + + // try to use line number to find affected file + if(preg_match('/line: (\d+)$/', $msg, $m)){ + $msg = substr($msg, 0, -1* strlen($m[0])); //remove useless linenumber + $lno = $m[1]; + + // walk upwards to last include + $lines = explode("\n", $css); + for($i=$lno-1; $i>=0; $i--){ + if(preg_match('/\/(\* XXXXXXXXX )(.*?)( XXXXXXXXX \*)\//', $lines[$i], $m)){ + // we found it, add info to message + $msg .= ' in '.$m[2].' at line '.($lno-$i); + break; + } + } + } + + // something went wrong + $error = 'A fatal error occured during compilation of the CSS files. '. + 'If you recently installed a new plugin or template it '. + 'might be broken and you should try disabling it again. ['.$msg.']'; + + msg($error); + + exit; + } +} + +/** + * Does placeholder replacements in the style according to + * the ones defined in a templates style.ini file + * + * This also adds the ini defined placeholders as less variables + * (sans the surrounding __ and with a ini_ prefix) + * + * @author Andreas Gohr + */ +function css_ckg_applystyle($css, $replacements) { + // we convert ini replacements to LESS variable names + // and build a list of variable: value; pairs + $less = ''; + foreach((array) $replacements as $key => $value) { + $lkey = trim($key, '_'); + $lkey = '@ini_'.$lkey; + $less .= "$lkey: $value;\n"; + + $replacements[$key] = $lkey; + } + + // we now replace all old ini replacements with LESS variables + $css = strtr($css, $replacements); + + // now prepend the list of LESS variables as the very first thing + $css = $less.$css; + return $css; +} + +/** + * Load style ini contents + * + * Loads and merges style.ini files from template and config and prepares + * the stylesheet modes + * + * @author Andreas Gohr + * @param string $tpl the used template + * @return array with keys 'stylesheets' and 'replacements' + */ +function css_ckg_styleini($tpl) { + $stylesheets = array(); // mode, file => base + $replacements = array(); // placeholder => value + + // 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){ + $stylesheets[$mode][$incbase.$file] = $webbase; + } + + // replacements + if(is_array($data['replacements'])){ + $replacements = array_merge($replacements, css_ckg_fixreplacementurls($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, css_ckg_fixreplacementurls($data['replacements'],$webbase)); + } + } + + return array( + 'stylesheets' => $stylesheets, + 'replacements' => $replacements + ); +} + +/** + * Amend paths used in replacement relative urls, refer FS#2879 + * + * @author Chris Smith + */ +function css_ckg_fixreplacementurls($replacements, $location) { + foreach($replacements as $key => $value) { + $replacements[$key] = preg_replace('#(url\([ \'"]*)(?!/|data:|http://|https://| |\'|")#','\\1'.$location,$value); + } + return $replacements; +} + +/** + * Prints classes for interwikilinks + * + * Interwiki links have two classes: 'interwiki' and 'iw_$name>' where + * $name is the identifier given in the config. All Interwiki links get + * an default style with a default icon. If a special icon is available + * for an interwiki URL it is set in it's own class. Both classes can be + * overwritten in the template or userstyles. + * + * @author Andreas Gohr + */ +function css_ckg_interwiki(&$css){ + + // default style + $css .= 'a.interwiki {'; + $css .= ' background: transparent url('.DOKU_BASE.'lib/images/interwiki.png) 0px 1px no-repeat;'; + $css .= ' padding: 1px 0px 1px 16px;'; + $css .= '}'; + + // additional styles when icon available + $iwlinks = getInterwiki(); + foreach(array_keys($iwlinks) as $iw){ + $class = preg_replace('/[^_\-a-z0-9]+/i','_',$iw); + if(@file_exists(DOKU_INC.'lib/images/interwiki/'.$iw.'.png')){ + $css .= "a.iw_$class {"; + $css .= ' background-image: url('.DOKU_BASE.'lib/images/interwiki/'.$iw.'.png)'; + $css .= '}'; + }elseif(@file_exists(DOKU_INC.'lib/images/interwiki/'.$iw.'.gif')){ + $css .= "a.iw_$class {"; + $css .= ' background-image: url('.DOKU_BASE.'lib/images/interwiki/'.$iw.'.gif)'; + $css .= '}'; + } + } +} + +/** + * Prints classes for file download links + * + * @author Andreas Gohr + */ +function css_ckg_filetypes(&$css){ + + // default style + $css .= '.mediafile {'; + $css .= ' background: transparent url('.DOKU_BASE.'lib/images/fileicons/file.png) 0px 1px no-repeat;'; + $css .= ' padding-left: 18px;'; + $css .= ' padding-bottom: 1px;'; + $css .= '}'; + + // additional styles when icon available + // scan directory for all icons + $exts = array(); + if($dh = opendir(DOKU_INC.'lib/images/fileicons')){ + while(false !== ($file = readdir($dh))){ + if(preg_match('/([_\-a-z0-9]+(?:\.[_\-a-z0-9]+)*?)\.(png|gif)/i',$file,$match)){ + $ext = strtolower($match[1]); + $type = '.'.strtolower($match[2]); + if($ext!='file' && (!isset($exts[$ext]) || $type=='.png')){ + $exts[$ext] = $type; + } + } + } + closedir($dh); + } + foreach($exts as $ext=>$type){ + $class = preg_replace('/[^_\-a-z0-9]+/','_',$ext); + $css .= ".mf_$class {"; + $css .= ' background-image: url('.DOKU_BASE.'lib/images/fileicons/'.$ext.$type.')'; + $css .= '}'; + } +} + +/** + * Loads a given file and fixes relative URLs with the + * given location prefix + */ +function css_ckg_loadfile($file,$location=''){ + $css_ckg_file = new DokuCssFile($file); + return $css_ckg_file->load($location); +} + +/** + * Helper class to abstract loading of css/less files + * + * @author Chris Smith + */ +class DokuCssFile { + + protected $filepath; // file system path to the CSS/Less file + protected $location; // base url location of the CSS/Less file + private $relative_path = null; + + public function __construct($file) { + $this->filepath = $file; + } + + /** + * Load the contents of the css/less file and adjust any relative paths/urls (relative to this file) to be + * relative to the dokuwiki root: the web root (DOKU_BASE) for most files; the file system root (DOKU_INC) + * for less files. + * + * @param string $location base url for this file + * @return string the CSS/Less contents of the file + */ + public function load($location='') { + if (!file_exists($this->filepath)) return ''; + + $css = io_readFile($this->filepath); + if (!$location) return $css; + + $this->location = $location; + + $css = preg_replace_callback('#(url\( *)([\'"]?)(.*?)(\2)( *\))#',array($this,'replacements'),$css); + $css = preg_replace_callback('#(@import\s+)([\'"])(.*?)(\2)#',array($this,'replacements'),$css); + + return $css; + } + + /** + * Get the relative file system path of this file, relative to dokuwiki's root folder, DOKU_INC + * + * @return string relative file system path + */ + private function getRelativePath(){ + + if (is_null($this->relative_path)) { + $basedir = array(DOKU_INC); + + $basedir = array_map('preg_quote_cb', $basedir); + $regex = '/^('.join('|',$basedir).')/'; + $this->relative_path = preg_replace($regex, '', dirname($this->filepath)); + } + + return $this->relative_path; + } + + /** + * preg_replace callback to adjust relative urls from relative to this file to relative + * to the appropriate dokuwiki root location as described in the code + * + * @param array see http://php.net/preg_replace_callback + * @return string see http://php.net/preg_replace_callback + */ + public function replacements($match) { + + // not a relative url? - no adjustment required + if (preg_match('#^(/|data:|https?://)#',$match[3])) { + return $match[0]; + } + // a less file import? - requires a file system location + else if (substr($match[3],-5) == '.less') { + if ($match[3][0] != '/') { + $match[3] = $this->getRelativePath() . '/' . $match[3]; + } + } + // everything else requires a url adjustment + else { + $match[3] = $this->location . $match[3]; + } + + return join('',array_slice($match,1)); + } +} + +/** + * Convert local image URLs to data URLs if the filesize is small + * + * Callback for preg_replace_callback + */ +function css_ckg_datauri($match){ + global $conf; + + $pre = unslash($match[1]); + $base = unslash($match[2]); + $url = unslash($match[3]); + $ext = unslash($match[4]); + + $local = DOKU_INC.$url; + $size = @filesize($local); + if($size && $size < $conf['cssdatauri']){ + $data = base64_encode(file_get_contents($local)); + } + if($data){ + $url = 'data:image/'.$ext.';base64,'.$data; + }else{ + $url = $base.$url; + } + return $pre.$url; +} + + + +/** + * Very simple CSS optimizer + * + * @author Andreas Gohr + */ +function css_ckg_compress($css){ + //strip comments through a callback + $css = preg_replace_callback('#(/\*)(.*?)(\*/)#s','css_ckg_comment_cb',$css); + + //strip (incorrect but common) one line comments + $css = preg_replace('/(? 1em) + $css = preg_replace('/(? + */ +function css_ckg_comment_cb($matches){ + if(strlen($matches[2]) > 4) return ''; + return $matches[0]; +} + diff --git a/lib/plugins/ckgedit/scripts/draft_delete.php b/lib/plugins/ckgedit/scripts/draft_delete.php new file mode 100644 index 0000000..406a480 --- /dev/null +++ b/lib/plugins/ckgedit/scripts/draft_delete.php @@ -0,0 +1,24 @@ +str('draft_id'); +$cname = urldecode($cname); +if(!preg_match("#/data/cache/\w/[a-f0-9]{32}\.draft$#i", $cname)) return; +$ckgedit_cname = $cname . '.fckl'; + + +if(file_exists($cname)) { + io_lock($cname); + if(file_exists($ckgedit_cname)) { + unlink($ckgedit_cname); + } + unlink($cname); + + exit; +} + +echo "done"; + diff --git a/lib/plugins/ckgedit/scripts/mediamgr.js b/lib/plugins/ckgedit/scripts/mediamgr.js new file mode 100644 index 0000000..7fd5fc8 --- /dev/null +++ b/lib/plugins/ckgedit/scripts/mediamgr.js @@ -0,0 +1,54 @@ + + if (opener != null && opener.CKEDITOR !== undefined) { + window.onload = function () { + var _action = '?ns=&edid=wiki__text&onselect=ckg_edit_mediaman_insert&ckg_media=img&CKEditor=wiki__text&CKEditorFuncNum=1&langCode=en'; + + if ((location.search.split("ckg_media=")[1]||"").split("&")[0] == "link") { + _action = '?ns=&edid=wiki__text&onselect=ckg_edit_mediaman_insertlink&ckg_media=link&CKEditor=wiki__text&CKEditorFuncNum=1&langCode=en'; + jQuery(".select").on("click", function(event) { + var $link, id; + event.preventDefault(); + $link = jQuery(this); + id = $link.attr("id").substr(2); + dw_mediamanager.insert(id); + return; + }); + } else if ((location.search.split("ckg_media=")[1]||"").split("&")[0] == "img") { + jQuery("#media__linkbtn4").css("display", "none"); + ckg_nonimage_overlay(); + } + + /* update search form action */ + var valu = jQuery("#dw__mediasearch input[type='text").val(); + if(valu == ""){ + var url = jQuery("form#dw__mediasearch").attr('action'); + jQuery("form#dw__mediasearch").attr('action', url+_action); + }; + + jQuery(document).ajaxComplete(function() { + ckg_nonimage_overlay(); + + jQuery("form[action]").each(function(index, val){ + var url = jQuery(this).attr('action'); + url = url + _action; + jQuery(this).attr('action',url); + }); + }); + }; + + if(!opener.oDokuWiki_FCKEditorInstanceInLinkDialog) { + jQuery( ".odd, .even" ).each( function( index, element ){ + if(!this.title.match(/\.(jpg|jpeg|png|tiff?|gif)$/)){ + jQuery( this ).html(LANG.plugins.ckgedit.mediamgr_notice+": " + this.title +""); + } + }); + } + + } + + function ckg_nonimage_overlay() { + if ((location.search.split("ckg_media=")[1]||"").split("&")[0] !== "img") { + return; + } + } + diff --git a/lib/plugins/ckgedit/scripts/parse_wiki-cmpr.js b/lib/plugins/ckgedit/scripts/parse_wiki-cmpr.js new file mode 100644 index 0000000..c4cec04 --- /dev/null +++ b/lib/plugins/ckgedit/scripts/parse_wiki-cmpr.js @@ -0,0 +1 @@ +function parse_wikitext(C){if(ckgedit_dwedit_reject){var f=GetE("ebut_cancel");f.click();return true}var A=getComplexTables();function F(){var i=/\>\s+(\*\*|__|\/\/|'')\s+_\s+\1\s+<\/font>/gm;r=r.replace(i,function(v){v=v.replace(/\s+/g,"");return v});i=new RegExp("\\>(.*?)(\\]\\]\\<\\/font\\>)|(\\<\\/font\\>\\]\\])","gm");if(r.match(i)){return true}i=new RegExp("(\\{\\{(.*?)\\.\\w{2,4})\\|\\\\{\\{(.*?)\\.\\w+\\<\\/font\\>\\b","gm");if(r.match(i)){return true}return false}function n(W,X,v){var U=new Array();for(var T=X;T0){var V=W[T][S].text;U.push({row:T,column:S,spans:W[T][S].rowspan,text:V});if(!v){break}}}}return U}function E(V,v,T,U,i){var S=U[V][v].colspan?U[V][v].colspan:0;U[V][v].rowspan=0;for(N=0;N",del:"",s:"",p:"\n\n",a:"[[",img:"{{",strong:"**",h1:"\n====== ",h2:"\n===== ",h3:"\n==== ",h4:"\n=== ",h5:"\n== ",td:"|",th:"^",tr:" ",table:"\n\n",ol:" - ",ul:" * ",li:"",code:"''",pre:"\n<",hr:"\n\n----\n\n",sub:"",font:"",blockquote:"

    ",sup:"",div:"\n\n",span:"\n",dl:"\n",dd:"\n",dt:"\n"};var o={del:"",s:"",strike:"",p:" ",br:" ",a:"]]",img:"}}",h1:" ======\n",h2:" =====\n",h3:" ====\n",h4:" ===\n",h5:" ==\n",td:" ",th:" ",tr:"|\n",ol:" ",ul:" ",li:"\n",pre:"\n",sup:" ",div:"\n\n",p:"\n\n",font:"",span:" ",blockquote:"
    "};H.temp_u="CKGE_TMP_u";H.temp_strong="CKGE_TMP_strong";H.temp_em="CKGE_TMP_em";H.temp_i="CKGE_TMP_i";H.temp_b="CKGE_TMP_b";H.temp_del="CKGE_TMP_del";H.temp_strike="CKGE_TMP_strike";H.temp_code="CKGE_TMP_code";H.temp_sup="CKGE_TMP_sup";H.temp_csup="CKGE_TMP_csup";H.temp_sub="CKGE_TMP_sub";H.temp_csub="CKGE_TMP_csub";H.temp_del="CKGE_TMP_del";H.temp_cdel="CKGE_TMP_cdel";H.temp_strike="CKGE_TMP_del";H.temp_cstrike="CKGE_TMP_cdel";H.temp_s="CKGE_TMP_del";H.temp_cs="CKGE_TMP_cdel";var l={CKGE_TMP_b:"**",CKGE_TMP_strong:"**",CKGE_TMP_em:"//",CKGE_TMP_u:"__",CKGE_TMP_sup:"",CKGE_TMP_sub:"",CKGE_TMP_cdel:"",CKGE_TMP_csub:"",CKGE_TMP_csup:"",CKGE_TMP_del:"",CKGE_TMP_strike:"",CKGE_TMP_code:"''"};H.blank="";H.fn_start="((";H.fn_end="))";H.row_span=":::";H.p_insert="_PARA__TABLE_INS_";H.format_space="_FORMAT_SPACE_";H.pre_td="<";var t={strong:true,b:true,i:true,em:true,u:true,del:true,strike:true,code:true,sup:true,sub:true,s:true};var r="";var R=false;var s=false;var b=false;var M=false;var h=false;var K=false;var O=false;var L=false;var g=false;var J=false;var q=false;var Q=false;HTMLLinkInList=false;var P=false;var B;var c=new Array();var y=new Array();var e=false;var d=H.p_insert;var I="(br|co|coMULTI|es|kw|me|nu|re|st|sy)[0-9]";String.prototype.splice=function(i,S,v){return(this.slice(0,i)+v+this.slice(i+Math.abs(S)))};String.frasl=new RegExp("⁄|⁄|⁄|⁄","g");I=new RegExp(I);HTMLParser(CKEDITOR.instances.wiki__text.getData(),{attribute:"",link_title:"",link_class:"",image_link_type:"",td_align:"",in_td:false,td_colspan:0,td_rowspan:0,rowspan_col:0,last_column:-1,row:0,col:0,td_no:0,tr_no:0,current_row:false,in_table:false,in_multi_plugin:false,is_rowspan:false,list_level:0,prev_list_level:-1,list_started:false,xcl_markup:false,in_link:false,link_formats:new Array(),last_tag:"",code_type:false,in_endnotes:false,is_smiley:false,geshi:false,downloadable_code:false,export_code:false,code_snippet:false,downloadable_file:"",external_mime:false,in_header:false,curid:false,format_in_list:false,prev_li:new Array(),link_only:false,in_font:false,using_fonts:false,interwiki:false,bottom_url:false,font_family:"inherit",font_size:"inherit",font_weight:"inherit",font_color:"inherit",font_bgcolor:"inherit",font_style:"inherit",is_mediafile:false,end_nested:false,mfile:false,backup:function(T,S){var V=r.lastIndexOf(T);var v=r.indexOf(S,V);if(V==-1||v==-1){return}if(T.length+v==v){var U=r.substring(0,V);var i=r.substring(v);r=U+i;return true}return false},is_iwiki:function(S,U){var T=S.match(/iw_(\w+\.?\w{0,12})/);var i=U.split(/\/\//);var v=i[i.length-1];if(!v.match(/oIWIKIo.*?cIWIKIc/)){v="oIWIKIo"+v+"cIWIKIc"}v=v.replace(/^.*?oIWIKIo/,"oIWIKIo");v=v.replace(/cIWIKIc.*/,"cIWIKIc");T[1]=T[1].replace(/_(\w{2})/g,".$1");this.attr=T[1]+">"+decodeURIComponent(v);q=true;this.interwiki=true},start:function(aw,aa,ak){if(H[aw]){if(t[aw]&&this.in_link){this.link_formats.push(aw);return}if(t[aw]&&(this.in_font||this.in_header)){r+=" ";var ar="temp_"+aw;r+=H[ar];r+=" ";return}else{if(aw=="acronym"){return}}if(t[aw]&&this.in_endnotes){if(aw=="sup"){return}}if(aw=="ol"||aw=="ul"){if(this.in_table){o.li="\\\\";this.list_level=0;jQuery("#dw__editform").append('')}else{o.li="\n"}this.prev_list_level=this.list_level;this.list_level++;if(this.list_level==1){this.list_started=false}if(this.list_started){this.prev_li.push(H.li)}H.li=H[aw];return}else{if(!this.list_level){H.li="";this.prev_li=new Array()}}this.is_mediafile=false;if(aw=="img"){var av="?";var v;var T;var ax=false;var ai="";var ad="";var aj=false;this.is_smiley=false;this.in_link=false}if(aw=="a"){var ah=true;var aD="";this.xcl_markup=false;this.in_link=true;this.link_pos=r.length;this.link_formats=new Array();this.footnote=false;var ab=false;this.id="";this.external_mime=false;var aC=false;this.export_code=false;this.code_snippet=false;this.downloadable_file="";var ag=false;this.link_only=false;save_url="";this.interwiki=false;this.bottom_url=false;this.link_title=false;var ap="";var ae=""}if(aw=="p"){this.in_link=false;if(this.in_table){aw="p_insert";M=true}}if(aw=="table"){this.td_no=0;this.tr_no=0;this.in_table=true;this.is_rowspan=false;this.row=-1;this.rows=new Array();B=this.rows;this.table_start=r.length}else{if(aw=="tr"){this.tr_no++;this.td_no=0;this.col=-1;this.row++;this.rows[this.row]=new Array();this.current_row=this.rows[this.row]}else{if(aw=="td"||aw=="th"){this.td_no++;this.col++;this.current_row[this.col]={type:aw,rowspan:0,colspan:0,text:""};this.cell_start=r.length;this.current_cell=this.current_row[this.col];if(this.td_rowspan&&this.rowspan_col==this.td_no&&this.td_no!=this.last_column){this.is_rowspan=true;this.td_rowspan--}else{this.is_rowspan=false}}}}var S;this.attr=false;this.format_tag=false;if(t[aw]){this.format_tag=true}var ac=false;for(var aA=0;aA1){this.attr=aa[aA].value;this.code_type=Y[0]}else{this.attr=aa[aA].escaped;this.code_type=this.attr}if(this.downloadable_code){this.attr=this.attr.replace(/\s*code\s*/,"");this.code_type="file"}s=true;if(this.in_table){aw="pre_td"}break}}else{if(aw=="img"){if(aa[aA].name=="alt"){ad=aa[aA].value}if(aa[aA].name=="type"){this.image_link_type=aa[aA].value}if(aa[aA].name=="src"){var al="";if(S=aa[aA].escaped.match(/fetch\.php.*?(media=.*)/)){var Y=S[1].split("=");al=Y[1];if(S=aa[aA].escaped.match(/(media.*)/)){var Y=S[1].split("=");var W=Y[1];al=decodeURIComponent?decodeURIComponent(W):unescape(W)}if(!al.match(/https?:/)&&!al.match(/^:/)){al=":"+al}}else{if(aa[aA].escaped.match(/https?:\/\//)){al=aa[aA].escaped;al=al.replace(/\?.*?$/,"")}else{if(S=aa[aA].escaped.match(/\/_media\/(.*)/)){var Y=S[1].split(/\?/);al=Y[0];al=al.replace(/\//g,":");if(!al.match(/^:/)){al=":"+al}}else{if(S=aa[aA].escaped.match(/\/lib\/exe\/fetch.php\/(.*)/)){var Y=S[1].split(/\?/);al=Y[0];if(!al.match(/^:/)){al=":"+al}}else{S=aa[aA].escaped.match(/^.*?\/userfiles\/image\/(.*)/);if(!S&&typeof config_animal!=="undefined"){var V=new RegExp(config_animal+"/image/(.*)$");S=aa[aA].escaped.match(V)}if(!S){var V=doku_base+"data/media/";V=V.replace(/([\/\\])/g,"\\$1");V="^.*?"+V+"(.*)";V=new RegExp(V);S=aa[aA].escaped.match(V)}if(S&&S[1]){al=S[1].replace(/\//g,":");al=":"+al}else{al=decodeURIComponent?decodeURIComponent(aa[aA].escaped):unescape(aa[aA].escaped);if(al.search(/data:image.*?;base64/)>-1){aj=true}}}}}}if(al&&al.match(/lib\/images\/smileys/)){this.is_smiley=true}this.attr=al;if(this.attr&&this.attr.match&&this.attr.match(/%[a-fA-F0-9]{2}/)){this.attr=decodeURIComponent(safe_convert(this.attr));this.attr=decodeURIComponent(safe_convert(this.attr))}}else{if(aa[aA].name=="width"&&!ax){v=aa[aA].value}else{if(aa[aA].name=="height"&&!ax){T=aa[aA].value}else{if(aa[aA].name=="style"){var X=aa[aA].escaped.match(/width:\s*(\d+)/);if(X){v=X[1];var X=aa[aA].escaped.match(/height:\s*(\d+)/);if(X){T=X[1]}}}else{if(aa[aA].name=="align"||aa[aA].name=="class"){if(aa[aA].escaped.match(/(center|middle)/)){ai="center"}else{if(aa[aA].escaped.match(/right/)){ai="right"}else{if(aa[aA].escaped.match(/left/)){ai="left"}else{ai=""}}}}}}}}}}}if(this.is_smiley){if(ad){r+=ad+" ";ad=""}this.is_smiley=false;return}if(this.link_only){aw="img"}if(aw=="br"){if(this.in_multi_plugin){r+="\n";return}if(!this.code_type){R=true}else{if(this.code_type){r+="\n";return}}if(this.in_table){r+=d;return}if(this.list_started){r+="_LIST_EOFL_"}else{r+="\\\\ ";return}}else{if(aw.match(/^h(\d+|r)/)){var af=r.length;if(aw.match(/h(\d+)/)){this.in_header=true}if(af){if(r.charCodeAt(af-1)==32){r=r.replace(/\x20+$/,"")}}}else{if(this.last_col_pipes){if(t[aw]){r+=H[aw]}aw="blank"}else{if(ac){r+=ac;return}}}}if(aw=="b"||aw=="i"&&this.list_level){if(r.match(/(\/\/|\*)(\x20)+/)){r=r.replace(/(\/\/|\*)(\x20+)\-/,"$1\n$2-")}}if(this.in_table&&aw=="li"){}if(aw=="li"&&this.list_level){if(this.list_level==1&!this.list_started){r+="\n";this.list_started=true}r=r.replace(/[\x20]+$/,"");for(var at=0;at1){r+=" "}}if(this.prev_list_level>0&&H.li==H.ol){this.prev_list_level=-1}}if(aw=="a"&&this.list_level){HTMLLinkInList=true}if(aw=="a"&&ah){this.xcl_markup=true;return}else{if(aw=="a"&&(this.export_code||this.code_snippet)){return}else{if(aw=="a"&&this.footnote){aw="fn_start"}else{if(aw=="a"&&ab){c.push(this.id)}else{if(aw=="a"&&this.external_mime){if(this.in_endnotes){this.link_class="media";return}if(aC&&aC=="mediafile"){r+=H.img;r+=this.attr+"|";this.is_mediafile=true}return}else{if(this.in_font){if(aw=="a"){r=r.replace(/__STYLE__/,"[["+this.attr+"|");this.in_font=false}return}}}}}}if(this.in_endnotes&&aw=="a"){return}if(this.code_type&&aw=="span"){aw="blank"}if(this.mfile&&!this.attr){this.attr=this.mfile}r+=H[aw];if(aw=="td"||aw=="th"||(this.last_col_pipes&&this.td_align=="center")){if(this.is_rowspan){r+=H.row_span+" | ";this.is_rowspan=false}if(this.td_align=="center"||this.td_align=="right"){r+=" "}}else{if(aw=="a"&&this.attr){this.attr=this.attr.replace(/%7c/,"%257c");r+=this.attr+"|"}else{if(aw=="img"){var aq=this.image_link_type;this.image_link_type="";if(this.link_only){aq="link_only"}if(!aq||aj){aq="nolink"}else{if(aq=="detail"){aq=""}}if(aq=="link_only"){av="?linkonly"}else{if(aq){av+=aq+"&"}}if(v&&T){av+=v+"x"+T}else{if(v){av+=v}else{if(!aq){av=""}}}if(ai&&ai!="left"){r+=" "}this.attr+=av;if(ai=="center"||ai=="left"){this.attr+=" "}if(ad){r+=this.attr+"|"+ad+"}}"}else{r+=this.attr+"}}"}this.attr="src"}else{if(aw=="pre"||aw=="pre_td"){if(this.downloadable_file){this.attr+=" "+this.downloadable_file}if(!this.attr){this.attr="code"}r+=this.attr+">";this.downloadable_file="";this.downloadable_code=false}}}}}},end:function(ah){if(t[ah]&&(this.in_font||this.in_header)){r+=" ";if(ah=="sup"||ah=="sub"||ah=="del"||ah=="strike"||ah=="s"){var ag="temp_c"+ah}else{var ag="temp_"+ah}r+=H[ag];r+=" ";return}if(this.in_endnotes&&ah=="a"){return}if(this.in_link&&t[ad]&&this.link_formats.length){return}else{if(ah=="a"&&!this.link_formats.length){this.in_link=false}}if(this.link_only){this.link_only=false;return}if(!H[ah]){return}if(ah=="sup"&&this.attr=="dwfcknote"){return}if(this.is_smiley){this.is_smiley=false;if(ah!="li"){return}}if(ah=="span"&&this.in_font&&!ckgedit_xcl_styles){ah="font";var ab="";var ae=ab.match(/(inherit)/g);if(ae&&ae.length<3){P=true}var X=r.lastIndexOf("__STYLE__");r=r.splice(X,9,ab);r=r.replace(/_FORMAT_SPACE_"}else{var S=r.lastIndexOf("code");var U=r.lastIndexOf("file");if(U>S){this.code_type="file"}else{this.code_type="code"}ah+=this.code_type+">"}this.code_type=false}else{if(o[ah]){ah=o[ah]}else{if(this.attr=="u"&&ah=="em"){ah="u"}else{if(ah=="acronym"){}else{ah=H[ah]}}}}}}if(ad=="tr"){if(this.last_col_pipes){ah="\n";this.last_col_pipes=""}if(this.td_rowspan&&this.rowspan_col==this.td_no+1){this.is_rowspan=false;this.last_column=this.td_no;this.td_rowspan--;ah="|"+H.row_span+"|\n"}}else{if(ad=="td"||ad=="th"){this.last_col_pipes="";this.in_td=false}else{if(ad.match(/h\d+/)){this.in_header=false}}}if(H.li){if(r.match(/\n$/)&&!this.list_level){ah=""}}if(this.in_endnotes&&ad=="sup"){return}r+=ah;if(t[ad]){if(this.list_level){this.format_in_list=true;g=true}r+=H.format_space;K=H.format_space}this.last_tag=ad;if(this.td_colspan&&!A){if(this.td_align=="center"){r+=" "}var T="|";if(ad=="th"){T="^"}var W=T;for(var Y=1;Y\n")}if(U.match(/~~CLOSE_HTML_BLOCK~~/)){U=U.replace(/~~CLOSE_HTML_BLOCK~~\n*/gm,"\n\n\n~~CLOSE_HTML_BLOCK~~\n\n")}if(this.interwiki){}if(this.interwiki&&r.match(/>\w+\s*\|$/)){this.interwiki=false;if(this.attr){r+=U}else{r=r.replace(/>\w+\s*\|$/,">"+U)}return}if(this.in_multi_plugin){U=U.replace("< ","<")}U=U.replace(/'/g,"'");U=U.replace(/^(>)+/,function(W,V){return(W.replace(/(>)/g,"__QUOTE__"))});U=U.replace(/¬ags/g,"¬ags");r=r.replace(/([\/\*_])_FORMAT_SPACE_([\/\*_]{2})_FORMAT_SPACE_$/,"$1$2@@_SP_@@");if(U.match(/^&\w+;/)){r=r.replace(/_FORMAT_SPACE_\s*$/,"")}if(this.link_only){if(U){replacement="|"+U+"}} ";r=r.replace(/\}\}\s*$/,replacement)}return}if(!this.code_type){if(!this.last_col_pipes){U=U.replace(/\x20{6,}/," ");U=U.replace(/^( )+\s*$/,"_FCKG_BLANK_TD_");U=U.replace(/( )+/," ")}if(this.format_tag){if(!this.list_started||this.in_table){U=U.replace(/^\s+/,"@@_SP_@@")}}else{if(this.last_tag=="a"){U=U.replace(/^\s{2,}/," ")}else{if(!this.using_fonts){U=U.replace(/^\s+/,"")}}}if(U.match(/nowiki>/)){L=true}if(this.format_in_list||(Q&&this.list_started)){U=U.replace(/^[\n\s]+$/g,"");if(U.match(/\n{2,}\s{1,}/)){U=U.replace(/\n{2,}/,"\n")}}if(this.in_td&&!U){this.in_td=false}}else{U=U.replace(/<\s/g,"<");U=U.replace(/\s>/g,">");var i=U.match(/^\s*geshi:\s+(.*)$/m);if(i){r=r.replace(/<(code|file)>\s*$/,"<$1 "+i[1]+">");U=U.replace(i[0],"")}}if(this.attr&&this.attr=="dwfcknote"){if(U.match(/fckgL\d+/)){return}if(U.match(/^[\-,:;!_]/)){r+=U}else{r+=" "+U}return}if(this.downloadable_code&&(this.export_code||this.code_snippet)){this.downloadable_file=U;return}if(this.last_tag=="a"&&U.match(/^[\.,;\:\!]/)){r=r.replace(/\s$/,"")}if(this.in_header){U=U.replace(/---/g,"—");U=U.replace(/--/g,"–")}if(this.list_started){r=r.replace(/_LIST_EOFL_\s*L_BR_K\s*$/,"_LIST_EOFL_")}if(!this.code_type){if(!r.match(/\[\[\\\\.*?\|$/)&&!U.match(/\w:(\\(\w?))+/)){if(!U.match(/\\\\[\w\.\-\_]+\\[\w\.\-\_]+/)){U=U.replace(/([\\])/g,"%%$1%%")}U=U.replace(/([\*])/g,"_CKG_ASTERISK_")}}if(this.in_endnotes&&c.length){if(U.match(/\w/)&&!U.match(/^\s*\d\)\s*$/)){U=U.replace(/\)\s*$/,"_FN_PAREN_C_");var v=c.length-1;if(this.bottom_url){if(this.link_class&&this.link_class=="media"){U="{{"+this.bottom_url+"|"+U+"}}"}else{U="[["+this.bottom_url+"|"+U+"]]"}}if(y[c[v]]){U=U.replace("(","L_PARgr");U=U.replace(")","R_PARgr");y[c[v]]+=" "+U}else{U=U.replace("(","L_PARgr");U=U.replace(")","R_PARgr");y[c[v]]=U}}this.bottom_url=false;return}if(U&&U.length){r+=U}r=r.replace(/(&\w+;)\s*([\*\/_]{2})_FORMAT_SPACE_(\w+)/,"$1$2$3");if(this.list_level&&this.list_level>1){r=r.replace(/(\[\[.*?\]\])([ ]+[\*\-].*)$/," $1\n$2")}try{var T=new RegExp("([*/_]{2,})_FORMAT_SPACE_([*/_]{2,})("+RegExp.escape(U)+")$");if(r.match(T)){r=r.replace(T,"$1$2$3")}}catch(S){}if(!e){if(U.match(/</)){e=true}}},comment:function(i){},dbg:function(v,i){if(v.replace){v=v.replace(/^\s+/g,"");v=v.replace(/^\n$/g,"");v=v.replace(/&/g,"&").replace(//g,">");if(!v){return}}if(i){i=""+i+"\n"}HTMLParser_DEBUG+=i+v+"\n__________\n"}});r=r.replace(/(\[\[\\\\)(.*?)\]\]/gm,function(i,S,v){v=v.replace(/\\/g,"_SMB_");return S+v+"]]"});r=r.replace(/%%\\%%/g,"_ESC_BKSLASH_");r=r.replace(/%*\\%*([^\w\\]{1})%*\\%*/g,"$1");r=r.replace(/_SMB_/g,"\\");r=r.replace(/(\s*={2,}).*?CKGE_TMP_(\w+)(.*?).*?CKGE_TMP_c?\2.*?\1/gm,function(S,i){S=S.replace(/CKGE_TMP_\w+/gm,"");var T=jQuery("#formatdel").val();if(!T){jQuery("#dw__editform").append('')}return S});r=r.replace(/\s?(CKGE_TMP_\w+)\s?/gm,function(v,i){if(l[i]){return l[i]}return v});r=r.replace(/(\s*={2,})(.*?)(\[\[|\{\{)(.*?)(\]\]|\}\})(.*?)\1/gm,function(i,S,Y,W,U,V,X){X=X.replace(/\[\[(.*?)\|(.*?)\]\]/g,"$2");X=X.replace(/\{\{(.*?)\|(.*?)\}\}/g,"$2");i=S+" "+Y+" "+U.replace(/.*?\|(.*?)/,"$1")+" "+X+" "+S;var T=jQuery("#formatdel").val();if(!T){jQuery("#dw__editform").append('')}return i});if(C=="test"){if(!HTMLParser_test_result(r)){return}}r=r.replace(/\{ \{ rss>Feed:/mg,"{{rss>http://");r=r.replace(/\{ \{ rss>sFeed:/mg,"{{rss>https://");r=r.replace(/~ ~ (NOCACHE|NOTOC)~ ~/mg,"~~$1~~");if(q){var u=function(i,v){tag_1=i.replace(/oIWIKIo(.*)cIWIKIc/,"$1");if(tag_1==v){return true}v=v.replace(/\s/,"%20");return(v==tag_1)};r=r.replace(/\[\[(\w+\.?\w{0,12})>(.*?)\|(.*?)\]\]/gm,function(v,T,S,i){if(S=="oIWIKIocIWIKIc"){S=i}if((S=="oIWIKIo"+i.replace(/\s/,"%20")+"cIWIKIc")||(S==i)||u(S,i)){i=""}else{i="|"+i}return("[["+T+">"+S+i+"]]")})}r=r.replace(/>.*?oIWIKIo(.*?)cIWIKIc/mg,">$1");if(K){if(h){r=r.replace(/\s*([\|\^]+)((\W\W_FORMAT_SPACE_)+)/gm,function(i,v,S){S=S.replace(/_FORMAT_SPACE_/g,"");return(S+v)})}r=r.replace(/"/g,'"');var j=new RegExp(K+"([\\-]{2,})","g");r=r.replace(j," $1");r=r.replace(/\]\](\*\*|\/\/|\'\'|__|<\/del>)_FORMAT_SPACE_/,"]]$1@@_SP_@@");var j=new RegExp("(&|\\W|\\w|\\d)(\\*\\*|\\/\\/|\\'\\'|__|)+"+K+"(\\w|\\d)","g");r=r.replace(j,"$1$2$3");var j=new RegExp(K+"@@_SP_@@","g");r=r.replace(j," ");r=r.replace(/([\*\/_]{2})@@_SP_@@(&\w+;)/g,"$1 $2");r=r.replace(/\n@@_SP_@@\n/g,"");r=r.replace(/@@_SP_@@\n/g,"");r=r.replace(/@@_SP_@@/g," ");var j=new RegExp(K+"([^\\)\\]\\}\\{\\-\\.,;:\\!?\"\x94\x92\u201D\u2019'])","g");r=r.replace(j," $1");j=new RegExp(K,"g");r=r.replace(j,"");if(g){r=r.replace(/^(\s+[\-\*_]\s*)([\*\/_\']{2})(.*?)(\2)([^\n]*)\n+/gm,function(S,i,U,V,v,T){return(i+U+V+v+T+"\n")})}}if(HTMLLinkInList){r=r.replace(/(\*|-).*?(\[\[|\{\{).*?(\]\]|\}\})([\s\w\/\-\x3A-\x40\x5B-\x60\x7B-\x7F,;\>\<\&]+)\n\n/mg,function(T,S,i,U,v){T=T.replace(/[\n]$/,"");return(T)})}var p="\\\\";if(R){r=r.replace(/(L_BR_K)+/g,p);r=r.replace(/L_BR_K/gm,p);r=r.replace(/(\\\\)\s+/gm,"$1 \n")}if(s){r=r.replace(/\s+<\/(code|file)>/g,"\n");if(b){r=r.replace(/\s+;/mg,";");r=r.replace(/<\s+/mg,"<");r=r.replace(/\s+>/mg,">")}}if(M){r+="\n"+p+"\n";var j=new RegExp(d,"g");r=r.replace(j," "+p+" ");r=r.replace(/(\||\^)[ ]+(\||\^)\s$/g,"$1\n");r=r.replace(/(\||\^)[ ]+(\||\^)/g,"$1")}r=r.replace(/_FCKG_BLANK_TD_/g," ");if(e){r=r.replace(/\/\/<\/\/\s*/g,"<")}if(Q){String.prototype.font_link_reconcile=function(i){if(i==1){j=/\[\[(.*?)(]+>)([^<]+(\]\])?)[^\>]+\/font>\s*(\]\])/gm}else{j=/(\{]+>)\{\{(:?.*?)\|(:?.*?)<\/font>/gm}return(this.replace(j,function(S,T,v,V){T=T.replace(/\n/gm,"");T=T.replace(/\s/gm,"");T=T.replace(/[\[\]\{\}]/g,"");T=T.replace(/\|/g,"");V=V.replace(/\n/gm,"");V=V.replace(/[\[\]\}\{]/g,"");if(i==1){V="[["+T+"|"+V+"]]"}else{V="{{"+v+"|"+V+"}}"}var U=prompt(LANG.plugins.ckgedit.font_err_1+"\n"+V+"\n"+LANG.plugins.ckgedit.font_err_2);if(U==null){if(ckgedit_to_dwedit){ckgedit_to_dwedit=false;return V}else{throw new Error(LANG.plugins.ckgedit.font_err_throw)}}if(U){return U}return V}))};if(P){r=r.replace(/<\/font>\s{1}/gm,"")}if(F()){if(confirm(LANG.plugins.ckgedit.font_conflict)){return}var G=jQuery("#fontdel").val();if(!G){jQuery("#dw__editform").append('')}}r=r.font_link_reconcile(1);r=r.font_link_reconcile(2);var j=/\>\s+(\*\*|__|\/\/|'')\s+_\s+\1\s+<\/font>/gm;r=r.replace(j,function(i){i=i.replace(/\s+/g,"");return i});r=r.replace(/\[\[(.*?)\|(]+>)(.*?)(<\/font>)\s*(\]\])\s*/gm,function(U,S,i,V){U="[["+S+"|"+V+"]]";var T=jQuery("#fontdel").val();if(!T){jQuery("#dw__editform").append('')}return U});r=r.replace(/(\s*={2,})\s*(.*?)(]+>)(.*?)(<\/font>)(.*?)\s*\1/gm,function(S){S=S.replace(/<\/font>/g," ");S=S.replace(//g," ");var i=jQuery("#formatdel").val();if(!i){jQuery("#dw__editform").append('')}return S})}if(c.length){r=r.replace(/\(\(\){2,}\s*<\/sup>/g,"");r=r.replace(/\(\(+(\d+)\)\)+/,"(($1))");for(var N in y){var a=N.match(/_(\d+)/);var k=new RegExp("()*[(]+"+a[1]+"[)]+()*");y[N]=y[N].replace(/(\d+)_FN_PAREN_C_/,"");r=r.replace(k,"(("+y[N].replace(/_FN_PAREN_C_/g,") ")+"))")}r=r.replace(/<\/sup>/g,"");r=r.replace(/((\(\(\d+\)\)\)?<\/sup>))/mg,function(i){if(!i.match(/p>\(\(\d+/)){return""}return i})}r=r.replace(/(={3,}.*?)(\{\{.*?\}\})(.*?={3,})/g,"$1$3\n\n$2");r=r.replace(/()*\s*\[\[\s*\]\]\s*(<\/sup>)*\n*/g,"");r=r.replace(/\s*\(\(\d+\)\)\s*<\/sup>/mg,"");if(O){r=r.replace(/<\s+/g,"<");r=r.replace(/<\s+/g,"<")}if(L){var x="%";var j=new RegExp("(["+x+"])","g");r=r.replace(/(<nowiki>)(.*?)(<\/nowiki>)/mg,function(v,T,i,S){i=i.replace(/%%(.)%%/mg,"NOWIKI_$1_");return T+i.replace(j,"NOWIKI_$1_")+S})}r=r.replace(/__SWF__(\s*)\[*/g,"{{$1");r=r.replace(/\|.*?\]*(\s*)__FWS__/g,"$1}}");r=r.replace(/(\s*)__FWS__/g,"$1}}");r=r.replace(/\n{3,}/g,"\n\n");r=r.replace(/_LIST_EOFL_/gm," "+p+" ");if(A){if(r.indexOf("~~COMPLEX_TABLES~~")==-1){r+="~~COMPLEX_TABLES~~\n"}}if(!A){r=r.replace(/~~COMPLEX_TABLES~~/gm,"")}r=r.replace(/_CKG_ASTERISK_/gm,"*");r=r.replace(/_ESC_BKSLASH_/g,"\\");r=r.replace(/divalNLine/gm,"\n");if(C=="test"){if(HTMLParser_test_result(r)){alert(r)}return}var D=GetE("dw__editform");D.elements.fck_wikitext.value=r;if(C=="bakup"){return}if(C){var f=GetE(C);f.click();return true}}jQuery(document).ready(function(){var a=false;jQuery(document).on("keydown","input#edit__summary",function(b){if(b.which==13){a=true;jQuery("#save_button").trigger("mousedown")}});jQuery("#ebut_test").mousedown(function(){parse_wikitext("test")});jQuery("#ebtn__delete").click(function(){if(a){a=false;return}return confirm(JSINFO.confirm_delete)});jQuery("#ebtn__delete").mouseup(function(){draft_delete()});jQuery("#ebtn__dwedit").click(function(){ckgedit_to_dwedit=true;setDWEditCookie(2,this);parse_wikitext("edbtn__save");this.form.submit()});jQuery("#ebtn__fbswitch").click(function(){if(getCookie("ckgFbOpt")=="dokuwiki"){document.cookie="ckgFbOpt=ckgedit;SameSite=Lax"}else{document.cookie="ckgFbOpt=dokuwiki;SameSite=Lax"}parse_wikitext("edbtn__save");this.form.submit()});jQuery("#ckgedit_draft_btn").click(function(){ckgedit_get_draft()});jQuery("#backup_button").click(function(){renewLock(true)});jQuery("#revert_to_prev_btn").click(function(){revert_to_prev()});jQuery("#no_styling_btn").click(function(){this.form.styling.value="no_styles";this.form.prefix.value="";this.form.suffix.value="";this.form.rev.value=""});jQuery("#ebut_cancel").mouseup(function(){if(this.form.template&&this.form.template.value=="tpl"){return}if(window.dwfckTextChanged){return}draft_delete()});jQuery("#save_button").mousedown(function(){if(this.form.template&&this.form.template.value=="tpl"){window.dwfckTextChanged=true}if(!window.dwfckTextChanged&&!JSINFO.cg_rev){ckgedit_dwedit_reject=true;parse_wikitext("ebut_cancel")}else{parse_wikitext("edbtn__save")}})}); \ No newline at end of file diff --git a/lib/plugins/ckgedit/scripts/parse_wiki.js.unc b/lib/plugins/ckgedit/scripts/parse_wiki.js.unc new file mode 100644 index 0000000..23d0f04 --- /dev/null +++ b/lib/plugins/ckgedit/scripts/parse_wiki.js.unc @@ -0,0 +1,2002 @@ +function parse_wikitext(id) { + if (ckgedit_dwedit_reject) { + var dom = GetE('ebut_cancel'); + dom.click(); + return true; + } + var useComplexTables = getComplexTables(); + + + function fontConflict() { + + var regex = /\>\s+(\*\*|__|\/\/|'')\s+_\s+\1\s+<\/font>/gm; + results = results.replace(regex, function(m) { + m = m.replace(/\s+/g, ""); + return m; + }); + + regex = new RegExp("\\>(.*?)(\\]\\]\\<\\/font\\>)|(\\<\\/font\\>\\]\\])", "gm"); + if (results.match(regex)) return true; + + regex = new RegExp("(\\{\\{(.*?)\\.\\w{2,4})\\|\\\\{\\{(.*?)\\.\\w+\\<\\/font\\>\\b', 'gm'); + if (results.match(regex)) return true; + + return false; + + } + /** + table debugging code; + */ + function check_rowspans(rows, start_row, ini) { + var tmp = new Array(); + for (var i = start_row; i < rows.length; i++) { + for (var col = 0; col < rows[i].length; col++) { + if (rows[i][col].rowspan > 0) { + var _text = rows[i][col].text; + tmp.push({ + row: i, + column: col, + spans: rows[i][col].rowspan, + text: _text + }); + if (!ini) break; + } + } + } + return tmp; + } + + function insert_rowspan(row, col, spans, rows, shift) { + + var prev_colspans = rows[row][col].colspan ? rows[row][col].colspan : 0; + rows[row][col].rowspan = 0; + for (i = 0; i < spans - 1; i++) { + //debug_row(rows,row,col,"insert_rowspan start"); + rows[++row].splice(col, 0, { + type: 'td', + rowspan: 0, + colspan: prev_colspans, + prev_colspan: prev_colspans, + text: " ::: " + }); + + } + } + + + + function reorder_span_rows(rows) { + var tmp_start = check_rowspans(rows, 0, true); + var num_spans = tmp_start.length; + if (!num_spans) return false; + + + var row = tmp_start[0].row; + var col = tmp_start[0].column; + insert_rowspan(row, col, tmp_start[0].spans, rows); + + num_spans--; + for (var i = 0; i < num_spans; i++) { + row++; + var tmp = check_rowspans(rows, row, false); + if (tmp.length) { + insert_rowspan(tmp[0].row, tmp[0].column, tmp[0].spans, rows); + } + } + return true; + + } + + function insert_table(rows) { + if (!useComplexTables) return; + for (var i = 0; i < rows.length; i++) { + if (!reorder_span_rows(rows)) break;; + } + + results += "\n"; + for (var i = 0; i < rows.length; i++) { + results += "\n"; + for (var col = 0; col < rows[i].length; col++) { + var type = rows[i][col].type == 'td' ? '|' : '^'; + results += type; + var align = rows[i][col].align ? rows[i][col].align : false; + if (align == 'center' || align == 'right') { + results += " "; + } + + results += rows[i][col].text; + if (align == 'center' || align == 'left') { + results += " "; + } + + if (rows[i][col].colspan) { + for (var n = 0; n < rows[i][col].colspan - 1; n++) { + results += type; + } + } + } + + results += '|'; + + } + } + + + window.dwfckTextChanged = false; + if (id != 'bakup') draft_delete(); + var line_break = "\nL_BR_K \n"; + var markup = { + 'b': '**', + 'i': '//', + 'em': '//', + 'u': '__', + 'br': line_break, + 'strike': '', + 'del': '', + 's': '', + p: "\n\n", + 'a': '[[', + 'img': '\{\{', + 'strong': '**', + 'h1': "\n====== ", + 'h2': "\n===== ", + 'h3': "\n==== ", + 'h4': "\n=== ", + 'h5': "\n== ", + 'td': "|", + 'th': "^", + 'tr': " ", + 'table': "\n\n", + 'ol': " - ", + 'ul': " * ", + 'li': "", + 'code': "\'\'", + 'pre': "\n<", + 'hr': "\n\n----\n\n", + 'sub': '', + 'font': "", + 'blockquote': '
    ', + 'sup': '', + 'div': "\n\n", + 'span': "\n", + 'dl': "\n", + 'dd': "\n", + 'dt': "\n" + }; + var markup_end = { + 'del': '', + 's': '', + 'strike': '', + 'p': " ", + 'br': " ", + 'a': ']]', + 'img': '\}\}', + 'h1': " ======\n", + 'h2': " =====\n", + 'h3': " ====\n", + 'h4': " ===\n", + 'h5': " ==\n", + 'td': " ", + 'th': " ", + 'tr': "|\n", + 'ol': " ", + 'ul': " ", + 'li': "\n", + 'pre': "\n', + 'sup': ' ', + 'div': "\n\n", + 'p': "\n\n", + 'font': "", + 'span': " ", + 'blockquote': '
    ', + }; + + markup['temp_u'] = "CKGE_TMP_u"; + markup['temp_strong'] = "CKGE_TMP_strong"; + markup['temp_em'] = "CKGE_TMP_em"; + markup['temp_i'] = "CKGE_TMP_i"; + markup['temp_b'] = "CKGE_TMP_b"; + markup['temp_del'] = "CKGE_TMP_del"; + markup['temp_strike'] = "CKGE_TMP_strike"; + markup['temp_code'] = "CKGE_TMP_code"; + markup['temp_sup'] = "CKGE_TMP_sup"; + markup['temp_csup'] = "CKGE_TMP_csup"; + markup['temp_sub'] = "CKGE_TMP_sub"; + markup['temp_csub'] = "CKGE_TMP_csub"; + markup['temp_del'] = "CKGE_TMP_del"; + markup['temp_cdel'] = "CKGE_TMP_cdel"; + markup['temp_strike'] = "CKGE_TMP_del"; + markup['temp_cstrike'] = "CKGE_TMP_cdel"; + markup['temp_s'] = "CKGE_TMP_del"; + markup['temp_cs'] = "CKGE_TMP_cdel"; + + var $FORMAT_SUBST = { + 'CKGE_TMP_b': '**', + 'CKGE_TMP_strong': '**', + 'CKGE_TMP_em': '\/\/', + 'CKGE_TMP_u': '__', + 'CKGE_TMP_sup': '', + 'CKGE_TMP_sub': '', + 'CKGE_TMP_cdel': '', + 'CKGE_TMP_csub': '', + 'CKGE_TMP_csup': '', + 'CKGE_TMP_del': '', + 'CKGE_TMP_strike': '', + 'CKGE_TMP_code': "\'\'" + }; + + markup['blank'] = ""; + markup['fn_start'] = '(('; + markup['fn_end'] = '))'; + markup['row_span'] = ":::"; + markup['p_insert'] = '_PARA__TABLE_INS_'; + markup['format_space'] = '_FORMAT_SPACE_'; + markup['pre_td'] = '<'; //removes newline from before < which corrupts table + var format_chars = { + 'strong': true, + 'b': true, + 'i': true, + 'em': true, + 'u': true, + 'del': true, + 'strike': true, + 'code': true, + 'sup': true, + 'sub': true, + 's': true + }; + + var results = ""; + var HTMLParser_LBR = false; + var HTMLParser_PRE = false; + var HTMLParser_Geshi = false; + var HTMLParser_TABLE = false; + var HTMLParser_COLSPAN = false; + var HTMLParser_FORMAT_SPACE = false; + var HTMLParser_MULTI_LINE_PLUGIN = false; + var HTMLParser_NOWIKI = false; + var HTMLFormatInList = false; + var HTMLAcroInList = false; + var HTML_InterWiki = false; + var HTMLParserFont = false; + HTMLLinkInList = false; + var HTMLParserFontInfix = false; + var CurrentTable; + + var HTMLParserTopNotes = new Array(); + var HTMLParserBottomNotes = new Array(); + var HTMLParserOpenAngleBracket = false; + var HTMLParserParaInsert = markup['p_insert']; + + var geshi_classes = '(br|co|coMULTI|es|kw|me|nu|re|st|sy)[0-9]'; + String.prototype.splice = function(idx, rem, s) { + return (this.slice(0, idx) + s + this.slice(idx + Math.abs(rem))); + }; + String.frasl = new RegExp("⁄\|⁄\|⁄\|⁄", 'g'); + geshi_classes = new RegExp(geshi_classes); + HTMLParser(CKEDITOR.instances.wiki__text.getData(), { + attribute: "", + link_title: "", + link_class: "", + image_link_type: "", + td_align: "", + in_td: false, + td_colspan: 0, + td_rowspan: 0, + rowspan_col: 0, + last_column: -1, + row: 0, + col: 0, + td_no: 0, + tr_no: 0, + current_row: false, + in_table: false, + in_multi_plugin: false, + is_rowspan: false, + list_level: 0, + prev_list_level: -1, + list_started: false, + xcl_markup: false, + in_link: false, + link_formats: new Array(), + last_tag: "", + code_type: false, + in_endnotes: false, + is_smiley: false, + geshi: false, + downloadable_code: false, + export_code: false, + code_snippet: false, + downloadable_file: "", + external_mime: false, + in_header: false, + curid: false, + format_in_list: false, + prev_li: new Array(), + link_only: false, + in_font: false, + using_fonts: false, + interwiki: false, + bottom_url: false, + font_family: "inherit", + font_size: "inherit", + font_weight: "inherit", + font_color: "inherit", + font_bgcolor: "inherit", + font_style: "inherit", + is_mediafile: false, + end_nested: false, + mfile: false, + + backup: function(c1, c2) { + var c1_inx = results.lastIndexOf(c1); // start position of chars to delete + var c2_inx = results.indexOf(c2, c1_inx); // position of expected next character + if (c1_inx == -1 || c2_inx == -1) return; + if (c1.length + c2_inx == c2_inx) { + var left_side = results.substring(0, c1_inx); //from 0 up to but not including c1 + var right_side = results.substring(c2_inx); //from c2 to end of string + results = left_side + right_side; + return true; + } + return false; + }, + is_iwiki: function(class_name, title) { + var iw_type = class_name.match(/iw_(\w+\.?\w{0,12})/); + var iw_title = title.split(/\/\//); + var interwiki_label = iw_title[iw_title.length - 1]; + if (!interwiki_label.match(/oIWIKIo.*?cIWIKIc/)) { + interwiki_label = 'oIWIKIo' + interwiki_label + 'cIWIKIc'; + } + interwiki_label = interwiki_label.replace(/^.*?oIWIKIo/, 'oIWIKIo'); + interwiki_label = interwiki_label.replace(/cIWIKIc.*/, 'cIWIKIc'); + iw_type[1] = iw_type[1].replace(/_(\w{2})/g, "." + "$1"); + this.attr = iw_type[1] + '>' + decodeURIComponent(interwiki_label); + HTML_InterWiki = true; + this.interwiki = true; + }, + start: function(tag, attrs, unary) { + /** if table debugging code: + this_debug = this.dbg; + */ + if (markup[tag]) { + if (format_chars[tag] && this.in_link) { + this.link_formats.push(tag); + return; + } + if (format_chars[tag] && (this.in_font || this.in_header)) { + results += " "; + var t = 'temp_' + tag; + results += markup[t]; + results += " "; + return; + } else if (tag == 'acronym') { + return; + } + if (format_chars[tag] && this.in_endnotes) { + if (tag == 'sup') return; + } + if (tag == 'ol' || tag == 'ul') { + if(this.in_table) { + markup_end['li'] = "\\\\"; + this.list_level = 0; + jQuery('#dw__editform').append(''); + } + else markup_end['li'] = "\n"; + this.prev_list_level = this.list_level; + this.list_level++; + if (this.list_level == 1) this.list_started = false; + if (this.list_started) this.prev_li.push(markup['li']); + markup['li'] = markup[tag]; + + return; + } else if (!this.list_level) { + markup['li'] = ""; + this.prev_li = new Array(); + } + + this.is_mediafile = false; + + if (tag == 'img') { + var img_size = "?"; + var width; + var height; + var style = false; + var img_align = ''; + var alt = ""; + var from_clipboard = false; + this.is_smiley = false; + this.in_link = false; + } + + if (tag == 'a') { + var local_image = true; + var type = ""; + this.xcl_markup = false; // set to false in end() as well, double sure + this.in_link = true; + this.link_pos = results.length; + this.link_formats = new Array(); + this.footnote = false; + var bottom_note = false; + this.id = ""; + this.external_mime = false; + var media_class = false; + this.export_code = false; + this.code_snippet = false; + this.downloadable_file = ""; + var qs_set = false; + this.link_only = false; + save_url = ""; + this.interwiki = false; + this.bottom_url = false; + this.link_title = false; + var interwiki_title = ""; + var interwiki_class = ""; + } + + if (tag == 'p') { + this.in_link = false; + if (this.in_table) { + tag = 'p_insert'; + HTMLParser_TABLE = true; + } + } + + + if (tag == 'table') { + this.td_no = 0; + this.tr_no = 0; + this.in_table = true; + this.is_rowspan = false; + this.row = -1; + this.rows = new Array(); + CurrentTable = this.rows; + this.table_start = results.length; + } else if (tag == 'tr') { + this.tr_no++; + this.td_no = 0; + this.col = -1; + this.row++; + this.rows[this.row] = new Array(); + this.current_row = this.rows[this.row]; + } else if (tag == 'td' || tag == 'th') { + this.td_no++; + this.col++; + this.current_row[this.col] = { + type: tag, + rowspan: 0, + colspan: 0, + text: "" + }; + this.cell_start = results.length; + this.current_cell = this.current_row[this.col]; + if (this.td_rowspan && this.rowspan_col == this.td_no && this.td_no != this.last_column) { + this.is_rowspan = true; + this.td_rowspan--; + } else { + this.is_rowspan = false; + } + + + } + + + var matches; + this.attr = false; + this.format_tag = false; + + if (format_chars[tag]) this.format_tag = true; + var dwfck_note = false; + + for (var i = 0; i < attrs.length; i++) { + + // if(!confirm(tag + ' ' + attrs[i].name + '="' + attrs[i].escaped + '"')) exit; + if (tag == 'td' || tag == 'th') { + if (attrs[i].name == 'colspan') { + this.current_row[this.col].colspan = attrs[i].value; + } + if (attrs[i].name == 'class') { + if ((matches = attrs[i].value.match(/(left|center|right)/))) { + this.current_row[this.col].align = matches[1]; + } + } + if (attrs[i].name == 'rowspan') { + this.current_row[this.col].rowspan = attrs[i].value + } + } + if (attrs[i].escaped == 'u' && tag == 'em') { + tag = 'u'; + this.attr = 'u' + break; + } + + if (tag == 'div') { + if (attrs[i].name == 'class' && attrs[i].value == 'footnotes') { + tag = 'blank'; + this.in_endnotes = true; + } + break; + } + if (tag == 'dl' && attrs[i].name == 'class' && attrs[i].value == 'file') { + this.downloadable_code = true; + HTMLParser_Geshi = true; + return; + } + if (tag == 'span' && attrs[i].name == 'class') { + if (attrs[i].value == 'np_break') return; + } + + if (tag == 'span' && attrs[i].name == 'class') { + if (attrs[i].value == 'curid') { + this.curid = true; + return; + } + if (attrs[i].value == 'multi_p_open') { + this.in_multi_plugin = true; + HTMLParser_MULTI_LINE_PLUGIN = true; + return; + } + if (attrs[i].value == 'multi_p_close') { + this.in_multi_plugin = false; + return; + } + if (attrs[i].value.match(geshi_classes)) { + tag = 'blank'; + this.geshi = true; + break; + } + } + + + if (tag == 'span' && !ckgedit_xcl_styles) { + if (attrs[i].name == 'style') { + if (!this.in_font) results += "__STYLE__"; + this.in_font = true; + this.using_fonts = true; + matches = attrs[i].value.match(/font-family:\s*([\w\-\s,]+);?/); + if (matches) { + this.font_family = matches[1]; + } + + //matches = attrs[i].value.match(/font-size:\s*(\d+(\w+|%));?/); + matches = attrs[i].value.match(/font-size:\s*(.*)/); + if (matches) { + matches[1] = matches[1].replace(/;/, ""); + this.font_size = matches[1]; + } + matches = attrs[i].value.match(/font-weight:\s*(\w+);?/); + if (matches) { + this.font_weight = matches[1]; + } + matches = attrs[i].value.match(/.*?color:\s*(.*)/); + var bgcolor_found = false; + if (matches) { + matches[1] = matches[1].replace(/;/, ""); + if (matches[0].match(/background/)) { + this.font_bgcolor = matches[1]; + } else { + this.font_color = matches[1]; + } + } + if (!bgcolor_found) { //catch MS Word which uses background:color-name instead of background-color:color-name + matches = attrs[i].value.match(/background:\s*(\w+)/); + if (matches && matches[0].match(/background/)) { + this.font_bgcolor = matches[1]; + } + + } + } + + } + if (tag == 'td' || tag == 'th') { + if (tag == 'td') { + results = results.replace(/\^$/, '|'); + } + this.in_td = true; + if (attrs[i].name == 'align') { + this.td_align = attrs[i].escaped; + + } else if (attrs[i].name == 'class') { + matches = attrs[i].value.match(/\s*(\w+)align/); + if (matches) { + this.td_align = matches[1]; + } + } else if (attrs[i].name == 'colspan') { + HTMLParser_COLSPAN = true; + this.td_colspan = attrs[i].escaped; + } else if (attrs[i].name == 'rowspan') { + this.td_rowspan = attrs[i].escaped - 1; + this.rowspan_col = this.td_no; + } + + HTMLParser_TABLE = true; + } + + if (tag == 'a') { + + // if(!confirm(attrs[i].name + '="' + attrs[i].escaped + '"')) exit; + if (attrs[i].name == 'title') { + this.link_title = attrs[i].escaped; + if (interwiki_class) { + interwiki_title = attrs[i].escaped; + } else this.link_title = this.link_title.replace(/\s+.*$/, ""); + } else if (attrs[i].name == 'class') { + if (attrs[i].value.match(/fn_top/)) { + this.footnote = true; + } else if (attrs[i].value.match(/fn_bot/)) { + bottom_note = true; + } else if (attrs[i].value.match(/mf_(png|gif|jpg|jpeg)/i)) { + this.link_only = true; + } else if (attrs[i].value.match(/interwiki/)) { + attrs[i].value = attrs[i].value.replace(/\./g, '_'); + this.link_class = attrs[i].value; + continue; + } + + this.link_class = attrs[i].escaped; + media_class = this.link_class.match(/mediafile/); + } else if (attrs[i].name == 'id') { + this.id = attrs[i].value; + } else if (attrs[i].name == 'type') { + type = attrs[i].value; + } else if (attrs[i].name == 'href' && !this.code_type) { + var http = attrs[i].escaped.match(/https*:\/\//) ? true : false; + if (http) save_url = attrs[i].escaped; + if (attrs[i].escaped.match(/\/lib\/exe\/detail.php/)) { + this.image_link_type = 'detail'; + } else if (attrs[i].escaped.match(/exe\/fetch.php/)) { + this.image_link_type = 'direct'; + } + + if (this.link_class && this.link_class.match(/media/) && !this.link_title) { + var link_find = attrs[i].escaped.match(/media=(.*)/); + if (link_find) this.link_title = link_find[1]; + } + // required to distinguish external images from external mime types + // that are on the wiki which also use {{url}} + var media_type = attrs[i].escaped.match(/fetch\.php.*?media=.*?\.(png|gif|jpg|jpeg)$/i); + if (media_type) media_type = media_type[1]; + + if (attrs[i].escaped.match(/^https*:/)) { + this.attr = attrs[i].escaped; + local_image = false; + } + if (attrs[i].escaped.match(/^ftp:/)) { + this.attr = attrs[i].escaped; + local_image = false; + } else if (attrs[i].escaped.match(/do=export_code/)) { + this.export_code = true; + } else if (attrs[i].escaped.match(/^nntp:/)) { + this.attr = attrs[i].escaped; + local_image = false; + } else if (attrs[i].escaped.match(/^mailto:/)) { + this.attr = attrs[i].escaped.replace(/mailto:/, ""); + local_image = false; + } else if (attrs[i].escaped.match(/m-files/)) { + this.attr = attrs[i].escaped; + this.mfile = attrs[i].escaped; + local_image = false; + } else if (attrs[i].escaped.match(/^file:/)) { //samba share + var url = attrs[i].value.replace(/file:[\/]+/, ""); + url = url.replace(/[\/]/g, '\\'); + url = '\\\\' + url; + this.attr = url; + local_image = false; + } + // external mime types after they've been saved first time + else if (http && !media_type && (matches = attrs[i].escaped.match(/fetch\.php(.*)/))) { + if (matches[1].match(/media=/)) { + elems = matches[1].split(/=/); + this.attr = elems[1]; + } else { // nice urls + matches[1] = matches[1].replace(/^\//, ""); + this.attr = matches[1]; + } + + if (typeof config_animal !== 'undefined') { + var regex = new RegExp(config_animal + '\/file\/(.*)'); + matches = attrs[i].escaped.match(regex); + if (matches && matches[1]) this.attr = matches[1]; + if (this.attr) this.attr = this.attr.replace(/\//g, ':'); + } + local_image = false; + + this.attr = decodeURIComponent ? decodeURIComponent(this.attr) : unescape(this.attr); + if (!this.attr.match(/^:/)) { + this.attr = ':' + this.attr; + } + this.external_mime = true; + } else { + local_image = false; + + matches = attrs[i].escaped.match(/doku.php\?id=(.*)/); + if (matches && save_url) { + var rx = DOKU_BASE + 'doku.php'; + if (!attrs[i].escaped.match(rx)) { + this.link_class == 'urlextern'; + this.attr = save_url; + matches = null; + } + } + if (!matches) { + matches = attrs[i].escaped.match(/doku.php\/(.*)/); + } + /* previously saved internal link with query string + requires initial ? to be recognized by DW. In Anteater and later */ + if (matches) { + if (!matches[1].match(/\?/) && matches[1].match(/&/)) { + qs_set = true; + matches[1] = matches[1].replace(/&/, '?') + } + } + if (matches && matches[1]) { + if (!matches[1].match(/^:/)) { + this.attr = ':' + matches[1]; + } else { + this.attr = matches[1]; + } + + if (this.attr.match(/\.\w+$/)) { // external mime's first access + if (type && type == 'other_mime') { + this.external_mime = true; + } else { + for (var n = i + 1; n < attrs.length; n++) { + if (attrs[n].value.match(/other_mime/)) + this.external_mime = true; + break; + } + + } + } + + } else { + matches = attrs[i].value.match(/\\\\/); // Windows share + if (matches) { + this.attr = attrs[i].escaped; + local_image = false; + } + } + } + + if (this.link_class == 'media') { + if (attrs[i].value.match(/http:/)) { + local_image = false; + } + } + + if (!this.attr && this.link_title) { + + if (matches = this.link_class.match(/media(.*)/)) { + this.link_title = decodeURIComponent(safe_convert(this.link_title)); + this.attr = this.link_title; + var m = matches[1].split(/_/); + if (m && m[1]) { + media_type = m[1]; + } else if (m) { + media_type = m[0]; + } else media_type = 'mf'; + if (!this.attr.match(/^:/) && !this.attr.match(/^https?\:/)) { + this.attr = ':' + this.attr.replace(/^\s+/, ""); + } + this.external_mime = true; + local_image = false; + } + } + + if (this.attr.match && this.attr.match(/%[a-fA-F0-9]{2}/) && (matches = this.attr.match(/userfiles\/file\/(.*)/))) { + matches[1] = matches[1].replace(/\//g, ':'); + if (!matches[1].match(/^:/)) { + matches[1] = ':' + matches[1]; + } + this.attr = decodeURIComponent ? decodeURIComponent(matches[1]) : unescape(matches[1]); + this.attr = decodeURIComponent ? decodeURIComponent(this.attr) : unescape(this.attr); + this.external_mime = true; + + } else if (this.attr && this.attr.match(/%[a-fA-F0-9]{2}/)) { + this.attr = decodeURIComponent(this.attr); + this.attr = decodeURIComponent(this.attr); + } + + // alert('title: ' + this.link_title + ' class: ' + this.link_class + ' export: ' +this.export_code); + if (this.link_title && this.link_title.match(/Snippet/)) this.code_snippet = true; + + /* anchors to current page without prefixing namespace:page */ + if (attrs[i].value.match(/^#/) && this.link_class.match(/wikilink/)) { + this.attr = attrs[i].value; + this.link_title = false; + } + + /* These two conditions catch user_rewrite not caught above */ + if (this.link_class.match(/wikilink/) && this.link_title) { + this.external_mime = false; + if (!this.attr) { + this.attr = this.link_title; + } + if (!this.attr.match(/^:/)) { + this.attr = ':' + this.attr; + } + if (this.attr.match(/\?.*?=/)) { + var elems = this.attr.split(/\?/); + elems[0] = elems[0].replace(/\//g, ':'); + this.attr = elems[0] + '?' + elems[1]; + } else { + this.attr = this.attr.replace(/\//g, ':'); + } + + /* catch query strings attached to internal links for .htacess nice urls */ + if (!qs_set && attrs[i].name == 'href') { + if (!this.attr.match(/\?.*?=/) && !attrs[i].value.match(/doku.php/)) { + var qs = attrs[i].value.match(/(\?.*)$/); + if (qs && qs[1]) this.attr += qs[1]; + } + + } + } else if (this.link_class.match(/mediafile/) && this.link_title && !this.attr) { + this.attr = this.link_title; + this.external_mime = true; + + if (!this.attr.match(/^:/)) { + this.attr = ':' + this.attr; + } + } else if (this.link_class.match(/interwiki/)) { + interwiki_class = this.link_class; + } + + if (this.link_class == 'urlextern' && !this.mfile && save_url) { + this.attr = save_url; + this.external_mime = false; // prevents external links to images from being converted to image links + } + if (this.in_endnotes) { + if (this.link_title) { + this.bottom_url = this.link_title; //save for bottom urls + } else if (this.attr) { + this.bottom_url = this.attr; + } + } + this.link_title = ""; + this.link_class = ""; + // break; + } + } + + if (interwiki_class && interwiki_title) { + this.is_iwiki(interwiki_class, interwiki_title); + interwiki_class = ""; + interwiki_title = ""; + } + + if (tag == 'sup') { + if (attrs[i].name == 'class') { + matches = attrs[i].value.split(/\s+/); + if (matches[0] == 'dwfcknote') { + this.attr = matches[0]; + tag = 'blank'; + if (oDokuWiki_FCKEditorInstance.oinsertHtmlCodeObj.notes[matches[1]]) { + dwfck_note = '((' + oDokuWiki_FCKEditorInstance.oinsertHtmlCodeObj.notes[matches[1]] + '))'; + } + break; + } + } + } + + if (tag == 'pre') { + if (attrs[i].name == 'class') { + + var elems = attrs[i].escaped.split(/\s+/); + if (elems.length > 1) { + this.attr = attrs[i].value; + this.code_type = elems[0]; + } else { + this.attr = attrs[i].escaped; + this.code_type = this.attr; + } + if (this.downloadable_code) { + this.attr = this.attr.replace(/\s*code\s*/, ""); + this.code_type = 'file'; + } + HTMLParser_PRE = true; + if (this.in_table) tag = 'pre_td'; + break; + } + + } else if (tag == 'img') { + if (attrs[i].name == 'alt') { + alt = attrs[i].value; + } + if (attrs[i].name == 'type') { + this.image_link_type = attrs[i].value; + } + + if (attrs[i].name == 'src') { + // alert(attrs[i].name + ' = ' + attrs[i].value + ', fnencode=' + oDokuWiki_FCKEditorInstance.dwiki_fnencode); + + var src = ""; + // fetched by fetch.php + if (matches = attrs[i].escaped.match(/fetch\.php.*?(media=.*)/)) { + var elems = matches[1].split('='); + src = elems[1]; + if (matches = attrs[i].escaped.match(/(media.*)/)) { + var elems = matches[1].split('='); + var uri = elems[1]; + src = decodeURIComponent ? decodeURIComponent(uri) : unescape(uri); + } + if (!src.match(/https?:/) && !src.match(/^:/)) src = ':' + src; + } else if (attrs[i].escaped.match(/https?:\/\//)) { + src = attrs[i].escaped; + src = src.replace(/\?.*?$/, ""); + } + // url rewrite 1 + else if (matches = attrs[i].escaped.match(/\/_media\/(.*)/)) { + var elems = matches[1].split(/\?/); + src = elems[0]; + src = src.replace(/\//g, ':'); + if (!src.match(/^:/)) src = ':' + src; + } + // url rewrite 2 + else if (matches = attrs[i].escaped.match(/\/lib\/exe\/fetch.php\/(.*)/)) { + var elems = matches[1].split(/\?/); + src = elems[0]; + if (!src.match(/^:/)) src = ':' + src; + } else { + // first insertion from media mananger + matches = attrs[i].escaped.match(/^.*?\/userfiles\/image\/(.*)/); + if (!matches && typeof config_animal !== 'undefined') { + var regex = new RegExp(config_animal + '\/image\/(.*)$'); + matches = attrs[i].escaped.match(regex); + } + if (!matches) { // windows style + var regex = doku_base + 'data/media/'; + regex = regex.replace(/([\/\\])/g, "\\$1"); + regex = '^.*?' + regex + '(.*)'; + regex = new RegExp(regex); + matches = attrs[i].escaped.match(regex); + } + if (matches && matches[1]) { + src = matches[1].replace(/\//g, ':'); + src = ':' + src; + } else { + src = decodeURIComponent ? decodeURIComponent(attrs[i].escaped) : unescape(attrs[i].escaped); + if (src.search(/data:image.*?;base64/) > -1) { + from_clipboard = true; + } + } + + } + if (src && src.match(/lib\/images\/smileys/)) { + // src = 'http://' + window.location.host + src; + this.is_smiley = true; + } + this.attr = src; + if (this.attr && this.attr.match && this.attr.match(/%[a-fA-F0-9]{2}/)) { + this.attr = decodeURIComponent(safe_convert(this.attr)); + this.attr = decodeURIComponent(safe_convert(this.attr)); + } + + + + } // src end + else if (attrs[i].name == 'width' && !style) { + width = attrs[i].value; + + } else if (attrs[i].name == 'height' && !style) { + height = attrs[i].value; + } else if (attrs[i].name == 'style') { + var match = attrs[i].escaped.match(/width:\s*(\d+)/); + if (match) { + width = match[1]; + var match = attrs[i].escaped.match(/height:\s*(\d+)/); + if (match) height = match[1]; + } + } else if (attrs[i].name == 'align' || attrs[i].name == 'class') { + if (attrs[i].escaped.match(/(center|middle)/)) { + img_align = 'center'; + } else if (attrs[i].escaped.match(/right/)) { + img_align = 'right'; + } else if (attrs[i].escaped.match(/left/)) { + img_align = 'left'; + } else { + img_align = ''; + } + } + } // End img + } // End Attributes Loop + + if (this.is_smiley) { + if (alt) { + results += alt + ' '; + alt = ""; + } + this.is_smiley = false; + return; + } + if (this.link_only) tag = 'img'; + if (tag == 'br') { + if (this.in_multi_plugin) { + results += "\n"; + return; + } + + if (!this.code_type) { + HTMLParser_LBR = true; + } else if (this.code_type) { + results += "\n"; + return; + } + + if (this.in_table) { + results += HTMLParserParaInsert; + return; + } + if (this.list_started) { + results += '_LIST_EOFL_'; /* enables newlines in lists: abc \\def */ + } else { + results += '\\\\ '; + return; + } + } else if (tag.match(/^h(\d+|r)/)) { + var str_len = results.length; + if (tag.match(/h(\d+)/)) { + this.in_header = true; + } + if (str_len) { + if (results.charCodeAt(str_len - 1) == 32) { + results = results.replace(/\x20+$/, ""); + } + } + } else if (this.last_col_pipes) { + if (format_chars[tag]) results += markup[tag]; + tag = 'blank'; + } else if (dwfck_note) { + results += dwfck_note; + return; + } + + if (tag == 'b' || tag == 'i' && this.list_level) { + if (results.match(/(\/\/|\*)(\x20)+/)) { + results = results.replace(/(\/\/|\*)(\x20+)\-/, "$1\n" + "$2-"); + } + } + if(this.in_table && tag == 'li') { + // alert(tag); + } + if (tag == 'li' && this.list_level) { + if (this.list_level == 1 & !this.list_started) { + results += "\n"; + this.list_started = true; + } + results = results.replace(/[\x20]+$/, ""); + + for (var s = 0; s < this.list_level; s++) { + // this handles format characters at the ends of list lines + if (results.match(/_FORMAT_SPACE_\s*$/)) { + results = results.replace(/_FORMAT_SPACE_\s*$/, "\n"); + } + if (this.list_level > 1) { + results += ' '; + } + } + + if (this.prev_list_level > 0 && markup['li'] == markup['ol']) { + this.prev_list_level = -1; + } + } + if (tag == 'a' && this.list_level) { + HTMLLinkInList = true; + } + if (tag == 'a' && local_image) { + this.xcl_markup = true; + return; + } else if (tag == 'a' && (this.export_code || this.code_snippet)) { + return; + } else if (tag == 'a' && this.footnote) { + tag = 'fn_start'; + } else if (tag == 'a' && bottom_note) { + HTMLParserTopNotes.push(this.id); + } else if (tag == 'a' && this.external_mime) { + if (this.in_endnotes) { + this.link_class = 'media'; + return; + } + + if (media_class && media_class == 'mediafile') { + results += markup['img']; + results += this.attr + '|'; + this.is_mediafile = true; + } + + return; + } else if (this.in_font) { + if (tag == 'a') { + results = results.replace(/__STYLE__/, '[[' + this.attr + '|'); + this.in_font = false; + } + return; + /* */ + } + + if (this.in_endnotes && tag == 'a') return; + if (this.code_type && tag == 'span') tag = 'blank'; + if (this.mfile && !this.attr) { + this.attr = this.mfile; + } + results += markup[tag]; // Set tag + + if (tag == 'td' || tag == 'th' || (this.last_col_pipes && this.td_align == 'center')) { + if (this.is_rowspan) { + results += markup['row_span'] + ' | '; + this.is_rowspan = false; + } + if (this.td_align == 'center' || this.td_align == 'right') { + results += ' '; + } + + } else if (tag == 'a' && this.attr) { + this.attr = this.attr.replace(/%7c/, '%257c'); + results += this.attr + '|'; + } else if (tag == 'img') { + var link_type = this.image_link_type; + this.image_link_type = ""; + if (this.link_only) link_type = 'link_only'; + if (!link_type || from_clipboard) { + link_type = 'nolink'; + } else if (link_type == 'detail') { + link_type = ""; + } + + if (link_type == 'link_only') { + img_size = '?linkonly'; + } else if (link_type) { + img_size += link_type + '&'; + } + if (width && height) { + img_size += width + 'x' + height; + } else if (width) { + img_size += width; + } else if (!link_type) { + img_size = ""; + } + if (img_align && img_align != 'left') { + results += ' '; + } + this.attr += img_size; + if (img_align == 'center' || img_align == 'left') { + this.attr += ' '; + } + if (alt) { + results += this.attr + '|' + alt + '}}'; + } else results += this.attr + '}}'; + this.attr = 'src'; + } else if (tag == 'pre' || tag == 'pre_td') { + if (this.downloadable_file) this.attr += ' ' + this.downloadable_file; + if (!this.attr) this.attr = 'code'; + results += this.attr + '>'; + this.downloadable_file = ""; + this.downloadable_code = false; + } + + } // if markup tag + }, + + end: function(tag) { + + if (format_chars[tag] && (this.in_font || this.in_header)) { + results += " "; + if (tag == 'sup' || tag == 'sub' || tag == 'del' || tag == 'strike' || tag == 's') { + var t = 'temp_c' + tag; + } else var t = 'temp_' + tag; + results += markup[t]; + results += " "; + return; + } + if (this.in_endnotes && tag == 'a') return; + if (this.in_link && format_chars[current_tag] && this.link_formats.length) { + return; + } else if (tag == 'a' && !this.link_formats.length) this.in_link = false; + + if (this.link_only) { + this.link_only = false; + return; + } + + if (!markup[tag]) return; + + if (tag == 'sup' && this.attr == 'dwfcknote') { + return; + } + if (this.is_smiley) { + this.is_smiley = false; + if (tag != 'li') return; + } + if (tag == 'span' && this.in_font && !ckgedit_xcl_styles) { + tag = 'font'; + // + var font_str = '"; + var inherits = font_str.match(/(inherit)/g); + if (inherits && inherits.length < 3) HTMLParserFontInfix = true; + var font_start = results.lastIndexOf('__STYLE__'); + results = results.splice(font_start, 9, font_str); + results = results.replace(/_FORMAT_SPACE_, delete link markup + if (this.backup('\[\[', '\{')) return; + } + + if (this.end_nested) { + this.end_nested = false; + return; // prevent newline from being inserted between end of nested list and return to previous nested level + } + + if ((tag == 'ol' || tag == 'ul') && !this.in_table) { + this.list_level--; + if (!this.list_level) this.format_in_list = false; + if (this.prev_li.length) { + markup['li'] = this.prev_li.pop(); + this.end_nested = true; + return; + } + tag = "\n\n"; + } else if (tag == 'a' && this.external_mime) { + this.external_mime = false; + if (this.is_mediafile) { + tag = '}} '; + } else return; + + } else if (tag == 'pre') { + tag = markup_end[tag]; + if (this.code_type) { + tag += this.code_type + ">"; + } else { + var codeinx = results.lastIndexOf('code'); + var fileinx = results.lastIndexOf('file'); + if (fileinx > codeinx) { + this.code_type = 'file'; + } else this.code_type = 'code'; + tag += this.code_type + ">"; + } + this.code_type = false; + + } else if (markup_end[tag]) { + tag = markup_end[tag]; + } else if (this.attr == 'u' && tag == 'em') { + tag = 'u'; + } else if (tag == 'acronym') {} else { + tag = markup[tag]; + } + + if (current_tag == 'tr') { + if (this.last_col_pipes) { + tag = "\n"; + this.last_col_pipes = ""; + } + + if (this.td_rowspan && this.rowspan_col == this.td_no + 1) { + this.is_rowspan = false; + this.last_column = this.td_no; + this.td_rowspan--; + tag = '|' + markup['row_span'] + "|\n"; + } + } else if (current_tag == 'td' || current_tag == 'th') { + this.last_col_pipes = ""; + this.in_td = false; + } else if (current_tag.match(/h\d+/)) { + this.in_header = false; + } + + + if (markup['li']) { + if (results.match(/\n$/) && !this.list_level) { + tag = ""; + } + + } + + + if (this.in_endnotes && current_tag == 'sup') { + return + } + results += tag; + + if (format_chars[current_tag]) { + if (this.list_level) { + this.format_in_list = true; + HTMLFormatInList = true; + } + results += markup['format_space']; + HTMLParser_FORMAT_SPACE = markup['format_space']; + } + this.last_tag = current_tag; + + if (this.td_colspan && !useComplexTables) { + if (this.td_align == 'center') results += ' '; + var _colspan = "|"; + if (current_tag == 'th') + _colspan = '^'; + var colspan = _colspan; + for (var i = 1; i < this.td_colspan; i++) { + colspan += _colspan; + } + this.last_col_pipes = colspan; + results += colspan; + this.td_colspan = false; + } else if (this.td_align == 'center') { + results += ' '; + this.td_align = ''; + } + + if (current_tag == 'a' && this.link_formats.length) { + var end_str = results.substring(this.link_pos); + var start_str = results.substring(0, this.link_pos); + var start_format = ""; + var end_format = ""; + for (var i = 0; i < this.link_formats.length; i++) { + var fmt = markup[this.link_formats[i]]; + var endfmt = markup_end[this.link_formats[i]] ? markup_end[this.link_formats[i]] : fmt; + start_format += markup[this.link_formats[i]]; + end_format = endfmt + end_format; + } + + start_str += start_format; + end_str += end_format; + results = start_str + end_str; + this.link_formats = new Array(); + this.in_link = false; + } else if (current_tag == 'a') { + this.link_formats = new Array(); + this.in_link = false; + + } + }, + + chars: function(text) { + text = text.replace(/\t/g, " "); + if (this.code_type == 'code') { + text = text.replace(/(\n?|\s+)\\/gm, "$1CBL__Bksl"); + } + if (text.match(/~~START_HTML_BLOCK~~/)) { + text = text.replace(/~~START_HTML_BLOCK~~\n*/, "~~START_HTML_BLOCK~~\n\n"); + } + if (text.match(/~~CLOSE_HTML_BLOCK~~/)) { + text = text.replace(/~~CLOSE_HTML_BLOCK~~\n*/gm, "\n\n\n~~CLOSE_HTML_BLOCK~~\n\n"); + } + + /*interwiki frasl refactoring*/ + if (this.interwiki) { + // text = text.replace(String.frasl,"\/"); + } + if (this.interwiki && results.match(/>\w+\s*\|$/)) { + this.interwiki = false; + if (this.attr) { + results += text; + } else { + results = results.replace(/>\w+\s*\|$/, '>' + text); + } + return; + } + if (this.in_multi_plugin) { + text = text.replace('< ', '<'); + } + text = text.replace(/'/g, "'"); //replace single quote entities with single quotes + text = text.replace(/^(>)+/, function(match, quotes) { + return (match.replace(/(>)/g, "\__QUOTE__")); + }); + text = text.replace(/¬ags/g, '¬ags'); //replace ¬ entity in include notags param + //adjust spacing on multi-formatted strings + results = results.replace(/([\/\*_])_FORMAT_SPACE_([\/\*_]{2})_FORMAT_SPACE_$/, "$1$2@@_SP_@@"); + if (text.match(/^&\w+;/)) { + results = results.replace(/_FORMAT_SPACE_\s*$/, ""); // remove unwanted space after character entity + } + + if (this.link_only) { + if (text) { + replacement = '|' + text + '}} '; + results = results.replace(/\}\}\s*$/, replacement); + } + return; + } + if (!this.code_type) { + if (!this.last_col_pipes) { + text = text.replace(/\x20{6,}/, " "); + text = text.replace(/^( )+\s*$/, '_FCKG_BLANK_TD_'); + text = text.replace(/( )+/, ' '); + } + + if (this.format_tag) { + if (!this.list_started || this.in_table) text = text.replace(/^\s+/, '@@_SP_@@'); + } else if (this.last_tag == 'a') { + text = text.replace(/^\s{2,}/, " "); + } else if (!this.using_fonts) text = text.replace(/^\s+/, ''); + + if (text.match(/nowiki>/)) { + HTMLParser_NOWIKI = true; + } + + if (this.format_in_list || (HTMLParserFont && this.list_started)) { + text = text.replace(/^[\n\s]+$/g, ''); + if (text.match(/\n{2,}\s{1,}/)) { + text = text.replace(/\n{2,}/, "\n"); + } + } + + if (this.in_td && !text) { + // text = "_FCKG_BLANK_TD_"; + this.in_td = false; + } + } else { + text = text.replace(/<\s/g, '<'); + text = text.replace(/\s>/g, '>'); + var geshi = text.match(/^\s*geshi:\s+(.*)$/m); + if (geshi) { + results = results.replace(/<(code|file)>\s*$/, '<' + "$1" + ' ' + geshi[1] + '>'); + text = text.replace(geshi[0], ""); + } + + } + + + if (this.attr && this.attr == 'dwfcknote') { + if (text.match(/fckgL\d+/)) { + return; + } + if (text.match(/^[\-,:;!_]/)) { + results += text; + } else { + results += ' ' + text; + } + return; + } + + + + if (this.downloadable_code && (this.export_code || this.code_snippet)) { + this.downloadable_file = text; + return; + } + + /* remove space between link end markup and following punctuation */ + if (this.last_tag == 'a' && text.match(/^[\.,;\:\!]/)) { + results = results.replace(/\s$/, ""); + } + + if (this.in_header) { + text = text.replace(/---/g, '—'); + text = text.replace(/--/g, '–'); + } + if (this.list_started) { + results = results.replace(/_LIST_EOFL_\s*L_BR_K\s*$/, '_LIST_EOFL_'); + } + if (!this.code_type) { // keep special character literals outside of code block + // don't touch samba share or Windows path backslashes + if (!results.match(/\[\[\\\\.*?\|$/) && !text.match(/\w:(\\(\w?))+/)) { + if (!text.match(/\\\\[\w\.\-\_]+\\[\w\.\-\_]+/)) { + text = text.replace(/([\\])/g, '%%$1%%'); + } + text = text.replace(/([\*])/g, '_CKG_ASTERISK_'); + } + } + + if (this.in_endnotes && HTMLParserTopNotes.length) { + + if (text.match(/\w/) && !text.match(/^\s*\d\)\s*$/)) { + text = text.replace(/\)\s*$/, "_FN_PAREN_C_"); + var index = HTMLParserTopNotes.length - 1; + if (this.bottom_url) { + if (this.link_class && this.link_class == 'media') { + text = '{{' + this.bottom_url + '|' + text + '}}'; + } else text = '[[' + this.bottom_url + '|' + text + ']]'; + } + if (HTMLParserBottomNotes[HTMLParserTopNotes[index]]) { + text = text.replace('(', 'L_PARgr'); + text = text.replace(')', 'R_PARgr'); + HTMLParserBottomNotes[HTMLParserTopNotes[index]] += ' ' + text; + } else { + text = text.replace('(', 'L_PARgr'); + text = text.replace(')', 'R_PARgr'); + HTMLParserBottomNotes[HTMLParserTopNotes[index]] = text; + } + } + this.bottom_url = false; + return; + } + + + if (text && text.length) { + results += text; + } + // remove space between formatted character entity and following character string + results = results.replace(/(&\w+;)\s*([\*\/_]{2})_FORMAT_SPACE_(\w+)/, "$1$2$3"); + + if (this.list_level && this.list_level > 1) { + results = results.replace(/(\[\[.*?\]\])([ ]+[\*\-].*)$/, " $1\n$2"); + } + + try { // in case regex throws error on dynamic regex creation + var regex = new RegExp('([\*\/\_]{2,})_FORMAT_SPACE_([\*\/\_]{2,})(' + RegExp.escape(text) + ')$'); + if (results.match(regex)) { + // remove left-over space inside multiple format sequences + results = results.replace(regex, "$1$2$3"); + } + } catch (ex) {} + + if (!HTMLParserOpenAngleBracket) { + if (text.match(/</)) { + HTMLParserOpenAngleBracket = true; + } + } + }, + + comment: function(text) { + // results += ""; + }, + + dbg: function(text, heading) { + if (text.replace) { + text = text.replace(/^\s+/g, ""); + text = text.replace(/^\n$/g, ""); + text = text.replace(/&/g, "&").replace(//g, ">"); + if (!text) return; + } + if (heading) { + heading = '' + heading + "\n"; + } + HTMLParser_DEBUG += heading + text + "\n__________\n"; + } + + }); + + + /* + we allow escaping of troublesome characters in plugins by enclosing them withinback slashes, as in \*\ + the escapes are removed here together with any DW percent escapes + */ + + results = results.replace(/(\[\[\\\\)(.*?)\]\]/gm, function(match, brackets, block) { + block = block.replace(/\\/g, "_SMB_"); + return brackets + block + ']]'; + }); + + results = results.replace(/%%\\%%/g, '_ESC_BKSLASH_'); + results = results.replace(/%*\\%*([^\w\\]{1})%*\\%*/g, "$1"); + + results = results.replace(/_SMB_/g, "\\"); + + results = results.replace(/(\s*={2,}).*?CKGE_TMP_(\w+)(.*?).*?CKGE_TMP_c?\2.*?\1/gm, function(m, tag) { //remove formats from headers + m = m.replace(/CKGE_TMP_\w+/gm, ""); + var v = jQuery("#formatdel").val(); + if (!v) { + jQuery('#dw__editform').append(''); + } + return m; + }); + results = results.replace(/\s?(CKGE_TMP_\w+)\s?/gm, function(m, tag) { + if ($FORMAT_SUBST[tag]) return $FORMAT_SUBST[tag]; + return m; + }); + + results = results.replace(/(\s*={2,})(.*?)(\[\[|\{\{)(.*?)(\]\]|\}\})(.*?)\1/gm, function(m, h_markup, whatever, bracket_1, inner, bracket_2, end_str) { + end_str = end_str.replace(/\[\[(.*?)\|(.*?)\]\]/g, "$2"); + end_str = end_str.replace(/\{\{(.*?)\|(.*?)\}\}/g, "$2"); + m = h_markup + " " + whatever + " " + inner.replace(/.*?\|(.*?)/, "$1") + " " + end_str + " " + h_markup; + var v = jQuery("#formatdel").val(); + if (!v) { + jQuery('#dw__editform').append(''); + } + return m; + }); + + if (id == 'test') { + if (!HTMLParser_test_result(results)) return; + } + + results = results.replace(/\{ \{ rss>Feed:/mg, '{{rss>http://'); + results = results.replace(/\{ \{ rss>sFeed:/mg, '{{rss>https://') + results = results.replace(/~ ~ (NOCACHE|NOTOC)~ ~/mg, '~~' + "$1" + '~~'); + if (HTML_InterWiki) { + var ReplaceLinkMatch = function(tag, link) { + tag_1 = tag.replace(/oIWIKIo(.*)cIWIKIc/, "$1"); + if (tag_1 == link) return true; + link = link.replace(/\s/, '%20'); + return (link == tag_1); + }; + results = results.replace(/\[\[(\w+\.?\w{0,12})>(.*?)\|(.*?)\]\]/gm, function(match, id, iw_replace, link_text) { + if (iw_replace == 'oIWIKIocIWIKIc') iw_replace = link_text; + + if ((iw_replace == 'oIWIKIo' + link_text.replace(/\s/, '%20') + 'cIWIKIc') || (iw_replace == link_text) || ReplaceLinkMatch(iw_replace, link_text)) { + link_text = ""; + } else { + link_text = "|" + link_text; + } + + return ('[[' + id + '>' + iw_replace + link_text + ']]'); + }); + } + + results = results.replace(/>.*?oIWIKIo(.*?)cIWIKIc/mg, '>' + "$1"); + + if (HTMLParser_FORMAT_SPACE) { + if (HTMLParser_COLSPAN) { + results = results.replace(/\s*([\|\^]+)((\W\W_FORMAT_SPACE_)+)/gm, function(match, pipes, format) { + format = format.replace(/_FORMAT_SPACE_/g, ""); + return (format + pipes); + }); + } + results = results.replace(/"/g, '"'); + var regex = new RegExp(HTMLParser_FORMAT_SPACE + '([\\-]{2,})', "g"); + results = results.replace(regex, " $1"); + + results = results.replace(/\]\](\*\*|\/\/|\'\'|__|<\/del>)_FORMAT_SPACE_/, "]]$1@@_SP_@@"); + + var regex = new RegExp("(&|\\W|\\w|\\d)(\\*\\*|\\/\\/|\\'\\'|__|<\/del>)+" + HTMLParser_FORMAT_SPACE + '(\\w|\\d)', "g"); + results = results.replace(regex, "$1$2$3"); + + var regex = new RegExp(HTMLParser_FORMAT_SPACE + '@@_SP_@@', "g"); + results = results.replace(regex, ' '); + + //spacing around entities with double format characters + results = results.replace(/([\*\/_]{2})@@_SP_@@(&\w+;)/g, "$1 $2"); + + results = results.replace(/\n@@_SP_@@\n/g, ''); + results = results.replace(/@@_SP_@@\n/g, ''); + results = results.replace(/@@_SP_@@/g, ' '); + var regex = new RegExp(HTMLParser_FORMAT_SPACE + '([^\\)\\]\\}\\{\\-\\.,;:\\!\?"\x94\x92\u201D\u2019' + "'" + '])', "g"); + results = results.replace(regex, " $1"); + regex = new RegExp(HTMLParser_FORMAT_SPACE, "g"); + results = results.replace(regex, ''); + + if (HTMLFormatInList) { + /* removes extra newlines from lists */ + results = results.replace(/^(\s+[\-\*_]\s*)([\*\/_\']{2})(.*?)(\2)([^\n]*)\n+/gm, + function(match, list_type, format, text, list_type_close, rest) { + return (list_type + format + text + list_type_close + rest + "\n"); + }); + } + } + + /* Fixes for links in lists*/ + if (HTMLLinkInList) { + /*fix for links in lists at ends of lines, which cause loss of line-feeds + results = results.replace(/(\]\]|\}\})(\s+)(\*|-)/mg, + function(match,link,spaces,type) { + spaces = spaces.replace(/\n/,""); + return (link + "\n" + spaces+type); + }); + /*fix for links in lists before ends of lines, which cause extra line-feeds */ + results = results.replace(/(\*|-).*?(\[\[|\{\{).*?(\]\]|\}\})([\s\w\/\-\x3A-\x40\x5B-\x60\x7B-\x7F,;\>\<\&]+)\n\n/mg, + function(all, type, b, c, tail) { + all = all.replace(/[\n]$/, ""); + return (all); + }); + + } + + var line_break_final = "\\\\"; + if (HTMLParser_LBR) { + results = results.replace(/(L_BR_K)+/g, line_break_final); + results = results.replace(/L_BR_K/gm, line_break_final); + results = results.replace(/(\\\\)\s+/gm, "$1 \n"); + } + + if (HTMLParser_PRE) { + results = results.replace(/\s+<\/(code|file)>/g, "\n"); + if (HTMLParser_Geshi) { + results = results.replace(/\s+;/mg, ";"); + results = results.replace(/<\s+/mg, "<"); + results = results.replace(/\s+>/mg, ">"); + + } + } + + if (HTMLParser_TABLE) { + results += "\n" + line_break_final + "\n"; + var regex = new RegExp(HTMLParserParaInsert, "g"); + results = results.replace(regex, ' ' + line_break_final + ' '); + + // fix for colspans which have had text formatting which cause extra empty cells to be created + results = results.replace(/(\||\^)[ ]+(\||\^)\s$/g, "$1\n"); + results = results.replace(/(\||\^)[ ]+(\||\^)/g, "$1"); + } + // prevents valid empty td/th cells from being removed above + results = results.replace(/_FCKG_BLANK_TD_/g, " "); + + if (HTMLParserOpenAngleBracket) { + results = results.replace(/\/\/<\/\/\s*/g, '<'); + } + + if (HTMLParserFont) // HTMLParserFont start + { + + String.prototype.font_link_reconcile = function(v) { + + if (v == 1) { + regex = /\[\[(.*?)(]+>)([^<]+(\]\])?)[^\>]+\/font>\s*(\]\])/gm; + } else regex = /(\{]+>)\{\{(:?.*?)\|(:?.*?)<\/font>/gm; + + + return ( + this.replace( + regex, + function(m, a, b, c) { + a = a.replace(/\n/gm, ""); + a = a.replace(/\s/gm, ""); + a = a.replace(/[\[\]\{\}]/g, ""); + a = a.replace(/\|/g, ""); + c = c.replace(/\n/gm, ""); + // c = c.replace(/\s/gm, ""); + c = c.replace(/[\[\]\}\{]/g, ""); + if (v == 1) + c = '[[' + a + '|' + c + ']]'; + else c = '{{' + b + '|' + c + '}}'; + + var val = prompt(LANG.plugins.ckgedit.font_err_1 + "\n" + c + "\n" + LANG.plugins.ckgedit.font_err_2); + if (val == null) { + if (ckgedit_to_dwedit) { + ckgedit_to_dwedit = false; + return c; + } else throw new Error(LANG.plugins.ckgedit.font_err_throw); + } + if (val) return val; + return c; + } + ) + ); + } + if (HTMLParserFontInfix) { + results = results.replace(/<\/font>\s{1}/gm, ""); + } + + if (fontConflict()) { + if (confirm(LANG.plugins.ckgedit.font_conflict)) return; + var v = jQuery("#fontdel").val(); + if (!v) { + jQuery('#dw__editform').append(''); + } + } + results = results.font_link_reconcile(1); + results = results.font_link_reconcile(2); + + var regex = /\>\s+(\*\*|__|\/\/|'')\s+_\s+\1\s+<\/font>/gm; + results = results.replace(regex, function(m) { + m = m.replace(/\s+/g, ""); + return m; + }); + + results = results.replace(/\[\[(.*?)\|(]+>)(.*?)(<\/font>)\s*(\]\])\s*/gm, function(match, a, b, c) { + match = '[[' + a + '|' + c + ']]'; + var v = jQuery("#fontdel").val(); + if (!v) { + jQuery('#dw__editform').append(''); + } + return match; + }); + + results = results.replace(/(\s*={2,})\s*(.*?)(]+>)(.*?)(<\/font>)(.*?)\s*\1/gm, function(match) { + match = match.replace(/<\/font>/g, " "); + match = match.replace(//g, " "); + var v = jQuery("#formatdel").val(); + if (!v) { + jQuery('#dw__editform').append(''); + } + return match; + }); + + } // HTMLParserFont end + + if (HTMLParserTopNotes.length) { + results = results.replace(/\(\(\){2,}\s*<\/sup>/g, ""); + results = results.replace(/\(\(+(\d+)\)\)+/, "(($1))"); + for (var i in HTMLParserBottomNotes) { // re-insert DW's bottom notes at text level + var matches = i.match(/_(\d+)/); + var pattern = new RegExp('(\)*[\(]+' + matches[1] + '[\)]+(<\/sup>)*'); + HTMLParserBottomNotes[i] = HTMLParserBottomNotes[i].replace(/(\d+)_FN_PAREN_C_/, ""); + results = results.replace(pattern, '((' + HTMLParserBottomNotes[i].replace(/_FN_PAREN_C_/g, ") ") + '))'); + } + results = results.replace(/<\/sup>/g, ""); + results = results.replace(/((\(\(\d+\)\)\)?<\/sup>))/mg, function(fn) { + if (!fn.match(/p>\(\(\d+/)) { + return ""; + } + return fn; + }); + + } + + results = results.replace(/(={3,}.*?)(\{\{.*?\}\})(.*?={3,})/g, "$1$3\n\n$2"); + // remove any empty footnote markup left after section re-edits + results = results.replace(/()*\s*\[\[\s*\]\]\s*(<\/sup>)*\n*/g, ""); + // remove piled up sups with ((notes)) + + results = results.replace(/\s*\(\(\d+\)\)\s*<\/sup>/mg, ""); + + if (HTMLParser_MULTI_LINE_PLUGIN) { + results = results.replace(/<\s+/g, '<'); + results = results.replace(/<\s+/g, '<'); + } + + if (HTMLParser_NOWIKI) { + /* any characters escaped by DW %%%% are replaced by NOWIKI_ + is restored in save.php + */ + var nowiki_escapes = '%'; //this technique allows for added chars to attach to NOWIKI_$1_ + var regex = new RegExp('([' + nowiki_escapes + '])', "g"); + + results = results.replace(/(<nowiki>)(.*?)(<\/nowiki>)/mg, + function(all, start, mid, close) { + mid = mid.replace(/%%(.)%%/mg, "NOWIKI_$1_"); + return start + mid.replace(regex, "NOWIKI_$1_") + close; + }); + } + + results = results.replace(/__SWF__(\s*)\[*/g, "{{$1"); + results = results.replace(/\|.*?\]*(\s*)__FWS__/g, "$1}}"); + results = results.replace(/(\s*)__FWS__/g, "$1}}"); + results = results.replace(/\n{3,}/g, '\n\n'); + results = results.replace(/_LIST_EOFL_/gm, " " + line_break_final + " "); + + if (useComplexTables) { + if (results.indexOf('~~COMPLEX_TABLES~~') == -1) { + results += "~~COMPLEX_TABLES~~\n"; + } + } + if (!useComplexTables) { + results = results.replace(/~~COMPLEX_TABLES~~/gm, ""); + } + results = results.replace(/_CKG_ASTERISK_/gm, '*'); + results = results.replace(/_ESC_BKSLASH_/g, '\\'); + results = results.replace(/divalNLine/gm, "\n"); + if (id == 'test') { + if (HTMLParser_test_result(results)) { + alert(results); + } + return; + } + + var dwform = GetE('dw__editform'); + dwform.elements.fck_wikitext.value = results; + + if (id == 'bakup') { + return; + } + if (id) { + var dom = GetE(id); + dom.click(); + return true; + } +} + +jQuery(document).ready(function() { + var edit__summary = false; + jQuery(document).on("keydown", "input#edit__summary", function(e) { + if (e.which == 13) { + edit__summary = true; + jQuery("#save_button").trigger("mousedown"); + } + }); + + jQuery("#ebut_test").mousedown(function() { + parse_wikitext('test'); + }); + + jQuery("#ebtn__delete").click(function() { + if (edit__summary) { + edit__summary = false; + return; + } + return confirm(JSINFO['confirm_delete']); + }); + + jQuery("#ebtn__delete").mouseup(function() { + draft_delete(); + }); + + jQuery("#ebtn__dwedit").click(function() { + ckgedit_to_dwedit = true; + setDWEditCookie(2, this); + parse_wikitext('edbtn__save'); + this.form.submit(); + }); + + jQuery("#ebtn__fbswitch").click(function() { + if (getCookie('ckgFbOpt') == 'dokuwiki') { + document.cookie = 'ckgFbOpt=ckgedit;SameSite=Lax'; + } else { + document.cookie = 'ckgFbOpt=dokuwiki;SameSite=Lax'; + } + parse_wikitext('edbtn__save'); + this.form.submit(); + }); + + jQuery("#ckgedit_draft_btn").click(function() { + ckgedit_get_draft(); + }); + jQuery("#backup_button").click(function() { + renewLock(true); + }); + jQuery("#revert_to_prev_btn").click(function() { + revert_to_prev(); + }); + + jQuery("#no_styling_btn").click(function() { + this.form.styling.value = "no_styles"; + this.form.prefix.value = ""; + this.form.suffix.value = ""; + this.form.rev.value = ""; + }); + + jQuery("#ebut_cancel").mouseup(function() { + if (this.form.template && this.form.template.value == 'tpl') return; + if (window.dwfckTextChanged) return; + draft_delete(); + }); + jQuery("#save_button").mousedown(function() { + if (this.form.template && this.form.template.value == 'tpl') window.dwfckTextChanged = true; + if (!window.dwfckTextChanged && !JSINFO['cg_rev']) { + ckgedit_dwedit_reject = true; + parse_wikitext('ebut_cancel'); + } else { + parse_wikitext('edbtn__save'); + } + }); +}); \ No newline at end of file diff --git a/lib/plugins/ckgedit/scripts/safeFN_class-cmpr.js b/lib/plugins/ckgedit/scripts/safeFN_class-cmpr.js new file mode 100644 index 0000000..8686560 --- /dev/null +++ b/lib/plugins/ckgedit/scripts/safeFN_class-cmpr.js @@ -0,0 +1 @@ +var SafeFN={plain:"-./[_0123456789abcdefghijklmnopqrstuvwxyz",pre_indicator:"%",post_indicator:"]",changeSafeBase:function(a,c,b){if(isNaN(c)||c<2||c>36||isNaN(b)||b<2||b>36){throw (new RangeError("Illegal radix. Radices must be integers between 2 and 36, inclusive."))}a=parseInt(a,c);if(c==36){return a}return a.toString(b)},get_u_array:function(b){var c=new Array();for(var a=0;a>6))+this.chr(128+(a&63))}if(a<65536){return this.chr(224+(a>>12))+this.chr(128+((a>>6)&63))+this.chr(128+(a&63))}if(a<2097152){return this.chr(240+(a>>18))+this.chr(128+((a>>12)&63))+this.chr(128+((a>>6)&63))+this.chr(128+(a&63))}},_utf8Decode:function(g){var f=new Array();var e,b,a,h,c=0;for(var d=0;d127){b=g.charCodeAt(d++)}if(e>223){a=g.charCodeAt(d++)}if(e>239){h=g.charCodeAt(d++)}if(e<128){f[c++]=this.chr(e)}else{if(e<224){f[c++]=this.chr(((e-192)<<6)+(b-128))}else{if(e<240){f[c++]=this.chr(((e-224)<<12)+((b-128)<<6)+(a-128))}else{f[c++]=this.chr(((e-240)<<18)+((b-128)<<12)+((a-128)<<6)+(h-128))}}}}return f.join("")},utf8Decode:function(d){var c=new Array();var e=0;var a="";var b=0;while((e=d.search(/[^\x00-\x7F]/))!=-1){a=d.match(/([^\x00-\x7F]+[\x00-\x7F]{0,10})+/)[0];c[b++]=d.substr(0,e)+this._utf8Decode(a);d=d.substr(e+a.length)}c[b++]=d;return c.join("")}};function SafeFN_encode(a){return SafeFN.encode(a)}function SafeFN_decode(a){return SafeFN.decode(a)}function dwikiUTF8_encodeFN(a,b){if(b=="utf-8"){return a}if(a.match(/^[a-zA-Z0-9\/_\-\.%\]]+$/)){return a}if(b=="safe"){return SafeFN_encode(a)}a=encodeURIComponent(a);a=a.replace(/%2F/g,"/");return a}function dwikiUTF8_decodeFN(a,b){if(b=="utf-8"){return a}if(b=="safe"){return SafeFN_decode(a)}return decodeURIComponent(a)}; \ No newline at end of file diff --git a/lib/plugins/ckgedit/scripts/safeFN_class.js b/lib/plugins/ckgedit/scripts/safeFN_class.js new file mode 100644 index 0000000..17dd00c --- /dev/null +++ b/lib/plugins/ckgedit/scripts/safeFN_class.js @@ -0,0 +1,273 @@ + /** + * Upgraded + * !!Do not modify the above line!! + */ + /** + * SafeFN is a Javascript implementation of Christopher Smith's php + * SafeFN class which was written for Dokuwiki + * + * @author Myron Turner + * @copyright Myron Turner (C) GPL 2 or greater + */ + +var SafeFN = { + plain: '-./[_0123456789abcdefghijklmnopqrstuvwxyz', // these characters aren't converted + pre_indicator: '%', + post_indicator:']', + + /** + * convert numbers from base 10 to base 36 and base 36 to base 10 + * + * @param string representing an integer or integer num number to be converted + * @param integer from base from which to convert + * @param integer to base to which to convert + * + * @return array int an array of unicode codepoints + * + * @author Myron Turner + */ + + changeSafeBase: function(num, from, to) { + if(isNaN(from) || from < 2 || from > 36 || isNaN(to) || to < 2 || to > 36) { + throw (new RangeError("Illegal radix. Radices must be integers between 2 and 36, inclusive.")); + } + num = parseInt(num, from); + if(from == 36) return num; + return num.toString(to); + }, + + + /** + * convert a UTF8 string into an array of unicode code points + * + * @param UTF8 string + * @return array int an array of unicode codepoints + * + * @author Myron Turner + */ + + get_u_array: function(utf8str) { + var unicode_array = new Array(); + for (var i=0; i + * @author Myron Turner + */ + safe_to_unicode: function(safe) { + var unicode = new Array(); + var regex = new RegExp('(?=[' + this.pre_indicator + '\\' + this.post_indicator + '])'); + var split_array = safe.split(regex); + var converted = false; + + for (var i = 0; i + * @author Myron Turner + */ + unicode_to_safe: function (unicode) { + var safe = ''; + var converted = false; + var plain_str = this.plain + this.post_indicator; + + for (var i=0; i< unicode.length; i++) { + codepoint = unicode[i]; + var match = ''; + if(String.fromCharCode(codepoint) != '\\') { + var regex = new RegExp(String.fromCharCode(codepoint)); + var match = plain_str.match(regex); + } + + if (codepoint < 127 && match) { + if (converted) { + safe += this.post_indicator; + converted = false; + } + safe += String.fromCharCode(codepoint); + + } else if (codepoint == this.pre_indicator.charCodeAt(0)) { + safe += this.pre_indicator; + converted = true; + } else { + safe += this.pre_indicator + this.changeSafeBase((codepoint-32), 10, 36); + converted = true; + } + } + if(converted) safe += this.post_indicator; + + return safe; + }, + + /** + * Convert an UTF-8 string to a safe ASCII String + * + * + * @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 Myron Turner + */ + encode: function(filename) { + return this.unicode_to_safe(this.get_u_array(filename)); + }, + + /** + * decode a 'safe' encoded file name and return a UTF8 string + * + * @param string filename a 'safe' encoded ASCII string, + * @return string decoded utf8 string + * + * @author Myron Turner + */ + + decode: function (filename) { + var unic = this.safe_to_unicode(filename); + + // convert unicode code points to utf8 + var str = new Array(); + for (var i=0; i < unic.length; i++) { + str[i] = this.code2utf(unic[i]); + } + // return the decoded string + return this.utf8Decode(str.join('')); + }, + +/* UTF8 encoding/decoding functions + * Copyright (c) 2006 by Ali Farhadi. + * released under the terms of the Gnu Public License. + * see the GPL for details. + * + * Email: ali[at]farhadi[dot]ir + * Website: http://farhadi.ir/ + */ + +//an alias of String.fromCharCode +chr: function (code) +{ + return String.fromCharCode(code); +}, + +//returns utf8 encoded charachter of a unicode value. +//code must be a number indicating the Unicode value. +//returned value is a string between 1 and 4 charachters. +code2utf: function (code) +{ + if (code < 128) return this.chr(code); + if (code < 2048) return this.chr(192+(code>>6)) + this.chr(128+(code&63)); + if (code < 65536) return this.chr(224+(code>>12)) + this.chr(128+((code>>6)&63)) + this.chr(128+(code&63)); + if (code < 2097152) return this.chr(240+(code>>18)) + this.chr(128+((code>>12)&63)) + this.chr(128+((code>>6)&63)) + this.chr(128+(code&63)); +}, + +//it is a private function for internal use in utf8Decode function +_utf8Decode: function (utf8str) +{ + + var str = new Array(); + var code,code2,code3,code4,j = 0; + for (var i=0; i 127) code2 = utf8str.charCodeAt(i++); + if (code > 223) code3 = utf8str.charCodeAt(i++); + if (code > 239) code4 = utf8str.charCodeAt(i++); + + if (code < 128) str[j++]= this.chr(code); + else if (code < 224) str[j++] = this.chr(((code-192)<<6) + (code2-128)); + else if (code < 240) str[j++] = this.chr(((code-224)<<12) + ((code2-128)<<6) + (code3-128)); + else str[j++] = this.chr(((code-240)<<18) + ((code2-128)<<12) + ((code3-128)<<6) + (code4-128)); + + } + return str.join(''); +}, + +//Decodes a UTF8 formated string +utf8Decode: function (utf8str) +{ + var str = new Array(); + var pos = 0; + var tmpStr = ''; + var j=0; + while ((pos = utf8str.search(/[^\x00-\x7F]/)) != -1) { + tmpStr = utf8str.match(/([^\x00-\x7F]+[\x00-\x7F]{0,10})+/)[0]; + str[j++]= utf8str.substr(0, pos) + this._utf8Decode(tmpStr); + utf8str = utf8str.substr(pos + tmpStr.length); + } + + str[j++] = utf8str; + return str.join(''); +} + +}; + +function SafeFN_encode(filename) { + return SafeFN.encode(filename); +} + +function SafeFN_decode(filename) { + return SafeFN.decode(filename); +} + + +function dwikiUTF8_encodeFN(file, encoding){ + + if(encoding == 'utf-8') return file; + + if(file.match(/^[a-zA-Z0-9\/_\-\.%\]]+$/)){ + return file; + } + + if(encoding == 'safe'){ + return SafeFN_encode(file); + } + + file = encodeURIComponent(file); + file = file.replace(/%2F/g,'/'); + return file; +} + + +function dwikiUTF8_decodeFN(file, encoding){ + + if(encoding == 'utf-8') return file; + + if(encoding == 'safe'){ + return SafeFN_decode(file); + } + + return decodeURIComponent(file); +} diff --git a/lib/plugins/ckgedit/scripts/safeFN_cmpr.js b/lib/plugins/ckgedit/scripts/safeFN_cmpr.js new file mode 100644 index 0000000..8686560 --- /dev/null +++ b/lib/plugins/ckgedit/scripts/safeFN_cmpr.js @@ -0,0 +1 @@ +var SafeFN={plain:"-./[_0123456789abcdefghijklmnopqrstuvwxyz",pre_indicator:"%",post_indicator:"]",changeSafeBase:function(a,c,b){if(isNaN(c)||c<2||c>36||isNaN(b)||b<2||b>36){throw (new RangeError("Illegal radix. Radices must be integers between 2 and 36, inclusive."))}a=parseInt(a,c);if(c==36){return a}return a.toString(b)},get_u_array:function(b){var c=new Array();for(var a=0;a>6))+this.chr(128+(a&63))}if(a<65536){return this.chr(224+(a>>12))+this.chr(128+((a>>6)&63))+this.chr(128+(a&63))}if(a<2097152){return this.chr(240+(a>>18))+this.chr(128+((a>>12)&63))+this.chr(128+((a>>6)&63))+this.chr(128+(a&63))}},_utf8Decode:function(g){var f=new Array();var e,b,a,h,c=0;for(var d=0;d127){b=g.charCodeAt(d++)}if(e>223){a=g.charCodeAt(d++)}if(e>239){h=g.charCodeAt(d++)}if(e<128){f[c++]=this.chr(e)}else{if(e<224){f[c++]=this.chr(((e-192)<<6)+(b-128))}else{if(e<240){f[c++]=this.chr(((e-224)<<12)+((b-128)<<6)+(a-128))}else{f[c++]=this.chr(((e-240)<<18)+((b-128)<<12)+((a-128)<<6)+(h-128))}}}}return f.join("")},utf8Decode:function(d){var c=new Array();var e=0;var a="";var b=0;while((e=d.search(/[^\x00-\x7F]/))!=-1){a=d.match(/([^\x00-\x7F]+[\x00-\x7F]{0,10})+/)[0];c[b++]=d.substr(0,e)+this._utf8Decode(a);d=d.substr(e+a.length)}c[b++]=d;return c.join("")}};function SafeFN_encode(a){return SafeFN.encode(a)}function SafeFN_decode(a){return SafeFN.decode(a)}function dwikiUTF8_encodeFN(a,b){if(b=="utf-8"){return a}if(a.match(/^[a-zA-Z0-9\/_\-\.%\]]+$/)){return a}if(b=="safe"){return SafeFN_encode(a)}a=encodeURIComponent(a);a=a.replace(/%2F/g,"/");return a}function dwikiUTF8_decodeFN(a,b){if(b=="utf-8"){return a}if(b=="safe"){return SafeFN_decode(a)}return decodeURIComponent(a)}; \ No newline at end of file diff --git a/lib/plugins/ckgedit/scripts/setsamesite.php b/lib/plugins/ckgedit/scripts/setsamesite.php new file mode 100644 index 0000000..aafb5cd --- /dev/null +++ b/lib/plugins/ckgedit/scripts/setsamesite.php @@ -0,0 +1,22 @@ += 7.3 (when we get there) + * From: https://github.com/GoogleChromeLabs/samesite-examples/blob/master/php.md and https://stackoverflow.com/a/46971326/2308553 + */ + function setcookieSameSite($name, $value, $expire=0, $path ='/', $domain="", $httponly="HttpOnly", $secure=false, $samesite="Lax") + { + if (PHP_VERSION_ID < 70300) { + setcookie($name, $value, $expire, "$path; samesite=$samesite", $domain, $secure, $httponly); + } + else { + setcookie($name, $value, [ + 'expires' => $expire, + 'path' => $path, + 'domain' => $domain, + 'samesite' => $samesite, + 'secure' => $secure, + 'httponly' => $httponly, + ]); + } + } +?> diff --git a/lib/plugins/ckgedit/scripts/table_debugging_code.js.unc b/lib/plugins/ckgedit/scripts/table_debugging_code.js.unc new file mode 100644 index 0000000..843c772 --- /dev/null +++ b/lib/plugins/ckgedit/scripts/table_debugging_code.js.unc @@ -0,0 +1,51 @@ + var this_debug; + + function show_rowspans(rows) { + + if(!useComplexTables) return; + var str = ""; + + for(var i=0; i < rows.length; i++) { + str+="ROW" + i + "\n"; + + for(var col=0; col + diff --git a/lib/plugins/ckgedit/style.css b/lib/plugins/ckgedit/style.css new file mode 100644 index 0000000..01bc5e5 --- /dev/null +++ b/lib/plugins/ckgedit/style.css @@ -0,0 +1,5 @@ +.backup_msg_area { color: __text_alt__; font-size:9pt; text-align:center; } +.backup_msg_close { font-size:9pt; } +.backup_msg { background-color: __background_alt__; text-align:center; height: 14pt;} +.editButtons { margin-top: 5px; } +.editButtons input { margin-bottom: 5px; } diff --git a/lib/plugins/ckgedit/syntax/font.php b/lib/plugins/ckgedit/syntax/font.php new file mode 100644 index 0000000..66c3278 --- /dev/null +++ b/lib/plugins/ckgedit/syntax/font.php @@ -0,0 +1,98 @@ + + */ + +// Syntax: + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); +require_once(DOKU_PLUGIN.'syntax.php'); + +/** + * All DokuWiki plugins to extend the parser/rendering mechanism + * need to inherit from this class + */ +class syntax_plugin_ckgedit_font extends DokuWiki_Syntax_Plugin { + + + + function getType(){ return 'formatting'; } + function getAllowedTypes() { return array('formatting', 'substition', 'disabled'); } + function getSort(){ return 158; } + function connectTo($mode) { $this->Lexer->addEntryPattern('(?=.*?)',$mode,'plugin_ckgedit_font'); } + function postConnect() { $this->Lexer->addExitPattern('','plugin_ckgedit_font'); } + + + /** + * Handle the match + */ + function handle($match, $state, $pos, Doku_Handler $handler){ + + + switch ($state) { + case DOKU_LEXER_ENTER : + list($size, $face) = preg_split("/\//u", substr($match, 6, -1), 2); + if(isset($size) && strpos($size,':') !== false) { + list($size,$weight) = explode(':',$size); + $size = "font-size:$size;"; + if(isset($weight) && $weight) { + list($weight,$fstyle) = explode(',',$weight); + $size .= " font-weight:$weight; "; + if($fstyle) $size .= " font-style:$fstyle; "; + } + + } + else $size = "font-size:$size;"; + return array($state, array($size, $face)); + + case DOKU_LEXER_UNMATCHED : return array($state, $match); + case DOKU_LEXER_EXIT : return array($state, ''); + } + return array(); + } + + /** + * Create output + */ + function render($mode, Doku_Renderer $renderer, $data) { + if($mode == 'xhtml'){ + list($state, $match) = $data; + + switch ($state) { + case DOKU_LEXER_ENTER : + list($style, $face) = $match; + if(isset($face)) { + list($face,$fg,$bg) = explode(';;',$face); + if(isset($fg)) { + $color = " color: $fg; "; + $style .= $color; + + } + if(isset($bg)) { + $color = " background-color: $bg "; + $style .= $color; + + } + + } + $style = "font-family: $face; $style"; + $renderer->doc .= ""; + break; + + case DOKU_LEXER_UNMATCHED : $renderer->doc .= $renderer->_xmlEntities($match); break; + case DOKU_LEXER_EXIT : $renderer->doc .= ""; break; + } + return true; + } + return false; + } + + +} +?> diff --git a/lib/plugins/ckgedit/syntax/specials.php b/lib/plugins/ckgedit/syntax/specials.php new file mode 100644 index 0000000..f859500 --- /dev/null +++ b/lib/plugins/ckgedit/syntax/specials.php @@ -0,0 +1,123 @@ + +*/ + +// must be run within Dokuwiki +if(!defined('DOKU_INC')) die(); + +if(!defined('DOKU_PLUGIN')) define('DOKU_PLUGIN',DOKU_INC.'lib/plugins/'); +require_once(DOKU_PLUGIN.'syntax.php'); +//define ('CKGEDIT_IMAGES', DOKU_URL . 'lib/plugins/ckgedit/images/'); +//define ('CK_IMG_PATH',DOKU_INC . 'lib/plugins/ckgedit/images/'); +if(!defined('DOKU_LF')) define ('DOKU_LF',"\n"); +if(!defined('DOKU_TAB')) define ('DOKU_TAB',"\t"); + +/** + * All DokuWiki plugins to extend the parser/rendering mechanism + * need to inherit from this class + */ +class syntax_plugin_ckgedit_specials extends DokuWiki_Syntax_Plugin { + + + /** + * What kind of syntax are we? + */ + function getType(){ + return 'substition'; + } + + /** + * What about paragraphs? + */ + + function getPType(){ + // return 'stack'; + return 'block'; + } + + /** + * Where to sort in? + */ + function getSort(){ + return 155; + } + + + /** + * Connect pattern to lexer + */ + function connectTo($mode) { + + $this->Lexer->addSpecialPattern('~~MULTI_PLUGIN_OPEN~~',$mode,'plugin_ckgedit_specials'); + $this->Lexer->addSpecialPattern('~~MULTI_PLUGIN_CLOSE~~',$mode,'plugin_ckgedit_specials'); + $this->Lexer->addSpecialPattern('~~COMPLEX_TABLES~~',$mode,'plugin_ckgedit_specials'); + $this->Lexer->addSpecialPattern('~~NO_STYLING~~',$mode,'plugin_ckgedit_specials'); + $this->Lexer->addEntryPattern('~~START_HTML_BLOCK~~(?=.*?~~CLOSE_HTML_BLOCK~~)',$mode,'plugin_ckgedit_specials'); + $this->Lexer->addSpecialPattern('~~AUTO_INTERNAL_LINKS~~',$mode,'plugin_ckgedit_specials'); + + + } + function postConnect() { $this->Lexer->addExitPattern('~~CLOSE_HTML_BLOCK~~','plugin_ckgedit_specials'); } + + /** + * Handle the match + */ + function handle($match, $state, $pos, Doku_Handler $handler){ + + $class = ""; + $xhtml = ""; + switch($state) { + case DOKU_LEXER_SPECIAL: + if(preg_match('/OPEN/', $match)) { + return array($state, "" ); + } + elseif(preg_match('/CLOSE/', $match)) { + return array($state, "" ); + } + elseif(preg_match('/(TABLES|STYLING|AUTO_INTERNAL)/', $match)) { + return array($state, "" ); + } + case DOKU_LEXER_ENTER : return array($state, ''); + case DOKU_LEXER_UNMATCHED : + $match = str_replace('
    ',"",$match); + $match = preg_replace('/<\/?code>/ms',"",$match); + return array($state, $match); + case DOKU_LEXER_EXIT : return array($state, ''); + } + return array($state, "" ); + + } + + /** + * Create output + */ + function render($mode, Doku_Renderer $renderer, $data) { + if($mode == 'xhtml'){ + list($state, $xhtml) = $data; + switch ($state) { + case DOKU_LEXER_SPECIAL: + $renderer->doc .= DOKU_LF . $xhtml . DOKU_LF; + return true; + case DOKU_LEXER_ENTER : $renderer->doc .= ""; break; + case DOKU_LEXER_UNMATCHED : + $renderer->doc .= $xhtml; break; + case DOKU_LEXER_EXIT : $renderer->doc .= ""; break; + } + return true; + } + return false; + } + + function write_debug($what) { + $handle = fopen("blog_pats.txt", "a"); + fwrite($handle,"$what\n"); + fclose($handle); + } +} + + diff --git a/lib/plugins/ckgedit/version b/lib/plugins/ckgedit/version new file mode 100644 index 0000000..bb2d317 --- /dev/null +++ b/lib/plugins/ckgedit/version @@ -0,0 +1,2 @@ +current_23-Jul_27-08_47 + diff --git a/lib/plugins/cli.php b/lib/plugins/cli.php new file mode 100644 index 0000000..e75f700 --- /dev/null +++ b/lib/plugins/cli.php @@ -0,0 +1,9 @@ + + * @author Ben Coburn + */ + +use dokuwiki\Extension\AdminPlugin; +use dokuwiki\plugin\config\core\Configuration; +use dokuwiki\plugin\config\core\Setting\Setting; +use dokuwiki\plugin\config\core\Setting\SettingFieldset; +use dokuwiki\plugin\config\core\Setting\SettingHidden; + +/** + * All DokuWiki plugins to extend the admin function + * need to inherit from this class + */ +class admin_plugin_config extends AdminPlugin +{ + protected const IMGDIR = DOKU_BASE . 'lib/plugins/config/images/'; + + /** @var Configuration */ + protected $configuration; + + /** @var bool were there any errors in the submitted data? */ + protected $hasErrors = false; + + /** @var bool have the settings translations been loaded? */ + protected $promptsLocalized = false; + + + /** + * handle user request + */ + public function handle() + { + global $ID, $INPUT; + + // always initialize the configuration + $this->configuration = new Configuration(); + + if (!$INPUT->bool('save') || !checkSecurityToken()) { + return; + } + + // don't go any further if the configuration is locked + if ($this->configuration->isLocked()) return; + + // update settings and redirect of successful + $ok = $this->configuration->updateSettings($INPUT->arr('config')); + if ($ok) { // no errors + try { + if ($this->configuration->hasChanged()) { + $this->configuration->save(); + } else { + $this->configuration->touch(); + } + msg($this->getLang('updated'), 1); + } catch (Exception $e) { + msg($this->getLang('error'), -1); + } + send_redirect(wl($ID, ['do' => 'admin', 'page' => 'config'], true, '&')); + } else { + $this->hasErrors = true; + msg($this->getLang('error'), -1); + } + } + + /** + * output appropriate html + */ + public function html() + { + $allow_debug = $GLOBALS['conf']['allowdebug']; // avoid global $conf; here. + global $lang; + global $ID; + + $this->setupLocale(true); + + echo $this->locale_xhtml('intro'); + + echo '
    '; + + if ($this->configuration->isLocked()) { + echo '
    ' . $this->getLang('locked') . '
    '; + } + + // POST to script() instead of wl($ID) so config manager still works if + // rewrite config is broken. Add $ID as hidden field to remember + // current ID in most cases. + echo '
    '; + echo '
    '; + formSecurityToken(); + $this->printH1('dokuwiki_settings', $this->getLang('_header_dokuwiki')); + + $in_fieldset = false; + $first_plugin_fieldset = true; + $first_template_fieldset = true; + foreach ($this->configuration->getSettings() as $setting) { + if ($setting instanceof SettingHidden) { + continue; + } elseif ($setting instanceof SettingFieldset) { + // config setting group + if ($in_fieldset) { + echo ''; + echo '
    '; + echo ''; + } else { + $in_fieldset = true; + } + if ($first_plugin_fieldset && $setting->getType() == 'plugin') { + $this->printH1('plugin_settings', $this->getLang('_header_plugin')); + $first_plugin_fieldset = false; + } elseif ($first_template_fieldset && $setting->getType() == 'template') { + $this->printH1('template_settings', $this->getLang('_header_template')); + $first_template_fieldset = false; + } + echo '
    '; + echo '' . $setting->prompt($this) . ''; + echo '
    '; + echo ''; + } else { + // config settings + [$label, $input] = $setting->html($this, $this->hasErrors); + + $class = $setting->isDefault() + ? ' class="default"' + : ($setting->isProtected() ? ' class="protected"' : ''); + $error = $setting->hasError() + ? ' class="value error"' + : ' class="value"'; + $icon = $setting->caution() + ? '' + : ''; + + echo ''; + echo ''; + echo '' . $input . ''; + echo ''; + } + } + + echo '
    '; + echo '' . $setting->getPrettyKey() . ''; + echo $icon . $label; + echo '
    '; + echo '
    '; + if ($in_fieldset) { + echo '
    '; + } + + // show undefined settings list + $undefined_settings = $this->configuration->getUndefined(); + if ($allow_debug && !empty($undefined_settings)) { + /** + * Callback for sorting settings + * + * @param Setting $a + * @param Setting $b + * @return int if $a is lower/equal/higher than $b + */ + function settingNaturalComparison($a, $b) + { + return strnatcmp($a->getKey(), $b->getKey()); + } + + usort($undefined_settings, 'settingNaturalComparison'); + $this->printH1('undefined_settings', $this->getLang('_header_undefined')); + echo '
    '; + echo '
    '; + echo ''; + foreach ($undefined_settings as $setting) { + [$label, $input] = $setting->html($this); + echo ''; + echo ''; + echo ''; + echo ''; + } + echo '
    ' . $label . '' . $input . '
    '; + echo '
    '; + echo '
    '; + } + + // finish up form + echo '

    '; + echo ''; + echo ''; + + if (!$this->configuration->isLocked()) { + echo ''; + echo ''; + echo ''; + } + + echo '

    '; + + echo ''; + echo '
    '; + } + + /** + * @param bool $prompts + */ + public function setupLocale($prompts = false) + { + parent::setupLocale(); + if (!$prompts || $this->promptsLocalized) return; + $this->lang = array_merge($this->lang, $this->configuration->getLangs()); + $this->promptsLocalized = true; + } + + /** + * Generates a two-level table of contents for the config plugin. + * + * @author Ben Coburn + * + * @return array + */ + public function getTOC() + { + $this->setupLocale(true); + + $allow_debug = $GLOBALS['conf']['allowdebug']; // avoid global $conf; here. + $toc = []; + $check = false; + + // gather settings data into three sub arrays + $labels = ['dokuwiki' => [], 'plugin' => [], 'template' => []]; + foreach ($this->configuration->getSettings() as $setting) { + if ($setting instanceof SettingFieldset) { + $labels[$setting->getType()][] = $setting; + } + } + + // top header + $title = $this->getLang('_configuration_manager'); + $toc[] = html_mktocitem(sectionID($title, $check), $title, 1); + + // main entries + foreach (['dokuwiki', 'plugin', 'template'] as $section) { + if (empty($labels[$section])) continue; // no entries, skip + + // create main header + $toc[] = html_mktocitem( + $section . '_settings', + $this->getLang('_header_' . $section), + 1 + ); + + // create sub headers + foreach ($labels[$section] as $setting) { + /** @var SettingFieldset $setting */ + $name = $setting->prompt($this); + $toc[] = html_mktocitem($setting->getKey(), $name, 2); + } + } + + // undefined settings if allowed + if (count($this->configuration->getUndefined()) && $allow_debug) { + $toc[] = html_mktocitem('undefined_settings', $this->getLang('_header_undefined'), 1); + } + + return $toc; + } + + /** + * @param string $id + * @param string $text + */ + protected function printH1($id, $text) + { + echo '

    ' . $text . '

    '; + } + + /** + * Adds a translation to this plugin's language array + * + * Used by some settings to set up dynamic translations + * + * @param string $key + * @param string $value + */ + public function addLang($key, $value) + { + if (!$this->localised) $this->setupLocale(); + $this->lang[$key] = $value; + } +} diff --git a/lib/plugins/config/admin.svg b/lib/plugins/config/admin.svg new file mode 100644 index 0000000..ced9871 --- /dev/null +++ b/lib/plugins/config/admin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/plugins/config/core/ConfigParser.php b/lib/plugins/config/core/ConfigParser.php new file mode 100644 index 0000000..aae44d9 --- /dev/null +++ b/lib/plugins/config/core/ConfigParser.php @@ -0,0 +1,101 @@ + + */ +class ConfigParser +{ + /** @var string variable to parse from the file */ + protected $varname = 'conf'; + /** @var string the key to mark sub arrays */ + protected $keymarker = Configuration::KEYMARKER; + + /** + * Parse the given PHP file into an array + * + * When the given files does not exist, this returns an empty array + * + * @param string $file + * @return array + */ + public function parse($file) + { + if (!file_exists($file)) return []; + + $config = []; + $contents = @php_strip_whitespace($file); + + // fallback to simply including the file #3271 + if ($contents === null) { + $conf = []; + include $file; + return $conf; + } + + $pattern = '/\$' . $this->varname . '\[[\'"]([^=]+)[\'"]\] ?= ?(.*?);(?=[^;]*(?:\$' . $this->varname . '|$))/s'; + $matches = []; + preg_match_all($pattern, $contents, $matches, PREG_SET_ORDER); + $counter = count($matches); + + for ($i = 0; $i < $counter; $i++) { + $value = $matches[$i][2]; + + // merge multi-dimensional array indices using the keymarker + $key = preg_replace('/.\]\[./', $this->keymarker, $matches[$i][1]); + + // handle arrays + if (preg_match('/^array ?\((.*)\)/', $value, $match)) { + $arr = explode(',', $match[1]); + + // remove quotes from quoted strings & unescape escaped data + $len = count($arr); + for ($j = 0; $j < $len; $j++) { + $arr[$j] = trim($arr[$j]); + $arr[$j] = $this->readValue($arr[$j]); + } + + $value = $arr; + } else { + $value = $this->readValue($value); + } + + $config[$key] = $value; + } + + return $config; + } + + /** + * Convert php string into value + * + * @param string $value + * @return bool|string + */ + protected function readValue($value) + { + $removequotes_pattern = '/^(\'|")(.*)(? '\\', + '\\\'' => '\'', + '\\"' => '"' + ]; + + if ($value == 'true') { + $value = true; + } elseif ($value == 'false') { + $value = false; + } else { + // remove quotes from quoted strings & unescape escaped data + $value = preg_replace($removequotes_pattern, '$2', $value); + $value = strtr($value, $unescape_pairs); + } + return $value; + } +} diff --git a/lib/plugins/config/core/Configuration.php b/lib/plugins/config/core/Configuration.php new file mode 100644 index 0000000..d2c63e3 --- /dev/null +++ b/lib/plugins/config/core/Configuration.php @@ -0,0 +1,230 @@ + + * @author Ben Coburn + * @author Andreas Gohr + */ +class Configuration +{ + public const KEYMARKER = '____'; + + /** @var Setting[] metadata as array of Settings objects */ + protected $settings = []; + /** @var Setting[] undefined and problematic settings */ + protected $undefined = []; + + /** @var array all metadata */ + protected $metadata; + /** @var array all default settings */ + protected $default; + /** @var array all local settings */ + protected $local; + /** @var array all protected settings */ + protected $protected; + + /** @var bool have the settings been changed since loading from disk? */ + protected $changed = false; + + /** @var Loader */ + protected $loader; + /** @var Writer */ + protected $writer; + + /** + * ConfigSettings constructor. + */ + public function __construct() + { + $this->loader = new Loader(new ConfigParser()); + $this->writer = new Writer(); + + $this->metadata = $this->loader->loadMeta(); + $this->default = $this->loader->loadDefaults(); + $this->local = $this->loader->loadLocal(); + $this->protected = $this->loader->loadProtected(); + + $this->initSettings(); + } + + /** + * Get all settings + * + * @return Setting[] + */ + public function getSettings() + { + return $this->settings; + } + + /** + * Get all unknown or problematic settings + * + * @return Setting[] + */ + public function getUndefined() + { + return $this->undefined; + } + + /** + * Have the settings been changed since loading from disk? + * + * @return bool + */ + public function hasChanged() + { + return $this->changed; + } + + /** + * Check if the config can be written + * + * @return bool + */ + public function isLocked() + { + return $this->writer->isLocked(); + } + + /** + * Update the settings using the data provided + * + * @param array $input as posted + * @return bool true if all updates went through, false on errors + */ + public function updateSettings($input) + { + $ok = true; + + foreach ($this->settings as $key => $obj) { + $value = $input[$key] ?? null; + if ($obj->update($value)) { + $this->changed = true; + } + if ($obj->hasError()) $ok = false; + } + + return $ok; + } + + /** + * Save the settings + * + * This save the current state as defined in this object, including the + * undefined settings + * + * @throws \Exception + */ + public function save() + { + // only save the undefined settings that have not been handled in settings + $undefined = array_diff_key($this->undefined, $this->settings); + $this->writer->save(array_merge($this->settings, $undefined)); + } + + /** + * Touch the settings + * + * @throws \Exception + */ + public function touch() + { + $this->writer->touch(); + } + + /** + * Load the extension language strings + * + * @return array + */ + public function getLangs() + { + return $this->loader->loadLangs(); + } + + /** + * Initalizes the $settings and $undefined properties + */ + protected function initSettings() + { + $keys = [ + ...array_keys($this->metadata), + ...array_keys($this->default), + ...array_keys($this->local), + ...array_keys($this->protected) + ]; + $keys = array_unique($keys); + + foreach ($keys as $key) { + $obj = $this->instantiateClass($key); + + if ($obj->shouldHaveDefault() && !isset($this->default[$key])) { + $this->undefined[$key] = new SettingNoDefault($key); + } + + $d = $this->default[$key] ?? null; + $l = $this->local[$key] ?? null; + $p = $this->protected[$key] ?? null; + + $obj->initialize($d, $l, $p); + } + } + + /** + * Instantiates the proper class for the given config key + * + * The class is added to the $settings or $undefined arrays and returned + * + * @param string $key + * @return Setting + */ + protected function instantiateClass($key) + { + if (isset($this->metadata[$key])) { + $param = $this->metadata[$key]; + $class = $this->determineClassName(array_shift($param), $key); // first param is class + $obj = new $class($key, $param); + $this->settings[$key] = $obj; + } else { + $obj = new SettingUndefined($key); + $this->undefined[$key] = $obj; + } + return $obj; + } + + /** + * Return the class to load + * + * @param string $class the class name as given in the meta file + * @param string $key the settings key + * @return string + */ + protected function determineClassName($class, $key) + { + // try namespaced class first + if (is_string($class)) { + $modern = str_replace('_', '', ucwords($class, '_')); + $modern = '\\dokuwiki\\plugin\\config\\core\\Setting\\Setting' . $modern; + if ($modern && class_exists($modern)) return $modern; + // try class as given + if (class_exists($class)) return $class; + // class wasn't found add to errors + $this->undefined[$key] = new SettingNoKnownClass($key); + } else { + // no class given, add to errors + $this->undefined[$key] = new SettingNoClass($key); + } + return '\\dokuwiki\\plugin\\config\\core\\Setting\\Setting'; + } +} diff --git a/lib/plugins/config/core/Loader.php b/lib/plugins/config/core/Loader.php new file mode 100644 index 0000000..c9dbec9 --- /dev/null +++ b/lib/plugins/config/core/Loader.php @@ -0,0 +1,285 @@ +parser = $parser; + $this->plugins = plugin_list(); + $this->template = $conf['template']; + // allow plugins to remove configurable plugins + Event::createAndTrigger('PLUGIN_CONFIG_PLUGINLIST', $this->plugins); + } + + /** + * Read the settings meta data + * + * Reads the main file, plugins and template settings meta data + * + * @return array + */ + public function loadMeta() + { + // load main file + $meta = []; + include DOKU_PLUGIN . 'config/settings/config.metadata.php'; + + // plugins + foreach ($this->plugins as $plugin) { + $meta = array_merge( + $meta, + $this->loadExtensionMeta( + DOKU_PLUGIN . $plugin . '/conf/metadata.php', + 'plugin', + $plugin + ) + ); + } + + // current template + $meta = array_merge( + $meta, + $this->loadExtensionMeta( + tpl_incdir() . '/conf/metadata.php', + 'tpl', + $this->template + ) + ); + + return $meta; + } + + /** + * Read the default values + * + * Reads the main file, plugins and template defaults + * + * @return array + */ + public function loadDefaults() + { + + // initialize array + $conf = []; + + // plugins + foreach ($this->plugins as $plugin) { + $conf = array_merge( + $conf, + $this->loadExtensionConf( + DOKU_PLUGIN . $plugin . '/conf/default.php', + 'plugin', + $plugin + ) + ); + } + + // current template + $conf = array_merge( + $conf, + $this->loadExtensionConf( + tpl_incdir() . '/conf/default.php', + 'tpl', + $this->template + ) + ); + + // load main files + global $config_cascade; + return array_merge( + $conf, + $this->loadConfigs($config_cascade['main']['default']) + ); + } + + /** + * Reads the language strings + * + * Only reads extensions, main one is loaded the usual way + * + * @return array + */ + public function loadLangs() + { + $lang = []; + + // plugins + foreach ($this->plugins as $plugin) { + $lang = array_merge( + $lang, + $this->loadExtensionLang( + DOKU_PLUGIN . $plugin . '/', + 'plugin', + $plugin + ) + ); + } + + // current template + $lang = array_merge( + $lang, + $this->loadExtensionLang( + tpl_incdir() . '/', + 'tpl', + $this->template + ) + ); + + return $lang; + } + + /** + * Read the local settings + * + * @return array + */ + public function loadLocal() + { + global $config_cascade; + return $this->loadConfigs($config_cascade['main']['local']); + } + + /** + * Read the protected settings + * + * @return array + */ + public function loadProtected() + { + global $config_cascade; + return $this->loadConfigs($config_cascade['main']['protected']); + } + + /** + * Read the config values from the given files + * + * @param string[] $files paths to config php's + * @return array + */ + protected function loadConfigs($files) + { + $conf = []; + foreach ($files as $file) { + $conf = array_merge($conf, $this->parser->parse($file)); + } + return $conf; + } + + /** + * Read settings file from an extension + * + * This is used to read the settings.php files of plugins and templates + * + * @param string $file php file to read + * @param string $type should be 'plugin' or 'tpl' + * @param string $extname name of the extension + * @return array + */ + protected function loadExtensionMeta($file, $type, $extname) + { + if (!file_exists($file)) return []; + $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER; + + // include file + $meta = []; + include $file; + if ($meta === []) return []; + + // read data + $data = []; + $data[$prefix . $type . '_settings_name'] = ['fieldset']; + foreach ($meta as $key => $value) { + if ($value[0] == 'fieldset') continue; //plugins only get one fieldset + $data[$prefix . $key] = $value; + } + + return $data; + } + + /** + * Read a default file from an extension + * + * This is used to read the default.php files of plugins and templates + * + * @param string $file php file to read + * @param string $type should be 'plugin' or 'tpl' + * @param string $extname name of the extension + * @return array + */ + protected function loadExtensionConf($file, $type, $extname) + { + if (!file_exists($file)) return []; + $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER; + + // parse file + $conf = $this->parser->parse($file); + if (empty($conf)) return []; + + // read data + $data = []; + foreach ($conf as $key => $value) { + $data[$prefix . $key] = $value; + } + + return $data; + } + + /** + * Read the language file of an extension + * + * @param string $dir directory of the extension + * @param string $type should be 'plugin' or 'tpl' + * @param string $extname name of the extension + * @return array + */ + protected function loadExtensionLang($dir, $type, $extname) + { + global $conf; + $ll = $conf['lang']; + $prefix = $type . Configuration::KEYMARKER . $extname . Configuration::KEYMARKER; + + // include files + $lang = []; + if (file_exists($dir . 'lang/en/settings.php')) { + include $dir . 'lang/en/settings.php'; + } + if ($ll != 'en' && file_exists($dir . 'lang/' . $ll . '/settings.php')) { + include $dir . 'lang/' . $ll . '/settings.php'; + } + + // set up correct keys + $strings = []; + foreach ($lang as $key => $val) { + $strings[$prefix . $key] = $val; + } + + // add fieldset key + $strings[$prefix . $type . '_settings_name'] = ucwords(str_replace('_', ' ', $extname)); + + return $strings; + } +} diff --git a/lib/plugins/config/core/Setting/Setting.php b/lib/plugins/config/core/Setting/Setting.php new file mode 100644 index 0000000..ca26086 --- /dev/null +++ b/lib/plugins/config/core/Setting/Setting.php @@ -0,0 +1,326 @@ +key = $key; + + if (is_array($params)) { + foreach ($params as $property => $value) { + $property = trim($property, '_'); // we don't use underscores anymore + $this->$property = $value; + } + } + } + + /** + * Set the current values for the setting $key + * + * This is used to initialize the setting with the data read form the config files. + * + * @see update() to set a new value + * @param mixed $default default setting value + * @param mixed $local local setting value + * @param mixed $protected protected setting value + */ + public function initialize($default = null, $local = null, $protected = null) + { + $this->default = $this->cleanValue($default); + $this->local = $this->cleanValue($local); + $this->protected = $this->cleanValue($protected); + } + + /** + * update changed setting with validated user provided value $input + * - if changed value fails validation check, save it to $this->input (to allow echoing later) + * - if changed value passes validation check, set $this->local to the new value + * + * @param mixed $input the new value + * @return boolean true if changed, false otherwise + */ + public function update($input) + { + if (is_null($input)) return false; + if ($this->isProtected()) return false; + $input = $this->cleanValue($input); + + $value = is_null($this->local) ? $this->default : $this->local; + if ($value == $input) return false; + + // validate new value + if ($this->pattern && !preg_match($this->pattern, $input)) { + $this->error = true; + $this->input = $input; + return false; + } + + // update local copy of this setting with new value + $this->local = $input; + + // setting ready for update + return true; + } + + /** + * Clean a value read from a config before using it internally + * + * Default implementation returns $value as is. Subclasses can override. + * Note: null should always be returned as null! + * + * This is applied in initialize() and update() + * + * @param mixed $value + * @return mixed + */ + protected function cleanValue($value) + { + return $value; + } + + /** + * Should this type of config have a default? + * + * @return bool + */ + public function shouldHaveDefault() + { + return true; + } + + /** + * Get this setting's unique key + * + * @return string + */ + public function getKey() + { + return $this->key; + } + + /** + * Get the key of this setting marked up human readable + * + * @param bool $url link to dokuwiki.org manual? + * @return string + */ + public function getPrettyKey($url = true) + { + $out = str_replace(Configuration::KEYMARKER, "»", $this->key); + if ($url && !strstr($out, '»')) {//provide no urls for plugins, etc. + if ($out == 'start') { + // exception, because this config name is clashing with our actual start page + return '' . $out . ''; + } else { + return '' . $out . ''; + } + } + return $out; + } + + /** + * Returns setting key as an array key separator + * + * This is used to create form output + * + * @return string key + */ + public function getArrayKey() + { + return str_replace(Configuration::KEYMARKER, "']['", $this->key); + } + + /** + * What type of configuration is this + * + * Returns one of + * + * 'plugin' for plugin configuration + * 'template' for template configuration + * 'dokuwiki' for core configuration + * + * @return string + */ + public function getType() + { + if (str_starts_with($this->getKey(), 'plugin' . Configuration::KEYMARKER)) { + return 'plugin'; + } elseif (str_starts_with($this->getKey(), 'tpl' . Configuration::KEYMARKER)) { + return 'template'; + } else { + return 'dokuwiki'; + } + } + + /** + * Build html for label and input of setting + * + * @param \admin_plugin_config $plugin object of config plugin + * @param bool $echo true: show inputted value, when error occurred, otherwise the stored setting + * @return string[] with content array(string $label_html, string $input_html) + */ + public function html(\admin_plugin_config $plugin, $echo = false) + { + $disable = ''; + + if ($this->isProtected()) { + $value = $this->protected; + $disable = 'disabled="disabled"'; + } elseif ($echo && $this->error) { + $value = $this->input; + } else { + $value = is_null($this->local) ? $this->default : $this->local; + } + + $key = htmlspecialchars($this->key); + $value = formText($value); + + $label = ''; + $input = ''; + return [$label, $input]; + } + + /** + * Should the current local value be saved? + * + * @see out() to run when this returns true + * @return bool + */ + public function shouldBeSaved() + { + if ($this->isProtected()) return false; + if ($this->local === null) return false; + if ($this->default == $this->local) return false; + return true; + } + + /** + * Escaping + * + * @param string $string + * @return string + */ + protected function escape($string) + { + $tr = ["\\" => '\\\\', "'" => '\\\'']; + return "'" . strtr(cleanText($string), $tr) . "'"; + } + + /** + * Generate string to save local setting value to file according to $fmt + * + * @see shouldBeSaved() to check if this should be called + * @param string $var name of variable + * @param string $fmt save format + * @return string + */ + public function out($var, $fmt = 'php') + { + if ($fmt != 'php') return ''; + + if (is_array($this->local)) { + $value = 'array(' . implode(', ', array_map([$this, 'escape'], $this->local)) . ')'; + } else { + $value = $this->escape($this->local); + } + + $out = '$' . $var . "['" . $this->getArrayKey() . "'] = $value;\n"; + + return $out; + } + + /** + * Returns the localized prompt + * + * @param \admin_plugin_config $plugin object of config plugin + * @return string text + */ + public function prompt(\admin_plugin_config $plugin) + { + $prompt = $plugin->getLang($this->key); + if (!$prompt) $prompt = htmlspecialchars(str_replace(['____', '_'], ' ', $this->key)); + return $prompt; + } + + /** + * Is setting protected + * + * @return bool + */ + public function isProtected() + { + return !is_null($this->protected); + } + + /** + * Is setting the default? + * + * @return bool + */ + public function isDefault() + { + return !$this->isProtected() && is_null($this->local); + } + + /** + * Has an error? + * + * @return bool + */ + public function hasError() + { + return $this->error; + } + + /** + * Returns caution + * + * @return false|string caution string, otherwise false for invalid caution + */ + public function caution() + { + if (empty($this->caution)) return false; + if (!in_array($this->caution, Setting::$validCautions)) { + throw new \RuntimeException( + 'Invalid caution string (' . $this->caution . ') in metadata for setting "' . $this->key . '"' + ); + } + return $this->caution; + } +} diff --git a/lib/plugins/config/core/Setting/SettingArray.php b/lib/plugins/config/core/Setting/SettingArray.php new file mode 100644 index 0000000..bae9e87 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingArray.php @@ -0,0 +1,87 @@ +isProtected()) return false; + + $input = $this->fromString($input); + + $value = is_null($this->local) ? $this->default : $this->local; + if ($value == $input) return false; + + foreach ($input as $item) { + if ($this->pattern && !preg_match($this->pattern, $item)) { + $this->error = true; + $this->input = $input; + return false; + } + } + + $this->local = $input; + return true; + } + + /** @inheritdoc */ + public function html(\admin_plugin_config $plugin, $echo = false) + { + $disable = ''; + + if ($this->isProtected()) { + $value = $this->protected; + $disable = 'disabled="disabled"'; + } elseif ($echo && $this->error) { + $value = $this->input; + } else { + $value = is_null($this->local) ? $this->default : $this->local; + } + + $key = htmlspecialchars($this->key); + $value = htmlspecialchars($this->fromArray($value)); + + $label = ''; + $input = ''; + return [$label, $input]; + } +} diff --git a/lib/plugins/config/core/Setting/SettingAuthtype.php b/lib/plugins/config/core/Setting/SettingAuthtype.php new file mode 100644 index 0000000..1874db0 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingAuthtype.php @@ -0,0 +1,62 @@ +getList('auth') as $plugin) { + $this->choices[] = $plugin; + } + + parent::initialize($default, $local, $protected); + } + + /** @inheritdoc */ + public function update($input) + { + /** @var $plugin_controller \dokuwiki\Extension\PluginController */ + global $plugin_controller; + + // is an update possible/requested? + $local = $this->local; // save this, parent::update() may change it + if (!parent::update($input)) return false; // nothing changed or an error caught by parent + $this->local = $local; // restore original, more error checking to come + + // attempt to load the plugin + $auth_plugin = $plugin_controller->load('auth', $input); + + // @TODO: throw an error in plugin controller instead of returning null + if (is_null($auth_plugin)) { + $this->error = true; + msg('Cannot load Auth Plugin "' . $input . '"', -1); + return false; + } + + // verify proper instantiation (is this really a plugin?) @TODO use instanceof? implement interface? + if (is_object($auth_plugin) && !method_exists($auth_plugin, 'getPluginName')) { + $this->error = true; + msg('Cannot create Auth Plugin "' . $input . '"', -1); + return false; + } + + // did we change the auth type? logout + global $conf; + if ($conf['authtype'] != $input) { + msg('Authentication system changed. Please re-login.'); + auth_logoff(); + } + + $this->local = $input; + return true; + } +} diff --git a/lib/plugins/config/core/Setting/SettingCompression.php b/lib/plugins/config/core/Setting/SettingCompression.php new file mode 100644 index 0000000..f524059 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingCompression.php @@ -0,0 +1,22 @@ +choices[] = 'gz'; + if (function_exists('bzopen')) $this->choices[] = 'bz2'; + + parent::initialize($default, $local, $protected); + } +} diff --git a/lib/plugins/config/core/Setting/SettingDirchoice.php b/lib/plugins/config/core/Setting/SettingDirchoice.php new file mode 100644 index 0000000..a571149 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingDirchoice.php @@ -0,0 +1,34 @@ +_choices with a list of directories + $list = []; + + if ($dh = @opendir($this->dir)) { + while (false !== ($entry = readdir($dh))) { + if ($entry == '.' || $entry == '..') continue; + if ($this->pattern && !preg_match($this->pattern, $entry)) continue; + + $file = (is_link($this->dir . $entry)) ? readlink($this->dir . $entry) : $this->dir . $entry; + if (is_dir($file)) $list[] = $entry; + } + closedir($dh); + } + sort($list); + $this->choices = $list; + + parent::initialize($default, $local, $protected); + } +} diff --git a/lib/plugins/config/core/Setting/SettingDisableactions.php b/lib/plugins/config/core/Setting/SettingDisableactions.php new file mode 100644 index 0000000..46427c4 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingDisableactions.php @@ -0,0 +1,24 @@ +addLang($this->key . '_revisions', $lang['btn_revs']); + foreach ($this->choices as $choice) { + if (isset($lang['btn_' . $choice])) $plugin->addLang($this->key . '_' . $choice, $lang['btn_' . $choice]); + } + + return parent::html($plugin, $echo); + } +} diff --git a/lib/plugins/config/core/Setting/SettingEmail.php b/lib/plugins/config/core/Setting/SettingEmail.php new file mode 100644 index 0000000..a1a2ab0 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingEmail.php @@ -0,0 +1,60 @@ +isProtected()) return false; + + $value = is_null($this->local) ? $this->default : $this->local; + if ($value == $input) return false; + if ($input === '') { + $this->local = $input; + return true; + } + $mail = $input; + + if ($this->placeholders) { + // replace variables with pseudo values + $mail = str_replace('@USER@', 'joe', $mail); + $mail = str_replace('@NAME@', 'Joe Schmoe', $mail); + $mail = str_replace('@MAIL@', 'joe@example.com', $mail); + } + + // multiple mail addresses? + if ($this->multiple) { + $mails = array_filter(array_map('trim', explode(',', $mail))); + } else { + $mails = [$mail]; + } + + // check them all + foreach ($mails as $mail) { + // only check the address part + if (preg_match('#(.*?)<(.*?)>#', $mail, $matches)) { + $addr = $matches[2]; + } else { + $addr = $mail; + } + + if (!mail_isvalid($addr)) { + $this->error = true; + $this->input = $input; + return false; + } + } + + $this->local = $input; + return true; + } +} diff --git a/lib/plugins/config/core/Setting/SettingFieldset.php b/lib/plugins/config/core/Setting/SettingFieldset.php new file mode 100644 index 0000000..3db2962 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingFieldset.php @@ -0,0 +1,17 @@ +isProtected()) return false; + + $input = trim($input); + + $value = is_null($this->local) ? $this->default : $this->local; + if ($value == $input) return false; + + if ($input && !file_exists($input)) { + $this->error = true; + $this->input = $input; + return false; + } + + $this->local = $input; + return true; + } +} diff --git a/lib/plugins/config/core/Setting/SettingLicense.php b/lib/plugins/config/core/Setting/SettingLicense.php new file mode 100644 index 0000000..edd5a09 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingLicense.php @@ -0,0 +1,24 @@ + $data) { + $this->choices[] = $key; + $this->lang[$this->key . '_o_' . $key] = $data['name']; // stored in setting + } + + parent::initialize($default, $local, $protected); + } +} diff --git a/lib/plugins/config/core/Setting/SettingMulticheckbox.php b/lib/plugins/config/core/Setting/SettingMulticheckbox.php new file mode 100644 index 0000000..954a510 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingMulticheckbox.php @@ -0,0 +1,162 @@ +isProtected()) return false; + + // split any combined values + convert from array to comma separated string + $input = $input ?: []; + $input = $this->array2str($input); + + $value = is_null($this->local) ? $this->default : $this->local; + if ($value == $input) return false; + + if ($this->pattern && !preg_match($this->pattern, $input)) { + $this->error = true; + $this->input = $input; + return false; + } + + $this->local = $input; + return true; + } + + /** @inheritdoc */ + public function html(\admin_plugin_config $plugin, $echo = false) + { + + $disable = ''; + + if ($this->isProtected()) { + $value = $this->protected; + $disable = 'disabled="disabled"'; + } elseif ($echo && $this->error) { + $value = $this->input; + } else { + $value = is_null($this->local) ? $this->default : $this->local; + } + + $key = htmlspecialchars($this->key); + + // convert from comma separated list into array + combine complimentary actions + $value = $this->str2array($value); + $default = $this->str2array($this->default); + + $input = ''; + foreach ($this->choices as $choice) { + $idx = array_search($choice, $value); + $idx_default = array_search($choice, $default); + + $checked = ($idx !== false) ? 'checked="checked"' : ''; + + // @todo ideally this would be handled using a second class of "default" + $class = (($idx !== false) === (false !== $idx_default)) ? " selectiondefault" : ""; + + $prompt = ($plugin->getLang($this->key . '_' . $choice) ?: htmlspecialchars($choice)); + + $input .= '
    ' . "\n"; + $input .= '\n"; + $input .= '\n"; + $input .= "
    \n"; + + // remove this action from the disabledactions array + if ($idx !== false) unset($value[$idx]); + if ($idx_default !== false) unset($default[$idx_default]); + } + + // handle any remaining values + if ($this->other != 'never') { + $other = implode(',', $value); + // test equivalent to ($this->_other == 'always' || ($other && $this->_other == 'exists') + // use != 'exists' rather than == 'always' to ensure invalid values default to 'always' + if ($this->other != 'exists' || $other) { + $class = ( + (count($default) === count($value)) && + (count($value) === count(array_intersect($value, $default))) + ) ? + " selectiondefault" : ""; + + $input .= '
    ' . "\n"; + $input .= '\n"; + $input .= '\n"; + $input .= "
    \n"; + } + } + $label = ''; + return [$label, $input]; + } + + /** + * convert comma separated list to an array and combine any complimentary values + * + * @param string $str + * @return array + */ + protected function str2array($str) + { + $array = explode(',', $str); + + if (!empty($this->combine)) { + foreach ($this->combine as $key => $combinators) { + $idx = []; + foreach ($combinators as $val) { + if (($idx[] = array_search($val, $array)) === false) break; + } + + if (count($idx) && $idx[count($idx) - 1] !== false) { + foreach ($idx as $i) unset($array[$i]); + $array[] = $key; + } + } + } + + return $array; + } + + /** + * convert array of values + other back to a comma separated list, incl. splitting any combined values + * + * @param array $input + * @return string + */ + protected function array2str($input) + { + + // handle other + $other = trim($input['other']); + $other = empty($other) ? [] : explode(',', str_replace(' ', '', $input['other'])); + unset($input['other']); + + $array = array_unique(array_merge($input, $other)); + + // deconstruct any combinations + if (!empty($this->combine)) { + foreach ($this->combine as $key => $combinators) { + $idx = array_search($key, $array); + if ($idx !== false) { + unset($array[$idx]); + $array = array_merge($array, $combinators); + } + } + } + + return implode(',', array_unique($array)); + } +} diff --git a/lib/plugins/config/core/Setting/SettingMultichoice.php b/lib/plugins/config/core/Setting/SettingMultichoice.php new file mode 100644 index 0000000..7d29a0e --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingMultichoice.php @@ -0,0 +1,74 @@ +isProtected()) { + $value = $this->protected; + $disable = ' disabled="disabled"'; + } else { + $value = is_null($this->local) ? $this->default : $this->local; + } + + // ensure current value is included + if (!in_array($value, $this->choices)) { + $this->choices[] = $value; + } + // disable if no other choices + if (!$this->isProtected() && count($this->choices) <= 1) { + $disable = ' disabled="disabled"'; + $nochoice = $plugin->getLang('nochoice'); + } + + $key = htmlspecialchars($this->key); + + $label = ''; + + $input = "
    \n"; + $input .= ' $nochoice \n"; + $input .= "
    \n"; + + return [$label, $input]; + } + + /** @inheritdoc */ + public function update($input) + { + if (is_null($input)) return false; + if ($this->isProtected()) return false; + + $value = is_null($this->local) ? $this->default : $this->local; + if ($value == $input) return false; + + if (!in_array($input, $this->choices)) return false; + + $this->local = $input; + return true; + } +} diff --git a/lib/plugins/config/core/Setting/SettingNoClass.php b/lib/plugins/config/core/Setting/SettingNoClass.php new file mode 100644 index 0000000..805ab11 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingNoClass.php @@ -0,0 +1,13 @@ +local; + $valid = parent::update($input); + if ($valid && !(is_null($this->min) && is_null($this->max))) { + $numeric_local = (int) eval('return ' . $this->local . ';'); + if ( + (!is_null($this->min) && $numeric_local < $this->min) || + (!is_null($this->max) && $numeric_local > $this->max) + ) { + $this->error = true; + $this->input = $input; + $this->local = $local; + $valid = false; + } + } + return $valid; + } + + /** @inheritdoc */ + public function out($var, $fmt = 'php') + { + if ($fmt != 'php') return ''; + + $local = $this->local === '' ? "''" : $this->local; + $out = '$' . $var . "['" . $this->getArrayKey() . "'] = " . $local . ";\n"; + + return $out; + } +} diff --git a/lib/plugins/config/core/Setting/SettingNumericopt.php b/lib/plugins/config/core/Setting/SettingNumericopt.php new file mode 100644 index 0000000..117e392 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingNumericopt.php @@ -0,0 +1,27 @@ +local) return false; + $this->local = $input; + return true; + } + + return parent::update($input); + } +} diff --git a/lib/plugins/config/core/Setting/SettingOnoff.php b/lib/plugins/config/core/Setting/SettingOnoff.php new file mode 100644 index 0000000..69a74aa --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingOnoff.php @@ -0,0 +1,60 @@ +isProtected()) { + $value = $this->protected; + $disable = ' disabled="disabled"'; + } else { + $value = is_null($this->local) ? $this->default : $this->local; + } + + $key = htmlspecialchars($this->key); + $checked = ($value) ? ' checked="checked"' : ''; + + $label = ''; + $input = '
    '; + return [$label, $input]; + } + + /** @inheritdoc */ + public function update($input) + { + if ($this->isProtected()) return false; + + $input = ($input) ? 1 : 0; + $value = is_null($this->local) ? $this->default : $this->local; + if ($value == $input) return false; + + $this->local = $input; + return true; + } +} diff --git a/lib/plugins/config/core/Setting/SettingPassword.php b/lib/plugins/config/core/Setting/SettingPassword.php new file mode 100644 index 0000000..e56a133 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingPassword.php @@ -0,0 +1,41 @@ +isProtected()) return false; + if (!$input) return false; + + if ($this->pattern && !preg_match($this->pattern, $input)) { + $this->error = true; + $this->input = $input; + return false; + } + + $this->local = conf_encodeString($input, $this->code); + return true; + } + + /** @inheritdoc */ + public function html(\admin_plugin_config $plugin, $echo = false) + { + + $disable = $this->isProtected() ? 'disabled="disabled"' : ''; + + $key = htmlspecialchars($this->key); + + $label = ''; + $input = ''; + return [$label, $input]; + } +} diff --git a/lib/plugins/config/core/Setting/SettingRegex.php b/lib/plugins/config/core/Setting/SettingRegex.php new file mode 100644 index 0000000..7ec3a4d --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingRegex.php @@ -0,0 +1,35 @@ +local; + if (!parent::update($input)) return false; + $this->local = $local; + + // see if the regex compiles and runs (we don't check for effectiveness) + $regex = $this->delimiter . $input . $this->delimiter . $this->pregflags; + $lastError = error_get_last(); + @preg_match($regex, 'testdata'); + if (preg_last_error() != PREG_NO_ERROR || error_get_last() !== $lastError) { + $this->input = $input; + $this->error = true; + return false; + } + + $this->local = $input; + return true; + } +} diff --git a/lib/plugins/config/core/Setting/SettingRenderer.php b/lib/plugins/config/core/Setting/SettingRenderer.php new file mode 100644 index 0000000..224bcd2 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingRenderer.php @@ -0,0 +1,60 @@ + + */ + +namespace dokuwiki\plugin\config\core\Setting; + +/** + * Class setting_renderer + */ +class SettingRenderer extends SettingMultichoice +{ + protected $prompts = []; + protected $format; + + /** @inheritdoc */ + public function initialize($default = null, $local = null, $protected = null) + { + $format = $this->format; + + foreach (plugin_list('renderer') as $plugin) { + $renderer = plugin_load('renderer', $plugin); + if ($renderer && method_exists($renderer, 'canRender') && $renderer->canRender($format)) { + $this->choices[] = $plugin; + + $info = $renderer->getInfo(); + $this->prompts[$plugin] = $info['name']; + } + } + + parent::initialize($default, $local, $protected); + } + + /** @inheritdoc */ + public function html(\admin_plugin_config $plugin, $echo = false) + { + + // make some language adjustments (there must be a better way) + // transfer some plugin names to the config plugin + foreach ($this->choices as $choice) { + if (!$plugin->getLang($this->key . '_o_' . $choice)) { + if (!isset($this->prompts[$choice])) { + $plugin->addLang( + $this->key . '_o_' . $choice, + sprintf($plugin->getLang('renderer__core'), $choice) + ); + } else { + $plugin->addLang( + $this->key . '_o_' . $choice, + sprintf($plugin->getLang('renderer__plugin'), $this->prompts[$choice]) + ); + } + } + } + return parent::html($plugin, $echo); + } +} diff --git a/lib/plugins/config/core/Setting/SettingSavedir.php b/lib/plugins/config/core/Setting/SettingSavedir.php new file mode 100644 index 0000000..a429b7a --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingSavedir.php @@ -0,0 +1,27 @@ +isProtected()) return false; + + $value = is_null($this->local) ? $this->default : $this->local; + if ($value == $input) return false; + + if (!init_path($input)) { + $this->error = true; + $this->input = $input; + return false; + } + + $this->local = $input; + return true; + } +} diff --git a/lib/plugins/config/core/Setting/SettingSepchar.php b/lib/plugins/config/core/Setting/SettingSepchar.php new file mode 100644 index 0000000..db9e9d6 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingSepchar.php @@ -0,0 +1,19 @@ +choices[] = $str[$i]; + + // call foundation class constructor + parent::__construct($key, $param); + } +} diff --git a/lib/plugins/config/core/Setting/SettingString.php b/lib/plugins/config/core/Setting/SettingString.php new file mode 100644 index 0000000..0901085 --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingString.php @@ -0,0 +1,32 @@ +isProtected()) { + $value = $this->protected; + $disable = 'disabled="disabled"'; + } elseif ($echo && $this->error) { + $value = $this->input; + } else { + $value = is_null($this->local) ? $this->default : $this->local; + } + + $key = htmlspecialchars($this->key); + $value = htmlspecialchars($value); + + $label = ''; + $input = ''; + return [$label, $input]; + } +} diff --git a/lib/plugins/config/core/Setting/SettingUndefined.php b/lib/plugins/config/core/Setting/SettingUndefined.php new file mode 100644 index 0000000..e70c90c --- /dev/null +++ b/lib/plugins/config/core/Setting/SettingUndefined.php @@ -0,0 +1,43 @@ +getKey(), + $undefined_setting_match + ) + ) { + $undefined_setting_key = $undefined_setting_match[1]; + } else { + $undefined_setting_key = $this->getKey(); + } + + $label = '$' . + 'conf' . '[\'' . $this->getArrayKey() . '\']'; + $input = $plugin->getLang($this->errorMessage); + + return [$label, $input]; + } +} diff --git a/lib/plugins/config/core/Writer.php b/lib/plugins/config/core/Writer.php new file mode 100644 index 0000000..6751b88 --- /dev/null +++ b/lib/plugins/config/core/Writer.php @@ -0,0 +1,134 @@ +savefile = end($config_cascade['main']['local']); + } + + /** + * Save the given settings + * + * @param Setting[] $settings + * @throws \Exception + */ + public function save($settings) + { + global $conf; + if ($this->isLocked()) throw new \Exception('no save'); + + // backup current file (remove any existing backup) + if (file_exists($this->savefile)) { + if (file_exists($this->savefile . '.bak.php')) @unlink($this->savefile . '.bak.php'); + if (!io_rename($this->savefile, $this->savefile . '.bak.php')) throw new \Exception('no backup'); + } + + if (!$fh = @fopen($this->savefile, 'wb')) { + io_rename($this->savefile . '.bak.php', $this->savefile); // problem opening, restore the backup + throw new \Exception('no save'); + } + + $out = ''; + foreach ($settings as $setting) { + if ($setting->shouldBeSaved()) { + $out .= $setting->out('conf', 'php'); + } + } + + if ($out === '') { + throw new \Exception('empty config'); + } + $out = $this->getHeader() . $out; + + fwrite($fh, $out); + fclose($fh); + if ($conf['fperm']) chmod($this->savefile, $conf['fperm']); + $this->opcacheUpdate($this->savefile); + } + + /** + * Update last modified time stamp of the config file + * + * Will invalidate all DokuWiki caches + * + * @throws \Exception when the config isn't writable + */ + public function touch() + { + if ($this->isLocked()) throw new \Exception('no save'); + @touch($this->savefile); + $this->opcacheUpdate($this->savefile); + } + + /** + * Invalidate the opcache of the given file (if possible) + * + * @todo this should probably be moved to core + * @param string $file + */ + protected function opcacheUpdate($file) + { + if (!function_exists('opcache_invalidate')) return; + set_error_handler(function ($errNo, $errMsg) { + Logger::debug('Unable to invalidate opcache: ' . $errMsg); + }); + opcache_invalidate($file); + restore_error_handler(); + } + + /** + * Configuration is considered locked if there is no local settings filename + * or the directory its in is not writable or the file exists and is not writable + * + * @return bool true: locked, false: writable + */ + public function isLocked() + { + if (!$this->savefile) return true; + if (!is_writable(dirname($this->savefile))) return true; + if (file_exists($this->savefile) && !is_writable($this->savefile)) return true; + return false; + } + + /** + * Returns the PHP intro header for the config file + * + * @return string + */ + protected function getHeader() + { + return implode( + "\n", + [ + 'header, + ' * Auto-generated by config plugin', + ' * Run for user: ' . ($_SERVER['REMOTE_USER'] ?? 'Unknown'), + ' * Date: ' . date('r'), + ' */', + '', + '' + ] + ); + } +} diff --git a/lib/plugins/config/images/danger.png b/lib/plugins/config/images/danger.png new file mode 100644 index 0000000000000000000000000000000000000000..da0692429e404d4620f23a496890f09f6c8fc8ec GIT binary patch literal 637 zcmV-@0)qXCP)q`6DreHL3G4NK19k@M4ND94=5r6X_07xs~$*yK?G4zE!qsUs)Y}X7J@rL zFp7$h7D|my`A|w7dyGzsPBU}P`JL{$;+>gh=?^|G_xsN8_dWQ&9IZ9>gWUfe>cP!= zYTcp9t0c=wg5(d9{Zt&X9`-LF4H*@P`#0J(bzmnazaqcB0l7Zku77J2u}}z}*yb9k zddr@?9L^F*-n(v-*_SA*E-YwjgbIHHZ8PvxRKw%1!PZO&@!8KiRI0n`>Bz7vkhpuT zj^x{9d9}Z=sR_yVV=ySV{R{@%cX|M7!sp_Sevx*5f6Fx7(CH7WwONhy$4 zfmlsMHtcEF7^0i;@4InqkGycRQxLgTwTML`Ch2N=1p|MApK!om>pnJLU(YQRUAp2B zmGLRUTU&=;Qy)#+1FnD&VlcTL4o9bhC}=z9ifjZPV?FT5A)0^d{000DP9eHH7q$fk zGZty4>r^|H>a&iXC@i+89A8>=24>>k!*z~DZ1VRHV>=|f+g^Pc&RXTE%O~3v88}$t zuPALf2Cr2N6OKnW@N;qk(Uti%lD(&2f6ZED7ZVqc*OTm^GRLGckBJ;Q^JXslnD&Ez XmC>(EJ&Mgr00000NkvXXu0mjfIG`C{ literal 0 HcmV?d00001 diff --git a/lib/plugins/config/images/security.png b/lib/plugins/config/images/security.png new file mode 100644 index 0000000000000000000000000000000000000000..3ee8476accd6ef3ae50b5b869d24446d1a7c60c6 GIT binary patch literal 682 zcmV;b0#*HqP)T;i5%cbnOF( z1*uxlMiZNsG$@o5lQyPF?)(|&#|4`P4;(UcXXcx8CV_K~X&oLO=B%~b#+VK7r@it1 z+xu8+y}z}!^$$~e1UNW2c+DR^DwoSEg+hTa4DoZu<1yWCmrE}X`e0{g=X4ezhjV`M z=W4aO7DW-APKV)eh$KiRlaxv&MD=?8+<$v@cXxLL5E4r^ezCN)w5F7z*=$}627`(p zr^GUDG#Y;i*r!|bRca6`39kCxXq=9%l;Nw>*O5mp&G&fs zxf9ku`zeSMc*sW|zC}PtkjN154%h&a^Rfs=Vf276H-}&qqVuo6f2bfgfkWSXLo&TU z5ahtlL8b`K!u>7g?hm5TpICiQW~GLUCQ|^d!OBe${j(o^&nGCp{05zG_i^@Fmfzf@ z|NEH-^vGA9!a0Le(KJ9w4V+OF*Iyz`EkIx~6T>ez8J3ACR#zAg(>R~NQ~v{mfS)L# zN>_Tnp86C&K&Y`}%VabG=aV&lqu;!W>skS*sRS|+s_{3ySRs*p2EvHdk3VNsX}G)Q z$!eL@-CUf&x>-OZRIHXaIP-u!%;zAP0xN(%qh1#^9FSiw;IJMv1CR>o=RYO$LV_Tb zj{m}N4y=J_M1C~Ds0mKy@?Kg`0ip>PN81uh7QE$mdaS`1>F;g8TR@_J0dlgk%`mys QH~;_u07*qoM6N<$g3`-1=l}o! literal 0 HcmV?d00001 diff --git a/lib/plugins/config/images/warning.png b/lib/plugins/config/images/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..c1af79f0ffa5b8ebe561b8983fb0e843d8157e4d GIT binary patch literal 606 zcmV-k0-^nhP)s@-?Yg@xwu(D5|Mz`c{zL@sR^ShQGsDX~?>r1MhKOJ-*vLcj*&a(s z-U@SyS$eDYz9i(pL>`1>&{wm+#aF$rTZm5~A0o2K_+)o5HqrHi+(mIyVVQrtGdcHg zM=-~|xf?L??c%ynsbQM1OM>v%hk`-Kz9{TG`jE#4O3MxBWN;VzF%GZ8~K%1Ex zKxtzi3Tt}0BR88uITq+}fSCvV4M)K$39wFUnLTi37Uj*yz{Hnku5S*kTEN63{<r0{vH@U)b2iwRCwyLEyPpt7iUijF*xg= sXYvT-cu-kMt3a;Ob5`2dYyO>o0+dW++45D~@&Et;07*qoM6N<$g2|K?%m4rY literal 0 HcmV?d00001 diff --git a/lib/plugins/config/lang/af/lang.php b/lib/plugins/config/lang/af/lang.php new file mode 100644 index 0000000..cf71576 --- /dev/null +++ b/lib/plugins/config/lang/af/lang.php @@ -0,0 +1,23 @@ +config]]. لمعلومات اكثر عن هذه الاضافة انظر [[doku>plugin:config]]. + +الاعدادات الظاهرة بخلفية حمراء فاتحة اعدادات محمية ولا يمكن تغييرها بهذه الاضافة. الاعدادات الظاهرة بخلفية زرقاء هي القيم الافتراضية والاعدادات الظاهرة بخلفية بيضاء خصصت لهذا التثبيت محليا. الاعدادات الزرقاء والبيضاء يمكن تغييرها. + +تأكد من ضغط زر **SAVE** قبل ترك الصفحة وإلا ستضيع تعديلاتك. diff --git a/lib/plugins/config/lang/ar/lang.php b/lib/plugins/config/lang/ar/lang.php new file mode 100644 index 0000000..bdcb1f9 --- /dev/null +++ b/lib/plugins/config/lang/ar/lang.php @@ -0,0 +1,188 @@ + + * @author Khalid + * @author Yaman Hokan + * @author Usama Akkad + */ +$lang['menu'] = 'الإعدادات'; +$lang['error'] = 'لم تحدث الاعدادات بسبب قيمة غير صالحة، رجاء راجع تغييراتك ثم ارسلها. +
    القيم الخاطئة ستظهر محاطة بحدود حمراء.'; +$lang['updated'] = 'رفعت الاعدادات بنجاح.'; +$lang['nochoice'] = '(لا خيارات اخرى متاحة)'; +$lang['locked'] = 'تعذر تحديث ملف الاعدادات، إن لم يكن ذلك مقصودا،
    +تأكد من صحة اسم و صلاحيات ملف الاعدادات المحلي.'; +$lang['danger'] = 'خطر: تغيير هذا الخيار قد يؤدي إلى تعذر الوصول للويكي و قائمة الاعدادات.'; +$lang['warning'] = 'تحذير: تغييرهذا الخيار قد يؤدي لسلوك غير متوقع.'; +$lang['security'] = 'تحذير أمني: تغيير هذا الخيار قد يؤدي إلى مخاطرة أمنية.'; +$lang['_configuration_manager'] = 'مدير الاعدادات'; +$lang['_header_dokuwiki'] = 'اعدادات دوكو ويكي'; +$lang['_header_plugin'] = 'اعدادات الملحقات'; +$lang['_header_template'] = 'اعدادات القوالب'; +$lang['_header_undefined'] = 'اعدادات غير محددة'; +$lang['_basic'] = 'اعدادات اساسية'; +$lang['_display'] = 'اعدادات العرض'; +$lang['_authentication'] = 'اعدادات المواثقة'; +$lang['_anti_spam'] = 'اعدادات مضاد النفاية'; +$lang['_editing'] = 'اعدادات التحرير'; +$lang['_links'] = 'اعدادات الروابط'; +$lang['_media'] = 'اعدادات الوسائط'; +$lang['_notifications'] = 'اعدادات التنبيه'; +$lang['_advanced'] = 'اعدادات متقدمة'; +$lang['_network'] = 'اعدادات الشبكة'; +$lang['_msg_setting_undefined'] = 'لا بيانات إعدادات.'; +$lang['_msg_setting_no_class'] = 'لا صنف إعدادات.'; +$lang['_msg_setting_no_default'] = 'لا قيمة افتراضية.'; +$lang['title'] = 'عنوان الويكي'; +$lang['start'] = 'اسم صفحة البداية'; +$lang['lang'] = 'لغة الواجهة'; +$lang['template'] = 'القالب'; +$lang['tagline'] = 'Tagline (في حال دعم القالب له) +'; +$lang['sidebar'] = 'اسم صفحة الشريط الجانبي (في حال دعم القالب له). تركه فارغا يعطل الشريط الجانبي.'; +$lang['license'] = 'تحت أي رخصة تريد اصدار المحتوى؟'; +$lang['savedir'] = 'دليل حفظ البيانات'; +$lang['basedir'] = 'مسار الخادوم (مثال. /dokuwiki/) اترك فارغا للاكتشاف التلقائي.'; +$lang['baseurl'] = 'عنوان الخادوم (مثال. http://www.yourserver.com). اترك فارغا للاكتشاف التلقائي.'; +$lang['cookiedir'] = 'مسار الكعكات. اترك فارغا لاستخدام baseurl.'; +$lang['dmode'] = 'نمط انشاء المجلدات'; +$lang['fmode'] = 'نمط انشاء الملفات'; +$lang['allowdebug'] = 'مكّن التنقيح عطّلها إن لم تكن بحاجلة لها!'; +$lang['recent'] = 'أحدث التغييرات'; +$lang['recent_days'] = 'مدة إبقاء أحدث التغييرات (ايام)'; +$lang['breadcrumbs'] = 'عدد العناقيد للزيارات'; +$lang['youarehere'] = 'عناقيد هرمية'; +$lang['fullpath'] = 'اظهر المحتوى الكامل للصفحات في '; +$lang['typography'] = 'اعمل استبدالات طبوغرافية'; +$lang['dformat'] = 'تنسيق التاريخ (انظر وظيفة PHP,s strftime)'; +$lang['signature'] = 'التوقيع'; +$lang['showuseras'] = 'الذي يعرض لاظهار المستخدم الذي قام بآخر تحرير لصفحة'; +$lang['toptoclevel'] = 'المستوى الأعلى لمحتويات الجدول'; +$lang['tocminheads'] = 'الحد الأدنى من الترويسات لبناء جدول المحتويات'; +$lang['maxtoclevel'] = 'المستوى الأقصى لمحتويات الجدول'; +$lang['maxseclevel'] = 'المستوى الأقصى لتحرير القسم'; +$lang['camelcase'] = 'استخدم CamelCase للروابط'; +$lang['deaccent'] = 'نظّف اسماء الصفحات'; +$lang['useheading'] = 'استخدم اول ترويسة كأسم للصفحة'; +$lang['sneaky_index'] = 'افتراضيا، ستعرض دوكو ويكي كل اسماء النطاقات في عرض الفهرس. تفعيل هذا الخيار سيخفي مالا يملك المستخدم صلاحية قراءته. قد يؤدي هذا إلى اخفاء نطاقات فرعية متاحة. وقد يؤدي لجعل صفحة الفهرس معطلة في بعض اعدادات ACL.'; +$lang['hidepages'] = 'أخف الصفحات المنطبق عليها (تعابير شرطية)'; +$lang['useacl'] = 'استخدم قائمة التحم بالوصول'; +$lang['autopasswd'] = 'ولد كلمات سر تلقائيا'; +$lang['authtype'] = 'آلية المواثقة'; +$lang['passcrypt'] = 'نمط تشفير كلمة السر'; +$lang['defaultgroup'] = 'المجموعة الافتراضية'; +$lang['superuser'] = 'مجموعة المستخدم المتفوق أو مستخدم أو قائمة مفصولة بالفاصلة مستخدم1،@مجموعة، مستخدم2 صلاحيتهم الوصول الكامل لكل الصفحات و الوظائف بغض النظر عن اعدادات ACL'; +$lang['manager'] = 'مجموعة المدراء أو مستخدم أو قائمة مفصولة بالفاصلة مستخدم1،@مجموعة، مستخدم2 صلاحيتهم بعض الوظائف الادارية'; +$lang['profileconfirm'] = 'اكد تغيير اللاحة بكلمة المرور'; +$lang['rememberme'] = 'اسمح بكعكات الدخول الدائم (تذكرني)'; +$lang['disableactions'] = 'عطّل اجراءات دوكو ويكي'; +$lang['disableactions_check'] = 'تحقق'; +$lang['disableactions_subscription'] = 'اشترك/الغ الاشتراك'; +$lang['disableactions_wikicode'] = 'اعرض المصدر/صدّر صرفا'; +$lang['disableactions_other'] = 'اجراءات أخرى (مفصولة بالفاصلة)'; +$lang['auth_security_timeout'] = 'زمن انتهاء أمان المواثقة (ثوان)'; +$lang['securecookie'] = 'هل يفرض على كعكات التصفح المعدة عبر HTTPS ان ترسل فقط عبر HTTPS من قبل المتصفح؟ عطل هذا إن كان الولوج للويكي مؤمنا فقط عبر SSL لكن تصفح الويكي غير مؤمن.'; +$lang['remote'] = 'مكّن نظام API البعيد. يسمح هذا لبرامج أخرى بالوصول للويكي عبر XML-RPC أو آليات أخرى.'; +$lang['remoteuser'] = 'احصر الوصول البعيد ل API لمستخدمين ومجموعات يفصل بينها بالفاصلة هنا. اترك فارغا لتمكين الجميع.'; +$lang['usewordblock'] = 'احجز الغثاء بناء على قائمة كلمات'; +$lang['relnofollow'] = 'استخدم rel="nofollow" للروابط الخارجية'; +$lang['indexdelay'] = 'التأخير قبل الفهرسة (ثوان)'; +$lang['mailguard'] = 'عناوين بريدية مبهمة'; +$lang['iexssprotect'] = 'تحقق الملفات المرفوعة من احتمال وجود أكواد جافاسكربت أو HTML ضارة'; +$lang['usedraft'] = 'احفظ المسودة تلقائيا أثناء التحرير'; +$lang['locktime'] = 'الحد الأعظمي لقفل الملف (ثوان)'; +$lang['cachetime'] = 'الحد الأعظم لعمر المخُبأ (ثوان)'; +$lang['target____wiki'] = 'النافذة الهدف للروابط الداخلية'; +$lang['target____interwiki'] = 'النافذة الهدف للروابط الممرة interwiki'; +$lang['target____extern'] = 'النافذة الهدف للروابط الخارجية'; +$lang['target____media'] = 'النافذة الهدف لروابط الوسائط'; +$lang['target____windows'] = 'النافذة الهدف لروابط النوافذ'; +$lang['mediarevisions'] = 'تفعيل إصدارات الوسائط؟'; +$lang['refcheck'] = 'التحقق من مرجع الوسائط'; +$lang['gdlib'] = 'اصدار مكتبة GD'; +$lang['im_convert'] = 'المسار إلى اداة تحويل ImageMagick'; +$lang['jpg_quality'] = 'دقة ضغط JPG (0-100)'; +$lang['fetchsize'] = 'الحجم الأعظمي (بايت) ل fetch.php لتنزيله من الخارج'; +$lang['subscribers'] = 'مكن دعم اشتراك الصفحة'; +$lang['subscribe_time'] = 'المهلة بعد ارسال قوائم الاشتراكات والملخصات (ثوان); هذا يجب أن يكون أقل من الوقت المخصص في أيام أحدث التغييرات.'; +$lang['notify'] = 'ارسل تنبيهات التغيير لهذا البريد'; +$lang['registernotify'] = 'ارسل بيانات عن المستخدمين المسجلين جديدا لهذا البريد'; +$lang['mailfrom'] = 'البريد الالكتروني ليستخدم للرسائل الآلية'; +$lang['mailprefix'] = 'بادئة موضوع البريد لتستخدم مع الرسائل الآلية'; +$lang['sitemap'] = 'ولد خرائط موقع جوجل (أيام)'; +$lang['rss_type'] = 'نوع تلقيمات XML'; +$lang['rss_linkto'] = 'تلقيمات XML توصل إلى'; +$lang['rss_content'] = 'مالذي يعرض في عناصر تلقيمات XML؟'; +$lang['rss_update'] = 'تحديث تلقيم XML (ثوان)'; +$lang['rss_show_summary'] = 'تلقيم XML يظهر ملخصا في العنوان'; +$lang['rss_media'] = 'مانوع التغييرات التي ستدرج في تغذية XML؟'; +$lang['updatecheck'] = 'تحقق من التحديثات و تنبيهات الأمان؟ دوكو ويكي ستحتاج للاتصال ب update.dokuwiki.org لأجل ذلك'; +$lang['userewrite'] = 'استعمل عناوين URLs جميلة'; +$lang['useslash'] = 'استخدم الشرطة كفاصل النطاق في العناوين'; +$lang['sepchar'] = 'فاصل كلمة اسم الصفحة'; +$lang['canonical'] = 'استخدم العناوين الشائعة كاملة'; +$lang['fnencode'] = 'نظام ترميز اسماء الملفات بغير الأسكي.'; +$lang['autoplural'] = 'تحقق من صيغ الجمع في الروابط'; +$lang['compression'] = 'طريقة الغضط لملفات attic'; +$lang['gzip_output'] = 'استخدم ترميز-محتوى gzip ل xhtml'; +$lang['compress'] = 'رُص مخرجات CSS و جافا سكربت'; +$lang['cssdatauri'] = 'الحجم بالبايتات للصور المذكورة في CSS التي ستُضمن في صفحة-التنسيق لخفض طلبات HTTP. 400 إلى 600 بايت تعد قيمة جيدة. اضبط إلى 0 لتعطلها.'; +$lang['send404'] = 'ارسل "HTTP 404/Page Not Found" للصفحات غير الموجودة'; +$lang['broken_iua'] = 'هل الوظيفة ignore_user_abort معطلة على جهازك؟ قد يؤدي ذلك لتعطيل فهرسة البحث. IIS+PHP/CGI تعرف بأنها لاتعمل. أنظر العلة 852 لمزيد من المعلومات.'; +$lang['xsendfile'] = 'استخدم ترويسة X-Sendfile لتمكين خادم الوب من تقديم ملفات ثابتة؟ يجب أن يكون خادم الوب داعما له.'; +$lang['renderer_xhtml'] = 'المحرك ليستخدم لمخرجات الويكي الأساسية وفق (xhtml).'; +$lang['renderer__core'] = '%s (نواة دوكو ويكي)'; +$lang['renderer__plugin'] = '%s (ملحق)'; +$lang['proxy____host'] = 'اسم خادوم الوكيل'; +$lang['proxy____port'] = 'منفذ الوكيل'; +$lang['proxy____user'] = 'اسم مستخدم الوكيل'; +$lang['proxy____pass'] = 'كلمة سر الوكيل'; +$lang['proxy____ssl'] = 'استخدم ssl للاتصال بالوكيل'; +$lang['proxy____except'] = 'تعبير شرطي لمقابلة العناوين التي ستتجاوز البروكسي.'; +$lang['license_o_'] = 'غير مختار'; +$lang['typography_o_0'] = 'لاشيء'; +$lang['typography_o_1'] = 'استبعاد الاقتباس المفرد'; +$lang['typography_o_2'] = 'تضمين علامات اقتباس مفردة (قد لا يعمل دائما)'; +$lang['userewrite_o_0'] = 'لاشيء'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'دو'; +$lang['deaccent_o_0'] = 'معطل'; +$lang['deaccent_o_1'] = 'أزل اللهجة'; +$lang['deaccent_o_2'] = 'اجعلها لاتينية'; +$lang['gdlib_o_0'] = 'مكتبة GD غير متوفرة'; +$lang['gdlib_o_1'] = 'الاصدار 1.x'; +$lang['gdlib_o_2'] = 'اكتشاف تلقائي'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'أتوم 0.3'; +$lang['rss_type_o_atom1'] = 'أتوم 1.0'; +$lang['rss_content_o_abstract'] = 'خلاصة'; +$lang['rss_content_o_diff'] = 'الفروق الموحدة'; +$lang['rss_content_o_htmldiff'] = 'جدول الفروق بهيئة HTML'; +$lang['rss_content_o_html'] = 'محتوى HTML الكامل للصفحة'; +$lang['rss_linkto_o_diff'] = 'عرض الاختلافات'; +$lang['rss_linkto_o_page'] = 'الصفحة المعدلة'; +$lang['rss_linkto_o_rev'] = 'قائمة بالمراجعات'; +$lang['rss_linkto_o_current'] = 'الصفحة الحالية'; +$lang['compression_o_0'] = 'لا شيء'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'لا تستخدم'; +$lang['xsendfile_o_1'] = 'ترويسة lighttpd مملوكة (قبل الاصدار 1.5)'; +$lang['xsendfile_o_2'] = 'ترويسة X-Sendfile قياسية'; +$lang['xsendfile_o_3'] = 'ترويسة Nginx X-Accel-Redirect مملوكة'; +$lang['showuseras_o_loginname'] = 'اسم الدخول'; +$lang['showuseras_o_username'] = 'اسم المستخدم الكامل'; +$lang['showuseras_o_email'] = 'عنوان بريد المستخدم (مبهم تبعا لاعدادات حارس_البريد)'; +$lang['showuseras_o_email_link'] = 'عنوان بريد المستخدم كـ مالتيو: رابط'; +$lang['useheading_o_0'] = 'أبدا'; +$lang['useheading_o_navigation'] = 'التنقل فقط'; +$lang['useheading_o_content'] = 'محتوى الويكي فقط'; +$lang['useheading_o_1'] = 'دائما'; +$lang['readdircache'] = 'المدة القصوى لتخزين '; diff --git a/lib/plugins/config/lang/bg/intro.txt b/lib/plugins/config/lang/bg/intro.txt new file mode 100644 index 0000000..db09e68 --- /dev/null +++ b/lib/plugins/config/lang/bg/intro.txt @@ -0,0 +1,7 @@ +====== Диспечер на настройките ====== + +От тук можете да управлявате настройките на вашето Dokuwiki. За отделните настройки вижте [[doku>config]]. За повече информация относно тази приставка вижте [[doku>plugin:config]]. + +Настройките изобразени със светло червен фон са защитени и не могат да бъдат променяни с тази приставка. Настройките показани със син фон са стандартните стойности, а настройките с бял фон са били настроени локално за тази конкретна инсталация. Можете да променяте както сините, така и белите настройки. + +Не забравяйте да натиснете бутона **ЗАПИС** преди да напуснете страницата, в противен случай промените няма да бъдат приложени. diff --git a/lib/plugins/config/lang/bg/lang.php b/lib/plugins/config/lang/bg/lang.php new file mode 100644 index 0000000..7173356 --- /dev/null +++ b/lib/plugins/config/lang/bg/lang.php @@ -0,0 +1,189 @@ + + * @author Salif Mehmed + * @author Nikolay Vladimirov + * @author Viktor Usunov + * @author Kiril + */ +$lang['menu'] = 'Настройки'; +$lang['error'] = 'Обновяването на настройките не е възможно, поради невалидна стойност, моля, прегледайте промените си и пробвайте отново. +
    Неверните стойности ще бъдат обградени с червена рамка.'; +$lang['updated'] = 'Обновяването на настройките е успешно.'; +$lang['nochoice'] = '(няма друг възможен избор)'; +$lang['locked'] = 'Обновяването на файла с настройките не е възможно, ако това не е нарочно, проверете,
    + дали името на локалния файл с настройки и правата са верни.'; +$lang['danger'] = 'Внимание: промяна на опцията може да направи Wiki-то и менюто за настройване недостъпни.'; +$lang['warning'] = 'Предупреждение: промяна на опцията може предизвика нежелани последици.'; +$lang['security'] = 'Предупреждение: промяна на опцията може да представлява риск за сигурността.'; +$lang['_configuration_manager'] = 'Диспечер на настройките'; +$lang['_header_dokuwiki'] = 'Настройки на DokuWiki'; +$lang['_header_plugin'] = 'Настройки на приставки'; +$lang['_header_template'] = 'Настройки на шаблона'; +$lang['_header_undefined'] = 'Неопределени настройки'; +$lang['_basic'] = 'Основни настройки'; +$lang['_display'] = 'Настройки за изобразяване'; +$lang['_authentication'] = 'Настройки за удостоверяване'; +$lang['_anti_spam'] = 'Настройки за борба със SPAM-ма'; +$lang['_editing'] = 'Настройки за редактиране'; +$lang['_links'] = 'Настройки на препратките'; +$lang['_media'] = 'Настройки на медията'; +$lang['_notifications'] = 'Настройки за известяване'; +$lang['_syndication'] = 'Настройки на RSS емисиите'; +$lang['_advanced'] = 'Допълнителни настройки'; +$lang['_network'] = 'Мрежови настройки'; +$lang['_msg_setting_undefined'] = 'Няма метаданни за настройките.'; +$lang['_msg_setting_no_class'] = 'Няма клас настройки.'; +$lang['_msg_setting_no_default'] = 'Няма стандартна стойност.'; +$lang['title'] = 'Заглавие за Wiki-то, тоест името'; +$lang['start'] = 'Име на началната страница'; +$lang['lang'] = 'Език на интерфейса'; +$lang['template'] = 'Шаблон (определя вида на страниците)'; +$lang['tagline'] = 'Подзаглавие - изобразява се под името на Wiki-то (ако се поддържа от шаблона)'; +$lang['sidebar'] = 'Име на страницата за страничната лента (ако се поддържа от шаблона). Оставите ли полето празно лентата ще бъде изключена'; +$lang['license'] = 'Под какъв лиценз да бъде публикувано съдържанието?'; +$lang['savedir'] = 'Директория за записване на данните'; +$lang['basedir'] = 'Главна директория (напр. /dokuwiki/). Оставете празно, за да бъде засечена автоматично.'; +$lang['baseurl'] = 'URL адрес (напр. http://www.yourserver.com). Оставете празно, за да бъде засечен автоматично.'; +$lang['cookiedir'] = 'Път за бисквитките. Оставите ли полето празно ще се ползва горния URL адрес.'; +$lang['dmode'] = 'Режим (права) за създаване на директории'; +$lang['fmode'] = 'Режим (права) за създаване на файлове'; +$lang['allowdebug'] = 'Включване на режи debug - изключете, ако не е нужен!'; +$lang['recent'] = 'Скорошни промени - брой елементи на страница'; +$lang['recent_days'] = 'Колко от скорошните промени да се пазят (дни)'; +$lang['breadcrumbs'] = 'Брой на следите. За изключване на функцията задайте 0.'; +$lang['youarehere'] = 'Йерархични следи (в този случай можете да изключите горната опция)'; +$lang['fullpath'] = 'Показване на пълния път до страниците в долния колонтитул.'; +$lang['typography'] = 'Замяна на последователност от символи с типографски еквивалент'; +$lang['dformat'] = 'Формат на датата (виж. strftime функцията на PHP)'; +$lang['signature'] = 'Подпис - какво да внася бутона "Вмъкване на подпис" от редактора'; +$lang['showuseras'] = 'Какво да се показва за потребителя, който последно е променил дадена страницата'; +$lang['toptoclevel'] = 'Главно ниво (заглавие) за съдържанието'; +$lang['tocminheads'] = 'Минимален брой заглавия, определящ дали да бъде създадено съдържание'; +$lang['maxtoclevel'] = 'Максимален брой нива (заглавия) за включване в съдържанието'; +$lang['maxseclevel'] = 'Максимален брой нива предоставяни за самостоятелно редактиране'; +$lang['camelcase'] = 'Ползване на CamelCase за линкове'; +$lang['deaccent'] = 'Почистване имената на страниците (на файловете)'; +$lang['useheading'] = 'Ползване на първото заглавие за име на страница'; +$lang['sneaky_index'] = 'Стандартно DokuWiki ще показва всички именни пространства в индекса. Опцията скрива тези, за които потребителят няма права за четене. Това може да доведе и до скриване на иначе достъпни подименни пространства. С определени настройки на списъците за контрол на достъпа (ACL) може да направи индекса неизползваем. '; +$lang['hidepages'] = 'Скриване на страниците съвпадащи с този регулярен израз(regular expressions)'; +$lang['useacl'] = 'Ползване на списъци за достъп'; +$lang['autopasswd'] = 'Автоматично генериране на пароли, на нови потребители и пращане по пощата'; +$lang['authtype'] = 'Метод за удостоверяване'; +$lang['passcrypt'] = 'Метод за криптиране на паролите'; +$lang['defaultgroup'] = 'Стандартна група'; +$lang['superuser'] = 'Супер потребител - група, потребител или списък със стойности разделени чрез запетая (user1,@group1,user2) с пълен достъп до всички страници и функции без значение от настройките на списъците за достъп (ACL)'; +$lang['manager'] = 'Управител - група, потребител или списък със стойности разделени чрез запетая (user1,@group1,user2) с достъп до определени управленски функции '; +$lang['profileconfirm'] = 'Потвърждаване на промени в профила с парола'; +$lang['rememberme'] = 'Ползване на постоянни бисквитки за вписване (за функцията "Запомни ме")'; +$lang['disableactions'] = 'Изключване функции на DokuWiki'; +$lang['disableactions_check'] = 'Проверка'; +$lang['disableactions_subscription'] = 'Абониране/Отписване'; +$lang['disableactions_wikicode'] = 'Преглед на кода/Експортиране на оригинална версия'; +$lang['disableactions_other'] = 'Други действия (разделени със запетая)'; +$lang['auth_security_timeout'] = 'Автоматично проверяване на удостоверяването всеки (сек)'; +$lang['securecookie'] = 'Да се изпращат ли бисквитките зададени чрез HTTPS, само чрез HTTPS от браузъра? Изключете опцията, когато SSL се ползва само за вписване, а четенето е без SSL.'; +$lang['remote'] = 'Включване на системата за отдалечен API достъп. Това ще позволи на приложения да се свързват с DokuWiki чрез XML-RPC или друг механизъм.'; +$lang['remoteuser'] = 'Ограничаване на отдалечения API достъп - активиране само за следните групи и потребители (отделени със запетая). Ако оставите полето празно всеки ще има достъп достъп.'; +$lang['usewordblock'] = 'Блокиране на SPAM въз основа на на списък от думи'; +$lang['relnofollow'] = 'Ползване на rel="nofollow" за външни препратки'; +$lang['indexdelay'] = 'Забавяне преди индексиране (сек)'; +$lang['mailguard'] = 'Промяна на адресите на ел. поща (във форма непозволяваща пращането на SPAM)'; +$lang['iexssprotect'] = 'Проверяване на качените файлове за вероятен зловреден JavaScript и HTML код'; +$lang['usedraft'] = 'Автоматично запазване на чернова по време на редактиране'; +$lang['locktime'] = 'Макс. период за съхраняване на заключените файлове (сек)'; +$lang['cachetime'] = 'Макс. период за съхраняване на кеша (сек)'; +$lang['target____wiki'] = 'Прозорец за вътрешни препратки'; +$lang['target____interwiki'] = 'Прозорец за препратки към други Wiki сайтове'; +$lang['target____extern'] = 'Прозорец за външни препратки'; +$lang['target____media'] = 'Прозорец за медийни препратки'; +$lang['target____windows'] = 'Прозорец за препратки към Windows'; +$lang['mediarevisions'] = 'Да се пазят ли стари версии на качените файлове (Mediarevisions)?'; +$lang['refcheck'] = 'Проверка за препратка към медия, преди да бъде изтрита'; +$lang['gdlib'] = 'Версия на GD Lib'; +$lang['im_convert'] = 'Път до инструмента за трансформация на ImageMagick'; +$lang['jpg_quality'] = 'Качество на JPG компресията (0-100)'; +$lang['fetchsize'] = 'Максимален размер (байтове), който fetch.php може да сваля'; +$lang['subscribers'] = 'Включване на поддръжката за абониране към страници'; +$lang['subscribe_time'] = 'Време след което абонаментните списъци и обобщения се изпращат (сек); Трябва да е по-малко от времето определено в recent_days.'; +$lang['notify'] = 'Пращане на съобщения за промени по страниците на следната eл. поща'; +$lang['registernotify'] = 'Пращане на информация за нови потребители на следната ел. поща'; +$lang['mailfrom'] = 'Ел. поща, която да се ползва за автоматично изпращане на ел. писма'; +$lang['mailprefix'] = 'Представка за темите (поле subject) на автоматично изпращаните ел. писма'; +$lang['htmlmail'] = 'Изпращане на по-добре изглеждащи, но по-големи по-размер HTML ел. писма. Изключете ако желаете писмата да се изпращат като чист текст.'; +$lang['sitemap'] = 'Генериране на Google sitemap (дни)'; +$lang['rss_type'] = 'Тип на XML емисията'; +$lang['rss_linkto'] = 'XML емисията препраща към'; +$lang['rss_content'] = 'Какво да показват елементите на XML емисията?'; +$lang['rss_update'] = 'Интервал на актуализиране на XML емисията (сек)'; +$lang['rss_show_summary'] = 'Показване на обобщение в заглавието на XML емисията'; +$lang['rss_media'] = 'Кой тип промени да се включват в XML мисията?'; +$lang['updatecheck'] = 'Проверяване за за нови версии и предупреждения за сигурността? Необходимо е Dokiwiki да може да се свързва със update.dokuwiki.org за тази функционалност.'; +$lang['userewrite'] = 'Ползване на nice URL адреси'; +$lang['useslash'] = 'Ползване на наклонена черта за разделител на именните пространства в URL'; +$lang['sepchar'] = 'Разделител между думите в имената на страници'; +$lang['canonical'] = 'Ползване на напълно уеднаквени URL адреси (абсолютни адреси - http://server/path)'; +$lang['fnencode'] = 'Метод за кодиране на не-ASCII именуваните файлове.'; +$lang['autoplural'] = 'Проверяване за множествено число в препратките'; +$lang['compression'] = 'Метод за компресия на attic файлове'; +$lang['gzip_output'] = 'Кодиране на съдържанието с gzip за xhtml'; +$lang['compress'] = 'Компактен CSS и javascript изглед'; +$lang['cssdatauri'] = 'Максимален размер, в байтове, до който изображенията посочени в .CSS файл ще бъдат вграждани в стила (stylesheet), за да се намали броя на HTTP заявките. Техниката не работи за версиите на IE преди 8! Препоръчителни стойности: 400 до 600 байта. Въведете 0 за изключване.'; +$lang['send404'] = 'Пращане на "HTTP 404/Page Not Found" за несъществуващи страници'; +$lang['broken_iua'] = 'Отметнете, ако ignore_user_abort функцията не работи. Може да попречи на търсенето в страниците. Знае се, че комбинацията IIS+PHP/CGI е лоша. Вижте Грешка 852 за повече информация.'; +$lang['xsendfile'] = 'Ползване на Х-Sendfile header, за да може уебсървъра да дава статични файлове? Вашият уеб сървър трябва да го поддържа.'; +$lang['renderer_xhtml'] = 'Представяне на основните изходни данни (xhtml) от Wiki-то с'; +$lang['renderer__core'] = '%s (ядрото на DokuWiki)'; +$lang['renderer__plugin'] = '%s (приставка)'; +$lang['dnslookups'] = 'DokuWiki ще търси имената на хостовете, на отдалечени IP адреси, от които потребители редактират страници. НЕ е желателно да ползвате опцията ако имате бавен или неработещ DNS сървър.'; +$lang['proxy____host'] = 'Име на прокси сървър'; +$lang['proxy____port'] = 'Порт за проксито'; +$lang['proxy____user'] = 'Потребител за проксито'; +$lang['proxy____pass'] = 'Парола за проксито'; +$lang['proxy____ssl'] = 'Ползване на SSL при свързване с проксито'; +$lang['proxy____except'] = 'Регулярен израз определящ за кои URL адреси да не се ползва прокси сървър.'; +$lang['license_o_'] = 'Нищо не е избрано'; +$lang['typography_o_0'] = 'без'; +$lang['typography_o_1'] = 'с изключение на единични кавички'; +$lang['typography_o_2'] = 'включително единични кавички (не винаги работи)'; +$lang['userewrite_o_0'] = 'без'; +$lang['userewrite_o_1'] = 'файлът .htaccess'; +$lang['userewrite_o_2'] = 'вътрешно от DokuWiki '; +$lang['deaccent_o_0'] = 'изключено'; +$lang['deaccent_o_1'] = 'премахване на акценти'; +$lang['deaccent_o_2'] = 'транслитерация'; +$lang['gdlib_o_0'] = 'GD Lib не е достъпна'; +$lang['gdlib_o_1'] = 'Версия 1.x'; +$lang['gdlib_o_2'] = 'Автоматично разпознаване'; +$lang['rss_type_o_rss'] = 'RSS версия 0.91'; +$lang['rss_type_o_rss1'] = 'RSS версия 1.0'; +$lang['rss_type_o_rss2'] = 'RSS версия 2.0'; +$lang['rss_type_o_atom'] = 'Atom версия 0.3'; +$lang['rss_type_o_atom1'] = 'Atom версия 1.0'; +$lang['rss_content_o_abstract'] = 'Извлечение'; +$lang['rss_content_o_diff'] = 'Обединени разлики'; +$lang['rss_content_o_htmldiff'] = 'Таблица с разликите в HTML формат'; +$lang['rss_content_o_html'] = 'Цялото съдържание на HTML страницата'; +$lang['rss_linkto_o_diff'] = 'изглед на разликите'; +$lang['rss_linkto_o_page'] = 'променената страница'; +$lang['rss_linkto_o_rev'] = 'списък на версиите'; +$lang['rss_linkto_o_current'] = 'текущата страница'; +$lang['compression_o_0'] = 'без'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'без'; +$lang['xsendfile_o_1'] = 'Специфичен lighttpd header (преди версия 1.5)'; +$lang['xsendfile_o_2'] = 'Стандартен X-Sendfile header'; +$lang['xsendfile_o_3'] = 'Специфичен Nginx X-Accel-Redirect header за пренасочване'; +$lang['showuseras_o_loginname'] = 'Име за вписване'; +$lang['showuseras_o_username'] = 'Пълно потребителско име'; +$lang['showuseras_o_email'] = 'Ел, поща (променени според настройките на mailguard)'; +$lang['showuseras_o_email_link'] = 'Ел. поща под формата на връзка тип mailto:'; +$lang['useheading_o_0'] = 'Никога'; +$lang['useheading_o_navigation'] = 'Само за навигация'; +$lang['useheading_o_content'] = 'Само за съдържанието на Wiki-то'; +$lang['useheading_o_1'] = 'Винаги'; +$lang['readdircache'] = 'Максимален период за съхраняване кеша на readdir (сек)'; diff --git a/lib/plugins/config/lang/ca-valencia/intro.txt b/lib/plugins/config/lang/ca-valencia/intro.txt new file mode 100644 index 0000000..6dd461d --- /dev/null +++ b/lib/plugins/config/lang/ca-valencia/intro.txt @@ -0,0 +1,10 @@ +====== Gestor de configuració ====== + +Controle des d'esta pàgina els ajusts de DokuWiki. +Per a obtindre ajuda sobre cada ajust vaja a [[doku>config]]. +Per a més informació al voltant d'este plúgin vaja a [[doku>config]]. + +Els ajusts mostrats en un fondo roig claret estan protegits i no els pot +modificar en este plúgin. Els ajusts mostrats en un fondo blau tenen els valors predeterminats i els ajusts mostrats en un fondo blanc han segut modificats localment per ad esta instalació. Abdós ajusts, blaus i blancs, es poden modificar. + +Recorde pulsar el botó **GUARDAR** ans d'anar-se'n d'esta pàgina o perdrà els canvis que haja fet. diff --git a/lib/plugins/config/lang/ca-valencia/lang.php b/lib/plugins/config/lang/ca-valencia/lang.php new file mode 100644 index 0000000..e44b2c6 --- /dev/null +++ b/lib/plugins/config/lang/ca-valencia/lang.php @@ -0,0 +1,169 @@ + + * @author Bernat Arlandis + * @author Bernat Arlandis + */ +$lang['menu'] = 'Ajusts de configuració'; +$lang['error'] = 'Els ajusts no s\'han actualisat per algun valor invàlit, per favor, revise els canvis i torne a guardar. +
    Els valors incorrectes es mostraran en una vora roja.'; +$lang['updated'] = 'Els ajusts s\'han actualisat correctament.'; +$lang['nochoice'] = '(no n\'hi ha atres opcions disponibles)'; +$lang['locked'] = 'L\'archiu de configuració no es pot actualisar, si açò no és intencionat,
    comprove que els permissos de l\'archiu de configuració local estiguen be.'; +$lang['danger'] = 'Perill: canviant esta opció pot fer inaccessibles el wiki i el menú de configuració.'; +$lang['warning'] = 'Advertència: canviar esta opció pot causar un comportament imprevist.'; +$lang['security'] = 'Advertència de seguritat: canviar esta opció pot presentar un risc de seguritat.'; +$lang['_configuration_manager'] = 'Gestor de configuració'; +$lang['_header_dokuwiki'] = 'Ajusts de DokuWiki'; +$lang['_header_plugin'] = 'Configuració de plúgins'; +$lang['_header_template'] = 'Configuració de plantilles'; +$lang['_header_undefined'] = 'Atres configuracions'; +$lang['_basic'] = 'Ajusts bàsics'; +$lang['_display'] = 'Ajusts de visualisació'; +$lang['_authentication'] = 'Ajusts d\'autenticació'; +$lang['_anti_spam'] = 'Ajusts anti-spam'; +$lang['_editing'] = 'Ajusts d\'edició'; +$lang['_links'] = 'Ajusts de vínculs'; +$lang['_media'] = 'Ajusts de mijos'; +$lang['_advanced'] = 'Ajusts alvançats'; +$lang['_network'] = 'Ajusts de ret'; +$lang['_msg_setting_undefined'] = 'Ajust sense informació.'; +$lang['_msg_setting_no_class'] = 'Ajust sense classe.'; +$lang['_msg_setting_no_default'] = 'Sense valor predeterminat.'; +$lang['fmode'] = 'Modo de creació d\'archius'; +$lang['dmode'] = 'Modo de creació de directoris'; +$lang['lang'] = 'Idioma'; +$lang['basedir'] = 'Directori base'; +$lang['baseurl'] = 'URL base'; +$lang['savedir'] = 'Directori per a guardar senyes'; +$lang['start'] = 'Nom de la pàgina inicial'; +$lang['title'] = 'Títul del Wiki'; +$lang['template'] = 'Plantilla'; +$lang['license'] = '¿Baix quina llicència deuen publicar-se els continguts?'; +$lang['fullpath'] = 'Mostrar en el peu el camí complet a les pàgines'; +$lang['recent'] = 'Canvis recents'; +$lang['breadcrumbs'] = 'Llongitut del rastre'; +$lang['youarehere'] = 'Rastre jeràrquic'; +$lang['typography'] = 'Fer substitucions tipogràfiques'; +$lang['dformat'] = 'Format de data (vore la funció date de PHP)'; +$lang['signature'] = 'Firma'; +$lang['toptoclevel'] = 'Nivell superior de la taula de continguts'; +$lang['tocminheads'] = 'Número mínim de titulars que generen una TDC'; +$lang['maxtoclevel'] = 'Nivell màxim de la taula de continguts'; +$lang['maxseclevel'] = 'Nivell màxim d\'edició de seccions'; +$lang['camelcase'] = 'Utilisar CamelCase per als vínculs'; +$lang['deaccent'] = 'Depurar els noms de pàgines'; +$lang['useheading'] = 'Utilisar el primer titular per al nom de pàgina'; +$lang['refcheck'] = 'Comprovar referències a mijos'; +$lang['allowdebug'] = 'Permetre depurar (¡desactivar quan no es necessite!)'; +$lang['usewordblock'] = 'Bloquejar spam basant-se en una llista de paraules'; +$lang['indexdelay'] = 'Retart abans d\'indexar (seg.)'; +$lang['relnofollow'] = 'Utilisar rel="nofollow" en vínculs externs'; +$lang['mailguard'] = 'Ofuscar les direccions de correu'; +$lang['iexssprotect'] = 'Comprovar que els archius pujats no tinguen possible còdic Javascript o HTML maliciós'; +$lang['showuseras'] = 'Qué mostrar quan aparega l\'últim usuari que ha editat la pàgina'; +$lang['useacl'] = 'Utilisar llistes de control d\'accés'; +$lang['autopasswd'] = 'Generar contrasenyes automàticament'; +$lang['authtype'] = 'Sistema d\'autenticació'; +$lang['passcrypt'] = 'Método de sifrat de la contrasenya'; +$lang['defaultgroup'] = 'Grup predeterminat'; +$lang['superuser'] = 'Super-usuari - grup, usuari o llista separada per comes (usuari1,@grup1,usuari2) en accés total a totes les pàgines i funcions independentment dels ajusts ACL'; +$lang['manager'] = 'Manager - grup, usuari o llista separada per comes (usuari1,@grup1,usuari2) en accés a certes funcions d\'administració'; +$lang['profileconfirm'] = 'Confirmar canvis al perfil en la contrasenya'; +$lang['disableactions'] = 'Desactivar accions de DokuWiki'; +$lang['disableactions_check'] = 'Comprovar'; +$lang['disableactions_subscription'] = 'Subscriure\'s/Desubscriure\'s'; +$lang['disableactions_wikicode'] = 'Vore font/exportar còdic'; +$lang['disableactions_other'] = 'Atres accions (separades per comes)'; +$lang['sneaky_index'] = 'Normalment, DokuWiki mostra tots els espais de noms en la vista d\'índex. Activant esta opció s\'ocultaran aquells per als que l\'usuari no tinga permís de llectura. Açò pot ocultar subespais accessibles i inutilisar l\'índex per a certes configuracions del ACL.'; +$lang['auth_security_timeout'] = 'Temps de seguritat màxim per a l\'autenticació (segons)'; +$lang['securecookie'] = '¿El navegador deuria enviar per HTTPS només les galletes que s\'han generat per HTTPS? Desactive esta opció quan utilise SSL només en la pàgina d\'inici de sessió.'; +$lang['updatecheck'] = '¿Buscar actualisacions i advertències de seguritat? DokuWiki necessita conectar a update.dokuwiki.org per ad açò.'; +$lang['userewrite'] = 'Utilisar URL millorades'; +$lang['useslash'] = 'Utilisar \'/\' per a separar espais de noms en les URL'; +$lang['usedraft'] = 'Guardar automàticament un borrador mentres edite'; +$lang['sepchar'] = 'Separador de paraules en els noms de pàgines'; +$lang['canonical'] = 'Utilisar URL totalment canòniques'; +$lang['autoplural'] = 'Buscar formes en plural en els vínculs'; +$lang['compression'] = 'Método de compressió per als archius de l\'àtic'; +$lang['cachetime'] = 'Edat màxima de la caché (seg.)'; +$lang['locktime'] = 'Edat màxima d\'archius de bloqueig (seg.)'; +$lang['fetchsize'] = 'Tamany màxim (bytes) que fetch.php pot descarregar externament'; +$lang['notify'] = 'Enviar notificacions de canvis ad esta direcció de correu'; +$lang['registernotify'] = 'Enviar informació d\'usuaris recentment registrats ad esta direcció de correu'; +$lang['mailfrom'] = 'Direcció de correu a utilisar per a mensages automàtics'; +$lang['gzip_output'] = 'Utilisar Content-Encoding gzip per a xhtml'; +$lang['gdlib'] = 'Versió de GD Lib'; +$lang['im_convert'] = 'Ruta a la ferramenta de conversió ImageMagick'; +$lang['jpg_quality'] = 'Calitat de compressió JPG (0-100)'; +$lang['subscribers'] = 'Activar la subscripció a pàgines'; +$lang['compress'] = 'Compactar l\'eixida CSS i Javascript'; +$lang['hidepages'] = 'Amagar les pàgines coincidents (expressions regulars)'; +$lang['send404'] = 'Enviar "HTTP 404/Page Not Found" per a les pàgines que no existixen'; +$lang['sitemap'] = 'Generar sitemap de Google (dies)'; +$lang['broken_iua'] = '¿La funció ignore_user_abort funciona mal en este sistema? Podria ser la causa d\'un índex de busca que no funcione. Es sap que IIS+PHP/CGI té este problema. Veja Bug 852 per a més informació.'; +$lang['xsendfile'] = '¿Utilisar l\'encapçalat X-Sendfile per a que el servidor web servixca archius estàtics? El servidor web ho ha d\'admetre.'; +$lang['renderer_xhtml'] = 'Visualisador a utilisar per a l\'eixida principal del wiki (xhtml)'; +$lang['renderer__core'] = '%s (dokuwiki core)'; +$lang['renderer__plugin'] = '%s (plúgin)'; +$lang['rememberme'] = 'Permetre recordar permanentment la sessió (recordar-me)'; +$lang['rss_type'] = 'Tipo de canal XML'; +$lang['rss_linkto'] = 'El canal XML vincula a'; +$lang['rss_content'] = '¿Qué mostrar en els ítems del canal XML?'; +$lang['rss_update'] = 'Interval d\'actualisació del canal XML (seg.)'; +$lang['recent_days'] = 'Quànts canvis recents guardar (dies)'; +$lang['rss_show_summary'] = 'Que el canal XML mostre el sumari en el títul'; +$lang['target____wiki'] = 'Finestra destí per a vínculs interns'; +$lang['target____interwiki'] = 'Finestra destí per a vínculs d\'interwiki'; +$lang['target____extern'] = 'Finestra destí per a vínculs externs'; +$lang['target____media'] = 'Finestra destí per a vinculs a mijos'; +$lang['target____windows'] = 'Finestra destí per a vínculs a finestres'; +$lang['proxy____host'] = 'Nom del servidor proxy'; +$lang['proxy____port'] = 'Port del proxy'; +$lang['proxy____user'] = 'Nom d\'usuari del proxy'; +$lang['proxy____pass'] = 'Contrasenya del proxy'; +$lang['proxy____ssl'] = 'Utilisar SSL per a conectar al proxy'; +$lang['license_o_'] = 'Cap triada'; +$lang['typography_o_0'] = 'cap'; +$lang['typography_o_1'] = 'Excloure cometes simples'; +$lang['typography_o_2'] = 'Incloure cometes simples (podria no funcionar sempre)'; +$lang['userewrite_o_0'] = 'cap'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'Interna de DokuWiki'; +$lang['deaccent_o_0'] = 'desactivat'; +$lang['deaccent_o_1'] = 'llevar accents'; +$lang['deaccent_o_2'] = 'romanisar'; +$lang['gdlib_o_0'] = 'GD Lib no està disponible'; +$lang['gdlib_o_1'] = 'Versió 1.x'; +$lang['gdlib_o_2'] = 'Autodetecció'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstracte'; +$lang['rss_content_o_diff'] = 'Unified Diff'; +$lang['rss_content_o_htmldiff'] = 'Taula de diferències en format HTML'; +$lang['rss_content_o_html'] = 'Contingut complet de la pàgina en HTML'; +$lang['rss_linkto_o_diff'] = 'mostrar diferències'; +$lang['rss_linkto_o_page'] = 'la pàgina revisada'; +$lang['rss_linkto_o_rev'] = 'llista de revisions'; +$lang['rss_linkto_o_current'] = 'la pàgina actual'; +$lang['compression_o_0'] = 'cap'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'No utilisar'; +$lang['xsendfile_o_1'] = 'Encapçalat propietari lighttpd (abans de la versió 1.5)'; +$lang['xsendfile_o_2'] = 'Encapçalat Standard X-Sendfile'; +$lang['xsendfile_o_3'] = 'Encapçalat propietari Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Nom d\'inici de sessió'; +$lang['showuseras_o_username'] = 'Nom complet de l\'usuari'; +$lang['showuseras_o_email'] = 'Direcció de correu de l\'usuari (oculta segons la configuració)'; +$lang['showuseras_o_email_link'] = 'Direcció de correu de l\'usuari com un víncul mailto:'; +$lang['useheading_o_0'] = 'Mai'; +$lang['useheading_o_navigation'] = 'Només navegació'; +$lang['useheading_o_content'] = 'Només contingut del wiki'; +$lang['useheading_o_1'] = 'Sempre'; diff --git a/lib/plugins/config/lang/ca/intro.txt b/lib/plugins/config/lang/ca/intro.txt new file mode 100644 index 0000000..9ce4e66 --- /dev/null +++ b/lib/plugins/config/lang/ca/intro.txt @@ -0,0 +1,7 @@ +====== Gestió de la configuració ====== + +Utilitzeu aquesta pàgina per controlar els paràmetres de la vostra instal·lació de DokuWiki. Ajuda sobre paràmetres individuals en [[doku>config]]. Més detalls sobre aquest connector en [[doku>plugin:config]]. + +Els paràmetres que es visualitzen sobre fons vermell clar estan protegits i no es poden modificar amb aquest connector. Els paràmetres que es visualitzen sobre fons blau tenen valors per defecte. Els de fons blanc s'han configurat localment per a aquesta instal·lació. Tant els blaus com els blanc es poden modificar. + +Recordeu que cal prémer el botó **DESA** abans de sortir d'aquesta pàgina, o si no es perdrien els canvis. diff --git a/lib/plugins/config/lang/ca/lang.php b/lib/plugins/config/lang/ca/lang.php new file mode 100644 index 0000000..0f527dc --- /dev/null +++ b/lib/plugins/config/lang/ca/lang.php @@ -0,0 +1,188 @@ + + * @author Marc Zulet + * @author Joan + * @author David Surroca + * @author Adolfo Jayme Barrientos + * @author Carles Bellver + * @author carles.bellver + * @author daniel + * @author controlonline.net + * @author Pauet + * @author Àngel Pérez Beroy + */ +$lang['menu'] = 'Paràmetres de configuració'; +$lang['error'] = 'Els paràmetres no s\'han pogut actualitzar per causa d\'un valor incorrecte Reviseu els canvis i torneu a enviar-los.
    Els valors incorrectes es ressaltaran amb un marc vermell.'; +$lang['updated'] = 'Els paràmetres s\'han actualitzat amb èxit.'; +$lang['nochoice'] = '(no hi altres opcions disponibles)'; +$lang['locked'] = 'El fitxer de paràmetres no es pot actualitzar. Si això és involuntari,
    +assegureu-vos que el nom i els permisos del fitxer local de paràmetres són correctes.'; +$lang['danger'] = 'Alerta: si canvieu aquesta opció podeu fer que el wiki i el menú de configuració no siguin accessibles.'; +$lang['warning'] = 'Avís: modificar aquesta opció pot provocar un comportament no desitjat.'; +$lang['security'] = 'Avís de seguretat: modificar aquesta opció pot implicar un risc de seguretat.'; +$lang['_configuration_manager'] = 'Gestió de la configuració'; +$lang['_header_dokuwiki'] = 'Paràmetres de DokuWiki'; +$lang['_header_plugin'] = 'Paràmetres de connectors'; +$lang['_header_template'] = 'Paràmetres de plantilles'; +$lang['_header_undefined'] = 'Paràmetres no definits'; +$lang['_basic'] = 'Paràmetres bàsics'; +$lang['_display'] = 'Paràmetres de visualització'; +$lang['_authentication'] = 'Paràmetres d\'autenticació'; +$lang['_anti_spam'] = 'Paràmetres anti-brossa'; +$lang['_editing'] = 'Paràmetres d\'edició'; +$lang['_links'] = 'Paràmetres d\'enllaços'; +$lang['_media'] = 'Paràmetres de mitjans'; +$lang['_notifications'] = 'Paràmetres de notificació'; +$lang['_syndication'] = 'Paràmetres de sindicació'; +$lang['_advanced'] = 'Paràmetres avançats'; +$lang['_network'] = 'Paràmetres de xarxa'; +$lang['_msg_setting_undefined'] = 'Falten metadades de paràmetre.'; +$lang['_msg_setting_no_class'] = 'Falta classe de paràmetre.'; +$lang['_msg_setting_no_default'] = 'No hi ha valor per defecte.'; +$lang['title'] = 'Títol del wiki'; +$lang['start'] = 'Nom de la pàgina d\'inici'; +$lang['lang'] = 'Idioma'; +$lang['template'] = 'Plantilla'; +$lang['tagline'] = 'Lema (si la plantilla ho suporta)'; +$lang['sidebar'] = 'Nom de la barra lateral (si la plantilla ho suporta). Si ho deixeu buit, la barra lateral es deshabilitarà.'; +$lang['license'] = 'Amb quina llicència voleu publicar el contingut?'; +$lang['savedir'] = 'Directori per desar les dades'; +$lang['basedir'] = 'Directori base'; +$lang['baseurl'] = 'URL base'; +$lang['cookiedir'] = 'Adreça per a les galetes. Si ho deixeu en blanc, es farà servir la URL base.'; +$lang['dmode'] = 'Mode de creació de directoris'; +$lang['fmode'] = 'Mode de creació de fitxers'; +$lang['allowdebug'] = 'Permet depuració inhabiliteu si no és necessari'; +$lang['recent'] = 'Canvis recents'; +$lang['recent_days'] = 'Quantitat de canvis recents que es mantenen (dies)'; +$lang['breadcrumbs'] = 'Nombre d\'engrunes'; +$lang['youarehere'] = 'Camí d\'engrunes jeràrquic'; +$lang['fullpath'] = 'Mostra el camí complet de les pàgines al peu'; +$lang['typography'] = 'Substitucions tipogràfiques'; +$lang['dformat'] = 'Format de data (vg. la funció PHP strftime)'; +$lang['signature'] = 'Signatura'; +$lang['showuseras'] = 'Què cal visualitzar quan es mostra el darrer usuari que ha editat la pàgina'; +$lang['toptoclevel'] = 'Nivell superior per a la taula de continguts'; +$lang['tocminheads'] = 'Quantitat mínima d\'encapçalaments que determina si es construeix o no la taula de continguts.'; +$lang['maxtoclevel'] = 'Nivell màxim per a la taula de continguts'; +$lang['maxseclevel'] = 'Nivell màxim d\'edició de seccions'; +$lang['camelcase'] = 'Utilitza CamelCase per als enllaços'; +$lang['deaccent'] = 'Noms de pàgina nets'; +$lang['useheading'] = 'Utilitza el primer encapçalament per als noms de pàgina'; +$lang['sneaky_index'] = 'Per defecte, DokuWiki mostrarà tots els espai en la visualització d\'índex. Si activeu aquest paràmetre, s\'ocultaran aquells espais en els quals l\'usuari no té accés de lectura. Això pot fer que s\'ocultin subespais que sí que són accessibles. En algunes configuracions ACL pot fer que l\'índex resulti inutilitzable.'; +$lang['hidepages'] = 'Oculta pàgines coincidents (expressions regulars)'; +$lang['useacl'] = 'Utilitza llistes de control d\'accés'; +$lang['autopasswd'] = 'Generació automàtica de contrasenyes'; +$lang['authtype'] = 'Rerefons d\'autenticació'; +$lang['passcrypt'] = 'Mètode d\'encriptació de contrasenyes'; +$lang['defaultgroup'] = 'Grup per defecte'; +$lang['superuser'] = 'Superusuari: un grup o usuari amb accés complet a totes les pàgines i funcions independentment dels paràmetres ACL'; +$lang['manager'] = 'Administrador: un grup o usuari amb accés a certes funcions d\'administració'; +$lang['profileconfirm'] = 'Confirma amb contrasenya els canvis en el perfil'; +$lang['rememberme'] = 'Permet galetes de sessió permanents ("recorda\'m")'; +$lang['disableactions'] = 'Inhabilita accions DokuWiki'; +$lang['disableactions_check'] = 'Revisa'; +$lang['disableactions_subscription'] = 'Subscripció/cancel·lació'; +$lang['disableactions_wikicode'] = 'Mostra/exporta font'; +$lang['disableactions_profile_delete'] = 'Suprimeix el propi compte'; +$lang['disableactions_other'] = 'Altres accions (separades per comes)'; +$lang['auth_security_timeout'] = 'Temps d\'espera de seguretat en l\'autenticació (segons)'; +$lang['securecookie'] = 'Les galetes que s\'han creat via HTTPS, només s\'han d\'enviar des del navegador per HTTPS? Inhabiliteu aquesta opció si només l\'inici de sessió del wiki es fa amb SSL i la navegació del wiki es fa sense seguretat.'; +$lang['usewordblock'] = 'Bloca brossa per llista de paraules'; +$lang['relnofollow'] = 'Utilitza rel="nofollow" en enllaços externs'; +$lang['indexdelay'] = 'Retard abans d\'indexar (segons)'; +$lang['mailguard'] = 'Ofusca les adreces de correu'; +$lang['iexssprotect'] = 'Comprova codi HTML o Javascript maligne en els fitxers penjats'; +$lang['usedraft'] = 'Desa automàticament un esborrany mentre s\'edita'; +$lang['locktime'] = 'Durada màxima dels fitxers de bloqueig (segons)'; +$lang['cachetime'] = 'Durada màxima de la memòria cau (segons)'; +$lang['target____wiki'] = 'Finestra de destinació en enllaços interns'; +$lang['target____interwiki'] = 'Finestra de destinació en enllaços interwiki'; +$lang['target____extern'] = 'Finestra de destinació en enllaços externs'; +$lang['target____media'] = 'Finestra de destinació en enllaços de mitjans'; +$lang['target____windows'] = 'Finestra de destinació en enllaços de Windows'; +$lang['refcheck'] = 'Comprova la referència en els fitxers de mitjans'; +$lang['gdlib'] = 'Versió GD Lib'; +$lang['im_convert'] = 'Camí de la utilitat convert d\'ImageMagick'; +$lang['jpg_quality'] = 'Qualitat de compressió JPEG (0-100)'; +$lang['fetchsize'] = 'Mida màxima (bytes) que fetch.php pot baixar d\'un lloc extern'; +$lang['subscribers'] = 'Habilita la subscripció a pàgines'; +$lang['notify'] = 'Envia notificacions de canvis a aquesta adreça de correu'; +$lang['registernotify'] = 'Envia informació sobre nous usuaris registrats a aquesta adreça de correu'; +$lang['mailfrom'] = 'Adreça de correu remitent per a missatges automàtics'; +$lang['sitemap'] = 'Genera mapa del lloc en format Google (dies)'; +$lang['rss_type'] = 'Tipus de canal XML'; +$lang['rss_linkto'] = 'Destinació dels enllaços en el canal XML'; +$lang['rss_content'] = 'Què es mostrarà en els elements del canal XML?'; +$lang['rss_update'] = 'Interval d\'actualització del canal XML (segons)'; +$lang['rss_show_summary'] = 'Mostra resum en els títols del canal XML'; +$lang['rss_media_o_pages'] = 'pàgines'; +$lang['updatecheck'] = 'Comprova actualitzacions i avisos de seguretat. DokuWiki necessitarà contactar amb update.dokuwiki.org per utilitzar aquesta característica.'; +$lang['userewrite'] = 'Utilitza URL nets'; +$lang['useslash'] = 'Utilitza la barra / com a separador d\'espais en els URL'; +$lang['sepchar'] = 'Separador de paraules en els noms de pàgina'; +$lang['canonical'] = 'Utilitza URL canònics complets'; +$lang['autoplural'] = 'Comprova formes plurals en els enllaços'; +$lang['compression'] = 'Mètode de compressió per als fitxers de les golfes'; +$lang['gzip_output'] = 'Codifica contingut xhtml com a gzip'; +$lang['compress'] = 'Sortida CSS i Javascript compacta'; +$lang['send404'] = 'Envia "HTTP 404/Page Not Found" per a les pàgines inexistents'; +$lang['broken_iua'] = 'No funciona en el vostre sistema la funció ignore_user_abort? Això podria malmetre l\'índex de cerques. Amb IIS+PHP/CGI se sap que no funciona. Vg. Bug 852 per a més informació.'; +$lang['xsendfile'] = 'Utilitza la capçalera X-Sendfile perquè el servidor web distribueixi fitxers estàtics. No funciona amb tots els servidors web.'; +$lang['renderer_xhtml'] = 'Renderitzador que cal utilitzar per a la sortida principal (xhtml) del wiki'; +$lang['renderer__core'] = '%s (ànima del dokuwiki)'; +$lang['renderer__plugin'] = '%s (connector)'; +$lang['search_fragment_o_exact'] = 'exacte'; +$lang['search_fragment_o_starts_with'] = 'comença per'; +$lang['search_fragment_o_ends_with'] = 'termina per'; +$lang['search_fragment_o_contains'] = 'conté'; +$lang['proxy____host'] = 'Nom del servidor intermediari'; +$lang['proxy____port'] = 'Port del servidor intermediari'; +$lang['proxy____user'] = 'Nom d\'usuari del servidor intermediari'; +$lang['proxy____pass'] = 'Contrasenya del servidor intermediari'; +$lang['proxy____ssl'] = 'Utilitza SSL per connectar amb el servidor intermediari'; +$lang['license_o_'] = 'Cap selecció'; +$lang['typography_o_0'] = 'cap'; +$lang['typography_o_1'] = 'només cometes dobles'; +$lang['typography_o_2'] = 'totes les cometes (podria no funcionar sempre)'; +$lang['userewrite_o_0'] = 'cap'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'intern del DokuWiki'; +$lang['deaccent_o_0'] = 'desactivat'; +$lang['deaccent_o_1'] = 'treure accents'; +$lang['deaccent_o_2'] = 'romanització'; +$lang['gdlib_o_0'] = 'GD Lib no està disponible'; +$lang['gdlib_o_1'] = 'Versió 1.x'; +$lang['gdlib_o_2'] = 'Detecció automàtica'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Resum'; +$lang['rss_content_o_diff'] = 'Diff unificat'; +$lang['rss_content_o_htmldiff'] = 'Taula de diferències en format HTML'; +$lang['rss_content_o_html'] = 'Contingut complet de la pàgina en format HTML'; +$lang['rss_linkto_o_diff'] = 'Visualització de diferències'; +$lang['rss_linkto_o_page'] = 'pàgina modificada'; +$lang['rss_linkto_o_rev'] = 'llista de revisions'; +$lang['rss_linkto_o_current'] = 'revisió actual'; +$lang['compression_o_0'] = 'cap'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'no utilitzis'; +$lang['xsendfile_o_1'] = 'Capçalera pròpia de lighttpd (anterior a la versió 1.5)'; +$lang['xsendfile_o_2'] = 'Capçalera X-Sendfile estàndard'; +$lang['xsendfile_o_3'] = 'Capçalera X-Accel-Redirect de propietat de Nginx '; +$lang['showuseras_o_loginname'] = 'Nom d\'usuari'; +$lang['showuseras_o_username'] = 'Nom complet de l\'usuari'; +$lang['showuseras_o_email'] = 'Adreça de correu electrònic de l\'usuari (ofuscada segons el paràmetre de configuració corresponent)'; +$lang['showuseras_o_email_link'] = 'Adreça de correu electrònic amb enllaç mailto:'; +$lang['useheading_o_0'] = 'Mai'; +$lang['useheading_o_navigation'] = 'Només navegació'; +$lang['useheading_o_content'] = 'Només contingut wiki'; +$lang['useheading_o_1'] = 'Sempre'; diff --git a/lib/plugins/config/lang/ckb/intro.txt b/lib/plugins/config/lang/ckb/intro.txt new file mode 100644 index 0000000..b4be638 --- /dev/null +++ b/lib/plugins/config/lang/ckb/intro.txt @@ -0,0 +1,6 @@ +====== بەڕێوەبردنی رێکخستنەکان ====== +ئەم لاپەڕەیە بەکاربێنە بۆ کۆنترۆڵکردنی ڕێکخستنەکانی دامەزراندنی DokuWiki. بۆ یارمەتی دان لەسەر رێکخستنەکان تاک ئاماژە بە . [[doku>config]] بۆ زانیاری زیاتر دەربارەی ئەم زیادکراوەکان بڕوانە [[doku>plugin:config]]. + +ئەو رێکخستنەکانی کە بە باکگراوندی سووری کاڵ پیشان دراون پارێزراون و ناتوانرێت لەگەڵ ئەم پێوەکراوە دا بگۆردرێ. ئەو رێکخستنەکانی کە باکگراوندی شینیان هەیە بەها گریمانەییەکان نوچەیین و رێکخستنەکانی پییشاندراو بە باکگراوندی سپی لە خۆوە بۆ ئەم جێگیرکردنە دیاریکراوانە دانراوە. هەردوو ڕێکبەندەکانی شین و سپی دەکرێت بگۆردرین. + +بیرت بێت کە دوگمەی **پاشکەوت** دابگرە پێش ئەوەی ئەم لاپەڕەیە بەجێ بهێڵم ئەگینا گۆڕانکاریەکانت وون دەبن. \ No newline at end of file diff --git a/lib/plugins/config/lang/ckb/lang.php b/lib/plugins/config/lang/ckb/lang.php new file mode 100644 index 0000000..0c5a38d --- /dev/null +++ b/lib/plugins/config/lang/ckb/lang.php @@ -0,0 +1,212 @@ + + * @author Wrya + */ +$lang['menu'] = 'سازدانی ڕێکخستنەکان'; +$lang['error'] = 'رێکخستنەکان نوێ نەکرانەوە بەهۆی بەهایەکی نادروست، تکایە پێداچوونەوە بە گۆڕانکاریەکانت دا بکە و دووبارە بینێرە. +
    بەهای نادروست نیشان دەدرێت کە بە سنووری سوور دەورەدراوە.'; +$lang['updated'] = 'رێکخستنەکان بە سەرکەوتوویی نوێکرانەوە.'; +$lang['nochoice'] = '(هیچ بژاردەیەکی تر لەبەردەستدا نیە)'; +$lang['locked'] = 'ناتوانرێت فایلی ڕێکخستنەکان نوێبکرێتەوە، ئەگەر ئەمە بێ مەبەست بێت،
    + دڵنیابە لەوەی ناوی فایلی ڕێکبەندەکانی ناوخۆ و مۆڵەتەکان ڕاستن.'; +$lang['danger'] = 'مەترسی: گۆڕینی ئەم هەڵبژاردنە لەوانەیە ویکی و لیستی شێوەپێدانەکەت ناتوانرێت دەست پێبکات.'; +$lang['warning'] = 'ئاگاداری: گۆڕینی ئەم هەڵبژاردنە لەوانەیە ببێت بە هۆی ڕەفتارێکی نامەبەست.'; +$lang['security'] = 'ئاگاداری پاراستن: گۆڕینی ئەم هەڵبژاردنە لەوانەیە مەترسیەکی ئەمنی پێشکەش بکات.'; +$lang['_configuration_manager'] = 'بەڕێوەبەری شێوەپێدان'; +$lang['_header_dokuwiki'] = 'دۆکوویکی'; +$lang['_header_plugin'] = 'پێوەکراو'; +$lang['_header_template'] = 'ڕووخسار'; +$lang['_header_undefined'] = 'ڕێکبەندە پێناسە نەکراوەکان'; +$lang['_basic'] = 'بنەڕەتی'; +$lang['_display'] = 'پیشان بدە'; +$lang['_authentication'] = 'سەلماندن'; +$lang['_anti_spam'] = 'دژە-سپام'; +$lang['_editing'] = 'دەستکاریکردن'; +$lang['_links'] = 'بەستەرەکان'; +$lang['_media'] = 'میدیا'; +$lang['_notifications'] = 'ئاگانامە'; +$lang['_syndication'] = 'سەندیکا (RSS)'; +$lang['_advanced'] = 'پێشکەوتوو'; +$lang['_network'] = 'تۆڕ'; +$lang['_msg_setting_undefined'] = 'دانانی مێتاداتا'; +$lang['_msg_setting_no_class'] = 'پۆلی ڕێکخستن نیە'; +$lang['_msg_setting_no_known_class'] = 'دانانی پۆل بەردەست نیە.'; +$lang['_msg_setting_no_default'] = 'هیچ بەهایەکی گریمانەیی نیە.'; +$lang['title'] = 'ناونیشانی ویکی ئاکا. ناوی ویکیی ەکەت'; +$lang['start'] = 'ناوی لاپەڕە بۆ بەکارهێنانی وەک خاڵی سەرەتا بۆ هەر بۆشایی ناوێک'; +$lang['lang'] = 'زمانی ڕووکار'; +$lang['template'] = 'ڕووکاری ئاکا. دیزاینی ویکی'; +$lang['tagline'] = '(تاگلاین (ئەگەر تێمپلەیت پشتگیری بکات'; +$lang['sidebar'] = 'ناوی لاتەنیشت لاپەڕە (ئەگەر تێمپلەیت پشتگیری بکات), خانەی بەتاڵ شریتی لالەکاردەکەوێ'; +$lang['license'] = 'دەبێت ناوەڕۆکەکەت لە ژێر کام مۆڵەتدا بڵاوبکرێتەوە؟ '; +$lang['savedir'] = 'دایەرێکتۆری بۆ هەڵگرتنی داتا '; +$lang['basedir'] = 'ڕێڕەوی سێرڤەر (eg. /dokuwiki/). چۆڵی بە جێبهێڵە بۆ دۆزینەوەی خۆکار.'; +$lang['baseurl'] = 'URL ی سێرڤەر (eg. http://www.yourserver.com) چۆڵی بە جێبهێڵە بۆ دۆزینەوەی خۆکار.'; +$lang['cookiedir'] = 'ڕیگای کوکی، چۆڵی بەچێبهێڵە بۆ بنەمای خۆی'; +$lang['dmode'] = 'مۆدی دروست کردنی دایەرێکتۆری'; +$lang['fmode'] = 'دۆخی دروستکردنی فایل'; +$lang['allowdebug'] = 'ڕێگەبدە بە هەڵباککردن. ناچالاک کردن ئەگەر پێویست نەبوو!'; +$lang['recent'] = 'ژمارەی تێکردنەکان بۆ هەر پەڕەیەک لە گۆڕانکاریەکانی ئەم دواییەدا'; +$lang['recent_days'] = '(چەند گۆڕانکاری ئەم دواییە بۆ هێشتنەوەی (ڕۆژەکان'; +$lang['breadcrumbs'] = 'ژمارەی پارچە نانەکان دانانی بۆ 0 بۆ ناچالاککردن.'; +$lang['youarehere'] = '(بەکارهێنانی نانی نانی هەرەمی (لەوانەیە بتەوێت ئەم هەڵبژاردنەی سەرەوە لە کار بخەیت دواتر'; +$lang['fullpath'] = 'دەرکردنی ڕێگای تەواوی پەڕەکان لە ژێرپەڕە'; +$lang['typography'] = 'ئایا گۆڕینی جۆری -ئێڵپۆگرافیک بکە'; +$lang['dformat'] = 'فۆرماتی بەروار (بڕوانە PHP \'s strftime function)'; +$lang['signature'] = 'چی بکەیت بە دوگمەی ئیمزا لە سەرنووسەر'; +$lang['showuseras'] = 'چی پیشان بدرێت کاتێک بەکارهێنەرەکە نیشان دەدات کە دوایین جار پەڕەیەکی بژارکردووە'; +$lang['toptoclevel'] = 'ئاستی سەرەوە بۆ ریزبەندی بابەتەکان'; +$lang['tocminheads'] = 'کەمترین بڕی مانشێت کە دیاری دەکات کە ئایا تۆک بنیات نراوە'; +$lang['maxtoclevel'] = 'بەرزترین ئاست بۆ ریزبەندی بابەتەکان'; +$lang['maxseclevel'] = 'بەرزترین ئاستی بژارکردنی بەش'; +$lang['camelcase'] = 'بەکارهێنانی کەیسی وشتر بۆ بەستەرەکان'; +$lang['deaccent'] = 'چۆن ناوی لاپەڕەکان خاوێن بکەوە'; +$lang['useheading'] = 'یەکەم سەردێڕ بۆ ناوی لاپەڕەکان بەکاربهێنە'; +$lang['sneaky_index'] = 'بە گریمانەیی، DokuWiki هەموو بۆشاییناوەکان لە نەخشەی سایتەکە پیشان دەدات. چالاککردنی ئەم هەڵبژاردنە ئەو کەسانە دەشارێتەوە کە بەکارهێنەر مۆڵەتەکانی خوێندنەوەی نیە. ئەمە لەوانەیە ببێتە هۆی شاردنەوەی بۆشایی لاوەکی توانای چوونەژورەوەی هەبێت کە لەوانەیە ئیندێکس ەکە بەکارنەهیێت لەگەڵ هەندێک ڕێکخستنی ACL.'; +$lang['hidepages'] = 'شاردنەوەی پەڕەکان کە هاوچەوچەن لەگەڵ ئەم دەربڕینە ئاساییە لە گەڕان، نەخشەی سایت ەکە و ئیندێکسە ئۆتۆماتیکیەکانی تر'; +$lang['useacl'] = 'بەکارهێنانی لیستەکانی کۆنترۆڵی چوونەژورەوە'; +$lang['autopasswd'] = 'تێپەڕوشە دروستکەری خۆکار'; +$lang['authtype'] = 'Authentication backend'; +$lang['passcrypt'] = 'شێوازی نهێنینهێنی'; +$lang['defaultgroup'] = 'گرووپی بنەڕەت، هەموو بەکارهێنەرە نوێکان لەم گرووپەدا دابنرێ'; +$lang['superuser'] = 'Superuser - group, بەکارهێنەر یان وێرکڕا لیستی جیاکراوە user1,@group1,user2 لەگەڵ گەیشتنی تەواو بۆ هەموو لاپەڕەکان و ئەرکەکان بەبێ گوێدانە ڕێکبەندەکانی ACL'; +$lang['manager'] = 'بەڕێوەبەر - گرووپ، بەکارهێنەر یان بۆر لیستی جیاکراوەی user1,@group1,user2لەگەڵ دەستگەیشتن بە هەندێک ئەرکی بەڕێوەبردن'; +$lang['profileconfirm'] = 'پشتڕاستکردنەوەی گۆڕانکاریەکانی پرۆفایل بە نهێنوشە'; +$lang['rememberme'] = 'ڕێگەدان بە کۆکیزەکانی چوونە ژوورەوەی هەمیشەیی (لەبیرت بێت)'; +$lang['disableactions'] = 'کردارەکانی دۆکوویکی لە کاربخە'; +$lang['disableactions_check'] = 'پشکنین'; +$lang['disableactions_subscription'] = 'ئابوونە/بەتاڵکردنی ئابوونە'; +$lang['disableactions_wikicode'] = 'بینینی سەرچاوە/ناردن خاو'; +$lang['disableactions_profile_delete'] = 'سڕینەوەی ئەژمێری تایبەت'; +$lang['disableactions_other'] = 'کردارەکانی تر (کۆما جیاکراونەتەوە)'; +$lang['disableactions_rss'] = 'XML سەندیکا (RSS)'; +$lang['auth_security_timeout'] = '(کاتی تەواوبووی ئاسایشی ڕەسەنایەتی سەلماندن (چرکە'; +$lang['securecookie'] = 'ئایا کۆکیزەکان لە ڕێگەی HTTPS دابندرێن تەنها لە ڕێگەی HTTPS ئەوە دەنێردرێن لەلایەن وێبگەڕەکە؟ ئەم هەڵبژاردنە لە کاربخە کاتێک تەنها چوونە ژوورەوەی ویکیەکەت پارێزراوە لەگەڵ SSL بەڵام گەڕانی ویکی بە ناپارێزراوی ئەنجام دراوە.'; +$lang['remote'] = 'چالاککردنی سیستەمی API ی دوور. ئەمە ڕێگە بە کاربەرنامەکانی تر دەدات بۆ چوونە ژورەوەی ویکی لە ڕێگەی XML-RPC یان میکانیزمەکانی ترەوە.'; +$lang['remoteuser'] = 'سنوردارکردنی دەستگەیشتنی API لەدوورەوە بۆ کۆمەڵە جیاکراوەکان بە کۆما یان بەکارهێنەرەکان کە لێرە دران. بە بەتاڵی بڕۆ بۆ پێدانی دەستگەیشتن بە هەموو کەسێک.'; +$lang['usewordblock'] = 'بلۆککردنی سپام لەسەر بنەمای لیستی ووشە'; +$lang['relnofollow'] = 'بەکارهێنانی rel="ugc nofollow" لەسەر بەستەری دەرەکی'; +$lang['indexdelay'] = 'دواخستنی کات پێش پێڕستکردن (sec)'; +$lang['mailguard'] = 'ناونیشانی ئیمەیلی نادیار'; +$lang['iexssprotect'] = 'پشکنینی فایلە بارکراوەکان بۆ ئەگەری خراپی JavaScript یان HTML کۆد'; +$lang['usedraft'] = 'بە شێوەیەکی ئۆتۆماتیکی ڕەشنووسێک لە کاتی بژارکردندا خزن بکە'; +$lang['locktime'] = 'بەرزترین تەمەن بۆ فایلەکانی قوفڵ (چرکە) +'; +$lang['cachetime'] = 'بەرزترین تەمەن بۆ حەشارگە (چرکە) +'; +$lang['target____wiki'] = 'پەنجەرەی مەبەست بۆ لینکە ناوەکیەکان +'; +$lang['target____interwiki'] = 'پەنجەرەی مەبەست بۆ لینکەکانی نێوان ویکی +'; +$lang['target____extern'] = 'پەنجەرەی مەبەست بۆ بەستەری دەرەکی'; +$lang['target____media'] = 'پەنجەرەی مەبەست بۆ لینکەکانی میدیا'; +$lang['target____windows'] = 'پەنجەرەی مەبەست بۆ لینکی پەنجەرەکان'; +$lang['mediarevisions'] = 'چالاککردنی پێداچوونەوەکانی میدیا؟'; +$lang['refcheck'] = 'بپشکنە ئەگەر فایلی میدیا هێشتا لە بەکارهێناندایە پێش سڕینەوەی'; +$lang['gdlib'] = 'ڤێرژنی GD Lib'; +$lang['im_convert'] = 'ڕێڕەو بۆ ئامڕازی گۆڕینی ImageMagick'; +$lang['jpg_quality'] = 'کوالیتی پەستانەکانی JPG (0-100)'; +$lang['fetchsize'] = '(گەورەترین قەبارە (بایت fetch.php لەوانەیە دابەزێنێت لە URLs دەرەکی, وەک. بۆ خەزنکردنی کاتی و گۆڕینی قەبارەی وێنە دەرەکیەکان.'; +$lang['subscribers'] = 'ڕێگە بدە بە بەکارهێنەران بۆ بەشداری کردن لە گۆڕانکاریەکانی لاپەڕە بە ئیمەیڵ'; +$lang['subscribe_time'] = 'کات دوای ئەوەی کە لیستەکانی بەشداریکردن و هەرس دەنێردرێن (چرکە) ؛ ئەمە دەبێت بچووکتر بێت لەو کاتەی کە لە recent_days.'; +$lang['notify'] = 'هەمیشە ئاگاداری ەکانی گۆڕان بنێرە بۆ ئەم ناونیشانی ئیمەیڵە'; +$lang['registernotify'] = 'هەمیشە زانیاری لەسەر بەکارهێنەرە تازە تۆمارکراوەکان بنێرە بۆ ئەم ناونیشانی ئیمەیڵە'; +$lang['mailfrom'] = 'ناونیشانی ئیمەیڵی نێرەر بۆ بەکارهێنانی بۆ ئیمەیڵە ئۆتۆماتیکیەکان'; +$lang['mailreturnpath'] = 'ناونیشانی ئیمەیڵی وەرگر بۆ ئاگانامەکانی نەگەیشتن'; +$lang['mailprefix'] = 'پێشگری بابەتی ئیمەیڵ بۆ بەکارهێنانی بۆ ئیمەیڵە ئۆتۆماتیکیەکان. بە بەتاڵی جێبێڵبۆ بەکارهێنانی ناونیشانی ویکی'; +$lang['htmlmail'] = 'ناردنی گەڕانی باشتر، بەڵام گەورەتر لە قەبارەی ئیمەیلەکانی فرەبەشی HTML. لەکارخستنی تەنها پۆستەکان بۆ دەقی سادە.'; +$lang['sitemap'] = 'دروستکردنی نەخشەی سایتی گووگڵ ئەمە زۆرجار (لە رۆژدا). 0 بۆ ناچالاککردن'; +$lang['rss_type'] = 'جۆری ڕاگەیەنەری XML'; +$lang['rss_linkto'] = 'لینکەکانی فیدی XML بۆ'; +$lang['rss_content'] = 'چی پیشان بدرێت لە ئایتمی فیدی XML؟'; +$lang['rss_update'] = 'ماوەکانی نوێکردنەوەی ڕاگەیەنەری XML (sec)'; +$lang['rss_show_summary'] = 'پوختەی پیشاندانی ڕاگەیەنەری XML لە ناونیشان'; +$lang['rss_show_deleted'] = 'پیشاندانی کورتەکانی وێبی XML'; +$lang['rss_media'] = 'دەبێت چ جۆرە گۆڕانکاریەک لە ڕاگەیەنەری XML دا ریزبەند بکرێت؟'; +$lang['rss_media_o_both'] = 'هەردووک'; +$lang['rss_media_o_pages'] = 'پەڕەکان '; +$lang['rss_media_o_media'] = 'میدیا'; +$lang['updatecheck'] = 'پشکنینی نوێکردنەوەو ئاگاداریەکانی پاراستن؟ DokuWiki پێویستە پەیوەندی بکات update.dokuwiki.org بۆ ئەم تایبەتمەندیە.'; +$lang['userewrite'] = 'بەکارهێنانی URLە جوانەکان'; +$lang['useslash'] = 'بەکارهێنانی کەمکردن وەک جیاکەرەوەی بۆشایی ناو لە URL'; +$lang['sepchar'] = 'جیاکەرەوەی وشەی ناوی لاپەڕە'; +$lang['canonical'] = 'بەکارهێنانی URL ە تەواو قوونەکان'; +$lang['fnencode'] = 'شێوازی کۆدکردنی ناوی فایلەکانی نا-ASCII.'; +$lang['autoplural'] = 'پشکنینی فۆرمەکانی پلوراڵ لە لینکەکان'; +$lang['compression'] = 'شێوازی گوشارکردن بۆ فایلە کەمکراوەکان'; +$lang['gzip_output'] = 'بەکارهێنانی ناوەڕۆکی gzip-بەکۆدکردن بۆ xhtml'; +$lang['compress'] = 'CSS و دەرکەتی جاڤاسکریپت'; +$lang['cssdatauri'] = 'قەبارە لە بایت تا کام وێنە ئاماژە کراوە لە فایلەکانی CSS پێویستە بە ڕاست لە پەڕەی ستایلەکە بنچینەوە بۆ کەمکردنەوەی HTTP داواکاری سەرپەڕی سەروی. 400 بۆ 600 بایت بەهایەکی باشە . دانانی 0 بۆ ناچالاککردن.'; +$lang['send404'] = 'بنێرە "HTTP 404/Page نەدۆزرایەوە" بۆ ئەو لاپەڕانەی کە ئێستا نین'; +$lang['broken_iua'] = 'ئایا ignore_user_abort لە سیستەمەکەت دا تێکچووە؟ ئەمە لەوانەیە دەبێتە هۆی کارنەکردنی گەڕانی ئیندێکس. IIS+PHP/CGI ناسراوە بە شکاوی. بڕوانە Bug 852 بۆ زانیاری زیاتر.'; +$lang['xsendfile'] = 'سەرپەڕەی فایلی-X-Sendfile بەکاربێنە بۆ ئەوەی بهێڵیت وێبسێرڤەرفایلە ستاتیکەکان ڕادەست بکات؟ وێبسێرڤەرەکەت پێویستە پشتگیری ئەمە بکات.'; +$lang['renderer_xhtml'] = 'نمایشی بۆ بەکارهێنانی بۆ سەرەکی (xhtml) دەرچوی ویکی'; +$lang['renderer__core'] = '%s (ناوک دووکوویکی)'; +$lang['renderer__plugin'] = '%s (پێوەکراو)'; +$lang['search_nslimit'] = 'سنوور بۆ گەڕان بۆ ناوەکانی ئێستای X. کاتێک گەڕانێک لە لاپەڕەیەک لە بۆشاییەکی قوڵتردا ئەنجام دەدرێت، یەکەم بۆشایی ناوی X وەک فلتەر زیاد دەکرێت'; +$lang['search_fragment'] = 'دیاریکردنی ڕەفتاری گەڕانی پارچە گریمانەیی'; +$lang['search_fragment_o_exact'] = 'ڕێک'; +$lang['search_fragment_o_starts_with'] = 'دەست پێدەکات بە'; +$lang['search_fragment_o_ends_with'] = 'کۆتایی دێت بە'; +$lang['search_fragment_o_contains'] = 'لەخۆدەگرێت'; +$lang['trustedproxy'] = 'متمانە بە ناردنی پرۆکسی گونجاو لەگەڵ ئەم دەربڕینە ئاساییە دەربارەی ئای پی ڕاستەقینەی کڕیارکە ی ڕاپۆرت دەکەن. گریمانەیی هاوچەشنە لەگەڵ تۆڕە ناوخۆییەکان. بە بەتاڵی جێبێڵبە بۆ باوەڕ کردن بە نوێنەر.'; +$lang['_feature_flags'] = 'ئاڵاکانی تایبەتمەندی'; +$lang['defer_js'] = 'Defer javascript بۆ جێبەجێ کردن پاش ئەوەی HTML لاپەڕەکە شیکراوە. خێرای پەڕەی هەستپێکراو باشتر دەکات بەڵام دەکرێت ژمارەیەکی کەم لە پێوەکراوەکان بشکێنێ.'; +$lang['dnslookups'] = 'DokuWiki بەدوای ناوی خانەخوێبگەڕێ بۆ ناونیشانی ئای پی دوور لە بەکارهێنەران کە لاپەڕە گۆڕانکاریدەکەن. ئەگەر ڕاژەکاری دی ان ئەی سی خاو یان کارنەکردنت هەیە یان ئەم تایبەتمەندیەت نەوێت، ئەم هەڵبژاردنە لە کاربخە'; +$lang['jquerycdn'] = 'ئایا دەبێت فایلەکانی اسکریپتی jQuery و jQuery UI لە CDN دابەزێنرێت؟ ئەمە داواکاری ەکانی HTTP زیاد دەکات، بەڵام لەوانەیە فایلەکان خێراتر باربکەن و بەکارهێنەران لەوانەیە هەر ئێستا خەزنیان بکەن.'; +$lang['jquerycdn_o_0'] = 'بێ CDN، تەنها گەیاندنی ناوخۆیی'; +$lang['jquerycdn_o_jquery'] = 'CDN لە code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN لە cdnjs.com'; +$lang['proxy____host'] = 'ناوی سێرڤەری پرۆکسی'; +$lang['proxy____port'] = 'پۆرتی پرۆکسی'; +$lang['proxy____user'] = 'ناوی بەکارهێنەری پرۆکسی'; +$lang['proxy____pass'] = 'نهێنوشەی پرۆکسی'; +$lang['proxy____ssl'] = 'SSL بەکاربێنە بۆ پەیوەندی کردن بە پڕۆکسی'; +$lang['proxy____except'] = 'دەربڕینی ڕێک بۆ هاوگونجانی URL ەکان کە پێویستە پرۆکسی بۆ ی بپەڕێت.'; +$lang['license_o_'] = 'هیچ هەڵنەبژێردرا'; +$lang['typography_o_0'] = 'هیچ'; +$lang['typography_o_1'] = 'بە لاگرتنی تاکە وتە'; +$lang['typography_o_2'] = 'لەخۆگرتنی تاکە وتە (لەوانەیە هەمیشە کار نەبێت)'; +$lang['userewrite_o_0'] = 'هیچ'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'ناوخۆیی دۆکوویکی'; +$lang['deaccent_o_0'] = 'کوژاوەتەوە'; +$lang['deaccent_o_1'] = 'لابردن جیاوازەکان'; +$lang['deaccent_o_2'] = 'ڕۆمانز'; +$lang['gdlib_o_0'] = 'GD Lib بەردەست نیە'; +$lang['gdlib_o_1'] = 'وەشانی 1.x'; +$lang['gdlib_o_2'] = 'خۆدۆزینەوە'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'ئەبستراکت'; +$lang['rss_content_o_diff'] = 'دیفێکی یەکگرتوو'; +$lang['rss_content_o_htmldiff'] = 'خشتەی جیاوازی فۆرماتکراو HTML'; +$lang['rss_content_o_html'] = 'ناوەڕۆکی تەواوی پەڕەی HTML'; +$lang['rss_linkto_o_diff'] = 'ڕوانگەی جیاواز'; +$lang['rss_linkto_o_page'] = 'لاپەڕەی پێداچوونەوەکراو'; +$lang['rss_linkto_o_rev'] = 'لیستی پێداچوونەوەکان'; +$lang['rss_linkto_o_current'] = 'پەڕەی ئێستا'; +$lang['compression_o_0'] = 'هیچ'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'بەکارمەهێنیت'; +$lang['xsendfile_o_1'] = '(سەرپەڕی گشتی لایتپی دی (پێش بڵاوکردنەوەی ١.٥'; +$lang['xsendfile_o_2'] = 'سەرپەڕی فایلی-X-پێوانەیی'; +$lang['xsendfile_o_3'] = 'سەرپەڕەی سەرپەڕەی خاوەن بەشی Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'ناوی چوونەژوورەوە'; +$lang['showuseras_o_username'] = 'ناوی تەواوی بەکارهێنەر'; +$lang['showuseras_o_username_link'] = 'ناوی تەواوی بەکارهێنەر وەک لینکی بەکارهێنەری نێوان ویکی'; +$lang['showuseras_o_email'] = 'ناونیشانی ئیمەیڵی بەکارهێنەر (بە گوێرەی رێکبەندەکانی پاسەوانی پۆستە ی یورلاکراوە)'; +$lang['showuseras_o_email_link'] = 'ناونیشانی ئیمەیڵی بەکارهێنەر وەک ئیمەیل: link'; +$lang['useheading_o_0'] = 'هەرگیز'; +$lang['useheading_o_navigation'] = 'تەنها ڕێنیشاندەر'; +$lang['useheading_o_content'] = 'تەنها ناوەڕۆکی ویکی'; +$lang['useheading_o_1'] = 'هەمیشە'; +$lang['readdircache'] = 'بەرزترین تەمەن بۆ کاتی خوێندنەوە (sec)'; diff --git a/lib/plugins/config/lang/cs/intro.txt b/lib/plugins/config/lang/cs/intro.txt new file mode 100644 index 0000000..f98a62a --- /dev/null +++ b/lib/plugins/config/lang/cs/intro.txt @@ -0,0 +1,7 @@ +====== Správa nastavení ====== + +Tuto stránku můžete používat ke správě nastavení vaší instalace DokuWiki. Nápovědu pro konkrétní položky nastavení naleznete na [[doku>config]]. Pro další detaily o tomto pluginu viz [[doku>plugin:config]]. + +Položky se světle červeným pozadím jsou chráněné a nelze je upravovat tímto pluginem. Položky s modrým pozadím jsou výchozí hodnoty a položky s bílým pozadím byly nastaveny lokálně v této konkrétní instalaci. Modré i bílé položky je možné upravovat. + +Než opustíte tuto stránku, nezapomeňte stisknout tlačítko **Uložit**, jinak budou změny ztraceny. diff --git a/lib/plugins/config/lang/cs/lang.php b/lib/plugins/config/lang/cs/lang.php new file mode 100644 index 0000000..8e1241e --- /dev/null +++ b/lib/plugins/config/lang/cs/lang.php @@ -0,0 +1,236 @@ + + * @author Petr Kajzar + * @author Aleksandr Selivanov + * @author Robert Surý + * @author Martin Hořínek + * @author Jonáš Dyba + * @author Bohumir Zamecnik + * @author Zbynek Krivka + * @author tomas + * @author Marek Sacha + * @author Lefty + * @author Vojta Beran + * @author Jakub A. Těšínský (j@kub.cz) + * @author mkucera66 + * @author Jaroslav Lichtblau + * @author Turkislav + * @author Daniel Slováček + * @author Pavel Krupička + */ +$lang['menu'] = 'Správa nastavení'; +$lang['error'] = 'Nastavení nebyla změněna kvůli alespoň jedné neplatné položce, +zkontrolujte prosím své úpravy a odešlete je znovu.
    +Neplatné hodnoty se zobrazí v červeném rámečku.'; +$lang['updated'] = 'Nastavení byla úspěšně upravena.'; +$lang['nochoice'] = '(nejsou k dispozici žádné další volby)'; +$lang['locked'] = 'Nelze upravovat soubor s nastavením. Pokud to není záměrné, +ujistěte se,
    že název a přístupová práva souboru s lokálním +nastavením jsou v pořádku.'; +$lang['danger'] = 'Pozor: Změna tohoto nastavení může způsobit nedostupnost wiki a konfiguračních menu.'; +$lang['warning'] = 'Varování: Změna nastavení může mít za následek chybné chování.'; +$lang['security'] = 'Bezpečnostní varování: Změna tohoto nastavení může způsobit bezpečnostní riziko.'; +$lang['_configuration_manager'] = 'Správa nastavení'; +$lang['_header_dokuwiki'] = 'Nastavení DokuWiki'; +$lang['_header_plugin'] = 'Nastavení pluginů'; +$lang['_header_template'] = 'Nastavení šablon'; +$lang['_header_undefined'] = 'Další nastavení'; +$lang['_basic'] = 'Základní nastavení'; +$lang['_display'] = 'Nastavení zobrazení'; +$lang['_authentication'] = 'Nastavení autentizace'; +$lang['_anti_spam'] = 'Protispamová nastavení'; +$lang['_editing'] = 'Nastavení editace'; +$lang['_links'] = 'Nastavení odkazů'; +$lang['_media'] = 'Nastavení médií'; +$lang['_notifications'] = 'Nastavení upozornění'; +$lang['_syndication'] = 'Nastavení syndikace'; +$lang['_advanced'] = 'Pokročilá nastavení'; +$lang['_network'] = 'Nastavení sítě'; +$lang['_msg_setting_undefined'] = 'Chybí metadata položky.'; +$lang['_msg_setting_no_class'] = 'Chybí třída položky.'; +$lang['_msg_setting_no_known_class'] = 'Konfigurační třída není dostupná.'; +$lang['_msg_setting_no_default'] = 'Chybí výchozí hodnota položky.'; +$lang['title'] = 'Název celé wiki'; +$lang['start'] = 'Název úvodní stránky'; +$lang['lang'] = 'Jazyk'; +$lang['template'] = 'Šablona'; +$lang['tagline'] = 'Slogan (pokud ho šablona podporuje)'; +$lang['sidebar'] = 'Jméno stránky s obsahem postranní lišty (pokud ho šablona podporuje). Prázdné pole postranní lištu deaktivuje.'; +$lang['license'] = 'Pod jakou licencí má být tento obsah publikován?'; +$lang['savedir'] = 'Adresář pro ukládání dat'; +$lang['basedir'] = 'Kořenový adresář (např. /dokuwiki/). Pro autodetekci nechte prázdné.'; +$lang['baseurl'] = 'Kořenové URL (např. http://www.yourserver.com). Pro autodetekci nechte prázdné.'; +$lang['cookiedir'] = 'Cesta pro cookie. Není-li vyplněno, použije se kořenové URL.'; +$lang['dmode'] = 'Přístupová práva pro vytváření adresářů'; +$lang['fmode'] = 'Přístupová práva pro vytváření souborů'; +$lang['allowdebug'] = 'Povolit debugování. Vypněte, pokud to nepotřebujete!'; +$lang['recent'] = 'Počet položek v nedávných změnách'; +$lang['recent_days'] = 'Jak staré nedávné změny zobrazovat (ve dnech)'; +$lang['breadcrumbs'] = 'Počet odkazů na navštívené stránky'; +$lang['youarehere'] = 'Hierarchická "drobečková" navigace'; +$lang['fullpath'] = 'Ukazovat plnou cestu ke stránkám v patičce'; +$lang['typography'] = 'Provádět typografické nahrazování'; +$lang['dformat'] = 'Formát data (viz PHP funkci strftime)'; +$lang['signature'] = 'Podpis'; +$lang['showuseras'] = 'Co se má přesně zobrazit, když se ukazuje uživatel, který naposledy editoval stránku'; +$lang['toptoclevel'] = 'Nejvyšší úroveň, kterou začít automaticky generovaný obsah'; +$lang['tocminheads'] = 'Nejnižší počet hlavních nadpisů, aby se vygeneroval obsah'; +$lang['maxtoclevel'] = 'Maximální počet úrovní v automaticky generovaném obsahu'; +$lang['maxseclevel'] = 'Nejnižší úroveň pro editaci i po sekcích'; +$lang['camelcase'] = 'Používat CamelCase v odkazech'; +$lang['deaccent'] = 'Čistit názvy stránek'; +$lang['useheading'] = 'Používat první nadpis jako název stránky'; +$lang['sneaky_index'] = 'Ve výchozím nastavení DokuWiki zobrazuje v indexu všechny +jmenné prostory. Zapnutím této volby se skryjí ty jmenné prostory, +k nimž uživatel nemá právo pro čtení, což může ale způsobit, že +vnořené jmenné prostory, k nimž právo má, budou přesto skryty. +To může mít za následek, že index bude při některých +nastaveních ACL nepoužitelný.'; +$lang['hidepages'] = 'Skrýt stránky odpovídající vzoru (regulární výrazy)'; +$lang['useacl'] = 'Používat přístupová práva (ACL)'; +$lang['autopasswd'] = 'Generovat hesla automaticky'; +$lang['authtype'] = 'Metoda autentizace'; +$lang['passcrypt'] = 'Metoda šifrování hesel'; +$lang['defaultgroup'] = 'Výchozí skupina'; +$lang['superuser'] = 'Superuživatel - skupina nebo uživatel s plnými právy pro přístup ke všem stránkách bez ohledu na nastavení ACL'; +$lang['manager'] = 'Manažer - skupina nebo uživatel s přístupem k některým správcovským funkcím'; +$lang['profileconfirm'] = 'Potvrdit změny v profilu zadáním hesla'; +$lang['rememberme'] = 'Povolit trvaté přihlašovací cookies (zapamatuj si mě)'; +$lang['disableactions'] = 'Vypnout DokuWiki akce'; +$lang['disableactions_check'] = 'Zkontrolovat'; +$lang['disableactions_subscription'] = 'Přihlásit se/Odhlásit se ze seznamu pro odběr změn'; +$lang['disableactions_wikicode'] = 'Prohlížet zdrojové kódy/Export wiki textu'; +$lang['disableactions_profile_delete'] = 'Smazat vlastní účet'; +$lang['disableactions_other'] = 'Další akce (oddělené čárkou)'; +$lang['disableactions_rss'] = 'XMS syndikace (RSS)'; +$lang['auth_security_timeout'] = 'Časový limit pro autentikaci (v sekundách)'; +$lang['securecookie'] = 'Má prohlížeč posílat cookies nastavené přes HTTPS opět jen přes HTTPS? Vypněte tuto volbu, pokud chcete, aby bylo pomocí SSL zabezpečeno pouze přihlašování do wiki, ale obsah budete prohlížet nezabezpečeně.'; +$lang['samesitecookie'] = 'Atribut samesite cookie, který se má použít. Pokud pole ponecháte prázdné, prohlížeč rozhodne o zásadách samesite.'; +$lang['remote'] = 'Zapne API systému, umožňující jiným aplikacím vzdálený přístup k wiki pomoci XML-RPC nebo jiných mechanizmů.'; +$lang['remoteuser'] = 'Omezit přístup k API na tyto uživatelské skupiny či uživatele (seznam oddělený čárkami). Prázdné pole povolí přístup všem.'; +$lang['remotecors'] = 'Povolit sdílené zdroje odjinud (CORS) pro vzdálená rozhraní. Hvězdičkou (*) povolíte všechny zdroje. Ponechte prázdné, chcete-li zakázat CORS.'; +$lang['usewordblock'] = 'Blokovat spam za použití seznamu známých spamových slov'; +$lang['relnofollow'] = 'Používat rel="nofollow" na externí odkazy'; +$lang['indexdelay'] = 'Časová prodleva před indexací (v sekundách)'; +$lang['mailguard'] = 'Metoda "zamaskování" emailových adres'; +$lang['iexssprotect'] = 'Zkontrolovat nahrané soubory vůči možnému škodlivému JavaScriptu či HTML'; +$lang['usedraft'] = 'Během editace ukládat koncept automaticky'; +$lang['locktime'] = 'Maximální životnost zámkových souborů (v sekundách)'; +$lang['cachetime'] = 'Maximální životnost cache (v sekundách)'; +$lang['target____wiki'] = 'Cílové okno pro interní odkazy'; +$lang['target____interwiki'] = 'Cílové okno pro interwiki odkazy'; +$lang['target____extern'] = 'Cílové okno pro externí odkazy'; +$lang['target____media'] = 'Cílové okno pro odkazy na média'; +$lang['target____windows'] = 'Cílové okno pro odkazy na windows sdílení'; +$lang['mediarevisions'] = 'Aktivovat revize souborů'; +$lang['refcheck'] = 'Kontrolovat odkazy na média (před vymazáním)'; +$lang['gdlib'] = 'Verze GD knihovny'; +$lang['im_convert'] = 'Cesta k nástroji convert z balíku ImageMagick'; +$lang['jpg_quality'] = 'Kvalita komprese JPEG (0-100)'; +$lang['fetchsize'] = 'Maximální velikost souboru (v bajtech), co ještě fetch.php bude stahovat z externích zdrojů'; +$lang['subscribers'] = 'Možnost přihlásit se k odběru novinek stránky'; +$lang['subscribe_time'] = 'Časový interval v sekundách, ve kterém jsou posílány změny a souhrny změn. Interval by neměl být kratší než čas uvedený v recent_days.'; +$lang['notify'] = 'Posílat oznámení o změnách na následující e-mailovou adresu'; +$lang['registernotify'] = 'Posílat informace o nově registrovaných uživatelích na tuto e-mailovou adresu'; +$lang['mailfrom'] = 'E-mailová adresa, která se bude používat pro automatické e-maily'; +$lang['mailreturnpath'] = 'E-mailová adresa příjemce pro oznámení o nedoručení'; +$lang['mailprefix'] = 'Předpona předmětu e-mailu, která se bude používat pro automatické e-maily'; +$lang['htmlmail'] = 'Posílat e-maily v HTML (hezčí ale větší). Při vypnutí budou posílány jen textové e-maily.'; +$lang['dontlog'] = 'Zakázat protokolování pro tyto typy záznamů.'; +$lang['sitemap'] = 'Generovat Google sitemap (interval ve dnech)'; +$lang['rss_type'] = 'Typ XML kanálu'; +$lang['rss_linkto'] = 'XML kanál odkazuje na'; +$lang['rss_content'] = 'Co zobrazovat v položkách XML kanálu?'; +$lang['rss_update'] = 'Interval aktualizace XML kanálu (v sekundách)'; +$lang['rss_show_summary'] = 'XML kanál ukazuje souhrn v titulku'; +$lang['rss_show_deleted'] = 'XML kanál Zobrazit smazané kanály'; +$lang['rss_media'] = 'Jaký typ změn má být uveden v kanálu XML'; +$lang['rss_media_o_both'] = 'oba'; +$lang['rss_media_o_pages'] = 'stránky'; +$lang['rss_media_o_media'] = 'média'; +$lang['updatecheck'] = 'Kontrolovat aktualizace a bezpečnostní varování? DokuWiki potřebuje pro tuto funkci přístup k update.dokuwiki.org'; +$lang['userewrite'] = 'Používat "pěkná" URL'; +$lang['useslash'] = 'Používat lomítko jako oddělovač jmenných prostorů v URL'; +$lang['sepchar'] = 'Znak pro oddělování slov v názvech stránek'; +$lang['canonical'] = 'Používat plně kanonická URL'; +$lang['fnencode'] = 'Metoda pro kódování ne-ASCII názvů souborů'; +$lang['autoplural'] = 'Kontrolovat plurálové tvary v odkazech'; +$lang['compression'] = 'Metoda komprese pro staré verze'; +$lang['gzip_output'] = 'Používat pro xhtml Content-Encoding gzip'; +$lang['compress'] = 'Zahustit CSS a JavaScript výstup'; +$lang['cssdatauri'] = 'Velikost [v bajtech] obrázků odkazovaných v CSS souborech, které budou pro ušetření HTTP požadavku vestavěny do stylu. Doporučená hodnota je mezi 400 a 600 bajty. Pro vypnutí nastavte na 0.'; +$lang['send404'] = 'Posílat "HTTP 404/Page Not Found" pro neexistují stránky'; +$lang['broken_iua'] = 'Je na vašem systému funkce ignore_user_abort porouchaná? To může způsobovat nefunkčnost vyhledávacího indexu. O kombinaci IIS+PHP/CGI je známo, že nefunguje správně. Viz Bug 852 pro více informací.'; +$lang['xsendfile'] = 'Používat X-Sendfile hlavničky pro download statických souborů z webserveru? Je však požadována podpora této funkce na straně Vašeho webserveru.'; +$lang['renderer_xhtml'] = 'Vykreslovací jádro pro hlavní (xhtml) výstup wiki'; +$lang['renderer__core'] = '%s (jádro DokuWiki)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['search_nslimit'] = 'Omezit vyhledávání na současných X jmenných prostorů. Když je vyhledávání provedeno ze stránky zanořeného jmenného prostoru, bude jako filtr přidáno prvních X jmenných prostorů.'; +$lang['search_fragment'] = 'Určete výchozí chování vyhledávání fragmentů'; +$lang['search_fragment_o_exact'] = 'přesný'; +$lang['search_fragment_o_starts_with'] = 'začíná s'; +$lang['search_fragment_o_ends_with'] = 'končí s'; +$lang['search_fragment_o_contains'] = 'obsahuje'; +$lang['trustedproxy'] = 'Důvěřovat proxy serverům odpovídajícím tomuto regulárním výrazu ohledně skutečné IP adresy klienta, kterou hlásí. Výchozí hodnota odpovídá místním sítím. Ponechejte prázdné, pokud nechcete důvěřovat žádné proxy.'; +$lang['_feature_flags'] = 'Feature flags'; +$lang['defer_js'] = 'Odložit spuštění javascriptu až po zpracování HTML kódu stránky. Zlepšuje vnímanou rychlost načtení stránky, ale může narušit funkci některých zásuvných modulů.'; +$lang['hidewarnings'] = 'Nezobrazovat žádná varování PHP. To může usnadnit přechod na PHP8+. Varování budou stále zaznamenána v protokolu chyb a měla by být hlášena.'; +$lang['dnslookups'] = 'DokuWiki zjišťuje DNS jména pro vzdálené IP adresy uživatelů, kteří editují stránky. Pokud máte pomalý, nebo nefunkční DNS server, nebo nepotřebujete tuto funkci, tak tuto volbu zrušte.'; +$lang['jquerycdn'] = 'Mají být skripty jQuery a jQuery UI načítány z CDN? +Vzniknou tím další HTTP dotazy, ale soubory se mohou načíst rychleji a uživatelé je už mohou mít ve vyrovnávací paměti.'; +$lang['jquerycdn_o_0'] = 'Bez CDN, pouze lokální doručení'; +$lang['jquerycdn_o_jquery'] = 'CDN na code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN na cdnjs.com'; +$lang['proxy____host'] = 'Název proxy serveru'; +$lang['proxy____port'] = 'Proxy port'; +$lang['proxy____user'] = 'Proxy uživatelské jméno'; +$lang['proxy____pass'] = 'Proxy heslo'; +$lang['proxy____ssl'] = 'Použít SSL při připojení k proxy'; +$lang['proxy____except'] = 'Regulární výrazy pro URL, pro které bude přeskočena proxy.'; +$lang['license_o_'] = 'Nic nevybráno'; +$lang['typography_o_0'] = 'vypnuto'; +$lang['typography_o_1'] = 'Pouze uvozovky'; +$lang['typography_o_2'] = 'Všechny typy uvozovek a apostrofů (nemusí vždy fungovat)'; +$lang['userewrite_o_0'] = 'vypnuto'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'interní metoda DokuWiki'; +$lang['deaccent_o_0'] = 'vypnuto'; +$lang['deaccent_o_1'] = 'odstranit diakritiku'; +$lang['deaccent_o_2'] = 'převést na latinku'; +$lang['gdlib_o_0'] = 'GD knihovna není k dispozici'; +$lang['gdlib_o_1'] = 'Verze 1.x'; +$lang['gdlib_o_2'] = 'Autodetekce'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstraktní'; +$lang['rss_content_o_diff'] = 'Sjednocený Diff'; +$lang['rss_content_o_htmldiff'] = 'diff tabulka v HTML formátu'; +$lang['rss_content_o_html'] = 'Úplný HTML obsah stránky'; +$lang['rss_linkto_o_diff'] = 'přehled změn'; +$lang['rss_linkto_o_page'] = 'stránku samotnou'; +$lang['rss_linkto_o_rev'] = 'seznam revizí'; +$lang['rss_linkto_o_current'] = 'nejnovější revize'; +$lang['compression_o_0'] = 'vypnuto'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'nepoužívat'; +$lang['xsendfile_o_1'] = 'Proprietární hlavička lighttpd (před releasem 1.5)'; +$lang['xsendfile_o_2'] = 'Standardní hlavička X-Sendfile'; +$lang['xsendfile_o_3'] = 'Proprietární hlavička Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Přihlašovací jméno'; +$lang['showuseras_o_username'] = 'Celé jméno uživatele'; +$lang['showuseras_o_username_link'] = 'Celé uživatelské jméno jako odkaz mezi wiki'; +$lang['showuseras_o_email'] = 'E-mailová adresa uživatele ("zamaskována" aktuálně nastavenou metodou)'; +$lang['showuseras_o_email_link'] = 'E-mailová adresa uživatele jako mailto: odkaz'; +$lang['useheading_o_0'] = 'Nikdy'; +$lang['useheading_o_navigation'] = 'Pouze pro navigaci'; +$lang['useheading_o_content'] = 'Pouze pro wiki obsah'; +$lang['useheading_o_1'] = 'Vždy'; +$lang['readdircache'] = 'Maximální stáří readdir cache (sec)'; diff --git a/lib/plugins/config/lang/cy/intro.txt b/lib/plugins/config/lang/cy/intro.txt new file mode 100644 index 0000000..02ccec5 --- /dev/null +++ b/lib/plugins/config/lang/cy/intro.txt @@ -0,0 +1,7 @@ +====== Rheolwr Ffurfwedd ====== + +Defnyddiwch y dudalen hon i reoli gosodiadau eich arsefydliad DokuWiki. Am gymorth ar osodiadau unigol ewch i [[doku>config]]. Am wybodaeth bellach ar yr ategyn hwn ewch i [[doku>plugin:config]]. + +Mae gosodiadau gyda chefndir coch golau wedi\'u hamddiffyn a \'sdim modd eu newid gyda\'r ategyn hwn. Mae gosodiaadau gyda chefndir glas yn dynodi gwerthoedd diofyn ac mae gosodiadau gyda chefndir gwyn wedi\'u gosod yn lleol ar gyfer yr arsefydliad penodol hwn. Mae modd newid gosodiadau gwyn a glas. + +Cofiwch bwyso y botwm **Cadw** cyn gadael y dudalen neu caiff eich newidiadau eu colli. diff --git a/lib/plugins/config/lang/cy/lang.php b/lib/plugins/config/lang/cy/lang.php new file mode 100644 index 0000000..bb0a2d1 --- /dev/null +++ b/lib/plugins/config/lang/cy/lang.php @@ -0,0 +1,252 @@ + + * @author Matthias Schulte + * @author Alan Davies + */ + +// for admin plugins, the menu prompt to be displayed in the admin menu +// if set here, the plugin doesn't need to override the getMenuText() method +$lang['menu'] = 'Gosodiadau Ffurwedd'; + +$lang['error'] = 'Gosodiadau heb eu diweddaru oherwydd gwerth annilys, gwiriwch eich newidiadau ac ailgyflwyno. +
    Caiff y gwerth(oedd) anghywir ei/eu dangos gydag ymyl coch.'; +$lang['updated'] = 'Diweddarwyd gosodiadau\'n llwyddiannus.'; +$lang['nochoice'] = '(dim dewisiadau eraill ar gael)'; +$lang['locked'] = '\'Sdim modd diweddaru\'r ffeil osodiadau, os ydy hyn yn anfwriadol,
    + sicrhewch fod enw\'r ffeil osodiadau a\'r hawliau lleol yn gywir.'; + +$lang['danger'] = 'Perygl: Gall newid yr opsiwn hwn wneud eich wici a\'r ddewislen ffurfwedd yn anghyraeddadwy.'; +$lang['warning'] = 'Rhybudd: Gall newid yr opsiwn hwn achosi ymddygiad anfwriadol.'; +$lang['security'] = 'Rhybudd Diogelwch: Gall newid yr opsiwn hwn achosi risg diogelwch.'; + +/* --- Config Setting Headers --- */ +$lang['_configuration_manager'] = 'Rheolwr Ffurfwedd'; //same as heading in intro.txt +$lang['_header_dokuwiki'] = 'DokuWiki'; +$lang['_header_plugin'] = 'Ategyn'; +$lang['_header_template'] = 'Templed'; +$lang['_header_undefined'] = 'Gosodiadau Amhenodol'; + +/* --- Config Setting Groups --- */ +$lang['_basic'] = 'Sylfaenol'; +$lang['_display'] = 'Dangos'; +$lang['_authentication'] = 'Dilysiad'; +$lang['_anti_spam'] = 'Gwrth-Sbam'; +$lang['_editing'] = 'Yn Golygu'; +$lang['_links'] = 'Dolenni'; +$lang['_media'] = 'Cyfrwng'; +$lang['_notifications'] = 'Hysbysiad'; +$lang['_syndication'] = 'Syndication (RSS)'; //angen newid +$lang['_advanced'] = 'Uwch'; +$lang['_network'] = 'Rhwydwaith'; + +/* --- Undefined Setting Messages --- */ +$lang['_msg_setting_undefined'] = 'Dim gosodiad metadata.'; +$lang['_msg_setting_no_class'] = 'Dim gosodiad dosbarth.'; +$lang['_msg_setting_no_default'] = 'Dim gwerth diofyn.'; + +/* -------------------- Config Options --------------------------- */ + +/* Basic Settings */ +$lang['title'] = 'Teitl y wici h.y. enw\'ch wici'; +$lang['start'] = 'Enw\'r dudalen i\'w defnyddio fel man cychwyn ar gyfer pob namespace'; //namespace +$lang['lang'] = 'Iaith y rhyngwyneb'; +$lang['template'] = 'Templed h.y. dyluniad y wici.'; +$lang['tagline'] = 'Taglinell (os yw\'r templed yn ei gynnal)'; +$lang['sidebar'] = 'Enw tudalen y bar ochr (os yw\'r templed yn ei gynnal), Mae maes gwag yn analluogi\'r bar ochr'; +$lang['license'] = 'O dan ba drwydded dylai\'ch cynnwys gael ei ryddhau?'; +$lang['savedir'] = 'Ffolder ar gyfer cadw data'; +$lang['basedir'] = 'Llwybr y gweinydd (ee. /dokuwiki/). Gadewch yn wag ar gyfer awtoddatgeliad.'; +$lang['baseurl'] = 'URL y gweinydd (ee. http://www.yourserver.com). Gadewch yn wag ar gyfer awtoddatgeliad.'; +$lang['cookiedir'] = 'Llwybr cwcis. Gadewch yn wag i ddefnyddio \'baseurl\'.'; +$lang['dmode'] = 'Modd creu ffolderi'; +$lang['fmode'] = 'Modd creu ffeiliau'; +$lang['allowdebug'] = 'Caniatáu dadfygio. Analluogwch os nac oes angen hwn!'; + +/* Display Settings */ +$lang['recent'] = 'Nifer y cofnodion y dudalen yn y newidiadau diweddar'; +$lang['recent_days'] = 'Sawl newid diweddar i\'w cadw (diwrnodau)'; +$lang['breadcrumbs'] = 'Nifer y briwsion "trywydd". Gosodwch i 0 i analluogi.'; +$lang['youarehere'] = 'Defnyddiwch briwsion hierarchaidd (byddwch chi yn debygol o angen analluogi\'r opsiwn uchod wedyn)'; +$lang['fullpath'] = 'Datgelu llwybr llawn y tudalennau yn y troedyn'; +$lang['typography'] = 'Gwnewch amnewidiadau argraffyddol'; +$lang['dformat'] = 'Fformat dyddiad (gweler swyddogaeth strftime PHP)'; +$lang['signature'] = 'Yr hyn i\'w mewnosod gyda\'r botwm llofnod yn y golygydd'; +$lang['showuseras'] = 'Yr hyn i\'w harddangos wrth ddangos y defnyddiwr a wnaeth olygu\'r dudalen yn olaf'; +$lang['toptoclevel'] = 'Lefel uchaf ar gyfer tabl cynnwys'; +$lang['tocminheads'] = 'Isafswm y penawdau sy\'n penderfynu os ydy\'r tabl cynnwys yn cael ei adeiladu'; +$lang['maxtoclevel'] = 'Lefel uchaf ar gyfer y tabl cynnwys'; +$lang['maxseclevel'] = 'Lefel uchaf adran olygu'; +$lang['camelcase'] = 'Defnyddio CamelCase ar gyfer dolenni'; +$lang['deaccent'] = 'Sut i lanhau enwau tudalennau'; +$lang['useheading'] = 'Defnyddio\'r pennawd cyntaf ar gyfer enwau tudalennau'; +$lang['sneaky_index'] = 'Yn ddiofyn, bydd DokuWiki yn dangos pob namespace yn y map safle. Bydd galluogi yr opsiwn hwn yn cuddio\'r rheiny lle \'sdim hawliau darllen gan y defnyddiwr. Gall hwn achosi cuddio subnamespaces cyraeddadwy a fydd yn gallu peri\'r indecs i beidio â gweithio gyda gosodiadau ACL penodol.'; //namespace +$lang['hidepages'] = 'Cuddio tudalennau sy\'n cydweddu gyda\'r mynegiad rheolaidd o\'r chwiliad, y map safle ac indecsau awtomatig eraill'; + +/* Authentication Settings */ +$lang['useacl'] = 'Defnyddio rhestrau rheoli mynediad'; +$lang['autopasswd'] = 'Awtogeneradu cyfrineiriau'; +$lang['authtype'] = 'Ôl-brosesydd dilysu'; +$lang['passcrypt'] = 'Dull amgryptio cyfrineiriau'; +$lang['defaultgroup']= 'Grŵp diofyn, caiff pob defnyddiwr newydd ei osod yn y grŵp hwn'; +$lang['superuser'] = 'Uwchddefnyddiwr - grŵp, defnyddiwr neu restr gwahanwyd gan goma defnyddiwr1,@group1,defnyddiwr2 gyda mynediad llawn i bob tudalen beth bynnag y gosodiadau ACL'; +$lang['manager'] = 'Rheolwr - grŵp, defnyddiwr neu restr gwahanwyd gan goma defnyddiwr1,@group1,defnyddiwr2 gyda mynediad i swyddogaethau rheoli penodol'; +$lang['profileconfirm'] = 'Cadrnhau newidiadau proffil gyda chyfrinair'; +$lang['rememberme'] = 'Caniatáu cwcis mewngofnodi parhaol (cofio fi)'; +$lang['disableactions'] = 'Analluogi gweithredoedd DokuWiki'; +$lang['disableactions_check'] = 'Gwirio'; +$lang['disableactions_subscription'] = 'Tanysgrifio/Dad-tanysgrifio'; +$lang['disableactions_wikicode'] = 'Dangos ffynhonnell/Allforio Crai'; +$lang['disableactions_profile_delete'] = 'Dileu Cyfrif Eu Hunain'; +$lang['disableactions_other'] = 'Gweithredoedd eraill (gwahanu gan goma)'; +$lang['disableactions_rss'] = 'XML Syndication (RSS)'; //angen newid hwn +$lang['auth_security_timeout'] = 'Terfyn Amser Diogelwch Dilysiad (eiliadau)'; +$lang['securecookie'] = 'A ddylai cwcis sydd wedi cael eu gosod gan HTTPS gael eu hanfon trwy HTTPS yn unig gan y porwr? Analluogwch yr opsiwn hwn dim ond pan fydd yr unig mewngofnodiad i\'ch wici wedi\'i ddiogelu gydag SSL ond mae pori\'r wici yn cael ei wneud heb ddiogelu.'; +$lang['remote'] = 'Galluogi\'r system API pell. Mae hwn yn galluogi apps eraill i gael mynediad i\'r wici trwy XML-RPC neu fecanweithiau eraill.'; +$lang['remoteuser'] = 'Cyfyngu mynediad API pell i grwpiau neu ddefnydwyr wedi\'u gwahanu gan goma yma. Gadewch yn wag i roi mynediad i bawb.'; + +/* Anti-Spam Settings */ +$lang['usewordblock']= 'Blocio sbam wedi selio ar restr eiriau'; +$lang['relnofollow'] = 'Defnyddio rel="nofollow" ar ddolenni allanol'; +$lang['indexdelay'] = 'Oediad cyn indecsio (eil)'; +$lang['mailguard'] = 'Tywyllu cyfeiriadau ebost'; +$lang['iexssprotect']= 'Gwirio ffeiliau a lanlwythwyd am JavaScript neu god HTML sydd efallai\'n faleisis'; + +/* Editing Settings */ +$lang['usedraft'] = 'Cadw drafft yn awtomatig wrth olygu'; +$lang['locktime'] = 'Oed mwyaf ar gyfer cloi ffeiliau (eil)'; +$lang['cachetime'] = 'Oed mwyaf ar gyfer y storfa (eil)'; + +/* Link settings */ +$lang['target____wiki'] = 'Ffenestr darged ar gyfer dolenni mewnol'; +$lang['target____interwiki'] = 'Ffenestr darged ar gyfer dolenni interwiki'; +$lang['target____extern'] = 'Ffenestr darged ar gyfer dolenni allanol'; +$lang['target____media'] = 'Ffenestr darged ar gyfer dolenni cyfrwng'; +$lang['target____windows'] = 'Ffenestr darged ar gyfer dolenni ffenestri'; + +/* Media Settings */ +$lang['mediarevisions'] = 'Galluogi Mediarevisions?'; +$lang['refcheck'] = 'Gwirio os ydy ffeil gyfrwng yn dal yn cael ei defnydio cyn ei dileu hi'; +$lang['gdlib'] = 'Fersiwn GD Lib'; +$lang['im_convert'] = 'Llwybr i declyn trosi ImageMagick'; +$lang['jpg_quality'] = 'Ansawdd cywasgu JPG (0-100)'; +$lang['fetchsize'] = 'Uchafswm maint (beit) gall fetch.php lawlwytho o URL allanol, ee. i storio ac ailfeintio delweddau allanol.'; + +/* Notification Settings */ +$lang['subscribers'] = 'Caniatáu defnyddwyr i danysgrifio i newidiadau tudalen gan ebost'; +$lang['subscribe_time'] = 'Yr amser cyn caiff rhestrau tanysgrifio a chrynoadau eu hanfon (eil); Dylai hwn fod yn llai na\'r amser wedi\'i gosod mewn recent_days.'; +$lang['notify'] = 'Wastad anfon hysbysiadau newidiadau i\'r cyfeiriad ebost hwn'; +$lang['registernotify'] = 'Wastad anfon gwybodaeth ar ddefnyddwyr newydd gofrestru i\'r cyfeiriad ebost hwn'; +$lang['mailfrom'] = 'Cyfeiriad anfon ebyst i\'w ddefnyddio ar gyfer pyst awtomatig'; +$lang['mailprefix'] = 'Rhagddodiad testun ebyst i\'w ddefnyddio ar gyfer pyst awtomatig. Gadewch yn wag i ddefnyddio teitl y wici'; +$lang['htmlmail'] = 'Anfonwch ebyst aml-ddarn HTML sydd yn edrych yn well, ond sy\'n fwy mewn maint. Analluogwch ar gyfer pyst testun plaen yn unig.'; + +/* Syndication Settings */ +$lang['sitemap'] = 'Generadu map safle Google mor aml â hyn (mewn diwrnodau). 0 i anallogi'; +$lang['rss_type'] = 'Math y ffrwd XML'; +$lang['rss_linkto'] = 'Ffrwd XML yn cysylltu â'; +$lang['rss_content'] = 'Beth i\'w ddangos mewn eitemau\'r ffrwd XML?'; +$lang['rss_update'] = 'Cyfnod diwedaru ffrwd XML (eil)'; +$lang['rss_show_summary'] = 'Dangos crynodeb mewn teitl y ffrwd XML'; +$lang['rss_media'] = 'Pa fath newidiadau a ddylai cael eu rhestru yn y ffrwd XML??'; + +/* Advanced Options */ +$lang['updatecheck'] = 'Gwirio am ddiweddariadau a rhybuddion diogelwch? Mae\'n rhaid i DokuWiki gysylltu ag update.dokuwiki.org ar gyfer y nodwedd hon.'; +$lang['userewrite'] = 'Defnyddio URLs pert'; +$lang['useslash'] = 'Defnyddio slaes fel gwahanydd namespace mewn URL'; +$lang['sepchar'] = 'Gwanahydd geiriau mewn enw tudalennau'; +$lang['canonical'] = 'Defnyddio URLs canonaidd llawn'; +$lang['fnencode'] = 'Dull amgodio enw ffeiliau \'non-ASCII\'.'; +$lang['autoplural'] = 'Gwirio am ffurfiau lluosog mewn dolenni'; +$lang['compression'] = 'Dull cywasgu ar gyfer ffeiliau llofft (hen adolygiadau)'; +$lang['gzip_output'] = 'Defnyddio gzip Content-Encoding ar gyfer xhtml'; //pwy a wyr +$lang['compress'] = 'Cywasgu allbwn CSS a javascript'; +$lang['cssdatauri'] = 'Uchafswm maint mewn beitiau ar gyfer delweddau i\'w cyfeirio atynt mewn ffeiliau CSS a ddylai cael eu mewnosod i\'r ddalen arddull i leihau gorbenion pennyn cais HTTP. Mae 400 i 600 beit yn werth da. Gosodwch i 0 i\'w analluogi.'; +$lang['send404'] = 'Anfon "HTTP 404/Page Not Found" ar gyfer tudalennau sy ddim yn bodoli'; +$lang['broken_iua'] = 'Ydy\'r swyddogaeth ignore_user_abort wedi torri ar eich system? Gall hwn achosi\'r indecs chwilio i beidio â gweithio. Rydym yn gwybod bod IIS+PHP/CGI wedi torri. Gweler Bug 852 am wybodaeth bellach.'; +$lang['xsendfile'] = 'Defnyddio\'r pennyn X-Sendfile i ganiatáu\'r gweinydd gwe i ddanfon ffeiliau statig? Mae\'n rhaid bod eich gweinydd gwe yn caniatáu hyn.'; +$lang['renderer_xhtml'] = 'Cyflwynydd i ddefnyddio ar gyfer prif allbwn (xhtml) y wici'; +$lang['renderer__core'] = '%s (craidd dokuwiki)'; +$lang['renderer__plugin'] = '%s (ategyn)'; + +/* Network Options */ +$lang['dnslookups'] = 'Bydd DokuWiki yn edrych i fyny enwau gwesteiwyr ar gyfer cyfeiriadau IP pell y defnyddwyr hynny sy\'n golygu tudalennau. Os oes gweinydd DNS sy\'n araf neu sy ddim yn gweithio \'da chi neu \'dych chi ddim am ddefnyddio\'r nodwedd hon, analluogwch yr opsiwn hwn.'; + +/* Proxy Options */ +$lang['proxy____host'] = 'Enw\'r gweinydd procsi'; +$lang['proxy____port'] = 'Porth procsi'; +$lang['proxy____user'] = 'Defnyddair procsi'; +$lang['proxy____pass'] = 'Cyfrinair procsi'; +$lang['proxy____ssl'] = 'Defnyddio SSL i gysylltu â\'r procsi'; +$lang['proxy____except'] = 'Mynegiad rheolaidd i gydweddu URL ar gyfer y procsi a ddylai cael eu hanwybyddu.'; + +/* License Options */ +$lang['license_o_'] = 'Dim wedi\'i ddewis'; + +/* typography options */ +$lang['typography_o_0'] = 'dim'; +$lang['typography_o_1'] = 'eithrio dyfynodau sengl'; +$lang['typography_o_2'] = 'cynnwys dyfynodau sengl (efallai ddim yn gweithio pob tro)'; + +/* userewrite options */ +$lang['userewrite_o_0'] = 'dim'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki mewnol'; + +/* deaccent options */ +$lang['deaccent_o_0'] = 'bant'; +$lang['deaccent_o_1'] = 'tynnu acenion'; +$lang['deaccent_o_2'] = 'rhufeinio'; + +/* gdlib options */ +$lang['gdlib_o_0'] = 'GD Lib ddim ar gael'; +$lang['gdlib_o_1'] = 'Fersiwn 1.x'; +$lang['gdlib_o_2'] = 'Awtoddatgeliad'; + +/* rss_type options */ +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; + +/* rss_content options */ +$lang['rss_content_o_abstract'] = 'Crynodeb'; +$lang['rss_content_o_diff'] = 'Gwahan. Unedig'; +$lang['rss_content_o_htmldiff'] = 'Gwahaniaethau ar ffurf tabl HTML'; +$lang['rss_content_o_html'] = 'Cynnwys tudalen HTML llawn'; + +/* rss_linkto options */ +$lang['rss_linkto_o_diff'] = 'golwg gwahaniaethau'; +$lang['rss_linkto_o_page'] = 'y dudalen a adolygwyd'; +$lang['rss_linkto_o_rev'] = 'rhestr adolygiadau'; +$lang['rss_linkto_o_current'] = 'y dudalen gyfredol'; + +/* compression options */ +$lang['compression_o_0'] = 'dim'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; + +/* xsendfile header */ +$lang['xsendfile_o_0'] = "peidio â defnyddio"; +$lang['xsendfile_o_1'] = 'Pennyn perchnogol lighttpd (cyn rhyddhad 1.5)'; +$lang['xsendfile_o_2'] = 'Pennyn safonol X-Sendfile'; +$lang['xsendfile_o_3'] = 'Pennyn perchnogol Nginx X-Accel-Redirect'; + +/* Display user info */ +$lang['showuseras_o_loginname'] = 'Enw mewngofnodi'; +$lang['showuseras_o_username'] = "Enw llawn y defnyddiwr"; +$lang['showuseras_o_username_link'] = "Enw llawn y defnyddiwr fel dolen defnyddiwr interwiki"; +$lang['showuseras_o_email'] = "Cyfeiriad e-bost y defnyddiwr (tywyllu yn ôl gosodiad mailguard)"; +$lang['showuseras_o_email_link'] = "Cyfeiriad e-bost y defnyddiwr fel dolen mailto:"; + +/* useheading options */ +$lang['useheading_o_0'] = 'Byth'; +$lang['useheading_o_navigation'] = 'Llywio yn Unig'; +$lang['useheading_o_content'] = 'Cynnwys Wici yn Unig'; +$lang['useheading_o_1'] = 'Wastad'; + +$lang['readdircache'] = 'Uchafswm amser ar gyfer storfa readdir (eil)'; diff --git a/lib/plugins/config/lang/da/intro.txt b/lib/plugins/config/lang/da/intro.txt new file mode 100644 index 0000000..14cd3d6 --- /dev/null +++ b/lib/plugins/config/lang/da/intro.txt @@ -0,0 +1,7 @@ +====== Opsætningsstyring ====== + +Brug denne side til at kontrollere indstillingerne for din Dokuwiki-opsætning. For at få hjælp med specifikke indstillinger, se [[doku>config]]. For flere detaljer om denne udvidelse, se [[doku>plugin:config]]. + +Indstillinger vist med lys rød baggrund er beskyttede og kan ikke ændres med denne udvidelse. Indstillinger vist med blå baggrund er standardindstillinger og indstillinger vist med hvid baggrund er blevet sat lokalt denne konkrete opsætning. Både blå og hvide indstillinger kan ændres. + +Husk at trykke på **Gem**-knappen før du forlader siden, for at du ikke mister dine ændringer. diff --git a/lib/plugins/config/lang/da/lang.php b/lib/plugins/config/lang/da/lang.php new file mode 100644 index 0000000..9ae191f --- /dev/null +++ b/lib/plugins/config/lang/da/lang.php @@ -0,0 +1,217 @@ + + * @author Kenneth Schack Banner + * @author Jon Theil Nielsen + * @author Lars Næsbye Christensen + * @author Kalle Sommer Nielsen + * @author Esben Laursen + * @author Harith + * @author Daniel Ejsing-Duun + * @author Erik Bjørn Pedersen + * @author rasmus + * @author Mikael Lyngvig + */ +$lang['menu'] = 'Opsætningsindstillinger'; +$lang['error'] = 'Indstillingerne blev ikke opdateret på grund af en ugyldig værdi, Gennemse venligst dine ændringer og gem dem igen. +
    Ugyldige værdier vil blive rammet ind med rødt.'; +$lang['updated'] = 'Indstillingerne blev opdateret korrekt.'; +$lang['nochoice'] = '(ingen andre valgmuligheder)'; +$lang['locked'] = 'Indstillingsfilen kunne ikke opdateres, Hvis dette er en fejl,
    +sørg da for at navnet på den lokale indstillingsfil samt dens rettigheder er korrekte.'; +$lang['danger'] = 'Fare: Ændring af denne mulighed kan gøre din wiki og opsætningsoversigt utilgængelige.'; +$lang['warning'] = 'Advarsel: Ændring af denne mulighed kan forårsage utilsigtet opførsel.'; +$lang['security'] = 'Sikkerhedsadvarsel: Ændring af denne mulighed kan forårsage en sikkerhedsrisiko.'; +$lang['_configuration_manager'] = 'Opsætningsstyring'; +$lang['_header_dokuwiki'] = 'DokuWiki indstillinger'; +$lang['_header_plugin'] = 'Udvidelsesindstillinger'; +$lang['_header_template'] = 'Tema'; +$lang['_header_undefined'] = 'Udefinerede indstillinger'; +$lang['_basic'] = 'Grundindstillinger'; +$lang['_display'] = 'Visningsindstillinger'; +$lang['_authentication'] = 'Bekræftelsesindstillinger'; +$lang['_anti_spam'] = 'Trafikkontrolsindstillinger'; +$lang['_editing'] = 'Redigeringsindstillinger'; +$lang['_links'] = 'Henvisningsindstillinger'; +$lang['_media'] = 'Medieindstillinger'; +$lang['_notifications'] = 'Notificeringsindstillinger'; +$lang['_syndication'] = 'Syndikering (RSS)'; +$lang['_advanced'] = 'Avancerede indstillinger'; +$lang['_network'] = 'Netværksindstillinger'; +$lang['_msg_setting_undefined'] = 'Ingen indstillingsmetadata.'; +$lang['_msg_setting_no_class'] = 'Ingen indstillingsklasse.'; +$lang['_msg_setting_no_known_class'] = 'Indstillingsklasse ikke tilgængelig.'; +$lang['_msg_setting_no_default'] = 'Ingen standardværdi.'; +$lang['title'] = 'Wiki titel (navnet på din wiki)'; +$lang['start'] = 'Startsidens navn (benyttes som startside i alle navnerum)'; +$lang['lang'] = 'Sprog'; +$lang['template'] = 'Tema'; +$lang['tagline'] = 'Tagline (hvis tema understøtter det)'; +$lang['sidebar'] = 'Sidepanelet sidenavn (hvis temaet understøtter det). Lad være blankt for at deaktivere sidepanelet.'; +$lang['license'] = 'Under hvilken licens skal dit indhold frigives?'; +$lang['savedir'] = 'Katalog til opbevaring af data'; +$lang['basedir'] = 'Grundkatalog'; +$lang['baseurl'] = 'Serverens URL-adresse (f.eks. http://www.minserver.dk). Lad være blank for at detektere automatisk.'; +$lang['cookiedir'] = 'Cookie sti. Hvis tom benyttes grundlæggende URL.'; +$lang['dmode'] = 'Mappe oprettelsestilstand'; +$lang['fmode'] = 'Fil oprettelsestilstand'; +$lang['allowdebug'] = 'Tillad fejlretning. Slå fra hvis unødvendig!'; +$lang['recent'] = 'Nylige ændringer'; +$lang['recent_days'] = 'Hvor mange nye ændringer der skal beholdes (dage)'; +$lang['breadcrumbs'] = 'Stilængde. Sæt til 0 for at deaktivere.'; +$lang['youarehere'] = 'Brug hierarkisk sti (hvis slået til, bør du formentlig slå ovenstående fra)'; +$lang['fullpath'] = 'Vis den fulde sti til siderne i sidefoden'; +$lang['typography'] = 'Typografiske erstatninger'; +$lang['dformat'] = 'Datoformat (se PHP\'s strftime-funktion)'; +$lang['signature'] = 'Underskrift'; +$lang['showuseras'] = 'Hvad skal vises når den sidste bruger, der har ændret siden, fremstilles'; +$lang['toptoclevel'] = 'Øverste niveau for indholdsfortegnelse'; +$lang['tocminheads'] = 'Mindste antal overskrifter for at danne en indholdsfortegnelse'; +$lang['maxtoclevel'] = 'Højeste niveau for indholdsfortegnelse'; +$lang['maxseclevel'] = 'Højeste niveau for redigering af sektioner'; +$lang['camelcase'] = 'Brug CamelCase til henvisninger'; +$lang['deaccent'] = 'Pæne sidenavne'; +$lang['useheading'] = 'Brug første overskrift til sidenavne'; +$lang['sneaky_index'] = 'DokuWiki vil som standard vise alle navnerum i indholdsfortegnelsen. Ved at slå denne valgmulighed til vil skjule de navnerum, hvor brugeren ikke har læsetilladelse. Dette kan føre til, at tilgængelige undernavnerum bliver skjult. Ligeledes kan det også gøre indholdsfortegnelsen ubrugelig med visse ACL-opsætninger.'; +$lang['hidepages'] = 'Skjul lignende sider (almindelige udtryk)'; +$lang['useacl'] = 'Benyt adgangskontrollister (ACL)'; +$lang['autopasswd'] = 'Generer adgangskoder automatisk'; +$lang['authtype'] = 'Bekræftelsesgrundlag'; +$lang['passcrypt'] = 'Krypteringsmetode for adgangskoder'; +$lang['defaultgroup'] = 'Standardgruppe'; +$lang['superuser'] = 'Superbruger'; +$lang['manager'] = 'Bestyrer - en gruppe eller bruger med adgang til bestemte styrende funktioner'; +$lang['profileconfirm'] = 'Bekræft profilændringer med adgangskode'; +$lang['rememberme'] = 'Tillad varige datafiler for brugernavne (husk mig)'; +$lang['disableactions'] = 'Slå DokuWiki-muligheder fra'; +$lang['disableactions_check'] = 'Tjek'; +$lang['disableactions_subscription'] = 'Tliføj/Fjern opskrivning'; +$lang['disableactions_wikicode'] = 'Vis kilde/Eksporter grundkode'; +$lang['disableactions_profile_delete'] = 'Slet egen brugerkonto'; +$lang['disableactions_other'] = 'Andre muligheder (kommasepareret)'; +$lang['disableactions_rss'] = 'XML syndikering (RSS)'; +$lang['auth_security_timeout'] = 'Tidsudløb for bekræftelse (sekunder)'; +$lang['securecookie'] = 'Skal datafiler skabt af HTTPS kun sendes af HTTPS gennem browseren? Slå denne valgmulighed fra hvis kun brugen af din wiki er SSL-beskyttet, mens den almindelige tilgang udefra ikke er sikret.'; +$lang['remote'] = 'Aktivér fjern-API\'et. Dette tillader andre programmer at tilgå wikien via XML-RPC eller andre mekanismer.'; +$lang['remoteuser'] = 'Begræns fjern-API adgang til den kommaseparerede liste af grupper eller brugere angivet her. Efterlad tom for at give adgang til alle.'; +$lang['usewordblock'] = 'Bloker uønsket sprogbrug med en ordliste'; +$lang['relnofollow'] = 'Brug rel="nofollow" til udgående henvisninger'; +$lang['indexdelay'] = 'Tidsforsinkelse før katalogisering (sek.)'; +$lang['mailguard'] = 'Slør e-mail adresser'; +$lang['iexssprotect'] = 'Gennemse oplagte filer for mulig skadelig JavaScript- eller HTML-kode.'; +$lang['usedraft'] = 'Gem automatisk en kladde under redigering'; +$lang['locktime'] = 'Længste levetid for låsefiler (sek)'; +$lang['cachetime'] = 'Længste levetid for cache (sek)'; +$lang['target____wiki'] = 'Målvindue for indre henvisninger'; +$lang['target____interwiki'] = 'Målvindue for egne wikihenvisninger '; +$lang['target____extern'] = 'Målvindue for udadgående henvisninger'; +$lang['target____media'] = 'Målvindue for mediehenvisninger'; +$lang['target____windows'] = 'Målvindue til Windows-henvisninger'; +$lang['mediarevisions'] = 'Aktiver revisioner af medier?'; +$lang['refcheck'] = 'Mediehenvisningerkontrol'; +$lang['gdlib'] = 'Version af GD Lib'; +$lang['im_convert'] = 'Sti til ImageMagick\'s omdannerværktøj'; +$lang['jpg_quality'] = 'JPG komprimeringskvalitet (0-100)'; +$lang['fetchsize'] = 'Største antal (bytes) fetch.php må hente udefra, til eksempelvis cache og størrelsesændring af eksterne billeder'; +$lang['subscribers'] = 'Slå understøttelse af abonnement på sider til'; +$lang['subscribe_time'] = 'Tid der går før abonnementlister og nyhedsbreve er sendt (i sekunder). Denne værdi skal være mindre end den tid specificeret under recent_days.'; +$lang['notify'] = 'Send ændringsmeddelelser til denne e-adresse'; +$lang['registernotify'] = 'Send info om nyoprettede brugere til denne e-adresse'; +$lang['mailfrom'] = 'E-mail adresse til brug for automatiske meddelelser'; +$lang['mailreturnpath'] = 'E-mail adresse til notifikation når en mail ikke kan leveres'; +$lang['mailprefix'] = 'Præfiks på e-mail emne til automatiske mails. Efterlad blank for at bruge wikien titel.'; +$lang['htmlmail'] = 'Send pænere, men større, HTML multipart mails. Deaktiver for at sende mails i klar tekst.'; +$lang['sitemap'] = 'Interval for dannelse af Google sitemap (i dage). Sæt til 0 for at deaktivere.'; +$lang['rss_type'] = 'Type af XML-feed'; +$lang['rss_linkto'] = 'XML-feed henviser til'; +$lang['rss_content'] = 'Hvad skal der vises i XML-feed?'; +$lang['rss_update'] = 'XML-feed opdateringsinterval (sek)'; +$lang['rss_show_summary'] = 'XML-feed vis referat i overskriften'; +$lang['rss_show_deleted'] = 'XML feed Vis slettede feeds'; +$lang['rss_media'] = 'Hvilke ændringer skal vises i XML feed?'; +$lang['rss_media_o_both'] = 'begge'; +$lang['rss_media_o_pages'] = 'sider'; +$lang['rss_media_o_media'] = 'media'; +$lang['updatecheck'] = 'Kig efter opdateringer og sikkerhedsadvarsler? DokuWiki er nødt til at kontakte update.dokuwiki.org for at tilgå denne funktion.'; +$lang['userewrite'] = 'Brug pæne netadresser'; +$lang['useslash'] = 'Brug skråstreg som navnerumsdeler i netadresser'; +$lang['sepchar'] = 'Orddelingstegn til sidenavne'; +$lang['canonical'] = 'Benyt fuldt kanoniske netadresser'; +$lang['fnencode'] = 'Metode til kodning af ikke-ASCII filnavne'; +$lang['autoplural'] = 'Tjek for flertalsendelser i henvisninger'; +$lang['compression'] = 'Pakningsmetode for attic-filer'; +$lang['gzip_output'] = 'Benyt gzip-Content-Encoding (indholdskodning) til XHTML'; +$lang['compress'] = 'Komprimer CSS- og JavaScript-filer'; +$lang['cssdatauri'] = 'Maksimal størrelse i bytes hvor billeder refereret fra CSS filer integreres direkte i CSS, for at reducere HTTP headerens størrelse. 400 til 600 bytes anbefales. Sæt til 0 for at deaktivere.'; +$lang['send404'] = 'Send "HTTP 404/Page Not Found" for ikke-eksisterende sider'; +$lang['broken_iua'] = 'Er funktionen "ignore_user_abort" uvirksom på dit system? Dette kunne forårsage en ikke virkende søgeoversigt. IIS+PHP/CGI er kendt for ikke at virke. Se Fejl 852 for flere oplysninger.'; +$lang['xsendfile'] = 'Brug hovedfilen til X-Sendfile for at få netserveren til at sende statiske filer? Din netserver skal understøtte dette for at bruge det.'; +$lang['renderer_xhtml'] = 'Udskriver der skal bruges til størstedelen af wiki-udskriften (XHTML)'; +$lang['renderer__core'] = '%s (dokuwiki-kerne)'; +$lang['renderer__plugin'] = '%s (udvidelse)'; +$lang['search_nslimit'] = 'Begræns søgningen til de aktuelle X navnerum. Når en søgning udføres fra en side i et underliggende navnerum, tilføjes de første X navnerum som filter'; +$lang['search_fragment'] = 'Angiv standardadfærd ved fragment søgning'; +$lang['search_fragment_o_exact'] = 'præcis'; +$lang['search_fragment_o_starts_with'] = 'starter med'; +$lang['search_fragment_o_ends_with'] = 'slutter med'; +$lang['search_fragment_o_contains'] = 'indeholder'; +$lang['trustedproxy'] = 'Hav tillid til viderestillede proxyer som rapporterer en oprindelig IP der matcher denne regular expression. Som standard matcher lokale netværk. Efterlad blank for ikke at have tillid til nogen proxyer.'; +$lang['_feature_flags'] = 'Funktionsflag'; +$lang['defer_js'] = 'Afvent med JavaScript ekserkvering, til sidens HTML er behandlet. Dette kan få sideindlæsning til at føles hurtigere, men kan potentielt forhindre et fåtal af udvidelser i at fungere korrekt.'; +$lang['dnslookups'] = 'DokuWiki laver DNS-opslag for at finde hostnames på de IP-adresser hvorfra brugere redigerer sider. Hvis du har en langsom eller ikke-fungerende DNS-server, eller ikke ønsker denne funktion, kan du slå den fra.'; +$lang['jquerycdn'] = 'Skal jQuery og jQuery UI kode hentes fra et CDN (content delivery network)? Dette resulterer i flere HTTP-forespørgsler, men filerne indlæses muligvis hurtigere, og brugere har dem muligvis allerede i cachen.'; +$lang['jquerycdn_o_0'] = 'Intet CDN, kode hentes fra denne server'; +$lang['jquerycdn_o_jquery'] = 'Benyt code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'Benyt cdnjs.com'; +$lang['proxy____host'] = 'Proxyserver'; +$lang['proxy____port'] = 'Proxy port'; +$lang['proxy____user'] = 'Proxy brugernavn'; +$lang['proxy____pass'] = 'Proxy adgangskode'; +$lang['proxy____ssl'] = 'Brug SSL til at forbinde til proxy'; +$lang['proxy____except'] = 'Regular expression til at matche URL\'er for hvilke proxier der skal ignores'; +$lang['license_o_'] = 'Ingen valgt'; +$lang['typography_o_0'] = 'ingen'; +$lang['typography_o_1'] = 'Kun gåseøjne'; +$lang['typography_o_2'] = 'Tillader enkelttegnscitering (vil måske ikke altid virke)'; +$lang['userewrite_o_0'] = 'ingen'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'Dokuwiki internt'; +$lang['deaccent_o_0'] = 'fra'; +$lang['deaccent_o_1'] = 'fjern accenttegn'; +$lang['deaccent_o_2'] = 'romaniser'; +$lang['gdlib_o_0'] = 'GD Lib ikke tilstede'; +$lang['gdlib_o_1'] = 'Version 1.x'; +$lang['gdlib_o_2'] = 'automatisk sondering'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstrakt'; +$lang['rss_content_o_diff'] = '"Unified Diff" (Sammensat)'; +$lang['rss_content_o_htmldiff'] = 'HTML-formateret diff-tabel'; +$lang['rss_content_o_html'] = 'Fuldt HTML-sideindhold'; +$lang['rss_linkto_o_diff'] = 'liste over forskelle'; +$lang['rss_linkto_o_page'] = 'den reviderede side'; +$lang['rss_linkto_o_rev'] = 'liste over revideringer'; +$lang['rss_linkto_o_current'] = 'den nuværende side'; +$lang['compression_o_0'] = 'ingen'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'brug ikke'; +$lang['xsendfile_o_1'] = 'Proprietær lighttpd-hovedfil (før udgave 1.5)'; +$lang['xsendfile_o_2'] = 'Standard X-Sendfile header'; +$lang['xsendfile_o_3'] = 'Proprietær Nginx X-Accel-Redirect header'; +$lang['showuseras_o_loginname'] = 'Brugernavn'; +$lang['showuseras_o_username'] = 'Brugerens fulde navn'; +$lang['showuseras_o_username_link'] = 'Brugerens fulde navn som interwiki bruger-link'; +$lang['showuseras_o_email'] = 'Brugerens e-mail adresse (sløret i henhold til mailguard-indstillingerne)'; +$lang['showuseras_o_email_link'] = 'Brugers e-mail adresse som en mailto:-henvisning'; +$lang['useheading_o_0'] = 'Aldrig'; +$lang['useheading_o_navigation'] = 'Kun navigering'; +$lang['useheading_o_content'] = 'Kun wiki-indhold'; +$lang['useheading_o_1'] = 'Altid'; +$lang['readdircache'] = 'Maksimum alder for readdir hukommelse (sek)'; diff --git a/lib/plugins/config/lang/de-informal/intro.txt b/lib/plugins/config/lang/de-informal/intro.txt new file mode 100644 index 0000000..ce4625c --- /dev/null +++ b/lib/plugins/config/lang/de-informal/intro.txt @@ -0,0 +1,7 @@ +===== Konfigurations-Manager ===== + +Benutze diese Seite zur Kontrolle der Einstellungen deiner DokuWiki-Installation. Für Hilfe zu individuellen Einstellungen gehe zu [[doku>config]]. Für mehr Details über diese Erweiterungen siehe [[doku>plugin:config]]. + +Einstellungen die mit einem hellroten Hintergrund angezeigt werden, können mit dieser Erweiterung nicht verändert werden. Einstellungen mit einem blauen Hintergrund sind Standardwerte und Einstellungen mit einem weißen Hintergrund wurden lokal gesetzt für diese Installation. Sowohl blaue als auch weiße Einstellungen können angepasst werden. + +Denke dran **Speichern** zu drücken bevor du die Seite verlässt, andernfalls werden deine Änderungen nicht übernommen. diff --git a/lib/plugins/config/lang/de-informal/lang.php b/lib/plugins/config/lang/de-informal/lang.php new file mode 100644 index 0000000..0d4e381 --- /dev/null +++ b/lib/plugins/config/lang/de-informal/lang.php @@ -0,0 +1,218 @@ + + * @author MaWi + * @author Alexander Fischer + * @author Juergen Schwarzer + * @author Marcel Metz + * @author Matthias Schulte + * @author Christian Wichmann + * @author Pierre Corell + * @author Frank Loizzi + * @author Mateng Schimmerlos + * @author Volker Bödker + * @author rnck + */ +$lang['menu'] = 'Konfiguration'; +$lang['error'] = 'Konfiguration wurde nicht aktualisiert auf Grund eines ungültigen Wertes. Bitte überprüfe deine Änderungen und versuche es erneut.
    Die/der ungültige(n) Wert(e) werden durch eine rote Umrandung hervorgehoben.'; +$lang['updated'] = 'Konfiguration erfolgreich aktualisiert.'; +$lang['nochoice'] = '(keine andere Option möglich)'; +$lang['locked'] = 'Die Konfigurationsdatei kann nicht aktualisiert werden. Wenn dies unbeabsichtigt ist stelle sicher, dass der Name und die Zugriffsrechte der Konfigurationsdatei richtig sind.'; +$lang['danger'] = '**Achtung**: Eine Änderung dieser Einstellung kann dein Wiki und das Einstellungsmenü unerreichbar machen.'; +$lang['warning'] = 'Achtung: Eine Änderungen dieser Option kann zu unbeabsichtigtem Verhalten führen.'; +$lang['security'] = 'Sicherheitswarnung: Eine Änderungen dieser Option können ein Sicherheitsrisiko bedeuten.'; +$lang['_configuration_manager'] = 'Konfigurations-Manager'; +$lang['_header_dokuwiki'] = 'DokuWiki'; +$lang['_header_plugin'] = 'Plugin'; +$lang['_header_template'] = 'Template'; +$lang['_header_undefined'] = 'Unbekannte Werte'; +$lang['_basic'] = 'Basis'; +$lang['_display'] = 'Darstellung'; +$lang['_authentication'] = 'Authentifizierung'; +$lang['_anti_spam'] = 'Anti-Spam'; +$lang['_editing'] = 'Bearbeitung'; +$lang['_links'] = 'Links'; +$lang['_media'] = 'Medien'; +$lang['_notifications'] = 'Benachrichtigung'; +$lang['_syndication'] = 'Syndication (RSS)'; +$lang['_advanced'] = 'Erweitert'; +$lang['_network'] = 'Netzwerk'; +$lang['_msg_setting_undefined'] = 'Keine Konfigurationsmetadaten.'; +$lang['_msg_setting_no_class'] = 'Keine Konfigurationsklasse.'; +$lang['_msg_setting_no_known_class'] = 'Setting-Klasse nicht verfügbar.'; +$lang['_msg_setting_no_default'] = 'Kein Standardwert.'; +$lang['title'] = 'Wiki Titel'; +$lang['start'] = 'Name der Startseite'; +$lang['lang'] = 'Sprache'; +$lang['template'] = 'Vorlage'; +$lang['tagline'] = 'Tag-Linie (nur, wenn vom Template unterstützt)'; +$lang['sidebar'] = 'Name der Sidebar-Seite (nur, wenn vom Template unterstützt), ein leeres Feld deaktiviert die Sidebar'; +$lang['license'] = 'Unter welcher Lizenz sollte Ihr Inhalt veröffentlicht werden?'; +$lang['savedir'] = 'Ordner zum Speichern von Daten'; +$lang['basedir'] = 'Installationsverzeichnis'; +$lang['baseurl'] = 'Installationspfad (URL)'; +$lang['cookiedir'] = 'Cookie Pfad. Leer lassen, um die Standard-Url zu belassen.'; +$lang['dmode'] = 'Zugriffsrechte bei Verzeichniserstellung'; +$lang['fmode'] = 'Zugriffsrechte bei Dateierstellung'; +$lang['allowdebug'] = 'Debug-Ausgaben erlauben Abschalten wenn nicht benötigt!'; +$lang['recent'] = 'letzte Änderungen'; +$lang['recent_days'] = 'Wie viele Änderungen sollen vorgehalten werden? (Tage)'; +$lang['breadcrumbs'] = 'Anzahl der Einträge im "Krümelpfad"'; +$lang['youarehere'] = 'Hierarchische Pfadnavigation verwenden'; +$lang['fullpath'] = 'Zeige vollen Pfad der Datei in Fußzeile an'; +$lang['typography'] = 'Mach drucktechnische Ersetzungen'; +$lang['dformat'] = 'Datumsformat (siehe PHPs strftime Funktion)'; +$lang['signature'] = 'Signatur'; +$lang['showuseras'] = 'Was angezeigt werden soll, wenn der Benutzer, der zuletzt eine Seite bearbeitet hat, angezeigt wird'; +$lang['toptoclevel'] = 'Inhaltsverzeichnis bei dieser Überschriftengröße beginnen'; +$lang['tocminheads'] = 'Mindestanzahl der Überschriften die entscheidet, ob ein Inhaltsverzeichnis erscheinen soll'; +$lang['maxtoclevel'] = 'Maximale Überschriftengröße für Inhaltsverzeichnis'; +$lang['maxseclevel'] = 'Abschnitte bis zu dieser Stufe einzeln editierbar machen'; +$lang['camelcase'] = 'CamelCase-Verlinkungen verwenden'; +$lang['deaccent'] = 'Seitennamen bereinigen'; +$lang['useheading'] = 'Erste Überschrift als Seitennamen verwenden'; +$lang['sneaky_index'] = 'Standardmäßig zeigt DokuWiki alle Namensräume in der Indexansicht an. Bei Aktivierung dieser Einstellung werden alle Namensräume versteckt, in welchen der Benutzer keine Leserechte hat. Dies könnte dazu führen, dass lesbare Unternamensräume versteckt werden. Dies kann die Indexansicht bei bestimmten Zugangskontrolleinstellungen unbenutzbar machen.'; +$lang['hidepages'] = 'Seiten verstecken (Regulärer Ausdruck)'; +$lang['useacl'] = 'Benutze Zugriffskontrollliste'; +$lang['autopasswd'] = 'Automatisch erzeugte Passwörter'; +$lang['authtype'] = 'Authentifizierungsmethode'; +$lang['passcrypt'] = 'Passwortverschlüsselungsmethode'; +$lang['defaultgroup'] = 'Standardgruppe'; +$lang['superuser'] = 'Administrator - Eine Gruppe oder Benutzer mit vollem Zugriff auf alle Seiten und Administrationswerkzeuge.'; +$lang['manager'] = 'Manager - Eine Gruppe oder Benutzer mit Zugriff auf einige Administrationswerkzeuge.'; +$lang['profileconfirm'] = 'Änderungen am Benutzerprofil mit Passwort bestätigen'; +$lang['rememberme'] = 'Permanente Login-Cookies erlauben (Auf diesem Computer eingeloggt bleiben)'; +$lang['disableactions'] = 'Deaktiviere DokuWiki\'s Zugriffe'; +$lang['disableactions_check'] = 'Check'; +$lang['disableactions_subscription'] = 'Bestellen/Abbestellen'; +$lang['disableactions_wikicode'] = 'Zeige Quelle/Exportiere Rohdaten'; +$lang['disableactions_profile_delete'] = 'Eigenes Benutzerprofil löschen'; +$lang['disableactions_other'] = 'Weitere Aktionen (durch Komma getrennt)'; +$lang['disableactions_rss'] = 'XML Syndication (RSS)'; +$lang['auth_security_timeout'] = 'Zeitüberschreitung bei der Authentifizierung (Sekunden)'; +$lang['securecookie'] = 'Sollen Cookies, die via HTTPS gesetzt wurden nur per HTTPS versendet werden? Deaktiviere diese Option, wenn nur der Login deines Wikis mit SSL gesichert ist, aber das Betrachten des Wikis ungesichert geschieht.'; +$lang['remote'] = 'Aktiviert den externen API-Zugang. Diese Option erlaubt es externen Anwendungen von außen auf die XML-RPC-Schnittstelle oder anderweitigen Schnittstellen zuzugreifen.'; +$lang['remoteuser'] = 'Zugriff auf die externen Schnittstellen durch kommaseparierte Angabe von Benutzern oder Gruppen einschränken. Ein leeres Feld erlaubt Zugriff für jeden.'; +$lang['remotecors'] = 'Erlaubt externen Clients API-Zugriff per Cross-Origin Resource Sharing (CORS). Asterisk (*), um alle Quellen zu erlauben. Leer lassen, um CORS zu deaktivieren.'; +$lang['usewordblock'] = 'Blockiere Spam basierend auf der Wortliste'; +$lang['relnofollow'] = 'rel="nofollow" verwenden'; +$lang['indexdelay'] = 'Zeit bevor Suchmaschinenindexierung erlaubt ist'; +$lang['mailguard'] = 'E-Mail-Adressen schützen'; +$lang['iexssprotect'] = 'Hochgeladene Dateien auf bösartigen JavaScript- und HTML-Code untersuchen'; +$lang['usedraft'] = 'Speichere automatisch Entwürfe während der Bearbeitung'; +$lang['locktime'] = 'Maximales Alter für Seitensperren (Sekunden)'; +$lang['cachetime'] = 'Maximale Cachespeicherung (Sekunden)'; +$lang['target____wiki'] = 'Zielfenstername für interne Links'; +$lang['target____interwiki'] = 'Zielfenstername für InterWiki-Links'; +$lang['target____extern'] = 'Zielfenstername für externe Links'; +$lang['target____media'] = 'Zielfenstername für Medienlinks'; +$lang['target____windows'] = 'Zielfenstername für Windows-Freigaben-Links'; +$lang['mediarevisions'] = 'Media-Revisionen (ältere Versionen) aktivieren?'; +$lang['refcheck'] = 'Auf Verwendung beim Löschen von Media-Dateien testen'; +$lang['gdlib'] = 'GD Lib Version'; +$lang['im_convert'] = 'Pfad zu ImageMagicks-Konvertierwerkzeug'; +$lang['jpg_quality'] = 'JPEG Kompressionsqualität (0-100)'; +$lang['fetchsize'] = 'Maximale Größe (in Bytes), die fetch.php von extern herunterladen darf'; +$lang['subscribers'] = 'E-Mail-Abos zulassen'; +$lang['subscribe_time'] = 'Zeit nach der Zusammenfassungs- und Änderungslisten-E-Mails verschickt werden; Dieser Wert sollte kleiner als die in recent_days konfigurierte Zeit sein.'; +$lang['notify'] = 'Sende Änderungsbenachrichtigungen an diese E-Mail-Adresse.'; +$lang['registernotify'] = 'Sende Information bei neu registrierten Benutzern an diese E-Mail-Adresse.'; +$lang['mailfrom'] = 'Absenderadresse für automatisch erzeugte E-Mails'; +$lang['mailreturnpath'] = 'Empfänger-E-Mail-Adresse für Unzustellbarkeitsnachricht'; +$lang['mailprefix'] = 'Präfix für E-Mail-Betreff beim automatischen Versand von Benachrichtigungen'; +$lang['htmlmail'] = 'Versendet optisch angenehmere, aber größere E-Mails im HTML-Format (multipart). Deaktivieren, um Text-Mails zu versenden.'; +$lang['dontlog'] = 'Deaktivieren Sie die Protokollierung für diese Arten von Logs.'; +$lang['sitemap'] = 'Erzeuge Google Sitemaps (Tage)'; +$lang['rss_type'] = 'XML-Feed-Format'; +$lang['rss_linkto'] = 'XML-Feed verlinken auf'; +$lang['rss_content'] = 'Was soll in XML-Feedinhalten angezeigt werden?'; +$lang['rss_update'] = 'Aktualisierungsintervall für XML-Feeds (Sekunden)'; +$lang['rss_show_summary'] = 'Bearbeitungs-Zusammenfassung im XML-Feed anzeigen'; +$lang['rss_show_deleted'] = 'XML-Feed: Gelöschte Feeds anzeigen'; +$lang['rss_media'] = 'Welche Änderungen sollen im XML-Feed angezeigt werden?'; +$lang['rss_media_o_both'] = 'beide'; +$lang['rss_media_o_pages'] = 'Seiten'; +$lang['rss_media_o_media'] = 'Medien'; +$lang['updatecheck'] = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit update.dokuwiki.org verbinden.'; +$lang['userewrite'] = 'Benutze schöne URLs'; +$lang['useslash'] = 'Benutze Schrägstrich als Namensraumtrenner in URLs'; +$lang['sepchar'] = 'Worttrenner für Seitennamen in URLs'; +$lang['canonical'] = 'Immer Links mit vollständigen URLs erzeugen'; +$lang['fnencode'] = 'Methode um nicht-ASCII Dateinamen zu kodieren.'; +$lang['autoplural'] = 'Bei Links automatisch nach vorhandenen Pluralformen suchen'; +$lang['compression'] = 'Komprimierungsmethode für alte Seitenrevisionen'; +$lang['gzip_output'] = 'Seiten mit gzip komprimiert ausliefern'; +$lang['compress'] = 'JavaScript und Stylesheets komprimieren'; +$lang['cssdatauri'] = 'Größe in Bytes, bis zu der Bilder in css-Dateien referenziert werden können, um HTTP-Anfragen zu minimieren. 400 bis 600 Bytes sind gute Werte. Setze 0 für inaktive Funktion.'; +$lang['send404'] = 'Sende "HTTP 404/Seite nicht gefunden" für nicht existierende Seiten'; +$lang['broken_iua'] = 'Falls die Funktion ignore_user_abort auf deinem System nicht funktioniert, könnte der Such-Index nicht funktionieren. IIS+PHP/CGI ist bekannt dafür.'; +$lang['xsendfile'] = 'Den X-Sendfile-Header nutzen, um Dateien direkt vom Webserver ausliefern zu lassen? Dein Webserver muss dies unterstützen!'; +$lang['renderer_xhtml'] = 'Standard-Renderer für die normale (XHTML) Wiki-Ausgabe.'; +$lang['renderer__core'] = '%s (DokuWiki Kern)'; +$lang['renderer__plugin'] = '%s (Erweiterung)'; +$lang['search_nslimit'] = 'Beschränke die Suche auf die jetzigen X Namensräume. Wenn eine Suche von einer Seite in einem tieferen Namensraum aus ausgeführt wird, werden die ersten X Namensräume als Filter hinzugefügt'; +$lang['search_fragment'] = 'Spezifiziere das vorgegebenen Fragment-Suchverhalten'; +$lang['search_fragment_o_exact'] = 'genaue Treffer'; +$lang['search_fragment_o_starts_with'] = 'beginnt mit'; +$lang['search_fragment_o_ends_with'] = 'endet mit'; +$lang['search_fragment_o_contains'] = 'enthält'; +$lang['trustedproxy'] = 'Vertraue Weiterleitungs-Proxys, welche dem regulärem Ausdruck entsprechen, hinsichtlich der angegebenen Client-ID. Der Standardwert entspricht dem lokalem Netzwerk. Leer lassen um jedem Proxy zu vertrauen.'; +$lang['_feature_flags'] = 'Feature-Flags'; +$lang['defer_js'] = 'JavaScript-Ausführung verzögern bis das HTML der gesamten Seite verarbeitet wurde. Erhöht die gefühlte Geschwindigkeit des Seitenaufbaus, kann aber mit einigen wenigen Plugins inkompatibel sein.'; +$lang['dnslookups'] = 'DokuWiki löst die IP-Adressen von Benutzern zu deren Hostnamen auf. Wenn du einen langsamen, unbrauchbaren DNS-Server verwendest oder die Funktion nicht benötigst, dann sollte diese Option deaktivert sein.'; +$lang['jquerycdn'] = 'Sollen die jQuery und jQuery UI Skriptdateien von einem CDN geladen werden? Das verursacht zusätzliche HTTP Anfragen, aber die Dateien werden möglicherweise schneller geladen und Nutzer haben sie vielleicht bereits im Cache.'; +$lang['jquerycdn_o_0'] = 'Kein CDN, nur lokale Auslieferung'; +$lang['jquerycdn_o_jquery'] = 'CDN bei code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN bei cdnjs.com'; +$lang['proxy____host'] = 'Proxyadresse'; +$lang['proxy____port'] = 'Proxyport'; +$lang['proxy____user'] = 'Benutzername für den Proxy'; +$lang['proxy____pass'] = 'Passwort des Proxybenutzers'; +$lang['proxy____ssl'] = 'SSL verwenden, um auf den Proxy zuzugreifen'; +$lang['proxy____except'] = 'Regulärer Ausdruck um Adressen zu beschreiben, für die kein Proxy verwendet werden soll'; +$lang['license_o_'] = 'Nichts ausgewählt'; +$lang['typography_o_0'] = 'nichts'; +$lang['typography_o_1'] = 'ohne einfache Anführungszeichen'; +$lang['typography_o_2'] = 'mit einfachen Anführungszeichen (funktioniert nicht immer)'; +$lang['userewrite_o_0'] = 'nichts'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki intern'; +$lang['deaccent_o_0'] = 'aus'; +$lang['deaccent_o_1'] = 'Entferne Akzente'; +$lang['deaccent_o_2'] = 'romanisieren'; +$lang['gdlib_o_0'] = 'GD lib ist nicht verfügbar'; +$lang['gdlib_o_1'] = 'Version 1.x'; +$lang['gdlib_o_2'] = 'Autoerkennung'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Zusammenfassung'; +$lang['rss_content_o_diff'] = 'Vereinigtes Diff'; +$lang['rss_content_o_htmldiff'] = 'HTML formatierte Diff-Tabelle'; +$lang['rss_content_o_html'] = 'Vollständiger HTML-Inhalt'; +$lang['rss_linkto_o_diff'] = 'Ansicht der Unterschiede'; +$lang['rss_linkto_o_page'] = 'geänderte Seite'; +$lang['rss_linkto_o_rev'] = 'Liste der Revisionen'; +$lang['rss_linkto_o_current'] = 'Die aktuelle Seite'; +$lang['compression_o_0'] = 'nichts'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'Nicht benutzen'; +$lang['xsendfile_o_1'] = 'Proprietärer lighttpd-Header (vor Release 1.5)'; +$lang['xsendfile_o_2'] = 'Standard X-Sendfile-Header'; +$lang['xsendfile_o_3'] = 'Proprietärer Nginx X-Accel-Redirect-Header'; +$lang['showuseras_o_loginname'] = 'Login-Name'; +$lang['showuseras_o_username'] = 'Voller Name des Benutzers'; +$lang['showuseras_o_username_link'] = 'Kompletter Name des Benutzers als Interwiki-Link'; +$lang['showuseras_o_email'] = 'E-Mail-Adresse des Benutzers (je nach Mailguard-Einstellung verschleiert)'; +$lang['showuseras_o_email_link'] = 'E-Mail-Adresse des Benutzers als mailto:-Link'; +$lang['useheading_o_0'] = 'Niemals'; +$lang['useheading_o_navigation'] = 'Nur Navigation'; +$lang['useheading_o_content'] = 'Nur Wiki-Inhalt'; +$lang['useheading_o_1'] = 'Immer'; +$lang['readdircache'] = 'Maximales Alter des readdir-Caches (Sekunden)'; diff --git a/lib/plugins/config/lang/de/intro.txt b/lib/plugins/config/lang/de/intro.txt new file mode 100644 index 0000000..e743379 --- /dev/null +++ b/lib/plugins/config/lang/de/intro.txt @@ -0,0 +1,7 @@ +====== Konfigurations-Manager ====== + +Dieses Plugin hilft Ihnen bei der Konfiguration von DokuWiki. Hilfe zu den einzelnen Einstellungen finden Sie unter [[doku>config]]. Mehr Information zu diesem Plugin ist unter [[doku>plugin:config]] erhältlich. + +Einstellungen mit einem hellroten Hintergrund sind gesichert und können nicht mit diesem Plugin verändert werden, Einstellungen mit hellblauem Hintergrund sind Voreinstellungen, weiß hinterlegte Felder zeigen lokal veränderte Werte an. Sowohl die blauen als auch die weißen Felder können verändert werden. + +Bitte vergessen Sie nicht **Speichern** zu drücken bevor Sie die Seite verlassen, andernfalls gehen Ihre Änderungen verloren. diff --git a/lib/plugins/config/lang/de/lang.php b/lib/plugins/config/lang/de/lang.php new file mode 100644 index 0000000..f6c3929 --- /dev/null +++ b/lib/plugins/config/lang/de/lang.php @@ -0,0 +1,234 @@ + + * @author Markus Glaser + * @author Axel Schwarzer + * @author Eric Haberstroh + * @author C!own77 + * @author Alex Beck + * @author Jürgen Fredriksson + * @author Michael Bohn + * @author Joel Strasser + * @author Michael Klier + * @author Leo Moll + * @author Florian Anderiasch + * @author Robin Kluth + * @author Arne Pelka + * @author Dirk Einecke + * @author Blitzi94 + * @author Robert Bogenschneider + * @author Niels Lange + * @author Christian Wichmann + * @author Paul Lachewsky + * @author Pierre Corell + * @author Matthias Schulte + * @author Mateng Schimmerlos + * @author Anika Henke + * @author Marco Hofmann + * @author Hella Breitkopf + */ +$lang['menu'] = 'Konfiguration'; +$lang['error'] = 'Die Einstellungen wurden wegen einer fehlerhaften Eingabe nicht gespeichert.
    Bitte überprüfen sie die rot umrandeten Eingaben und speichern Sie erneut.'; +$lang['updated'] = 'Einstellungen erfolgreich gespeichert.'; +$lang['nochoice'] = '(keine Auswahlmöglichkeiten vorhanden)'; +$lang['locked'] = 'Die Konfigurationsdatei kann nicht geändert werden. Wenn dies unbeabsichtigt ist,
    überprüfen Sie, ob die Dateiberechtigungen korrekt gesetzt sind.'; +$lang['danger'] = 'Vorsicht: Die Änderung dieser Option könnte Ihr Wiki und das Konfigurationsmenü unzugänglich machen.'; +$lang['warning'] = 'Hinweis: Die Änderung dieser Option könnte unbeabsichtigtes Verhalten hervorrufen.'; +$lang['security'] = 'Sicherheitswarnung: Die Änderung dieser Option könnte ein Sicherheitsrisiko darstellen.'; +$lang['_configuration_manager'] = 'Konfigurations-Manager'; +$lang['_header_dokuwiki'] = 'DokuWiki'; +$lang['_header_plugin'] = 'Plugin'; +$lang['_header_template'] = 'Template'; +$lang['_header_undefined'] = 'Nicht gesetzte Einstellungen'; +$lang['_basic'] = 'Basis'; +$lang['_display'] = 'Darstellung'; +$lang['_authentication'] = 'Authentifizierung'; +$lang['_anti_spam'] = 'Anti-Spam'; +$lang['_editing'] = 'Bearbeitung'; +$lang['_links'] = 'Links'; +$lang['_media'] = 'Medien'; +$lang['_notifications'] = 'Benachrichtigung'; +$lang['_syndication'] = 'Syndication (RSS)'; +$lang['_advanced'] = 'Erweitert'; +$lang['_network'] = 'Netzwerk'; +$lang['_msg_setting_undefined'] = 'Keine Konfigurationsmetadaten.'; +$lang['_msg_setting_no_class'] = 'Keine Konfigurationsklasse.'; +$lang['_msg_setting_no_known_class'] = 'Setting-Klasse nicht verfügbar.'; +$lang['_msg_setting_no_default'] = 'Kein Standardwert.'; +$lang['title'] = 'Titel des Wikis'; +$lang['start'] = 'Startseitenname'; +$lang['lang'] = 'Sprache'; +$lang['template'] = 'Designvorlage (Template)'; +$lang['tagline'] = 'Tag-Linie (nur, wenn vom Template unterstützt)'; +$lang['sidebar'] = 'Name der Sidebar-Seite (nur, wenn vom Template unterstützt), ein leeres Feld deaktiviert die Sidebar'; +$lang['license'] = 'Unter welcher Lizenz sollen Ihre Inhalte veröffentlicht werden?'; +$lang['savedir'] = 'Speicherverzeichnis'; +$lang['basedir'] = 'Installationsverzeichnis'; +$lang['baseurl'] = 'Installationspfad (URL)'; +$lang['cookiedir'] = 'Cookiepfad. Frei lassen, um den gleichen Pfad wie "baseurl" zu benutzen.'; +$lang['dmode'] = 'Berechtigungen für neue Verzeichnisse'; +$lang['fmode'] = 'Berechtigungen für neue Dateien'; +$lang['allowdebug'] = 'Debug-Ausgaben erlauben Abschalten wenn nicht benötigt!'; +$lang['recent'] = 'Anzahl der Einträge in der Änderungsliste'; +$lang['recent_days'] = 'Wie viele letzte Änderungen sollen einsehbar bleiben? (Tage)'; +$lang['breadcrumbs'] = 'Anzahl der Einträge im "Krümelpfad"'; +$lang['youarehere'] = 'Hierarchische Pfadnavigation verwenden'; +$lang['fullpath'] = 'Den kompletten Dateipfad im Footer anzeigen'; +$lang['typography'] = 'Typographische Ersetzungen'; +$lang['dformat'] = 'Datumsformat (Siehe PHP strftime Funktion)'; +$lang['signature'] = 'Signatur'; +$lang['showuseras'] = 'Welche Informationen über einen Benutzer anzeigen, der zuletzt eine Seite bearbeitet hat'; +$lang['toptoclevel'] = 'Inhaltsverzeichnis bei dieser Überschriftengröße beginnen'; +$lang['tocminheads'] = 'Mindestanzahl der Überschriften die entscheidet, ob ein Inhaltsverzeichnis erscheinen soll'; +$lang['maxtoclevel'] = 'Maximale Überschriftengröße für Inhaltsverzeichnis'; +$lang['maxseclevel'] = 'Abschnitte bis zu dieser Stufe einzeln editierbar machen'; +$lang['camelcase'] = 'CamelCase-Verlinkungen verwenden'; +$lang['deaccent'] = 'Seitennamen bereinigen'; +$lang['useheading'] = 'Erste Überschrift als Seitennamen verwenden'; +$lang['sneaky_index'] = 'Standardmäßig zeigt DokuWiki alle Namensräume in der Übersicht. Wenn diese Option aktiviert wird, werden alle Namensräume, für die der Benutzer keine Lese-Rechte hat, nicht angezeigt. Dies kann unter Umständen dazu führen, das lesbare Unter-Namensräume nicht angezeigt werden und macht die Übersicht evtl. unbrauchbar in Kombination mit bestimmten ACL Einstellungen.'; +$lang['hidepages'] = 'Seiten verstecken (Regulärer Ausdruck)'; +$lang['useacl'] = 'Zugangskontrolle verwenden'; +$lang['autopasswd'] = 'Passwort automatisch generieren'; +$lang['authtype'] = 'Authentifizierungsmechanismus'; +$lang['passcrypt'] = 'Verschlüsselungsmechanismus'; +$lang['defaultgroup'] = 'Standardgruppe'; +$lang['superuser'] = 'Administrator - Eine Gruppe oder Benutzer mit vollem Zugriff auf alle Seiten und Administrationswerkzeuge.'; +$lang['manager'] = 'Manager - Eine Gruppe oder Benutzer mit Zugriff auf einige Administrationswerkzeuge.'; +$lang['profileconfirm'] = 'Profiländerung nur nach Passwortbestätigung'; +$lang['rememberme'] = 'Permanente Login-Cookies erlauben (Auf diesem Computer eingeloggt bleiben)'; +$lang['disableactions'] = 'DokuWiki-Aktionen deaktivieren'; +$lang['disableactions_check'] = 'Check'; +$lang['disableactions_subscription'] = 'Seiten-Abonnements'; +$lang['disableactions_wikicode'] = 'Quelltext betrachten/exportieren'; +$lang['disableactions_profile_delete'] = 'Eigenes Benutzerprofil löschen'; +$lang['disableactions_other'] = 'Andere Aktionen (durch Komma getrennt)'; +$lang['disableactions_rss'] = 'XML-Syndikation (RSS)'; +$lang['auth_security_timeout'] = 'Authentifikations-Timeout (Sekunden)'; +$lang['securecookie'] = 'Sollen Cookies, die via HTTPS gesetzt wurden nur per HTTPS versendet werden? Deaktivieren Sie diese Option, wenn nur der Login Ihres Wikis mit SSL gesichert ist, aber das Betrachten des Wikis ungesichert geschieht.'; +$lang['samesitecookie'] = 'Das samesite Cookie Attribut. Wenn es leer gelassen wird, entscheidet der Browser über die verwendete Richtlinie.'; +$lang['remote'] = 'Aktiviert den externen API-Zugang. Diese Option erlaubt es externen Anwendungen von außen auf die XML-RPC-Schnittstelle oder anderweitigen Schnittstellen zu zugreifen.'; +$lang['remoteuser'] = 'Zugriff auf die externen Schnittstellen durch kommaseparierte Angabe von Benutzern oder Gruppen einschränken. Ein leeres Feld erlaubt Zugriff für jeden.'; +$lang['remotecors'] = 'Erlaubt externen Clients API-Zugriff per Cross-Origin Resource Sharing (CORS). Asterisk (*), um alle Quellen zu erlauben. Leer lassen, um CORS zu deaktivieren.'; +$lang['usewordblock'] = 'Spam-Blocking (nach Wörterliste) benutzen'; +$lang['relnofollow'] = 'rel="nofollow" verwenden'; +$lang['indexdelay'] = 'Zeit bevor Suchmaschinenindexierung erlaubt ist (in Sekunden)'; +$lang['mailguard'] = 'E-Mail-Adressen schützen'; +$lang['iexssprotect'] = 'Hochgeladene Dateien auf bösartigen JavaScript- und HTML-Code untersuchen'; +$lang['usedraft'] = 'Während des Bearbeitens automatisch Zwischenentwürfe speichern'; +$lang['locktime'] = 'Maximales Alter für Seitensperren (Sekunden)'; +$lang['cachetime'] = 'Maximale Cachespeicherung (Sekunden)'; +$lang['target____wiki'] = 'Zielfenster für interne Links (target Attribut)'; +$lang['target____interwiki'] = 'Zielfenster für InterWiki-Links (target Attribut)'; +$lang['target____extern'] = 'Zielfenster für Externe Links (target Attribut)'; +$lang['target____media'] = 'Zielfenster für (Bild-)Dateien (target Attribut)'; +$lang['target____windows'] = 'Zielfenster für Windows Freigaben (target Attribut)'; +$lang['mediarevisions'] = 'Media-Revisionen (ältere Versionen) aktivieren?'; +$lang['refcheck'] = 'Auf Verwendung beim Löschen von Media-Dateien testen'; +$lang['gdlib'] = 'GD Lib Version'; +$lang['im_convert'] = 'Pfad zum ImageMagicks-Konvertierwerkzeug'; +$lang['jpg_quality'] = 'JPEG Kompressionsqualität (0-100)'; +$lang['fetchsize'] = 'Maximale Größe (in Bytes), die fetch.php von extern herunterladen darf'; +$lang['subscribers'] = 'E-Mail-Abos zulassen'; +$lang['subscribe_time'] = 'Zeit nach der Zusammenfassungs- und Änderungslisten-E-Mails verschickt werden (Sekunden); Dieser Wert sollte kleiner als die in recent_days konfigurierte Zeit sein.'; +$lang['notify'] = 'Änderungsmitteilungen an diese E-Mail-Adresse versenden'; +$lang['registernotify'] = 'Information über neu registrierte Benutzer an diese E-Mail-Adresse senden'; +$lang['mailfrom'] = 'Absender-E-Mail-Adresse für automatische Mails'; +$lang['mailreturnpath'] = 'Empfänger-E-Mail-Adresse für Unzustellbarkeitsnachricht'; +$lang['mailprefix'] = 'Präfix für E-Mail-Betreff beim automatischen Versand von Benachrichtigungen (Leer lassen um den Wiki-Titel zu verwenden)'; +$lang['htmlmail'] = 'Versendet optisch angenehmere, aber größere E-Mails im HTML-Format (multipart). Deaktivieren, um Text-Mails zu versenden.'; +$lang['dontlog'] = 'Protokollierung für diese Logtypen deaktivieren.'; +$lang['sitemap'] = 'Google Sitemap erzeugen (Tage). Mit 0 deaktivieren.'; +$lang['rss_type'] = 'XML-Feed-Format'; +$lang['rss_linkto'] = 'XML-Feed verlinken auf'; +$lang['rss_content'] = 'Welche Inhalte sollen im XML-Feed dargestellt werden?'; +$lang['rss_update'] = 'XML-Feed Aktualisierungsintervall (Sekunden)'; +$lang['rss_show_summary'] = 'Bearbeitungs-Zusammenfassung im XML-Feed anzeigen'; +$lang['rss_show_deleted'] = 'XML-Feed: Gelöschte Feeds anzeigen'; +$lang['rss_media'] = 'Welche Änderungen sollen im XML-Feed angezeigt werden?'; +$lang['rss_media_o_both'] = 'beide'; +$lang['rss_media_o_pages'] = 'Seiten'; +$lang['rss_media_o_media'] = 'Medien'; +$lang['updatecheck'] = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit update.dokuwiki.org verbinden.'; +$lang['userewrite'] = 'Schöne Seitenadressen (URL rewriting)'; +$lang['useslash'] = 'Schrägstrich (/) als Namensraumtrenner in URLs verwenden'; +$lang['sepchar'] = 'Worttrenner für Seitennamen in URLs'; +$lang['canonical'] = 'Immer Links mit vollständigen URLs erzeugen'; +$lang['fnencode'] = 'Methode um nicht-ASCII Dateinamen zu kodieren.'; +$lang['autoplural'] = 'Bei Links automatisch nach vorhandenen Pluralformen suchen'; +$lang['compression'] = 'Komprimierungsmethode für alte Seitenrevisionen'; +$lang['gzip_output'] = 'Seiten mit gzip komprimiert ausliefern'; +$lang['compress'] = 'JavaScript und Stylesheets komprimieren'; +$lang['cssdatauri'] = 'Größe in Bytes, bis zu der Bilder in CSS-Dateien referenziert werden können, um HTTP-Anfragen zu minimieren. Empfohlene Einstellung: 400 to 600 Bytes. Setzen Sie die Einstellung auf 0 um die Funktion zu deaktivieren.'; +$lang['send404'] = 'Bei nicht vorhandenen Seiten mit 404 Fehlercode antworten'; +$lang['broken_iua'] = 'Falls die Funktion ignore_user_abort auf Ihrem System nicht funktioniert, könnte der Such-Index nicht funktionieren. IIS+PHP/CGI ist bekannt dafür.'; +$lang['xsendfile'] = 'Den X-Sendfile-Header nutzen, um Dateien direkt vom Webserver ausliefern zu lassen? Ihr Webserver muss dies unterstützen!'; +$lang['renderer_xhtml'] = 'Standard-Renderer für die normale (XHTML) Wiki-Ausgabe.'; +$lang['renderer__core'] = '%s (DokuWiki Kern)'; +$lang['renderer__plugin'] = '%s (Plugin)'; +$lang['search_nslimit'] = 'Beschränke die Suche auf die jetzigen X Namensräume. Wenn eine Suche von einer Seite in einem tieferen Namensraum aus ausgeführt wird, werden die ersten X Namensräume als Filter hinzugefügt'; +$lang['search_fragment'] = 'Spezifiziere das vorgegebenen Fragment-Suchverhalten'; +$lang['search_fragment_o_exact'] = 'genaue Treffer'; +$lang['search_fragment_o_starts_with'] = 'beginnt mit'; +$lang['search_fragment_o_ends_with'] = 'endet mit'; +$lang['search_fragment_o_contains'] = 'enthält'; +$lang['trustedproxy'] = 'Vertrauen Sie Weiterleitungs-Proxys, welche dem regulärem Ausdruck entsprechen, hinsichtlich der angegebenen Client-ID. Der Standardwert entspricht dem lokalem Netzwerk. Leer lassen um jedem Proxy zu vertrauen.'; +$lang['_feature_flags'] = 'Feature-Flags'; +$lang['defer_js'] = 'JavaScript-Ausführung verzögern bis das HTML der gesamten Seite verarbeitet wurde. Erhöht die gefühlte Geschwindigkeit des Seitenaufbaus, kann aber mit einigen wenigen Plugins inkompatibel sein.'; +$lang['hidewarnings'] = 'Keine PHP Warnungen anzeigen. Diese Einstellung kann den Umstieg auf PHP8+ erleichtern. Warnungen werden weiterhin im Fehlerlog gespeichert und sollten gemeldet werden.'; +$lang['dnslookups'] = 'DokuWiki löst die IP-Adressen von Benutzern zu deren Hostnamen auf. Wenn Sie einen langsamen oder unzuverlässigen DNS-Server verwenden oder die Funktion nicht benötigen, dann sollte diese Option deaktiviert sein.'; +$lang['jquerycdn'] = 'Sollen jQuery und jQuery UI Skriptdateien von einem CDN (Content Delivery Network) geladen werden? Dadurch entstehen zusätzliche HTTP-Anfragen, aber die Daten werden voraussichtlich schneller geladen und eventuell sind sie auch schon beim Benutzer im Cache.'; +$lang['jquerycdn_o_0'] = 'Kein CDN, ausschließlich lokale Auslieferung'; +$lang['jquerycdn_o_jquery'] = 'CDN von code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN von cdnjs.com'; +$lang['proxy____host'] = 'Proxy-Server'; +$lang['proxy____port'] = 'Proxy-Port'; +$lang['proxy____user'] = 'Proxy Benutzername'; +$lang['proxy____pass'] = 'Proxy Passwort'; +$lang['proxy____ssl'] = 'SSL bei Verbindung zum Proxy verwenden'; +$lang['proxy____except'] = 'Regulärer Ausdruck für URLs, bei denen kein Proxy verwendet werden soll'; +$lang['license_o_'] = 'Keine gewählt'; +$lang['typography_o_0'] = 'keine'; +$lang['typography_o_1'] = 'ohne einfache Anführungszeichen'; +$lang['typography_o_2'] = 'mit einfachen Anführungszeichen (funktioniert nicht immer)'; +$lang['userewrite_o_0'] = 'keines'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki intern'; +$lang['deaccent_o_0'] = 'aus'; +$lang['deaccent_o_1'] = 'Akzente und Umlaute umwandeln'; +$lang['deaccent_o_2'] = 'Umschrift'; +$lang['gdlib_o_0'] = 'GD Lib nicht verfügbar'; +$lang['gdlib_o_1'] = 'Version 1.x'; +$lang['gdlib_o_2'] = 'Automatisch finden'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstrakt'; +$lang['rss_content_o_diff'] = 'Unified Diff'; +$lang['rss_content_o_htmldiff'] = 'HTML formatierte Diff-Tabelle'; +$lang['rss_content_o_html'] = 'Vollständiger HTML-Inhalt'; +$lang['rss_linkto_o_diff'] = 'Änderungen zeigen'; +$lang['rss_linkto_o_page'] = 'geänderte Seite'; +$lang['rss_linkto_o_rev'] = 'Liste aller Änderungen'; +$lang['rss_linkto_o_current'] = 'Aktuelle Seite'; +$lang['compression_o_0'] = 'keine'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'nicht benutzen'; +$lang['xsendfile_o_1'] = 'Proprietärer lighttpd-Header (vor Release 1.5)'; +$lang['xsendfile_o_2'] = 'Standard X-Sendfile-Header'; +$lang['xsendfile_o_3'] = 'Proprietärer Nginx X-Accel-Redirect-Header'; +$lang['showuseras_o_loginname'] = 'Login-Name'; +$lang['showuseras_o_username'] = 'Vollständiger Name des Benutzers'; +$lang['showuseras_o_username_link'] = 'Kompletter Name des Benutzers als Interwiki-Link'; +$lang['showuseras_o_email'] = 'E-Mail-Adresse des Benutzers (je nach Mailguard-Einstellung verschleiert)'; +$lang['showuseras_o_email_link'] = 'E-Mail-Adresse des Benutzers als mailto:-Link'; +$lang['useheading_o_0'] = 'Nie'; +$lang['useheading_o_navigation'] = 'Nur Navigation'; +$lang['useheading_o_content'] = 'Nur Wikiinhalt'; +$lang['useheading_o_1'] = 'Immer'; +$lang['readdircache'] = 'Maximales Alter des readdir-Caches (Sekunden)'; diff --git a/lib/plugins/config/lang/el/intro.txt b/lib/plugins/config/lang/el/intro.txt new file mode 100644 index 0000000..f106367 --- /dev/null +++ b/lib/plugins/config/lang/el/intro.txt @@ -0,0 +1,7 @@ +====== Ρυθμίσεις ====== + +Χρησιμοποιήστε αυτή την σελίδα για να ρυθμίσετε την λειτουργία του Dokuwiki σας. Για βοήθεια σχετικά με τις ρυθμίσεις δείτε την σελίδα [[doku>config]]. Για περισσότερες λεπτομέρειες σχετικά με αυτή την επέκταση δείτε την σελίδα [[doku>plugin:config]]. + +Οι ρυθμίσεις που εμφανίζονται σε απαλό κόκκινο φόντο είναι κλειδωμένες και δεν μπορούν να τροποποιηθούν μέσω αυτής της επέκτασης. Οι ρυθμίσεις που εμφανίζονται σε μπλε φόντο είναι οι προεπιλεγμένες ενώ οι ρυθμίσεις που εμφανίζονται σε λευκό φόντο είναι αυτές που διαφέρουν από τις προεπιλεγμένες. Και οι ρυθμίσεις που εμφανίζονται σε μπλε φόντο και οι ρυθμίσεις που εμφανίζονται σε λευκό φόντο μπορούν να τροποποιηθούν. + +Θυμηθείτε να επιλέξετε **Αποθήκευση** αφού κάνετε τις αλλαγές που θέλετε. diff --git a/lib/plugins/config/lang/el/lang.php b/lib/plugins/config/lang/el/lang.php new file mode 100644 index 0000000..4657e9e --- /dev/null +++ b/lib/plugins/config/lang/el/lang.php @@ -0,0 +1,210 @@ + + * @author Katerina Katapodi + * @author Christopher Smith + * @author Thanos Massias + * @author Αθανάσιος Νταής + * @author Konstantinos Koryllos + * @author George Petsagourakis + * @author Petros Vidalis + * @author Vasileios Karavasilis + * @author Zacharias Sdregas + */ +$lang['menu'] = 'Ρυθμίσεις'; +$lang['error'] = 'Οι ρυθμίσεις σας δεν έγιναν δεκτές λόγω λανθασμένης τιμής κάποιας ρύθμισης. Διορθώστε την λάθος τιμή και προσπαθήστε ξανά. +
    Η λανθασμένη τιμή υποδεικνύεται με κόκκινο πλαίσιο.'; +$lang['updated'] = 'Επιτυχής τροποποίηση ρυθμίσεων.'; +$lang['nochoice'] = '(δεν υπάρχουν άλλες διαθέσιμες επιλογές)'; +$lang['locked'] = 'Το αρχείο ρυθμίσεων δεν μπορεί να τροποποιηθεί.
    Εάν αυτό δεν είναι επιθυμητό, διορθώστε τα δικαιώματα πρόσβασης του αρχείου ρυθμίσεων'; +$lang['danger'] = 'Κίνδυνος: Η αλλαγή αυτής της επιλογής θα μπορούσε να αποτρέψει την πρόσβαση στο wiki και στις ρυθμίσεις του.'; +$lang['warning'] = 'Προσοχή: Η αλλαγή αυτής της επιλογής θα μπορούσε να προκαλέσει ανεπιθύμητη συμπεριφορά.'; +$lang['security'] = 'Προσοχή: Η αλλαγή αυτής της επιλογής θα μπορούσε να προκαλέσει προβλήματα ασφαλείας.'; +$lang['_configuration_manager'] = 'Ρυθμίσεις'; +$lang['_header_dokuwiki'] = 'Ρυθμίσεις DokuWiki'; +$lang['_header_plugin'] = 'Ρυθμίσεις Επεκτάσεων'; +$lang['_header_template'] = 'Ρυθμίσεις Προτύπων παρουσίασης'; +$lang['_header_undefined'] = 'Διάφορες Ρυθμίσεις'; +$lang['_basic'] = 'Βασικές Ρυθμίσεις'; +$lang['_display'] = 'Ρυθμίσεις Εμφάνισης'; +$lang['_authentication'] = 'Ρυθμίσεις Ασφαλείας'; +$lang['_anti_spam'] = 'Ρυθμίσεις Anti-Spam'; +$lang['_editing'] = 'Ρυθμίσεις Σύνταξης σελίδων'; +$lang['_links'] = 'Ρυθμίσεις Συνδέσμων'; +$lang['_media'] = 'Ρυθμίσεις Αρχείων'; +$lang['_notifications'] = 'Ρυθμίσεις ενημερώσεων'; +$lang['_syndication'] = 'Ρυθμίσεις σύνδεσης'; +$lang['_advanced'] = 'Ρυθμίσεις για Προχωρημένους'; +$lang['_network'] = 'Ρυθμίσεις Δικτύου'; +$lang['_msg_setting_undefined'] = 'Δεν έχουν οριστεί metadata.'; +$lang['_msg_setting_no_class'] = 'Δεν έχει οριστεί κλάση.'; +$lang['_msg_setting_no_default'] = 'Δεν υπάρχει τιμή εξ ορισμού.'; +$lang['title'] = 'Τίτλος Wiki'; +$lang['start'] = 'Ονομασία αρχικής σελίδας'; +$lang['lang'] = 'Γλώσσα'; +$lang['template'] = 'Πρότυπο προβολής'; +$lang['tagline'] = 'Tagline'; +$lang['sidebar'] = 'Sidebar page name'; +$lang['license'] = 'Κάτω από ποια άδεια θέλετε να δημοσιευτεί το υλικό σας?'; +$lang['savedir'] = 'Φάκελος για την αποθήκευση δεδομένων'; +$lang['basedir'] = 'Αρχικός Φάκελος'; +$lang['baseurl'] = 'Αρχικό URL'; +$lang['cookiedir'] = 'Διαδρομή cookie. Αφήστε την κενή για την χρησιμοποίηση της αρχικής URL.'; +$lang['dmode'] = 'Δικαιώματα πρόσβασης δημιουργούμενων φακέλων'; +$lang['fmode'] = 'Δικαιώματα πρόσβασης δημιουργούμενων αρχείων'; +$lang['allowdebug'] = 'Δεδομένα εκσφαλμάτωσης (debug) απενεργοποιήστε τα εάν δεν τα έχετε ανάγκη!'; +$lang['recent'] = 'Αριθμός πρόσφατων αλλαγών ανά σελίδα'; +$lang['recent_days'] = 'Πόσο παλιές αλλαγές να εμφανίζονται (ημέρες)'; +$lang['breadcrumbs'] = 'Αριθμός συνδέσμων ιστορικού'; +$lang['youarehere'] = 'Εμφάνιση ιεραρχικής προβολής τρέχουσας σελίδας'; +$lang['fullpath'] = 'Εμφάνιση πλήρους διαδρομής σελίδας στην υποκεφαλίδα'; +$lang['typography'] = 'Μετατροπή ειδικών χαρακτήρων στο τυπογραφικό ισοδύναμό τους'; +$lang['dformat'] = 'Μορφή ημερομηνίας (βλέπε την strftime function της PHP)'; +$lang['signature'] = 'Υπογραφή'; +$lang['showuseras'] = 'Τι να εμφανίζεται όταν φαίνεται ο χρήστης που τροποποίησε τελευταίος μία σελίδα'; +$lang['toptoclevel'] = 'Ανώτατο επίπεδο πίνακα περιεχομένων σελίδας'; +$lang['tocminheads'] = 'Ελάχιστος αριθμός κεφαλίδων για την δημιουργία πίνακα περιεχομένων - TOC'; +$lang['maxtoclevel'] = 'Μέγιστο επίπεδο για πίνακα περιεχομένων σελίδας'; +$lang['maxseclevel'] = 'Μέγιστο επίπεδο για εμφάνιση της επιλογής τροποποίησης επιπέδου'; +$lang['camelcase'] = 'Χρήση CamelCase στους συνδέσμους'; +$lang['deaccent'] = 'Αφαίρεση σημείων στίξης από ονόματα σελίδων'; +$lang['useheading'] = 'Χρήση κεφαλίδας πρώτου επιπέδου σαν τίτλο συνδέσμων'; +$lang['sneaky_index'] = 'Εξ ορισμού, η εφαρμογή DokuWiki δείχνει όλους τους φακέλους στην προβολή Καταλόγου. Ενεργοποιώντας αυτή την επιλογή, δεν θα εμφανίζονται οι φάκελοι για τους οποίους ο χρήστης δεν έχει δικαιώματα ανάγνωσης αλλά και οι υπο-φάκελοί τους ανεξαρτήτως δικαιωμάτων πρόσβασης.'; +$lang['hidepages'] = 'Φίλτρο απόκρυψης σελίδων (regular expressions)'; +$lang['useacl'] = 'Χρήση Λίστας Δικαιωμάτων Πρόσβασης (ACL)'; +$lang['autopasswd'] = 'Αυτόματη δημιουργία κωδικού χρήστη'; +$lang['authtype'] = 'Τύπος πιστοποίησης στοιχείων χρήστη'; +$lang['passcrypt'] = 'Μέθοδος κρυπτογράφησης κωδικού χρήστη'; +$lang['defaultgroup'] = 'Προεπιλεγμένη ομάδα χρηστών'; +$lang['superuser'] = 'Υπερ-χρήστης - μία ομάδα ή ένας χρήστης με πλήρη δικαιώματα πρόσβασης σε όλες τις σελίδες και όλες τις λειτουργίες ανεξάρτητα από τις ρυθμίσεις των Λιστών Δικαιωμάτων Πρόσβασης (ACL)'; +$lang['manager'] = 'Διαχειριστής - μία ομάδα ή ένας χρήστης με δικαιώματα πρόσβασης σε ορισμένες από τις λειτουργίες της εφαρμογής'; +$lang['profileconfirm'] = 'Να απαιτείται ο κωδικός χρήστη για την επιβεβαίωση αλλαγών στο προφίλ χρήστη'; +$lang['rememberme'] = 'Να επιτρέπονται τα cookies λογαρισμού χρήστη αορίστου χρόνου (Απομνημόνευση στοιχείων λογαριασμού)'; +$lang['disableactions'] = 'Απενεργοποίηση λειτουργιών DokuWiki'; +$lang['disableactions_check'] = 'Έλεγχος'; +$lang['disableactions_subscription'] = 'Εγγραφή/Διαγραφή χρήστη'; +$lang['disableactions_wikicode'] = 'Προβολή κώδικα σελίδας'; +$lang['disableactions_profile_delete'] = 'Διαγραφή Λογαριασμού '; +$lang['disableactions_other'] = 'Άλλες λειτουργίες (διαχωρίστε τις με κόμμα)'; +$lang['disableactions_rss'] = 'XML Ομαδοποίηση (RSS)'; +$lang['auth_security_timeout'] = 'Διάρκεια χρόνου για ασφάλεια πιστοποίησης (δευτερόλεπτα)'; +$lang['securecookie'] = 'Τα cookies που έχουν οριστεί μέσω HTTPS πρέπει επίσης να αποστέλλονται μόνο μέσω HTTPS από τον φυλλομετρητή? Απενεργοποιήστε αυτή την επιλογή όταν μόνο η είσοδος στο wiki σας διασφαλίζεται μέσω SSL αλλά η περιήγηση γίνεται και χωρίς αυτό.'; +$lang['remote'] = 'Ενεργοποίησης απομακρυσμένης προγραμματιστικής διεπαφής εφαρμογών (API). Με αυτό τον τρόπο επιτρέπεται η πρόσβαση στο wiki με το XML-RPC ή με άλλα πρωτόκολλα επικοινωνίας.'; +$lang['remoteuser'] = 'Απενεργοποίησης απομακρυσμένης προγραμματιστικής διεπαφής εφαρμογών (API). Αφήστε το κενό για να είναι δυνατή η πρόσβαση στον οποιοδήποτε.'; +$lang['usewordblock'] = 'Χρήστη λίστα απαγορευμένων λέξεων για καταπολέμηση του spam'; +$lang['relnofollow'] = 'Χρήση rel="nofollow"'; +$lang['indexdelay'] = 'Χρόνος αναμονής προτού επιτραπεί σε μηχανές αναζήτησης να ευρετηριάσουν μια τροποποιημένη σελίδα (sec)'; +$lang['mailguard'] = 'Κωδικοποίηση e-mail διευθύνσεων'; +$lang['iexssprotect'] = 'Έλεγχος μεταφορτώσεων για πιθανώς επικίνδυνο κώδικα JavaScript ή HTML'; +$lang['usedraft'] = 'Αυτόματη αποθήκευση αντιγράφων κατά την τροποποίηση σελίδων'; +$lang['locktime'] = 'Μέγιστος χρόνος κλειδώματος αρχείου υπό τροποποίηση (sec)'; +$lang['cachetime'] = 'Μέγιστη ηλικία cache (sec)'; +$lang['target____wiki'] = 'Παράθυρο-στόχος για εσωτερικούς συνδέσμους'; +$lang['target____interwiki'] = 'Παράθυρο-στόχος για συνδέσμους interwiki'; +$lang['target____extern'] = 'Παράθυρο-στόχος για εξωτερικούς σθνδέσμους'; +$lang['target____media'] = 'Παράθυρο-στόχος για συνδέσμους αρχείων'; +$lang['target____windows'] = 'Παράθυρο-στόχος για συνδέσμους σε Windows shares'; +$lang['mediarevisions'] = 'Ενεργοποίηση Mediarevisions;'; +$lang['refcheck'] = 'Πριν τη διαγραφή ενός αρχείου να ελέγχεται η ύπαρξη σελίδων που το χρησιμοποιούν'; +$lang['gdlib'] = 'Έκδοση βιβλιοθήκης GD'; +$lang['im_convert'] = 'Διαδρομή προς το εργαλείο μετατροπής εικόνων του ImageMagick'; +$lang['jpg_quality'] = 'Ποιότητα συμπίεσης JPG (0-100)'; +$lang['fetchsize'] = 'Μέγιστο μέγεθος (σε bytes) εξωτερικού αρχείου που επιτρέπεται να μεταφέρει η fetch.php'; +$lang['subscribers'] = 'Να επιτρέπεται η εγγραφή στην ενημέρωση αλλαγών σελίδας'; +$lang['subscribe_time'] = 'Χρόνος μετά τον οποίο οι λίστες ειδοποιήσεων και τα συνοπτικά θα αποστέλλονται (δευτερόλεπτα). Αυτό θα πρέπει να είναι μικρότερο από τον χρόνο που έχει η ρύθμιση recent_days.'; +$lang['notify'] = 'Αποστολή ενημέρωσης για αλλαγές σε αυτή την e-mail διεύθυνση'; +$lang['registernotify'] = 'Αποστολή ενημερωτικών μηνυμάτων σε αυτή την e-mail διεύθυνση κατά την εγγραφή νέων χρηστών'; +$lang['mailfrom'] = 'e-mail διεύθυνση αποστολέα για μηνύματα από την εφαρμογή'; +$lang['mailreturnpath'] = 'Διεύθυνση ηλεκτρονικού ταχυδρομείου λήπτη για μηνύματα που δεν έλαβε'; +$lang['mailprefix'] = 'Πρόθεμα θέματος που να χρησιμοποιείται για τα αυτόματα μηνύματα ηλεκτρονικού ταχυδρομείου.'; +$lang['htmlmail'] = 'Αποστολή οπτικά καλύτερου, αλλά μεγαλύτερου σε μέγεθος email με χρήση HTML. Απενεργοποιήστε το για αποστέλλονται μόνο email απλού κειμένου.'; +$lang['sitemap'] = 'Δημιουργία Google sitemap (ημέρες)'; +$lang['rss_type'] = 'Τύπος XML feed'; +$lang['rss_linkto'] = 'Τύπος συνδέσμων στο XML feed'; +$lang['rss_content'] = 'Τι να εμφανίζεται στα XML feed items?'; +$lang['rss_update'] = 'Χρόνος ανανέωσης XML feed (sec)'; +$lang['rss_show_summary'] = 'Να εμφανίζεται σύνοψη του XML feed στον τίτλο'; +$lang['rss_media'] = 'Τι είδους αλλαγές πρέπει να εμφανίζονται στο XLM feed;'; +$lang['rss_media_o_both'] = 'αμφότεροι'; +$lang['rss_media_o_pages'] = 'σελίδες'; +$lang['rss_media_o_media'] = 'μέσα ενημέρωσης '; +$lang['updatecheck'] = 'Έλεγχος για ύπαρξη νέων εκδόσεων και ενημερώσεων ασφαλείας της εφαρμογής? Απαιτείται η σύνδεση με το update.dokuwiki.org για να λειτουργήσει σωστά αυτή η επιλογή.'; +$lang['userewrite'] = 'Χρήση ωραίων URLs'; +$lang['useslash'] = 'Χρήση slash σαν διαχωριστικό φακέλων στα URLs'; +$lang['sepchar'] = 'Διαχωριστικός χαρακτήρας για κανονικοποίηση ονόματος σελίδας'; +$lang['canonical'] = 'Πλήρη και κανονικοποιημένα URLs'; +$lang['fnencode'] = 'Μέθοδος κωδικοποίησης για ονόματα αρχείων μη-ASCII'; +$lang['autoplural'] = 'Ταίριασμα πληθυντικού στους συνδέσμους'; +$lang['compression'] = 'Μέθοδος συμπίεσης για αρχεία attic'; +$lang['gzip_output'] = 'Χρήση gzip Content-Encoding για την xhtml'; +$lang['compress'] = 'Συμπίεση αρχείων CSS και javascript'; +$lang['cssdatauri'] = 'Το μέγεθος σε bytes στο οποίο οι εικόνες που αναφέρονται σε CSS αρχεία θα πρέπει να είναι ενσωματωμένες για τη μείωση των απαιτήσεων μιας κεφαλίδας αίτησης HTTP . Αυτή η τεχνική δεν θα λειτουργήσει σε IE <8! 400 με 600 bytes είναι μια καλή τιμή. Ορίστε την τιμή 0 για να το απενεργοποιήσετε.'; +$lang['send404'] = 'Αποστολή "HTTP 404/Page Not Found" για σελίδες που δεν υπάρχουν'; +$lang['broken_iua'] = 'Η συνάρτηση ignore_user_abort δεν λειτουργεί σωστά στο σύστημά σας? Σε αυτή την περίπτωση μπορεί να μην δουλεύει σωστά η λειτουργία Καταλόγου. Ο συνδυασμός IIS+PHP/CGI είναι γνωστό ότι έχει τέτοιο πρόβλημα. Δείτε και Bug 852 για λεπτομέρειες.'; +$lang['xsendfile'] = 'Χρήση της κεφαλίδας X-Sendfile από τον εξυπηρετητή κατά την φόρτωση στατικών αρχείων? Ο εξυπηρετητής σας πρέπει να υποστηρίζει αυτή την δυνατότητα.'; +$lang['renderer_xhtml'] = 'Πρόγραμμα δημιουργίας βασικής (xhtml) εξόδου wiki.'; +$lang['renderer__core'] = '%s (βασικός κώδικας dokuwiki)'; +$lang['renderer__plugin'] = '%s (επέκταση)'; +$lang['search_nslimit'] = 'Περιορίστε την αναζήτηση στα παρόντα αρχεία που δεν έχουν τίτλο Χ. Όταν η αναζήτηση διεξάγεται από μια σελίδα στα πλαίσια ενός μεγαλύτερου άτιτλου αρχείου, τα πρώτα ονόματα αρχείων Χ θα προστεθούν για να καλύψουν.'; +$lang['search_fragment'] = 'Κάντε την αναζήτηση ορίζοντας το πλαίσιο μη πρόσβασης που λείπει'; +$lang['search_fragment_o_exact'] = 'ακριβής'; +$lang['search_fragment_o_starts_with'] = 'αρχίζει με'; +$lang['search_fragment_o_ends_with'] = 'τελειώνει με'; +$lang['search_fragment_o_contains'] = 'περιέχει'; +$lang['dnslookups'] = 'Το DokuWiki θα ψάξει τα ονόματα υπολογιστών που αντιστοιχούν σε διευθύνσεις IP των χρηστών που γράφουν στις σελίδες. Αν ο DNS είναι αργός, δεν δουλεύει ή δεν χρειάζεστε αυτή την λειτουργία, απενεργοποιήστε την.'; +$lang['jquerycdn'] = 'Πρέπει οι φάκελλοι με περιεχόμενο jQuery και jQuery UI να φορτωθούν από το CDN? Αυτό προσθέτει επιπλέον αιτήματα HTTP , αλλά οι φάκελλοι μπορούν να φορτωθούν ταχύτερα και οι χρήστες μπορεί να τους έχουν κρύψει ήδη.'; +$lang['jquerycdn_o_0'] = 'Δεν υπάρχει CDN, τοπική μετάδοση μόνο'; +$lang['jquerycdn_o_jquery'] = 'CDN στον κωδικό.jquery.com '; +$lang['jquerycdn_o_cdnjs'] = 'CDN στο cdnjs.com '; +$lang['proxy____host'] = 'Διακομιστής Proxy'; +$lang['proxy____port'] = 'Θύρα Proxy'; +$lang['proxy____user'] = 'Όνομα χρήστη Proxy'; +$lang['proxy____pass'] = 'Κωδικός χρήστη Proxy'; +$lang['proxy____ssl'] = 'Χρήση ssl για σύνδεση με διακομιστή Proxy'; +$lang['proxy____except'] = 'Regular expression για να πιάνει τα URLs για τα οποία θα παρακάμπτεται το proxy.'; +$lang['license_o_'] = 'Δεν επελέγει άδεια'; +$lang['typography_o_0'] = 'κανένα'; +$lang['typography_o_1'] = 'μόνο διπλά εισαγωγικά'; +$lang['typography_o_2'] = 'όλα τα εισαγωγικά (μπορεί να μην λειτουργεί πάντα)'; +$lang['userewrite_o_0'] = 'κανένα'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'από DokuWiki'; +$lang['deaccent_o_0'] = 'όχι'; +$lang['deaccent_o_1'] = 'αφαίρεση σημείων στίξης'; +$lang['deaccent_o_2'] = 'λατινοποίηση'; +$lang['gdlib_o_0'] = 'Δεν υπάρχει βιβλιοθήκη GD στο σύστημα'; +$lang['gdlib_o_1'] = 'Έκδοση 1.x'; +$lang['gdlib_o_2'] = 'Αυτόματος εντοπισμός'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Περίληψη'; +$lang['rss_content_o_diff'] = 'Ενοποιημένο Diff'; +$lang['rss_content_o_htmldiff'] = 'HTML διαμορφωμένος πίνακας diff'; +$lang['rss_content_o_html'] = 'Περιεχόμενο Σελίδας μόνο με HTML'; +$lang['rss_linkto_o_diff'] = 'προβολή αλλαγών'; +$lang['rss_linkto_o_page'] = 'τροποποιημένη σελίδα'; +$lang['rss_linkto_o_rev'] = 'εκδόσεις σελίδας'; +$lang['rss_linkto_o_current'] = 'τρέχουσα σελίδα'; +$lang['compression_o_0'] = 'none'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'να μην χρησιμοποιείται'; +$lang['xsendfile_o_1'] = 'Ιδιοταγής κεφαλίδα lighttpd (πριν από την έκδοση 1.5)'; +$lang['xsendfile_o_2'] = 'Τυπική κεφαλίδα X-Sendfile'; +$lang['xsendfile_o_3'] = 'Ιδιοταγής κεφαλίδα Nginx X-Accel-Redirect '; +$lang['showuseras_o_loginname'] = 'Όνομα χρήστη'; +$lang['showuseras_o_username'] = 'Ονοματεπώνυμο χρήστη'; +$lang['showuseras_o_username_link'] = 'Το ονοματεπώνυμο του χρήστη ως σύνδεσμος χρήστη interwiki '; +$lang['showuseras_o_email'] = 'e-mail διεύθυνση χρήστη (εμφανίζεται σύμφωνα με την ρύθμιση για την κωδικοποίηση e-mail διευθύνσεων)'; +$lang['showuseras_o_email_link'] = 'Εμφάνιση e-mail διεύθυνσης χρήστη σαν σύνδεσμος mailto:'; +$lang['useheading_o_0'] = 'Ποτέ'; +$lang['useheading_o_navigation'] = 'Μόνο κατά την πλοήγηση'; +$lang['useheading_o_content'] = 'Μόνο για τα περιεχόμενα του wiki'; +$lang['useheading_o_1'] = 'Πάντα'; +$lang['readdircache'] = 'Μέγιστος χρόνος διατήρησης για το cache του readdir (δευτερόλεπτα)'; diff --git a/lib/plugins/config/lang/en/intro.txt b/lib/plugins/config/lang/en/intro.txt new file mode 100644 index 0000000..0108987 --- /dev/null +++ b/lib/plugins/config/lang/en/intro.txt @@ -0,0 +1,7 @@ +====== Configuration Manager ====== + +Use this page to control the settings of your DokuWiki installation. For help on individual settings refer to [[doku>config]]. For more details about this plugin see [[doku>plugin:config]]. + +Settings shown with a light red background are protected and can not be altered with this plugin. Settings shown with a blue background are the default values and settings shown with a white background have been set locally for this particular installation. Both blue and white settings can be altered. + +Remember to press the **Save** button before leaving this page otherwise your changes will be lost. diff --git a/lib/plugins/config/lang/en/lang.php b/lib/plugins/config/lang/en/lang.php new file mode 100644 index 0000000..f1598e2 --- /dev/null +++ b/lib/plugins/config/lang/en/lang.php @@ -0,0 +1,280 @@ + + * @author Matthias Schulte + * @author Schplurtz le Déboulonné + */ + +// for admin plugins, the menu prompt to be displayed in the admin menu +// if set here, the plugin doesn't need to override the getMenuText() method +$lang['menu'] = 'Configuration Settings'; + +$lang['error'] = 'Settings not updated due to an invalid value, please review your changes and resubmit. +
    The incorrect value(s) will be shown surrounded by a red border.'; +$lang['updated'] = 'Settings updated successfully.'; +$lang['nochoice'] = '(no other choices available)'; +$lang['locked'] = 'The settings file can not be updated, if this is unintentional,
    + ensure the local settings file name and permissions are correct.'; + +$lang['danger'] = 'Danger: Changing this option could make your wiki and the configuration menu inaccessible.'; +$lang['warning'] = 'Warning: Changing this option could cause unintended behaviour.'; +$lang['security'] = 'Security Warning: Changing this option could present a security risk.'; + +/* --- Config Setting Headers --- */ +$lang['_configuration_manager'] = 'Configuration Manager'; //same as heading in intro.txt +$lang['_header_dokuwiki'] = 'DokuWiki'; +$lang['_header_plugin'] = 'Plugin'; +$lang['_header_template'] = 'Template'; +$lang['_header_undefined'] = 'Undefined Settings'; + +/* --- Config Setting Groups --- */ +$lang['_basic'] = 'Basic'; +$lang['_display'] = 'Display'; +$lang['_authentication'] = 'Authentication'; +$lang['_anti_spam'] = 'Anti-Spam'; +$lang['_editing'] = 'Editing'; +$lang['_links'] = 'Links'; +$lang['_media'] = 'Media'; +$lang['_notifications'] = 'Notification'; +$lang['_syndication'] = 'Syndication (RSS)'; +$lang['_advanced'] = 'Advanced'; +$lang['_network'] = 'Network'; + +/* --- Undefined Setting Messages --- */ +$lang['_msg_setting_undefined'] = 'No setting metadata.'; +$lang['_msg_setting_no_class'] = 'No setting class.'; +$lang['_msg_setting_no_known_class'] = 'Setting class not available.'; +$lang['_msg_setting_no_default'] = 'No default value.'; + +/* -------------------- Config Options --------------------------- */ + +/* Basic Settings */ +$lang['title'] = 'Wiki title aka. your wiki\'s name'; +$lang['start'] = 'Page name to use as the starting point for each namespace'; +$lang['lang'] = 'Interface language'; +$lang['template'] = 'Template aka. the design of the wiki.'; +$lang['tagline'] = 'Tagline (if template supports it)'; +$lang['sidebar'] = 'Sidebar page name (if template supports it), empty field disables the sidebar'; +$lang['license'] = 'Under which license should your content be released?'; +$lang['savedir'] = 'Directory for saving data'; +$lang['basedir'] = 'Server path (eg. /dokuwiki/). Leave blank for autodetection.'; +$lang['baseurl'] = 'Server URL (eg. http://www.yourserver.com). Leave blank for autodetection.'; +$lang['cookiedir'] = 'Cookie path. Leave blank for using baseurl.'; +$lang['dmode'] = 'Directory creation mode'; +$lang['fmode'] = 'File creation mode'; +$lang['allowdebug'] = 'Allow debug. Disable if not needed!'; + +/* Display Settings */ +$lang['recent'] = 'Number of entries per page in the recent changes'; +$lang['recent_days'] = 'How many recent changes to keep (days)'; +$lang['breadcrumbs'] = 'Number of "trace" breadcrumbs. Set to 0 to disable.'; +$lang['youarehere'] = 'Use hierarchical breadcrumbs (you probably want to disable the above option then)'; +$lang['fullpath'] = 'Reveal full path of pages in the footer'; +$lang['typography'] = 'Do typographical replacements'; +$lang['dformat'] = 'Date format (see PHP\'s strftime function)'; +$lang['signature'] = 'What to insert with the signature button in the editor'; +$lang['showuseras'] = 'What to display when showing the user that last edited a page'; +$lang['toptoclevel'] = 'Top level for table of contents'; +$lang['tocminheads'] = 'Minimum amount of headlines that determines whether the TOC is built'; +$lang['maxtoclevel'] = 'Maximum level for table of contents'; +$lang['maxseclevel'] = 'Maximum section edit level'; +$lang['camelcase'] = 'Use CamelCase for links'; +$lang['deaccent'] = 'How to clean pagenames'; +$lang['useheading'] = 'Use first heading for pagenames'; +$lang['sneaky_index'] = 'By default, DokuWiki will show all namespaces in the sitemap. Enabling this option will hide those where the user doesn\'t have read permissions. This might result in hiding of accessable subnamespaces which may make the index unusable with certain ACL setups.'; +$lang['hidepages'] = 'Hide pages matching this regular expression from search, the sitemap and other automatic indexes'; + +/* Authentication Settings */ +$lang['useacl'] = 'Use access control lists'; +$lang['autopasswd'] = 'Autogenerate passwords'; +$lang['authtype'] = 'Authentication backend'; +$lang['passcrypt'] = 'Password encryption method'; +$lang['defaultgroup']= 'Default group, all new users will be placed in this group'; +$lang['superuser'] = 'Superuser - group, user or comma separated list user1,@group1,user2 with full access to all pages and functions regardless of the ACL settings'; +$lang['manager'] = 'Manager - group, user or comma separated list user1,@group1,user2 with access to certain management functions'; +$lang['profileconfirm'] = 'Confirm profile changes with password'; +$lang['rememberme'] = 'Allow permanent login cookies (remember me)'; +$lang['disableactions'] = 'Disable DokuWiki actions'; +$lang['disableactions_check'] = 'Check'; +$lang['disableactions_subscription'] = 'Subscribe/Unsubscribe'; +$lang['disableactions_wikicode'] = 'View source/Export Raw'; +$lang['disableactions_profile_delete'] = 'Delete Own Account'; +$lang['disableactions_other'] = 'Other actions (comma separated)'; +$lang['disableactions_rss'] = 'XML Syndication (RSS)'; +$lang['auth_security_timeout'] = 'Authentication Security Timeout (seconds)'; +$lang['securecookie'] = 'Should cookies set via HTTPS only be sent via HTTPS by the browser? Disable this option when only the login of your wiki is secured with SSL but browsing the wiki is done unsecured.'; +$lang['samesitecookie'] = 'The samesite cookie attribute to use. Leaving it empty will let the browser decide on the samesite policy.'; +$lang['remote'] = 'Enable the remote API system. This allows other applications to access the wiki via XML-RPC or other mechanisms.'; +$lang['remoteuser'] = 'Restrict remote API access to the comma separated groups or users given here. Leave empty to give access to everyone.'; +$lang['remotecors'] = 'Enable Cross-Origin Resource Sharing (CORS) for the remote interfaces. Asterisk (*) to allow all origins. Leave empty to deny CORS.'; + +/* Anti-Spam Settings */ +$lang['usewordblock']= 'Block spam based on wordlist'; +$lang['relnofollow'] = 'Use rel="ugc nofollow" on external links'; +$lang['indexdelay'] = 'Time delay before indexing (sec)'; +$lang['mailguard'] = 'Obfuscate email addresses'; +$lang['iexssprotect']= 'Check uploaded files for possibly malicious JavaScript or HTML code'; + +/* Editing Settings */ +$lang['usedraft'] = 'Automatically save a draft while editing'; +$lang['locktime'] = 'Maximum age for lock files (sec)'; +$lang['cachetime'] = 'Maximum age for cache (sec)'; + +/* Link settings */ +$lang['target____wiki'] = 'Target window for internal links'; +$lang['target____interwiki'] = 'Target window for interwiki links'; +$lang['target____extern'] = 'Target window for external links'; +$lang['target____media'] = 'Target window for media links'; +$lang['target____windows'] = 'Target window for windows links'; + +/* Media Settings */ +$lang['mediarevisions'] = 'Enable Mediarevisions?'; +$lang['refcheck'] = 'Check if a media file is still in use before deleting it'; +$lang['gdlib'] = 'GD Lib version'; +$lang['im_convert'] = 'Path to ImageMagick\'s convert tool'; +$lang['jpg_quality'] = 'JPG compression quality (0-100)'; +$lang['fetchsize'] = 'Maximum size (bytes) fetch.php may download from external URLs, eg. to cache and resize external images.'; + +/* Notification Settings */ +$lang['subscribers'] = 'Allow users to subscribe to page changes by email'; +$lang['subscribe_time'] = 'Time after which subscription lists and digests are sent (sec); This should be smaller than the time specified in recent_days.'; +$lang['notify'] = 'Always send change notifications to this email address'; +$lang['registernotify'] = 'Always send info on newly registered users to this email address'; +$lang['mailfrom'] = 'Sender email address to use for automatic mails'; +$lang['mailreturnpath'] = 'Recipient email address for non delivery notifications'; +$lang['mailprefix'] = 'Email subject prefix to use for automatic mails. Leave blank to use the wiki title'; +$lang['htmlmail'] = 'Send better looking, but larger in size HTML multipart emails. Disable for plain text only mails.'; +$lang['dontlog'] = 'Disable logging for these types of logs.'; +$lang['logretain'] = 'How many days of logs to keep.'; + +/* Syndication Settings */ +$lang['sitemap'] = 'Generate Google sitemap this often (in days). 0 to disable'; +$lang['rss_type'] = 'XML feed type'; +$lang['rss_linkto'] = 'XML feed links to'; +$lang['rss_content'] = 'What to display in the XML feed items?'; +$lang['rss_update'] = 'XML feed update interval (sec)'; +$lang['rss_show_summary'] = 'XML feed show summary in title'; +$lang['rss_show_deleted'] = 'XML feed Show deleted feeds'; +$lang['rss_media'] = 'What kind of changes should be listed in the XML feed?'; +$lang['rss_media_o_both'] = 'both'; +$lang['rss_media_o_pages'] = 'pages'; +$lang['rss_media_o_media'] = 'media'; + + +/* Advanced Options */ +$lang['updatecheck'] = 'Check for updates and security warnings? DokuWiki needs to contact update.dokuwiki.org for this feature.'; +$lang['userewrite'] = 'Use nice URLs'; +$lang['useslash'] = 'Use slash as namespace separator in URLs'; +$lang['sepchar'] = 'Page name word separator'; +$lang['canonical'] = 'Use fully canonical URLs'; +$lang['fnencode'] = 'Method for encoding non-ASCII filenames.'; +$lang['autoplural'] = 'Check for plural forms in links'; +$lang['compression'] = 'Compression method for attic files'; +$lang['gzip_output'] = 'Use gzip Content-Encoding for xhtml'; +$lang['compress'] = 'Compact CSS and javascript output'; +$lang['cssdatauri'] = 'Size in bytes up to which images referenced in CSS files should be embedded right into the stylesheet to reduce HTTP request header overhead. 400 to 600 bytes is a good value. Set 0 to disable.'; +$lang['send404'] = 'Send "HTTP 404/Page Not Found" for non existing pages'; +$lang['broken_iua'] = 'Is the ignore_user_abort function broken on your system? This could cause a non working search index. IIS+PHP/CGI is known to be broken.'; +$lang['xsendfile'] = 'Use the X-Sendfile header to let the webserver deliver static files? Your webserver needs to support this.'; +$lang['renderer_xhtml'] = 'Renderer to use for main (xhtml) wiki output'; +$lang['renderer__core'] = '%s (dokuwiki core)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['search_nslimit'] = 'Limit the search to the current X namespaces. When a search is executed from a page within a deeper namespace, the first X namespaces will be added as filter'; +$lang['search_fragment'] = 'Specify the default fragment search behavior'; +$lang['search_fragment_o_exact'] = 'exact'; +$lang['search_fragment_o_starts_with'] = 'starts with'; +$lang['search_fragment_o_ends_with'] = 'ends with'; +$lang['search_fragment_o_contains'] = 'contains'; +$lang['trustedproxy'] = 'Trust forwarding proxies matching this regular expression about the true client IP they report. The default matches local networks. Leave empty to trust no proxy.'; + +$lang['_feature_flags'] = 'Feature Flags'; +$lang['defer_js'] = 'Defer javascript to be execute after the page\'s HTML has been parsed. Improves perceived page speed but could break a small number of plugins.'; +$lang['hidewarnings'] = 'Do not display any warnings issued by PHP. This may ease the transisition to PHP8+. Warnings will still be logged in the error log and should be reported.'; + +/* Network Options */ +$lang['dnslookups'] = 'DokuWiki will lookup hostnames for remote IP addresses of users editing pages. If you have a slow or non working DNS server or don\'t want this feature, disable this option'; +$lang['jquerycdn'] = 'Should the jQuery and jQuery UI script files be loaded from a CDN? This adds additional HTTP requests, but files may load faster and users may have them cached already.'; + +/* jQuery CDN options */ +$lang['jquerycdn_o_0'] = 'No CDN, local delivery only'; +$lang['jquerycdn_o_jquery'] = 'CDN at code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN at cdnjs.com'; + +/* Proxy Options */ +$lang['proxy____host'] = 'Proxy servername'; +$lang['proxy____port'] = 'Proxy port'; +$lang['proxy____user'] = 'Proxy user name'; +$lang['proxy____pass'] = 'Proxy password'; +$lang['proxy____ssl'] = 'Use SSL to connect to proxy'; +$lang['proxy____except'] = 'Regular expression to match URLs for which the proxy should be skipped.'; + +/* License Options */ +$lang['license_o_'] = 'None chosen'; + +/* typography options */ +$lang['typography_o_0'] = 'none'; +$lang['typography_o_1'] = 'excluding single quotes'; +$lang['typography_o_2'] = 'including single quotes (might not always work)'; + +/* userewrite options */ +$lang['userewrite_o_0'] = 'none'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki internal'; + +/* deaccent options */ +$lang['deaccent_o_0'] = 'off'; +$lang['deaccent_o_1'] = 'remove accents'; +$lang['deaccent_o_2'] = 'romanize'; + +/* gdlib options */ +$lang['gdlib_o_0'] = 'GD Lib not available'; +$lang['gdlib_o_1'] = 'Version 1.x'; +$lang['gdlib_o_2'] = 'Autodetection'; + +/* rss_type options */ +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; + +/* rss_content options */ +$lang['rss_content_o_abstract'] = 'Abstract'; +$lang['rss_content_o_diff'] = 'Unified Diff'; +$lang['rss_content_o_htmldiff'] = 'HTML formatted diff table'; +$lang['rss_content_o_html'] = 'Full HTML page content'; + +/* rss_linkto options */ +$lang['rss_linkto_o_diff'] = 'difference view'; +$lang['rss_linkto_o_page'] = 'the revised page'; +$lang['rss_linkto_o_rev'] = 'list of revisions'; +$lang['rss_linkto_o_current'] = 'the current page'; + +/* compression options */ +$lang['compression_o_0'] = 'none'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; + +/* xsendfile header */ +$lang['xsendfile_o_0'] = "don't use"; +$lang['xsendfile_o_1'] = 'Proprietary lighttpd header (before release 1.5)'; +$lang['xsendfile_o_2'] = 'Standard X-Sendfile header'; +$lang['xsendfile_o_3'] = 'Proprietary Nginx X-Accel-Redirect header'; + +/* Display user info */ +$lang['showuseras_o_loginname'] = 'Login name'; +$lang['showuseras_o_username'] = "User's full name"; +$lang['showuseras_o_username_link'] = "User's full name as interwiki user link"; +$lang['showuseras_o_email'] = "User's e-mail addresss (obfuscated according to mailguard setting)"; +$lang['showuseras_o_email_link'] = "User's e-mail addresss as a mailto: link"; + +/* useheading options */ +$lang['useheading_o_0'] = 'Never'; +$lang['useheading_o_navigation'] = 'Navigation Only'; +$lang['useheading_o_content'] = 'Wiki Content Only'; +$lang['useheading_o_1'] = 'Always'; + +$lang['readdircache'] = 'Maximum age for readdir cache (sec)'; diff --git a/lib/plugins/config/lang/eo/intro.txt b/lib/plugins/config/lang/eo/intro.txt new file mode 100644 index 0000000..5ed2f0e --- /dev/null +++ b/lib/plugins/config/lang/eo/intro.txt @@ -0,0 +1,7 @@ +====== Administrilo de Agordoj ====== + +Uzu tiun ĉi paĝon por kontroli la difinojn de via DokuWiki-instalo. Por helpo pri specifaj difinoj aliru al [[doku>config]]. Por pli detaloj pri tiu ĉi kromaĵo, vidu [[doku>plugin:config]]. + +Difinoj montrataj kun helruĝa fono estas protektitaj kaj ne povas esti modifataj per tiu ĉi kromaĵo. Difinoj kun blua fono estas aprioraj valoroj kaj difinoj montrataj kun blanka fono iam difiniĝis por tiu ĉi specifa instalo. Ambaŭ blua kaj blanka difinoj povas esti modifataj. + +Memoru premi la butonon **Registri** antaŭ ol eliri tiun ĉi paĝon, male viaj modifoj perdiĝus. diff --git a/lib/plugins/config/lang/eo/lang.php b/lib/plugins/config/lang/eo/lang.php new file mode 100644 index 0000000..4812f6f --- /dev/null +++ b/lib/plugins/config/lang/eo/lang.php @@ -0,0 +1,197 @@ + + * @author Erik Bjørn Pedersen + * @author Florian + * @author Kristjan SCHMIDT + * @author Felipe Castro + * @author Felipo Kastro + * @author Robert Bogenschneider + * @author Erik Pedersen + */ +$lang['menu'] = 'Agordaj Difinoj'; +$lang['error'] = 'La difinoj ne estas ĝisdatigitaj pro malvalida valoro: bonvolu revizii viajn ŝanĝojn kaj resubmeti ilin. +
    La malkorekta(j) valoro(j) estas ĉirkaŭita(j) de ruĝa kadro.'; +$lang['updated'] = 'La difinoj sukcese ĝisdatiĝis.'; +$lang['nochoice'] = '(neniu alia elekto disponeblas)'; +$lang['locked'] = 'La difin-dosiero ne povas esti ĝisdatigita; se tio ne estas intenca,
    certiĝu, ke la dosieroj de lokaj difinoj havas korektajn nomojn kaj permesojn.'; +$lang['danger'] = 'Danĝero: ŝanĝi tiun opcion povus igi vian vikion kaj la agordan menuon neatingebla.'; +$lang['warning'] = 'Averto: ŝanĝi tiun opcion povus rezulti en neatendita konduto.'; +$lang['security'] = 'Sekureca averto: ŝanĝi tiun opcion povus krei sekurecan riskon.'; +$lang['_configuration_manager'] = 'Administrilo de agordoj'; +$lang['_header_dokuwiki'] = 'Difinoj por DokuWiki'; +$lang['_header_plugin'] = 'Difinoj por kromaĵoj'; +$lang['_header_template'] = 'Difinoj por ŝablonoj'; +$lang['_header_undefined'] = 'Ceteraj difinoj'; +$lang['_basic'] = 'Bazaj difinoj'; +$lang['_display'] = 'Difinoj por montrado'; +$lang['_authentication'] = 'Difinoj por identiĝo'; +$lang['_anti_spam'] = 'Kontraŭ-spamaj difinoj'; +$lang['_editing'] = 'Difinoj por redakto'; +$lang['_links'] = 'Difinoj por ligiloj'; +$lang['_media'] = 'Difinoj por aŭdvidaĵoj'; +$lang['_notifications'] = 'Sciigaj agordoj'; +$lang['_syndication'] = 'Kunhavigaj agordoj'; +$lang['_advanced'] = 'Fakaj difinoj'; +$lang['_network'] = 'Difinoj por reto'; +$lang['_msg_setting_undefined'] = 'Neniu difinanta metadatumaro.'; +$lang['_msg_setting_no_class'] = 'Neniu difinanta klaso.'; +$lang['_msg_setting_no_default'] = 'Neniu apriora valoro.'; +$lang['title'] = 'Titolo de la vikio'; +$lang['start'] = 'Nomo de la hejmpaĝo'; +$lang['lang'] = 'Lingvo'; +$lang['template'] = 'Ŝablono'; +$lang['tagline'] = 'Moto (se la ŝablono antaûvidas tion)'; +$lang['sidebar'] = 'Nomo de la flanka paĝo (se la ŝablono antaûvidas tion), malplena kampo malebligas la flankan paĝon'; +$lang['license'] = 'Laŭ kiu permesilo via enhavo devus esti publikigita?'; +$lang['savedir'] = 'Dosierujo por konservi datumaron'; +$lang['basedir'] = 'Baza dosierujo'; +$lang['baseurl'] = 'Baza URL'; +$lang['cookiedir'] = 'Kuketopado. Lasu malplena por uzi baseurl.'; +$lang['dmode'] = 'Reĝimo de dosierujo-kreado'; +$lang['fmode'] = 'Reĝimo de dosiero-kreado'; +$lang['allowdebug'] = 'Ebligi kodumpurigadon malebligu se ne necese!<;/b>'; +$lang['recent'] = 'Freŝaj ŝanĝoj'; +$lang['recent_days'] = 'Kiom da freŝaj ŝanĝoj por teni (tagoj)'; +$lang['breadcrumbs'] = 'Nombro da paderoj'; +$lang['youarehere'] = 'Hierarkiaj paderoj'; +$lang['fullpath'] = 'Montri la kompletan padon de la paĝoj en la piedlinio'; +$lang['typography'] = 'Fari tipografiajn anstataŭigojn'; +$lang['dformat'] = 'Formato de datoj (vidu la PHP-an funkcion strftime)'; +$lang['signature'] = 'Subskribo'; +$lang['showuseras'] = 'Kiel indiki la lastan redaktinton'; +$lang['toptoclevel'] = 'Supera nivelo por la enhavtabelo'; +$lang['tocminheads'] = 'Minimuma kvanto da ĉeftitoloj, kiu difinas ĉu la TOC estas kreata.'; +$lang['maxtoclevel'] = 'Maksimuma nivelo por la enhavtabelo'; +$lang['maxseclevel'] = 'Maksimuma nivelo por redakti sekciojn'; +$lang['camelcase'] = 'Uzi KamelUsklecon por ligiloj'; +$lang['deaccent'] = 'Netaj paĝnomoj'; +$lang['useheading'] = 'Uzi unuan titolon por paĝnomoj'; +$lang['sneaky_index'] = 'Apriore, DokuWiki montras ĉiujn nomspacojn en la indeksa modo. Ebligi tiun ĉi elekteblon kaŝus tion, kion la uzanto ne rajtas legi laŭ ACL. Tio povus rezulti ankaŭan kaŝon de alireblaj subnomspacoj. Tiel la indekso estus neuzebla por kelkaj agordoj de ACL.'; +$lang['hidepages'] = 'Kaŝi kongruantajn paĝojn (laŭ regulaj esprimoj)'; +$lang['useacl'] = 'Uzi alirkontrolajn listojn'; +$lang['autopasswd'] = 'Aŭtomate krei pasvortojn'; +$lang['authtype'] = 'Tipo de identiĝo'; +$lang['passcrypt'] = 'Metodo por ĉifri pasvortojn'; +$lang['defaultgroup'] = 'Antaŭdifinita grupo'; +$lang['superuser'] = 'Superanto - grupo, uzanto aŭ listo (disigita per komoj), kiu plene alireblas al ĉiuj paĝoj kaj funkcioj, sendepende de la reguloj ACL'; +$lang['manager'] = 'Administranto - grupo, uzanto aŭ listo (apartite per komoj), kiu havas alirpermeson al kelkaj administraj funkcioj'; +$lang['profileconfirm'] = 'Konfirmi ŝanĝojn en la trajtaro per pasvorto'; +$lang['rememberme'] = 'Permesi longdaŭran ensalutajn kuketojn (rememoru min)'; +$lang['disableactions'] = 'Malebligi DokuWiki-ajn agojn'; +$lang['disableactions_check'] = 'Kontroli'; +$lang['disableactions_subscription'] = 'Aliĝi/Malaliĝi'; +$lang['disableactions_wikicode'] = 'Rigardi vikitekston/Eksporti fontotekston'; +$lang['disableactions_profile_delete'] = 'Forigi la propran konton'; +$lang['disableactions_other'] = 'Aliaj agoj (disigita per komoj)'; +$lang['auth_security_timeout'] = 'Sekureca tempolimo por aŭtentigo (sekundoj)'; +$lang['securecookie'] = 'Ĉu kuketoj difinitaj per HTTPS sendiĝu de la foliumilo nur per HTTPS? Malebligu tiun ĉi opcion kiam nur la ensaluto al via vikio estas sekurigita per SSL, sed foliumado de la vikio estas farita malsekure.'; +$lang['remote'] = 'Ebligu la traretan API-sistemon. Tio ebligas al aliaj aplikaĵoj aliri la vikion pere de XML-RPC aũ aliaj mekanismoj.'; +$lang['remoteuser'] = 'Limigi traretan API-aliron al la komodisigitaj grupoj aũ uzantoj indikitaj jene. Lasu malplena por ebligi aliron al ĉiu ajn.'; +$lang['usewordblock'] = 'Bloki spamon surbaze de vortlisto'; +$lang['relnofollow'] = 'Uzi rel="nofollow" kun eksteraj ligiloj'; +$lang['indexdelay'] = 'Prokrasto antaŭ ol indeksi (en sekundoj)'; +$lang['mailguard'] = 'Nebuligi retadresojn'; +$lang['iexssprotect'] = 'Ekzameni elŝutaĵojn kontraŭ eblaj malicaj ĴavaSkripto aŭ HTML-a kodumaĵo'; +$lang['usedraft'] = 'Aŭtomate konservi skizon dum redaktado'; +$lang['locktime'] = 'Maksimuma aĝo por serurdosieroj (sek.)'; +$lang['cachetime'] = 'Maksimuma aĝo por provizmemoro (sek.)'; +$lang['target____wiki'] = 'Parametro "target" (celo) por internaj ligiloj'; +$lang['target____interwiki'] = 'Parametro "target" (celo) por intervikiaj ligiloj'; +$lang['target____extern'] = 'Parametro "target" (celo) por eksteraj ligiloj'; +$lang['target____media'] = 'Parametro "target" (celo) por aŭdvidaĵaj ligiloj'; +$lang['target____windows'] = 'Parametro "target" (celo) por Vindozaj ligiloj'; +$lang['mediarevisions'] = 'Ĉu ebligi reviziadon de aŭdvidaĵoj?'; +$lang['refcheck'] = 'Kontrolo por referencoj al aŭdvidaĵoj'; +$lang['gdlib'] = 'Versio de GD-Lib'; +$lang['im_convert'] = 'Pado al la konvertilo de ImageMagick'; +$lang['jpg_quality'] = 'Kompaktiga kvalito de JPG (0-100)'; +$lang['fetchsize'] = 'Maksimuma grandeco (bitokoj), kiun fetch.php rajtas elŝuti el ekstere'; +$lang['subscribers'] = 'Ebligi subtenon de avizoj pri ŝanĝoj sur paĝoj'; +$lang['subscribe_time'] = 'Tempo, post kiu abonlistoj kaj kolektaĵoj sendiĝas (sek); Tio estu pli malgranda ol la tempo indikita en recent_days.'; +$lang['notify'] = 'Sendi avizojn pri ŝanĝoj al tiu ĉi retadreso'; +$lang['registernotify'] = 'Sendi informon pri ĵusaj aliĝintoj al tiu ĉi retadreso'; +$lang['mailfrom'] = 'Retadreso uzota por aŭtomataj retmesaĝoj '; +$lang['mailprefix'] = 'Retpoŝta temo-prefikso por uzi en aŭtomataj mesaĝoj'; +$lang['htmlmail'] = 'Sendi pli bele aspektajn, sed pli grandajn plurpartajn HTML-retpoŝtaĵojn. Malebligu por ricevi pure tekstajn mesaĝojn.'; +$lang['sitemap'] = 'Krei Guglan paĝarmapon "sitemap" (po kiom tagoj)'; +$lang['rss_type'] = 'XML-a tipo de novaĵ-fluo'; +$lang['rss_linkto'] = 'La novaĵ-fluo de XML ligiĝas al'; +$lang['rss_content'] = 'Kion montri en la XML-aj novaĵ-flueroj?'; +$lang['rss_update'] = 'Intertempo por ĝisdatigi XML-an novaĵ-fluon (sek.)'; +$lang['rss_show_summary'] = 'XML-a novaĵ-fluo montras resumon en la titolo'; +$lang['rss_media'] = 'Kiaj ŝangoj estu montrataj en la XML-fluo?'; +$lang['rss_media_o_both'] = 'ambaŭ'; +$lang['rss_media_o_pages'] = 'paĝoj'; +$lang['updatecheck'] = 'Ĉu kontroli aktualigojn kaj sekurecajn avizojn? DokuWiki bezonas kontakti update.dokuwiki.org por tiu ĉi trajto.'; +$lang['userewrite'] = 'Uzi netajn URL-ojn'; +$lang['useslash'] = 'Uzi frakcistrekon kiel disigsignaĵon por nomspacoj en URL-oj'; +$lang['sepchar'] = 'Disigsignaĵo de vortoj en paĝnomoj'; +$lang['canonical'] = 'Uzi tute evidentajn URL-ojn'; +$lang['fnencode'] = 'Kodiga metodo por ne-ASCII-aj dosiernomoj.'; +$lang['autoplural'] = 'Kontroli pluralajn formojn en ligiloj'; +$lang['compression'] = 'Kompaktigmetodo por arkivaj dosieroj'; +$lang['gzip_output'] = 'Uzi gzip-an enhav-enkodigon por XHTML'; +$lang['compress'] = 'Kompaktigi CSS-ajn kaj ĵavaskriptajn elmetojn'; +$lang['cssdatauri'] = 'Grandeco en bitokoj, ĝis kiom en CSS-dosieroj referencitaj bildoj enmetiĝu rekte en la stilfolion por malgrandigi vanan HTTP-kapan trafikon. +400 ĝis 600 bitokoj estas bona grandeco. Indiku 0 por malebligi enmeton.'; +$lang['send404'] = 'Sendi la mesaĝon "HTTP 404/Paĝo ne trovita" por ne ekzistantaj paĝoj'; +$lang['broken_iua'] = 'Ĉu la funkcio "ignore_user_abort" difektas en via sistemo? Tio povus misfunkciigi la serĉindekson. IIS+PHP/CGI estas konata kiel fuŝaĵo. Vidu Cimon 852 por pli da informoj.'; +$lang['xsendfile'] = 'Ĉu uzi la kaplinion X-Sendfile por ebligi al la retservilo liveri fiksajn dosierojn? Via retservilo subtenu tion.'; +$lang['renderer_xhtml'] = 'Prezentilo por la ĉefa vikia rezulto (xhtml)'; +$lang['renderer__core'] = '%s (DokuWiki-a kerno)'; +$lang['renderer__plugin'] = '%s (kromaĵo)'; +$lang['dnslookups'] = 'DokuWiki rigardos servilajn nomojn por paĝmodifoj tra fremdaj IP-adresoj. Se vi havas malrapidan aũ nefunkciantan DNS-servilon aũ malŝatas tiun trajton, malebligu tiun opcion'; +$lang['proxy____host'] = 'Retservilnomo de la "Proxy"'; +$lang['proxy____port'] = 'Pordo ĉe la "Proxy"'; +$lang['proxy____user'] = 'Uzantonomo ĉe la "Proxy"'; +$lang['proxy____pass'] = 'Pasvorto ĉe la "Proxy"'; +$lang['proxy____ssl'] = 'Uzi SSL por konekti al la "Proxy"'; +$lang['proxy____except'] = 'Regula esprimo por URL-oj, kiujn la servilo preterrigardu.'; +$lang['license_o_'] = 'Nenio elektita'; +$lang['typography_o_0'] = 'nenio'; +$lang['typography_o_1'] = 'Nur duoblaj citiloj'; +$lang['typography_o_2'] = 'Ĉiaj citiloj (eble ne ĉiam funkcios)'; +$lang['userewrite_o_0'] = 'nenio'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'Interne de DokuWiki'; +$lang['deaccent_o_0'] = 'ne'; +$lang['deaccent_o_1'] = 'forigi supersignojn'; +$lang['deaccent_o_2'] = 'latinigi'; +$lang['gdlib_o_0'] = 'GD-Lib ne disponeblas'; +$lang['gdlib_o_1'] = 'Versio 1.x'; +$lang['gdlib_o_2'] = 'Aŭtomata detekto'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Resumo'; +$lang['rss_content_o_diff'] = 'Unuigita "Diff"'; +$lang['rss_content_o_htmldiff'] = '"Diff"-tabelo formatita laŭ HTML'; +$lang['rss_content_o_html'] = 'Enhavo laŭ kompleta HTML-paĝo'; +$lang['rss_linkto_o_diff'] = 'diferenca rigardo'; +$lang['rss_linkto_o_page'] = 'la reviziita paĝo'; +$lang['rss_linkto_o_rev'] = 'listo de revizioj'; +$lang['rss_linkto_o_current'] = 'la aktuala paĝo'; +$lang['compression_o_0'] = 'nenio'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'ne uzi'; +$lang['xsendfile_o_1'] = 'Propra kaplinio "lighttpd" (antaŭ versio 1.5)'; +$lang['xsendfile_o_2'] = 'Ordinara kaplinio X-Sendfile'; +$lang['xsendfile_o_3'] = 'Propra kaplinio Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Ensalut-nomo'; +$lang['showuseras_o_username'] = 'Kompleta nomo de uzanto'; +$lang['showuseras_o_email'] = 'Retadreso de uzanto (sekur-montrita laŭ agordo de nebuligo)'; +$lang['showuseras_o_email_link'] = 'Retadreso de uzanto kiel mailto:-ligilo'; +$lang['useheading_o_0'] = 'Neniam'; +$lang['useheading_o_navigation'] = 'Nur foliumado'; +$lang['useheading_o_content'] = 'Nur vikia enhavo'; +$lang['useheading_o_1'] = 'Ĉiam'; +$lang['readdircache'] = 'Maksimuma daŭro de la dosieruja kaŝmemoro (sekundoj)'; diff --git a/lib/plugins/config/lang/es/intro.txt b/lib/plugins/config/lang/es/intro.txt new file mode 100644 index 0000000..0b42c6b --- /dev/null +++ b/lib/plugins/config/lang/es/intro.txt @@ -0,0 +1,7 @@ +====== Administrador de configuración ====== + +Usa esta página para controlar los parámetros de tu instalación de Dokuwiki. Ayuda sobre [[doku>config|parámetros individuales]]. Más detalles sobre este [[doku>plugin:config|plugin]]. + +Los parámetros que se muestran sobre un fondo rosado están protegidos y no pueden ser modificados usando este plugin. Los parámetros que se muestran sobre un fondo azul tienen los valores por defecto, y los parámetros mostrados sobre un fondo blanco han sido establecidos para esta instalación en particular. Tanto los parámetros sobre fondo azul y los que están sobre fondo blanco pueden ser modificados. + +Recuerda cliquear el boton **Guardar** antes de abandonar la página, sino se perderán los cambios que hayas hecho. diff --git a/lib/plugins/config/lang/es/lang.php b/lib/plugins/config/lang/es/lang.php new file mode 100644 index 0000000..aa2cf02 --- /dev/null +++ b/lib/plugins/config/lang/es/lang.php @@ -0,0 +1,230 @@ + + * @author Luna Frax + * @author Domingo Redal + * @author Miguel Pagano + * @author Oscar M. Lage + * @author Gabriel Castillo + * @author oliver + * @author Enrico Nicoletto + * @author Manuel Meco + * @author VictorCastelan + * @author Jordan Mero + * @author Felipe Martinez + * @author Javier Aranda + * @author Zerial + * @author Marvin Ortega + * @author Daniel Castro Alvarado + * @author Fernando J. Gómez + * @author Mauro Javier Giamberardino + * @author emezeta + * @author Oscar Ciudad + * @author Ruben Figols + * @author Gerardo Zamudio + * @author Mercè López + */ +$lang['menu'] = 'Parámetros de configuración'; +$lang['error'] = 'Los parámetros no han sido actualizados a causa de un valor inválido, por favor revise los cambios y re-envíe el formulario.
    Los valores incorrectos se mostrarán con un marco rojo alrededor.'; +$lang['updated'] = 'Los parámetros se actualizaron con éxito.'; +$lang['nochoice'] = '(no hay otras alternativas disponibles)'; +$lang['locked'] = 'El archivo de configuración no ha podido ser actualizado, si esto no es lo deseado,
    asegúrese que el nombre del archivo local de configuraciones y los permisos sean los correctos.'; +$lang['danger'] = 'Atención: Cambiar esta opción podría hacer inaccesible el wiki y su menú de configuración.'; +$lang['warning'] = 'Advertencia: Cambiar esta opción podría causar comportamientos no deseados.'; +$lang['security'] = 'Advertencia de Seguridad: Cambiar esta opción podría representar un riesgo de seguridad.'; +$lang['_configuration_manager'] = 'Administrador de configuración'; +$lang['_header_dokuwiki'] = 'Parámetros de DokuWiki'; +$lang['_header_plugin'] = 'Parámetros de Plugin'; +$lang['_header_template'] = 'Parámetros de Plantillas'; +$lang['_header_undefined'] = 'Parámetros sin categoría'; +$lang['_basic'] = 'Parámetros Básicos'; +$lang['_display'] = 'Parámetros de Presentación'; +$lang['_authentication'] = 'Parámetros de Autenticación'; +$lang['_anti_spam'] = 'Parámetros Anti-Spam'; +$lang['_editing'] = 'Parámetros de Edición'; +$lang['_links'] = 'Parámetros de Enlaces'; +$lang['_media'] = 'Parámetros de Medios'; +$lang['_notifications'] = 'Configuración de notificaciones'; +$lang['_syndication'] = 'Configuración de sindicación'; +$lang['_advanced'] = 'Parámetros Avanzados'; +$lang['_network'] = 'Parámetros de Red'; +$lang['_msg_setting_undefined'] = 'Sin parámetros de metadata.'; +$lang['_msg_setting_no_class'] = 'Sin clase establecida.'; +$lang['_msg_setting_no_known_class'] = 'Configuración de la clase no disponible.'; +$lang['_msg_setting_no_default'] = 'Sin valor por defecto.'; +$lang['title'] = 'Título del wiki'; +$lang['start'] = 'Nombre de la página inicial'; +$lang['lang'] = 'Idioma'; +$lang['template'] = 'Plantilla'; +$lang['tagline'] = 'Lema (si la plantilla lo soporta)'; +$lang['sidebar'] = 'Nombre de la barra lateral (si la plantilla lo soporta), un campo vacío la desactiva'; +$lang['license'] = '¿Bajo qué licencia será liberado tu contenido?'; +$lang['savedir'] = 'Directorio para guardar los datos'; +$lang['basedir'] = 'Directorio de base'; +$lang['baseurl'] = 'URL de base'; +$lang['cookiedir'] = 'Ruta para las Cookie. Dejar en blanco para usar la ruta básica.'; +$lang['dmode'] = 'Modo de creación de directorios'; +$lang['fmode'] = 'Modo de creación de ficheros'; +$lang['allowdebug'] = 'Permitir debug deshabilítelo si no lo necesita!'; +$lang['recent'] = 'Cambios recientes'; +$lang['recent_days'] = 'Cuántos cambios recientes mantener (días)'; +$lang['breadcrumbs'] = 'Número de pasos de traza'; +$lang['youarehere'] = 'Traza jerárquica'; +$lang['fullpath'] = 'Mostrar ruta completa en el pie de página'; +$lang['typography'] = 'Realizar reemplazos tipográficos'; +$lang['dformat'] = 'Formato de fecha (ver la función de PHP strftime)'; +$lang['signature'] = 'Firma'; +$lang['showuseras'] = 'Qué ver al mostrar el último usuario que editó una página'; +$lang['toptoclevel'] = 'Nivel superior para la tabla de contenidos'; +$lang['tocminheads'] = 'La cantidad mínima de titulares que determina si el TOC es construido'; +$lang['maxtoclevel'] = 'Máximo nivel para la tabla de contenidos'; +$lang['maxseclevel'] = 'Máximo nivel para edición de sección'; +$lang['camelcase'] = 'Usar CamelCase para enlaces'; +$lang['deaccent'] = 'Nombres de páginas "limpios"'; +$lang['useheading'] = 'Usar el primer encabezado para nombres de páginas'; +$lang['sneaky_index'] = 'Por defecto, DokuWiki mostrará todos los namespaces en el index. Habilitando esta opción los ocultará si el usuario no tiene permisos de lectura. Los sub-namespaces pueden resultar inaccesibles. El index puede hacerse poco usable dependiendo de las configuraciones ACL.'; +$lang['hidepages'] = 'Ocultar páginas con coincidencias (expresiones regulares)'; +$lang['useacl'] = 'Usar listas de control de acceso (ACL)'; +$lang['autopasswd'] = 'Autogenerar contraseñas'; +$lang['authtype'] = 'Método de Autenticación'; +$lang['passcrypt'] = 'Método de cifrado de contraseñas'; +$lang['defaultgroup'] = 'Grupo por defecto'; +$lang['superuser'] = 'Super-usuario - grupo ó usuario con acceso total a todas las páginas y funciones, configuraciones ACL'; +$lang['manager'] = 'Manager - grupo o usuario con acceso a ciertas tareas de mantenimiento'; +$lang['profileconfirm'] = 'Confirmar cambios en perfil con contraseña'; +$lang['rememberme'] = 'Permitir cookies para acceso permanente (recordarme)'; +$lang['disableactions'] = 'Deshabilitar acciones DokuWiki'; +$lang['disableactions_check'] = 'Controlar'; +$lang['disableactions_subscription'] = 'Suscribirse/Cancelar suscripción'; +$lang['disableactions_wikicode'] = 'Ver la fuente/Exportar en formato raw'; +$lang['disableactions_profile_delete'] = 'Borrar tu propia cuenta'; +$lang['disableactions_other'] = 'Otras acciones (separadas por coma)'; +$lang['disableactions_rss'] = 'Sindicación XML (RSS)'; +$lang['auth_security_timeout'] = 'Tiempo de Autenticación (en segundos), por motivos de seguridad'; +$lang['securecookie'] = 'Las cookies establecidas por HTTPS, ¿el naveagdor solo puede enviarlas por HTTPS? Inhabilite esta opción cuando solo se asegure con SSL la entrada, pero no la navegación de su wiki.'; +$lang['remote'] = 'Activar el sistema API remoto. Esto permite a otras aplicaciones acceder al wiki a traves de XML-RPC u otros mecanismos.'; +$lang['remoteuser'] = 'Restringir el acceso remoto por API a los grupos o usuarios separados por comas que se dan aquí. Dejar en blanco para dar acceso a todo el mundo.'; +$lang['remotecors'] = 'Habilitar el Uso Compartido de Recursos entre Orígenes (CORS) para las interfaces remotas. Asterisco (*) para permitir todos los orígenes. Dejar vacío para denegar CORS.'; +$lang['usewordblock'] = 'Bloquear spam usando una lista de palabras'; +$lang['relnofollow'] = 'Usar rel="nofollow" en enlaces externos'; +$lang['indexdelay'] = 'Intervalo de tiempo antes de indexar (segundos)'; +$lang['mailguard'] = 'Ofuscar direcciones de correo electrónico'; +$lang['iexssprotect'] = 'Comprobar posible código malicioso (JavaScript ó HTML) en archivos subidos'; +$lang['usedraft'] = 'Guardar automáticamente un borrador mientras se edita'; +$lang['locktime'] = 'Edad máxima para archivos de bloqueo (segundos)'; +$lang['cachetime'] = 'Edad máxima para caché (segundos)'; +$lang['target____wiki'] = 'Ventana para enlaces internos'; +$lang['target____interwiki'] = 'Ventana para enlaces interwikis'; +$lang['target____extern'] = 'Ventana para enlaces externos'; +$lang['target____media'] = 'Ventana para enlaces a medios'; +$lang['target____windows'] = 'Ventana para enlaces a ventanas'; +$lang['mediarevisions'] = '¿Habilitar Mediarevisions?'; +$lang['refcheck'] = 'Control de referencia a medios'; +$lang['gdlib'] = 'Versión de GD Lib'; +$lang['im_convert'] = 'Ruta a la herramienta de conversión de ImageMagick'; +$lang['jpg_quality'] = 'Calidad de compresión de JPG (0-100)'; +$lang['fetchsize'] = 'Tamaño máximo (bytes) que fetch.php puede descargar de sitios externos'; +$lang['subscribers'] = 'Habilitar soporte para suscripción a páginas'; +$lang['subscribe_time'] = 'Tiempo después que alguna lista de suscripción fue enviada (seg); Debe ser menor que el tiempo especificado en días recientes.'; +$lang['notify'] = 'Enviar notificación de cambios a esta dirección de correo electrónico'; +$lang['registernotify'] = 'Enviar información cuando se registran nuevos usuarios a esta dirección de correo electrónico'; +$lang['mailfrom'] = 'Dirección de correo electrónico para emails automáticos'; +$lang['mailreturnpath'] = 'Dirección de correo electrónico del destinatario para las notificaciones de no entrega'; +$lang['mailprefix'] = 'Asunto por defecto que se utilizará en mails automáticos.'; +$lang['htmlmail'] = 'Enviar correos electronicos en HTML con mejor aspecto pero mayor peso. Desactivar para enviar correos electronicos en texto plano.'; +$lang['dontlog'] = 'Deshabilitar inicio de sesión para este tipo de registros.'; +$lang['sitemap'] = 'Generar sitemap de Google (días)'; +$lang['rss_type'] = 'Tipo de resumen (feed) XML'; +$lang['rss_linkto'] = 'Feed XML enlaza a'; +$lang['rss_content'] = '¿Qué mostrar en los items del archivo XML?'; +$lang['rss_update'] = 'Intervalo de actualización de feed XML (segundos)'; +$lang['rss_show_summary'] = 'Feed XML muestra el resumen en el título'; +$lang['rss_show_deleted'] = 'Fuente XML Mostrar fuentes eliminadas'; +$lang['rss_media'] = '¿Qué tipo de cambios deberían aparecer en el feed XML?'; +$lang['rss_media_o_both'] = 'ambos'; +$lang['rss_media_o_pages'] = 'páginas'; +$lang['rss_media_o_media'] = 'multimedia'; +$lang['updatecheck'] = '¿Comprobar actualizaciones y advertencias de seguridad? Esta característica requiere que DokuWiki se conecte a update.dokuwiki.org.'; +$lang['userewrite'] = 'Usar URLs bonitas'; +$lang['useslash'] = 'Usar barra (/) como separador de espacios de nombres en las URLs'; +$lang['sepchar'] = 'Separador de palabras en nombres de páginas'; +$lang['canonical'] = 'Usar URLs totalmente canónicas'; +$lang['fnencode'] = 'Método para codificar nombres de archivo no-ASCII.'; +$lang['autoplural'] = 'Controlar plurales en enlaces'; +$lang['compression'] = 'Método de compresión para archivos en el ático'; +$lang['gzip_output'] = 'Usar gzip Content-Encoding para xhtml'; +$lang['compress'] = 'Compactar la salida de CSS y javascript'; +$lang['cssdatauri'] = 'Tamaño en bytes hasta el cual las imágenes referenciadas en archivos CSS deberían ir incrustadas en la hoja de estilos para reducir el número de cabeceras de petición HTTP. ¡Esta técnica no funcionará en IE < 8! De 400 a 600 bytes es un valor adecuado. Establezca 0 para deshabilitarlo.'; +$lang['send404'] = 'Enviar "HTTP 404/Page Not Found" para páginas no existentes'; +$lang['broken_iua'] = '¿Se ha roto (broken) la función ignore_user_abort en su sistema? Esto puede causar que no funcione el index de búsqueda. Se sabe que IIS+PHP/CGI está roto. Vea Bug 852para más información.'; +$lang['xsendfile'] = '¿Utilizar la cabecera X-Sendfile para permitirle al servidor web enviar archivos estáticos? Su servidor web necesita tener la capacidad para hacerlo.'; +$lang['renderer_xhtml'] = 'Visualizador a usar para salida (xhtml) principal del wiki'; +$lang['renderer__core'] = '%s (núcleo dokuwiki)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['search_nslimit'] = 'Limite la búsqueda a los actuales X espacios de nombres. Cuando se ejecuta una búsqueda desde una página dentro de un espacio de nombres más profundo, los primeros X espacios de nombres se agregarán como filtro'; +$lang['search_fragment'] = 'Especifique el comportamiento predeterminado de la búsqueda de fragmentos'; +$lang['search_fragment_o_exact'] = 'exacto'; +$lang['search_fragment_o_starts_with'] = 'comienza con'; +$lang['search_fragment_o_ends_with'] = 'termina con'; +$lang['search_fragment_o_contains'] = 'contiene'; +$lang['trustedproxy'] = 'Confíe en los proxys de reenvío que coincidan con esta expresión regular acerca de la IP verdadera del cliente que referencia. El valor predeterminado coincide con las redes locales. Dejar en blanco para no confiar en ningún proxy.'; +$lang['_feature_flags'] = 'Configuración de características'; +$lang['defer_js'] = 'Aplazar JavaScript para que se ejecute después de que se haya analizado el HTML de la página. Mejora la velocidad percibida de la página, pero podría romper un pequeño número de complementos.'; +$lang['hidewarnings'] = 'No mostrar ninguna advertencia emitida por PHP. Esto puede facilitar la transición a PHP8+. Las advertencias seguirán siendo registradas en el registro de errores y deben ser reportadas.'; +$lang['dnslookups'] = 'DokuWiki buscara los hostnames para usuarios editando las páginas con IP remota. Si usted tiene un servidor DNS bastante lento o que no funcione, favor de desactivar esta opción.'; +$lang['jquerycdn'] = '¿Deberían cargarse los ficheros de script jQuery y jQuery UI desde un CDN? Esto añade peticiones HTTP adicionales, pero los ficheros se pueden cargar más rápido y los usuarios pueden tenerlas ya almacenadas en caché.'; +$lang['jquerycdn_o_0'] = 'No CDN, sólo entrega local'; +$lang['jquerycdn_o_jquery'] = 'CDN en code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN en cdnjs.com'; +$lang['proxy____host'] = 'Nombre del servidor Proxy'; +$lang['proxy____port'] = 'Puerto del servidor Proxy'; +$lang['proxy____user'] = 'Nombre de usuario para el servidor Proxy'; +$lang['proxy____pass'] = 'Contraseña para el servidor Proxy'; +$lang['proxy____ssl'] = 'Usar ssl para conectarse al servidor Proxy'; +$lang['proxy____except'] = 'Expresiones regulares para encontrar URLs que el proxy debería omitir.'; +$lang['license_o_'] = 'No se eligió ninguna'; +$lang['typography_o_0'] = 'ninguno'; +$lang['typography_o_1'] = 'Dobles comillas solamente'; +$lang['typography_o_2'] = 'Todas las comillas (puede ser que no siempre funcione)'; +$lang['userewrite_o_0'] = 'ninguno'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'Interno de DokuWiki'; +$lang['deaccent_o_0'] = 'apagado'; +$lang['deaccent_o_1'] = 'eliminar tildes'; +$lang['deaccent_o_2'] = 'romanizar'; +$lang['gdlib_o_0'] = 'GD Lib no está disponible'; +$lang['gdlib_o_1'] = 'Versión 1.x'; +$lang['gdlib_o_2'] = 'Autodetección'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Resumen'; +$lang['rss_content_o_diff'] = 'Diferencias unificadas'; +$lang['rss_content_o_htmldiff'] = 'Tabla de diferencias en formato HTML'; +$lang['rss_content_o_html'] = 'Página que solo contiene código HTML'; +$lang['rss_linkto_o_diff'] = 'ver las diferencias'; +$lang['rss_linkto_o_page'] = 'la página revisada'; +$lang['rss_linkto_o_rev'] = 'lista de revisiones'; +$lang['rss_linkto_o_current'] = 'la página actual'; +$lang['compression_o_0'] = 'ninguna'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'no utilizar'; +$lang['xsendfile_o_1'] = 'Encabezado propietario de lighttpd (antes de la versión 1.5)'; +$lang['xsendfile_o_2'] = 'Encabezado X-Sendfile estándar'; +$lang['xsendfile_o_3'] = 'Encabezado propietario Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Nombre de entrada'; +$lang['showuseras_o_username'] = 'Nombre completo del usuario'; +$lang['showuseras_o_username_link'] = 'Nombre completo del usuario como enlace de usuario interwiki'; +$lang['showuseras_o_email'] = 'Dirección de correo electrónico del usuario (ofuscada según la configuración de "mailguard")'; +$lang['showuseras_o_email_link'] = 'Dirección de correo de usuario como enlace de envío de correo'; +$lang['useheading_o_0'] = 'Nunca'; +$lang['useheading_o_navigation'] = 'Solamente Navegación'; +$lang['useheading_o_content'] = 'Contenido wiki solamente'; +$lang['useheading_o_1'] = 'Siempre'; +$lang['readdircache'] = 'Tiempo máximo para la cache readdir (en segundos)'; diff --git a/lib/plugins/config/lang/et/lang.php b/lib/plugins/config/lang/et/lang.php new file mode 100644 index 0000000..51e1287 --- /dev/null +++ b/lib/plugins/config/lang/et/lang.php @@ -0,0 +1,36 @@ + + * @author kristian.kankainen + * @author Rivo Zängov + */ +$lang['menu'] = 'Seadete haldamine'; +$lang['_configuration_manager'] = 'Seadete haldamine'; +$lang['_basic'] = 'Peamised seaded'; +$lang['_display'] = 'Näitamise seaded'; +$lang['_authentication'] = 'Autentimise seaded'; +$lang['_anti_spam'] = 'Spämmitõrje seaded'; +$lang['_editing'] = 'Muudatuste seaded'; +$lang['_links'] = 'Lingi seaded'; +$lang['_media'] = 'Meedia seaded'; +$lang['_advanced'] = 'Laiendatud seaded'; +$lang['_network'] = 'Võrgu seaded'; +$lang['title'] = 'Wiki pealkiri'; +$lang['template'] = 'Kujundus'; +$lang['recent'] = 'Viimased muudatused'; +$lang['signature'] = 'Allkiri'; +$lang['passcrypt'] = 'Parooli krüptimismeetod'; +$lang['defaultgroup'] = 'Vaikimisi grupp, kõik uued kasutajad lisatakse sellesse gruppi'; +$lang['superuser'] = 'Superkasutaja - grupp, kasutaja või komaga eraldatud loetelu kasutaja1,@grupp1,kasutaja2 täielike pääsuõigustega lehekülgedele ja funktsioonidele, sõltumata ACL seadistustest'; +$lang['disableactions_check'] = 'Kontrolli'; +$lang['compression_o_0'] = 'pole'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'ära kasuta'; +$lang['useheading_o_0'] = 'Mitte kunagi'; +$lang['useheading_o_1'] = 'Alati'; diff --git a/lib/plugins/config/lang/eu/intro.txt b/lib/plugins/config/lang/eu/intro.txt new file mode 100644 index 0000000..17edb3e --- /dev/null +++ b/lib/plugins/config/lang/eu/intro.txt @@ -0,0 +1,7 @@ +====== Konfigurazio Kudeatzailea ====== + +Erabili orri hau zure DokiWiki instalazioaren aukerak kontrolatzeko. Aukera zehatzei buruz laguntza eskuratzeko ikusi [[doku>config]]. Plugin honi buruzko xehetasun gehiago eskuratzeko ikusi [[doku>plugin:config]]. + +Atzealde gorri argi batez erakusten diren aukerak babestuak daude eta ezin dira plugin honekin aldatu. Atzealde urdin batez erakusten diren aukerak balio lehenetsiak dira eta atzealde zuriz erakutsiak modu lokalean ezarriak izan dira instalazio honentzat. Aukera urdin eta zuriak aldatuak izan daitezke. + +Gogoratu **GORDE** botoia sakatzeaz orri hau utzi baino lehen, bestela zure aldaketak galdu egingo baitira. diff --git a/lib/plugins/config/lang/eu/lang.php b/lib/plugins/config/lang/eu/lang.php new file mode 100644 index 0000000..71de6d0 --- /dev/null +++ b/lib/plugins/config/lang/eu/lang.php @@ -0,0 +1,177 @@ + + * @author Zigor Astarbe + * @author Osoitz + */ +$lang['menu'] = 'Konfigurazio Ezarpenak'; +$lang['error'] = 'Ezarpenak ez dira eguneratu balio oker bat dela eta, mesedez errepasatu aldaketak eta berriz bidali.
    Balio okerra(k) ertz gorriz inguratuak erakutsiko dira. '; +$lang['updated'] = 'Ezarpenak arrakastaz eguneratuak.'; +$lang['nochoice'] = '(ez dago beste aukerarik)'; +$lang['locked'] = 'Ezarpenen fitxategia ezin da eguneratu, eta intentzioa hau ez bada,
    +ziurtatu ezarpen lokalen izena eta baimenak zuzenak direla.'; +$lang['danger'] = 'Kontuz: Aukera hau aldatzeak zure wikia eta konfigurazio menua eskuraezin utzi dezake.'; +$lang['warning'] = 'Oharra: Aukera hau aldatzeak ustekabeko portaera bat sortu dezake.'; +$lang['security'] = 'Segurtasun Oharra: Aukera hau aldatzeak segurtasun arrisku bat sortu dezake.'; +$lang['_configuration_manager'] = 'Konfigurazio Kudeatzailea'; +$lang['_header_dokuwiki'] = 'DokuWiki Ezarpenak'; +$lang['_header_plugin'] = 'Plugin Ezarpenak'; +$lang['_header_template'] = 'Txantiloi Ezarpenak'; +$lang['_header_undefined'] = 'Zehaztu gabeko Ezarpenak'; +$lang['_basic'] = 'Oinarrizko Ezarpenak'; +$lang['_display'] = 'Aurkezpen Ezarpenak'; +$lang['_authentication'] = 'Kautotze Ezarpenak'; +$lang['_anti_spam'] = 'Anti-Spam Ezarpenak'; +$lang['_editing'] = 'Edizio Ezarpenak'; +$lang['_links'] = 'Esteken Ezarpenak'; +$lang['_media'] = 'Multimedia Ezarpenak'; +$lang['_notifications'] = 'Abisuen ezarpenak'; +$lang['_syndication'] = 'Sindikazio ezarpenak'; +$lang['_advanced'] = 'Ezarpen Aurreratuak'; +$lang['_network'] = 'Sare Ezarpenak'; +$lang['_msg_setting_undefined'] = 'Ezarpen metadaturik ez.'; +$lang['_msg_setting_no_class'] = 'Ezarpen klaserik ez.'; +$lang['_msg_setting_no_default'] = 'Balio lehenetsirik ez.'; +$lang['title'] = 'Wiki-aren izenburua'; +$lang['start'] = 'Hasiera orriaren izena'; +$lang['lang'] = 'Hizkuntza'; +$lang['template'] = 'Txantiloia'; +$lang['license'] = 'Zein lizentziapean argitaratu beharko lirateke edukiak?'; +$lang['savedir'] = 'Datuak gordetzeko direktorioa'; +$lang['basedir'] = 'Oinarri direktorioa'; +$lang['baseurl'] = 'Oinarri URLa'; +$lang['dmode'] = 'Direktorio sortze modua'; +$lang['fmode'] = 'Fitxategi sortze modua'; +$lang['allowdebug'] = 'Baimendu debug-a ezgaitu behar ez bada!'; +$lang['recent'] = 'Azken aldaketak'; +$lang['recent_days'] = 'Zenbat azken aldaketa gordeko dira (egunak)'; +$lang['breadcrumbs'] = 'Arrasto pauso kopurua'; +$lang['youarehere'] = 'Arrasto pauso hierarkikoak'; +$lang['fullpath'] = 'Orri oinean orrien bide osoa erakutsi'; +$lang['typography'] = 'Ordezkapen tipografikoak egin'; +$lang['dformat'] = 'Data formatua (ikusi PHPren strftime funtzioa)'; +$lang['signature'] = 'Sinadura'; +$lang['showuseras'] = 'Zer azaldu orri bat editatu duen azken erabiltzailea erakusterakoan'; +$lang['toptoclevel'] = 'Eduki taularen goiko maila'; +$lang['tocminheads'] = 'Gutxiengo izenburu kopuru minimoa Edukien Taula-ren sortu dadin.'; +$lang['maxtoclevel'] = 'Eduki taularen maila maximoa'; +$lang['maxseclevel'] = 'Sekzio edizio mailaren maximoa'; +$lang['camelcase'] = 'Estekentzat CamelCase erabili'; +$lang['deaccent'] = 'Orri izen garbiak'; +$lang['useheading'] = 'Erabili lehen izenburua orri izen moduan'; +$lang['sneaky_index'] = 'Lehenespenez, DokuWiki-k izen-espazio guztiak indize bistan erakutsiko ditu. Aukera hau gaituta, erabiltzaieak irakurtzeko baimenik ez dituen izen-espazioak ezkutatuko dira. Honek atzigarriak diren azpi izen-espazioak ezkutatzen ditu. Agian honek indizea erabili ezin ahal izatea eragingo du AKL ezarpen batzuetan.'; +$lang['hidepages'] = 'Ezkutatu kointzidentziak dituzten orriak (espresio erregularrak)'; +$lang['useacl'] = 'Erabili atzipen kontrol listak'; +$lang['autopasswd'] = 'Pasahitzak automatikoki sortu'; +$lang['authtype'] = 'Kautotze backend-a'; +$lang['passcrypt'] = 'Pasahitz enkriptatze metodoa'; +$lang['defaultgroup'] = 'Talde lehenetsia'; +$lang['superuser'] = 'Supererabiltzailea - taldea, erabiltzailea edo komaz bereiztutako zerrenda user1,@group1,user2 orri eta funtzio guztietara atzipen osoarekin, AKL-ren ezarpenetan zehaztutakoa kontutan hartu gabe'; +$lang['manager'] = 'Kudeatzailea - talde, erabiltzaile edo komaz bereiztutako zerrenda user1,@group1,user2 kudeatze funtzio zehatz batzuetara atzipenarekin'; +$lang['profileconfirm'] = 'Profil aldaketak pasahitzaz berretsi'; +$lang['rememberme'] = 'Baimendu saio hasiera cookie iraunkorrak (gogoratu iezaidazu)'; +$lang['disableactions'] = 'DokuWiki ekintzak ezgaitu'; +$lang['disableactions_check'] = 'Egiaztatu'; +$lang['disableactions_subscription'] = 'Harpidetu/Harpidetza utzi'; +$lang['disableactions_wikicode'] = 'Ikusi iturburua/Esportatu Raw'; +$lang['disableactions_other'] = 'Beste ekintzak (komaz bereiztuak)'; +$lang['auth_security_timeout'] = 'Kautotze Segurtasun Denbora-Muga (segunduak)'; +$lang['securecookie'] = 'HTTPS bidez ezarritako cookie-ak HTTPS bidez bakarrik bidali beharko lituzke nabigatzaileak? Ezgaitu aukera hau bakarrik saio hasierak SSL bidezko segurtasuna badu baina wiki-areb nabigazioa modu ez seguruan egiten bada. '; +$lang['usewordblock'] = 'Blokeatu spam-a hitz zerrenda batean oinarrituta'; +$lang['relnofollow'] = 'Erabili rel="nofollow" kanpo esteketan'; +$lang['indexdelay'] = 'Denbora atzerapena indexatu baino lehen (seg)'; +$lang['mailguard'] = 'Ezkutatu posta-e helbidea'; +$lang['iexssprotect'] = 'Egiaztatu igotako fitxategiak JavaScript edo HTML kode maltzurra detektatzeko'; +$lang['usedraft'] = 'Automatikoki zirriborroa gorde editatze garaian'; +$lang['locktime'] = 'Adin maximoa lock fitxategientzat (seg)'; +$lang['cachetime'] = 'Adin maximoa cachearentzat (seg)'; +$lang['target____wiki'] = 'Barne estekentzat helburu leihoa'; +$lang['target____interwiki'] = 'Interwiki estekentzat helburu leihoa'; +$lang['target____extern'] = 'Kanpo estekentzat helburu leihoa'; +$lang['target____media'] = 'Multimedia estekentzat helburu leihoa'; +$lang['target____windows'] = 'Leihoen estekentzat helburu leihoa'; +$lang['mediarevisions'] = 'Media rebisioak gaitu?'; +$lang['refcheck'] = 'Multimedia erreferentzia kontrolatu'; +$lang['gdlib'] = 'GD Lib bertsioa'; +$lang['im_convert'] = 'ImageMagick-en aldaketa tresnara bidea'; +$lang['jpg_quality'] = 'JPG konprimitze kalitatea (0-100)'; +$lang['fetchsize'] = 'Kanpo esteketatik fetch.php-k deskargatu dezakeen tamaina maximoa (byteak)'; +$lang['subscribers'] = 'Gaitu orri harpidetza euskarria'; +$lang['subscribe_time'] = 'Harpidetza zerrendak eta laburpenak bidali aurretik pasa beharreko denbora (seg); Denbora honek, recent_days-en ezarritakoa baino txikiagoa behar luke.'; +$lang['notify'] = 'Aldaketen jakinarazpenak posta-e helbide honetara bidali'; +$lang['registernotify'] = 'Erregistratu berri diren erabiltzaileei buruzko informazioa post-e helbide honetara bidali'; +$lang['mailfrom'] = 'Posta automatikoentzat erabiliko den posta-e helbidea'; +$lang['mailprefix'] = 'Posta automatikoen gaientzat erabili beharreko aurrizkia'; +$lang['sitemap'] = 'Sortu Google gune-mapa (egunak)'; +$lang['rss_type'] = 'XML jario mota'; +$lang['rss_linkto'] = 'XML jarioak hona estekatzen du'; +$lang['rss_content'] = 'Zer erakutsi XML jarioetan?'; +$lang['rss_update'] = 'XML jarioaren eguneratze tartea (seg)'; +$lang['rss_show_summary'] = 'XML jarioak laburpena erakusten du izenburuan'; +$lang['updatecheck'] = 'Konprobatu eguneratze eta segurtasun oharrak? DokuWiki-k honetarako update.dokuwiki.org kontaktatu behar du.'; +$lang['userewrite'] = 'Erabili URL politak'; +$lang['useslash'] = 'Erabili barra (/) izen-espazio banatzaile moduan URLetan'; +$lang['sepchar'] = 'Orri izenaren hitz banatzailea'; +$lang['canonical'] = 'Erabili URL erabat kanonikoak'; +$lang['fnencode'] = 'Non-ASCII fitxategi izenak kodetzeko metodoa.'; +$lang['autoplural'] = 'Kontrolatu forma pluralak esteketan'; +$lang['compression'] = 'Trinkotze metodoa attic fitxategientzat'; +$lang['gzip_output'] = 'Gzip Eduki-Kodeketa erabili xhtml-rentzat'; +$lang['compress'] = 'Trinkotu CSS eta javascript irteera'; +$lang['send404'] = 'Bidali "HTTP 404/Ez Da Orria Aurkitu" existitzen ez diren orrientzat'; +$lang['broken_iua'] = 'Zure sisteman ignore_user_abort (erabiltzailearen bertan behera uztea kontuan ez hartu) funtzioa hautsia al dago? Honek funtzionatzen ez duen bilaketa indize bat eragin dezake. ISS+PHP/CGI hautsiak daude. Ikusi Bug 852 informazio gehiago jasotzeko.'; +$lang['xsendfile'] = 'X-Sendfile goiburua erabili web zerbitzariari fitxategi estatikoak bidaltzen uzteko? Zure web zerbitzariak hau ahalbidetuta eduki beharko du.'; +$lang['renderer_xhtml'] = 'Erabiliko den errenderizatzailea wiki irteera (xhtml) nagusiarentzat'; +$lang['renderer__core'] = '%s (dokuwiki-ren nukleoa)'; +$lang['renderer__plugin'] = '%s (plugina)'; +$lang['proxy____host'] = 'Proxy zerbitzari izena'; +$lang['proxy____port'] = 'Proxy portua'; +$lang['proxy____user'] = 'Proxyaren erabiltzaile izena'; +$lang['proxy____pass'] = 'Proxyaren pasahitza '; +$lang['proxy____ssl'] = 'Erabili SSL Proxyra konektatzeko'; +$lang['proxy____except'] = 'URLak detektatzeko espresio erregularra, zeinentzat Proxy-a sahiestu beharko litzatekeen.'; +$lang['license_o_'] = 'Bat ere ez hautaturik'; +$lang['typography_o_0'] = 'ezer'; +$lang['typography_o_1'] = 'Komatxo bikoitzak bakarrik'; +$lang['typography_o_2'] = 'Komatxo guztiak (gerta daiteke beti ez funtzionatzea)'; +$lang['userewrite_o_0'] = 'ezer'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWikiren barnekoa'; +$lang['deaccent_o_0'] = 'Izalita'; +$lang['deaccent_o_1'] = 'azentu-markak kendu'; +$lang['deaccent_o_2'] = 'erromanizatu '; +$lang['gdlib_o_0'] = 'GD Lib ez dago eskuragarri'; +$lang['gdlib_o_1'] = '1.x bertsioa'; +$lang['gdlib_o_2'] = 'Automatikoki detektatu'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Laburpena'; +$lang['rss_content_o_diff'] = 'Bateratutako Diferentziak'; +$lang['rss_content_o_htmldiff'] = 'HTML formatuko diferentzia taula'; +$lang['rss_content_o_html'] = 'Orri edukia guztiz HTML'; +$lang['rss_linkto_o_diff'] = 'Desberdintasunak ikusi'; +$lang['rss_linkto_o_page'] = 'Berrikusitako orria'; +$lang['rss_linkto_o_rev'] = 'Berrikuspen zerrenda'; +$lang['rss_linkto_o_current'] = 'Uneko orria'; +$lang['compression_o_0'] = 'ezer'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'ez erabili'; +$lang['xsendfile_o_1'] = 'Jabegodun lighttpd goiburua (1.5 bertsioa baino lehen)'; +$lang['xsendfile_o_2'] = 'X-Sendfile goiburu estandarra'; +$lang['xsendfile_o_3'] = 'Jabegodun Nginx X-Accel-Redirect goiburua'; +$lang['showuseras_o_loginname'] = 'Saio izena'; +$lang['showuseras_o_username'] = 'Erabiltzailearen izen osoa'; +$lang['showuseras_o_email'] = 'Erabiltzailearen posta-e helbidea (ezkutatua posta babeslearen aukeren arabera)'; +$lang['showuseras_o_email_link'] = 'Erabiltzailearen posta-e helbidea mailto: esteka moduan'; +$lang['useheading_o_0'] = 'Inoiz'; +$lang['useheading_o_navigation'] = 'Nabigazioa Bakarrik'; +$lang['useheading_o_content'] = 'Wiki Edukia Bakarrik'; +$lang['useheading_o_1'] = 'Beti'; +$lang['readdircache'] = 'Aintzintasun maximoa readdir cache-rentzat (seg)'; diff --git a/lib/plugins/config/lang/fa/intro.txt b/lib/plugins/config/lang/fa/intro.txt new file mode 100644 index 0000000..31bbaea --- /dev/null +++ b/lib/plugins/config/lang/fa/intro.txt @@ -0,0 +1,8 @@ +====== تنظیمات پیکربندی ====== + +از این صفحه برای مدیریت تنظیمات DokuWiki استفاده کنید. برای راهنمایی بیش‌تر به [[doku>config]] مراجعه نماید. +برای جزییات در مورد این افزونه نیز می‌توانید به [[doku>plugin:config]] مراجعه کنید. + +تنظیماتی که با پیش‌زمینه‌ی قرمز مشخص شده‌اند، غیرقابل تغییر می‌باشند. تنظیماتی که به پیش‌زمینه‌ی آبی مشخص شده‌اند نیز حامل مقادیر پیش‌فرض می‌باشند و تنظیماتی که پیش‌زمینه‌ی سفید دارند به طور محلی برای این سیستم تنظیم شده‌اند. تمامی مقادیر آبی و سفید قابلیت تغییر دارند. + +به یاد داشته باشید که قبل از ترک صفحه، دکمه‌ی **ذخیره** را بفشارید، در غیر این صورت تنظیمات شما از بین خواهد رفت. diff --git a/lib/plugins/config/lang/fa/lang.php b/lib/plugins/config/lang/fa/lang.php new file mode 100644 index 0000000..a1f801c --- /dev/null +++ b/lib/plugins/config/lang/fa/lang.php @@ -0,0 +1,211 @@ + + * @author علیرضا ایوز + * @author Masoud Sadrnezhaad + * @author behrad eslamifar + * @author omidmr + * @author Mohammad Reza Shoaei + * @author Milad DZand + * @author AmirH Hassaneini + * @author Mohmmad Razavi + * @author sam01 + */ +$lang['menu'] = 'تنظیمات پیکر‌بندی'; +$lang['error'] = 'به دلیل ایراد در مقادیر وارد شده، تنظیمات اعمال نشد، خواهشمندیم تغییرات را مجددن کنترل نمایید و دوباره ارسال کنید.
    مقادیر مشکل‌دار با کادر قرمز مشخص شده‌اند.'; +$lang['updated'] = 'تنظیمات با موفقیت به روز رسانی شد.'; +$lang['nochoice'] = '(گزینه‌های دیگری موجود نیست)'; +$lang['locked'] = 'تنظیمات قابلیت به روز رسانی ندارند، اگر نباید چنین باشد،
    نام فایل تنظیمات و دسترسی‌های آن را بررسی کنید.'; +$lang['danger'] = 'خطر: ممکن است با تغییر این گزینه دسترسی به منوی تنظیمات قطع شود.'; +$lang['warning'] = 'هشدار: ممکن است با تغییر این گزینه رفتارهای غیرمترقبه‌ای مشاهده کنید.'; +$lang['security'] = 'هشدار امنیتی: تغییر این گزینه ممکن است با خطرات امنیتی همراه باشد.'; +$lang['_configuration_manager'] = 'مدیریت تنظیمات'; +$lang['_header_dokuwiki'] = 'تنظیمات DokuWiki'; +$lang['_header_plugin'] = 'تنظیمات افزونه'; +$lang['_header_template'] = 'تنظیمات قالب'; +$lang['_header_undefined'] = 'تنظیمات تعریف نشده'; +$lang['_basic'] = 'تنظیمات مقدماتی'; +$lang['_display'] = 'تنظیمات نمایش'; +$lang['_authentication'] = 'تنظیمات معتبرسازی'; +$lang['_anti_spam'] = 'تنظیمات ضد-اسپم'; +$lang['_editing'] = 'تنظیمات ویرایش'; +$lang['_links'] = 'تنظیمات پیوند'; +$lang['_media'] = 'تنظیمات رسانه‌ها (فایل‌ها)'; +$lang['_notifications'] = 'تنظیمات آگاه سازی'; +$lang['_syndication'] = 'تنظیمات پیوند'; +$lang['_advanced'] = 'تنظیمات پیشرفته'; +$lang['_network'] = 'تنظیمات شبکه'; +$lang['_msg_setting_undefined'] = 'داده‌نمایی برای تنظیمات وجود ندارد'; +$lang['_msg_setting_no_class'] = 'هیچ دسته‌ای برای تنظیمات وجود ندارد.'; +$lang['_msg_setting_no_default'] = 'بدون مقدار پیش‌فرض'; +$lang['title'] = 'عنوان ویکی'; +$lang['start'] = 'نام صفحه‌ی آغازین'; +$lang['lang'] = 'زبان'; +$lang['template'] = 'قالب'; +$lang['tagline'] = 'خط تگ (اگر قالب از آن پشتیبانی می کند)'; +$lang['sidebar'] = 'نام نوار صفحه کناری (اگر قالب از آن پشتیبانی می کند) ، فیلد خالی نوار کناری غیر فعال خواهد کرد.'; +$lang['license'] = 'لایسنس مطالب ویکی'; +$lang['savedir'] = 'شاخه‌ی ذخیره‌سازی داده‌ها'; +$lang['basedir'] = 'شاخه‌ی اصلی'; +$lang['baseurl'] = 'آدرس اصلی'; +$lang['cookiedir'] = 'مسیر کوکی ها. برای استفاده از آدرس پایه ، آن را خالی بگذارید.'; +$lang['dmode'] = 'زبان'; +$lang['fmode'] = 'دسترسی پیش‌فرض فایل‌ها در زمان ایجاد'; +$lang['allowdebug'] = 'امکان کرم‌زدایی (debug) اگر نیازی ندارید، غیرفعال کنید'; +$lang['recent'] = 'تغییرات اخیر'; +$lang['recent_days'] = 'چند تغییر در خوراک نمایش داده شود به روز'; +$lang['breadcrumbs'] = 'تعداد ردپاها'; +$lang['youarehere'] = 'ردپای درختی'; +$lang['fullpath'] = 'نمایش دادن مسیر کامل صفحات در پایین صفحه'; +$lang['typography'] = 'جای‌گزاری متن‌ها انجام شود'; +$lang['dformat'] = 'فرمت تاریخ (راهنمای تابع strftime را مشاهده کنید)'; +$lang['signature'] = 'امضا'; +$lang['showuseras'] = 'چگونه آخرین کاربر ویرایش کننده، یک صفحه نمایش داده شود'; +$lang['toptoclevel'] = 'بیشترین عمق برای «فهرست مطالب»'; +$lang['tocminheads'] = 'حداقل مقدار عنوان‌های یک صفحه، برای تشخیص این‌که «فهرست مطالب» (TOC) ایجاد شود'; +$lang['maxtoclevel'] = 'حداکثر عمق «فهرست مطالب»'; +$lang['maxseclevel'] = 'بیش‌ترین سطح ویرایش بخش‌ها'; +$lang['camelcase'] = 'از «حالت شتری» (CamelCase) برای پیوندها استفاده شود'; +$lang['deaccent'] = 'تمیز کردن نام صفحات'; +$lang['useheading'] = 'استفاده از اولین عنوان برای نام صفحه'; +$lang['sneaky_index'] = 'به طور پیش‌فرض، دوکوویکی در فهرست تمامی فضای‌نام‌ها را نمایش می‌دهد. فعال کردن این گزینه، مواردی را که کاربر حق خواندنشان را ندارد مخفی می‌کند. این گزینه ممکن است باعث دیده نشدن زیرفضای‌نام‌هایی شود که دسترسی خواندن به آن‌ها وجود دارد. و ممکن است باعث شود که فهرست در حالاتی از دسترسی‌ها، غیرقابل استفاده شود.'; +$lang['hidepages'] = 'مخفی کردن صفحات با فرمت زیر (از عبارات منظم استفاده شود)'; +$lang['useacl'] = 'استفاده از مدیریت دسترسی‌ها'; +$lang['autopasswd'] = 'ایجاد خودکار گذرواژه‌ها'; +$lang['authtype'] = 'روش معتبرسازی'; +$lang['passcrypt'] = 'روش کد کردن گذرواژه'; +$lang['defaultgroup'] = 'گروه پیش‌فرض'; +$lang['superuser'] = 'کاربر اصلی - گروه، کاربر یا لیستی که توسط ویرگول جدا شده از کاربرها و گروه‌ها (مثل user1,@group1,user2) با دسترسی کامل به همه‌ی صفحات و امکانات سیستم، فارغ از دسترسی‌های آن کاربر.'; +$lang['manager'] = 'مدیر - گروه، کاربر یا لیستی که توسط ویرگول جدا شده از کاربرها و گروه‌ها (مثل user1,@group1,user2) با دسترسی‌های خاص به بخش‌های متفاوت'; +$lang['profileconfirm'] = 'تغییرات پروفایل با وارد کردن گذرواژه تایید شود'; +$lang['rememberme'] = 'امکان ورود دایم، توسط کوکی، وجود داشته باشد (مرا به خاطر بسپار)'; +$lang['disableactions'] = 'غیرفعال کردن فعالیت‌های دوکوویکی'; +$lang['disableactions_check'] = 'بررسی'; +$lang['disableactions_subscription'] = 'عضویت/عدم عضویت'; +$lang['disableactions_wikicode'] = 'نمایش سورس/برون‌بری خام'; +$lang['disableactions_profile_delete'] = 'حذف حساب کاربری خود.'; +$lang['disableactions_other'] = 'فعالیت‌های دیگر (با ویرگول انگلیسی «,» از هم جدا کنید)'; +$lang['disableactions_rss'] = 'خبرخوان (RSS)'; +$lang['auth_security_timeout'] = 'زمان انقضای معتبرسازی به ثانیه'; +$lang['securecookie'] = 'آیا کوکی‌ها باید با قرارداد HTTPS ارسال شوند؟ این گزینه را زمانی که فقط صفحه‌ی ورود ویکی‌تان با SSL امن شده است، اما ویکی را ناامن مرور می‌کنید، غیرفعال نمایید.'; +$lang['remote'] = 'سیستم API راه دور را فعال کنید . این به سایر کاربردها اجازه می دهد که به ویکی از طریق XML-RPC یا سایر مکانیزم ها دسترسی داشته باشند.'; +$lang['remoteuser'] = 'محدود کردن دسترسی API راه دور به گروه های جدا شده با ویرگول یا کاربران داده شده در این جا. برای دادن دسترسی به همه این فیلد را خالی بگذارید.'; +$lang['usewordblock'] = 'اسپم‌ها را براساس لیست کلمات مسدود کن'; +$lang['relnofollow'] = 'از «rel=nofollow» در پیوندهای خروجی استفاده شود'; +$lang['indexdelay'] = 'مقدار تاخیر پیش از فهرست‌بندی (ثانیه)'; +$lang['mailguard'] = 'مبهم کردن آدرس‌های ایمیل'; +$lang['iexssprotect'] = 'بررسی کردن فایل‌های ارسال شده را برای کدهای HTML یا JavaScript مخرب'; +$lang['usedraft'] = 'ایجاد خودکار چرک‌نویس در زمان نگارش'; +$lang['locktime'] = 'بیشینه‌ی زمان قفل شدن فایل‌ها به ثانیه'; +$lang['cachetime'] = 'بیشینه‌ی زمان حافظه‌ی موقت (cache) به ثانیه'; +$lang['target____wiki'] = 'پنجره‌ی هدف در پیوند‌های داخلی'; +$lang['target____interwiki'] = 'پنجره‌ی هدف در پیوند‌های داخل ویکی'; +$lang['target____extern'] = 'پنجره‌ی هدف در پیوند‌های خارجی'; +$lang['target____media'] = 'پنجره‌ی هدف در پیوند‌های رسانه‌ها'; +$lang['target____windows'] = 'پنجره‌ی هدف در پیوند‌های پنجره‌ای'; +$lang['mediarevisions'] = 'تجدید نظر رسانه ، فعال؟'; +$lang['refcheck'] = 'بررسی کردن مرجع رسانه‌ها'; +$lang['gdlib'] = 'نگارش کتاب‌خانه‌ی GD'; +$lang['im_convert'] = 'مسیر ابزار convert از برنامه‌ی ImageMagick'; +$lang['jpg_quality'] = 'کیفیت فشرده سازی JPEG (از 0 تا 100)'; +$lang['fetchsize'] = 'بیشینه‌ی حجمی که فایل fetch.php می‌تواند دریافت کند (به بایت)'; +$lang['subscribers'] = 'توانایی عضویت در صفحات باشد'; +$lang['subscribe_time'] = 'زمان مورد نیاز برای ارسال خبر نامه ها (ثانیه); این مقدار می بایست کمتر زمانی باشد که در recent_days تعریف شده است.'; +$lang['notify'] = 'تغییرات به این ایمیل ارسال شود'; +$lang['registernotify'] = 'اطلاعات کاربران تازه وارد به این ایمیل ارسال شود'; +$lang['mailfrom'] = 'آدرس ایمیلی که برای ایمیل‌های خودکار استفاده می‌شود'; +$lang['mailreturnpath'] = 'نشانی ایمیل گیرنده برای اعلان‌های دریافت نشده'; +$lang['mailprefix'] = 'پیشوند تیتر ایمیل (جهت ایمیل های خودکار)'; +$lang['htmlmail'] = 'فرستادن با ظاهر بهتر ، امّا با اندازه بیشتر در ایمیل های چند قسمتی HTML. +برای استفاده از ایمیل متنی ، غیر فعال کنید.'; +$lang['sitemap'] = 'تولید کردن نقشه‌ی سایت توسط گوگل (روز)'; +$lang['rss_type'] = 'نوع خوراک'; +$lang['rss_linkto'] = 'خوراک به کجا لینک شود'; +$lang['rss_content'] = 'چه چیزی در تکه‌های خوراک نمایش داده شود؟'; +$lang['rss_update'] = 'زمان به روز رسانی خوراک به ثانیه'; +$lang['rss_show_summary'] = 'خوراک مختصری از مطلب را در عنوان نمایش دهد'; +$lang['rss_media'] = 'چه نوع تغییراتی باید در خوراک XML لیست شود؟'; +$lang['rss_media_o_both'] = 'هر دو'; +$lang['rss_media_o_pages'] = 'صفحات'; +$lang['rss_media_o_media'] = 'مدیا'; +$lang['updatecheck'] = 'هشدارهای به روز رسانی و امنیتی بررسی شود؟ برای این‌کار دوکوویکی با سرور update.dokuwiki.org تماس خواهد گرفت.'; +$lang['userewrite'] = 'از زیباکننده‌ی آدرس‌ها استفاده شود'; +$lang['useslash'] = 'از اسلش «/» برای جداکننده‌ی آدرس فضای‌نام‌ها استفاده شود'; +$lang['sepchar'] = 'کلمه‌ی جداکننده‌ی نام صفحات'; +$lang['canonical'] = 'استفاده از آدرس‌های استاندارد'; +$lang['fnencode'] = 'روش تغییر نام فایل‌هایی با فرمتی غیر از اسکی'; +$lang['autoplural'] = 'بررسی جمع بودن در پیوندها'; +$lang['compression'] = 'روش فشرده‌سازی برای فایل‌های خُرد'; +$lang['gzip_output'] = 'استفاده از gzip برای xhtmlها'; +$lang['compress'] = 'فشرده‌سازی کد‌های CSS و JavaScript'; +$lang['cssdatauri'] = 'اندازه بایت هایی که تصاویر ارجاع شده به فایل های CSS باید به درستی درون stylesheet جایگذاری شود تا سربار سرایند درخواست HTTP را کاهش دهد. مقادیر 400 تا 600 بایت مقدار خوبی است. برای غیر فعال کردن 0 قرار دهید.'; +$lang['send404'] = 'ارسال «HTTP 404/Page Not Found» برای صفحاتی که وجود ندارند'; +$lang['broken_iua'] = 'آیا تابع ignore_user_about در ویکی شما کار نمی‌کند؟ ممکن است فهرست جستجوی شما کار نکند. IIS به همراه PHP/CGI باعث خراب شدن این گزینه می‌شود. برای اطلاعات بیشتر باگ ۸۵۲ را مشاهده کنید.'; +$lang['xsendfile'] = 'استفاده از هدر X-Sendfile، تا به وب‌سرور توانایی ارسال فایل‌های ثابت را بدهد. وب‌سرور شما باید این مورد را پشتیبانی کند.'; +$lang['renderer_xhtml'] = 'مفسری که برای خروجی اصلی ویکی استفاده شود'; +$lang['renderer__core'] = '%s (هسته‌ی dokuwiki)'; +$lang['renderer__plugin'] = '%s (افزونه)'; +$lang['search_nslimit'] = 'جستجو را به فضای‌نام X محدود کن. اگر جستجو از صفحه‌ای که از فضای نام عمیق‌تری هست انجام شود اولین فضای نام X به عنوان فیلتر اضافه می‌شود.'; +$lang['search_fragment'] = 'رفتار جستجوی بخشی پیشفرض را مشخص کنید.'; +$lang['search_fragment_o_exact'] = 'دقیقا'; +$lang['search_fragment_o_starts_with'] = 'شروع شده با'; +$lang['search_fragment_o_ends_with'] = 'پایان یافته با'; +$lang['search_fragment_o_contains'] = 'شامل'; +$lang['dnslookups'] = 'دوکوویکی نام هاست ها را برای آدرسهای آی‌پی‌های صفحات ویرایشی کاربران ، جستجو می کند. اگر یک سرور DNS کند یا نا کارامد دارید یا این ویژگی را نمی خواهید ، این گزینه را غیر فعال کنید.'; +$lang['jquerycdn'] = 'آیا فایل‌های اسکریپت jQuery و jQuery UI باید از روی یک CDN باز شوند؟ این قابلیت تعداد درخواست‌های HTTP بیشتری اضافه می‌کند، اما فایل‌ها ممکن است سریع‌تر باز شوند و کاربران ممکن است آن‌ها را کش کرده باشند.'; +$lang['jquerycdn_o_0'] = 'بدون CDN فقط برای دریافت داخلی'; +$lang['jquerycdn_o_jquery'] = 'CDN در code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN در cdnjs.com'; +$lang['proxy____host'] = 'آدرس سرور پروکسی'; +$lang['proxy____port'] = 'پورت پروکسی'; +$lang['proxy____user'] = 'نام کاربری پروکسی'; +$lang['proxy____pass'] = 'گذرواژهي پروکسی'; +$lang['proxy____ssl'] = 'استفاده از SSL برای اتصال به پروکسی'; +$lang['proxy____except'] = 'عبارت منظم برای تطبیق با URLها برای این‌که دریابیم که از روی چه پروکسی‌ای باید بپریم!'; +$lang['license_o_'] = 'هیچ کدام'; +$lang['typography_o_0'] = 'هیچ'; +$lang['typography_o_1'] = 'حذف کردن single-quote'; +$lang['typography_o_2'] = 'به همراه داشتن single-quote (ممکن است همیشه کار نکند)'; +$lang['userewrite_o_0'] = 'هیچ'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'از طریق DokuWiki'; +$lang['deaccent_o_0'] = 'خاموش'; +$lang['deaccent_o_1'] = 'برداشتن تلفظ‌ها'; +$lang['deaccent_o_2'] = 'لاتین کردن (romanize)'; +$lang['gdlib_o_0'] = 'کتاب‌خانه‌ی GD موجود نیست'; +$lang['gdlib_o_1'] = 'نسخه‌ی 1.X'; +$lang['gdlib_o_2'] = 'انتخاب خودکار'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'انتزاعی'; +$lang['rss_content_o_diff'] = 'یکی کردن تفاوت‌ها'; +$lang['rss_content_o_htmldiff'] = 'جدول تفاوت‌ها با ساختار HTML'; +$lang['rss_content_o_html'] = 'تمامی محتویات صفحه، با ساختار HTML'; +$lang['rss_linkto_o_diff'] = 'نمایه‌های متفاوت'; +$lang['rss_linkto_o_page'] = 'صفحه‌ی تجدید نظر شده'; +$lang['rss_linkto_o_rev'] = 'لیست نگارش‌ها'; +$lang['rss_linkto_o_current'] = 'صفحه‌ی کنونی'; +$lang['compression_o_0'] = 'هیچ'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'استفاده نکنید'; +$lang['xsendfile_o_1'] = 'هدر اختصاصی lighttpd (پیش از نگارش ۱.۵)'; +$lang['xsendfile_o_2'] = 'هدر استاندارد X-Sendfile'; +$lang['xsendfile_o_3'] = 'هدر اختصاصی X-Accel-Redirect در وب سرور Nginx'; +$lang['showuseras_o_loginname'] = 'نام کاربری'; +$lang['showuseras_o_username'] = 'نام کامل کاربران'; +$lang['showuseras_o_username_link'] = 'نام کامل کاربر به عنوان لینک داخلی ویکی'; +$lang['showuseras_o_email'] = 'آدرس ایمیل کاربران (با تنظیمات «نگهبان ایمیل» مبهم می‌شود)'; +$lang['showuseras_o_email_link'] = 'نمایش ایمیل کاربران با افزودن mailto'; +$lang['useheading_o_0'] = 'هرگز'; +$lang['useheading_o_navigation'] = 'فقط ناوبری (navigation)'; +$lang['useheading_o_content'] = 'فقط محتویات ویکی'; +$lang['useheading_o_1'] = 'همیشه'; +$lang['readdircache'] = 'بیش‌ترین عمر برای حافظه‌ی موقت readdir (ثانیه)'; diff --git a/lib/plugins/config/lang/fi/intro.txt b/lib/plugins/config/lang/fi/intro.txt new file mode 100644 index 0000000..2765a18 --- /dev/null +++ b/lib/plugins/config/lang/fi/intro.txt @@ -0,0 +1,7 @@ +====== Asetusten hallinta ====== + +Käytä tätä sivua hallitaksesi DokuWikisi asetuksia. Apua yksittäisiin asetuksiin löytyy sivulta [[doku>config]]. Lisätietoa tästä liitännäisestä löytyy sivulta [[doku>plugin:config]]. + +Asetukset, jotka näkyvät vaaleanpunaisella taustalla ovat suojattuja, eikä niitä voi muutta tämän liitännäisen avulla. Asetukset, jotka näkyvät sinisellä taustalla ovat oletusasetuksia. Asetukset valkoisella taustalla ovat asetettu paikallisesti tätä asennusta varten. Sekä sinisiä että valkoisia asetuksia voi muokata. + +Muista painaa **TALLENNA**-nappia ennen kuin poistut sivulta. Muuten muutoksesi häviävät. diff --git a/lib/plugins/config/lang/fi/lang.php b/lib/plugins/config/lang/fi/lang.php new file mode 100644 index 0000000..95d20e3 --- /dev/null +++ b/lib/plugins/config/lang/fi/lang.php @@ -0,0 +1,191 @@ + + * @author Tuomo Hartikainen + * @author otto + * @author Teemu Mattila + * @author Sami Olmari + * @author Wiki Doku + */ +$lang['menu'] = 'Asetukset'; +$lang['error'] = 'Asetuksia ei päivitetty väärän arvon vuoksi. Tarkista muutokset ja lähetä sivu uudestaan. +
    Väärät arvot on merkitty punaisella reunuksella.'; +$lang['updated'] = 'Asetukset päivitetty onnistuneesti.'; +$lang['nochoice'] = '(ei muita valintoja saatavilla)'; +$lang['locked'] = 'Asetustiedosta ei voi päivittää. Jos tämä ei ole tarkoitus
    +niin varmista, että paikallisten asetusten tiedoston nimi ja oikeudet ovat kunnossa.'; +$lang['danger'] = 'Vaara: tämän asetuksen muuttaminen saattaa estää wikisi ja asetusvalikon toimimisen.'; +$lang['warning'] = 'Varoitus: tämän asetuksen muuttaminen saattaa aiheuttaa olettamattomia toimintoja.'; +$lang['security'] = 'Turvallisuusvaroitus: tämän asetuksen muuttaminen saattaa aiheuttaa tietoturva-aukon.'; +$lang['_configuration_manager'] = 'Asetusten hallinta'; +$lang['_header_dokuwiki'] = 'DokuWikin asetukset'; +$lang['_header_plugin'] = 'Liitännäisten asetukset'; +$lang['_header_template'] = 'Sivumallin asetukset'; +$lang['_header_undefined'] = 'Määritetelettömät asetukset'; +$lang['_basic'] = 'Perusasetukset'; +$lang['_display'] = 'Näyttöasetukset'; +$lang['_authentication'] = 'Sisäänkirjoittautumisen asetukset'; +$lang['_anti_spam'] = 'Anti-Spam asetukset'; +$lang['_editing'] = 'Sivumuokkauksen asetukset'; +$lang['_links'] = 'Linkkien asetukset'; +$lang['_media'] = 'Media-asetukset'; +$lang['_notifications'] = 'Ilmoitus-asetukset'; +$lang['_syndication'] = 'Syöteasetukset'; +$lang['_advanced'] = 'Lisäasetukset'; +$lang['_network'] = 'Verkkoasetukset'; +$lang['_msg_setting_undefined'] = 'Ei asetusten metadataa.'; +$lang['_msg_setting_no_class'] = 'Ei asetusluokkaa.'; +$lang['_msg_setting_no_default'] = 'Ei oletusarvoa'; +$lang['title'] = 'Wikin nimi'; +$lang['start'] = 'Alkusivun nimi'; +$lang['lang'] = 'Kieli'; +$lang['template'] = 'Sivumalli'; +$lang['tagline'] = 'Apuotsikko - slogan sivustonimen yhteyteen (jos template tukee)'; +$lang['sidebar'] = 'Sivupalkin sivunimi (jos template tukee sitä), tyhjä arvo poistaa sivupalkin'; +$lang['license'] = 'Millä lisenssillä sisältö pitäisi julkaista?'; +$lang['savedir'] = 'Hakemisto tietojen tallennukseen.'; +$lang['basedir'] = 'Perushakemisto'; +$lang['baseurl'] = 'Perus URL'; +$lang['cookiedir'] = 'Cookien path. Jätä tyhjäksi käyttääksesi baseurl arvoa'; +$lang['dmode'] = 'Hakemiston luontioikeudet'; +$lang['fmode'] = 'Tiedoston luontioikeudet'; +$lang['allowdebug'] = 'Salli debuggaus pois, jos ei tarvita!'; +$lang['recent'] = 'Viime muutokset'; +$lang['recent_days'] = 'Montako edellistä muutosta säilytetään (päiviä)'; +$lang['breadcrumbs'] = 'Leivänmurujen määrä'; +$lang['youarehere'] = 'Hierarkkiset leivänmurut'; +$lang['fullpath'] = 'Näytä sivun koko polku sivun alareunassa'; +$lang['typography'] = 'Tee typografiset korvaukset'; +$lang['dformat'] = 'Päivämäärän muoto (katso PHPn strftime funktiota)'; +$lang['signature'] = 'Allekirjoitus'; +$lang['showuseras'] = 'Mitä näytetään, kun kerrotaan viimeisen editoijan tiedot'; +$lang['toptoclevel'] = 'Ylätason sisällysluettelo'; +$lang['tocminheads'] = 'Pienin otsikkorivien määrä, jotta sisällysluettelo tehdään'; +$lang['maxtoclevel'] = 'Sisällysluettelon suurin syvyys'; +$lang['maxseclevel'] = 'Kappale-editoinnin suurin syvyys.'; +$lang['camelcase'] = 'Käytä CamelCase linkkejä'; +$lang['deaccent'] = 'Siivoa sivun nimet'; +$lang['useheading'] = 'Käytä ensimmäistä otsikkoriviä sivun nimenä.'; +$lang['sneaky_index'] = 'Oletuksena DokuWiki näyttää kaikki nimiavaruudet index-näkymäsä. Tämä asetus piilottaa ne, joihin käyttäjällä ei ole lukuoikeuksia. Tämä voi piilottaa joitakin sallittuja alinimiavaruuksia. Tästä johtuen index-näkymä voi olla käyttökelvoton joillakin ACL-asetuksilla'; +$lang['hidepages'] = 'Piilota seuraavat sivut (säännönmukainen lauseke)'; +$lang['useacl'] = 'Käytä käyttöoikeuksien hallintaa'; +$lang['autopasswd'] = 'Luo salasana automaattisesti'; +$lang['authtype'] = 'Autentikointijärjestelmä'; +$lang['passcrypt'] = 'Salasanan suojausmenetelmä'; +$lang['defaultgroup'] = 'Oletusryhmä'; +$lang['superuser'] = 'Pääkäyttäjä. Ryhmä tai käyttäjä, jolla on täysi oikeus kaikkiin sivuihin ja toimintoihin käyttöoikeuksista huolimatta'; +$lang['manager'] = 'Ylläpitäjä. Ryhmä tai käyttäjä, jolla on pääsy joihinkin ylläpitotoimintoihin'; +$lang['profileconfirm'] = 'Vahvista profiilin päivitys salasanan avulla'; +$lang['rememberme'] = 'Salli pysyvät kirjautumis-cookiet (muista minut)'; +$lang['disableactions'] = 'Estä DokuWiki-toimintojen käyttö'; +$lang['disableactions_check'] = 'Tarkista'; +$lang['disableactions_subscription'] = 'Tilaa/Peruuta tilaus'; +$lang['disableactions_wikicode'] = 'Näytä lähdekoodi/Vie raakana'; +$lang['disableactions_other'] = 'Muut toiminnot (pilkulla erotettuna)'; +$lang['auth_security_timeout'] = 'Autentikoinnin aikakatkaisu (sekunteja)'; +$lang['securecookie'] = 'Lähetetäänkö HTTPS:n kautta asetetut evästetiedot HTTPS-yhteydellä? Kytke pois, jos vain wikisi kirjautuminen on suojattu SSL:n avulla, mutta muuten wikiä käytetään ilman suojausta.'; +$lang['remote'] = 'Kytke "remote API" käyttöön. Tämä sallii muiden sovellusten päästä wikiin XML-RPC:n avulla'; +$lang['remoteuser'] = 'Salli "remote API" pääsy vain pilkulla erotetuille ryhmille tai käyttäjille tässä. Jätä tyhjäksi, jos haluat sallia käytön kaikille.'; +$lang['usewordblock'] = 'Estä spam sanalistan avulla'; +$lang['relnofollow'] = 'Käytä rel="nofollow" ulkoisille linkeille'; +$lang['indexdelay'] = 'Aikaraja indeksoinnille (sek)'; +$lang['mailguard'] = 'Häivytä email osoite'; +$lang['iexssprotect'] = 'Tarkista lähetetyt tiedostot pahojen javascript- ja html-koodien varalta'; +$lang['usedraft'] = 'Tallenna vedos muokkaustilassa automaattisesti '; +$lang['locktime'] = 'Lukitustiedostojen maksimi-ikä (sek)'; +$lang['cachetime'] = 'Välimuisti-tiedostojen maksimi-ikä (sek)'; +$lang['target____wiki'] = 'Kohdeikkuna sisäisissä linkeissä'; +$lang['target____interwiki'] = 'Kohdeikkuna interwiki-linkeissä'; +$lang['target____extern'] = 'Kohdeikkuna ulkoisissa linkeissä'; +$lang['target____media'] = 'Kohdeikkuna media-linkeissä'; +$lang['target____windows'] = 'Kohdeikkuna Windows-linkeissä'; +$lang['mediarevisions'] = 'Otetaan käyttään Media-versiointi'; +$lang['refcheck'] = 'Mediaviitteen tarkistus'; +$lang['gdlib'] = 'GD Lib versio'; +$lang['im_convert'] = 'ImageMagick-muunnostyökalun polku'; +$lang['jpg_quality'] = 'JPG pakkauslaatu (0-100)'; +$lang['fetchsize'] = 'Suurin koko (bytejä), jonka fetch.php voi ladata ulkopuolisesta lähteestä'; +$lang['subscribers'] = 'Salli tuki sivujen tilaamiselle'; +$lang['subscribe_time'] = 'Aika jonka jälkeen tilauslinkit ja yhteenveto lähetetään (sek). Tämän pitäisi olla pienempi, kuin recent_days aika.'; +$lang['notify'] = 'Lähetä muutosilmoitukset tähän osoitteeseen'; +$lang['registernotify'] = 'Lähetä ilmoitus uusista rekisteröitymisistä tähän osoitteeseen'; +$lang['mailfrom'] = 'Sähköpostiosoite automaattisia postituksia varten'; +$lang['mailprefix'] = 'Etuliite automaattisesti lähetettyihin sähköposteihin'; +$lang['htmlmail'] = 'Lähetä paremman näköisiä, mutta isompia HTML multipart sähköposteja. Ota pois päältä, jos haluat vain tekstimuotoisia posteja.'; +$lang['sitemap'] = 'Luo Google sitemap (päiviä)'; +$lang['rss_type'] = 'XML-syötteen tyyppi'; +$lang['rss_linkto'] = 'XML-syöte kytkeytyy'; +$lang['rss_content'] = 'Mitä XML-syöte näyttää?'; +$lang['rss_update'] = 'XML-syötteen päivitystahti (sek)'; +$lang['rss_show_summary'] = 'XML-syöte näyttää yhteenvedon otsikossa'; +$lang['rss_media'] = 'Millaiset muutokset pitäisi olla mukana XML-syötteessä.'; +$lang['updatecheck'] = 'Tarkista päivityksiä ja turvavaroituksia? Tätä varten DokuWikin pitää ottaa yhteys update.dokuwiki.orgiin.'; +$lang['userewrite'] = 'Käytä siivottuja URLeja'; +$lang['useslash'] = 'Käytä kauttaviivaa nimiavaruuksien erottimena URL-osoitteissa'; +$lang['sepchar'] = 'Sivunimen sanaerotin'; +$lang['canonical'] = 'Käytä kanonisoituja URLeja'; +$lang['fnencode'] = 'Muita kuin ASCII merkkejä sisältävien tiedostonimien koodaustapa.'; +$lang['autoplural'] = 'Etsi monikkomuotoja linkeistä'; +$lang['compression'] = 'Attic-tiedostojen pakkausmenetelmä'; +$lang['gzip_output'] = 'Käytä gzip "Content-Encoding"-otsaketta xhtml-tiedostojen lähettämiseen'; +$lang['compress'] = 'Pakkaa CSS ja javascript'; +$lang['cssdatauri'] = 'Maksimikoko tavuina jossa kuvat joihin viitataan CSS-tiedostoista olisi sisällytettynä suoraan tyylitiedostoon jotta HTTP-kyselyjen kaistaa saataisiin kutistettua. Tämä tekniikka ei toimi IE versiossa aikasempi kuin 8! 400:sta 600:aan tavua on hyvä arvo. Aseta 0 kytkeäksesi ominaisuuden pois.'; +$lang['send404'] = 'Lähetä "HTTP 404/Page Not Found" puuttuvista sivuista'; +$lang['broken_iua'] = 'Onko "ignore_user_abort" toiminto rikki järjestelmässäsi? Tämä voi aiheuttaa toimimattoman index-näkymän. +IIS+PHP/CGI on tunnetusti rikki. Katso Bug 852 lisätietoja varten.'; +$lang['xsendfile'] = 'Käytä X-Sendfile otsikkoa, kun web-palvelin lähettää staattisia tiedostoja? Palvelimesi pitää tukea tätä.'; +$lang['renderer_xhtml'] = 'Renderöinti, jota käytetään wikin pääasialliseen (xhtml) tulostukseen'; +$lang['renderer__core'] = '%s (dokuwiki core)'; +$lang['renderer__plugin'] = '%s (liitännäinen)'; +$lang['dnslookups'] = 'DokuWiki tarkistaa sivun päivittäjän koneen IP-osoitteen isäntänimen. Kytke pois, jos käytät hidasta tai toimimatonta DNS-palvelinta, tai et halua tätä ominaisuutta.'; +$lang['proxy____host'] = 'Proxy-palvelimen nimi'; +$lang['proxy____port'] = 'Proxy portti'; +$lang['proxy____user'] = 'Proxy käyttäjän nimi'; +$lang['proxy____pass'] = 'Proxy salasana'; +$lang['proxy____ssl'] = 'Käytä ssl-yhteyttä kytkeytyäksesi proxy-palvelimeen'; +$lang['proxy____except'] = 'Säännönmukainen lause, URLiin, jolle proxy ohitetaan.'; +$lang['license_o_'] = 'ei mitään valittuna'; +$lang['typography_o_0'] = 'ei mitään'; +$lang['typography_o_1'] = 'ilman yksinkertaisia lainausmerkkejä'; +$lang['typography_o_2'] = 'myös yksinkertaiset lainausmerkit (ei aina toimi)'; +$lang['userewrite_o_0'] = 'ei mitään'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWikin sisäinen'; +$lang['deaccent_o_0'] = 'pois'; +$lang['deaccent_o_1'] = 'Poista aksenttimerkit'; +$lang['deaccent_o_2'] = 'translitteroi'; +$lang['gdlib_o_0'] = 'GD Lib ei ole saatavilla'; +$lang['gdlib_o_1'] = 'Versio 1.x'; +$lang['gdlib_o_2'] = 'Automaattitunnistus'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Yhteenveto'; +$lang['rss_content_o_diff'] = 'Yhdistetty erot'; +$lang['rss_content_o_htmldiff'] = 'HTML-muotoiltu eroavuuslista'; +$lang['rss_content_o_html'] = 'Täysi HTML-sivu'; +$lang['rss_linkto_o_diff'] = 'erot-näkymä'; +$lang['rss_linkto_o_page'] = 'muutettu sivu'; +$lang['rss_linkto_o_rev'] = 'versiolista'; +$lang['rss_linkto_o_current'] = 'nykyinen sivu'; +$lang['compression_o_0'] = 'ei mitään'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'älä käytä'; +$lang['xsendfile_o_1'] = 'Oma lighttpd otsikko (ennen 1.5 julkaisua)'; +$lang['xsendfile_o_2'] = 'Standardi X-sendfile header'; +$lang['xsendfile_o_3'] = 'Oma Nginx X-Accel-Redirect header'; +$lang['showuseras_o_loginname'] = 'Kirjautumisnimi'; +$lang['showuseras_o_username'] = 'Käyttäjän koko nimi'; +$lang['showuseras_o_email'] = 'Käyttäjän sähköpostiosoite (sumennettu mailguard-asetusten mukaisesti)'; +$lang['showuseras_o_email_link'] = 'Käyttäjän sähköpostiosoite mailto: linkkinä'; +$lang['useheading_o_0'] = 'Ei koskaan'; +$lang['useheading_o_navigation'] = 'Vain Navigointi'; +$lang['useheading_o_content'] = 'Vain Wiki-sisältö'; +$lang['useheading_o_1'] = 'Aina'; +$lang['readdircache'] = 'Maksimiaika readdir cachelle (sek)'; diff --git a/lib/plugins/config/lang/fr/intro.txt b/lib/plugins/config/lang/fr/intro.txt new file mode 100644 index 0000000..afc5805 --- /dev/null +++ b/lib/plugins/config/lang/fr/intro.txt @@ -0,0 +1,7 @@ +====== Gestionnaire de configuration ====== + +Utilisez cette page pour contrôler les paramètres de votre installation de DokuWiki. Pour de l'aide sur chaque paramètre, reportez vous à [[doku>fr:config]]. Pour plus de détails concernant cette extension, reportez vous à [[doku>fr:plugin:config]]. + +Les paramètres affichés sur un fond rouge sont protégés et ne peuvent être modifiés avec cette extension. Les paramètres affichés sur un fond bleu sont les valeurs par défaut et les valeurs spécifiquement définies pour votre installation sont affichées sur un fond blanc. Seuls les paramètres sur fond bleu ou blanc peuvent être modifiés. + +N'oubliez pas d'utiliser le bouton **ENREGISTRER** avant de quitter cette page, sinon vos modifications ne seront pas prises en compte ! diff --git a/lib/plugins/config/lang/fr/lang.php b/lib/plugins/config/lang/fr/lang.php new file mode 100644 index 0000000..77284cf --- /dev/null +++ b/lib/plugins/config/lang/fr/lang.php @@ -0,0 +1,240 @@ + + * @author Jérémy Just + * @author Olivier Humbert + * @author Philippe Verbeke + * @author Nicolas Friedli + * @author Pierre Henriot + * @author PaliPalo + * @author Laurent Ponthieu + * @author Damien Regad + * @author Michael Bohn + * @author Guy Brand + * @author Delassaux Julien + * @author Maurice A. LeBlanc + * @author stephane.gully + * @author Guillaume Turri + * @author Erik Pedersen + * @author olivier duperray + * @author Vincent Feltz + * @author Philippe Bajoit + * @author Florian Gaub + * @author Samuel Dorsaz + * @author Johan Guilbaud + * @author Yannick Aure + * @author Olivier DUVAL + * @author Anael Mobilia + * @author Bruno Veilleux + * @author Carbain Frédéric + * @author Floriang + * @author Simon DELAGE + * @author Eric + */ +$lang['menu'] = 'Paramètres de configuration'; +$lang['error'] = 'Paramètres non modifiés en raison d\'une valeur invalide, vérifiez vos réglages puis réessayez.
    Les valeurs erronées sont entourées d\'une bordure rouge.'; +$lang['updated'] = 'Paramètres mis à jour avec succès.'; +$lang['nochoice'] = '(aucun autre choix possible)'; +$lang['locked'] = 'Le fichier des paramètres ne peut être modifié, si ceci n\'est pas intentionnel,
    vérifiez que le nom et les autorisations du fichier sont correctes.'; +$lang['danger'] = 'Danger : modifier cette option pourrait rendre inaccessibles votre wiki et son menu de configuration.'; +$lang['warning'] = 'Attention : modifier cette option pourrait engendrer un comportement indésirable.'; +$lang['security'] = 'Avertissement de sécurité : modifier cette option pourrait induire un risque de sécurité.'; +$lang['_configuration_manager'] = 'Gestionnaire de configuration'; +$lang['_header_dokuwiki'] = 'Paramètres de DokuWiki'; +$lang['_header_plugin'] = 'Paramètres des extensions'; +$lang['_header_template'] = 'Paramètres du thème'; +$lang['_header_undefined'] = 'Paramètres indéfinis'; +$lang['_basic'] = 'Paramètres de base'; +$lang['_display'] = 'Paramètres d\'affichage'; +$lang['_authentication'] = 'Paramètres d\'authentification'; +$lang['_anti_spam'] = 'Paramètres anti-spam'; +$lang['_editing'] = 'Paramètres d\'édition'; +$lang['_links'] = 'Paramètres des liens'; +$lang['_media'] = 'Paramètres des médias'; +$lang['_notifications'] = 'Paramètres de notification'; +$lang['_syndication'] = 'Paramètres de syndication'; +$lang['_advanced'] = 'Paramètres avancés'; +$lang['_network'] = 'Paramètres réseaux'; +$lang['_msg_setting_undefined'] = 'Pas de définition de métadonnées'; +$lang['_msg_setting_no_class'] = 'Pas de définition de paramètres.'; +$lang['_msg_setting_no_known_class'] = 'Classe de réglage non disponible.'; +$lang['_msg_setting_no_default'] = 'Pas de valeur par défaut.'; +$lang['title'] = 'Titre du wiki (nom du wiki)'; +$lang['start'] = 'Nom de la page d\'accueil à utiliser pour toutes les catégories'; +$lang['lang'] = 'Langue de l\'interface'; +$lang['template'] = 'Thème (rendu visuel du wiki)'; +$lang['tagline'] = 'Descriptif du site (si le thème utilise cette fonctionnalité)'; +$lang['sidebar'] = 'Nom du panneau latéral (si le thème utilise cette fonctionnalité). Laisser le champ vide désactive le panneau latéral.'; +$lang['license'] = 'Sous quelle licence doit-être placé le contenu ?'; +$lang['savedir'] = 'Dossier d\'enregistrement des données'; +$lang['basedir'] = 'Dossier de base du serveur (par exemple : /dokuwiki/). Laisser vide pour une détection automatique.'; +$lang['baseurl'] = 'URL de base du site (par exemple http://www.example.com). Laisser vide pour une détection automatique.'; +$lang['cookiedir'] = 'Chemin des cookies. Laissez vide pour utiliser l\'URL de base.'; +$lang['dmode'] = 'Mode de création des dossiers'; +$lang['fmode'] = 'Mode de création des fichiers'; +$lang['allowdebug'] = 'Debug (Ne l\'activez que si vous en avez besoin !)'; +$lang['recent'] = 'Nombre de lignes à afficher - par page - pour les derniers changements'; +$lang['recent_days'] = 'Signaler les pages modifiées depuis (en jours)'; +$lang['breadcrumbs'] = 'Nombre de traces à afficher. 0 désactive cette fonctionnalité.'; +$lang['youarehere'] = 'Utiliser des traces hiérarchiques (vous voudrez probablement désactiver l\'option ci-dessus)'; +$lang['fullpath'] = 'Afficher le chemin complet des pages dans le pied de page'; +$lang['typography'] = 'Effectuer des améliorations typographiques'; +$lang['dformat'] = 'Format de date (cf. fonction strftime de PHP)'; +$lang['signature'] = 'Données à insérer lors de l\'utilisation du bouton « signature » dans l\'éditeur'; +$lang['showuseras'] = 'Données à afficher concernant le dernier utilisateur ayant modifié une page'; +$lang['toptoclevel'] = 'Niveau le plus haut à afficher dans la table des matières'; +$lang['tocminheads'] = 'Nombre minimum de titres pour qu\'une table des matières soit affichée'; +$lang['maxtoclevel'] = 'Niveau maximum pour figurer dans la table des matières'; +$lang['maxseclevel'] = 'Niveau maximum pour modifier des sections'; +$lang['camelcase'] = 'Les mots en CamelCase créent des liens'; +$lang['deaccent'] = 'Retirer les accents dans les noms de pages'; +$lang['useheading'] = 'Utiliser le titre de premier niveau pour le nom de la page'; +$lang['sneaky_index'] = 'Par défaut, DokuWiki affichera toutes les catégories dans la vue par index. Activer cette option permet de cacher les catégories pour lesquelles l\'utilisateur n\'a pas l\'autorisation de lecture. Il peut en résulter le masquage de sous-catégories accessibles. Ceci peut rendre l\'index inutilisable avec certains contrôles d\'accès.'; +$lang['hidepages'] = 'Cacher les pages correspondant à (expression régulière)'; +$lang['useacl'] = 'Utiliser les listes de contrôle d\'accès (ACL)'; +$lang['autopasswd'] = 'Auto-générer les mots de passe'; +$lang['authtype'] = 'Mécanisme d\'authentification'; +$lang['passcrypt'] = 'Méthode de chiffrement des mots de passe'; +$lang['defaultgroup'] = 'Groupe par défaut : tous les nouveaux utilisateurs y seront affectés'; +$lang['superuser'] = 'Super-utilisateur : groupe, utilisateur ou liste séparée par des virgules utilisateur1,@groupe1,utilisateur2 ayant un accès complet à toutes les pages quelque soit le paramétrage des contrôle d\'accès'; +$lang['manager'] = 'Manager:- groupe, utilisateur ou liste séparée par des virgules utilisateur1,@groupe1,utilisateur2 ayant accès à certaines fonctionnalités de gestion'; +$lang['profileconfirm'] = 'Confirmer les modifications de profil par la saisie du mot de passe '; +$lang['rememberme'] = 'Permettre de conserver de manière permanente les cookies de connexion (mémoriser)'; +$lang['disableactions'] = 'Actions à désactiver dans DokuWiki'; +$lang['disableactions_check'] = 'Vérifier'; +$lang['disableactions_subscription'] = 'Abonnement aux pages'; +$lang['disableactions_wikicode'] = 'Afficher le texte source'; +$lang['disableactions_profile_delete'] = 'Supprimer votre propre compte'; +$lang['disableactions_other'] = 'Autres actions (séparées par des virgules)'; +$lang['disableactions_rss'] = 'Syndication XML (RSS)'; +$lang['auth_security_timeout'] = 'Délai d\'expiration de sécurité (secondes)'; +$lang['securecookie'] = 'Les cookies définis via HTTPS doivent-ils n\'être envoyé par le navigateur que via HTTPS ? Désactivez cette option lorsque seule la connexion à votre wiki est sécurisée avec SSL et que la navigation sur le wiki est effectuée de manière non sécurisée.'; +$lang['samesitecookie'] = 'Valeur de l\'attribut samesite des cookies. Vide pour laisser les navigateurs décider de leur politique samesite.'; +$lang['remote'] = 'Active l\'API système distante. Ceci permet à d\'autres applications d\'accéder au wiki via XML-RPC ou d\'autres mécanismes.'; +$lang['remoteuser'] = 'Restreindre l\'accès à l\'API à une liste de groupes ou d\'utilisateurs (séparés par une virgule). Laisser vide pour donner l\'accès tout le monde.'; +$lang['remotecors'] = 'Active le partage de ressources entre origines multiples (CORS) pour les interfaces distantes. Utiliser un astérisque (*) pour autoriser toutes les origines. Laisser vide pour interdire le CORS.'; +$lang['usewordblock'] = 'Bloquer le spam selon les mots utilisés'; +$lang['relnofollow'] = 'Utiliser l\'attribut « rel="nofollow" » sur les liens extérieurs'; +$lang['indexdelay'] = 'Délai avant l\'indexation (secondes)'; +$lang['mailguard'] = 'Cacher les adresses de courriel'; +$lang['iexssprotect'] = 'Vérifier, dans les fichiers envoyés, la présence de code JavaScript ou HTML malveillant'; +$lang['usedraft'] = 'Enregistrer automatiquement un brouillon pendant l\'édition'; +$lang['locktime'] = 'Âge maximum des fichiers de blocage (secondes)'; +$lang['cachetime'] = 'Âge maximum d\'un fichier en cache (secondes)'; +$lang['target____wiki'] = 'Cible pour liens internes'; +$lang['target____interwiki'] = 'Cible pour liens interwiki'; +$lang['target____extern'] = 'Cible pour liens externes'; +$lang['target____media'] = 'Cible pour liens média'; +$lang['target____windows'] = 'Cible pour liens vers partages Windows'; +$lang['mediarevisions'] = 'Activer les révisions (gestion de versions) des médias'; +$lang['refcheck'] = 'Vérifier si un média est toujours utilisé avant de le supprimer'; +$lang['gdlib'] = 'Version de la bibliothèque GD'; +$lang['im_convert'] = 'Chemin vers l\'outil de conversion ImageMagick'; +$lang['jpg_quality'] = 'Qualité de la compression JPEG (0-100)'; +$lang['fetchsize'] = 'Taille maximale (en octets) que fetch.php peut télécharger depuis une URL tierce (par exemple pour conserver en cache et redimensionner une image tierce)'; +$lang['subscribers'] = 'Activer l\'abonnement aux pages'; +$lang['subscribe_time'] = 'Délai après lequel les listes d\'abonnement et résumés sont expédiés (en secondes). Devrait être plus petit que le délai précisé dans recent_days.'; +$lang['notify'] = 'Notifier systématiquement les modifications à cette adresse de courriel'; +$lang['registernotify'] = 'Notifier systématiquement les nouveaux utilisateurs enregistrés à cette adresse de courriel'; +$lang['mailfrom'] = 'Adresse de courriel de l\'expéditeur des notifications par courriel du wiki'; +$lang['mailreturnpath'] = 'Adresse de courriel du destinataire pour les notifications de non-remise'; +$lang['mailprefix'] = 'Préfixe à utiliser dans les objets des courriels automatiques. Laisser vide pour utiliser le titre du wiki'; +$lang['htmlmail'] = 'Envoyer des courriels multipart HTML (visuellement plus agréable, mais plus lourd). Désactiver pour utiliser uniquement des courriel en texte seul.'; +$lang['dontlog'] = 'Désactiver l\'enregistrement pour ces types de journaux.'; +$lang['logretain'] = 'Nombre de jours à garder dans le journal.'; +$lang['sitemap'] = 'Fréquence de génération du sitemap Google (jours). 0 pour désactiver'; +$lang['rss_type'] = 'Type de flux XML (RSS)'; +$lang['rss_linkto'] = 'Lien du flux XML vers'; +$lang['rss_content'] = 'Quel contenu afficher dans le flux XML?'; +$lang['rss_update'] = 'Fréquence de mise à jour du flux XML (secondes)'; +$lang['rss_show_summary'] = 'Le flux XML affiche le résumé dans le titre'; +$lang['rss_show_deleted'] = 'Le flux XML montre les flux détruits'; +$lang['rss_media'] = 'Quels types de changements doivent être listés dans le flux XML?'; +$lang['rss_media_o_both'] = 'les deux'; +$lang['rss_media_o_pages'] = 'pages'; +$lang['rss_media_o_media'] = 'media'; +$lang['updatecheck'] = 'Vérifier les mises à jour et alertes de sécurité? DokuWiki doit pouvoir contacter update.dokuwiki.org'; +$lang['userewrite'] = 'Utiliser des URL esthétiques'; +$lang['useslash'] = 'Utiliser « / » comme séparateur de catégories dans les URL'; +$lang['sepchar'] = 'Séparateur de mots dans les noms de page'; +$lang['canonical'] = 'Utiliser des URL canoniques'; +$lang['fnencode'] = 'Méthode pour l\'encodage des fichiers non-ASCII'; +$lang['autoplural'] = 'Rechercher les formes plurielles dans les liens'; +$lang['compression'] = 'Méthode de compression pour les fichiers attic'; +$lang['gzip_output'] = 'Utiliser gzip pour le Content-Encoding du XHTML'; +$lang['compress'] = 'Compresser les fichiers CSS et JavaScript'; +$lang['cssdatauri'] = 'Taille maximale en octets pour inclure dans les feuilles de styles CSS les images qui y sont référencées. Cette technique réduit le nombre de requêtes HTTP. Cette fonctionnalité ne fonctionne qu\'à partir de la version 8 d\'Internet Explorer! Nous recommandons une valeur entre 400 et 600. 0 pour désactiver.'; +$lang['send404'] = 'Renvoyer « HTTP 404/Page Not Found » pour les pages inexistantes'; +$lang['broken_iua'] = 'La fonction ignore_user_abort est-elle opérationnelle sur votre système ? Ceci peut empêcher le fonctionnement de l\'index de recherche. IIS+PHP/ +CGI dysfonctionne.'; +$lang['xsendfile'] = 'Utiliser l\'en-tête X-Sendfile pour permettre au serveur web de délivrer les fichiers statiques ? Votre serveur web doit prendre en charge cette technologie.'; +$lang['renderer_xhtml'] = 'Moteur de rendu du format de sortie principal (XHTML)'; +$lang['renderer__core'] = '%s (cœur de DokuWiki)'; +$lang['renderer__plugin'] = '%s (extension)'; +$lang['search_nslimit'] = 'Limiter la recherche aux X catégories courantes. Quand une recherche est effectuée à partir d\'une page dans une catégorie profondément imbriquée, les premières X catégories sont ajoutées comme filtre.'; +$lang['search_fragment'] = 'Spécifier le comportement de recherche fragmentaire par défaut'; +$lang['search_fragment_o_exact'] = 'exact'; +$lang['search_fragment_o_starts_with'] = 'commence par'; +$lang['search_fragment_o_ends_with'] = 'se termine par'; +$lang['search_fragment_o_contains'] = 'contient'; +$lang['trustedproxy'] = 'Faire confiance aux mandataires qui correspondent à cette expression régulière pour l\'adresse IP réelle des clients qu\'ils rapportent. La valeur par défaut correspond aux réseaux locaux. Laisser vide pour ne faire confiance à aucun mandataire.'; +$lang['_feature_flags'] = 'Fonctionnalités expérimentales'; +$lang['defer_js'] = 'Attendre que le code HTML des pages soit analysé avant d\'exécuter le javascript. Améliore la vitesse de chargement perçue, mais pourrait casser un petit nombre de greffons.'; +$lang['hidewarnings'] = 'Ne montrer aucun avertissement émis par PHP. Cela peut faciliter la transition vers PHP 8+. Les avertissements seront toujours enregistrés dans le journal des erreurs et devraient être rapportés.'; +$lang['dnslookups'] = 'DokuWiki effectuera une résolution du nom d\'hôte sur les adresses IP des utilisateurs modifiant des pages. Si vous ne possédez pas de serveur DNS, que ce dernier est lent ou que vous ne souhaitez pas utiliser cette fonctionnalité : désactivez-la.'; +$lang['jquerycdn'] = 'Faut-il distribuer les scripts JQuery et JQuery UI depuis un CDN ? Cela ajoute une requête HTTP, mais les fichiers peuvent se charger plus vite et les internautes les ont peut-être déjà en cache.'; +$lang['jquerycdn_o_0'] = 'Non : utilisation de votre serveur.'; +$lang['jquerycdn_o_jquery'] = 'Oui : CDN code.jquery.com.'; +$lang['jquerycdn_o_cdnjs'] = 'Oui : CDN cdnjs.com.'; +$lang['proxy____host'] = 'Mandataire (proxy) - Hôte'; +$lang['proxy____port'] = 'Mandataire - Port'; +$lang['proxy____user'] = 'Mandataire - Identifiant'; +$lang['proxy____pass'] = 'Mandataire - Mot de passe'; +$lang['proxy____ssl'] = 'Mandataire - Utilisation de SSL'; +$lang['proxy____except'] = 'Mandataire - Expression régulière de test des URLs pour lesquelles le mandataire (proxy) ne doit pas être utilisé.'; +$lang['license_o_'] = 'Aucune choisie'; +$lang['typography_o_0'] = 'aucun'; +$lang['typography_o_1'] = 'guillemets uniquement'; +$lang['typography_o_2'] = 'tout signe typographique (peut ne pas fonctionner)'; +$lang['userewrite_o_0'] = 'aucun'; +$lang['userewrite_o_1'] = 'Fichier .htaccess'; +$lang['userewrite_o_2'] = 'Interne à DokuWiki'; +$lang['deaccent_o_0'] = 'off'; +$lang['deaccent_o_1'] = 'supprimer les accents'; +$lang['deaccent_o_2'] = 'convertir en caractères latins'; +$lang['gdlib_o_0'] = 'Bibliothèque GD non disponible'; +$lang['gdlib_o_1'] = 'version 1.x'; +$lang['gdlib_o_2'] = 'auto-détectée'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Résumé'; +$lang['rss_content_o_diff'] = 'Diff. unifié'; +$lang['rss_content_o_htmldiff'] = 'Diff. formaté en table HTML'; +$lang['rss_content_o_html'] = 'page complète au format HTML'; +$lang['rss_linkto_o_diff'] = 'liste des différences'; +$lang['rss_linkto_o_page'] = 'page révisée'; +$lang['rss_linkto_o_rev'] = 'liste des révisions'; +$lang['rss_linkto_o_current'] = 'page actuelle'; +$lang['compression_o_0'] = 'aucune'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'ne pas utiliser'; +$lang['xsendfile_o_1'] = 'Entête propriétaire lighttpd (avant la version 1.5)'; +$lang['xsendfile_o_2'] = 'Entête standard X-Sendfile'; +$lang['xsendfile_o_3'] = 'En-tête propriétaire Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Identifiant de l\'utilisateur'; +$lang['showuseras_o_username'] = 'Nom de l\'utilisateur'; +$lang['showuseras_o_username_link'] = 'Nom complet de l\'utilisateur en tant que lien interwiki'; +$lang['showuseras_o_email'] = 'Courriel de l\'utilisateur (brouillé suivant les paramètres de brouillage sélectionnés)'; +$lang['showuseras_o_email_link'] = 'Courriel de l\'utilisateur en tant que lien mailto:'; +$lang['useheading_o_0'] = 'Jamais'; +$lang['useheading_o_navigation'] = 'Navigation seulement'; +$lang['useheading_o_content'] = 'Contenu du wiki seulement'; +$lang['useheading_o_1'] = 'Toujours'; +$lang['readdircache'] = 'Durée de vie maximale du cache pour readdir (sec)'; diff --git a/lib/plugins/config/lang/gl/intro.txt b/lib/plugins/config/lang/gl/intro.txt new file mode 100644 index 0000000..cafe28e --- /dev/null +++ b/lib/plugins/config/lang/gl/intro.txt @@ -0,0 +1,7 @@ +====== Xestor de Configuración ====== + +Usa esta páxina para controlares a configuración da túa instalación do Dokuwiki. Para atopares axuda verbo de cada opción da configuración vai a [[doku>config]]. Para obteres pormenores desta extensión bota un ollo a [[doku>plugin:config]]. + +As opcións que amosan un fondo de cor vermella clara están protexidas e non poden ser alteradas con esta extensión. As opcións que amosan un fondo de cor azul son valores predeterminados e as opcións que teñen fondo branco foron configuradas de xeito local para esta instalación en concreto. Ámbalas dúas, as opcións azuis e brancas, poden ser alteradas. + +Lembra premer no boton **GARDAR** denantes de saíres desta páxina ou, en caso contrario, os teus trocos perderanse. diff --git a/lib/plugins/config/lang/gl/lang.php b/lib/plugins/config/lang/gl/lang.php new file mode 100644 index 0000000..2344ea2 --- /dev/null +++ b/lib/plugins/config/lang/gl/lang.php @@ -0,0 +1,186 @@ + + * @author Oscar M. Lage + * @author Rodrigo Rega + */ +$lang['menu'] = 'Opcións de Configuración'; +$lang['error'] = 'Configuración non actualizada debido a un valor inválido, por favor revisa os teus trocos e volta envialos de novo. +
    O(s) valor(es) incorrecto(s) amosanse cinguidos por un borde vermello.'; +$lang['updated'] = 'Configuración actualizada correctamente.'; +$lang['nochoice'] = '(non hai outras escollas dispoñibles)'; +$lang['locked'] = 'Non se puido actualizar o arquivo de configuración, se non ocorre como debería ser,
    +asegúrate de que o nome do arquivo de configuración local e os permisos son correctos.'; +$lang['danger'] = 'Perigo: mudando esta opción podes facer inaccesíbeis o teu wiki e máis o menú de configuración.'; +$lang['warning'] = 'Ollo: mudando esta opción poden aparecer comportamentos do aplicativo non agardados.'; +$lang['security'] = 'Aviso de seguranza: mudando esta opción poden aparecer riscos de seguranza.'; +$lang['_configuration_manager'] = 'Xestor de Configuración'; +$lang['_header_dokuwiki'] = 'Configuración do DokuWiki'; +$lang['_header_plugin'] = 'Configuración de Extensións'; +$lang['_header_template'] = 'Configuración de Sobreplanta'; +$lang['_header_undefined'] = 'Configuración Indefinida'; +$lang['_basic'] = 'Configuración Básica'; +$lang['_display'] = 'Configuración de Visualización'; +$lang['_authentication'] = 'Configuración de Autenticación'; +$lang['_anti_spam'] = 'Configuración de Anti-Correo-lixo'; +$lang['_editing'] = 'Configuración de Edición'; +$lang['_links'] = 'Configuración de Ligazóns'; +$lang['_media'] = 'Configuración de Media'; +$lang['_notifications'] = 'Opcións de Notificación'; +$lang['_syndication'] = 'Opcións de Sindicación'; +$lang['_advanced'] = 'Configuración Avanzada'; +$lang['_network'] = 'Configuración de Rede'; +$lang['_msg_setting_undefined'] = 'Non hai configuración de metadatos.'; +$lang['_msg_setting_no_class'] = 'Non hai configuración de clase.'; +$lang['_msg_setting_no_default'] = 'Non hai valor predeterminado.'; +$lang['title'] = 'Título do Wiki'; +$lang['start'] = 'Nome da páxina inicial'; +$lang['lang'] = 'Idioma'; +$lang['template'] = 'Sobreplanta'; +$lang['tagline'] = 'Tagline (si a plantilla o soporta)'; +$lang['sidebar'] = 'Nome de páxina da barra lateral (si a platilla o soporta), o campo en baleiro deshabilita a barra lateral'; +$lang['license'] = 'Baixo de que licenza será ceibado o teu contido?'; +$lang['savedir'] = 'Directorio no que se gardarán os datos'; +$lang['basedir'] = 'Directorio base'; +$lang['baseurl'] = 'URL base'; +$lang['cookiedir'] = 'Ruta das cookies. Deixar en blanco para usar a url de base.'; +$lang['dmode'] = 'Modo de creación de directorios'; +$lang['fmode'] = 'Modo de creación de arquivos'; +$lang['allowdebug'] = 'Permitir o depurado desactívao se non o precisas!'; +$lang['recent'] = 'Trocos recentes'; +$lang['recent_days'] = 'Número de trocos recentes a manter (días)'; +$lang['breadcrumbs'] = 'Número de niveis da estrutura de navegación'; +$lang['youarehere'] = 'Niveis xerárquicos da estrutura de navegación'; +$lang['fullpath'] = 'Amosar a ruta completa das páxinas no pé das mesmas'; +$lang['typography'] = 'Facer substitucións tipográficas'; +$lang['dformat'] = 'Formato de Data (bótalle un ollo á función strftime do PHP)'; +$lang['signature'] = 'Sinatura'; +$lang['showuseras'] = 'Que amosar cando se informe do usuario que fixo a última modificación dunha páxina'; +$lang['toptoclevel'] = 'Nivel superior para a táboa de contidos'; +$lang['tocminheads'] = 'Cantidade mínima de liñas de cabeceira que determinará se a TDC vai ser xerada'; +$lang['maxtoclevel'] = 'Nivel máximo para a táboa de contidos'; +$lang['maxseclevel'] = 'Nivel máximo de edición da sección'; +$lang['camelcase'] = 'Utilizar CamelCase para as ligazóns'; +$lang['deaccent'] = 'Limpar nomes de páxina'; +$lang['useheading'] = 'Utilizar a primeira cabeceira para os nomes de páxina'; +$lang['sneaky_index'] = 'O DokuWiki amosará por defecto todos os nomes de espazo na vista de índice. Se activas isto agocharanse aqueles onde o usuario non teña permisos de lectura.'; +$lang['hidepages'] = 'Agochar páxinas que coincidan (expresións regulares)'; +$lang['useacl'] = 'Utilizar lista de control de acceso'; +$lang['autopasswd'] = 'Xerar contrasinais automaticamente'; +$lang['authtype'] = 'Backend de autenticación'; +$lang['passcrypt'] = 'Método de encriptado do contrasinal'; +$lang['defaultgroup'] = 'Grupo por defecto'; +$lang['superuser'] = 'Super-usuario - un grupo ou usuario con acceso completo a todas as páxinas e funcións independentemente da configuración da ACL'; +$lang['manager'] = 'Xestor - un grupo ou usuario con acceso a certas funcións de xestión'; +$lang['profileconfirm'] = 'Confirmar trocos de perfil mediante contrasinal'; +$lang['rememberme'] = 'Permitir cookies permanentes de inicio de sesión (lembrarme)'; +$lang['disableactions'] = 'Desactivar accións do DokuWiki'; +$lang['disableactions_check'] = 'Comprobar'; +$lang['disableactions_subscription'] = 'Subscribir/Desubscribir'; +$lang['disableactions_wikicode'] = 'Ver fonte/Exportar Datos Raw'; +$lang['disableactions_other'] = 'Outras accións (separadas por comas)'; +$lang['auth_security_timeout'] = 'Tempo Límite de Seguridade de Autenticación (segundos)'; +$lang['securecookie'] = 'Deben enviarse só vía HTTPS polo navegador as cookies configuradas vía HTTPS? Desactiva esta opción cando só o inicio de sesión do teu wiki estea asegurado con SSL pero a navegación do mesmo se faga de xeito inseguro.'; +$lang['remote'] = 'Permite o uso do sistema API remoto. Isto permite a outras aplicacións acceder ao wiki mediante XML-RPC ou outros mecanismos.'; +$lang['remoteuser'] = 'Restrinxe o uso remoto da API aos grupos ou usuarios indicados, separados por comas. Deixar baleiro para dar acceso a todo o mundo.'; +$lang['usewordblock'] = 'Bloquear correo-lixo segundo unha lista de verbas'; +$lang['relnofollow'] = 'Utilizar rel="nofollow" nas ligazóns externas'; +$lang['indexdelay'] = 'Retardo denantes de indexar (seg)'; +$lang['mailguard'] = 'Ofuscar enderezos de correo-e'; +$lang['iexssprotect'] = 'Comprobar arquivos subidos na procura de posíbel código JavaScript ou HTML malicioso'; +$lang['usedraft'] = 'Gardar un borrador automaticamente no tempo da edición'; +$lang['locktime'] = 'Tempo máximo para o bloqueo de arquivos (seg.)'; +$lang['cachetime'] = 'Tempo máximo para a caché (seg.)'; +$lang['target____wiki'] = 'Fiestra de destino para as ligazóns internas'; +$lang['target____interwiki'] = 'Fiestra de destino para as ligazóns interwiki'; +$lang['target____extern'] = 'Fiestra de destino para as ligazóns externas'; +$lang['target____media'] = 'Fiestra de destino para as ligazóns de media'; +$lang['target____windows'] = 'Fiestra de destino para as ligazóns de fiestras'; +$lang['mediarevisions'] = 'Habilitar revisións dos arquivos-media?'; +$lang['refcheck'] = 'Comprobar a referencia media'; +$lang['gdlib'] = 'Versión da Libraría GD'; +$lang['im_convert'] = 'Ruta deica a ferramenta de conversión ImageMagick'; +$lang['jpg_quality'] = 'Calidade de compresión dos JPG (0-100)'; +$lang['fetchsize'] = 'Tamaño máximo (en bytes) que pode descargar fetch.php dende fontes externas'; +$lang['subscribers'] = 'Activar posibilidade de subscrición á páxina'; +$lang['subscribe_time'] = 'Tempo despois do cal se enviarán os resumos e listas de subscrición (seg.): isto debe ser inferior ao tempo especificado en recent_days.'; +$lang['notify'] = 'Enviar notificacións de trocos a este enderezo de correo-e'; +$lang['registernotify'] = 'Enviar información de novos usuarios rexistrados a este enderezo de correo-e'; +$lang['mailfrom'] = 'Enderezo de correo-e a usar para as mensaxes automáticas'; +$lang['mailprefix'] = 'Prefixo de asunto de correo-e para as mensaxes automáticas'; +$lang['htmlmail'] = 'Enviar correos electrónicos HTML multiparte máis estéticos, pero máis grande en tamaño. Deshabilitar para mandar correos electrónicos en texto claro.'; +$lang['sitemap'] = 'Xerar mapa do sitio co Google (días)'; +$lang['rss_type'] = 'Tipo de corrente RSS XML'; +$lang['rss_linkto'] = 'A corrente XML liga para'; +$lang['rss_content'] = 'Que queres amosar nos elementos da corrente XML?'; +$lang['rss_update'] = 'Intervalo de actualización da corrente XML (seg.)'; +$lang['rss_show_summary'] = 'Amosar sumario no título da corrente XML'; +$lang['rss_media'] = 'Qué tipo de cambios deben ser listados no feed XML?'; +$lang['updatecheck'] = 'Comprobar se hai actualizacións e avisos de seguridade? O DokuWiki precisa contactar con update.dokuwiki.org para executar esta característica.'; +$lang['userewrite'] = 'Utilizar URLs amigábeis'; +$lang['useslash'] = 'Utilizar a barra inclinada (/) como separador de nome de espazo nos URLs'; +$lang['sepchar'] = 'Verba separadora do nome de páxina'; +$lang['canonical'] = 'Utilizar URLs completamente canónicos'; +$lang['fnencode'] = 'Método para codificar os nomes de arquivo non-ASCII.'; +$lang['autoplural'] = 'Comprobar formas plurais nas ligazóns'; +$lang['compression'] = 'Método de compresión para arquivos attic'; +$lang['gzip_output'] = 'Utilizar Contido-Codificación gzip para o xhtml'; +$lang['compress'] = 'Saída compacta de CSS e Javascript'; +$lang['cssdatauri'] = 'Tamaño en bytes ata o cal as imaxes referenciadas nos CSS serán incrustadas na folla de estilos para disminuir o tamaño das cabeceiras das solicitudes HTTP. Entre 400 e 600 bytes é un valor axeitado. Establecer a 0 para deshabilitar.'; +$lang['send404'] = 'Enviar "HTTP 404/Páxina non atopada" para as páxinas inexistentes'; +$lang['broken_iua'] = 'Rachou a función ignore_user_abort no teu sistema? Isto podería causar que o índice de procura non funcione. Coñécese que o IIS+PHP/CGI ráchaa. Bótalle un ollo ao Bug 852 para obter máis información.'; +$lang['xsendfile'] = 'Empregar a cabeceira X-Sendfile para que o servidor web envie arquivos estáticos? O teu servidor web precisa soportar isto.'; +$lang['renderer_xhtml'] = 'Intérprete a empregar para a saída principal (XHTML) do Wiki'; +$lang['renderer__core'] = '%s (núcleo do Dokuwiki)'; +$lang['renderer__plugin'] = '%s (extensión)'; +$lang['dnslookups'] = 'DokuWiki resolverá os nomes de host das direccións IP dos usuarios que editan as páxinas. Si contas un servidor DNS lento, que non funciona ou non che interesa esta característica, deshabilita esta opción'; +$lang['proxy____host'] = 'Nome do servidor Proxy'; +$lang['proxy____port'] = 'Porto do Proxy'; +$lang['proxy____user'] = 'Nome de usuario do Proxy'; +$lang['proxy____pass'] = 'Contrasinal do Proxy'; +$lang['proxy____ssl'] = 'Utilizar ssl para conectar ao Proxy'; +$lang['proxy____except'] = 'Expresión regular para atopar URLs que deban ser omitidas polo Proxy.'; +$lang['license_o_'] = 'Non se escolleu nada'; +$lang['typography_o_0'] = 'ningunha'; +$lang['typography_o_1'] = 'Só dobres aspas'; +$lang['typography_o_2'] = 'Todas as aspas (pode que non funcione sempre)'; +$lang['userewrite_o_0'] = 'ningún'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'Interno do DokuWiki'; +$lang['deaccent_o_0'] = 'desconectado'; +$lang['deaccent_o_1'] = 'Eliminar acentos'; +$lang['deaccent_o_2'] = 'romanizar'; +$lang['gdlib_o_0'] = 'Libraría GD non dispoñíbel'; +$lang['gdlib_o_1'] = 'Versión 1.x'; +$lang['gdlib_o_2'] = 'Detección automática'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Sumario'; +$lang['rss_content_o_diff'] = 'Formato Unified Diff'; +$lang['rss_content_o_htmldiff'] = 'Táboa diff formatada en HTML'; +$lang['rss_content_o_html'] = 'Contido HTML completo da páxina'; +$lang['rss_linkto_o_diff'] = 'vista de diferenzas'; +$lang['rss_linkto_o_page'] = 'a páxina revisada'; +$lang['rss_linkto_o_rev'] = 'listaxe de revisións'; +$lang['rss_linkto_o_current'] = 'a páxina actual'; +$lang['compression_o_0'] = 'ningunha'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'non o empregues'; +$lang['xsendfile_o_1'] = 'Cabeceira lighttpd propietaria (denantes da versión 1.5)'; +$lang['xsendfile_o_2'] = 'Cabeceira X-Sendfile estándar'; +$lang['xsendfile_o_3'] = 'Cabeceira X-Accel-Redirect propia de Nginx'; +$lang['showuseras_o_loginname'] = 'Nome de inicio de sesión'; +$lang['showuseras_o_username'] = 'Nome completo do usuario'; +$lang['showuseras_o_email'] = 'Enderezo de correo-e do usuario (ofuscado segundo a configuración mailguard)'; +$lang['showuseras_o_email_link'] = 'Enderezo de correo-e do usuario como ligazón mailto:'; +$lang['useheading_o_0'] = 'Endexamais'; +$lang['useheading_o_navigation'] = 'Só Navegación'; +$lang['useheading_o_content'] = 'Só Contido do Wiki'; +$lang['useheading_o_1'] = 'Sempre'; +$lang['readdircache'] = 'Edad máxima para o directorio de caché (seg)'; diff --git a/lib/plugins/config/lang/he/intro.txt b/lib/plugins/config/lang/he/intro.txt new file mode 100644 index 0000000..d61a938 --- /dev/null +++ b/lib/plugins/config/lang/he/intro.txt @@ -0,0 +1,7 @@ +====== מנהל תצורה ====== + +ניתן להשתמש בדף זה לשליטה על הגדרות התקנת ה-Dokuwiki שלך. לעזרה בנוגע להגדרות ספציפיות ניתן לפנות אל [[doku>config]]. למידע נוסף אודות תוסף זה ניתן לפנות אל [[doku>plugin:config]]. + +הגדרות עם רקע אדום-בהיר מוגנות ואין אפשרות לשנותן עם תוסף זה. הגדרות עם רקע כחול הן בעלות ערך ברירת המחדל והגדרות עם רקע לבן הוגדרו באופן מקומי עבור התקנה זו. ההגדרות בעלות הרקעים הכחול והלבן הן ברות שינוי. + +יש לזכור ללחוץ על כפתור ה**שמירה** טרם עזיבת דף זה פן יאבדו השינויים. diff --git a/lib/plugins/config/lang/he/lang.php b/lib/plugins/config/lang/he/lang.php new file mode 100644 index 0000000..a0dc32d --- /dev/null +++ b/lib/plugins/config/lang/he/lang.php @@ -0,0 +1,158 @@ + + * @author DoK + * @author Moshe Kaplan + * @author Yaron Yogev + * @author Yaron Shahrabani + * @author sagi + */ +$lang['menu'] = 'הגדרות תצורה'; +$lang['error'] = 'ההגדרות לא עודכנו בגלל ערך לא תקף, נא לעיין בשינויים ולשלוח שנית. +
    הערכים שאינם נכונים יסומנו בגבול אדום.'; +$lang['updated'] = 'ההגדרות עודכנו בהצלחה.'; +$lang['nochoice'] = '(אין אפשרויות זמינות נוספות)'; +$lang['locked'] = 'קובץ ההגדרות אינו בר עידכון, אם הדבר אינו מכוון,
    + יש לודא כי קובץ ההגדרות המקומי וההרשאות נכונים.'; +$lang['_configuration_manager'] = 'מנהל תצורה'; +$lang['_header_dokuwiki'] = 'הגדרות DokuWiki'; +$lang['_header_plugin'] = 'הגדרות תוסף'; +$lang['_header_template'] = 'הגדרות תבנית'; +$lang['_header_undefined'] = 'הגדרות שונות'; +$lang['_basic'] = 'הגדרות בסיסיות'; +$lang['_display'] = 'הגדרות תצוגה'; +$lang['_authentication'] = 'הגדרות הזדהות'; +$lang['_anti_spam'] = 'הגדרות נגד דואר זבל'; +$lang['_editing'] = 'הגדרות עריכה'; +$lang['_links'] = 'הגדרות קישורים'; +$lang['_media'] = 'הגדרות מדיה'; +$lang['_advanced'] = 'הגדרות מתקדמות'; +$lang['_network'] = 'הגדרות רשת'; +$lang['_msg_setting_undefined'] = 'אין מידע-על להגדרה.'; +$lang['_msg_setting_no_class'] = 'אין קבוצה להגדרה.'; +$lang['_msg_setting_no_default'] = 'אין ערך ברירת מחדל.'; +$lang['title'] = 'כותרת הויקי'; +$lang['start'] = 'שם דף הפתיחה'; +$lang['lang'] = 'שפה'; +$lang['template'] = 'תבנית'; +$lang['savedir'] = 'ספריה לשמירת מידע'; +$lang['basedir'] = 'ספרית בסיס'; +$lang['baseurl'] = 'כתובת URL בסיסית'; +$lang['dmode'] = 'מצב יצירת ספריה'; +$lang['fmode'] = 'מצב יצירת קובץ'; +$lang['allowdebug'] = 'אפשר דיבוג יש לבטל אם אין צורך!'; +$lang['recent'] = 'שינויים אחרונים'; +$lang['recent_days'] = 'כמה שינויים אחרונים לשמור (ימים)'; +$lang['breadcrumbs'] = 'מספר עקבות להיסטוריה'; +$lang['youarehere'] = 'עקבות היררכיות להיסטוריה'; +$lang['fullpath'] = 'הצגת נתיב מלא לדפים בתחתית'; +$lang['typography'] = 'שימוש בחלופות טיפוגרפיות'; +$lang['dformat'] = 'תסדיר תאריך (נא לפנות לפונקציה strftime של PHP)'; +$lang['signature'] = 'חתימה'; +$lang['toptoclevel'] = 'רמה עליונה בתוכן הענינים'; +$lang['maxtoclevel'] = 'רמה מירבית בתוכן הענינים'; +$lang['maxseclevel'] = 'רמה מירבית בעריכת קטעים'; +$lang['camelcase'] = 'השתמש בראשיות גדולות לקישורים'; +$lang['deaccent'] = 'נקה שמות דפים'; +$lang['useheading'] = 'השתמש בכותרת הראשונה לשם הדף'; +$lang['sneaky_index'] = 'כברירת מחדל, דוקוויקי יציג את כל מרחבי השמות בתצוגת תוכן הענינים. בחירה באפשרות זאת תסתיר את אלו שבהם למשתמש אין הרשאות קריאה. התוצאה עלולה להיות הסתרת תת מרחבי שמות אליהם יש למשתמש גישה. באופן זה תוכן הענינים עלול להפוך לחסר תועלת עם הגדרות ACL מסוימות'; +$lang['hidepages'] = 'הסתר דפים תואמים (ביטויים רגולריים)'; +$lang['useacl'] = 'השתמש ברשימות בקרת גישה'; +$lang['autopasswd'] = 'צור סיסמאות באופן אוטומטי'; +$lang['authtype'] = 'מנוע הזדהות'; +$lang['passcrypt'] = 'שיטת הצפנת סיסמאות'; +$lang['defaultgroup'] = 'קבוצת ברירת המחדל'; +$lang['superuser'] = 'משתמש-על'; +$lang['manager'] = 'מנהל - קבוצה, משתמש או רשימה מופרדת בפסיקים משתמש1, @קבוצה1, משתמש2 עם גישה לפעולות ניהול מסוימות.'; +$lang['profileconfirm'] = 'אשר שינוי פרופילים עם סיסמה'; +$lang['disableactions'] = 'בטל פעולות DokuWiki'; +$lang['disableactions_check'] = 'בדיקה'; +$lang['disableactions_subscription'] = 'הרשמה/הסרה מרשימה'; +$lang['disableactions_wikicode'] = 'הצגת המקור/יצוא גולמי'; +$lang['disableactions_other'] = 'פעולות אחרות (מופרדות בפסיק)'; +$lang['auth_security_timeout'] = 'מגבלת אבטח פסק הזמן להזדהות (שניות)'; +$lang['usewordblock'] = 'חסימת דואר זבל לפי רשימת מילים'; +$lang['relnofollow'] = 'השתמש ב- rel="nofollow" לקישורים חיצוניים'; +$lang['indexdelay'] = 'השהיה בטרם הכנסה לאינדקס (שניות)'; +$lang['mailguard'] = 'הגן על כתובות דוא"ל'; +$lang['iexssprotect'] = 'בדוק את הדפים המועלים לחשד ל-JavaScript או קוד HTML זדוני'; +$lang['usedraft'] = 'שמור טיוטות באופן אוטומטי בעת עריכה'; +$lang['locktime'] = 'גיל מירבי לקבצי נעילה (שניות)'; +$lang['cachetime'] = 'גיל מירבי לזכרון מטמון (שניות)'; +$lang['target____wiki'] = 'חלון יעד לקישורים פנימיים'; +$lang['target____interwiki'] = 'חלון יעד לקישורים בין מערכות ויקי'; +$lang['target____extern'] = 'חלון יעד לקישורים חיצוניים'; +$lang['target____media'] = 'חלון יעד לקישור למדיה'; +$lang['target____windows'] = 'חלון יעד לתיקיות משותפות'; +$lang['refcheck'] = 'בדוק שיוך מדיה'; +$lang['gdlib'] = 'גרסת ספרית ה-GD'; +$lang['im_convert'] = 'נתיב לכלי ה-convert של ImageMagick'; +$lang['jpg_quality'] = 'איכות הדחיסה של JPG (0-100)'; +$lang['fetchsize'] = 'גודל הקובץ המירבי (bytes) ש-fetch.php יכול להוריד מבחוץ'; +$lang['subscribers'] = 'התר תמיכה ברישום לדפים'; +$lang['notify'] = 'שלח התראות על שינויים לכתובת דוא"ל זו'; +$lang['registernotify'] = 'שלח מידע על משתמשים רשומים חדשים לכתובת דוא"ל זו'; +$lang['mailfrom'] = 'כתובת הדוא"ל לשימוש בדברי דוא"ל אוטומטיים'; +$lang['sitemap'] = 'צור מפת אתר של Google (ימים)'; +$lang['rss_type'] = 'סוג פלט XML'; +$lang['rss_linkto'] = 'פלט ה-XML מקשר אל'; +$lang['rss_content'] = 'מה להציג בפרטי פלט ה-XML'; +$lang['rss_update'] = 'פלט ה-XML מתעדכן כל (שניות)'; +$lang['rss_show_summary'] = 'פלט ה-XML מציג תקציר בכותרת'; +$lang['updatecheck'] = 'בדיקת עידכוני אבטחה והתראות? על DokuWiki להתקשר אל update.dokuwiki.org לצורך כך.'; +$lang['userewrite'] = 'השתמש בכתובות URL יפות'; +$lang['useslash'] = 'השתמש בלוכסן להגדרת מרחבי שמות בכתובות'; +$lang['sepchar'] = 'מפריד בין מילות שם-דף'; +$lang['canonical'] = 'השתמש בכתובות URL מלאות'; +$lang['autoplural'] = 'בדוק לצורת רבים בקישורים'; +$lang['compression'] = 'אופן דחיסת קבצים ב-attic'; +$lang['gzip_output'] = 'השתמש בקידוד תוכן של gzip עבור xhtml'; +$lang['compress'] = 'פלט קומפקטי של CSS ו-javascript'; +$lang['send404'] = 'שלח "HTTP 404/Page Not Found" עבור דפים שאינם קיימים'; +$lang['broken_iua'] = 'האם הפעולה ignore_user_abort תקולה במערכת שלך? הדבר עלול להביא לתוכן חיפוש שאינו תקין. IIS+PHP/CGI ידוע כתקול. ראה את באג 852 למידע נוסף'; +$lang['xsendfile'] = 'להשתמש בכותר X-Sendfile כדי לאפשר לשרת לספק קבצים סטטיים? על השרת שלך לתמוך באפשרות זאת.'; +$lang['renderer_xhtml'] = 'מחולל לשימוש עבור פלט הויקי העיקרי (xhtml)'; +$lang['renderer__core'] = '%s (ליבת דוקוויקי)'; +$lang['renderer__plugin'] = '%s (הרחבות)'; +$lang['proxy____host'] = 'שם השרת המתווך'; +$lang['proxy____port'] = 'שער השרת המתווך'; +$lang['proxy____user'] = 'שם המשתמש בשרת המתווך'; +$lang['proxy____pass'] = 'סיסמת ההשרת המתווך'; +$lang['proxy____ssl'] = 'השתמש ב-ssl כדי להתחבר לשרת המתווך'; +$lang['typography_o_0'] = 'ללא'; +$lang['typography_o_1'] = 'רק גרשיים כפולים'; +$lang['typography_o_2'] = 'כל הגרשים (עלול שלא לעבוד לעיתים)'; +$lang['userewrite_o_0'] = 'ללא'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'פנימי של DokuWiki'; +$lang['deaccent_o_0'] = 'כבוי'; +$lang['deaccent_o_1'] = 'הסר ניבים'; +$lang['deaccent_o_2'] = 'הסב ללטינית'; +$lang['gdlib_o_0'] = 'ספרית ה-GD אינה זמינה'; +$lang['gdlib_o_1'] = 'גרסה 1.x'; +$lang['gdlib_o_2'] = 'זיהוי אוטומטי'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'תקציר'; +$lang['rss_content_o_diff'] = 'הבדלים מאוחדים'; +$lang['rss_content_o_htmldiff'] = 'טבלת HTML של ההבדלים'; +$lang['rss_content_o_html'] = 'מלוא תוכן דף HTML'; +$lang['rss_linkto_o_diff'] = 'תצוגת הבדלים'; +$lang['rss_linkto_o_page'] = 'הדף שהשתנה'; +$lang['rss_linkto_o_rev'] = 'גרסאות קודמות'; +$lang['rss_linkto_o_current'] = 'הדף הנוכחי'; +$lang['compression_o_0'] = 'ללא'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'אל תשתמש'; +$lang['xsendfile_o_1'] = 'כותר lighttpd קנייני (לפני גרסה 1.5)'; +$lang['xsendfile_o_2'] = 'כותר X-Sendfile רגיל'; +$lang['xsendfile_o_3'] = 'כותר Nginx X-Accel-Redirect קנייני'; +$lang['useheading_o_navigation'] = 'ניווט בלבד'; +$lang['useheading_o_1'] = 'תמיד'; diff --git a/lib/plugins/config/lang/hi/lang.php b/lib/plugins/config/lang/hi/lang.php new file mode 100644 index 0000000..a224fdf --- /dev/null +++ b/lib/plugins/config/lang/hi/lang.php @@ -0,0 +1,14 @@ + + * @author yndesai@gmail.com + */ +$lang['sepchar'] = 'पृष्ठ का नाम शब्द प्रथक्कर'; +$lang['sitemap'] = 'गूगल का सूचना पटल नक्शा बनायें (दिन)'; +$lang['license_o_'] = 'कुछ नहीं चुना'; +$lang['typography_o_0'] = 'कुछ नहीं'; +$lang['showuseras_o_username'] = 'उपयोगकर्ता का पूर्ण नाम'; +$lang['useheading_o_0'] = 'कभी नहीं'; +$lang['useheading_o_1'] = 'हमेशा'; diff --git a/lib/plugins/config/lang/hr/intro.txt b/lib/plugins/config/lang/hr/intro.txt new file mode 100644 index 0000000..66ebdc0 --- /dev/null +++ b/lib/plugins/config/lang/hr/intro.txt @@ -0,0 +1,7 @@ +====== Upravljanje postavkama ====== + +Koristite ovu stranicu za upravljanje postavkama Vaše DokuWiki instalacije. Za pomoć o pojedinim postavkama pogledajte [[doku>config|konfiguraciju]]. Za više detalja o ovom dodatku pogledajte [[doku>plugin:config]]. + +Postavke prikazane u svjetlo crvenoj pozadini su zaštićene i ne mogu biti mijenjane pomoću ovog dodatka. Postavke s plavom pozadinom sadrže inicijalno podrazumijevane vrijednosti, dok postavke s bijelom pozadinom sadrže korisnički postavljene vrijednosti. I plave i bijele postavke se mogu mijenjati. + +Zapamtite da pritisnete **Pohrani** gumb prije nego napustite ovu stranicu ili će izmjene biti izgubljene. diff --git a/lib/plugins/config/lang/hr/lang.php b/lib/plugins/config/lang/hr/lang.php new file mode 100644 index 0000000..71a014a --- /dev/null +++ b/lib/plugins/config/lang/hr/lang.php @@ -0,0 +1,202 @@ + + */ +$lang['menu'] = 'Konfiguracijske postavke'; +$lang['error'] = 'Postavke nisu ažurirane zbog neispravnih vrijednosti, molim provjerite vaše promjene i ponovo ih pohranite. +
    Neispravne vrijednosti biti će označene crvenim rubom.'; +$lang['updated'] = 'Postavke uspješno izmijenjene.'; +$lang['nochoice'] = '(ne postoje druge mogućnosti odabira)'; +$lang['locked'] = 'Postavke ne mogu biti izmijenjene, ako je to nenamjerno,
    + osigurajte da su ime datoteke lokalnih postavki i dozvole ispravni.'; +$lang['danger'] = 'Opasnost: Promjena ove opcije može učiniti nedostupnim Vaš wiki i izbornik upravljanja postavkama.'; +$lang['warning'] = 'Upozorenje: Izmjena ove opcije može izazvati neželjeno ponašanje.'; +$lang['security'] = 'Sigurnosno upozorenje: Izmjena ove opcije može izazvati sigurnosni rizik.'; +$lang['_configuration_manager'] = 'Upravljanje postavkama'; +$lang['_header_dokuwiki'] = 'DokuWiki'; +$lang['_header_plugin'] = 'Dodatak'; +$lang['_header_template'] = 'Predložak'; +$lang['_header_undefined'] = 'Nedefinirana postavka'; +$lang['_basic'] = 'Osnovno'; +$lang['_display'] = 'Prikaz'; +$lang['_authentication'] = 'Prijava'; +$lang['_anti_spam'] = 'Protu-Spam'; +$lang['_editing'] = 'Izmjena'; +$lang['_links'] = 'Prečaci'; +$lang['_media'] = 'Mediji'; +$lang['_notifications'] = 'Obavijesti'; +$lang['_syndication'] = 'RSS izvori'; +$lang['_advanced'] = 'Napredno'; +$lang['_network'] = 'Mreža'; +$lang['_msg_setting_undefined'] = 'Nema postavke meta_podatka.'; +$lang['_msg_setting_no_class'] = 'Nema postavke klase.'; +$lang['_msg_setting_no_default'] = 'Nema podrazumijevane vrijednosti.'; +$lang['title'] = 'Wiki naslov, odnosno naziv Vašeg wikija'; +$lang['start'] = 'Naziv početne stranice u svakom imenskom prostoru'; +$lang['lang'] = 'Jezik sučelja'; +$lang['template'] = 'Predložak, odnosno izgled wikija.'; +$lang['tagline'] = 'Opisni redak Wiki naslova (ako ga predložak podržava)'; +$lang['sidebar'] = 'Naziv bočne stranice (ako ga predložak podržava), prazno polje onemogućuje bočnu stranicu'; +$lang['license'] = 'Pod kojom licencom će sadržaj biti objavljen?'; +$lang['savedir'] = 'Pod-direktoriji gdje se pohranjuju podatci'; +$lang['basedir'] = 'Staza poslužitelja (npr. /dokuwiki/). Ostavite prazno za auto-detekciju.'; +$lang['baseurl'] = 'URL poslužitelja (npr. http://www.yourserver.com). Ostavite prazno za auto-detekciju.'; +$lang['cookiedir'] = 'Staza za kolačiće. Ostavite prazno za bazni URL.'; +$lang['dmode'] = 'Mod kreiranja diretorija'; +$lang['fmode'] = 'Mod kreiranja datoteka'; +$lang['allowdebug'] = 'Omogući uklanjanje pogrešaka. Onemogiućiti ako nije potrebno!'; +$lang['recent'] = 'Broj unosa po stranici na nedavnim promjenama'; +$lang['recent_days'] = 'Koliko nedavnih promjena da se čuva (dani)'; +$lang['breadcrumbs'] = 'Broj nedavnih stranica koji se prikazuje. Postavite na 0 da biste onemogućili.'; +$lang['youarehere'] = 'Prikaži hijerarhijsku stazu stranice (tada vjerojatno želite onemogućiti gornju opciju)'; +$lang['fullpath'] = 'Prikaži punu putanju u podnožju stranice'; +$lang['typography'] = 'Napravi tipografske zamjene'; +$lang['dformat'] = 'Format datuma (pogledajte PHP strftime funkciju)'; +$lang['signature'] = 'Što ubacuje gumb potpisa u uređivaču'; +$lang['showuseras'] = 'Što da prikažem za korisnika koji je napravio zadnju izmjenu'; +$lang['toptoclevel'] = 'Najviši nivo za sadržaj stranice'; +$lang['tocminheads'] = 'Minimalni broj naslova koji određuje da li će biti prikazan sadržaj stranice'; +$lang['maxtoclevel'] = 'Maksimalni broj nivoa u sadržaju stranice'; +$lang['maxseclevel'] = 'Maksimalni nivo do kojeg se omogućuje izmjena dijela stranice'; +$lang['camelcase'] = 'Koristi CamelCase za poveznice (veliko početno slovo svake riječi)'; +$lang['deaccent'] = 'Kako se pročišćuje naziv stranice'; +$lang['useheading'] = 'Koristi prvi naslov za naziv stranice'; +$lang['sneaky_index'] = 'Inicijalno DokuWiki će prikazati sve imenske prostore u site mapi. Omogućavanjem ove opcije biti će sakriveni oni za koje korisnik nema barem pravo čitanja. Ovo može rezultirati skrivanjem podimenskih prostora koji su inače pristupačni, što može indeks učiniti nekorisnim pod određenim postavkama ACL-a.'; +$lang['hidepages'] = 'Kod potrage mape stranica i drugih automatskih indeksa ne prikazuj stranice koje zadovoljavaju ovaj regularni izraz'; +$lang['useacl'] = 'Koristi kontrolnu listu pristupa'; +$lang['autopasswd'] = 'Auto-generiranje lozinki'; +$lang['authtype'] = 'Mehanizam za identificiranje korisnika'; +$lang['passcrypt'] = 'Metoda šifriranja lozinki'; +$lang['defaultgroup'] = 'Osnovna grupa'; +$lang['superuser'] = 'Superuser - grupa, korisnik ili zarezom odvojena lista (npr. korisnik1,@grupa1,korisnik2) s punim pravom pristupa svim stranicama i funkcionalnostima neovisno o ACL postavkama'; +$lang['manager'] = 'Manager - grupa, korisnik ili zarezom odvojena lista (npr. korisnik1,@grupa1,korisnik2) s pristupom određenim upravljačkim funkcijama'; +$lang['profileconfirm'] = 'Potvrdi promjene profila sa lozinkom'; +$lang['rememberme'] = 'Omogući trajne kolačiće za prijavu (zapamti me)'; +$lang['disableactions'] = 'Onemogući određene DokuWiki aktivnosti'; +$lang['disableactions_check'] = 'Provjeri'; +$lang['disableactions_subscription'] = 'Pretplati/Odjavi'; +$lang['disableactions_wikicode'] = 'Vidi izvorni kod/Izvezi sirovi oblik'; +$lang['disableactions_profile_delete'] = 'Obriši svog korisnika'; +$lang['disableactions_other'] = 'Ostale aktivnosti (odvojene zarezom)'; +$lang['disableactions_rss'] = 'XML Syndication (RSS)'; +$lang['auth_security_timeout'] = 'Vremenski limit za prijavu (sekunde)'; +$lang['securecookie'] = 'Da li će kolačići poslani HTTPS-om biti poslani HTTPS-om od strane preglednika? Onemogući ovu opciju kada je samo prijava osigurana SSL-om a ne i pristup stranicama.'; +$lang['remote'] = 'Omogući udaljeni API. Ovo omogućava drugim aplikacijama pristup wikiju korištenjem XML-RPC i drugih mehanizama.'; +$lang['remoteuser'] = 'Ograniči pristup udaljenom API-u samo korisnicima i grupama navedenim ovdje u listi odvojenoj zarezom. Ostavi prazno za pristup omogućen svima.'; +$lang['usewordblock'] = 'Zaustavi spam baziran na listi riječi'; +$lang['relnofollow'] = 'Koristi rel="nofollow" na vanjskim poveznicama'; +$lang['indexdelay'] = 'Čekanje prije indeksiranja (sek.)'; +$lang['mailguard'] = 'Prikrivanje e-mail adresa'; +$lang['iexssprotect'] = 'Provjeri učitane datoteke za potencijalno maliciozni JavaScript ili HTML kod'; +$lang['usedraft'] = 'Automatski pohrani nacrte promjena tijekom uređivanja'; +$lang['locktime'] = 'Maksimalna trajanje zaključavanja (sek.)'; +$lang['cachetime'] = 'Maksimalno trajanje priručne pohrane (sek.)'; +$lang['target____wiki'] = 'Odredišni prozor za interne poveznice'; +$lang['target____interwiki'] = 'Odredišni prozor za interwiki poveznice'; +$lang['target____extern'] = 'Odredišni prozor za vanjske poveznice'; +$lang['target____media'] = 'Odredišni prozor za medijske poveznice'; +$lang['target____windows'] = 'Odredišni prozor za windows poveznice'; +$lang['mediarevisions'] = 'Omogućiti revizije medijskih datoteka?'; +$lang['refcheck'] = 'Provjeri prije brisanja da li se medijska datoteka još uvijek koristi'; +$lang['gdlib'] = 'Inačica GD Lib'; +$lang['im_convert'] = 'Staza do ImageMagick\'s konverzijskog alata'; +$lang['jpg_quality'] = 'Kvaliteta kompresije JPG-a (0-100)'; +$lang['fetchsize'] = 'Maksimalna veličina (bajtovi) koju fetch.php može učitati iz vanjskih URL-ova. npr. za pohranu i promjenu veličine vanjskih slika.'; +$lang['subscribers'] = 'Omogući korisnicima preplatu na promjene preko e-pošte'; +$lang['subscribe_time'] = 'Vrijeme (sek.) nakon kojeg se šalju pretplatne liste. Trebalo bi biti manje od od vremena navedenog u recent_days parametru.'; +$lang['notify'] = 'Uvijek šalji obavijesti o promjenama na ovu adresu epošte'; +$lang['registernotify'] = 'Uvijek šalji obavijesti o novo-kreiranim korisnicima na ovu adresu epošte'; +$lang['mailfrom'] = 'Adresa pošiljatelja epošte koja se koristi pri slanju automatskih poruka'; +$lang['mailreturnpath'] = 'Adresa e-pošte primatelja za obavijesti o ne-isporuci'; +$lang['mailprefix'] = 'Prefiks predmeta poruke kod automatskih poruka. Ostaviti prazno za korištenje naslova wikija'; +$lang['htmlmail'] = 'Šalji ljepše, ali i veće poruke u HTML obliku. Onemogući za slanje poruka kao običan tekst.'; +$lang['sitemap'] = 'Generiraj Google mapu stranica svakih (dana). 0 za onemogućivanje'; +$lang['rss_type'] = 'tip XML feed-a'; +$lang['rss_linkto'] = 'XML feed povezuje na'; +$lang['rss_content'] = 'Što da se prikazuje u stavkama XML feed-a?'; +$lang['rss_update'] = 'Interval obnavljanja XML feed-a (sek.)'; +$lang['rss_show_summary'] = 'Prikaz sažetka u naslovu XML feed-a'; +$lang['rss_media'] = 'Koje vrste promjena trebaju biti prikazane u XML feed-u?'; +$lang['rss_media_o_both'] = 'oboje'; +$lang['rss_media_o_pages'] = 'stranice'; +$lang['rss_media_o_media'] = 'medij'; +$lang['updatecheck'] = 'Provjera za nadogradnje i sigurnosna upozorenja? DokuWiki treba imati pristup do dokuwiki.org za ovo.'; +$lang['userewrite'] = 'Koristi jednostavne URL-ove'; +$lang['useslash'] = 'Koristi kosu crtu kao separator imenskih prostora u URL-ovima'; +$lang['sepchar'] = 'Separator riječi u nazivu stranice'; +$lang['canonical'] = 'Uvije koristi puni kanonski oblik URL-ova (puna apsolutna staza)'; +$lang['fnencode'] = 'Metoda kodiranja ne-ASCII imena datoteka.'; +$lang['autoplural'] = 'Provjera izraza u množini u poveznicama'; +$lang['compression'] = 'Vrsta kompresije za pohranu attic datoteka'; +$lang['gzip_output'] = 'Koristi gzip Content-Encoding za xhtml'; +$lang['compress'] = 'Sažmi CSS i javascript izlaz'; +$lang['cssdatauri'] = 'Veličina u bajtovima do koje slike navedene u CSS datotekama će biti ugrađene u stylesheet kako bi se smanjilo prekoračenje zaglavlja HTTP zathjeva . 400 do 600 bajtova je dobra vrijednost. Postavi 0 za onemogućavanje.'; +$lang['send404'] = 'Pošalji "HTTP 404/Page Not Found" za nepostojeće stranice'; +$lang['broken_iua'] = 'Da li je ignore_user_abort funkcija neispravna na vašem sustavu? Ovo može izazvati neispravan indeks pretrage. IIS+PHP/CGI je poznat po neispravnosti. Pogledaj Bug 852 za više informacija.'; +$lang['xsendfile'] = 'Koristi X-Sendfile zaglavlje da se dopusti web poslužitelj dostavu statičkih datoteka? Vaš web poslužitelj ovo mora podržavati.'; +$lang['renderer_xhtml'] = 'Mehanizam koji se koristi za slaganje osnovnog (xhtml) wiki izlaza'; +$lang['renderer__core'] = '%s (dokuwiki jezgra)'; +$lang['renderer__plugin'] = '%s (dodatak)'; +$lang['search_nslimit'] = 'Ograniči potragu na trenutnih X imenskih prostora. Kada se potraga izvrši s strane unutar dubljeg imenskog prostora, prvih X imenskih prostora će biti dodano u filtar'; +$lang['search_fragment'] = 'Odredi podrazumijevani način djelomične pretrage'; +$lang['search_fragment_o_exact'] = 'identično'; +$lang['search_fragment_o_starts_with'] = 'počinje s'; +$lang['search_fragment_o_ends_with'] = 'završava s'; +$lang['search_fragment_o_contains'] = 'sadrži'; +$lang['dnslookups'] = 'Da li da DokuWiki potraži ime računala za udaljenu IP adresu korisnik koji je izmijenio stranicu. Ako imate spor ili neispravan DNS server, nemojte koristiti ovu funkcionalnost, onemogućite ovu opciju'; +$lang['jquerycdn'] = 'Da li da se jQuery i jQuery UI script datoteke učitavaju sa CDN? To proizvodi dodatne HTTP zahtjeve, ali datoteke se mogu brže učitati i korisnici ih već mogu imati učitane u od ranije.'; +$lang['jquerycdn_o_0'] = 'Bez CDN, samo lokalna dostava'; +$lang['jquerycdn_o_jquery'] = 'CDN na code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN na cdnjs.com'; +$lang['proxy____host'] = 'Proxy poslužitelj - adresa'; +$lang['proxy____port'] = 'Proxy poslužitelj - port'; +$lang['proxy____user'] = 'Proxy poslužitelj - korisničko ime'; +$lang['proxy____pass'] = 'Proxy poslužitelj - lozinka'; +$lang['proxy____ssl'] = 'Koristi SSL za vezu prema proxy poslužitelju'; +$lang['proxy____except'] = 'Preskoči proxy za URL-ove koji odgovaraju ovom regularnom izrazu.'; +$lang['license_o_'] = 'Ništa odabrano'; +$lang['typography_o_0'] = 'ništa'; +$lang['typography_o_1'] = 'isključivši jednostruke navodnike'; +$lang['typography_o_2'] = 'uključivši jednostruke navodnike (ne mora uvijek raditi)'; +$lang['userewrite_o_0'] = 'ništa'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki interno'; +$lang['deaccent_o_0'] = 'isključeno'; +$lang['deaccent_o_1'] = 'ukloni akcente'; +$lang['deaccent_o_2'] = 'romanizacija'; +$lang['gdlib_o_0'] = 'GD Lib nije dostupna'; +$lang['gdlib_o_1'] = 'Inačica 1.x'; +$lang['gdlib_o_2'] = 'Autodetekcija'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Sažetak'; +$lang['rss_content_o_diff'] = 'Unificirani Diff'; +$lang['rss_content_o_htmldiff'] = 'HTML formatirana diff tabela'; +$lang['rss_content_o_html'] = 'Puni HTML sadržaj stranice'; +$lang['rss_linkto_o_diff'] = 'pregled razlika'; +$lang['rss_linkto_o_page'] = 'izmijenjena stranica'; +$lang['rss_linkto_o_rev'] = 'lista izmjena'; +$lang['rss_linkto_o_current'] = 'tekuća stranica'; +$lang['compression_o_0'] = 'ništa'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'ne koristi'; +$lang['xsendfile_o_1'] = 'Posebno lighttpd zaglavlje (prije inačice 1.5)'; +$lang['xsendfile_o_2'] = 'Standardno X-Sendfile zaglavlje'; +$lang['xsendfile_o_3'] = 'Posebno Nginx X-Accel-Redirect zaglavlje'; +$lang['showuseras_o_loginname'] = 'Korisničko ime'; +$lang['showuseras_o_username'] = 'Puno ime korisnika'; +$lang['showuseras_o_username_link'] = 'Puno ime korisnika kao interwiki poveznica'; +$lang['showuseras_o_email'] = 'Korisnikova adresa epošte (prikrivanje prema mailguard postavci)'; +$lang['showuseras_o_email_link'] = 'Korisnikova adresa epošte kao mailto: poveznica'; +$lang['useheading_o_0'] = 'Nikad'; +$lang['useheading_o_navigation'] = 'Samo navigacija'; +$lang['useheading_o_content'] = 'Samo wiki sadržaj'; +$lang['useheading_o_1'] = 'Uvijek'; +$lang['readdircache'] = 'Maksimalna starost za readdir međuspremnik (sek.)'; diff --git a/lib/plugins/config/lang/hu/intro.txt b/lib/plugins/config/lang/hu/intro.txt new file mode 100644 index 0000000..b6b9149 --- /dev/null +++ b/lib/plugins/config/lang/hu/intro.txt @@ -0,0 +1,9 @@ +====== Beállító központ ====== + +Ezzel az oldallal finomhangolhatod a DokuWiki rendszeredet. Az egyes beállításokhoz [[doku>config|itt]] kaphatsz segítséget. A bővítmények (pluginek) beállításaihoz [[doku>plugin:config|ezt]] az oldalt látogasd meg. + +A világospiros hátterű beállítások védettek, ezzel a bővítménnyel nem módosíthatóak. + +A kék hátterű beállítások az alapértelmezett értékek, a fehér hátterűek módosítva lettek ebben a rendszerben. Mindkét hátterű beállítások módosíthatóak. + +Ne felejtsd a **Mentés** gombot megnyomni, mielőtt elhagyod az oldalt, különben a módosításaid elvesznek! diff --git a/lib/plugins/config/lang/hu/lang.php b/lib/plugins/config/lang/hu/lang.php new file mode 100644 index 0000000..9ea33d4 --- /dev/null +++ b/lib/plugins/config/lang/hu/lang.php @@ -0,0 +1,205 @@ + + * @author Hamp Gábor + * @author Viktor Horváth + * @author Sandor TIHANYI + * @author Siaynoq Mage + * @author schilling.janos + * @author Szabó Dávid + * @author Marton Sebok + */ +$lang['menu'] = 'Beállítóközpont'; +$lang['error'] = 'Helytelen érték miatt a módosítások nem mentődtek. Nézd át a módosításokat, és ments újra. +
    A helytelen érték(ek)et piros kerettel jelöljük.'; +$lang['updated'] = 'A módosítások sikeresen beállítva.'; +$lang['nochoice'] = '(nincs egyéb lehetőség)'; +$lang['locked'] = 'A beállításokat tartalmazó fájlt nem tudtam frissíteni.
    +Nézd meg, hogy a fájl neve és jogosultságai helyesen vannak-e beállítva!'; +$lang['danger'] = 'Figyelem: ezt a beállítást megváltoztatva a konfigurációs menü hozzáférhetetlenné válhat.'; +$lang['warning'] = 'Figyelmeztetés: a beállítás megváltoztatása nem kívánt viselkedést okozhat.'; +$lang['security'] = 'Biztonsági figyelmeztetés: a beállítás megváltoztatása biztonsági veszélyforrást okozhat.'; +$lang['_configuration_manager'] = 'Beállítóközpont'; +$lang['_header_dokuwiki'] = 'DokuWiki beállítások'; +$lang['_header_plugin'] = 'Bővítmények beállításai'; +$lang['_header_template'] = 'Sablon beállítások'; +$lang['_header_undefined'] = 'Nem definiált értékek'; +$lang['_basic'] = 'Alap beállítások'; +$lang['_display'] = 'Megjelenítés beállításai'; +$lang['_authentication'] = 'Azonosítás beállításai'; +$lang['_anti_spam'] = 'Anti-Spam beállítások'; +$lang['_editing'] = 'Szerkesztési beállítások'; +$lang['_links'] = 'Link beállítások'; +$lang['_media'] = 'Média beállítások'; +$lang['_notifications'] = 'Értesítési beállítások'; +$lang['_syndication'] = 'Hírfolyam beállítások'; +$lang['_advanced'] = 'Haladó beállítások'; +$lang['_network'] = 'Hálózati beállítások'; +$lang['_msg_setting_undefined'] = 'Nincs beállított metaadat.'; +$lang['_msg_setting_no_class'] = 'Nincs beállított osztály.'; +$lang['_msg_setting_no_default'] = 'Nincs alapértelmezett érték.'; +$lang['title'] = 'Wiki neve'; +$lang['start'] = 'Kezdőoldal neve'; +$lang['lang'] = 'Nyelv'; +$lang['template'] = 'Sablon'; +$lang['tagline'] = 'Lábléc (ha a sablon támogatja)'; +$lang['sidebar'] = 'Oldalsáv oldal neve (ha a sablon támogatja), az üres mező letiltja az oldalsáv megjelenítését'; +$lang['license'] = 'Milyen licenc alatt érhető el a tartalom?'; +$lang['savedir'] = 'Könyvtár az adatok mentésére'; +$lang['basedir'] = 'Báziskönyvtár (pl. /dokuwiki/). Hagyd üresen az automatikus beállításhoz!'; +$lang['baseurl'] = 'Báziscím (pl. http://www.yourserver.com). Hagyd üresen az automatikus beállításhoz!'; +$lang['cookiedir'] = 'Sütik címe. Hagy üresen a báziscím használatához!'; +$lang['dmode'] = 'Könyvtár létrehozási maszk'; +$lang['fmode'] = 'Fájl létrehozási maszk'; +$lang['allowdebug'] = 'Debug üzemmód Kapcsold ki, hacsak biztos nem szükséges!'; +$lang['recent'] = 'Utolsó változatok száma'; +$lang['recent_days'] = 'Hány napig tartsuk meg a korábbi változatokat?'; +$lang['breadcrumbs'] = 'Nyomvonal elemszám'; +$lang['youarehere'] = 'Hierarchikus nyomvonal'; +$lang['fullpath'] = 'Az oldalak teljes útvonalának mutatása a láblécben'; +$lang['typography'] = 'Legyen-e tipográfiai csere'; +$lang['dformat'] = 'Dátum formázás (lásd a PHP strftime függvényt)'; +$lang['signature'] = 'Aláírás'; +$lang['showuseras'] = 'A felhasználó melyik adatát mutassunk az utolsó változtatás adatainál?'; +$lang['toptoclevel'] = 'A tartalomjegyzék felső szintje'; +$lang['tocminheads'] = 'Legalább ennyi címsor hatására generálódjon tartalomjegyzék'; +$lang['maxtoclevel'] = 'A tartalomjegyzék mélysége'; +$lang['maxseclevel'] = 'A szakasz-szerkesztés maximális szintje'; +$lang['camelcase'] = 'CamelCase használata hivatkozásként'; +$lang['deaccent'] = 'Oldalnevek ékezettelenítése'; +$lang['useheading'] = 'Az első fejléc legyen az oldalnév'; +$lang['sneaky_index'] = 'Alapértelmezetten minden névtér látszik a DokuWiki áttekintő (index) oldalán. Ezen opció bekapcsolása után azok nem jelennek meg, melyekhez a felhasználónak nincs olvasás joga. De ezzel eltakarhatunk egyébként elérhető al-névtereket is, így bizonyos ACL beállításoknál használhatatlan indexet eredményez ez a beállítás.'; +$lang['hidepages'] = 'Az itt megadott oldalak elrejtése (reguláris kifejezés)'; +$lang['useacl'] = 'Hozzáférési listák (ACL) használata'; +$lang['autopasswd'] = 'Jelszavak automatikus generálása'; +$lang['authtype'] = 'Authentikációs háttérrendszer'; +$lang['passcrypt'] = 'Jelszó titkosítási módszer'; +$lang['defaultgroup'] = 'Alapértelmezett csoport'; +$lang['superuser'] = 'Adminisztrátor - csoport vagy felhasználó, aki teljes hozzáférési joggal rendelkezik az oldalakhoz és funkciókhoz, a hozzáférési jogosultságoktól függetlenül'; +$lang['manager'] = 'Menedzser - csoport vagy felhasználó, aki bizonyos menedzsment funkciókhoz hozzáfér'; +$lang['profileconfirm'] = 'Beállítások változtatásának megerősítése jelszóval'; +$lang['rememberme'] = 'Állandó sütik engedélyezése (az "emlékezz rám" funkcióhoz)'; +$lang['disableactions'] = 'Bizonyos DokuWiki tevékenységek (action) tiltása'; +$lang['disableactions_check'] = 'Ellenőrzés'; +$lang['disableactions_subscription'] = 'Feliratkozás/Leiratkozás'; +$lang['disableactions_wikicode'] = 'Forrás megtekintése/Nyers adat exportja'; +$lang['disableactions_profile_delete'] = 'Saját felhasználó törlése'; +$lang['disableactions_other'] = 'Egyéb tevékenységek (vesszővel elválasztva)'; +$lang['disableactions_rss'] = 'XML hírfolyam (RSS)'; +$lang['auth_security_timeout'] = 'Authentikációs biztonsági időablak (másodperc)'; +$lang['securecookie'] = 'A böngészők a HTTPS felett beállított sütijüket csak HTTPS felett küldhetik? Kapcsoljuk ki ezt az opciót, ha csak a bejelentkezést védjük SSL-lel, a wiki tartalmának böngészése nyílt forgalommal történik.'; +$lang['remote'] = 'Távoli API engedélyezése. Ezzel más alkalmazások XML-RPC-n keresztül hozzáférhetnek a wikihez.'; +$lang['remoteuser'] = 'A távoli API hozzáférés korlátozása a következő felhasználókra vagy csoportokra. Hagyd üresen, ha mindenki számára elérhető!'; +$lang['remotecors'] = 'A Cross-Origin Resource Sharing (CORS) engedélyezése más domainről való eléréshez. A csillag (*) engedélyezi az elérést minden domain számára. Hagyd üresen a CORS letiltásához. '; +$lang['usewordblock'] = 'Szólista alapú spam-szűrés'; +$lang['relnofollow'] = 'rel="nofollow" beállítás használata külső hivatkozásokra'; +$lang['indexdelay'] = 'Várakozás indexelés előtt (másodperc)'; +$lang['mailguard'] = 'Email címek olvashatatlanná tétele címgyűjtők számára'; +$lang['iexssprotect'] = 'Feltöltött fájlok ellenőrzése kártékony JavaScript vagy HTML kód elkerülésére'; +$lang['usedraft'] = 'Piszkozat automatikus mentése szerkesztés alatt'; +$lang['locktime'] = 'Oldal-zárolás maximális időtartama (másodperc)'; +$lang['cachetime'] = 'A gyorsítótár maximális élettartama (másodperc)'; +$lang['target____wiki'] = 'Cél-ablak belső hivatkozásokhoz'; +$lang['target____interwiki'] = 'Cél-ablak interwiki hivatkozásokhoz'; +$lang['target____extern'] = 'Cél-ablak külső hivatkozásokhoz'; +$lang['target____media'] = 'Cél-ablak média-fájl hivatkozásokhoz'; +$lang['target____windows'] = 'Cél-ablak Windows hivatkozásokhoz'; +$lang['mediarevisions'] = 'Médiafájlok verziókövetésének engedélyezése'; +$lang['refcheck'] = 'Médiafájlok hivatkozásainak ellenőrzése'; +$lang['gdlib'] = 'GD Lib verzió'; +$lang['im_convert'] = 'Útvonal az ImageMagick csomag convert parancsához'; +$lang['jpg_quality'] = 'JPG tömörítés minősége (0-100)'; +$lang['fetchsize'] = 'Maximális méret (bájtban), amit a fetch.php letölthet kívülről'; +$lang['subscribers'] = 'Oldalváltozás-listára feliratkozás engedélyezése'; +$lang['subscribe_time'] = 'Az értesítések kiküldésének késleltetése (másodperc); Érdemes kisebbet választani, mint a változások megőrzésének maximális ideje.'; +$lang['notify'] = 'Az oldal-változásokat erre az e-mail címre küldje'; +$lang['registernotify'] = 'Értesítés egy újonnan regisztrált felhasználóról erre az e-mail címre'; +$lang['mailfrom'] = 'Az automatikusan küldött levelekben használt e-mail cím'; +$lang['mailprefix'] = 'Előtag az automatikus e-mailek tárgyában'; +$lang['htmlmail'] = 'Szebb, de nagyobb méretű HTML multipart e-mailek küldése. Tiltsd le a nyers szöveges üzenetekhez!'; +$lang['dontlog'] = 'Naplózás letiltása ezekhez a naplótípusokhoz.'; +$lang['sitemap'] = 'Hány naponként generáljunk Google sitemap-ot?'; +$lang['rss_type'] = 'XML hírfolyam típus'; +$lang['rss_linkto'] = 'XML hírfolyam hivatkozás'; +$lang['rss_content'] = 'Mit mutassunk az XML hírfolyam elemekben?'; +$lang['rss_update'] = 'Hány másodpercenként frissítsük az XML hírfolyamot?'; +$lang['rss_show_summary'] = 'A hírfolyam címébe összefoglaló helyezése'; +$lang['rss_media'] = 'Milyen változások legyenek felsorolva az XML hírfolyamban?'; +$lang['rss_media_o_both'] = 'mindkettő'; +$lang['rss_media_o_pages'] = 'oldalak'; +$lang['rss_media_o_media'] = 'média'; +$lang['updatecheck'] = 'Frissítések és biztonsági figyelmeztetések figyelése. Ehhez a DokuWikinek kapcsolatba kell lépnie a update.dokuwiki.org-gal.'; +$lang['userewrite'] = 'Szép URL-ek használata'; +$lang['useslash'] = 'Per-jel használata névtér-elválasztóként az URL-ekben'; +$lang['sepchar'] = 'Szó elválasztó az oldalnevekben'; +$lang['canonical'] = 'Teljesen kanonikus URL-ek használata'; +$lang['fnencode'] = 'A nem ASCII fájlnevek dekódolási módja'; +$lang['autoplural'] = 'Többes szám ellenőrzés a hivatkozásokban (angol)'; +$lang['compression'] = 'Tömörítés használata a törölt lapokhoz'; +$lang['gzip_output'] = 'gzip tömörítés használata xhtml-hez (Content-Encoding)'; +$lang['compress'] = 'CSS és JavaScript fájlok tömörítése'; +$lang['cssdatauri'] = 'Mérethatár bájtokban, ami alatti CSS-ben hivatkozott fájlok közvetlenül beágyazódjanak a stíluslapba. 400-600 bájt ideális érték. Állítsd 0-ra a beágyazás kikapcsolásához!'; +$lang['send404'] = '"HTTP 404/Page Not Found" küldése nemlétező oldalak esetén'; +$lang['broken_iua'] = 'Az ignore_user_abort függvény hibát dob a rendszereden? Ez nem működő keresési indexet eredményezhet. Az IIS+PHP/CGI összeállításról tudjuk, hogy hibát dob. Lásd a Bug 852 oldalt a további infóért.'; +$lang['xsendfile'] = 'Használjuk az X-Sendfile fejlécet, hogy a webszerver statikus állományokat tudjon küldeni? A webszervernek is támogatnia kell ezt a funkciót.'; +$lang['renderer_xhtml'] = 'Az elsődleges (xhtml) wiki kimenet generálója'; +$lang['renderer__core'] = '%s (dokuwiki mag)'; +$lang['renderer__plugin'] = '%s (bővítmény)'; +$lang['search_fragment_o_exact'] = 'pontosan'; +$lang['search_fragment_o_starts_with'] = 'kezdete'; +$lang['search_fragment_o_ends_with'] = 'vége'; +$lang['search_fragment_o_contains'] = 'tartalmaz'; +$lang['dnslookups'] = 'A DokuWiki megpróbál hosztneveket keresni a távoli IP-címekhez. Amennyiben lassú, vagy nem működő DNS-szervered van vagy csak nem szeretnéd ezt a funkciót, tiltsd le ezt az opciót!'; +$lang['jquerycdn_o_0'] = 'Nincs CDN, csak helyi kiszolgálás'; +$lang['proxy____host'] = 'Proxy-szerver neve'; +$lang['proxy____port'] = 'Proxy port'; +$lang['proxy____user'] = 'Proxy felhasználó név'; +$lang['proxy____pass'] = 'Proxy jelszó'; +$lang['proxy____ssl'] = 'SSL használata a proxyhoz csatlakozáskor'; +$lang['proxy____except'] = 'URL szabály azokra a webcímekre, amit szeretnél, hogy ne kezeljen a proxy.'; +$lang['license_o_'] = 'Nincs kiválasztva'; +$lang['typography_o_0'] = 'nem'; +$lang['typography_o_1'] = 'Csak a dupla idézőjelet'; +$lang['typography_o_2'] = 'Minden idézőjelet (előfordulhat, hogy nem mindig működik)'; +$lang['userewrite_o_0'] = 'nem'; +$lang['userewrite_o_1'] = '.htaccess-szel'; +$lang['userewrite_o_2'] = 'DokuWiki saját módszerével'; +$lang['deaccent_o_0'] = 'kikapcsolva'; +$lang['deaccent_o_1'] = 'ékezetek eltávolítása'; +$lang['deaccent_o_2'] = 'távirati stílus'; +$lang['gdlib_o_0'] = 'GD Lib nem elérhető'; +$lang['gdlib_o_1'] = 'Version 1.x'; +$lang['gdlib_o_2'] = 'Auto felismerés'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Kivonat'; +$lang['rss_content_o_diff'] = 'Unified diff formátum'; +$lang['rss_content_o_htmldiff'] = 'HTML formázott változás tábla'; +$lang['rss_content_o_html'] = 'Teljes HTML oldal tartalom'; +$lang['rss_linkto_o_diff'] = 'a változás nézetre'; +$lang['rss_linkto_o_page'] = 'az átdolgozott oldalra'; +$lang['rss_linkto_o_rev'] = 'a változatok listájára'; +$lang['rss_linkto_o_current'] = 'a jelenlegi oldalra'; +$lang['compression_o_0'] = 'nincs tömörítés'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'nincs használatban'; +$lang['xsendfile_o_1'] = 'Lighttpd saját fejléc (1.5-ös verzió előtti)'; +$lang['xsendfile_o_2'] = 'Standard X-Sendfile fejléc'; +$lang['xsendfile_o_3'] = 'Nginx saját X-Accel-Redirect fejléce'; +$lang['showuseras_o_loginname'] = 'Azonosító'; +$lang['showuseras_o_username'] = 'Teljes név'; +$lang['showuseras_o_username_link'] = 'A felhasználó teljes neve belső wiki-hivatkozásként'; +$lang['showuseras_o_email'] = 'E-mail cím (olvashatatlanná téve az e-mailcím védelem beállítása szerint)'; +$lang['showuseras_o_email_link'] = 'E-mail cím mailto: linkként'; +$lang['useheading_o_0'] = 'Soha'; +$lang['useheading_o_navigation'] = 'Csak navigációhoz'; +$lang['useheading_o_content'] = 'Csak Wiki tartalomhoz'; +$lang['useheading_o_1'] = 'Mindig'; +$lang['readdircache'] = 'A könyvtár olvasás gyorsítótárának maximális tárolási ideje (másodperc)'; diff --git a/lib/plugins/config/lang/ia/intro.txt b/lib/plugins/config/lang/ia/intro.txt new file mode 100644 index 0000000..eb2e105 --- /dev/null +++ b/lib/plugins/config/lang/ia/intro.txt @@ -0,0 +1,7 @@ +====== Gestion de configurationes ====== + +Usa iste pagina pro controlar le configurationes de tu installation de DokuWiki. Pro adjuta re configurationes individual, refere te a [[doku>config]]. + +Le configurationes monstrate super un fundo rubie clar es protegite e non pote esser alterate con iste plug-in. Le configurationes monstrate super un fundo blau es le valores predefinite e le configurationes monstrate super un fundo blanc ha essite definite localmente pro iste particular installation. Le configurationes blau e blanc pote esser alterate. + +Rememora de premer le button **SALVEGUARDAR** ante de quitar iste pagina, alteremente tu modificationes essera perdite. diff --git a/lib/plugins/config/lang/ia/lang.php b/lib/plugins/config/lang/ia/lang.php new file mode 100644 index 0000000..8e7d888 --- /dev/null +++ b/lib/plugins/config/lang/ia/lang.php @@ -0,0 +1,167 @@ + + * @author Martijn Dekker + */ +$lang['menu'] = 'Configurationes'; +$lang['error'] = 'Le configurationes non poteva esser actualisate a causa de un valor invalide; per favor revide tu cambiamentos e resubmitte los.
    Le valor(es) incorrecte essera monstrate circumferite per un bordo rubie.'; +$lang['updated'] = 'Actualisation del configurationes succedite.'; +$lang['nochoice'] = '(nulle altere option disponibile)'; +$lang['locked'] = 'Le file de configuration non pote esser actualisate; si isto non es intentional,
    assecura te que le nomine e permissiones del file local de configuration es correcte.'; +$lang['danger'] = 'Periculo: Cambiar iste option pote render tu wiki e le menu de configuration inaccessibile!'; +$lang['warning'] = 'Attention: Cambiar iste option pote causar functionamento indesirate.'; +$lang['security'] = 'Advertimento de securitate: Cambiar iste option pote causar un risco de securitate.'; +$lang['_configuration_manager'] = 'Gestion de configurationes'; +$lang['_header_dokuwiki'] = 'Configurationes de DokuWiki'; +$lang['_header_plugin'] = 'Configurationes de plug-ins'; +$lang['_header_template'] = 'Configurationes de patronos'; +$lang['_header_undefined'] = 'Configurationes non definite'; +$lang['_basic'] = 'Configurationes de base'; +$lang['_display'] = 'Configurationes de visualisation'; +$lang['_authentication'] = 'Configurationes de authentication'; +$lang['_anti_spam'] = 'Configurationes anti-spam'; +$lang['_editing'] = 'Configurationes de modification'; +$lang['_links'] = 'Configurationes de ligamines'; +$lang['_media'] = 'Configurationes de multimedia'; +$lang['_advanced'] = 'Configurationes avantiate'; +$lang['_network'] = 'Configurationes de rete'; +$lang['_msg_setting_undefined'] = 'Nulle metadatos de configuration.'; +$lang['_msg_setting_no_class'] = 'Nulle classe de configuration.'; +$lang['_msg_setting_no_default'] = 'Nulle valor predefinite.'; +$lang['fmode'] = 'Permissiones al creation de files'; +$lang['dmode'] = 'Permissiones al creation de directorios'; +$lang['lang'] = 'Lingua del interfacie'; +$lang['basedir'] = 'Cammino al servitor (p.ex.. /dokuwiki/). Lassa vacue pro autodetection.'; +$lang['baseurl'] = 'URL del servitor (p.ex. http://www.yourserver.com). Lassa vacue pro autodetection.'; +$lang['savedir'] = 'Directorio pro salveguardar datos'; +$lang['start'] = 'Nomine del pagina initial'; +$lang['title'] = 'Titulo del wiki'; +$lang['template'] = 'Patrono'; +$lang['license'] = 'Sub qual licentia debe tu contento esser publicate?'; +$lang['fullpath'] = 'Revelar le cammino complete del paginas in le pede'; +$lang['recent'] = 'Modificationes recente'; +$lang['breadcrumbs'] = 'Numero de micas de pan'; +$lang['youarehere'] = 'Micas de pan hierarchic'; +$lang['typography'] = 'Face substitutiones typographic'; +$lang['dformat'] = 'Formato del datas (vide le function strftime de PHP)'; +$lang['signature'] = 'Signatura'; +$lang['toptoclevel'] = 'Nivello principal pro tabula de contento'; +$lang['tocminheads'] = 'Numero minimal de titulos requirite pro inserer tabula de contento'; +$lang['maxtoclevel'] = 'Nivello maximal pro tabula de contento'; +$lang['maxseclevel'] = 'Nivello maximal pro modification de sectiones'; +$lang['camelcase'] = 'Usar CamelCase pro ligamines'; +$lang['deaccent'] = 'Nomines nette de paginas'; +$lang['useheading'] = 'Usar le prime titulo como nomine de pagina'; +$lang['refcheck'] = 'Verification de referentias multimedia'; +$lang['allowdebug'] = 'Permitter debugging disactiva si non necessari!'; +$lang['usewordblock'] = 'Blocar spam a base de lista de parolas'; +$lang['indexdelay'] = 'Retardo ante generation de indice (secundas)'; +$lang['relnofollow'] = 'Usar rel="nofollow" pro ligamines externe'; +$lang['mailguard'] = 'Offuscar adresses de e-mail'; +$lang['iexssprotect'] = 'Verificar files incargate pro codice HTML o JavaScript possibilemente malitiose'; +$lang['showuseras'] = 'Como monstrar le usator que faceva le ultime modification de un pagina'; +$lang['useacl'] = 'Usar listas de controlo de accesso'; +$lang['autopasswd'] = 'Automaticamente generar contrasignos'; +$lang['authtype'] = 'Servicio de authentication'; +$lang['passcrypt'] = 'Methodo de cryptographia de contrasignos'; +$lang['defaultgroup'] = 'Gruppo predefinite'; +$lang['superuser'] = 'Superusator: le gruppo, usator o lista separate per commas ("usator1,@gruppo1,usator2") con accesso integral a tote le paginas e functiones sin reguardo del ACL'; +$lang['manager'] = 'Administrator: le gruppo, usator o lista separate per commas ("usator1,@gruppo1,usator2") con accesso a certe functiones administrative'; +$lang['profileconfirm'] = 'Confirmar modificationes del profilo con contrasigno'; +$lang['disableactions'] = 'Disactivar actiones DokuWiki'; +$lang['disableactions_check'] = 'Verificar'; +$lang['disableactions_subscription'] = 'Subscriber/Cancellar subscription'; +$lang['disableactions_wikicode'] = 'Vider codice-fonte/Exportar texto crude'; +$lang['disableactions_other'] = 'Altere actiones (separate per commas)'; +$lang['sneaky_index'] = 'Normalmente, DokuWiki monstra tote le spatios de nomines in le vista del indice. Si iste option es active, illos ubi le usator non ha le permission de lectura essera celate. Isto pote resultar in le celamento de subspatios de nomines accessibile. Isto pote render le indice inusabile con certe configurationes de ACL.'; +$lang['auth_security_timeout'] = 'Expiration pro securitate de authentication (secundas)'; +$lang['securecookie'] = 'Debe le cookies definite via HTTPS solmente esser inviate via HTTPS per le navigator? Disactiva iste option si solmente le apertura de sessiones a tu wiki es protegite con SSL ma le navigation del wiki es facite sin securitate.'; +$lang['updatecheck'] = 'Verificar si existe actualisationes e advertimentos de securitate? DokuWiki debe contactar update.dokuwiki.org pro exequer iste function.'; +$lang['userewrite'] = 'Usar URLs nette'; +$lang['useslash'] = 'Usar le barra oblique ("/") como separator de spatios de nomines in URLs'; +$lang['usedraft'] = 'Automaticamente salveguardar un version provisori durante le modification'; +$lang['sepchar'] = 'Separator de parolas in nomines de paginas'; +$lang['canonical'] = 'Usar URLs completemente canonic'; +$lang['autoplural'] = 'Verificar si il ha formas plural in ligamines'; +$lang['compression'] = 'Methodo de compression pro files a mansarda'; +$lang['cachetime'] = 'Etate maximal pro le cache (secundas)'; +$lang['locktime'] = 'Etate maximal pro le files de serratura (secundas)'; +$lang['fetchsize'] = 'Numero maximal de bytes per file que fetch.php pote discargar de sitos externe'; +$lang['notify'] = 'Inviar notificationes de cambios a iste adresse de e-mail'; +$lang['registernotify'] = 'Inviar informationes super usatores novemente registrate a iste adresse de e-mail'; +$lang['mailfrom'] = 'Adresse de e-mail a usar pro messages automatic'; +$lang['gzip_output'] = 'Usar Content-Encoding gzip pro xhtml'; +$lang['gdlib'] = 'Version de GD Lib'; +$lang['im_convert'] = 'Cammino al programma "convert" de ImageMagick'; +$lang['jpg_quality'] = 'Qualitate del compression JPEG (0-100)'; +$lang['subscribers'] = 'Activar le possibilitate de subscriber se al paginas'; +$lang['subscribe_time'] = 'Tempore post le qual le listas de subscription e le digestos es inviate (in secundas); isto debe esser minor que le tempore specificate in recent_days.'; +$lang['compress'] = 'Compactar le output CSS e JavaScript'; +$lang['hidepages'] = 'Celar paginas correspondente (expressiones regular)'; +$lang['send404'] = 'Inviar "HTTP 404/Pagina non trovate" pro paginas non existente'; +$lang['sitemap'] = 'Generar mappa de sito Google (dies)'; +$lang['broken_iua'] = 'Es le function ignore_user_abort defectuose in tu systema? Isto pote resultar in un indice de recerca que non functiona. Vide Bug 852 pro plus info.'; +$lang['xsendfile'] = 'Usar le capite X-Sendfile pro lassar le servitor web livrar files static? Tu navigator del web debe supportar isto.'; +$lang['renderer_xhtml'] = 'Renditor a usar pro le output wiki principal (xhtml)'; +$lang['renderer__core'] = '%s (nucleo dokuwiki)'; +$lang['renderer__plugin'] = '%s (plug-in)'; +$lang['rememberme'] = 'Permitter cookies de session permanente (memorar me)'; +$lang['rss_type'] = 'Typo de syndication XML'; +$lang['rss_linkto'] = 'Syndication XML liga verso'; +$lang['rss_content'] = 'Que monstrar in le entratas de syndication XML?'; +$lang['rss_update'] = 'Intervallo de actualisation pro syndicationes XML (secundas)'; +$lang['recent_days'] = 'Retener quante modificationes recente? (dies)'; +$lang['rss_show_summary'] = 'Monstrar summario in titulo de syndication XML'; +$lang['target____wiki'] = 'Fenestra de destination pro ligamines interne'; +$lang['target____interwiki'] = 'Fenestra de destination pro ligamines interwiki'; +$lang['target____extern'] = 'Fenestra de destination pro ligamines externe'; +$lang['target____media'] = 'Fenestra de destination pro ligamines multimedia'; +$lang['target____windows'] = 'Fenestra de destination pro ligamines a fenestras'; +$lang['proxy____host'] = 'Nomine de servitor proxy'; +$lang['proxy____port'] = 'Porto del proxy'; +$lang['proxy____user'] = 'Nomine de usator pro le proxy'; +$lang['proxy____pass'] = 'Contrasigno pro le proxy'; +$lang['proxy____ssl'] = 'Usar SSL pro connecter al proxy'; +$lang['license_o_'] = 'Nihil seligite'; +$lang['typography_o_0'] = 'nulle'; +$lang['typography_o_1'] = 'excludente '; +$lang['typography_o_2'] = 'includente virgulettas singule (pote non sempre functionar)'; +$lang['userewrite_o_0'] = 'nulle'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'interne a DokuWIki'; +$lang['deaccent_o_0'] = 'disactivate'; +$lang['deaccent_o_1'] = 'remover accentos'; +$lang['deaccent_o_2'] = 'romanisar'; +$lang['gdlib_o_0'] = 'GD Lib non disponibile'; +$lang['gdlib_o_1'] = 'Version 1.x'; +$lang['gdlib_o_2'] = 'Autodetection'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstracte'; +$lang['rss_content_o_diff'] = 'In formato Unified Diff'; +$lang['rss_content_o_htmldiff'] = 'Tabella de diff in formato HTML'; +$lang['rss_content_o_html'] = 'Contento complete del pagina in HTML'; +$lang['rss_linkto_o_diff'] = 'vista de differentias'; +$lang['rss_linkto_o_page'] = 'le pagina revidite'; +$lang['rss_linkto_o_rev'] = 'lista de versiones'; +$lang['rss_linkto_o_current'] = 'le pagina actual'; +$lang['compression_o_0'] = 'nulle'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'non usar'; +$lang['xsendfile_o_1'] = 'Capite proprietari "lighttpd" (ante version 1.5)'; +$lang['xsendfile_o_2'] = 'Capite standard "X-Sendfile"'; +$lang['xsendfile_o_3'] = 'Capite proprietari "X-Accel-Redirect" de Nginx'; +$lang['showuseras_o_loginname'] = 'Nomine de usator'; +$lang['showuseras_o_username'] = 'Nomine real del usator'; +$lang['showuseras_o_email'] = 'Adresse de e-mail del usator (offuscate secundo le configuration de Mailguard)'; +$lang['showuseras_o_email_link'] = 'Adresse de e-mail del usator como ligamine "mailto:"'; +$lang['useheading_o_0'] = 'Nunquam'; +$lang['useheading_o_navigation'] = 'Navigation solmente'; +$lang['useheading_o_content'] = 'Contento wiki solmente'; +$lang['useheading_o_1'] = 'Sempre'; diff --git a/lib/plugins/config/lang/id-ni/intro.txt b/lib/plugins/config/lang/id-ni/intro.txt new file mode 100644 index 0000000..cd77caa --- /dev/null +++ b/lib/plugins/config/lang/id-ni/intro.txt @@ -0,0 +1,7 @@ +====== Fakake famöfö'ö ====== + +Plugin da'e itolo ba wangehaogö fakake moroi ba DokuWiki. Fanolo bawamöfö'ö tesöndra tou [[doku>config]]. Lala wangiila Plugin tanöbö'ö tesöndra tou ba [[doku>plugin:config]]. + +Famöfö'ö zura furi la'a soyo no laproteksi, lötesöndra bakha ba Plugin andre. Famöfö'ö zura furi la'a sobalau ya'ia wamöfö'ö sito'ölö... + +Böi olifu ndra'ugö ba wofetugö **Irö'ö** fatua lö öröi fakake wamöfö'ö soguna bawangirö'ö wamöfö'ö safuria. diff --git a/lib/plugins/config/lang/id-ni/lang.php b/lib/plugins/config/lang/id-ni/lang.php new file mode 100644 index 0000000..c30752f --- /dev/null +++ b/lib/plugins/config/lang/id-ni/lang.php @@ -0,0 +1,62 @@ + + * @author Yustinus Waruwu + */ +$lang['renderer_xhtml'] = 'Fake Renderer ba zito\'ölö (XHTML) Wiki-output.'; +$lang['renderer__core'] = '%s (dokuwiki core)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['rss_type'] = 'Tipe XML feed'; +$lang['rss_linkto'] = 'XML feed links khö'; +$lang['rss_content'] = 'Hadia wangoromaö nifake ba XML-Feed?'; +$lang['rss_update'] = 'XML feed (sec) inötö wamohouni'; +$lang['recent_days'] = 'Hawa\'oya laforoma\'ö moroi bazibohou? (Hari)'; +$lang['rss_show_summary'] = 'XML feed foromaö summary ba title'; +$lang['target____wiki'] = 'Lala window ba internal links'; +$lang['target____interwiki'] = 'Lala window ba interwiki links'; +$lang['target____extern'] = 'Lala window ba external links'; +$lang['target____media'] = 'Lala window ba media links'; +$lang['target____windows'] = 'Lala window ba windows links'; +$lang['proxy____host'] = 'Töi server proxy'; +$lang['proxy____port'] = 'Port proxy'; +$lang['proxy____user'] = 'Töi proxy'; +$lang['proxy____pass'] = 'Kode proxy'; +$lang['proxy____ssl'] = 'Fake ssl ba connect awö Proxy'; +$lang['typography_o_0'] = 'lö\'ö'; +$lang['typography_o_1'] = 'Ha sitombua kutip'; +$lang['typography_o_2'] = 'Fefu nikutip (itataria lömohalöwö)'; +$lang['userewrite_o_0'] = 'lö\'ö'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki bakha'; +$lang['deaccent_o_0'] = 'ofolai'; +$lang['deaccent_o_1'] = 'heta aksen'; +$lang['deaccent_o_2'] = 'romanize'; +$lang['gdlib_o_0'] = 'GD Lib lötesöndra'; +$lang['gdlib_o_1'] = 'Versi 1.x'; +$lang['gdlib_o_2'] = 'Otomatis'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstrak'; +$lang['rss_content_o_diff'] = 'Unified Diff'; +$lang['rss_content_o_htmldiff'] = 'HTML formatted diff table'; +$lang['rss_content_o_html'] = 'Fefu HTML format diff table'; +$lang['rss_linkto_o_diff'] = 'foromaö difference'; +$lang['rss_linkto_o_page'] = 'Refisi nga\'örö'; +$lang['rss_linkto_o_rev'] = 'Daftar nihaogö'; +$lang['rss_linkto_o_current'] = 'Nga\'örö safuria'; +$lang['compression_o_0'] = 'Lö\'ö'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'böi fake'; +$lang['xsendfile_o_1'] = 'Proprieteri lighttpd Header (furi Release 1.5)'; +$lang['xsendfile_o_2'] = 'Standar X-Sendfile header'; +$lang['xsendfile_o_3'] = 'Proprieteri Nginx X-Accel-Redirect header'; +$lang['showuseras_o_loginname'] = 'Töi'; +$lang['showuseras_o_username'] = 'Töi safönu'; +$lang['showuseras_o_email'] = 'Fake döi imele (obfuscated according to mailguard setting)'; +$lang['showuseras_o_email_link'] = 'Fake döi imele sifao mailto: link'; diff --git a/lib/plugins/config/lang/id/intro.txt b/lib/plugins/config/lang/id/intro.txt new file mode 100644 index 0000000..c5a9297 --- /dev/null +++ b/lib/plugins/config/lang/id/intro.txt @@ -0,0 +1,7 @@ +====== Manajemen Konfigurasi ====== + +Gunakan halaman ini untuk mengontrol pengaturan instalasi DokuWiki anda. Untuk bantuan tentang pengaturan individual, lihat [[doku>config]]. Untuk detail lebih lanjut tentang plugin ini lihat [[doku>plugin:config]]. + +Pengaturan yang ditunjukkan dengan latar belakang merah muda dilindungi dan tidak dapat diubah dengan plugin ini. Pengaturan yang ditunjukkan dengan latar belakang biru adalah nilai bawaan (default) dan pengaturan yang ditunjukkan dengan latar belakang putih telah diatur secara lokal oleh anda. Pengaturan biru dan putih dapat diubah. + +Ingatlah untuk menekan tombol **Simpan** sebelum meninggalkan halaman ini, jika tidak perubahan anda akan hilang. \ No newline at end of file diff --git a/lib/plugins/config/lang/is/lang.php b/lib/plugins/config/lang/is/lang.php new file mode 100644 index 0000000..eef4fbc --- /dev/null +++ b/lib/plugins/config/lang/is/lang.php @@ -0,0 +1,58 @@ + + * @author Ólafur Gunnlaugsson + * @author Erik Bjørn Pedersen + */ +$lang['menu'] = 'Stillingar'; +$lang['error'] = 'Stillingum ekki breitt þar sem rangar upplýsingar voru settar inn, vinsamlegast yfirfarið stillingar merktar með rauðu'; +$lang['updated'] = 'Stillingum breitt'; +$lang['nochoice'] = '(engir aðrir valmöguleikar fyrir hendi)'; +$lang['_display'] = 'Skjástillingar'; +$lang['_anti_spam'] = 'Stillingar gegn ruslpósti'; +$lang['_editing'] = 'Útgáfastillingar'; +$lang['title'] = 'Heiti wikis'; +$lang['lang'] = 'Tungumál'; +$lang['template'] = 'Mát'; +$lang['recent'] = 'Nýlegar breytingar'; +$lang['breadcrumbs'] = 'Fjöldi brauðmolar'; +$lang['youarehere'] = 'Stigveldisá brauðmolar'; +$lang['typography'] = 'Gera stað fyrir leturgerðir'; +$lang['dformat'] = 'Dagsetningarsnið (sjá PHP-aðgerð strftime)'; +$lang['signature'] = 'Undirskrift'; +$lang['passcrypt'] = 'Dulritunaraðferð aðgangsorðs'; +$lang['defaultgroup'] = 'Sjálfgefinn hópur'; +$lang['superuser'] = 'Hópur kerfisstjóra '; +$lang['profileconfirm'] = 'Staðfestu breytingar með aðgangsorði'; +$lang['gdlib'] = 'Útgáfa af GD Lib'; +$lang['jpg_quality'] = 'JPG gæðastilling (0-100)'; +$lang['mailfrom'] = 'Rafpóstfang fyrir sjálfvirkar póstsendingar'; +$lang['proxy____host'] = 'Heiti staðgengilsþjóns'; +$lang['proxy____port'] = 'Staðgengilstengi'; +$lang['proxy____user'] = 'Staðgengill notendanafn'; +$lang['proxy____pass'] = 'Staðgengilsaðgangsorð'; +$lang['proxy____ssl'] = 'Nýta SSL til að tengjast staðgengill'; +$lang['license_o_'] = 'Ekkert valið'; +$lang['typography_o_0'] = 'engin'; +$lang['userewrite_o_0'] = 'engin'; +$lang['deaccent_o_0'] = 'slökkt'; +$lang['deaccent_o_1'] = 'fjarlægja broddi'; +$lang['deaccent_o_2'] = 'gera rómverskt'; +$lang['gdlib_o_0'] = 'GD Lib ekki til staðar'; +$lang['gdlib_o_1'] = 'Útgáfa 1,x'; +$lang['gdlib_o_2'] = 'Sjálfvirk leit'; +$lang['rss_type_o_rss'] = 'RSS 0,91'; +$lang['rss_type_o_rss1'] = 'RSS 1,0'; +$lang['rss_type_o_rss2'] = 'RSS 2,0'; +$lang['rss_type_o_atom'] = 'Atom 0,3'; +$lang['rss_type_o_atom1'] = 'Atom 1,0'; +$lang['compression_o_0'] = 'engin'; +$lang['showuseras_o_loginname'] = 'Innskránafn'; +$lang['showuseras_o_username'] = 'Fullt notendanafn'; +$lang['useheading_o_0'] = 'Aldrei'; +$lang['useheading_o_1'] = 'Alltaf'; diff --git a/lib/plugins/config/lang/it/intro.txt b/lib/plugins/config/lang/it/intro.txt new file mode 100644 index 0000000..02984ba --- /dev/null +++ b/lib/plugins/config/lang/it/intro.txt @@ -0,0 +1,7 @@ +====== Configurazione Wiki ====== + +Usa questa pagina per gestire la configurazione della tua installazione DokuWiki. Per la guida sulle singole impostazioni fai riferimento alla pagina [[doku>config|Configurazione]]. Per ulteriori dettagli su questo plugin vedi [[doku>plugin:config|Plugin di configurazione]]. + +Le impostazioni con lo sfondo rosso chiaro sono protette e non possono essere modificate con questo plugin. Le impostazioni con lo sfondo blu contengono i valori predefiniti, e le impostazioni con lo sfondo bianco sono relative solo a questa particolare installazione. Sia le impostazioni su sfondo blu che quelle su sfondo bianco possono essere modificate. + +Ricordati di premere il pulsante **SALVA** prima di lasciare questa pagina altrimenti le modifiche andranno perse. diff --git a/lib/plugins/config/lang/it/lang.php b/lib/plugins/config/lang/it/lang.php new file mode 100644 index 0000000..8fecc0e --- /dev/null +++ b/lib/plugins/config/lang/it/lang.php @@ -0,0 +1,224 @@ + + * @author Dario + * @author Filippo + * @author Roberto Bellingeri + * @author Eddy + * @author Riccardo + * @author Stefano + * @author damiano + * @author Torpedo + * @author Christopher Smith + * @author Silvia Sargentoni + * @author Pietro Battiston + * @author Lorenzo Breda + * @author robocap + * @author Jacopo Corbetta + * @author Matteo Pasotti + * @author Paolo + */ +$lang['menu'] = 'Configurazione Wiki'; +$lang['error'] = 'Impostazioni non aggiornate a causa di un valore non corretto, controlla le modifiche apportate e salva di nuovo. +
    I valori non corretti sono evidenziati da un riquadro rosso.'; +$lang['updated'] = 'Aggiornamento impostazioni riuscito.'; +$lang['nochoice'] = '(nessun\'altra scelta disponibile)'; +$lang['locked'] = 'Il file di configurazione non può essere aggiornato, se questo non è intenzionale,
    +assicurati che il nome e i permessi del file contenente la configurazione locale siano corretti.'; +$lang['danger'] = 'Attenzione: cambiare questa opzione può rendere inaccessibile il wiki e il menu di configurazione.'; +$lang['warning'] = 'Avviso: cambiare questa opzione può causare comportamenti indesiderati.'; +$lang['security'] = 'Avviso di sicurezza: vambiare questa opzione può esporre a rischi di sicurezza.'; +$lang['_configuration_manager'] = 'Configurazione Wiki'; +$lang['_header_dokuwiki'] = 'Impostazioni DokuWiki'; +$lang['_header_plugin'] = 'Impostazioni Plugin'; +$lang['_header_template'] = 'Impostazioni Modello'; +$lang['_header_undefined'] = 'Impostazioni non definite'; +$lang['_basic'] = 'Impostazioni Base'; +$lang['_display'] = 'Impostazioni Visualizzazione'; +$lang['_authentication'] = 'Impostazioni Autenticazione'; +$lang['_anti_spam'] = 'Impostazioni Anti-Spam'; +$lang['_editing'] = 'Impostazioni Modifica'; +$lang['_links'] = 'Impostazioni Collegamenti'; +$lang['_media'] = 'Impostazioni File'; +$lang['_notifications'] = 'Impostazioni di notifica'; +$lang['_syndication'] = 'Impostazioni di collaborazione'; +$lang['_advanced'] = 'Impostazioni Avanzate'; +$lang['_network'] = 'Impostazioni Rete'; +$lang['_msg_setting_undefined'] = 'Nessun metadato definito.'; +$lang['_msg_setting_no_class'] = 'Nessuna classe definita.'; +$lang['_msg_setting_no_known_class'] = 'Classe di impostazioni non disponibile.'; +$lang['_msg_setting_no_default'] = 'Nessun valore predefinito.'; +$lang['title'] = 'Titolo del wiki'; +$lang['start'] = 'Nome della pagina iniziale'; +$lang['lang'] = 'Lingua'; +$lang['template'] = 'Modello'; +$lang['tagline'] = 'Tagline (se il template lo supporta)'; +$lang['sidebar'] = 'Nome pagina in barra laterale (se il template lo supporta), il campo vuoto disabilita la barra laterale'; +$lang['license'] = 'Sotto quale licenza vorresti rilasciare il tuo contenuto?'; +$lang['savedir'] = 'Directory per il salvataggio dei dati'; +$lang['basedir'] = 'Directory di base'; +$lang['baseurl'] = 'URL di base'; +$lang['cookiedir'] = 'Percorso cookie. Lascia in bianco per usare baseurl.'; +$lang['dmode'] = 'Permessi per le nuove directory'; +$lang['fmode'] = 'Permessi per i nuovi file'; +$lang['allowdebug'] = 'Abilita il debug (disabilitare se non serve!)'; +$lang['recent'] = 'Ultime modifiche'; +$lang['recent_days'] = 'Quante modifiche recenti tenere (giorni)'; +$lang['breadcrumbs'] = 'Numero di breadcrumb'; +$lang['youarehere'] = 'Breadcrumb gerarchici'; +$lang['fullpath'] = 'Mostra il percorso completo delle pagine'; +$lang['typography'] = 'Abilita la sostituzione tipografica'; +$lang['dformat'] = 'Formato delle date (vedi la funzione strftime di PHP)'; +$lang['signature'] = 'Firma'; +$lang['showuseras'] = 'Cosa visualizzare quando si mostra l\'ultimo utente che ha modificato una pagina'; +$lang['toptoclevel'] = 'Livello superiore per l\'indice'; +$lang['tocminheads'] = 'Ammontare minimo di intestazioni che determinano la creazione del TOC'; +$lang['maxtoclevel'] = 'Numero massimo di livelli per l\'indice'; +$lang['maxseclevel'] = 'Livello massimo per le sezioni modificabili'; +$lang['camelcase'] = 'Usa CamelCase per i collegamenti'; +$lang['deaccent'] = 'Pulizia dei nomi di pagina'; +$lang['useheading'] = 'Usa la prima intestazione come nome di pagina'; +$lang['sneaky_index'] = 'Normalmente, DokuWiki mostra tutte le categorie nella vista indice. Abilitando questa opzione, saranno nascoste quelle per cui l\'utente non ha il permesso in lettura. Questo potrebbe far sì che alcune sottocategorie accessibili siano nascoste. La pagina indice potrebbe quindi diventare inutilizzabile con alcune configurazioni dell\'ACL.'; +$lang['hidepages'] = 'Nascondi le pagine che soddisfano la condizione (inserire un\'espressione regolare)'; +$lang['useacl'] = 'Usa lista di controllo accessi (ACL)'; +$lang['autopasswd'] = 'Genera password in automatico'; +$lang['authtype'] = 'Sistema di autenticazione'; +$lang['passcrypt'] = 'Metodo di cifratura password'; +$lang['defaultgroup'] = 'Gruppo predefinito'; +$lang['superuser'] = 'Amministratore - gruppo, utente o elenco di utenti separati da virgole (user1,@group1,user2) con accesso completo a tutte le pagine e le funzioni che riguardano le impostazioni ACL'; +$lang['manager'] = 'Gestore - gruppo, utente o elenco di utenti separati da virgole (user1,@group1,user2) con accesso a determinate funzioni di gestione'; +$lang['profileconfirm'] = 'Richiedi la password per modifiche al profilo'; +$lang['rememberme'] = 'Permetti i cookies di accesso permanenti (ricordami)'; +$lang['disableactions'] = 'Disabilita azioni DokuWiki'; +$lang['disableactions_check'] = 'Controlla'; +$lang['disableactions_subscription'] = 'Sottoscrivi/Rimuovi sottoscrizione'; +$lang['disableactions_wikicode'] = 'Mostra sorgente/Esporta Raw'; +$lang['disableactions_profile_delete'] = 'Elimina il proprio account'; +$lang['disableactions_other'] = 'Altre azioni (separate da virgola)'; +$lang['disableactions_rss'] = 'XML Syndication (RSS)'; +$lang['auth_security_timeout'] = 'Tempo di sicurezza per l\'autenticazione (secondi)'; +$lang['securecookie'] = 'Devono i cookies impostati tramite HTTPS essere inviati al browser solo tramite HTTPS? Disattiva questa opzione solo quando l\'accesso al tuo wiki viene effettuato con il protocollo SSL ma la navigazione del wiki non risulta sicura.'; +$lang['remote'] = 'Abilita il sistema di API remoto. Questo permette ad altre applicazioni di accedere al wiki tramite XML-RPC o altri meccanismi.'; +$lang['remoteuser'] = 'Restringi l\'accesso dell\'aPI remota ai gruppi o utenti qui specificati separati da virgola. Lascia vuoto per dare accesso a chiunque.'; +$lang['usewordblock'] = 'Blocca lo spam in base alla blacklist'; +$lang['relnofollow'] = 'Usa rel="nofollow" nei collegamenti esterni'; +$lang['indexdelay'] = 'Intervallo di tempo prima dell\'indicizzazione'; +$lang['mailguard'] = 'Oscuramento indirizzi email'; +$lang['iexssprotect'] = 'Controlla i file caricati in cerca di possibile codice JavaScript o HTML maligno.'; +$lang['usedraft'] = 'Salva una bozza in automatico in fase di modifica'; +$lang['locktime'] = 'Durata dei file di lock (sec)'; +$lang['cachetime'] = 'Durata della cache (sec)'; +$lang['target____wiki'] = 'Finestra di destinazione per i collegamenti interni'; +$lang['target____interwiki'] = 'Finestra di destinazione per i collegamenti interwiki'; +$lang['target____extern'] = 'Finestra di destinazione per i collegamenti esterni'; +$lang['target____media'] = 'Finestra di destinazione per i collegamenti ai file'; +$lang['target____windows'] = 'Finestra di destinazione per i collegamenti alle risorse condivise'; +$lang['mediarevisions'] = 'Abilita Mediarevisions?'; +$lang['refcheck'] = 'Controlla i riferimenti ai file'; +$lang['gdlib'] = 'Versione GD Lib '; +$lang['im_convert'] = 'Percorso per il convertitore di ImageMagick'; +$lang['jpg_quality'] = 'Qualità di compressione JPG (0-100)'; +$lang['fetchsize'] = 'Dimensione massima (bytes) scaricabile da fetch.php da extern'; +$lang['subscribers'] = 'Permetti agli utenti la sottoscrizione alle modifiche delle pagine via e-mail'; +$lang['subscribe_time'] = 'Tempo dopo il quale le liste di sottoscrizione e i riassunti vengono inviati (sec); Dovrebbe essere inferiore al tempo specificato in recent_days.'; +$lang['notify'] = 'Invia notifiche sulle modifiche a questo indirizzo'; +$lang['registernotify'] = 'Invia informazioni sui nuovi utenti registrati a questo indirizzo email'; +$lang['mailfrom'] = 'Mittente per le mail automatiche'; +$lang['mailreturnpath'] = 'Indirizzo email destinatario per notifica di mancati recapiti'; +$lang['mailprefix'] = 'Prefisso da inserire nell\'oggetto delle mail automatiche'; +$lang['htmlmail'] = 'Invia email HTML multipart più gradevoli ma più ingombranti in dimensione. Disabilita per mail in puro testo.'; +$lang['dontlog'] = 'Disabilita la registrazione per questi tipi di log.'; +$lang['sitemap'] = 'Genera una sitemap Google (giorni)'; +$lang['rss_type'] = 'Tipo di feed XML'; +$lang['rss_linkto'] = 'Collega i feed XML a'; +$lang['rss_content'] = 'Cosa mostrare negli elementi dei feed XML?'; +$lang['rss_update'] = 'Intervallo di aggiornamento dei feed XML (sec)'; +$lang['rss_show_summary'] = 'I feed XML riportano un sommario nel titolo'; +$lang['rss_show_deleted'] = 'Feed XML mostra feed cancellati'; +$lang['rss_media'] = 'Quale tipo di cambiamento dovrebbe essere elencato nel feed XML?'; +$lang['rss_media_o_both'] = 'entrambi'; +$lang['rss_media_o_pages'] = 'pagine'; +$lang['rss_media_o_media'] = 'media'; +$lang['updatecheck'] = 'Controllare aggiornamenti e avvisi di sicurezza? DokuWiki deve contattare update.dokuwiki.org per questa funzione.'; +$lang['userewrite'] = 'Usa il rewrite delle URL'; +$lang['useslash'] = 'Usa la barra rovescia (slash) come separatore nelle URL'; +$lang['sepchar'] = 'Separatore di parole nei nomi di pagina'; +$lang['canonical'] = 'Usa URL canoniche'; +$lang['fnencode'] = 'Metodo per codificare i filenames non-ASCII.'; +$lang['autoplural'] = 'Controlla il plurale nei collegamenti'; +$lang['compression'] = 'Usa la compressione per i file dell\'archivio'; +$lang['gzip_output'] = 'Usa il Content-Encoding gzip per xhtml'; +$lang['compress'] = 'Comprimi i file CSS e javascript'; +$lang['cssdatauri'] = 'Dimensione massima in byte di un\'immagine che può essere integrata nel CSS per ridurre l\'overhead delle richieste HTTP. Da 400 a 600 bytes è un buon valore. Impostare a 0 per disabilitare.'; +$lang['send404'] = 'Invia "HTTP 404/Pagina non trovata" per le pagine inesistenti'; +$lang['broken_iua'] = 'La funzione ignore_user_abort non funziona sul tuo sistema? Questo potrebbe far sì che l\'indice di ricerca sia inutilizzabile. È noto che nella configurazione IIS+PHP/CGI non funziona. Vedi ilBug 852 per maggiori informazioni.'; +$lang['xsendfile'] = 'Usare l\'header X-Sendfile per permettere al webserver di fornire file statici? Questa funzione deve essere supportata dal tuo webserver.'; +$lang['renderer_xhtml'] = 'Renderer da usare per la visualizzazione del wiki (xhtml)'; +$lang['renderer__core'] = '%s (dokuwiki)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['search_nslimit'] = 'Limita la ricerca agli attuali spazi dei nomi X. Quando una ricerca viene eseguita da una pagina all\'interno di uno spazio dei nomi più profondo, i primi spazi dei nomi X verranno aggiunti come filtro'; +$lang['search_fragment'] = 'Specificare il comportamento di ricerca del frammento predefinito'; +$lang['search_fragment_o_exact'] = 'esatto'; +$lang['search_fragment_o_starts_with'] = 'inizia con'; +$lang['search_fragment_o_ends_with'] = 'finisce con'; +$lang['search_fragment_o_contains'] = 'contiene'; +$lang['trustedproxy'] = 'Proxy di inoltro di fiducia che corrispondono a questa espressione regolare sul vero IP del client che riportano. L\'impostazione predefinita corrisponde alle reti locali. Lascia vuoto per non fidarti di nessun proxy.'; +$lang['_feature_flags'] = 'Segnalazione di feature'; +$lang['defer_js'] = 'Rimanda l\'esecuzione di JavaScript dopo che l\'HTML della pagina è stato analizzato. Migliora la velocità della pagina percepita ma potrebbe interrompere un piccolo numero di plugin.'; +$lang['dnslookups'] = 'Dokuwiki farà il lookup dei nomi host per ricavare l\'indirizzo IP remoto degli utenti che modificano le pagine. Se hai un DNS lento o non funzionante o se non vuoi questa funzione, disabilita l\'opzione'; +$lang['jquerycdn'] = 'Vuoi che gli script jQuery e jQuery UI siano caricati da una CDN? Questo richiederà richieste HTTP aggiuntive ma i file potrebbero caricarsi più velocemente e gli utenti potrebbero averli già in cache.'; +$lang['jquerycdn_o_0'] = 'Nessuna CDN, solo consegna locale'; +$lang['jquerycdn_o_jquery'] = 'CDN presso code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN presso cdnjs.com'; +$lang['proxy____host'] = 'Nome server proxy'; +$lang['proxy____port'] = 'Porta proxy'; +$lang['proxy____user'] = 'Nome utente proxy'; +$lang['proxy____pass'] = 'Password proxy'; +$lang['proxy____ssl'] = 'Usa SSL per connetterti al proxy'; +$lang['proxy____except'] = 'Espressioni regolari per far corrispondere le URLs per i quali i proxy dovrebbero essere ommessi.'; +$lang['license_o_'] = 'Nessuna scelta'; +$lang['typography_o_0'] = 'nessuno'; +$lang['typography_o_1'] = 'Solo virgolette'; +$lang['typography_o_2'] = 'Tutti (potrebbe non funzionare sempre)'; +$lang['userewrite_o_0'] = 'nessuno'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki'; +$lang['deaccent_o_0'] = 'disabilitata'; +$lang['deaccent_o_1'] = 'rimuovi gli accenti'; +$lang['deaccent_o_2'] = 'romanizza'; +$lang['gdlib_o_0'] = 'GD Lib non disponibile'; +$lang['gdlib_o_1'] = 'Versione 1.x'; +$lang['gdlib_o_2'] = 'Rileva automaticamente'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Sunto'; +$lang['rss_content_o_diff'] = 'Diff unificata'; +$lang['rss_content_o_htmldiff'] = 'Tabella delle diff formattata HTML'; +$lang['rss_content_o_html'] = 'Tutto il contenuto della pagina in HTML'; +$lang['rss_linkto_o_diff'] = 'vista differenze'; +$lang['rss_linkto_o_page'] = 'pagina revisionata'; +$lang['rss_linkto_o_rev'] = 'elenco revisioni'; +$lang['rss_linkto_o_current'] = 'pagina attuale'; +$lang['compression_o_0'] = 'nessuna'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'non usare'; +$lang['xsendfile_o_1'] = 'Header proprietario lighttpd (prima della versione 1.5)'; +$lang['xsendfile_o_2'] = 'Header standard X-Sendfile'; +$lang['xsendfile_o_3'] = 'Header proprietario Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Nome utente'; +$lang['showuseras_o_username'] = 'Nome completo dell\'utente'; +$lang['showuseras_o_username_link'] = 'Nome completo dell\'utente come link interwiki'; +$lang['showuseras_o_email'] = 'Indirizzo email dell\'utente (offuscato in base alle impostazioni di sicurezza posta)'; +$lang['showuseras_o_email_link'] = 'Indirizzo email dell\'utente come collegamento mailto:'; +$lang['useheading_o_0'] = 'Mai'; +$lang['useheading_o_navigation'] = 'Solo navigazione'; +$lang['useheading_o_content'] = 'Solo contenuto wiki'; +$lang['useheading_o_1'] = 'Sempre'; +$lang['readdircache'] = 'Tempo massimo per le readdir cache (sec)'; diff --git a/lib/plugins/config/lang/ja/intro.txt b/lib/plugins/config/lang/ja/intro.txt new file mode 100644 index 0000000..29e3e75 --- /dev/null +++ b/lib/plugins/config/lang/ja/intro.txt @@ -0,0 +1,11 @@ +====== 設定管理 ====== + +この画面で、Dokuwikiの設定を管理することが出来ます。 +個々の設定に関しては[[doku>ja:config|DokuWiki の設定]]を参照してください。 +このプラグインに関する詳細な情報は[[doku>ja:plugin:config|設定管理プラグイン]]を参照してください。 + +背景が薄い赤の場合、その設定は保護されており、本プラグインを通して変更することは出来ません。 +背景が青の場合はデフォルト設定、背景が白の場合はサイト固有の設定になっており、どちらの場合でも変更が可能です。 + +設定の変更後は必ず **保存** ボタンを押して変更を確定してください。 +ボタンを押さなかった場合、変更は破棄されます。 diff --git a/lib/plugins/config/lang/ja/lang.php b/lib/plugins/config/lang/ja/lang.php new file mode 100644 index 0000000..32bf20e --- /dev/null +++ b/lib/plugins/config/lang/ja/lang.php @@ -0,0 +1,217 @@ + + * @author HokkaidoPerson + * @author lempel + * @author Yuji Takenaka + * @author Christopher Smith + * @author Ikuo Obataya + * @author Daniel Dupriest + * @author Kazutaka Miyasaka + * @author Taisuke Shimamoto + * @author Satoshi Sahara + * @author Hideaki SAWADA + */ +$lang['menu'] = 'サイト設定'; +$lang['error'] = '不正な値が存在するため、設定は更新されませんでした。入力値を確認してから、再度更新してください。 +
    不正な値が入力されている項目は赤い線で囲まれています。'; +$lang['updated'] = '設定は正しく更新されました。'; +$lang['nochoice'] = '(他の選択肢はありません)'; +$lang['locked'] = '設定用ファイルを更新できません。もし意図して変更不可にしているのでなければ、
    + ローカル設定ファイルの名前と権限を確認して下さい。'; +$lang['danger'] = '危険:この設定を変更するとウィキや設定管理画面にアクセスできなくなる恐れがあります。'; +$lang['warning'] = '注意:この設定を変更すると意図しない動作につながる可能性があります。'; +$lang['security'] = 'セキュリティ警告:この設定を変更するとセキュリティに悪影響する恐れがあります。'; +$lang['_configuration_manager'] = '設定管理'; +$lang['_header_dokuwiki'] = 'DokuWiki'; +$lang['_header_plugin'] = 'プラグイン'; +$lang['_header_template'] = 'テンプレート'; +$lang['_header_undefined'] = 'その他'; +$lang['_basic'] = '基本'; +$lang['_display'] = '表示'; +$lang['_authentication'] = '認証'; +$lang['_anti_spam'] = 'スパム対策'; +$lang['_editing'] = '編集'; +$lang['_links'] = 'リンク'; +$lang['_media'] = 'メディア'; +$lang['_notifications'] = '通知設定'; +$lang['_syndication'] = '配信設定(RSS)'; +$lang['_advanced'] = '高度な設定'; +$lang['_network'] = 'ネットワーク'; +$lang['_msg_setting_undefined'] = '設定のためのメタデータがありません。'; +$lang['_msg_setting_no_class'] = '設定クラスがありません。'; +$lang['_msg_setting_no_known_class'] = 'クラス設定が利用出来ません。'; +$lang['_msg_setting_no_default'] = '初期値が設定されていません。'; +$lang['title'] = 'Wikiタイトル(あなたのWikiの名前)'; +$lang['start'] = 'スタートページ名(各名前空間の始点として使われるページ名)'; +$lang['lang'] = '使用言語'; +$lang['template'] = 'テンプレート(Wikiのデザイン)'; +$lang['tagline'] = 'キャッチフレーズ(テンプレートが対応している場合に有効)'; +$lang['sidebar'] = 'サイドバー用ページ名(テンプレートが対応している場合に有効。空欄でサイドバーを無効化します。)'; +$lang['license'] = '作成した内容をどのライセンスでリリースするか'; +$lang['savedir'] = 'データ保存用のディレクトリ'; +$lang['basedir'] = 'サーバのパス (例: /dokuwiki/)
    空欄にすると自動的に検出します。'; +$lang['baseurl'] = 'サーバの URL (例: http://www.yourserver.com)
    空欄にすると自動的に検出します。'; +$lang['cookiedir'] = 'Cookie のパス(空欄にすると baseurl を使用します。)'; +$lang['dmode'] = 'フォルダ作成マスク'; +$lang['fmode'] = 'ファイル作成マスク'; +$lang['allowdebug'] = 'デバッグモード(必要で無いときは無効にしてください)'; +$lang['recent'] = '最近の変更で1ページごとに表示する数'; +$lang['recent_days'] = '最近の変更とする期間(日数)'; +$lang['breadcrumbs'] = 'トレース(パンくず)表示数(0で無効化します)'; +$lang['youarehere'] = '現在位置を表示(こちらをオンにする場合、恐らく、上のオプションをオフにしたいとも思うでしょう)'; +$lang['fullpath'] = 'ページのフッターに絶対パスを表示'; +$lang['typography'] = 'タイポグラフィー変換'; +$lang['dformat'] = '日付フォーマット(PHPのstrftime関数を参照)'; +$lang['signature'] = 'エディターの署名ボタンで挿入する内容'; +$lang['showuseras'] = '最終編集者の情報として表示する内容'; +$lang['toptoclevel'] = '目次のトップレベル見出し'; +$lang['tocminheads'] = '目次を生成する最小見出し数'; +$lang['maxtoclevel'] = '目次に表示する最大レベルの見出し'; +$lang['maxseclevel'] = '部分編集を有効にする最大レベルの見出し'; +$lang['camelcase'] = 'キャメルケースリンクを使う'; +$lang['deaccent'] = 'ページ名の変換方法'; +$lang['useheading'] = '最初の見出しをページ名とする'; +$lang['sneaky_index'] = 'デフォルトでは索引にすべての名前空間を表示しますが、このオプションを有効にすると、ユーザーに閲覧権限のない名前空間を非表示にします。ただし、閲覧が可能な副名前空間まで表示されなくなるため、ACLの設定が適正でない場合は索引機能が使えなくなる場合があります。'; +$lang['hidepages'] = '検索、サイトマップ、その他の自動インデックスの結果に表示しないページ'; +$lang['useacl'] = 'アクセス管理(ACL)を行う'; +$lang['autopasswd'] = 'パスワードの自動生成'; +$lang['authtype'] = '認証方法'; +$lang['passcrypt'] = '暗号化方法'; +$lang['defaultgroup'] = 'デフォルトグループ(全てのユーザーがこのグループに属します。)'; +$lang['superuser'] = 'スーパーユーザー(ACL設定に関わらず全てのページと機能へのアクセス権を有します。グループ、ユーザー、もしくはそれらをカンマ区切りしたリスト(例:user1,@group1,user2)を入力して下さい。)'; +$lang['manager'] = 'マネージャー(特定の管理機能へのアクセス権を有します。グループ、ユーザー、もしくはそれらをカンマ区切りしたリスト(例:user1,@group1,user2)を入力して下さい。)'; +$lang['profileconfirm'] = 'プロフィール変更時に現在のパスワードを要求'; +$lang['rememberme'] = 'ログイン用クッキーを永久に保持することを許可(ログインを保持)'; +$lang['disableactions'] = 'DokuWiki の動作を無効にする'; +$lang['disableactions_check'] = 'チェック'; +$lang['disableactions_subscription'] = '変更履歴配信の登録・解除'; +$lang['disableactions_wikicode'] = 'ソース閲覧 / 生データ出力'; +$lang['disableactions_profile_delete'] = '自分のアカウントの抹消'; +$lang['disableactions_other'] = 'その他の動作(カンマ区切り)'; +$lang['disableactions_rss'] = 'XML 配信(RSS)'; +$lang['auth_security_timeout'] = '認証タイムアウト設定(秒)'; +$lang['securecookie'] = 'クッキーをHTTPSにてセットする場合は、ブラウザよりHTTPS経由で送信された場合にみに制限する(ログインのみをSSLで行う場合は、この機能を無効にしてください。)'; +$lang['remote'] = 'リモートAPIを有効化(有効化するとXML-RPCまたは他の手段でwikiにアプリケーションがアクセスすることを許可します。)'; +$lang['remoteuser'] = 'リモートAPIへのアクセス許可(カンマ区切りで指定されたグループ、またはユーザーに対してのみ許可します。空白の場合は、すべてのユーザにアクセスを許可します。)'; +$lang['usewordblock'] = '単語リストに基づくスパムブロック'; +$lang['relnofollow'] = '外部リンクにrel="ugc nofollow"を付加'; +$lang['indexdelay'] = 'インデックスを許可(何秒後)'; +$lang['mailguard'] = 'メールアドレス保護'; +$lang['iexssprotect'] = 'アップロードファイルに悪意のあるJavaScriptやHTMLが含まれていないかチェックする'; +$lang['usedraft'] = '編集中の自動保存(ドラフト)機能を使用'; +$lang['locktime'] = 'ファイルロック期限(秒)'; +$lang['cachetime'] = 'キャッシュ保持時間(秒)'; +$lang['target____wiki'] = '内部リンクのtarget属性'; +$lang['target____interwiki'] = 'InterWikiリンクのtarget属性'; +$lang['target____extern'] = '外部リンクのtarget属性'; +$lang['target____media'] = 'メディアリンクのtarget属性'; +$lang['target____windows'] = 'Windowsリンクのtarget属性'; +$lang['mediarevisions'] = 'メディアファイルの履歴を有効にする'; +$lang['refcheck'] = 'メディアファイルを削除する前に、それがまだ使われているかどうかチェックする'; +$lang['gdlib'] = 'GDlibバージョン'; +$lang['im_convert'] = 'ImageMagick変換ツールへのパス'; +$lang['jpg_quality'] = 'JPG圧縮品質(0-100)'; +$lang['fetchsize'] = 'fetch.phpが外部URLからダウンロードする内容(キャッシュ保存や、外部イメージのリサイズなど)の最大サイズ(バイト数指定)'; +$lang['subscribers'] = 'ユーザーがEメールで更新通知を受ける機能を有効にする'; +$lang['subscribe_time'] = '購読リストと概要を送信する期間(秒)
    「最近の変更とする期間(recent_days)」で指定した期間より小さくしてください。'; +$lang['notify'] = '変更を常に通知する送信先メールアドレス'; +$lang['registernotify'] = '新規ユーザー登録を常に通知する送信先メールアドレス'; +$lang['mailfrom'] = 'メール自動送信時の送信元アドレス'; +$lang['mailreturnpath'] = '不届き通知を受け取るメールアドレス'; +$lang['mailprefix'] = '自動メールの題名に使用する接頭語(空欄の場合、Wikiタイトルが使用されます。)'; +$lang['htmlmail'] = 'メールをテキスト形式ではなく、HTML形式で送信する(見た目は良くなりますが、サイズは大きくなります。このオプションを無効にすると、プレーンテキストのみのメールを送信します。)'; +$lang['sitemap'] = 'Googleサイトマップ作成頻度(日数。0で無効化します。)'; +$lang['rss_type'] = 'XMLフィード形式'; +$lang['rss_linkto'] = 'XMLフィード内リンク先'; +$lang['rss_content'] = 'XMLフィードに表示する内容'; +$lang['rss_update'] = 'XMLフィードの更新間隔(秒)'; +$lang['rss_show_summary'] = 'XMLフィードのタイトルに概要を表示'; +$lang['rss_show_deleted'] = '削除されたフィードを含める'; +$lang['rss_media'] = 'XMLフィードで、どんな種類の変更を記載するか'; +$lang['rss_media_o_both'] = '両方'; +$lang['rss_media_o_pages'] = 'ページ'; +$lang['rss_media_o_media'] = 'メディア'; +$lang['updatecheck'] = 'DokuWikiの更新とセキュリティに関する情報をチェックする(この機能は update.dokuwiki.org への接続が必要です。)'; +$lang['userewrite'] = 'URLの書き換え'; +$lang['useslash'] = 'URL上の名前空間の区切りにスラッシュを使用'; +$lang['sepchar'] = 'ページ名の単語区切り文字'; +$lang['canonical'] = 'canonical URL(正準URL)を使用'; +$lang['fnencode'] = '非アスキーファイル名のエンコーディング方法'; +$lang['autoplural'] = 'リンク内での自動複数形処理'; +$lang['compression'] = 'アーカイブファイルの圧縮方法'; +$lang['gzip_output'] = 'xhtmlに対するコンテンツ圧縮(gzip)を使用'; +$lang['compress'] = 'CSSとJavaScriptを圧縮'; +$lang['cssdatauri'] = 'HTTP リクエスト数によるオーバーヘッドを減らすため、CSS ファイルから参照される画像ファイルのサイズがここで指定するバイト数以内の場合は CSS ファイル内に Data URI として埋め込みます。 400 から 600 バイトがちょうどよい値です。0 を指定すると埋め込み処理は行われません。'; +$lang['send404'] = '文書が存在しないページに"HTTP404/Page Not Found"を使用'; +$lang['broken_iua'] = 'お使いのシステムのignore_user_abort関数が故障している場合、このオプションを有効にして下さい。そのままだと、検索インデックスが動作しない可能性があります。IIS+PHP/CGIの組み合わせで破損することが判明しています。詳しくはBug 852を参照してください。'; +$lang['xsendfile'] = 'ウェブサーバーが静的ファイルを生成する際に X-Sendfile ヘッダーを使用する(お使いのウェブサーバーがこの機能をサポートしている必要があります。)'; +$lang['renderer_xhtml'] = 'Wikiの出力(xhtml)に使用するレンダラー'; +$lang['renderer__core'] = '%s (Dokuwikiコア)'; +$lang['renderer__plugin'] = '%s (プラグイン)'; +$lang['search_nslimit'] = '現在の名前空間 X 内のみ検索する
    より下層の名前空間から検索が実行された場合、最初の名前空間 X がフィルターとして追加されます。'; +$lang['search_fragment'] = '部分検索の規定の動作を指定する'; +$lang['search_fragment_o_exact'] = '完全一致'; +$lang['search_fragment_o_starts_with'] = '前方一致'; +$lang['search_fragment_o_ends_with'] = '後方一致'; +$lang['search_fragment_o_contains'] = '部分一致'; +$lang['trustedproxy'] = '報告される真のクライアントIPに関して、ここで指定する正規表現に合う転送プロキシを信頼します。あらゆるプロキシを信頼する場合は、何も入力しないでおいて下さい。'; +$lang['_feature_flags'] = '機能フラグ'; +$lang['defer_js'] = 'ページのHTMLが解析されるまでJavascriptの実行を延期する(ページの読み込み速度が向上しますが、一部のプラグインが正常に動作しない可能性があります)'; +$lang['dnslookups'] = 'ページを編集しているユーザーのIPアドレスからホスト名を逆引きする(利用できるDNSサーバーがない、あるいはこの機能が不要な場合にはオフにします。)'; +$lang['jquerycdn'] = 'コンテンツ・デリバリー・ネットワーク (CDN) の選択(jQuery と jQuery UI スクリプトを CDN からロードさせる場合には、追加的な HTTP リクエストが発生しますが、ブラウザキャッシュが使用されるため、表示速度の向上が期待できます。)'; +$lang['jquerycdn_o_0'] = 'CDN を使用せず、ローカルデリバリーのみ使用する'; +$lang['jquerycdn_o_jquery'] = 'CDN: code.jquery.com を使用'; +$lang['jquerycdn_o_cdnjs'] = 'CDN: cdnjs.com を使用'; +$lang['proxy____host'] = 'プロキシ - サーバー名'; +$lang['proxy____port'] = 'プロキシ - ポート'; +$lang['proxy____user'] = 'プロキシ - ユーザー名'; +$lang['proxy____pass'] = 'プロキシ - パスワード'; +$lang['proxy____ssl'] = 'プロキシへの接続にsslを使用'; +$lang['proxy____except'] = 'スキップするプロキシのURL正規表現'; +$lang['license_o_'] = '選択されていません'; +$lang['typography_o_0'] = '変換しない'; +$lang['typography_o_1'] = '二重引用符(ダブルクオート)のみ'; +$lang['typography_o_2'] = 'すべての引用符(動作しない場合があります)'; +$lang['userewrite_o_0'] = '使用しない'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWikiによる設定'; +$lang['deaccent_o_0'] = '変換しない'; +$lang['deaccent_o_1'] = 'アクセント付きの文字からアクセントを取り除く'; +$lang['deaccent_o_2'] = 'ローマ字化'; +$lang['gdlib_o_0'] = 'GD Libが利用不可'; +$lang['gdlib_o_1'] = 'バージョン 1.x'; +$lang['gdlib_o_2'] = '自動検出'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = '概要'; +$lang['rss_content_o_diff'] = '差分(Unified Diff)'; +$lang['rss_content_o_htmldiff'] = '差分(HTML形式)'; +$lang['rss_content_o_html'] = '完全なHTMLページ'; +$lang['rss_linkto_o_diff'] = '変更点のリスト'; +$lang['rss_linkto_o_page'] = '変更されたページ'; +$lang['rss_linkto_o_rev'] = 'リビジョンのリスト'; +$lang['rss_linkto_o_current'] = '現在のページ'; +$lang['compression_o_0'] = '圧縮しない'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = '使用しない'; +$lang['xsendfile_o_1'] = 'lighttpd ヘッダー(リリース1.5以前)'; +$lang['xsendfile_o_2'] = '標準 X-Sendfile ヘッダー'; +$lang['xsendfile_o_3'] = 'Nginx X-Accel-Redirect ヘッダー'; +$lang['showuseras_o_loginname'] = 'ログイン名'; +$lang['showuseras_o_username'] = 'ユーザーのフルネーム'; +$lang['showuseras_o_username_link'] = 'user という InterWiki リンクになったユーザーのフルネーム'; +$lang['showuseras_o_email'] = 'ユーザーのメールアドレス(メールガード設定による難読化)'; +$lang['showuseras_o_email_link'] = 'ユーザーのメールアドレスをmailtoリンクにする'; +$lang['useheading_o_0'] = '使用しない'; +$lang['useheading_o_navigation'] = 'ナビゲーションのみ'; +$lang['useheading_o_content'] = 'Wikiの内容のみ'; +$lang['useheading_o_1'] = '常に使用する'; +$lang['readdircache'] = 'readdir キャッシュの最大保持期間(秒)'; diff --git a/lib/plugins/config/lang/ko/intro.txt b/lib/plugins/config/lang/ko/intro.txt new file mode 100644 index 0000000..b05264a --- /dev/null +++ b/lib/plugins/config/lang/ko/intro.txt @@ -0,0 +1,7 @@ +====== 환경 설정 관리자 ====== + +설치된 도쿠위키의 설정을 제어하려면 이 페이지를 사용하세요. 개별 설정에 대한 도움말은 [[doku>ko:config]]를 참조하세요. 이 플러그인에 대한 자세한 내용은 [[doku>ko:plugin:config]]를 참조하세요. + +밝은 빨간색 배경으로 보이는 설정은 이 플러그인으로 바꿀 수 없도록 보호되어 있습니다. 파란색 배경으로 보이는 설정은 기본값이며 하얀색 배경으로 보이는 설정은 특정 설치에 대해 로컬로 설정되어 있습니다. 파란색과 하얀색 배경으로 된 설정은 바꿀 수 있습니다. + +이 페이지를 떠나기 전에 **저장** 버튼을 누르지 않으면 바뀜이 사라지는 것에 주의하세요. \ No newline at end of file diff --git a/lib/plugins/config/lang/ko/lang.php b/lib/plugins/config/lang/ko/lang.php new file mode 100644 index 0000000..a993ce0 --- /dev/null +++ b/lib/plugins/config/lang/ko/lang.php @@ -0,0 +1,209 @@ + + * @author merefox + * @author pavement + * @author Traend + * @author Seungheon Song + * @author jk Lee + * @author dongnak + * @author Song Younghwan + * @author Seung-Chul Yoo + * @author erial2 + * @author Myeongjin + * @author S.H. Lee + */ +$lang['menu'] = '환경 설정'; +$lang['error'] = '잘못된 값 때문에 설정을 바꿀 수 없습니다, 바뀜을 검토하고 다시 제출하세요. +
    잘못된 값은 빨간 선으로 둘러싸여 보여집니다.'; +$lang['updated'] = '설정이 성공적으로 바뀌었습니다.'; +$lang['nochoice'] = '(다른 선택은 할 수 없습니다)'; +$lang['locked'] = '설정 파일을 바꿀 수 없습니다, 의도하지 않았다면,
    + 로컬 설정 파일 이름과 권한이 맞는지 확인하세요.'; +$lang['danger'] = '위험: 이 옵션을 바꾸면 위키와 환경 설정 메뉴에 접근할 수 없을 수도 있습니다.'; +$lang['warning'] = '경고: 이 옵션을 바꾸면 의도하지 않는 동작을 일으킬 수 있습니다.'; +$lang['security'] = '보안 경고: 이 옵션을 바꾸면 보안 위험이 있을 수 있습니다.'; +$lang['_configuration_manager'] = '환경 설정 관리자'; +$lang['_header_dokuwiki'] = '도쿠위키'; +$lang['_header_plugin'] = '플러그인'; +$lang['_header_template'] = '템플릿'; +$lang['_header_undefined'] = '정의되지 않은 설정'; +$lang['_basic'] = '기본'; +$lang['_display'] = '보이기'; +$lang['_authentication'] = '인증'; +$lang['_anti_spam'] = '스팸 방지'; +$lang['_editing'] = '편집'; +$lang['_links'] = '링크'; +$lang['_media'] = '미디어'; +$lang['_notifications'] = '알림'; +$lang['_syndication'] = '신디케이션 (RSS)'; +$lang['_advanced'] = '고급'; +$lang['_network'] = '네트워크'; +$lang['_msg_setting_undefined'] = '설정에 메타데이터가 없습니다.'; +$lang['_msg_setting_no_class'] = '설정에 클래스가 없습니다.'; +$lang['_msg_setting_no_default'] = '기본값이 없습니다.'; +$lang['title'] = '위키 제목 (위키 이름)'; +$lang['start'] = '각 이름공간에 시작점으로 사용할 문서 이름'; +$lang['lang'] = '인터페이스 언어'; +$lang['template'] = '템플릿 (위키 디자인)'; +$lang['tagline'] = '태그라인 (템플릿이 지원할 경우)'; +$lang['sidebar'] = '사이드바 문서 이름 (템플릿이 지원할 경우), 필드를 비우면 사이드바를 비활성화'; +$lang['license'] = '내용을 배포할 때 어떤 라이선스에 따라야 합니까?'; +$lang['savedir'] = '데이터를 저장할 디렉터리'; +$lang['basedir'] = '서버 경로 (예 /dokuwiki/). 자동 감지를 하려면 비워 두세요.'; +$lang['baseurl'] = '서버 URL (예 http://www.yourserver.com). 자동 감지를 하려면 비워 두세요.'; +$lang['cookiedir'] = '쿠키 경로. 기본 URL 위치로 지정하려면 비워 두세요.'; +$lang['dmode'] = '디렉터리 만들기 모드'; +$lang['fmode'] = '파일 만들기 모드'; +$lang['allowdebug'] = '디버그 허용. 필요하지 않으면 비활성화하세요!'; +$lang['recent'] = '최근 바뀜에서 문서당 항목 수'; +$lang['recent_days'] = '최근 바뀜을 유지할 기한 (일)'; +$lang['breadcrumbs'] = '이동 경로 "추적" 수. 비활성화하려면 0으로 설정하세요.'; +$lang['youarehere'] = '계층적 이동 경로 사용 (다음에 위 옵션을 비활성화하기를 원할 겁니다)'; +$lang['fullpath'] = '바닥글에 문서의 전체 경로 밝히기'; +$lang['typography'] = '타이포그래피 대체'; +$lang['dformat'] = '날짜 형식 (PHP의 strftime 함수 참고)'; +$lang['signature'] = '편집기에서 서명 버튼을 누를 때 넣을 내용'; +$lang['showuseras'] = '문서를 마지막으로 편집한 사용자를 보여줄지 여부'; +$lang['toptoclevel'] = '목차의 최상위 단계'; +$lang['tocminheads'] = '목차를 넣을 여부를 결정할 최소 문단 수'; +$lang['maxtoclevel'] = '목차의 최대 단계'; +$lang['maxseclevel'] = '문단의 최대 편집 단계'; +$lang['camelcase'] = '링크에 CamelCase 사용'; +$lang['deaccent'] = '문서 이름을 지우는 방법'; +$lang['useheading'] = '문서 이름을 첫 문단 제목으로 사용'; +$lang['sneaky_index'] = '기본적으로, 도쿠위키는 사이트맵에 모든 이름공간을 보여줍니다. 이 옵션을 활성화하면 사용자가 읽기 권한이 없는 이름공간을 숨기게 됩니다. 특정 ACL 설정으로 색인을 사용할 수 없게 할 수 있는 접근할 수 있는 하위 이름공간을 숨기면 설정됩니다.'; +$lang['hidepages'] = '검색, 사이트맵 및 다른 자동 색인에서 이 정규 표현식과 일치하는 문서 숨기기'; +$lang['useacl'] = '접근 제어 목록 (ACL) 사용'; +$lang['autopasswd'] = '자동 생성 비밀번호'; +$lang['authtype'] = '인증 백엔드'; +$lang['passcrypt'] = '비밀번호 암호화 방법'; +$lang['defaultgroup'] = '기본 그룹, 모든 새 사용자는 이 그룹에 속하게 됩니다'; +$lang['superuser'] = '슈퍼유저 - ACL 설정과 상관없이 모든 문서와 기능에 완전히 접근할 수 있는 그룹, 사용자 또는 쉼표로 구분된 목록 사용자1,@그룹1,사용자2'; +$lang['manager'] = '관리자 - 특정 관리 기능에 접근할 수 있는 그룹, 사용자 또는 쉼표로 구분된 목록 사용자1,@그룹1,사용자2'; +$lang['profileconfirm'] = '프로필을 바꿀 때 비밀번호로 확인'; +$lang['rememberme'] = '영구적으로 로그인 쿠키 허용 (기억하기)'; +$lang['disableactions'] = '도쿠위키 동작 비활성화'; +$lang['disableactions_check'] = '검사'; +$lang['disableactions_subscription'] = '구독/구독 취소'; +$lang['disableactions_wikicode'] = '원본 보기/원본 내보내기'; +$lang['disableactions_profile_delete'] = '자신의 계정 삭제'; +$lang['disableactions_other'] = '다른 동작 (쉼표로 구분)'; +$lang['disableactions_rss'] = 'XML 신디케이션 (RSS)'; +$lang['auth_security_timeout'] = '인증 보안 시간 초과 (초)'; +$lang['securecookie'] = 'HTTPS를 통해 설정된 쿠키는 HTTPS를 통해서만 보내져야 합니까? 위키 로그인에만 SSL로 보호하고 위키를 둘러보는 것에는 보호하지 않게 하려면 이 옵션을 비활성화하세요.'; +$lang['remote'] = '원격 API 시스템 활성화. 다른 어플리케이션이 XML-RPC 또는 다른 메커니즘을 통해 위키에 접근할 수 있습니다.'; +$lang['remoteuser'] = '여기에 입력한 쉼표로 구분된 그룹 또는 사용자에게 원격 API 접근을 제한합니다. 모두에게 접근 권한을 주려면 비워 두세요.'; +$lang['usewordblock'] = '낱말 목록을 바탕으로 스팸 막기'; +$lang['relnofollow'] = '바깥 링크에 rel="nofollow" 사용'; +$lang['indexdelay'] = '색인 전 지연 시간 (초)'; +$lang['mailguard'] = '이메일 주소를 알아볼 수 없게 하기'; +$lang['iexssprotect'] = '올린 파일의 악성 자바스크립트, HTML 코드 가능성 여부를 검사'; +$lang['usedraft'] = '편집하는 동안 자동으로 초안 저장'; +$lang['locktime'] = '파일 잠그기에 대한 최대 시간 (초)'; +$lang['cachetime'] = '캐시에 대한 최대 시간 (초)'; +$lang['target____wiki'] = '안쪽 링크에 대한 타겟 창'; +$lang['target____interwiki'] = '인터위키 링크에 대한 타겟 창'; +$lang['target____extern'] = '바깥 링크에 대한 타겟 창'; +$lang['target____media'] = '미디어 링크에 대한 타겟 창'; +$lang['target____windows'] = 'Windows 링크에 대한 타겟 창'; +$lang['mediarevisions'] = '미디어 판을 활성화하겠습니까?'; +$lang['refcheck'] = '미디어 파일을 삭제하기 전에 아직 사용하고 있는지 검사'; +$lang['gdlib'] = 'GD 라이브러리 버전'; +$lang['im_convert'] = 'ImageMagick의 변환 도구의 경로'; +$lang['jpg_quality'] = 'JPG 압축 품질 (0-100)'; +$lang['fetchsize'] = 'fetch.php가 바깥 URL에서 다운로드할 수 있는 최대 크기 (바이트), 예를 들어 바깥 그림을 캐시하고 크기 조절할 때.'; +$lang['subscribers'] = '사용자가 이메일로 문서 바뀜을 구독할 수 있도록 하기'; +$lang['subscribe_time'] = '구독 목록과 요약이 보내질 경과 시간 (초); recent_days에 지정된 시간보다 작아야 합니다.'; +$lang['notify'] = '항상 이 이메일 주소로 바뀜 알림을 보냄'; +$lang['registernotify'] = '항상 이 이메일 주소로 새로 등록한 사용자의 정보를 보냄'; +$lang['mailfrom'] = '자동으로 보내는 메일에 사용할 보내는 사람 이메일 주소'; +$lang['mailreturnpath'] = '배달 불가 안내를 위한 수신자 메일 주소'; +$lang['mailprefix'] = '자동으로 보내는 메일에 사용할 이메일 제목 접두어. 위키 제목을 사용하려면 비워 두세요'; +$lang['htmlmail'] = '보기에는 더 좋지만 크키가 조금 더 큰 HTML 태그가 포함된 이메일을 보내기. 일반 텍스트만으로 된 메일을 보내려면 비활성화하세요.'; +$lang['sitemap'] = 'Google 사이트맵 생성 날짜 빈도 (일). 비활성화하려면 0'; +$lang['rss_type'] = 'XML 피드 형식'; +$lang['rss_linkto'] = 'XML 피드 링크 정보'; +$lang['rss_content'] = 'XML 피드 항목에 보여주는 내용은 무엇입니까?'; +$lang['rss_update'] = 'XML 피드 업데이트 간격 (초)'; +$lang['rss_show_summary'] = 'XML 피드의 제목에서 요악 보여주기'; +$lang['rss_media'] = '어떤 규격으로 XML 피드에 바뀜을 나열해야 합니까?'; +$lang['rss_media_o_both'] = '양방향'; +$lang['rss_media_o_pages'] = '쪽'; +$lang['rss_media_o_media'] = '미디어'; +$lang['updatecheck'] = '업데이트와 보안 경고를 검사할까요? 도쿠위키는 이 기능을 위해 update.dokuwiki.org에 연결이 필요합니다.'; +$lang['userewrite'] = '멋진 URL 사용'; +$lang['useslash'] = 'URL에서 이름공간 구분자로 슬래시 사용'; +$lang['sepchar'] = '문서 이름 낱말 구분자'; +$lang['canonical'] = '완전한 canonical URL 사용'; +$lang['fnencode'] = 'ASCII가 아닌 파일 이름을 인코딩하는 방법.'; +$lang['autoplural'] = '링크에서 복수형 검사'; +$lang['compression'] = '첨부 파일의 압축 방법'; +$lang['gzip_output'] = 'xhtml에 대해 gzip 내용 인코딩 사용'; +$lang['compress'] = 'CSS 및 자바스크립트를 압축하여 출력'; +$lang['cssdatauri'] = 'CSS 파일에서 그림이 참조되는 최대 바이트 크기를 스타일시트에 규정해야 HTTP 요청 헤더 오버헤드 크기를 줄일 수 있습니다. 400에서 600 바이트 정도면 좋은 효율을 가져옵니다. 비활성화하려면 0으로 설정하세요.'; +$lang['send404'] = '존재하지 않는 문서에 "HTTP 404/페이지를 찾을 수 없습니다" 보내기'; +$lang['broken_iua'] = '시스템에서 ignore_user_abort 함수에 문제가 있습니까? 문제가 있다면 검색 색인이 동작하지 않는 원인이 됩니다. 이 함수가 IIS+PHP/CGI에서 문제가 있는 것으로 알려져 있습니다. 자세한 정보는 버그 852를 참조하시기 바랍니다.'; +$lang['xsendfile'] = '웹 서버가 정적 파일을 제공할 수 있도록 X-Sendfile 헤더를 사용하겠습니까? 웹 서버가 이 기능을 지원해야 합니다.'; +$lang['renderer_xhtml'] = '주요 (xhtml) 위키 출력에 사용할 렌더러'; +$lang['renderer__core'] = '%s (도쿠위키 코어)'; +$lang['renderer__plugin'] = '%s (플러그인)'; +$lang['search_nslimit'] = '검색을 현재 X 네임스페이스로 제한하십시오. 더 깊은 네임스페이스 내의 페이지에서 검색을 실행하면 첫 번째 X 네임스페이스가 필터로 추가됩니다.'; +$lang['search_fragment_o_exact'] = '정확한'; +$lang['dnslookups'] = '도쿠위키가 문서를 편집하는 사용자의 원격 IP 주소에 대한 호스트 이름을 조회합니다. 서버가 느리거나 DNS 서버를 작동하지 않거나 이 기능을 원하지 않으면, 이 옵션을 비활성화하세요'; +$lang['jquerycdn'] = '제이쿼리(jQuery)와 제이쿼리UI 스크립트 파일을 컨텐츠전송네트워크(CDN)에서 불러와야만 합니까? 이것은 추가적인 HTTP요청을 합니다. 하지만 파일이 빨리 불러지고 캐쉬에 저장되게 할 수 있습니다.'; +$lang['jquerycdn_o_0'] = '컨텐츠전송네트워크(CDN) 사용 안 함. 로컬 전송만 함'; +$lang['jquerycdn_o_jquery'] = '\'code.jquery.com\' 의 컨텐츠전송네트워크(CDN) 사용'; +$lang['jquerycdn_o_cdnjs'] = '\'cdnjs.com\' 의 컨텐츠전송네트워크(CDN) 사용'; +$lang['proxy____host'] = '프록시 서버 이름'; +$lang['proxy____port'] = '프록시 포트'; +$lang['proxy____user'] = '프록시 사용자 이름'; +$lang['proxy____pass'] = '프록시 비밀번호'; +$lang['proxy____ssl'] = '프록시로 연결하는 데 SSL 사용'; +$lang['proxy____except'] = '프록시가 건너뛰어야 할 일치하는 URL의 정규 표현식.'; +$lang['license_o_'] = '선택하지 않음'; +$lang['typography_o_0'] = '없음'; +$lang['typography_o_1'] = '작은따옴표를 제외'; +$lang['typography_o_2'] = '작은따옴표를 포함 (항상 동작하지 않을 수도 있음)'; +$lang['userewrite_o_0'] = '없음'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = '도쿠위키 내부'; +$lang['deaccent_o_0'] = '끄기'; +$lang['deaccent_o_1'] = '악센트 제거'; +$lang['deaccent_o_2'] = '로마자화'; +$lang['gdlib_o_0'] = 'GD 라이브러리를 사용할 수 없음'; +$lang['gdlib_o_1'] = '버전 1.x'; +$lang['gdlib_o_2'] = '자동 감지'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = '개요'; +$lang['rss_content_o_diff'] = '통합 차이'; +$lang['rss_content_o_htmldiff'] = 'HTML 형식의 차이 표'; +$lang['rss_content_o_html'] = '전체 HTML 페이지 내용'; +$lang['rss_linkto_o_diff'] = '차이 보기'; +$lang['rss_linkto_o_page'] = '개정된 문서'; +$lang['rss_linkto_o_rev'] = '판의 목록'; +$lang['rss_linkto_o_current'] = '현재 문서'; +$lang['compression_o_0'] = '없음'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = '사용하지 않음'; +$lang['xsendfile_o_1'] = '사유 lighttpd 헤더 (릴리스 1.5 이전)'; +$lang['xsendfile_o_2'] = '표준 X-Sendfile 헤더'; +$lang['xsendfile_o_3'] = '사유 Nginx X-Accel-Redirect 헤더'; +$lang['showuseras_o_loginname'] = '로그인 이름'; +$lang['showuseras_o_username'] = '사용자의 실명'; +$lang['showuseras_o_username_link'] = '인터위키 사용자 링크로 된 사용자의 실명'; +$lang['showuseras_o_email'] = '사용자의 이메일 주소 (메일 주소 설정에 따라 안보일 수 있음)'; +$lang['showuseras_o_email_link'] = 'mailto: 링크로 된 사용자의 이메일 주소'; +$lang['useheading_o_0'] = '전혀 없음'; +$lang['useheading_o_navigation'] = '둘러보기에만'; +$lang['useheading_o_content'] = '위키 내용에만'; +$lang['useheading_o_1'] = '항상'; +$lang['readdircache'] = 'readdir 캐시의 최대 시간 (초)'; diff --git a/lib/plugins/config/lang/la/intro.txt b/lib/plugins/config/lang/la/intro.txt new file mode 100644 index 0000000..51d8c3d --- /dev/null +++ b/lib/plugins/config/lang/la/intro.txt @@ -0,0 +1,7 @@ +====== Optionum Administratio ====== + +In hac pagina administratoris optiones mutare et inspicere potes. Auxilia in pagina [[doku>config|conformationis]] sunt, si singulas res uidere uis, i ad paginam [[doku>plugin:config|conformationis]]. + +Optiones ostensae rubro colore tutae et non nunc mutabiles sunt. Optiones ostensae caeruleo colore praecipuae sunt et optiones ostensae in area alba singulares huic uici sunt. Et caerulae et albae optiones mutabiles sunt. + +Memento premere **SERVA** ante quam nouam paginam eas: si hoc non facias, mutata amissa sunt. diff --git a/lib/plugins/config/lang/la/lang.php b/lib/plugins/config/lang/la/lang.php new file mode 100644 index 0000000..f884f18 --- /dev/null +++ b/lib/plugins/config/lang/la/lang.php @@ -0,0 +1,168 @@ + + */ +$lang['menu'] = 'Optiones Administrationis'; +$lang['error'] = 'Optiones non nouatae ob errores: rursum temptat. Errores rubro colore signati sunt.'; +$lang['updated'] = 'Optiones feliciter nouatae.'; +$lang['nochoice'] = '(nulla optio est)'; +$lang['locked'] = 'Optio documenti non nouata est,
    optiones et facultates documenti inspicis.'; +$lang['danger'] = 'CAVE: si has optiones mutabis, in administrationis indicem non inire potes.'; +$lang['warning'] = 'CAVE: si hae optiones mutabis, graues errores erunt.'; +$lang['security'] = 'CAVE: si hae optiones mutabis, graues errores erunt.'; +$lang['_configuration_manager'] = 'Optionum administratio'; +$lang['_header_dokuwiki'] = 'Vicis Optiones'; +$lang['_header_plugin'] = 'Addendorum Optiones'; +$lang['_header_template'] = 'Vicis Formae Optiones'; +$lang['_header_undefined'] = 'Variae Optiones'; +$lang['_basic'] = 'Praecipuae Optiones'; +$lang['_display'] = 'Speciei Optiones'; +$lang['_authentication'] = 'Confirmationis Optiones'; +$lang['_anti_spam'] = 'In Mala Optiones'; +$lang['_editing'] = 'Recensendi Optiones'; +$lang['_links'] = 'Nexi Optiones'; +$lang['_media'] = 'Visiuorum Optiones'; +$lang['_advanced'] = 'Maiores Optiones'; +$lang['_network'] = 'Interretis Optiones'; +$lang['_msg_setting_undefined'] = 'Res codicum sine optionibus.'; +$lang['_msg_setting_no_class'] = 'Classes sine optionibus'; +$lang['_msg_setting_no_default'] = 'Nihil'; +$lang['fmode'] = 'Documentum creandum ratio'; +$lang['dmode'] = 'Scrinia creandam ratio'; +$lang['lang'] = 'Linguae optiones'; +$lang['basedir'] = 'Computatoris seruitoris domicilium (ex. /dokuwiki/). Nihil scribere si id machinatione agnoscere uis.'; +$lang['baseurl'] = 'Computatoris seruitoris VRL (ex. http://www.yourserver.com). Nihil scribere si id machinatione agnoscere uis.'; +$lang['savedir'] = 'Documentorum seruatorum domicilium'; +$lang['start'] = 'Nomen paginae dominicae'; +$lang['title'] = 'Vicis titulus'; +$lang['template'] = 'Vicis forma'; +$lang['license'] = 'Sub quibus legibus uicem creare uin?'; +$lang['fullpath'] = 'Totum domicilium paginae in pedibus scribis.'; +$lang['recent'] = 'Extremae mutationes'; +$lang['breadcrumbs'] = 'Numerus uestigiorum'; +$lang['youarehere'] = 'Ordo uestigiorum'; +$lang['typography'] = 'Signa supponentes'; +$lang['dformat'] = 'Forma diei (uide paginam de diebus)'; +$lang['signature'] = 'Subscriptio'; +$lang['toptoclevel'] = 'Gradus maior tabularum argumentorum'; +$lang['tocminheads'] = 'Minimus numerus capitum'; +$lang['maxtoclevel'] = 'Maximus numerus tabularum argumentorum'; +$lang['maxseclevel'] = 'Maxima pars gradus recensendi'; +$lang['camelcase'] = 'SignaContinua nexis apta facere'; +$lang['deaccent'] = 'Titulus paginarum abrogare'; +$lang['useheading'] = 'Capite primo ut titulo paginae uti'; +$lang['refcheck'] = 'Documenta uisiua inspicere'; +$lang['allowdebug'] = 'ineptum facias si non necessarium! aptum facere'; +$lang['usewordblock'] = 'Malum interretiale ob uerba delere'; +$lang['indexdelay'] = 'Tempus transitum in ordinando (sec)'; +$lang['relnofollow'] = 'rel="nofollow" externis nexis uti'; +$lang['mailguard'] = 'Cursus interretiales abscondere'; +$lang['iexssprotect'] = 'Documenta nouata ob mala JavaScript uel HTML inspicere'; +$lang['showuseras'] = 'Quid, cum Sodalem, qui extremus paginam recensuit, ostendat, scribere'; +$lang['useacl'] = 'Aditus inspectionis indicibus uti'; +$lang['autopasswd'] = 'Tessera machinatione generata'; +$lang['authtype'] = 'Confirmationis finis'; +$lang['passcrypt'] = 'Ratio tesserae tuendae'; +$lang['defaultgroup'] = 'Grex communis'; +$lang['superuser'] = 'Magister\stra - grex, Sodalis uel index diuisus a uigulis sodalis1,@grex,sodalis2 cum plenis facultatibus sine ICA optionum termino'; +$lang['manager'] = 'Administrator - grex, Sodalis uel index diuisus a uigulis sodalis1,@grex,sodalis2 cum certis facultatibus'; +$lang['profileconfirm'] = 'Mutationes tessera confirmanda sunt'; +$lang['disableactions'] = 'Vicis actiones ineptas facere'; +$lang['disableactions_check'] = 'Inspicere'; +$lang['disableactions_subscription'] = 'Inscribe/Delere'; +$lang['disableactions_wikicode'] = 'Fontem uidere/Rudem transcribere'; +$lang['disableactions_other'] = 'Aliae actiones (uirgulis diuisae)'; +$lang['sneaky_index'] = 'Hic uicis omnia genera in indice inserit. Si ineptam hanc optionem facias, solum ea, quae Sodales uidere possunt, in indice erunt. Hoc suggreges et suggenera abscondere potest.'; +$lang['auth_security_timeout'] = 'Confirmationis Tempus (secundis)'; +$lang['securecookie'] = 'Formulae HTTPS mittine solum per HTTPS possunt? Ineptam hanc optio facias, si accessus uicis tutus est, sed interretis non.'; +$lang['updatecheck'] = 'Nouationes et fiducias inspicerene? Hic uicis connectere update.dokuwiki.org debes.'; +$lang['userewrite'] = 'VRL formosis uti'; +$lang['useslash'] = 'Repagula in URL, ut genera diuidas, uti'; +$lang['usedraft'] = 'Propositum in recensione machinatione seruatur'; +$lang['sepchar'] = 'Signum, quod paginas diuidit'; +$lang['canonical'] = 'VRL perfecto uti'; +$lang['fnencode'] = 'Ratio quae nomen documentorum non-ASCII codificit'; +$lang['autoplural'] = 'Pluralia in nexis inspicere'; +$lang['compression'] = 'Ratio compressionis documentis "attic"'; +$lang['cachetime'] = 'Maximum tempus formulis (sec)'; +$lang['locktime'] = 'Maximum tempus documentis inclusis (sec)'; +$lang['fetchsize'] = 'Maximum pondus (bytes), quod fetch.php ab externis onerare potest'; +$lang['notify'] = 'Adnotationis mutationes ad hunc cursum mittere'; +$lang['registernotify'] = 'De nouis Sodalibus ad hunc cursum notas mittere'; +$lang['mailfrom'] = 'Cursus interretialis, quo in cursibus uti'; +$lang['gzip_output'] = 'gzip Argumentum-Codificans xhtml uti'; +$lang['gdlib'] = 'GD Lib forma'; +$lang['im_convert'] = 'Domicilium machinae ImageMagick\'s'; +$lang['jpg_quality'] = 'JPG compressio colorum (0-100)'; +$lang['subscribers'] = 'Inscriptionis paginarum auxilium aptus facere'; +$lang['subscribe_time'] = 'Tempus post quod inscriptionum index et summa missa sunt (sec); Hic minor quam tempus declaratum fortasse est.'; +$lang['compress'] = 'CSS et javascript dimissio'; +$lang['hidepages'] = 'Paginas congruentes abscondere (uerba regularia)'; +$lang['send404'] = 'Mitte "HTTP 404/ Pagina non reperta" si paginae non sunt.'; +$lang['sitemap'] = 'Google formam situs gignere (dies)'; +$lang['broken_iua'] = 'ignore_user_abort functio inepta estne? Hoc indicem quaestionum, quae non aptae sunt, creare non potest. IIS+PHP/CGI ineptum est. Vide Bug 852'; +$lang['xsendfile'] = 'X-Sendfile utine ut seruitor interretialis documenta firma creet? Tuus seruitor interretialis hunc pati debes.'; +$lang['renderer_xhtml'] = 'Quid dimittere ut hoc in principio uicis (xhtml) utaris'; +$lang['renderer__core'] = '%s (uicis nucleus)'; +$lang['renderer__plugin'] = '%s (addenda)'; +$lang['rememberme'] = 'Formulas aditus aptas facere (memento me)'; +$lang['rss_type'] = 'XML summae genus'; +$lang['rss_linkto'] = 'XML summae connectio'; +$lang['rss_content'] = 'Quid in XML summis uidere?'; +$lang['rss_update'] = 'XML summae renouationis interuallum temporis'; +$lang['recent_days'] = 'Numerus mutationum recentium tenendorum (dies)'; +$lang['rss_show_summary'] = 'XML summa titulos ostendit'; +$lang['target____wiki'] = 'Fenestra nexis internis'; +$lang['target____interwiki'] = 'Fenestra nexis inter uicem'; +$lang['target____extern'] = 'Fenestra nexis externis'; +$lang['target____media'] = 'Fenestra nexis uisiuis'; +$lang['target____windows'] = 'Fenestra nexis fenestrarum'; +$lang['proxy____host'] = 'Proxis seruitoris nomen'; +$lang['proxy____port'] = 'Proxis portus'; +$lang['proxy____user'] = 'Proxis nomen sodalis'; +$lang['proxy____pass'] = 'Proxis tessera'; +$lang['proxy____ssl'] = 'SSL ut connectas uti'; +$lang['proxy____except'] = 'Verba, ut VRL inspicias, quibus Proxis non agnoscitur.'; +$lang['license_o_'] = 'Nihil electum'; +$lang['typography_o_0'] = 'neuter'; +$lang['typography_o_1'] = 'sine singulis uirgulis'; +$lang['typography_o_2'] = 'cum singulis uirgulis'; +$lang['userewrite_o_0'] = 'neuter'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki domesticus'; +$lang['deaccent_o_0'] = 'ex'; +$lang['deaccent_o_1'] = 'accentum tollere'; +$lang['deaccent_o_2'] = 'Latinis litteris'; +$lang['gdlib_o_0'] = 'GD Lib inepta'; +$lang['gdlib_o_1'] = 'Forma 1.x'; +$lang['gdlib_o_2'] = 'Machinatione inspicere'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Summa'; +$lang['rss_content_o_diff'] = 'Comparatio una'; +$lang['rss_content_o_htmldiff'] = 'Tabulae HTML formatae comparatae'; +$lang['rss_content_o_html'] = 'Pagina cum HTML'; +$lang['rss_linkto_o_diff'] = 'discrimina uidere'; +$lang['rss_linkto_o_page'] = 'pagina recensita'; +$lang['rss_linkto_o_rev'] = 'recensionum index'; +$lang['rss_linkto_o_current'] = 'hic pagina'; +$lang['compression_o_0'] = 'neuter'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'Noli uti'; +$lang['xsendfile_o_2'] = 'Praecipuus X-Sendfile'; +$lang['xsendfile_o_3'] = 'Proprietarius Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Sodalis nomen'; +$lang['showuseras_o_username'] = 'Sodalis nomen uerum'; +$lang['showuseras_o_email'] = 'Sodalis cursus interretialis (absconditus ut is tueratur)'; +$lang['showuseras_o_email_link'] = 'Sodalis cursus interretialis ut mailto: nexum'; +$lang['useheading_o_0'] = 'Numquam'; +$lang['useheading_o_navigation'] = 'Solum adspicere'; +$lang['useheading_o_content'] = 'Solum uicis argumentum'; +$lang['useheading_o_1'] = 'Semper'; +$lang['readdircache'] = 'Maximum tempus readdir (sec)'; diff --git a/lib/plugins/config/lang/lb/intro.txt b/lib/plugins/config/lang/lb/intro.txt new file mode 100644 index 0000000..964ee85 --- /dev/null +++ b/lib/plugins/config/lang/lb/intro.txt @@ -0,0 +1,7 @@ +====== Konfiguratioun ====== + +Dëses Plugin hëlleft der bei der Konfiguratioun vun DokuWiki. Hëllef zu deenen eenzelnen Astellungen fënns de ënner [[doku>config]]. Méi Informatiounen zu dësem Plugin kriss de ënner [[doku>plugin:config]]. + +Astellungen mat engem hellrouden Hannergrond si geséchert a kënnen net mat dësem Plugin verännert ginn. Astellungen mat hellbloem Hannergrond si Virastellungen, wäiss hannerluechte Felder weisen lokal verännert Werter un. Souwuel dié blo wéi och déi wäiss Felder kënne verännert ginn. + +Vergiess w.e.g. net **Späicheren** ze drécken iers de d'Säit verléiss, anescht ginn all deng Ännerungen verluer. diff --git a/lib/plugins/config/lang/lt/intro.txt b/lib/plugins/config/lang/lt/intro.txt new file mode 100644 index 0000000..ac3c2f6 --- /dev/null +++ b/lib/plugins/config/lang/lt/intro.txt @@ -0,0 +1,7 @@ +====== Konfiguracijos Administravimas ====== + +Naudokite šį puslapį Dokuwiki instaliacijos tvarkymui. Pagalba individualiems nustatymams [[doku>config]]. Daugiau informacijos apie šį priedą [[doku>plugin:config]]. + +Nustatymai raudoname fone yra apsaugoti nuo pakeitimų ir negali būti pakeisti šio įrankio pagalba. Nustatymai mėlyname fone nustatyti pagal nutylėjimą, o baltame fone nustatyti lokaliai būtent šiai instaliacijai. Nustatymai mėlyname ir baltame fone gali būti keičiami. + +Prieš paliekant ši puslapį, nepamirškite išsaugoti pakeitimus, tai galite padaryti nuspaudę **SAVE** mygtuką, kitu atveju pakeitimai nebus išsaugoti. diff --git a/lib/plugins/config/lang/lt/lang.php b/lib/plugins/config/lang/lt/lang.php new file mode 100644 index 0000000..f69ed6c --- /dev/null +++ b/lib/plugins/config/lang/lt/lang.php @@ -0,0 +1,25 @@ + + * @author Arunas Vaitekunas + */ +$lang['lang'] = 'Kalba'; +$lang['template'] = 'Paruoštukas'; +$lang['recent'] = 'Paskutiniai taisymai'; +$lang['disableactions_check'] = 'Patikrinti'; +$lang['xsendfile_o_1'] = 'Firminė lighthttpd antraštė (prieš 1.5 išleidimą)'; +$lang['xsendfile_o_2'] = 'Standartinė X-Sendfile antraštė'; +$lang['xsendfile_o_3'] = 'Firminė Nginx X-Accel-Redirect antraštė'; +$lang['showuseras_o_loginname'] = 'Prisijungimo vardas'; +$lang['showuseras_o_username'] = 'Vartotojo pilnas vardas'; +$lang['showuseras_o_email'] = 'Vartotojo el. pašto adresas (pasak pašto apsaugos yra netinkamas)'; +$lang['showuseras_o_email_link'] = 'Vartotojo el. pašto adresas kaip mailto: nuoroda'; +$lang['useheading_o_0'] = 'Niekada'; +$lang['useheading_o_navigation'] = 'Tik Navigacija'; +$lang['useheading_o_content'] = 'Tik Wiki Turinys'; +$lang['useheading_o_1'] = 'Visada'; diff --git a/lib/plugins/config/lang/lv/intro.txt b/lib/plugins/config/lang/lv/intro.txt new file mode 100644 index 0000000..e4d8d45 --- /dev/null +++ b/lib/plugins/config/lang/lv/intro.txt @@ -0,0 +1,7 @@ +====== Konfigurācijas vednis ====== + +Lapā var uzdot DokuWiki instalācijas iestatījumus. Palīdzību par atsevišķiem iestatījumiem meklēt [[doku>config]]. Sīkākas ziņas par šo moduli skatīt [[doku>plugin:config]]. + +Ar sarkanu fonu parādītie iestatījumi ir aizsargāti un ar šo moduli nav labojami. Ar zilu fonu parādītie iestatījumi ir noklusētās vērtības, bet uz balta fona parādīti programmas lokālie iestatījumi . Gan zilos, gan baltos var labot. + +Pirms aizej no šīs lapas, atceries nopsiest pogu **SAGLABĀT**, lai nezustu veiktās izmaiņas. diff --git a/lib/plugins/config/lang/lv/lang.php b/lib/plugins/config/lang/lv/lang.php new file mode 100644 index 0000000..a916d82 --- /dev/null +++ b/lib/plugins/config/lang/lv/lang.php @@ -0,0 +1,177 @@ + + * @author Aivars Miška + */ +$lang['menu'] = 'Konfigurācijas iestatījumi.'; +$lang['error'] = 'Iestatījumi nav saglabāti, jo uzdotas aplamas vērtības. Lūdzu pārskatīt izmaiņas un saglabāt atkārtoti. +
    Aplamās vērtības izceltas sarkanā rāmī.'; +$lang['updated'] = 'Iestatījumi veiksmīgi saglabāti.'; +$lang['nochoice'] = '(citu iespēju nav)'; +$lang['locked'] = 'Iestatījumu fails nav grozāms, ja tā nevajag būt,
    +pārliecinies, ka ir pareizs lokālo iestatījuma faila vārds un tiesības.'; +$lang['danger'] = 'Bīstami: Šī parametra maiņa var padarīt wiki sistēmu un konfigurācijas izvēlni nepieejamu.'; +$lang['warning'] = 'Brīdinājums: Šī parametra maiņa var izraisīt negaidītu programmas uzvedību.'; +$lang['security'] = 'Drošības brīdinājums: Šī parametra maiņa var būt riskanta drošībai.'; +$lang['_configuration_manager'] = 'Konfigurācijas pārvaldnieks'; +$lang['_header_dokuwiki'] = 'Dokuwiki iestatījumi'; +$lang['_header_plugin'] = 'Moduļu iestatījumi'; +$lang['_header_template'] = 'Šablonu iestatījumi'; +$lang['_header_undefined'] = 'Citi iestatījumi'; +$lang['_basic'] = 'Pamatiestatījumi'; +$lang['_display'] = 'Izskata iestatījumi'; +$lang['_authentication'] = 'Autentifikācija'; +$lang['_anti_spam'] = 'Pretspama iestatījumi'; +$lang['_editing'] = 'Labošanas iestatījumi'; +$lang['_links'] = 'Saišu iestatījumi'; +$lang['_media'] = 'Mēdiju iestatījumi'; +$lang['_notifications'] = 'Brīdinājumu iestatījumi'; +$lang['_advanced'] = 'Smalkāka iestatīšana'; +$lang['_network'] = 'Tīkla iestatījumi'; +$lang['_msg_setting_undefined'] = 'Nav atrodami iestatījumu metadati'; +$lang['_msg_setting_no_class'] = 'Nav iestatījumu klases'; +$lang['_msg_setting_no_default'] = 'Nav noklusētās vērtības'; +$lang['title'] = 'Wiki virsraksts'; +$lang['start'] = 'Sākumlapas vārds'; +$lang['lang'] = 'Valoda'; +$lang['template'] = 'Šablons'; +$lang['license'] = 'Ar kādu licenci saturs tiks publicēts?'; +$lang['savedir'] = 'Direktorija datu glabāšanai'; +$lang['basedir'] = 'Saknes direktorija'; +$lang['baseurl'] = 'Saknes adrese (URL)'; +$lang['dmode'] = 'Tiesības izveidotajām direktorijām'; +$lang['fmode'] = 'Tiesības izveidotajiem failiem'; +$lang['allowdebug'] = 'Ieslēgt atkļūdošanu. Izslēdz!'; +$lang['recent'] = 'Jaunākie grozījumi'; +$lang['recent_days'] = 'Cik dienas glabāt jaunākās izmaiņas'; +$lang['breadcrumbs'] = 'Apmeklējumu vēstures garums'; +$lang['youarehere'] = 'Rādīt "tu atrodies šeit"'; +$lang['fullpath'] = 'Norādīt kājenē pilnu lapas ceļu'; +$lang['typography'] = 'Veikt tipogrāfijas aizvietošanu'; +$lang['dformat'] = 'Datuma formāts (sk. PHP strftime funkciju)'; +$lang['signature'] = 'Paraksts'; +$lang['showuseras'] = 'Kā rādīt pēdējo lietotāju, ka labojis lapu'; +$lang['toptoclevel'] = 'Satura rādītāja pirmais līmenis'; +$lang['tocminheads'] = 'Mazākais virsrakstu skaits, no kuriem jāveido satura rādītājs.'; +$lang['maxtoclevel'] = 'Satura rādītāja dziļākais līmenis'; +$lang['maxseclevel'] = 'Dziļākais sekciju labošanas līmenis'; +$lang['camelcase'] = 'Lietot saitēm CamelCase'; +$lang['deaccent'] = 'Lapu nosaukumu transliterācija'; +$lang['useheading'] = 'Izmantot pirmo virsrakstu lapu nosaukumiem'; +$lang['sneaky_index'] = 'Pēc noklusētā DokuWiki lapu sarakstā parāda visu nodaļu lapas. Ieslēdzot šo parametru, noslēps tās nodaļas, kuras apmeklētājam nav tiesības lasīt. Bet tad tiks arī paslēptas dziļākas, bet atļautas nodaļas. Atsevišķos pieejas tiesību konfigurācijas gadījumos lapu saraksts var nedarboties.'; +$lang['hidepages'] = 'Slēpt lapas (regulāras izteiksmes)'; +$lang['useacl'] = 'Izmantot piekļuves tiesības'; +$lang['autopasswd'] = 'Automātiski ģenerēt paroles'; +$lang['authtype'] = 'Autentifikācijas mehānisms'; +$lang['passcrypt'] = 'Paroļu šifrēšanas metode'; +$lang['defaultgroup'] = 'Noklusētā grupa'; +$lang['superuser'] = 'Administrators - grupa, lietotājs vai to saraksts ( piem.: user1,@group1,user2), kam ir pilnas tiesības.'; +$lang['manager'] = 'Pārziņi - grupa, lietotājs vai to saraksts ( piem.: user1,@group1,user2), kam ir pieeja pie dažām administrēšanas funkcijām.'; +$lang['profileconfirm'] = 'Profila labošanai vajag paroli'; +$lang['rememberme'] = 'Atļaut pastāvīgas ielogošanās sīkdatnes ("atceries mani")'; +$lang['disableactions'] = 'Bloķēt Dokuwiki darbības'; +$lang['disableactions_check'] = 'atzīmēt'; +$lang['disableactions_subscription'] = 'abonēt/atteikties'; +$lang['disableactions_wikicode'] = 'skatīt/eksportēt izejtekstu'; +$lang['disableactions_other'] = 'citas darbības (atdalīt ar komatiem)'; +$lang['auth_security_timeout'] = 'Autorizācijas drošības intervāls (sekundēs)'; +$lang['securecookie'] = 'Vai pa HTTPS sūtāmās sīkdatnes sūtīt tikai pa HTTPS? Atslēdz šo iespēju, kad tikai pieteikšanās wiki sistēmā notiek pa SSL šifrētu savienojumu, bet skatīšana - pa nešifrētu.'; +$lang['usewordblock'] = 'Bloķēt spamu pēc slikto vārdu saraksta.'; +$lang['relnofollow'] = 'rel="nofollow" ārējām saitēm'; +$lang['indexdelay'] = 'Laika aizture pirms indeksācijas (sekundēs)'; +$lang['mailguard'] = 'Slēpt epasta adreses'; +$lang['iexssprotect'] = 'Pārbaudīt, vai augšupielādētajā failā nav nav potenciāli bīstamā JavaScript vai HTML koda.'; +$lang['usedraft'] = 'Labojot automātiski saglabāt melnrakstu'; +$lang['locktime'] = 'Bloķēšanas failu maksimālais vecums'; +$lang['cachetime'] = 'Bufera maksimālais vecums (sek)'; +$lang['target____wiki'] = 'Kur atvērt iekšējās saites'; +$lang['target____interwiki'] = 'Kur atvērt saites strap wiki'; +$lang['target____extern'] = 'Kur atvērt ārējās saites'; +$lang['target____media'] = 'Kur atvērt mēdiju saites'; +$lang['target____windows'] = 'Kur atvērt saites uz tīkla mapēm'; +$lang['refcheck'] = 'Pārbaudīt saites uz mēdiju failiem'; +$lang['gdlib'] = 'GD Lib versija'; +$lang['im_convert'] = 'Ceļš uz ImageMagick convert rīku'; +$lang['jpg_quality'] = 'JPG saspiešanas kvalitāte'; +$lang['fetchsize'] = 'Maksimālais faila apjoms baitos, ko fetch.php var ielādēt no interneta.'; +$lang['subscribers'] = 'Atļaut abonēt izmaiņas'; +$lang['subscribe_time'] = 'Pēc cik ilga laika izsūtīt abonētos sarakstus un kopsavilkumus (sekundes); jābūt mazākam par laiku, kas norādīts "recent_days".'; +$lang['notify'] = 'Nosūtīt izmaiņu paziņojumu uz epasta adresi'; +$lang['registernotify'] = 'Nosūtīt paziņojumu par jauniem lietotājiem uz epasta adresi'; +$lang['mailfrom'] = 'Epasta adrese automātiskajiem paziņojumiem'; +$lang['mailprefix'] = 'E-pasta temata prefikss automātiskajiem paziņojumiem'; +$lang['sitemap'] = 'Lapas karte priekš Google (dienas)'; +$lang['rss_type'] = 'XML barotnes veids'; +$lang['rss_linkto'] = 'XML barotnes uz '; +$lang['rss_content'] = 'Ko attēlot XML barotnē?'; +$lang['rss_update'] = 'XML barotnes atjaunošanas intervāls (sec)'; +$lang['rss_show_summary'] = 'Rādīt visrakstos XML barotnes kopsavilkumu '; +$lang['updatecheck'] = 'Pārbaudīt, vai pieejami atjauninājumi un drošības brīdinājumi? Dokuwiki sazināsies ar update.dokuwiki.org'; +$lang['userewrite'] = 'Ērti lasāmas adreses (URL)'; +$lang['useslash'] = 'Lietot slīpiņu par URL atdalītāju'; +$lang['sepchar'] = 'Lapas nosaukuma vārdu atdalītājs'; +$lang['canonical'] = 'Lietot kanoniskus URL'; +$lang['fnencode'] = 'Ne ASCII failvārdu kodēšanas metode:'; +$lang['autoplural'] = 'Automātisks daudzskaitlis'; +$lang['compression'] = 'Saspiešanas metode vecajiem failiem'; +$lang['gzip_output'] = 'Lietot gzip Content-Encoding priekš xhtml'; +$lang['compress'] = 'Saspiest CSS un javascript failus'; +$lang['send404'] = 'Par neesošām lapām atbildēt "HTTP 404/Page Not Found" '; +$lang['broken_iua'] = 'Varbūt tavā serverī nedarbojas funkcija ignore_user_abort? Tā dēļ var nestādāt meklēšanas indeksācija. Šī problēma sastopama, piemēram, IIS ar PHP/CGI. Papildus informāciju skatīt Kļūdā Nr.852.'; +$lang['xsendfile'] = 'Lietot X-Sendfile virsrakstu, augšupielādējot failu serverī? '; +$lang['renderer_xhtml'] = 'Galveno (xhtml) wiki saturu renderēt ar '; +$lang['renderer__core'] = '%s (dokuwiki kodols)'; +$lang['renderer__plugin'] = '%s (modulis)'; +$lang['proxy____host'] = 'Proxy servera vārds'; +$lang['proxy____port'] = 'Proxy ports'; +$lang['proxy____user'] = 'Proxy lietotāja vārds'; +$lang['proxy____pass'] = 'Proxy parole'; +$lang['proxy____ssl'] = 'Lietot SSL savienojumu ar proxy'; +$lang['proxy____except'] = 'Regulārā izteiksme tiem URL, kam nevar lietot proxy.'; +$lang['license_o_'] = 'Ar nekādu'; +$lang['typography_o_0'] = 'neko'; +$lang['typography_o_1'] = 'tikai dubultpēdiņas'; +$lang['typography_o_2'] = 'visas pēdiņas (ne vienmēr strādā)'; +$lang['userewrite_o_0'] = 'nē'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki līdzekļi'; +$lang['deaccent_o_0'] = 'nē'; +$lang['deaccent_o_1'] = 'atmest diakritiku'; +$lang['deaccent_o_2'] = 'pārrakstīt latīņu burtiem'; +$lang['gdlib_o_0'] = 'GD Lib nav pieejama'; +$lang['gdlib_o_1'] = 'versija 1.x'; +$lang['gdlib_o_2'] = 'noteikt automātiksi'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstract'; +$lang['rss_content_o_diff'] = 'apvienotu diff'; +$lang['rss_content_o_htmldiff'] = 'HTML formatētu diff tabulu'; +$lang['rss_content_o_html'] = 'pilnu HTML lapas saturu'; +$lang['rss_linkto_o_diff'] = 'atšķirības'; +$lang['rss_linkto_o_page'] = 'grozītās lapas'; +$lang['rss_linkto_o_rev'] = 'grozījumu sarakstu'; +$lang['rss_linkto_o_current'] = 'patreizējo lapu'; +$lang['compression_o_0'] = 'nav'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'nelietot'; +$lang['xsendfile_o_1'] = 'lighttpd (pirms laidiena 1.5) veida galvene'; +$lang['xsendfile_o_2'] = 'Standarta X-Sendfile galvene'; +$lang['xsendfile_o_3'] = 'Nginx X-Accel-Redirect veida galvene'; +$lang['showuseras_o_loginname'] = 'Login vārds'; +$lang['showuseras_o_username'] = 'Pilns lietotāja vārds'; +$lang['showuseras_o_email'] = 'Lietotāja epasta adrese (slēpta ar norādīto paņēmienu)'; +$lang['showuseras_o_email_link'] = 'Lietot epasta adreses kā mailto: saites'; +$lang['useheading_o_0'] = 'Nekad'; +$lang['useheading_o_navigation'] = 'Tikai navigācija'; +$lang['useheading_o_content'] = 'Tikai Wiki saturs'; +$lang['useheading_o_1'] = 'Vienmēr'; +$lang['readdircache'] = 'Maksimālais readdir kesš dzīves laiks (sek.)'; diff --git a/lib/plugins/config/lang/mr/intro.txt b/lib/plugins/config/lang/mr/intro.txt new file mode 100644 index 0000000..e068295 --- /dev/null +++ b/lib/plugins/config/lang/mr/intro.txt @@ -0,0 +1,10 @@ +====== कॉन्फिगरेशन व्यवस्थापक ====== + +तुमच्या डॉक्युविकीची सेटिंग बदलान्यासाथी हे पान वापरा. +विशिष्ठ सेटिंग विषयी माहिती पाहिजे असल्यास [[doku>config]] पहा. +प्लगिन विषयी अधिक माहितीसाठी [[doku>plugin:config]] पहा. +हलक्या लाल पार्श्वभूमिमधे दाखवलेले सेटिंग सुरक्षित आहेत व या प्लगिन द्वारा बदलता येणार नाहीत. +निळ्या पार्श्वभूमीमधे दाखवलेले सेटिंग आपोआप सेट होणार्या किमती आहेत आणि पांढर्या पार्श्वभूमीमधे +दाखवलेले सेटिंग या इन्स्टॉलेशनसाठी ख़ास सेट केलेले आहेत. निळे आणि पांढरे दोन्ही सेटिंग बदलता येतील. + +ह्या पानावरून बाहर जाण्याआधी "Save" चे बटन क्लिक करायला विसरू नका नाहीतर सर्व बदल नाहीसे होतील. diff --git a/lib/plugins/config/lang/mr/lang.php b/lib/plugins/config/lang/mr/lang.php new file mode 100644 index 0000000..ceaaa82 --- /dev/null +++ b/lib/plugins/config/lang/mr/lang.php @@ -0,0 +1,169 @@ + + * @author Padmanabh Kulkarni + * @author shantanoo@gmail.com + */ +$lang['menu'] = 'कॉन्फिगरेशन सेटिंग'; +$lang['error'] = 'चुकीचा शब्द टाकल्यामुळे सेटिंग अद्ययावत केलेली नाहीत. कृपया तुमचे बदल परत तपासा आणि परत सबमिट करा.
    चुकीच्या शब्दांभोवती लाल बॉर्डर दाखवली जाईल.'; +$lang['updated'] = 'सेटिंग अद्ययावत केली आहेत.'; +$lang['nochoice'] = '( इतर काही पर्याय नाहीत )'; +$lang['locked'] = 'सेटिंगची फाइल अद्ययावत करू शकलो नाही. जर हे सहेतुक नसेल तर,
    +सेटिंग च्या फाइल चे नाव व त्यावरील परवानग्या बरोबर असल्याची खात्री करा.'; +$lang['danger'] = 'सावधान : हा पर्याय बदलल्यास तुमची विकी आणि तिचे कॉनफिगरेशन निकामी होऊ शकते.'; +$lang['warning'] = 'सावघान: येथील पर्याय बदल्यास, अनपेक्षीत गोष्टी होऊ शकतात.'; +$lang['security'] = 'सुरक्षा संबंधी सूचना : हा पर्याय बदलल्यास तुमची साईट असुरक्षित होऊ शकते.'; +$lang['_configuration_manager'] = 'कॉन्फिगरेशन व्यवस्थापक'; +$lang['_header_dokuwiki'] = 'डॉक्युविकि सेटिंग'; +$lang['_header_plugin'] = 'प्लगिन सेटिंग'; +$lang['_header_template'] = 'टेम्पलेट (नमुना) सेटिंग'; +$lang['_header_undefined'] = 'अनिश्चित सेटिंग'; +$lang['_basic'] = 'पायाभूत सेटिंग'; +$lang['_display'] = 'डिसप्ले सेटिंग'; +$lang['_authentication'] = 'अधिकृत करण्याविषयी सेटिंग'; +$lang['_anti_spam'] = 'भंकस-विरोधी सेटिंग'; +$lang['_editing'] = 'संपादन सेटिंग'; +$lang['_links'] = 'लिंक सेटिंग'; +$lang['_media'] = 'दृक्श्राव्य माध्यम सेटिंग'; +$lang['_advanced'] = 'सविस्तर सेटिंग'; +$lang['_network'] = 'नेटवर्क सेटिंग'; +$lang['_msg_setting_undefined'] = 'सेटिंगविषयी उप-डेटा उपलब्ध नाही.'; +$lang['_msg_setting_no_class'] = 'सेटिंगचा क्लास उपलब्ध नाही'; +$lang['_msg_setting_no_default'] = 'आपोआप किम्मत नाही'; +$lang['fmode'] = 'फाइल निर्मिती मोड'; +$lang['dmode'] = 'डिरेक्टरी निर्मिती मोड'; +$lang['lang'] = 'भाषा'; +$lang['basedir'] = 'पायाभूत डिरेक्टरी'; +$lang['baseurl'] = 'पायाभूत URL'; +$lang['savedir'] = 'डेटा साठवण्यासाठीची डिरेक्टरी'; +$lang['start'] = 'सुरुवातीच्या पानाचे नाव'; +$lang['title'] = 'विकीचे शीर्षक'; +$lang['template'] = 'नमुना'; +$lang['license'] = 'कुठल्या लायसंसच्या अंतर्गत तुमचा मजकूर रिलीज़ केला गेला पाहिजे ?'; +$lang['fullpath'] = 'पानांचा पूर्ण पत्ता फूटर मधे दाखव'; +$lang['recent'] = 'अलीकडील बदल'; +$lang['breadcrumbs'] = 'ब्रेडक्रम्बची संख्या'; +$lang['youarehere'] = 'प्रतवार ब्रेडक्रम्ब'; +$lang['typography'] = 'अनवधानाने झालेल्या चुका बदला'; +$lang['dformat'] = 'दिनांकाची पद्धत ( PHP चं strftime हे फंक्शन पाहा )'; +$lang['signature'] = 'हस्ताक्षर'; +$lang['toptoclevel'] = 'अनुक्रमणिकेची सर्वोच्च पातळी'; +$lang['tocminheads'] = 'कमीत कमी किती शीर्षके असल्यास अनुक्रमणिका बनवावी'; +$lang['maxtoclevel'] = 'अनुक्रमणिकेची जास्तीत जास्त पातळी '; +$lang['maxseclevel'] = 'विभागीय संपादनाची जास्तीतजास्त पातळी'; +$lang['camelcase'] = 'लिंकसाठी कॅमलकेस वापरा.'; +$lang['deaccent'] = 'सरळ्सोट पृष्ठ नाम'; +$lang['useheading'] = 'पहिलं शीर्षक पृष्ठ नाम म्हणुन वापरा'; +$lang['refcheck'] = 'दृक्श्राव्य माध्यमाचा संदर्भ तपासा'; +$lang['allowdebug'] = 'डिबगची परवानगी गरज नसल्यास बंद ठेवा !'; +$lang['usewordblock'] = 'भंकस मजकूर थोपवण्यासाठी शब्दसमुह वापरा'; +$lang['indexdelay'] = 'सूचीकरणापूर्वीचा अवकाश ( सेकंदात )'; +$lang['relnofollow'] = 'बाह्य लिन्कसाठी rel=nofollow वापरा'; +$lang['mailguard'] = 'ईमेल दुर्बोध करा'; +$lang['iexssprotect'] = 'अपलोड केलेल्या फाइल हानिकारक जावास्क्रिप्ट किंवा HTML साठी तपासा'; +$lang['showuseras'] = 'पानाचं शेवटचं संपादन करणार्या सदस्याला काय दाखवायचं'; +$lang['useacl'] = 'ACL वापरा'; +$lang['autopasswd'] = 'पासवर्ड आपोआप बनवा'; +$lang['authtype'] = 'अधिकृत करण्याच्या व्यवस्थेचे बॅक-एंड'; +$lang['passcrypt'] = 'पासवर्ड गुप्त ठेवण्याची पद्धत'; +$lang['defaultgroup'] = 'डिफॉल्ट गट'; +$lang['superuser'] = 'सुपर सदस्य - गट, सदस्य किंवा स्वल्पविरामाने अलग केलेली यादी ( उदा. सदस्य१, गट१, सदस्य२ ) ज्यांना ACL च्या सेटिंग व्यतिरिक्त सर्व पानांवर पूर्ण हक्क असतो.'; +$lang['manager'] = 'व्यवस्थापक - गट, सदस्य किंवा स्वल्पविरामाने अलग केलेली यादी ( उदा. सदस्य१, गट१, सदस्य२ ) ज्यांना व्यवस्थापनाच्या निवडक सुविधा उपलब्ध असतात.'; +$lang['profileconfirm'] = 'प्रोफाइल मधील बदल पासवर्ड वापरून नक्की करा'; +$lang['disableactions'] = 'डॉक्युविकीच्या क्रिया बंद ठेवा'; +$lang['disableactions_check'] = 'तपासा'; +$lang['disableactions_subscription'] = 'सब्सक्राईब / अन्-सब्सक्राईब'; +$lang['disableactions_wikicode'] = 'स्त्रोत पहा / कच्च्या स्वरूपात एक्सपोर्ट करा'; +$lang['disableactions_other'] = 'इतर क्रिया ( स्वल्पविरामाने अलग केलेल्या )'; +$lang['sneaky_index'] = 'सूची दृश्यामधे डिफॉल्ट स्वरूपात डॉक्युविकी सगळे नेमस्पेस दाखवते. हा पर्याय चालू केल्यास सदस्याला वाचण्याची परवानगी नसलेले नेमस्पेस दिसणार नाहीत. यामुळे परवानगी असलेले उप - नेमस्पेस न दिसण्याची शक्यता आहे. यामुळे काही विशिष्ठ ACL सेटिंगसाठी सूची वापरता येण्यासारखी राहणार नाही.'; +$lang['auth_security_timeout'] = 'अधिकृत करण्याच्या प्रक्रियेची कालमर्यादा'; +$lang['securecookie'] = 'HTTPS वापरून सेट केलेले कूकीज ब्राउजरने HTTPS द्वाराच पाठवले पाहिजेत का? जर तुमच्या विकीचं फ़क्त लॉगिन पानच SSL वापरून सुरक्षित केलं असेल व पानांचं ब्राउजिंग असुरक्षित असेल तर हा पर्याय चालू करू नका.'; +$lang['updatecheck'] = 'अपडेट आणि सुरक्षिततेविशयी सूचनान्वर पाळत ठेऊ का? या सुविधेसाठी डॉक्युविकीला update.dokuwiki.org शी संपर्क साधावा लागेल.'; +$lang['userewrite'] = 'छान छान URL वापर'; +$lang['useslash'] = 'URL मधे नेमस्पेस अलग करण्यासाठी \'/\' चिह्न वापरा'; +$lang['usedraft'] = 'संपादन करताना मसुदा आपोआप सुरक्षित करा'; +$lang['sepchar'] = 'पानाच्या नावातील शब्द अलग करण्याचे चिह्न'; +$lang['canonical'] = 'पूर्णपणे सुटसुटीत URL वापरा'; +$lang['autoplural'] = 'लिंकमधिल अनेकवचने तपासा'; +$lang['compression'] = 'अडगळीतल्या फाइल संकुचित करण्याची पद्धत'; +$lang['cachetime'] = 'कॅशचे जास्तीतजास्त वयोमान ( सेकंदात )'; +$lang['locktime'] = 'लॉक फाइलचे जास्तीतजास्त वयोमान ( सेकंदात )'; +$lang['fetchsize'] = 'बाह्य स्त्रोताकडून जास्तीतजास्त किती डाउनलोड fecth.php करू शकतो ( बाइट्स मधे )'; +$lang['notify'] = 'बदलाच्या सूचना ह्या ईमेल वर पाठवा'; +$lang['registernotify'] = 'नवीन नोंदणी केलेल्या सदस्यांची माहिती ह्या ईमेल वर पाठवा'; +$lang['mailfrom'] = 'आपोआप ईमेल पाठवण्यासाठी वापरायचा ईमेल'; +$lang['gzip_output'] = 'xhtml साठी gzip Content-encoding वापरा'; +$lang['gdlib'] = 'gzip लायब्ररीची आवृत्ती'; +$lang['im_convert'] = 'ImageMagik च्या परिवर्तन करणार्या टूलचा पाथ'; +$lang['jpg_quality'] = 'JPG संकुचित करण्याचा दर्जा ( १ - १०० )'; +$lang['subscribers'] = 'पानाची पुरवणी देण्याची सुविधा चालू करा'; +$lang['compress'] = 'CSS आणि जावास्क्रिप्टचे आउट्पुट संकुचित करा'; +$lang['hidepages'] = 'समान पाने लपवा'; +$lang['send404'] = 'अस्तित्वात नसलेल्या पानांसाठी "HTTP 404/Page not found" संदेश पाठवा'; +$lang['sitemap'] = 'गूगल साईट-मॅप बनवा'; +$lang['broken_iua'] = 'ignore_user_abort फंक्शन तुमच्या सिस्टम वर चालत नाही का? यामुळे शोध सूची निकामी होऊ शकते. IIS + PHP/CGI वर हे काम करत नाही हे नक्की झाले आहे. अधिक माहितीसाठी बग ८५२ पहा.'; +$lang['xsendfile'] = 'सर्वर कडून स्थिर फाइल पाठवली जाण्यासाठी X-Sendfile शीर्षक ( header ) वापरू का ? तुमच्या वेब सर्वर मधे ही सुविधा असली पाहिजे.'; +$lang['renderer_xhtml'] = 'मुख्य ( xhtml ) विकी आउट्पुट साथी वापरायचा चित्रक ( renderer )'; +$lang['renderer__core'] = '%s (डॉक्युविकीचा मूलभूत)'; +$lang['renderer__plugin'] = '%s (प्लगिन)'; +$lang['rememberme'] = 'कायमच्या लॉगिन कुकीजला परवानगी दया ( लक्षात ठेवा )'; +$lang['rss_type'] = 'XML पुरवणीचा प्रकार'; +$lang['rss_linkto'] = 'XML पुरवणीची लिंक येथे जाते'; +$lang['rss_content'] = 'XML पुरवणीतल्या मुद्द्यामधे काय काय दाखवायचं?'; +$lang['rss_update'] = 'XML पुरवणी अद्ययावत करण्याचा कालखंड ( सेकंदात )'; +$lang['recent_days'] = 'किती अलीकडील बदल ठेवायचे? ( दिवसात )'; +$lang['rss_show_summary'] = 'XML पुरावानीच्या शीर्षकात सारांश दाखवा'; +$lang['target____wiki'] = 'अंतर्गत लिंकसाठीची विंडो'; +$lang['target____interwiki'] = 'आंतरविकि लिंकसाठीची विंडो'; +$lang['target____extern'] = 'बाह्य लिंकसाठीची विंडो'; +$lang['target____media'] = 'दृक्श्राव्य लिंकसाठीची विंडो'; +$lang['target____windows'] = 'विंडो लिंकसाठीची विंडो'; +$lang['proxy____host'] = 'छद्म ( proxy ) सर्वरचे नाव'; +$lang['proxy____port'] = 'छद्म ( proxy ) सर्वरचे पोर्ट'; +$lang['proxy____user'] = 'छद्म ( proxy ) सर्वरचे सदस्यनाम'; +$lang['proxy____pass'] = 'छद्म ( proxy ) सर्वरचा पासवर्ड'; +$lang['proxy____ssl'] = 'छद्म सर्वरला संपर्क साधण्यासाठी SSL वापरा'; +$lang['license_o_'] = 'काही निवडले नाही'; +$lang['typography_o_0'] = 'काही नाही'; +$lang['typography_o_1'] = 'फक्त दुहेरी अवतरण चिह्न'; +$lang['typography_o_2'] = 'सर्व प्रकारची अवतरण चिन्हे ( नेहेमी चालेलच असं नाही )'; +$lang['userewrite_o_0'] = 'कुठेही नाही'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'डॉक्युविकी अंतर्गत'; +$lang['deaccent_o_0'] = 'बंद'; +$lang['deaccent_o_1'] = 'एक्सेंट काढून टाका'; +$lang['deaccent_o_2'] = 'रोमन लिपित बदला'; +$lang['gdlib_o_0'] = 'GD Lib उपलब्ध नाही'; +$lang['gdlib_o_1'] = 'आवृत्ती १.x'; +$lang['gdlib_o_2'] = 'आपोआप ओळखा'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'सारांश'; +$lang['rss_content_o_diff'] = 'एकत्रित फरक'; +$lang['rss_content_o_htmldiff'] = 'HTML पद्धतीचा फरकांचा तक्ता'; +$lang['rss_content_o_html'] = 'पानाचा पूर्ण HTML मजकूर'; +$lang['rss_linkto_o_diff'] = 'फरक दृश्य'; +$lang['rss_linkto_o_page'] = 'उजळणी केलेले पान'; +$lang['rss_linkto_o_rev'] = 'आवृत्त्यांची यादी'; +$lang['rss_linkto_o_current'] = 'सद्य पान'; +$lang['compression_o_0'] = 'काही नाही'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'वापरू नका'; +$lang['xsendfile_o_1'] = 'lighttpd चा प्रोप्रायटरी शीर्षक (हेडर)'; +$lang['xsendfile_o_2'] = 'स्टॅण्डर्ड X-sendfile शीर्षक'; +$lang['xsendfile_o_3'] = ' Nginx चा प्रोप्रायटरी Accel-Redirect शीर्षक'; +$lang['showuseras_o_loginname'] = 'लॉगिन नाम'; +$lang['showuseras_o_username'] = 'सदस्याचे पूर्ण नाव'; +$lang['showuseras_o_email'] = 'सदस्याचा ईमेल ( मेल सुरक्षिततेच्या सेटिंग अनुसार दुर्बोध केलेला ) '; +$lang['showuseras_o_email_link'] = 'सदस्याचा ईमेल maito: लिंक स्वरूपात'; +$lang['useheading_o_0'] = 'कधीच नाही'; +$lang['useheading_o_navigation'] = 'फ़क्त मार्गदर्शन'; +$lang['useheading_o_content'] = 'फ़क्त विकी मजकूर'; +$lang['useheading_o_1'] = 'नेहमी'; diff --git a/lib/plugins/config/lang/ne/lang.php b/lib/plugins/config/lang/ne/lang.php new file mode 100644 index 0000000..c8f304d --- /dev/null +++ b/lib/plugins/config/lang/ne/lang.php @@ -0,0 +1,66 @@ + + * @author SarojKumar Dhakal + * @author Saroj Dhakal + */ +$lang['nochoice'] = '(अरु विकल्पहरु अनुपलव्ध)'; +$lang['_configuration_manager'] = 'नियन्त्रण व्यवस्थापक'; +$lang['_header_dokuwiki'] = 'DokuWiki सेटिंङ्ग'; +$lang['_header_plugin'] = 'प्लगइन सेटिंङ्ग'; +$lang['_header_template'] = 'टेम्प्लेट सेटिंङ्ग'; +$lang['_header_undefined'] = 'नखुलेको सेटिंङ्ग'; +$lang['_basic'] = 'आधारभूत सेटिंङ्ग'; +$lang['_display'] = 'प्रदर्शन सेटिंङ्ग'; +$lang['_authentication'] = 'आधिकारिकता सेटिंङ्ग'; +$lang['_anti_spam'] = 'स्प्याम विरुद्धको सेटिंङ्ग'; +$lang['_editing'] = 'सम्पादन सेटिंङ्ग'; +$lang['_links'] = 'लिङ्क सेटिंङ्ग'; +$lang['_media'] = 'मिडिया सेटिंङ्ग'; +$lang['_advanced'] = 'विशिष्ठ सेटिंङ्ग'; +$lang['_network'] = 'सञ्जाल सेटिंङ्ग'; +$lang['_msg_setting_undefined'] = 'सेटिंङ्ग मेटाडाटा नभएको'; +$lang['_msg_setting_no_class'] = 'सेटिंङ्ग वर्ग नभएको'; +$lang['_msg_setting_no_default'] = 'कुनै पूर्व निर्धारित मान छैन ।'; +$lang['fmode'] = 'फाइल निर्माण स्थिति'; +$lang['dmode'] = 'डाइरेक्टरी निर्माण स्थिति'; +$lang['lang'] = 'भाषा'; +$lang['basedir'] = 'आधार डाइरेक्टरी'; +$lang['baseurl'] = 'आधार URL'; +$lang['savedir'] = 'सामग्री वचत गर्ने डाइरेक्टरी'; +$lang['start'] = 'पृष्ट नाम सुरुगर्नुहोस्'; +$lang['title'] = 'विकि शिर्षक'; +$lang['template'] = 'ढाँचा'; +$lang['license'] = 'कुन प्रमाण पत्रको आधारमा सामग्री प्रकाशन गरिनु पर्छ ?'; +$lang['fullpath'] = 'पष्ठको पूरा बाटो निम्नशिर्षकमा देखाउने'; +$lang['recent'] = 'हालैको परिवर्तन'; +$lang['signature'] = 'दस्तखत'; +$lang['renderer__core'] = ' %s (dokuwiki core)'; +$lang['renderer__plugin'] = ' %s (plugin)'; +$lang['rss_type'] = 'XML फिड प्रकार'; +$lang['rss_linkto'] = 'को XML फिड'; +$lang['gdlib_o_1'] = 'संस्करण १.x'; +$lang['gdlib_o_2'] = 'आफै पत्तालगाउनु होस् '; +$lang['rss_type_o_rss'] = 'आरसस ०॒.९१'; +$lang['rss_type_o_rss1'] = 'आरसस १.०'; +$lang['rss_type_o_rss2'] = 'आरसस २.०'; +$lang['rss_type_o_atom'] = 'एटम ०.३'; +$lang['rss_type_o_atom1'] = 'एटम १.०'; +$lang['rss_content_o_abstract'] = 'सारांस'; +$lang['rss_content_o_diff'] = 'एकिकृत फरक'; +$lang['rss_content_o_htmldiff'] = 'HTML ढाँचाको फरक सुची'; +$lang['rss_content_o_html'] = 'पूरा HTML पृष्टमा रहेको वस्तु'; +$lang['rss_linkto_o_diff'] = 'फरक अवलोकन'; +$lang['rss_linkto_o_rev'] = 'पुन:संस्करण सुची'; +$lang['rss_linkto_o_current'] = 'चालु पृष्ठ'; +$lang['compression_o_0'] = 'कुनै पनि होइन '; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'प्रयोग नगर्नुहोस्'; +$lang['showuseras_o_loginname'] = 'प्रवेश नाम'; +$lang['showuseras_o_username'] = 'प्रयोगकर्ताको पूरा नाम'; +$lang['useheading_o_0'] = 'कहिले पनि '; +$lang['useheading_o_content'] = 'विकी विषयवस्तु मात्र'; +$lang['useheading_o_1'] = 'सधैँ'; diff --git a/lib/plugins/config/lang/nl/intro.txt b/lib/plugins/config/lang/nl/intro.txt new file mode 100644 index 0000000..4d72b69 --- /dev/null +++ b/lib/plugins/config/lang/nl/intro.txt @@ -0,0 +1,7 @@ +====== Configuratie Manager ====== + +Gebruik deze pagina om de instellingen van je DokuWiki te bekijken en/of te wijzigen. Voor hulp over specifieke instellingen kun je kijken op [[doku>config]]. Voor meer informatie over deze plugin zie [[doku>plugin:config]]. + +Instellingen met een rode achtergond kunnen niet worden gewijzigd met deze plugin. Instellingen met een blauwe achtergrond hebben de default waarde, en instellingen met een witte achtergrond zijn lokaal gewijzigd voor deze specifieke installatie. Zowel blauwe als witte instellingen kunnen worden gewijzigd. + +Vergeet niet op **Opslaan** te drukken alvorens de pagina te verlaten, anders gaan je wijzigingen verloren. diff --git a/lib/plugins/config/lang/nl/lang.php b/lib/plugins/config/lang/nl/lang.php new file mode 100644 index 0000000..9afda32 --- /dev/null +++ b/lib/plugins/config/lang/nl/lang.php @@ -0,0 +1,219 @@ + + * @author PBU + * @author Gerrit Uitslag + * @author Harriet Neitz + * @author Pieter van der Meulen + * @author Wouter Schoot + * @author John de Graaff + * @author Niels Schoot + * @author Dion Nicolaas + * @author Danny Rotsaert + * @author Marijn Hofstra + * @author Timon Van Overveldt + * @author Ricardo Guijt + * @author Hugo Smet + */ +$lang['menu'] = 'Configuratie-instellingen'; +$lang['error'] = 'De instellingen zijn niet gewijzigd wegens een incorrecte waarde, kijk je wijzigingen na en sla dan opnieuw op.
    Je kunt de incorrecte waarde(s) herkennen aan de rode rand.'; +$lang['updated'] = 'Instellingen met succes opgeslagen.'; +$lang['nochoice'] = '(geen andere keuzemogelijkheden)'; +$lang['locked'] = 'Het bestand met instellingen kan niet worden gewijzigd. Als dit niet de bedoeling
    is, controleer dan de naam en de permissies voor het lokale installingenbestand.'; +$lang['danger'] = 'Gevaar: Het wijzigen van deze optie kan er voor zorgen dat uw wiki en het configuratiemenu niet langer toegankelijk zijn.'; +$lang['warning'] = 'Waarschuwing: Het wijzigen van deze optie kan onverwachte gedragingen veroorzaken.'; +$lang['security'] = 'Beveiligingswaarschuwing: Het wijzigen van deze optie kan een beveiligingsrisico inhouden.'; +$lang['_configuration_manager'] = 'Configuratiemanager'; +$lang['_header_dokuwiki'] = 'DokuWiki-instellingen'; +$lang['_header_plugin'] = 'Plugin-instellingen'; +$lang['_header_template'] = 'Template-instellingen'; +$lang['_header_undefined'] = 'Ongedefinieerde instellingen'; +$lang['_basic'] = 'Basisinstellingen'; +$lang['_display'] = 'Beeldinstellingen'; +$lang['_authentication'] = 'Authenticatie-instellingen'; +$lang['_anti_spam'] = 'Anti-spaminstellingen'; +$lang['_editing'] = 'Pagina-wijzigingsinstellingen'; +$lang['_links'] = 'Link-instellingen'; +$lang['_media'] = 'Media-instellingen'; +$lang['_notifications'] = 'Meldingsinstellingen'; +$lang['_syndication'] = 'Syndication-instellingen'; +$lang['_advanced'] = 'Geavanceerde instellingen'; +$lang['_network'] = 'Netwerkinstellingen'; +$lang['_msg_setting_undefined'] = 'Geen metadata voor deze instelling.'; +$lang['_msg_setting_no_class'] = 'Geen class voor deze instelling.'; +$lang['_msg_setting_no_known_class'] = 'Setting class niet beschikbaar'; +$lang['_msg_setting_no_default'] = 'Geen standaard waarde.'; +$lang['title'] = 'Titel van de wiki'; +$lang['start'] = 'Naam startpagina'; +$lang['lang'] = 'Taal'; +$lang['template'] = 'Template ofwel het design van de wiki.'; +$lang['tagline'] = 'Ondertitel (als het template dat ondersteunt)'; +$lang['sidebar'] = 'Zijbalk-paginanaam (als het template dat ondersteunt), leeg veld betekent geen zijbalk'; +$lang['license'] = 'Onder welke licentie zou je tekst moeten worden gepubliceerd?'; +$lang['savedir'] = 'Directory om data op te slaan'; +$lang['basedir'] = 'Basisdirectory'; +$lang['baseurl'] = 'Basis-URL'; +$lang['cookiedir'] = 'Cookie pad. Laat leeg om de basis URL te gebruiken.'; +$lang['dmode'] = 'Directory-aanmaak-modus (directory creation mode)'; +$lang['fmode'] = 'Bestandaanmaak-modus (file creation mode)'; +$lang['allowdebug'] = 'Debug toestaan uitzetten indien niet noodzakelijk!'; +$lang['recent'] = 'Het aantal regels in Recente wijzigingen'; +$lang['recent_days'] = 'Hoeveel recente wijzigingen bewaren (dagen)'; +$lang['breadcrumbs'] = 'Aantal broodkruimels. Zet dit op 0 om uit te schakelen.'; +$lang['youarehere'] = 'Gebruik hiërarchische broodkruimels (waarschijnlijk wil je dan de optie hierboven uitschakelen)'; +$lang['fullpath'] = 'Volledig pad van pagina\'s in de footer weergeven'; +$lang['typography'] = 'Breng typografische wijzigingen aan'; +$lang['dformat'] = 'Datum formaat (zie de PHP strftime functie)'; +$lang['signature'] = 'Tekst die ingevoegd wordt met de Handtekening-knop in het bewerkvenster.'; +$lang['showuseras'] = 'Hoe de gebruiker die de pagina het laatst wijzigde weergeven'; +$lang['toptoclevel'] = 'Bovenste niveau voor inhoudsopgave'; +$lang['tocminheads'] = 'Minimum aantal koppen dat bepaald of een index gemaakt wordt'; +$lang['maxtoclevel'] = 'Laagste niveau voor inhoudsopgave'; +$lang['maxseclevel'] = 'Laagste sectiewijzigingsniveau'; +$lang['camelcase'] = 'CamelCase gebruiken voor links'; +$lang['deaccent'] = 'Paginanamen ontdoen van vreemde tekens'; +$lang['useheading'] = 'Eerste kopje voor paginanaam gebruiken'; +$lang['sneaky_index'] = 'Met de standaardinstellingen zal DokuWiki alle namespaces laten zien in de index. Het inschakelen van deze optie zorgt ervoor dat de namespaces waar de gebruiker geen leestoegang tot heeft, verborgen worden. Dit kan resulteren in het verbergen van subnamespaces waar de gebruiker wel toegang to heeft. Dit kan de index onbruikbaar maken met bepaalde ACL-instellingen.'; +$lang['hidepages'] = 'Verberg deze pagina\'s in zoekresultaten, de index en andere automatische indexen (regular expressions)'; +$lang['useacl'] = 'Gebruik access control lists'; +$lang['autopasswd'] = 'Zelf wachtwoorden genereren'; +$lang['authtype'] = 'Authenticatiemechanisme'; +$lang['passcrypt'] = 'Encryptie-methode voor wachtwoord '; +$lang['defaultgroup'] = 'Standaardgroep, alle nieuwe gebruikers worden hierin geplaatst'; +$lang['superuser'] = 'Superuser - een groep of gebruiker of kommalijst (gebruiker1,@groep1,gebruiker2) met volledige toegang tot alle pagina\'s en functies, ongeacht de ACL instellingen'; +$lang['manager'] = 'Beheerder - een groep of gebruiker of kommalijst (gebruiker1,@groep1,gebruiker2) met toegang tot bepaalde beheersfunctionaliteit'; +$lang['profileconfirm'] = 'Bevestig profielwijzigingen met wachtwoord'; +$lang['rememberme'] = 'Permanente login cookie toestaan (onthoud mij)'; +$lang['disableactions'] = 'Aangevinkte DokuWiki-akties uitschakelen'; +$lang['disableactions_check'] = 'Controleer'; +$lang['disableactions_subscription'] = 'Inschrijven/opzeggen'; +$lang['disableactions_wikicode'] = 'Bron bekijken/exporteer rauw'; +$lang['disableactions_profile_delete'] = 'Schrap eigen account'; +$lang['disableactions_other'] = 'Andere akties (gescheiden door komma\'s)'; +$lang['disableactions_rss'] = 'XML Syndication (RSS)'; +$lang['auth_security_timeout'] = 'Authenticatiebeveiligings-timeout (seconden)'; +$lang['securecookie'] = 'Moeten cookies die via HTTPS gezet zijn alleen via HTTPS verzonden worden door de browser? Zet deze optie uit als alleen het inloggen op de wiki beveiligd is, maar het gebruik verder niet.'; +$lang['remote'] = 'Activeer het remote API-systeem. Hiermee kunnen andere applicaties de wiki benaderen via XML-RPC of andere mechanismen.'; +$lang['remoteuser'] = 'Beperk toegang tot de remote API tot deze komma-lijst van groepen of gebruikers. Leeg betekent toegang voor iedereen.'; +$lang['usewordblock'] = 'Blokkeer spam op basis van woordenlijst'; +$lang['relnofollow'] = 'Gebruik rel="nofollow" voor externe links'; +$lang['indexdelay'] = 'Uitstel voor indexeren (sec)'; +$lang['mailguard'] = 'E-mailadressen onherkenbaar maken'; +$lang['iexssprotect'] = 'Controleer geüploade bestanden op mogelijk schadelijke JavaScript of HTML code'; +$lang['usedraft'] = 'Sla automatisch een concept op tijdens het wijzigen'; +$lang['locktime'] = 'Maximum leeftijd voor lockbestanden (sec)'; +$lang['cachetime'] = 'Maximum leeftijd voor cache (sec)'; +$lang['target____wiki'] = 'Doelvenster voor interne links'; +$lang['target____interwiki'] = 'Doelvenster voor interwiki-links'; +$lang['target____extern'] = 'Doelvenster voor externe links'; +$lang['target____media'] = 'Doelvenster voor medialinks'; +$lang['target____windows'] = 'Doelvenster voor windows links'; +$lang['mediarevisions'] = 'Mediarevisies activeren?'; +$lang['refcheck'] = 'Controleer of er verwijzingen bestaan naar een mediabestand voor het wijderen'; +$lang['gdlib'] = 'Versie GD Lib '; +$lang['im_convert'] = 'Path naar ImageMagick\'s convert tool'; +$lang['jpg_quality'] = 'JPG compressiekwaliteit (0-100)'; +$lang['fetchsize'] = 'Maximum grootte (bytes) die fetch.php mag downloaden van externe URLs, bijv. voor cachen of herschalen van externe afbeeldingen.'; +$lang['subscribers'] = 'Ondersteuning pagina-inschrijving aanzetten'; +$lang['subscribe_time'] = 'Inschrijvingsmeldingen en samenvattingen worden na deze tijdsduur (in seconden) verzonden. Deze waarde dient kleiner te zijn dan de tijd ingevuld bij "Hoeveel recente wijzigingen bewaren (dagen)"'; +$lang['notify'] = 'Stuur altijd e-mailnotificaties naar dit adres'; +$lang['registernotify'] = 'Stuur altijd informatie over nieuw geregistreerde gebruikers naar dit e-mailadres'; +$lang['mailfrom'] = 'E-mailadres van afzender voor automatische e-mail'; +$lang['mailreturnpath'] = 'Email adres voor de ontvanger van meldingen van niet-afleverbare berichten'; +$lang['mailprefix'] = 'Te gebruiken voorvoegsel voor onderwerp automatische email. Leeglaten gebruik de wikititel.'; +$lang['htmlmail'] = 'Zend multipart HTML e-mail. Dit ziet er beter uit, maar is groter. Uitschakelen betekent e-mail in platte tekst.'; +$lang['dontlog'] = 'Schakel logging uit voor de volgende opties.'; +$lang['sitemap'] = 'Genereer Google sitemap (dagen). 0 betekent uitschakelen.'; +$lang['rss_type'] = 'XML feed type'; +$lang['rss_linkto'] = 'XML feed linkt naar'; +$lang['rss_content'] = 'Wat moet er in de XML feed items weergegeven worden?'; +$lang['rss_update'] = 'XML feed verversingsinterval (sec)'; +$lang['rss_show_summary'] = 'XML feed samenvatting in titel weergeven'; +$lang['rss_show_deleted'] = 'XML-feed Toon verwijderde feeds'; +$lang['rss_media'] = 'Welk type verandering moet in de XML feed worden weergegeven?'; +$lang['rss_media_o_both'] = 'beide'; +$lang['rss_media_o_pages'] = 'pagina\'s'; +$lang['rss_media_o_media'] = 'media'; +$lang['updatecheck'] = 'Controleer op nieuwe versies en beveiligingswaarschuwingen? DokuWiki moet hiervoor contact opnemen met update.dokuwiki.org.'; +$lang['userewrite'] = 'Gebruik nette URL\'s'; +$lang['useslash'] = 'Gebruik slash (/) als scheiding tussen namepaces in URL\'s'; +$lang['sepchar'] = 'Woordscheider in paginanamen'; +$lang['canonical'] = 'Herleid URL\'s tot hun basisvorm'; +$lang['fnencode'] = 'Methode om niet-ASCII bestandsnamen te coderen.'; +$lang['autoplural'] = 'Controleer op meervoudsvormen in links'; +$lang['compression'] = 'Compressiemethode voor attic-bestanden'; +$lang['gzip_output'] = 'Gebruik gzip Content-Encoding voor xhtml'; +$lang['compress'] = 'Compacte CSS en javascript output'; +$lang['cssdatauri'] = 'Maximale omvang in bytes van in CSS gelinkte afbeeldingen die bij de stylesheet moeten worden ingesloten ter reductie van de HTTP request header overhead. 400 tot 600 is een geschikte omvang. Stel de omvang in op 0 om deze functionaliteit uit te schakelen.'; +$lang['send404'] = 'Stuur "HTTP 404/Page Not Found" voor niet-bestaande pagina\'s'; +$lang['broken_iua'] = 'Is de ignore_user_abort functie onbruikbaar op uw systeem? Dit kan een onbruikbare zoekindex tot gevolg hebben. IIS+PHP/CGI staat hier bekend om. Zie Bug 852 voor meer informatie.'; +$lang['xsendfile'] = 'Gebruik de X-Sendfile header om de webserver statische content te laten versturen? De webserver moet dit wel ondersteunen.'; +$lang['renderer_xhtml'] = 'Weergavesysteem voor de standaard (xhtml) wiki-uitvoer'; +$lang['renderer__core'] = '%s (dokuwiki core)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['search_nslimit'] = 'Beperk het zoeken tot de huidige X namespaces. Wanneer het zoeken wordt uitgevoerd vanaf een pagina binnen een diepere namespace, worden de eerste X aantal namespaces toegevoegd als filter'; +$lang['search_fragment'] = 'Specifeer het standaard zoekgedrag voor fragmenten'; +$lang['search_fragment_o_exact'] = 'exact'; +$lang['search_fragment_o_starts_with'] = 'begint met'; +$lang['search_fragment_o_ends_with'] = 'eindigt op'; +$lang['search_fragment_o_contains'] = 'bevat'; +$lang['trustedproxy'] = 'Vertrouw op doorstuurproxy\'s die overeenkomen met deze reguliere expressie over het echte client-IP dat ze rapporteren. De standaard komt overeen met lokale netwerken. Laat leeg om geen proxy te vertrouwen.'; +$lang['_feature_flags'] = 'Functievlaggen'; +$lang['defer_js'] = 'Stel uitvoeren van javascript uit todat de HTML van de pagina is geparsed. Verbetert de waargenomen paginasnelheid, maar kan bij een klein aantal plug-ins voor problemen zorgen.'; +$lang['dnslookups'] = 'DokuWiki zoekt de hostnamen van IP-adressen van gebruikers die pagina wijzigen op. Schakel deze optie uit als je geen of een langzame DNS server hebt.'; +$lang['jquerycdn'] = 'Moet er een CDN gebruikt worden om de jQuery en jQuery UI bestanden te laden. Dit zorgt voor extra HTTP verzoeken, maar bestanden laden mogelijk sneller en zitten misschien al in de cache van de gebruiker.'; +$lang['jquerycdn_o_0'] = 'Geen CDN gebruiken'; +$lang['jquerycdn_o_jquery'] = 'Gebruik code.jquery.com CDN'; +$lang['jquerycdn_o_cdnjs'] = 'Gebruik cdnjs.com CDN'; +$lang['proxy____host'] = 'Proxy server'; +$lang['proxy____port'] = 'Proxy port'; +$lang['proxy____user'] = 'Proxy gebruikersnaam'; +$lang['proxy____pass'] = 'Proxy wachtwoord'; +$lang['proxy____ssl'] = 'Gebruik SSL om een verbinding te maken met de proxy'; +$lang['proxy____except'] = 'Reguliere expressie om URL\'s te bepalen waarvoor de proxy overgeslagen moet worden.'; +$lang['license_o_'] = 'Geen gekozen'; +$lang['typography_o_0'] = 'geen'; +$lang['typography_o_1'] = 'Alleen dubbele aanhalingstekens'; +$lang['typography_o_2'] = 'Alle aanhalingstekens (functioneert mogelijk niet altijd)'; +$lang['userewrite_o_0'] = 'geen'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki intern'; +$lang['deaccent_o_0'] = 'uit'; +$lang['deaccent_o_1'] = 'accenten verwijderen'; +$lang['deaccent_o_2'] = 'romaniseer'; +$lang['gdlib_o_0'] = 'GD Lib niet beschikbaar'; +$lang['gdlib_o_1'] = 'Version 1.x'; +$lang['gdlib_o_2'] = 'Autodetectie'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstract'; +$lang['rss_content_o_diff'] = 'Unified Diff'; +$lang['rss_content_o_htmldiff'] = 'Diff-tabel in HTML'; +$lang['rss_content_o_html'] = 'Volledige pagina-inhoud in HTML'; +$lang['rss_linkto_o_diff'] = 'verschillen'; +$lang['rss_linkto_o_page'] = 'de gewijzigde pagina'; +$lang['rss_linkto_o_rev'] = 'lijst van revisies'; +$lang['rss_linkto_o_current'] = 'de huidige pagina'; +$lang['compression_o_0'] = 'geen'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'niet gebruiken'; +$lang['xsendfile_o_1'] = 'Merkgebonden lighttpd header (voor release 1.5)'; +$lang['xsendfile_o_2'] = 'Standaard X-Sendfile header'; +$lang['xsendfile_o_3'] = 'Merkgebonden Nginx X-Accel-Redirect header'; +$lang['showuseras_o_loginname'] = 'Loginnaam'; +$lang['showuseras_o_username'] = 'Volledige naam'; +$lang['showuseras_o_username_link'] = 'Gebruikers volledige naam als interwiki gebruikers link'; +$lang['showuseras_o_email'] = 'E-mailadres (onherkenbaar gemaakt volgens mailguard-instelling)'; +$lang['showuseras_o_email_link'] = 'E-mailadres als mailto: link'; +$lang['useheading_o_0'] = 'Nooit'; +$lang['useheading_o_navigation'] = 'Alleen navigatie'; +$lang['useheading_o_content'] = 'Alleen wiki inhoud'; +$lang['useheading_o_1'] = 'Altijd'; +$lang['readdircache'] = 'Maximale leeftijd voor readdir cache (in seconden)'; diff --git a/lib/plugins/config/lang/no/intro.txt b/lib/plugins/config/lang/no/intro.txt new file mode 100644 index 0000000..5684a90 --- /dev/null +++ b/lib/plugins/config/lang/no/intro.txt @@ -0,0 +1,7 @@ +====== Konfigurasjonsinnstillinger ====== + +Bruk denne siden for å kontrollere innstillingene for din DokuWiki. For hjelp om hver enkelt innstilling, se [[doku>config]]. For mer detaljer om denne innstillingssiden, se [[doku>plugin:config]]. + +Innstillinger vist med lys rød bakgrunn er beskyttet og kan ikke endres på denne siden. Innstillinger vist med blå bakgrunn er standardverdier og innstillinger med hvit bakgrunn har blitt satt lokalt for denne installasjonen. Både blå og hvite innstillinger kan endres. + +Husk å trykke på **Lagre**-knappen før du forlater siden. Hvis ikke går dine endringer tapt. diff --git a/lib/plugins/config/lang/no/lang.php b/lib/plugins/config/lang/no/lang.php new file mode 100644 index 0000000..da86c58 --- /dev/null +++ b/lib/plugins/config/lang/no/lang.php @@ -0,0 +1,208 @@ + + * @author Rut Kristin Aanestad + * @author ThorPrestboen + * @author Christian McKenna + * @author Thomas Nygreen + * @author Arild Burud + * @author Torkill Bruland + * @author Rune M. Andersen + * @author Jakob Vad Nielsen (me@jakobnielsen.net) + * @author Kjell Tore Næsgaard + * @author Knut Staring + * @author Lisa Ditlefsen + * @author Erik Pedersen + * @author Rune Rasmussen + * @author Jon Bøe + * @author Egil Hansen + * @author Arne Hanssen + * @author Patrick Sletvold + */ +$lang['menu'] = 'Konfigurasjonsinnstillinger'; +$lang['error'] = 'Innstillingene ble ikke oppdatert på grunn av en eller flere ugyldig verdier. Vennligst se gjennom endringene og prøv på nytt. +
    Ugyldige verdi(er) vil vises i rød ramme.'; +$lang['updated'] = 'Innstillingene ble oppdatert.'; +$lang['nochoice'] = '(ingen andre mulige valg)'; +$lang['locked'] = 'Innstillingene kan ikke oppdateres. Hvis dette ikke er meningen,
    +forsikre deg om at fila med de lokale innstillingene har korrekt filnavn
    +og tillatelser.'; +$lang['danger'] = 'Advarsel: Endring av dette valget kan føre til at wiki og konfigurasjonsmenyen ikke blir tilgjengelig.'; +$lang['warning'] = 'Advarsel: Endring av dette valget kan føre til utilsiktet atferd. + +'; +$lang['security'] = 'Sikkerhetsadvarsel: Endring av dette valget kan innebære en sikkerhetsrisiko.'; +$lang['_configuration_manager'] = 'Konfigurasjonsinnstillinger'; +$lang['_header_dokuwiki'] = 'Innstillinger for DokuWiki'; +$lang['_header_plugin'] = 'Innstillinger for programtillegg'; +$lang['_header_template'] = 'Innstillinger for maler'; +$lang['_header_undefined'] = 'Udefinerte innstillinger'; +$lang['_basic'] = 'Grunnleggende innstillinger'; +$lang['_display'] = 'Innstillinger for visning av sider'; +$lang['_authentication'] = 'Innstillinger for autentisering'; +$lang['_anti_spam'] = 'Anti-Spam innstillinger'; +$lang['_editing'] = 'Innstillinger for redigering'; +$lang['_links'] = 'Innstillinger for lenker'; +$lang['_media'] = 'Innstillinger for mediafiler'; +$lang['_notifications'] = 'Melding'; +$lang['_syndication'] = 'Informasjonsstrøm (RSS)'; +$lang['_advanced'] = 'Avanserte innstillinger'; +$lang['_network'] = 'Nettverksinnstillinger'; +$lang['_msg_setting_undefined'] = 'Ingen innstillingsmetadata'; +$lang['_msg_setting_no_class'] = 'Ingen innstillingsklasse'; +$lang['_msg_setting_no_default'] = 'Ingen standard verdi'; +$lang['title'] = 'Navn på Wikien'; +$lang['start'] = 'Sidenavn på forsiden'; +$lang['lang'] = 'Språk'; +$lang['template'] = 'Mal'; +$lang['tagline'] = 'Slagord (dersom malen støtter dette)'; +$lang['sidebar'] = 'Sidestolpens navn (dersom malen støtter dette), la stå tomt for å slå av sidestolpen'; +$lang['license'] = 'Under hvilken lisens skal ditt innhold utgis?'; +$lang['savedir'] = 'Mappe for lagring av data'; +$lang['basedir'] = 'Sti til hovekatalog (eks. /dokuwiki/). La stå blank for automatisk deteksjon.'; +$lang['baseurl'] = 'Nettadresse til server (eks. http://www.yourserver.com). La stå blank for automatisk deteksjon.'; +$lang['cookiedir'] = 'Sti for informasjonskapsler. La stå blankt for å bruke nettadresse til server.'; +$lang['dmode'] = 'Rettigheter for nye mapper'; +$lang['fmode'] = 'Rettigheter for nye filer'; +$lang['allowdebug'] = 'Tillat feilsøking skru av om det ikke behøves!'; +$lang['recent'] = 'Siste endringer'; +$lang['recent_days'] = 'Hvor lenge skal nylige endringer beholdes (dager)'; +$lang['breadcrumbs'] = 'Antall nylig besøkte sider som vises'; +$lang['youarehere'] = 'Vis hvor i hvilke(t) navnerom siden er'; +$lang['fullpath'] = 'Vis full sti til sider i bunnteksten'; +$lang['typography'] = 'Gjør typografiske erstatninger'; +$lang['dformat'] = 'Datoformat (se PHPs datofunksjon)'; +$lang['signature'] = 'Signatur'; +$lang['showuseras'] = 'Hva som skal med når man viser brukeren som sist redigerte en side.'; +$lang['toptoclevel'] = 'Toppnivå for innholdsfortegnelse'; +$lang['tocminheads'] = 'Minimum antall overskrifter som bestemmer om innholdsbetegnelse skal bygges.'; +$lang['maxtoclevel'] = 'Maksimalt antall nivåer i innholdsfortegnelse'; +$lang['maxseclevel'] = 'Maksimalt nivå for redigering av seksjon'; +$lang['camelcase'] = 'Gjør KamelKasse til lenke automatisk'; +$lang['deaccent'] = 'Rensk sidenavn'; +$lang['useheading'] = 'Bruk første overskrift som tittel'; +$lang['sneaky_index'] = 'DokuWiki vil som standard vise alle navnerom i innholdsfortegnelsen. Hvis du skrur på dette alternativet vil brukere bare se de navnerommene der de har lesetilgang. Dette kan føre til at tilgjengelige undernavnerom skjules. Det kan gjøre innholdsfortegnelsen ubrukelig med enkelte ACL-oppsett.'; +$lang['hidepages'] = 'Skjul sider fra automatiske lister (regulære uttrykk)'; +$lang['useacl'] = 'Bruk lister for adgangskontroll (ACL)'; +$lang['autopasswd'] = 'Generer passord automatisk'; +$lang['authtype'] = 'Autentiseringsmetode'; +$lang['passcrypt'] = 'Metode for kryptering av passord'; +$lang['defaultgroup'] = 'Standardgruppe'; +$lang['superuser'] = 'Superbruker - en gruppe, bruker eller liste (kommaseparert) med full tilgang til alle sider og funksjoner uavhengig av ACL-innstillingene'; +$lang['manager'] = 'Administrator - en gruppe, bruker eller liste (kommaseparert) med tilgang til visse administratorfunksjoner'; +$lang['profileconfirm'] = 'Bekreft profilendringer med passord'; +$lang['rememberme'] = 'Tillat permanente informasjonskapsler for innlogging (husk meg)'; +$lang['disableactions'] = 'Skru av følgende DokuWiki-kommandoer'; +$lang['disableactions_check'] = 'Sjekk'; +$lang['disableactions_subscription'] = 'Meld på/av'; +$lang['disableactions_wikicode'] = 'Vis kildekode/eksporter rådata'; +$lang['disableactions_profile_delete'] = 'Slett egen konto'; +$lang['disableactions_other'] = 'Andre kommandoer (kommaseparert)'; +$lang['disableactions_rss'] = 'XML-informasjonsstrøm (RSS)'; +$lang['auth_security_timeout'] = 'Autentisering utløper etter (sekunder)'; +$lang['securecookie'] = 'Skal informasjonskapsler satt via HTTPS kun sendes via HTTPS av nettleseren? Skal ikke velges dersom bare innloggingen til din wiki er sikret med SSL, og annen navigering på wikien er usikret.'; +$lang['remote'] = 'Slå på det eksterne API-grensesnittet. Dette gir andre program tilgang til denne wikien via XML-RPC, eller via andre mekanismer.'; +$lang['remoteuser'] = 'Begrens ekstern API-tilgang til bare å gjelde denne kommaseparerte listen med grupper eller brukere. La stå tomt for å gi tilgang for alle.'; +$lang['usewordblock'] = 'Blokker søppel basert på ordliste'; +$lang['relnofollow'] = 'Bruk rel="nofollow" på eksterne lenker'; +$lang['indexdelay'] = 'Forsinkelse før indeksering (sekunder)'; +$lang['mailguard'] = 'Beskytt e-postadresser'; +$lang['iexssprotect'] = 'Sjekk om opplastede filer inneholder skadelig JavaScrips- eller HTML-kode'; +$lang['usedraft'] = 'Lagre kladd automatisk ved redigering'; +$lang['locktime'] = 'Maksimal alder på låsefiler (sekunder)'; +$lang['cachetime'] = 'Maksimal alder på hurtiglager (sekunder)'; +$lang['target____wiki'] = 'Mål for interne lenker'; +$lang['target____interwiki'] = 'Mål for interwiki-lenker'; +$lang['target____extern'] = 'Mål for eksterne lenker'; +$lang['target____media'] = 'Mål for lenker til mediafiler'; +$lang['target____windows'] = 'Mål for lenker til nettverksstasjoner i Windows'; +$lang['mediarevisions'] = 'Slå på mediaversjonering?'; +$lang['refcheck'] = 'Sjekk referanser før mediafiler slettes'; +$lang['gdlib'] = 'Versjon av libGD'; +$lang['im_convert'] = 'Sti til ImageMagicks konverteringsverktøy'; +$lang['jpg_quality'] = 'JPEG-kvalitet (0-100)'; +$lang['fetchsize'] = 'Maksimal størrelse (i byte) fetch.php kan laste eksternt'; +$lang['subscribers'] = 'Åpne for abonnement på endringer av en side'; +$lang['subscribe_time'] = 'Hvor lenge det skal gå mellom utsending av e-poster med endringer (i sekunder). Denne verdien bør være mindre enn verdien i recent_days.'; +$lang['notify'] = 'Send meldinger om endringer til denne e-postadressen'; +$lang['registernotify'] = 'Send info om nylig registrerte brukere til denne e-postadressen'; +$lang['mailfrom'] = 'Avsenderadresse for automatiske e-poster'; +$lang['mailprefix'] = 'Tekst å henge på i starten av emne-feltet i automatiske e-poster. La stå blank for å bruke wikiens tittel. '; +$lang['htmlmail'] = 'Send e-poster som HTMLmultipart-form, e-postene vil da se bedre ut. Skru av for å sende e-poster i ren-tekstform.'; +$lang['sitemap'] = 'Lag Google-sidekart (dager)'; +$lang['rss_type'] = 'Type XML-feed'; +$lang['rss_linkto'] = 'XML-feed lenker til'; +$lang['rss_content'] = 'Hva skal vises i XML-feed elementer?'; +$lang['rss_update'] = 'Intervall for oppdatering av XML-feed (sekunder)'; +$lang['rss_show_summary'] = 'Vis redigeringskommentar i tittelen på elementer i XML-feed '; +$lang['rss_media'] = 'Hvilke typer endringer skal listes i XML-strømmen?'; +$lang['updatecheck'] = 'Se etter oppdateringer og sikkerhetsadvarsler? Denne funksjonen er avhengig av å kontakte update.dokuwiki.org.'; +$lang['userewrite'] = 'Bruk pene URLer'; +$lang['useslash'] = 'Bruk / som skilletegn mellom navnerom i URLer'; +$lang['sepchar'] = 'Skilletegn mellom ord i sidenavn'; +$lang['canonical'] = 'Bruk fulle URLer (i stedet for relative)'; +$lang['fnencode'] = 'Metode for å kode ikke-ASCII-filnavn'; +$lang['autoplural'] = 'Se etter flertallsformer i lenker'; +$lang['compression'] = 'Metode for komprimering av gamle filer'; +$lang['gzip_output'] = 'Bruk gzip Content-Encoding for XHTML'; +$lang['compress'] = 'Kompakt CSS og JavaScript'; +$lang['cssdatauri'] = 'Opp til denne størrelsen (i byte) skal bilder som er vist til i CSS-filer kodes direkte inn i fila for å redusere antall HTTP-forespørsler. Denne teknikken fungerer ikke i IE < 8! Mellom 400 og 600 bytes er fornuftige verdier. Bruk 0 for å skru av funksjonen.'; +$lang['send404'] = 'Send "HTTP 404/Page Not Found" for ikke-eksisterende sider'; +$lang['broken_iua'] = 'Er funksjonen ignore_user_abort på ditt system ødelagt? Dette kan gjøre at indeksering av søk ikke fungerer. Dette er et kjent problem med IIS+PHP/CGI. Se Bug 852 for mer informasjon.'; +$lang['xsendfile'] = 'Bruk X-Sendfile header for å la webserver levere statiske filer? Din webserver må støtte dette.'; +$lang['renderer_xhtml'] = 'Renderer til bruk for wiki-output (XHTML)'; +$lang['renderer__core'] = '%s (dokuwikikjerne)'; +$lang['renderer__plugin'] = '%s (programutvidelse)'; +$lang['dnslookups'] = 'Dokuwiki vil, for sider som blir redigert, slå opp vertsnavn for brukere med eksterne IP-adresse Hvis du har en treg, eller en ikke fungerende DNS-server bør du deaktivere dette alternativet'; +$lang['proxy____host'] = 'Navn på proxyserver'; +$lang['proxy____port'] = 'Port på på proxyserver'; +$lang['proxy____user'] = 'Brukernavn på proxyserver'; +$lang['proxy____pass'] = 'Passord på proxyserver'; +$lang['proxy____ssl'] = 'Bruk SSL for å koble til proxyserver'; +$lang['proxy____except'] = 'Regulært uttrykk for URLer som ikke trenger bruk av proxy'; +$lang['license_o_'] = 'Ingen valgt'; +$lang['typography_o_0'] = 'ingen'; +$lang['typography_o_1'] = 'Kun doble anførselstegn'; +$lang['typography_o_2'] = 'Alle anførselstegn (virker ikke alltid)'; +$lang['userewrite_o_0'] = 'ingen'; +$lang['userewrite_o_1'] = 'Apache (.htaccess)'; +$lang['userewrite_o_2'] = 'DokuWiki internt'; +$lang['deaccent_o_0'] = 'av'; +$lang['deaccent_o_1'] = 'fjern aksenter'; +$lang['deaccent_o_2'] = 'bytt til kun latinske bokstaver'; +$lang['gdlib_o_0'] = 'GD lib ikke tilgjengelig'; +$lang['gdlib_o_1'] = 'Versjon 1.x'; +$lang['gdlib_o_2'] = 'Oppdag automatisk'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Ingress'; +$lang['rss_content_o_diff'] = 'Ulikh. sammenslått'; +$lang['rss_content_o_htmldiff'] = 'HTML-formatert endr. tabell'; +$lang['rss_content_o_html'] = 'Full HTML sideinnhold'; +$lang['rss_linkto_o_diff'] = 'endringsvisning'; +$lang['rss_linkto_o_page'] = 'den endrede siden'; +$lang['rss_linkto_o_rev'] = 'liste over endringer'; +$lang['rss_linkto_o_current'] = 'den nåværende siden'; +$lang['compression_o_0'] = 'ingen'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'ikke bruk'; +$lang['xsendfile_o_1'] = 'Proprietær lighttpd header (før release 1.5)'; +$lang['xsendfile_o_2'] = 'Standard X-Sendfile header'; +$lang['xsendfile_o_3'] = 'Proprietær Nginx X-Accel-Redirect header'; +$lang['showuseras_o_loginname'] = 'Brukernavn'; +$lang['showuseras_o_username'] = 'Brukerens fulle navn'; +$lang['showuseras_o_username_link'] = 'Brukers fulle navn som interwiki-brukerlenke'; +$lang['showuseras_o_email'] = 'Brukerens e-postadresse (tilpasset i henhold til mailguar-instilling)'; +$lang['showuseras_o_email_link'] = 'Brukerens e-postaddresse som "mailto:"-lenke'; +$lang['useheading_o_0'] = 'Aldri'; +$lang['useheading_o_navigation'] = 'Kun navigering'; +$lang['useheading_o_content'] = 'Kun wiki-innhold'; +$lang['useheading_o_1'] = 'Alltid'; +$lang['readdircache'] = 'Maksimal alder for mellomlagring av mappen med søkeindekser (sekunder)'; diff --git a/lib/plugins/config/lang/pl/intro.txt b/lib/plugins/config/lang/pl/intro.txt new file mode 100644 index 0000000..9d85c7a --- /dev/null +++ b/lib/plugins/config/lang/pl/intro.txt @@ -0,0 +1,7 @@ +====== Menadżer konfiguracji ====== + +Na tej stronie można zmienić ustawienia tej instalacji DokuWiki. W celu uzyskania pomocy na temat ustawień zajrzyj na stronę o [[doku>config|konfiguracji]]. W celu uzyskania informacji o tej wtyczce zajrzyj na stronę o [[doku>plugin:config|wtyczce]]. + +Ustawienia w kolorze jasnoczerwonym są chronione i nie mogą być zmienioną z użyciem tej wtyczki. Ustawienia w kolorze niebieskim mają domyślne wartości. Ustawienia w kolorze białym są specyficzne dla tej instalacji. Ustawienia w kolorach niebieskim i białym mogą być zmienione. + +W celu zapisania nowej konfiguracji naciśnij **zapisz** przed opuszczeniem tej strony. diff --git a/lib/plugins/config/lang/pl/lang.php b/lib/plugins/config/lang/pl/lang.php new file mode 100644 index 0000000..c65761a --- /dev/null +++ b/lib/plugins/config/lang/pl/lang.php @@ -0,0 +1,226 @@ + + * @author pavulondit + * @author Bartek S + * @author Wojciech Lichota + * @author Max + * @author Grzegorz Żur + * @author Mariusz Kujawski + * @author Maciej Kurczewski + * @author Sławomir Boczek + * @author Piotr JANKOWSKI + * @author sleshek + * @author Leszek Stachowski + * @author maros + * @author Grzegorz Widła + * @author Łukasz Chmaj + * @author Begina Felicysym + * @author Aoi Karasu + */ +$lang['menu'] = 'Ustawienia'; +$lang['error'] = 'Ustawienia nie zostały zapisane z powodu błędnych wartości, przejrzyj je i ponów próbę zapisu.
    Niepoprawne wartości są wyróżnione kolorem czerwonym.'; +$lang['updated'] = 'Ustawienia zostały zmienione.'; +$lang['nochoice'] = '(brak innych możliwości)'; +$lang['locked'] = 'Plik ustawień nie mógł zostać zmieniony, upewnij się, czy uprawnienia do pliku są odpowiednie.'; +$lang['danger'] = 'Uwaga: Zmiana tej opcji może uniemożliwić dostęp do twojej wiki oraz konfiguracji.'; +$lang['warning'] = 'Ostrzeżenie: Zmiana tej opcji może spowodować nieporządane skutki.'; +$lang['security'] = 'Alert bezpieczeństwa: Zmiana tej opcji może obniżyć bezpieczeństwo.'; +$lang['_configuration_manager'] = 'Menadżer konfiguracji'; +$lang['_header_dokuwiki'] = 'Ustawienia DokuWiki'; +$lang['_header_plugin'] = 'Ustawienia wtyczek'; +$lang['_header_template'] = 'Ustawienia motywu'; +$lang['_header_undefined'] = 'Inne ustawienia'; +$lang['_basic'] = 'Podstawowe'; +$lang['_display'] = 'Wygląd'; +$lang['_authentication'] = 'Autoryzacja'; +$lang['_anti_spam'] = 'Spam'; +$lang['_editing'] = 'Edycja'; +$lang['_links'] = 'Odnośniki'; +$lang['_media'] = 'Media'; +$lang['_notifications'] = 'Ustawienia powiadomień'; +$lang['_syndication'] = 'Ustawienia RSS'; +$lang['_advanced'] = 'Zaawansowane'; +$lang['_network'] = 'Sieć'; +$lang['_msg_setting_undefined'] = 'Brak danych o ustawieniu.'; +$lang['_msg_setting_no_class'] = 'Brak kategorii ustawień.'; +$lang['_msg_setting_no_known_class'] = 'Klasa ustawień niedostępna.'; +$lang['_msg_setting_no_default'] = 'Brak wartości domyślnej.'; +$lang['title'] = 'Tytuł wiki'; +$lang['start'] = 'Tytuł strony początkowej'; +$lang['lang'] = 'Język'; +$lang['template'] = 'Motyw'; +$lang['tagline'] = 'Motto (jeśli szablon daje taką możliwość)'; +$lang['sidebar'] = 'Nazwa strony paska bocznego (jeśli szablon je obsługuje), puste pole wyłącza pasek boczny'; +$lang['license'] = 'Pod jaką licencją publikować treści wiki?'; +$lang['savedir'] = 'Katalog z danymi'; +$lang['basedir'] = 'Katalog główny'; +$lang['baseurl'] = 'Główny URL'; +$lang['cookiedir'] = 'Ścieżka plików ciasteczek. Zostaw puste by użyć baseurl.'; +$lang['dmode'] = 'Tryb tworzenia katalogu'; +$lang['fmode'] = 'Tryb tworzenia pliku'; +$lang['allowdebug'] = 'Debugowanie (niebezpieczne!)'; +$lang['recent'] = 'Ilość ostatnich zmian'; +$lang['recent_days'] = 'Ilość ostatnich zmian (w dniach)'; +$lang['breadcrumbs'] = 'Długość śladu'; +$lang['youarehere'] = 'Ślad według struktury'; +$lang['fullpath'] = 'Wyświetlanie pełnych ścieżek'; +$lang['typography'] = 'Konwersja cudzysłowu, myślników itp.'; +$lang['dformat'] = 'Format daty'; +$lang['signature'] = 'Podpis'; +$lang['showuseras'] = 'Sposób wyświetlania nazwy użytkownika, który ostatnio edytował stronę'; +$lang['toptoclevel'] = 'Minimalny poziom spisu treści'; +$lang['tocminheads'] = 'Minimalna liczba nagłówków niezbędna do wytworzenia spisu treści.'; +$lang['maxtoclevel'] = 'Maksymalny poziom spisu treści'; +$lang['maxseclevel'] = 'Maksymalny poziom podziału na sekcje edycyjne'; +$lang['camelcase'] = 'Bikapitalizacja odnośników (CamelCase)'; +$lang['deaccent'] = 'Podmieniaj znaki spoza ASCII w nazwach'; +$lang['useheading'] = 'Pierwszy nagłówek jako tytuł'; +$lang['sneaky_index'] = 'Domyślnie, Dokuwiki pokazuje wszystkie katalogi w indeksie. Włączenie tej opcji ukryje katalogi, do których użytkownik nie ma praw. Może to spowodować ukrycie podkatalogów, do których użytkownik ma prawa. Ta opcja może spowodować błędne działanie indeksu w połączeniu z pewnymi konfiguracjami praw dostępu.'; +$lang['hidepages'] = 'Ukrywanie stron pasujących do wzorca (wyrażenie regularne)'; +$lang['useacl'] = 'Kontrola uprawnień ACL'; +$lang['autopasswd'] = 'Automatyczne generowanie haseł'; +$lang['authtype'] = 'Typ autoryzacji'; +$lang['passcrypt'] = 'Kodowanie hasła'; +$lang['defaultgroup'] = 'Domyślna grupa'; +$lang['superuser'] = 'Administrator - grupa lub użytkownik z pełnymi uprawnieniami'; +$lang['manager'] = 'Menadżer - grupa lub użytkownik z uprawnieniami do zarządzania wiki'; +$lang['profileconfirm'] = 'Potwierdzanie zmiany profilu hasłem'; +$lang['rememberme'] = 'Pozwól na ciasteczka automatycznie logujące (pamiętaj mnie)'; +$lang['disableactions'] = 'Wyłącz akcje DokuWiki'; +$lang['disableactions_check'] = 'Sprawdzanie'; +$lang['disableactions_subscription'] = 'Subskrypcje'; +$lang['disableactions_wikicode'] = 'Pokazywanie źródeł'; +$lang['disableactions_profile_delete'] = 'Usuń własne konto '; +$lang['disableactions_other'] = 'Inne akcje (oddzielone przecinkiem)'; +$lang['disableactions_rss'] = 'XML Syndication (RSS)'; +$lang['auth_security_timeout'] = 'Czas wygaśnięcia uwierzytelnienia (w sekundach)'; +$lang['securecookie'] = 'Czy ciasteczka wysłane do przeglądarki przez HTTPS powinny być przez nią odsyłane też tylko przez HTTPS? Odznacz tę opcję tylko wtedy, gdy logowanie użytkowników jest zabezpieczone SSL, ale przeglądanie stron odbywa się bez zabezpieczenia.'; +$lang['samesitecookie'] = 'Atrybut pliku cookie tej samej witryny do użycia. Pozostawienie go pustym pozwoli przeglądarce zdecydować o zasadach tej samej witryny.'; +$lang['remote'] = 'Włącz API zdalnego dostępu. Pozwoli to innym aplikacjom na dostęp do wiki poprzez XML-RPC lub inne mechanizmy.'; +$lang['remoteuser'] = 'Ogranicz dostęp poprzez API zdalnego dostępu do podanych grup lub użytkowników, oddzielonych przecinkami. Pozostaw to pole puste by pozwolić na dostęp be ograniczeń.'; +$lang['remotecors'] = 'Włącz udostępnianie zasobów między źródłami (CORS) dla interfejsów zdalnych. Gwiazdka (*), aby zezwolić na wszystkie źródła. Pozostaw puste, aby odrzucić CORS.'; +$lang['usewordblock'] = 'Blokowanie spamu na podstawie słów'; +$lang['relnofollow'] = 'Nagłówek rel="nofollow" dla odnośników zewnętrznych'; +$lang['indexdelay'] = 'Okres indeksowania w sekundach'; +$lang['mailguard'] = 'Utrudnianie odczytu adresów e-mail'; +$lang['iexssprotect'] = 'Wykrywanie złośliwego kodu JavaScript i HTML w plikach'; +$lang['usedraft'] = 'Automatyczne zapisywanie szkicu podczas edycji'; +$lang['locktime'] = 'Maksymalny wiek blokad w sekundach'; +$lang['cachetime'] = 'Maksymalny wiek cache w sekundach'; +$lang['target____wiki'] = 'Okno docelowe odnośników wewnętrznych'; +$lang['target____interwiki'] = 'Okno docelowe odnośników do innych wiki'; +$lang['target____extern'] = 'Okno docelowe odnośników zewnętrznych'; +$lang['target____media'] = 'Okno docelowe odnośników do plików'; +$lang['target____windows'] = 'Okno docelowe odnośników zasobów Windows'; +$lang['mediarevisions'] = 'Włączyć wersjonowanie multimediów?'; +$lang['refcheck'] = 'Sprawdzanie odwołań przed usunięciem pliku'; +$lang['gdlib'] = 'Wersja biblioteki GDLib'; +$lang['im_convert'] = 'Ścieżka do programu imagemagick'; +$lang['jpg_quality'] = 'Jakość kompresji JPG (0-100)'; +$lang['fetchsize'] = 'Maksymalny rozmiar pliku (w bajtach) jaki można pobrać z zewnątrz'; +$lang['subscribers'] = 'Subskrypcja'; +$lang['subscribe_time'] = 'Czas po którym są wysyłane listy subskrypcji i streszczenia (sek.); Powinna być to wartość większa niż podana w zmiennej recent_days.'; +$lang['notify'] = 'Wysyłanie powiadomień na adres e-mail'; +$lang['registernotify'] = 'Prześlij informacje o nowych użytkownikach na adres e-mail'; +$lang['mailfrom'] = 'Adres e-mail tego wiki'; +$lang['mailreturnpath'] = 'Adres e-mail odbiorcy dla powiadomień o niedostarczeniu'; +$lang['mailprefix'] = 'Prefiks tematu e-mail do automatycznych wiadomości'; +$lang['htmlmail'] = 'Wysyłaj wiadomości e-mail w formacie HTML, które wyglądają lepiej, lecz ich rozmiar jest większy. Wyłącz wysyłanie wiadomości zawierających tekst niesformatowany.'; +$lang['dontlog'] = 'Wyłącz logowanie dla tego typu logów.'; +$lang['logretain'] = 'Liczba dni przechowywania logów.'; +$lang['sitemap'] = 'Okres generowania Google Sitemap (w dniach)'; +$lang['rss_type'] = 'Typ RSS'; +$lang['rss_linkto'] = 'Odnośniki w RSS'; +$lang['rss_content'] = 'Rodzaj informacji wyświetlanych w RSS '; +$lang['rss_update'] = 'Okres aktualizacji RSS (w sekundach)'; +$lang['rss_show_summary'] = 'Podsumowanie w tytule'; +$lang['rss_show_deleted'] = 'Pokaż usunięte kanały'; +$lang['rss_media'] = 'Rodzaj zmian wyświetlanych w RSS'; +$lang['rss_media_o_both'] = 'oba'; +$lang['rss_media_o_pages'] = 'strony'; +$lang['rss_media_o_media'] = 'media'; +$lang['updatecheck'] = 'Sprawdzanie aktualizacji i bezpieczeństwa. DokuWiki będzie kontaktować się z serwerem update.dokuwiki.org.'; +$lang['userewrite'] = 'Proste adresy URL'; +$lang['useslash'] = 'Używanie ukośnika jako separatora w adresie URL'; +$lang['sepchar'] = 'Znak rozdzielający wyrazy nazw'; +$lang['canonical'] = 'Kanoniczne adresy URL'; +$lang['fnencode'] = 'Metoda kodowana nazw pików bez użycia ASCII.'; +$lang['autoplural'] = 'Automatyczne tworzenie liczby mnogiej'; +$lang['compression'] = 'Metoda kompresji dla usuniętych plików'; +$lang['gzip_output'] = 'Używaj kodowania GZIP dla zawartości XHTML'; +$lang['compress'] = 'Kompresja arkuszy CSS i plików JavaScript'; +$lang['cssdatauri'] = 'Rozmiar w bajtach, poniżej którego odwołania do obrazów w plikach CSS powinny być osadzone bezpośrednio w arkuszu stylów by zmniejszyć ogólne żądania nagłówków HTTP. 400 do 600 bajtów jest dobrą wartością. Ustaw 0 aby wyłączyć.'; +$lang['send404'] = 'Nagłówek "HTTP 404/Page Not Found" dla nieistniejących stron'; +$lang['broken_iua'] = 'Czy funkcja "ignore_user_abort" działa? Jeśli nie, może to powodować problemy z indeksem przeszukiwania. Funkcja nie działa przy konfiguracji oprogramowania IIS+PHP/CGI. Szczegółowe informacje: Bug 852.'; +$lang['xsendfile'] = 'Użyj nagłówka HTTP X-Sendfile w celu przesyłania statycznych plików. Serwer HTTP musi obsługiwać ten nagłówek.'; +$lang['renderer_xhtml'] = 'Mechanizm renderowania głównej treści strony (xhtml)'; +$lang['renderer__core'] = '%s (dokuwiki)'; +$lang['renderer__plugin'] = '%s (wtyczka)'; +$lang['search_nslimit'] = 'Ogranicz wyszukiwanie do bieżących przestrzeni nazw X. Gdy wyszukiwanie jest wykonywane ze strony w głębszej przestrzeni nazw, pierwsze przestrzenie nazw X zostaną dodane jako filtr'; +$lang['search_fragment'] = 'Określ domyślne zachowanie wyszukiwania fragmentów'; +$lang['search_fragment_o_exact'] = 'dokładny'; +$lang['search_fragment_o_starts_with'] = 'zaczyna się z'; +$lang['search_fragment_o_ends_with'] = 'kończy się z'; +$lang['search_fragment_o_contains'] = 'zawiera'; +$lang['trustedproxy'] = 'Zaufaj serwerom proxy odpowiadającym temu wyrażeniu regularnemu co do prawdziwego adresu IP klienta, który zgłaszają. Domyślnie dotyczy sieci lokalnych. Pozostaw puste, aby nie ufać żadnym serwerom proxy.'; +$lang['_feature_flags'] = 'Flagi funkcji'; +$lang['defer_js'] = 'Odrocz wykonanie skryptu JavaScript po przeanalizowaniu kodu HTML strony. Poprawia postrzeganą szybkość strony, ale może zepsuć niewielką liczbę wtyczek.'; +$lang['hidewarnings'] = 'Nie wyświetlaj żadnych ostrzeżeń wydawanych przez PHP. Może to ułatwić przejście na PHP8+. Ostrzeżenia będą nadal rejestrowane w dzienniku błędów i powinny być zgłaszane.'; +$lang['dnslookups'] = 'DokiWiki wyszuka nazwy hostów dla zdalnych adresów IP użytkowników edytujących strony. Jeśli twój serwer DNS działa zbyt wolno, uległ awarii lub nie chcesz używać wyszukiwania, wyłącz tę opcję.'; +$lang['jquerycdn'] = 'Czy pliki skryptów jQuery i jQuery UI powinny być ładowane z CDN? Powoduje to dodanie dodatkowych żądań HTTP, ale pliki mogą być ładowane szybciej, a użytkownicy mogą już je mieć zbuforowane.'; +$lang['jquerycdn_o_0'] = 'Bez CDN, tylko lokalne zasoby'; +$lang['jquerycdn_o_jquery'] = 'CDN z code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN z cdnjs.com'; +$lang['proxy____host'] = 'Proxy - serwer'; +$lang['proxy____port'] = 'Proxy - port'; +$lang['proxy____user'] = 'Proxy - nazwa użytkownika'; +$lang['proxy____pass'] = 'Proxy - hasło'; +$lang['proxy____ssl'] = 'Proxy - SSL'; +$lang['proxy____except'] = 'Wyrażenie regularne określające adresy URL, do których nie należy używać proxy.'; +$lang['license_o_'] = 'Nie wybrano żadnej'; +$lang['typography_o_0'] = 'brak'; +$lang['typography_o_1'] = 'tylko podwójne cudzysłowy'; +$lang['typography_o_2'] = 'wszystkie cudzysłowy (nie działa we wszystkich przypadkach)'; +$lang['userewrite_o_0'] = 'brak'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'dokuwiki'; +$lang['deaccent_o_0'] = 'zostaw oryginalną pisownię'; +$lang['deaccent_o_1'] = 'usuń litery'; +$lang['deaccent_o_2'] = 'zamień na ASCII'; +$lang['gdlib_o_0'] = 'biblioteka GDLib niedostępna'; +$lang['gdlib_o_1'] = 'wersja 1.x'; +$lang['gdlib_o_2'] = 'automatyczne wykrywanie'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Streszczenie'; +$lang['rss_content_o_diff'] = 'Różnice'; +$lang['rss_content_o_htmldiff'] = 'Różnice w postaci HTML'; +$lang['rss_content_o_html'] = 'Pełna strona w postaci HTML'; +$lang['rss_linkto_o_diff'] = 'różnice'; +$lang['rss_linkto_o_page'] = 'zmodyfikowana strona'; +$lang['rss_linkto_o_rev'] = 'lista zmian'; +$lang['rss_linkto_o_current'] = 'aktualna strona'; +$lang['compression_o_0'] = 'brak'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'nie używaj'; +$lang['xsendfile_o_1'] = 'Specyficzny nagłówek lightttpd (poniżej wersji 1.5)'; +$lang['xsendfile_o_2'] = 'Standardowy nagłówek HTTP X-Sendfile'; +$lang['xsendfile_o_3'] = 'Specyficzny nagłówek Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Login użytkownika'; +$lang['showuseras_o_username'] = 'Pełne nazwisko użytkownika'; +$lang['showuseras_o_username_link'] = 'Imię i nazwisko użytkownika jako połączenie między wiki'; +$lang['showuseras_o_email'] = 'E-mail użytkownika (ukrywanie według ustawień mailguard)'; +$lang['showuseras_o_email_link'] = 'Adresy e-mail użytkowników w formie linku mailto:'; +$lang['useheading_o_0'] = 'Nigdy'; +$lang['useheading_o_navigation'] = 'W nawigacji'; +$lang['useheading_o_content'] = 'W treści'; +$lang['useheading_o_1'] = 'Zawsze'; +$lang['readdircache'] = 'Maksymalny czas dla bufora readdir (w sek).'; diff --git a/lib/plugins/config/lang/pt-br/intro.txt b/lib/plugins/config/lang/pt-br/intro.txt new file mode 100644 index 0000000..db31de4 --- /dev/null +++ b/lib/plugins/config/lang/pt-br/intro.txt @@ -0,0 +1,7 @@ +====== Gerenciador de Configurações ====== + +Use essa página para controlar as configurações da instalação do seu DokuWiki. Para ajuda acerca dos itens, consulte [[doku>config]]. Para mais detalhes sobre esse plug-in, veja [[doku>plugin:config]]. + +Definições que apresentem um fundo vermelho claro são protegidas e não podem ser alteradas com esse plug-in. As definições com um fundo azul são o padrão e as com um fundo branco foram configuradas localmente para essa instalação em particular. Tanto as definições em azul quanto as em branco podem ser alteradas. + +Lembre-se de pressionar o botão **Salvar** antes de sair dessa página, caso contrário, suas configurações serão perdidas. diff --git a/lib/plugins/config/lang/pt-br/lang.php b/lib/plugins/config/lang/pt-br/lang.php new file mode 100644 index 0000000..811eee2 --- /dev/null +++ b/lib/plugins/config/lang/pt-br/lang.php @@ -0,0 +1,231 @@ + + * @author Paul Nizan + * @author Eduardo Mozart de Oliveira + * @author ANDRE BASSANI DE FREITAS + * @author Aleksandr Selivanov + * @author Davi Jorge + * @author Schopf + * @author Frederico Gonçalves Guimarães + * @author Márcio Gomes Gonçalves + * @author Felipe Castro + * @author Lucien Raven + * @author Enrico Nicoletto + * @author Flávio Veras + * @author Jeferson Propheta + * @author jair.henrique + * @author Luis Dantas + * @author Sergio Motta + * @author Isaias Masiero Filho + * @author Balaco Baco + * @author Victor Westmann + * @author Guilherme Cardoso + * @author Viliam Dias + */ +$lang['menu'] = 'Configurações do DokuWiki'; +$lang['error'] = 'As configurações não foram atualizadas devido a um valor inválido. Por favor, reveja suas alterações e reenvie-as.
    O(s) valor(es) incorreto(s) serão exibidos contornados por uma borda vermelha.'; +$lang['updated'] = 'As configurações foram atualizadas com sucesso.'; +$lang['nochoice'] = '(nenhuma outra opção disponível)'; +$lang['locked'] = 'Não foi possível atualizar o arquivo de configurações. Se isso
    +não for intencional, certifique-se de que o nome do arquivo e as
    +e as suas permissões estejam corretos.'; +$lang['danger'] = 'Perigo: Alterar esta opção poderá tornar o seu wiki e menu de configuração inacessíveis.'; +$lang['warning'] = 'Aviso: A alteração desta opção pode causar um comportamento indesejável.'; +$lang['security'] = 'Aviso de segurança: A alteração desta opção pode representar um risco de segurança.'; +$lang['_configuration_manager'] = 'Gerenciador de configurações'; +$lang['_header_dokuwiki'] = 'Configurações do DokuWiki'; +$lang['_header_plugin'] = 'Configurações de plug-ins'; +$lang['_header_template'] = 'Configurações de modelos'; +$lang['_header_undefined'] = 'Configurações indefinidas'; +$lang['_basic'] = 'Configurações básicas'; +$lang['_display'] = 'Configurações de exibição'; +$lang['_authentication'] = 'Configurações de autenticação'; +$lang['_anti_spam'] = 'Configurações do anti-spam'; +$lang['_editing'] = 'Configurações de edição'; +$lang['_links'] = 'Configurações de link'; +$lang['_media'] = 'Configurações de mídia'; +$lang['_notifications'] = 'Configurações de notificação'; +$lang['_syndication'] = 'Configurações de sindicância'; +$lang['_advanced'] = 'Configurações avançadas'; +$lang['_network'] = 'Configurações de rede'; +$lang['_msg_setting_undefined'] = 'Nenhum metadado configurado.'; +$lang['_msg_setting_no_class'] = 'Nenhuma classe definida.'; +$lang['_msg_setting_no_known_class'] = 'Classe de configuração não disponível.'; +$lang['_msg_setting_no_default'] = 'Nenhum valor padrão.'; +$lang['title'] = 'Título do wiki'; +$lang['start'] = 'Nome da página inicial'; +$lang['lang'] = 'Idioma'; +$lang['template'] = 'Modelo, ou a aparência do wiki.'; +$lang['tagline'] = 'Slogan (caso o modelo suporte isso)'; +$lang['sidebar'] = 'Nome da página da barra lateral (caso o modelo suporte isso). Deixe em branco para desabilitar a barra lateral.'; +$lang['license'] = 'Sob qual licença o seu conteúdo deve ser disponibilizado?'; +$lang['savedir'] = 'Diretório para salvar os dados'; +$lang['basedir'] = 'Diretório base'; +$lang['baseurl'] = 'URL base'; +$lang['cookiedir'] = 'Caminhos dos cookies. Deixe em branco para usar a url base.'; +$lang['dmode'] = 'Modo de criação do diretório'; +$lang['fmode'] = 'Modo de criação do arquivo'; +$lang['allowdebug'] = 'Habilitar a depuração (desabilite se não for necessário!)'; +$lang['recent'] = 'Modificações recentes'; +$lang['recent_days'] = 'Quantas mudanças recentes devem ser mantidas (dias)?'; +$lang['breadcrumbs'] = 'Número de elementos na trilha de páginas visitadas'; +$lang['youarehere'] = 'Trilha hierárquica'; +$lang['fullpath'] = 'Indica o caminho completo das páginas no rodapé'; +$lang['typography'] = 'Efetuar modificações tipográficas'; +$lang['dformat'] = 'Formato da data (veja a função strftime do PHP)'; +$lang['signature'] = 'Assinatura'; +$lang['showuseras'] = 'O que exibir quando mostrar o usuário que editou a página pela última vez'; +$lang['toptoclevel'] = 'Nível mais alto para a tabela de conteúdos'; +$lang['tocminheads'] = 'Quantidade mínima de cabeçalhos para a construção da tabela de conteúdos.'; +$lang['maxtoclevel'] = 'Nível máximo para entrar na tabela de conteúdos'; +$lang['maxseclevel'] = 'Nível máximo para gerar uma seção de edição'; +$lang['camelcase'] = 'Usar CamelCase para links'; +$lang['deaccent'] = '"Limpar" os nomes das páginas'; +$lang['useheading'] = 'Usar o primeiro cabeçalho como nome da página'; +$lang['sneaky_index'] = 'Por padrão, o DokuWiki irá exibir todos os espaços de nomes na visualização do índice. Ao habilitar essa opção, serão escondidos aqueles que o usuário não tiver permissão de leitura. Isso pode resultar na omissão de subespaços de nomes, tornando o índice inútil para certas configurações de ACL.'; +$lang['hidepages'] = 'Esconder páginas correspondentes (expressão regular)'; +$lang['useacl'] = 'Usar listas de controle de acesso'; +$lang['autopasswd'] = 'Gerar senhas automaticamente'; +$lang['authtype'] = 'Método de autenticação'; +$lang['passcrypt'] = 'Método de criptografia da senha'; +$lang['defaultgroup'] = 'Grupo padrão'; +$lang['superuser'] = 'Superusuário - um grupo, usuário ou uma lista separada por vírgulas (usuário1,@grupo1,usuário2) que tenha acesso completo a todas as páginas e funções, independente das definições da ACL'; +$lang['manager'] = 'Gerente - um grupo, usuário ou uma lista separada por vírgulas (usuário1,@grupo1,usuário2) que tenha acesso a certas funções de gerenciamento'; +$lang['profileconfirm'] = 'Confirmar mudanças no perfil com a senha'; +$lang['rememberme'] = 'Permitir cookies de autenticação permanentes ("Lembre-se de mim")'; +$lang['disableactions'] = 'Desabilitar as ações do DokuWiki'; +$lang['disableactions_check'] = 'Verificação'; +$lang['disableactions_subscription'] = 'Monitoramento'; +$lang['disableactions_wikicode'] = 'Ver a fonte/Exportar sem processamento'; +$lang['disableactions_profile_delete'] = 'Excluir a própria conta'; +$lang['disableactions_other'] = 'Outras ações (separadas por vírgula)'; +$lang['disableactions_rss'] = 'Sindicância XML (RSS)'; +$lang['auth_security_timeout'] = 'Tempo limite de segurança para autenticações (seg)'; +$lang['securecookie'] = 'Os cookies definidos via HTTPS devem ser enviados para o navegador somente via HTTPS? Desabilite essa opção quando somente a autenticação do seu wiki for realizada de maneira segura via SSL e a navegação, de maneira insegura.'; +$lang['remote'] = 'Habilitar o sistema de API remota. Isso permite que outras aplicações acessem o wiki via XML-RPC ou outros mecanismos.'; +$lang['remoteuser'] = 'Restringir o acesso à API remota aos grupos ou usuários definidos aqui (separados por vírgulas). Deixe em branco para permitir o acesso a qualquer um.'; +$lang['remotecors'] = 'Habilite o compartilhamento de recursos entre origens (CORS) para as interfaces remotas. Asterisco (*) para permitir todas as origens. Deixe em branco para negar o CORS.'; +$lang['usewordblock'] = 'Bloquear spam baseado em lista de palavras'; +$lang['relnofollow'] = 'Usar rel="nofollow" em links externos'; +$lang['indexdelay'] = 'Tempo de espera antes da indexação (seg)'; +$lang['mailguard'] = 'Obscurecer endereços de e-mail'; +$lang['iexssprotect'] = 'Verificar a existência de possíveis códigos maliciosos em HTML ou JavaScript nos arquivos enviados'; +$lang['usedraft'] = 'Salvar o rascunho automaticamente durante a edição'; +$lang['locktime'] = 'Tempo máximo para o bloqueio de arquivos (seg)'; +$lang['cachetime'] = 'Tempo máximo para o cache (seg)'; +$lang['target____wiki'] = 'Parâmetro "target" para links internos'; +$lang['target____interwiki'] = 'Parâmetro "target" para links interwiki'; +$lang['target____extern'] = 'Parâmetro "target" para links externos'; +$lang['target____media'] = 'Parâmetro "target" para links de mídia'; +$lang['target____windows'] = 'Parâmetro "target" para links do Windows'; +$lang['mediarevisions'] = 'Habilitar revisões de mídias?'; +$lang['refcheck'] = 'Verificação de referência da mídia'; +$lang['gdlib'] = 'Versão da biblioteca "GD Lib"'; +$lang['im_convert'] = 'Caminho para a ferramenta de conversão ImageMagick'; +$lang['jpg_quality'] = 'Qualidade de compressão do JPG (0-100)'; +$lang['fetchsize'] = 'Tamanho máximo (em bytes) que o "fetch.php" pode transferir do exterior'; +$lang['subscribers'] = 'Habilitar o suporte ao monitoramento de páginas'; +$lang['subscribe_time'] = 'Tempo de espera antes do envio das listas e mensagens de monitoramento (segundos); este tempo deve ser menor que o especificado no parâmetro recent_days'; +$lang['notify'] = 'Enviar notificações de mudança para esse endereço de e-mail'; +$lang['registernotify'] = 'Enviar informações de usuários registrados para esse endereço de e-mail'; +$lang['mailfrom'] = 'Endereço de e-mail a ser utilizado para mensagens automáticas'; +$lang['mailreturnpath'] = 'Endereço de e-mail do destinatário para notificações de falha de entrega'; +$lang['mailprefix'] = 'Prefixo do assunto dos e-mails de envio automático'; +$lang['htmlmail'] = 'Enviar e-mail HTML multipartes, que têm uma aparência melhor, mas um tamanho maior. Desabilite para enviar e-mails em texto puro.'; +$lang['dontlog'] = 'Desabilita o registro de log para os seguintes tipos de logs.'; +$lang['sitemap'] = 'Gerar Google Sitemap (dias)'; +$lang['rss_type'] = 'Tipo de fonte XML'; +$lang['rss_linkto'] = 'Os links da fonte XML apontam para'; +$lang['rss_content'] = 'O que deve ser exibido nos itens da fonte XML?'; +$lang['rss_update'] = 'Intervalo de atualização da fonte XML (seg)'; +$lang['rss_show_summary'] = 'Resumo de exibição da fonte XML no título'; +$lang['rss_show_deleted'] = 'Feed XML Mostrar feeds excluídos'; +$lang['rss_media'] = 'Que tipo de alterações devem ser listadas na fonte XML?'; +$lang['rss_media_o_both'] = 'ambos'; +$lang['rss_media_o_pages'] = 'páginas'; +$lang['rss_media_o_media'] = 'mídia'; +$lang['updatecheck'] = 'Verificar atualizações e avisos de segurança? O DokuWiki precisa contactar o "splitbrain.org" para efetuar esse recurso.'; +$lang['userewrite'] = 'Usar URLs "limpas"'; +$lang['useslash'] = 'Usar a barra como separador de espaços de nomes nas URLs'; +$lang['sepchar'] = 'Separador de palavras no nome da página'; +$lang['canonical'] = 'Usar URLs absolutas (http://servidor/caminho)'; +$lang['fnencode'] = 'Método de codificação não-ASCII de nome de arquivos.'; +$lang['autoplural'] = 'Verificar formas plurais nos links'; +$lang['compression'] = 'Método de compressão para arquivos antigos'; +$lang['gzip_output'] = 'Usar "Content-Encoding" do gzip para o código xhtml'; +$lang['compress'] = 'Compactar as saídas de CSS e JavaScript'; +$lang['cssdatauri'] = 'Tamanho máximo em bytes para o qual as imagens referenciadas em arquivos CSS devam ser incorporadas na folha de estilos (o arquivo CSS) para reduzir o custo dos pedidos HTTP. Essa técnica não funcionará na versões do IE < 8! Valores de 400 a 600 são bons. Defina o valor 0 para desativar.'; +$lang['send404'] = 'Enviar "HTTP 404/Página não encontrada" para páginas não existentes'; +$lang['broken_iua'] = 'A função "ignore_user_abort" está com defeito no seu sistema? Isso pode causar um índice de busca defeituoso. IIS+PHP/CGI reconhecidamente possui esse erro. Veja o bug 852 para mais informações.'; +$lang['xsendfile'] = 'Usar o cabeçalho "X-Sendfile" para permitir que o servidor web encaminhe arquivos estáticos? Seu servidor web precisa ter suporte a isso.'; +$lang['renderer_xhtml'] = 'Renderizador a ser utilizado para a saída principal (xhtml) do wiki'; +$lang['renderer__core'] = '%s (núcleo do DokuWiki)'; +$lang['renderer__plugin'] = '%s ("plug-in")'; +$lang['search_nslimit'] = 'Limite a pesquisa aos atuais X espaços de nomes. Quando uma pesquisa é executada a partir de uma página em um espaço de nomes mais interno, os primeiros X espaços de nomes serão adicionados como filtro'; +$lang['search_fragment'] = 'Especifique o comportamento padrão da pesquisa de fragmentos'; +$lang['search_fragment_o_exact'] = 'exato'; +$lang['search_fragment_o_starts_with'] = 'começa com'; +$lang['search_fragment_o_ends_with'] = 'termina com'; +$lang['search_fragment_o_contains'] = 'contém'; +$lang['trustedproxy'] = 'Confie nos proxies de encaminhamento que correspondem a essa expressão regular sobre o verdadeiro IP do cliente que eles relatam. O padrão corresponde às redes locais. Deixe em branco para não confiar em proxy.'; +$lang['_feature_flags'] = 'Sinalizadores de recursos'; +$lang['defer_js'] = 'Adie o javascript para ser executado após a análise do HTML da página. Melhora a velocidade percebida da página, mas pode interromper um pequeno número de plugins.'; +$lang['hidewarnings'] = 'Não exiba nenhum aviso emitido pelo PHP. Isso pode facilitar a transição para PHP8+. Os avisos ainda serão registrados no log de erros e devem ser relatados.'; +$lang['dnslookups'] = 'O DokuWiki procurará pelo nome de host dos endereços IP remotos dos usuários que estão editando as páginas. Caso você tenha um DNS lento, ele não esteja funcionando ou, ainda, você não queira esse recurso, desabilite essa opção.'; +$lang['jquerycdn'] = 'Os scripts jQuery e jQuery UI devem ser carregados a partir de uma CND? Isso adiciona requisições HTTP adicionais, mas os arquivos podem carregar mais rapidamente e os usuários podem já tê-los no cache.'; +$lang['jquerycdn_o_0'] = 'Sem CDN, somente entrega local'; +$lang['jquerycdn_o_jquery'] = 'CDN em code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN em cdnjs.com'; +$lang['proxy____host'] = 'Nome do servidor proxy'; +$lang['proxy____port'] = 'Porta do proxy'; +$lang['proxy____user'] = 'Nome de usuário do proxy'; +$lang['proxy____pass'] = 'Senha do proxy'; +$lang['proxy____ssl'] = 'Usar SSL para conectar ao proxy'; +$lang['proxy____except'] = 'Expressões regulares de URL para excessão de proxy.'; +$lang['license_o_'] = 'Nenhuma escolha'; +$lang['typography_o_0'] = 'nenhuma'; +$lang['typography_o_1'] = 'excluir aspas simples'; +$lang['typography_o_2'] = 'incluir aspas simples (nem sempre funciona)'; +$lang['userewrite_o_0'] = 'não'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'interno do DokuWiki'; +$lang['deaccent_o_0'] = 'não'; +$lang['deaccent_o_1'] = 'remover acentos'; +$lang['deaccent_o_2'] = 'romanizar'; +$lang['gdlib_o_0'] = 'a "GD Lib" não está disponível'; +$lang['gdlib_o_1'] = 'versão 1.x'; +$lang['gdlib_o_2'] = 'detecção automática'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'resumo'; +$lang['rss_content_o_diff'] = 'diff unificado'; +$lang['rss_content_o_htmldiff'] = 'tabela de diff formatada em HTML'; +$lang['rss_content_o_html'] = 'conteúdo completo da página em HTML'; +$lang['rss_linkto_o_diff'] = 'visualização das diferenças'; +$lang['rss_linkto_o_page'] = 'página revisada'; +$lang['rss_linkto_o_rev'] = 'lista de revisões'; +$lang['rss_linkto_o_current'] = 'página atual'; +$lang['compression_o_0'] = 'nenhum'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'não usar'; +$lang['xsendfile_o_1'] = 'cabeçalho proprietário lighttpd (anterior à versão 1.5)'; +$lang['xsendfile_o_2'] = 'cabeçalho "X-Sendfile" padrão'; +$lang['xsendfile_o_3'] = 'cabeçalho proprietário "Nginx X-Accel-Redirect"'; +$lang['showuseras_o_loginname'] = 'nome de usuário'; +$lang['showuseras_o_username'] = 'nome completo do usuário'; +$lang['showuseras_o_username_link'] = 'Nome completo do usuário como um link de usuário interwiki'; +$lang['showuseras_o_email'] = 'endereço de e-mail do usuário (obscurecido segundo a definição anterior)'; +$lang['showuseras_o_email_link'] = 'endereço de e-mail de usuário como um link "mailto:"'; +$lang['useheading_o_0'] = 'nunca'; +$lang['useheading_o_navigation'] = 'somente a navegação'; +$lang['useheading_o_content'] = 'somente o conteúdo do wiki'; +$lang['useheading_o_1'] = 'sempre'; +$lang['readdircache'] = 'Tempo máximo para cache readdir (segundos)'; diff --git a/lib/plugins/config/lang/pt/intro.txt b/lib/plugins/config/lang/pt/intro.txt new file mode 100644 index 0000000..29e17d6 --- /dev/null +++ b/lib/plugins/config/lang/pt/intro.txt @@ -0,0 +1,7 @@ +====== Gerenciador de Configurações ====== + +Use esta página para controlar as definições da instalação do seu DokuWiki. Para ajuda em itens individuais, consulte [[doku>config]]. Para mais detalhes sobre este plugin, veja [[doku>plugin:config]]. + +Definições que apresentem um fundo vermelho claro são protegidas e não podem ser alteradas com este plugin. Definições com um fundo azul são padrão e definições com um fundo branco foram configuradas localmente para essa instalação em particular. Tanto as definições em azul como em branco podem ser alteradas. + +Lembre-se de pressionar o botão **Salvar** antes de sair desta página, caso contrário, as suas definições serão perdidas. diff --git a/lib/plugins/config/lang/pt/lang.php b/lib/plugins/config/lang/pt/lang.php new file mode 100644 index 0000000..2e8d66f --- /dev/null +++ b/lib/plugins/config/lang/pt/lang.php @@ -0,0 +1,226 @@ + + * @author Rafael Fernandes + * @author Eduardo Mozart de Oliveira + * @author Gustavo B. Schenkel + * @author Paulo + * @author Mario AlexandTeixeira dos Santos + * @author Maykon Oliveira + * @author José Vieira + * @author José Monteiro + * @author Enrico Nicoletto + * @author Fil + * @author André Neves + * @author José Campos + * @author Paulo Carmino + * @author Alfredo Silva + * @author Guilherme Sá + */ +$lang['menu'] = 'Configurações'; +$lang['error'] = 'Parâmetros de configuração não atualizados devido a valores inválidos. Reveja as modificações que pretende efetuar antes de re-submetê-las.
    Os valores incorretos serão mostrados dentro de uma "moldura" vermelha.'; +$lang['updated'] = 'Parâmetros de configuração atualizados.'; +$lang['nochoice'] = '(não existem outras escolhas disponíveis)'; +$lang['locked'] = 'O arquivo de configuração não pôde ser atualizado, se isso foi não intencional,
    certifique-se que o nome e as permissões do arquivo de configuração estejam corretos. +'; +$lang['danger'] = 'Perigo: Alterar esta opção poderá tornar seu wiki e o menu de configuração inacessíveis.'; +$lang['warning'] = 'Aviso: A alteração desta opção poderá causar comportamento involuntário.'; +$lang['security'] = 'Aviso de Segurança: Alterar esta opção pode apresentar um risco de segurança.'; +$lang['_configuration_manager'] = 'Gerenciamento de Configuração'; +$lang['_header_dokuwiki'] = 'DokuWiki'; +$lang['_header_plugin'] = 'Plugins'; +$lang['_header_template'] = 'Modelos'; +$lang['_header_undefined'] = 'Configurações não Definidas'; +$lang['_basic'] = 'Básicas'; +$lang['_display'] = 'Apresentação'; +$lang['_authentication'] = 'Autenticação'; +$lang['_anti_spam'] = 'Anti-Spam'; +$lang['_editing'] = 'Edição'; +$lang['_links'] = 'Links'; +$lang['_media'] = 'Mídia'; +$lang['_notifications'] = 'Notificação'; +$lang['_syndication'] = 'Sindicação (RSS)'; +$lang['_advanced'] = 'Avançadas'; +$lang['_network'] = 'Rede'; +$lang['_msg_setting_undefined'] = 'Nenhum metadado definido.'; +$lang['_msg_setting_no_class'] = 'Nenhuma classe definida.'; +$lang['_msg_setting_no_known_class'] = 'Classe de configuração não disponível.'; +$lang['_msg_setting_no_default'] = 'Sem valor padrão.'; +$lang['title'] = 'Título deste Wiki'; +$lang['start'] = 'Nome da Página Inicial'; +$lang['lang'] = 'Idioma'; +$lang['template'] = 'Modelo'; +$lang['tagline'] = 'Slogan (se o modelo for compatível)'; +$lang['sidebar'] = 'Nome da página da barra lateral (se o modelo for compatível). Um campo vazio desativará a barra lateral'; +$lang['license'] = 'Sob que licença o seu conteúdo deverá ser disponibilizado?'; +$lang['savedir'] = 'Pasta para salvar dados'; +$lang['basedir'] = 'Caminho do servidor (ex. /dokuwiki/). Deixe em branco para auto detecção.'; +$lang['baseurl'] = 'URL do servidor (ex. http://www.yourserver.com). Deixe em branco para auto detecção.'; +$lang['cookiedir'] = 'Caminho do cookie. Deixe em branco para usar a baseurl.'; +$lang['dmode'] = 'Modo de criação de pastas.'; +$lang['fmode'] = 'Modo de criação de arquivos.'; +$lang['allowdebug'] = 'Permitir depuração desabilite se não for necessário!'; +$lang['recent'] = 'Número de entradas por página em alterações recentes'; +$lang['recent_days'] = 'Quantas mudanças recentes devem ser mantidas? (dias)'; +$lang['breadcrumbs'] = 'Número máximo de breadcrumbs'; +$lang['youarehere'] = 'Usar breadcrumbs hierárquicas (você provavelmente irá querer desativar a opção acima então)'; +$lang['fullpath'] = 'Mostrar o caminho completo das páginas no rodapé'; +$lang['typography'] = 'Executar substituições tipográficas'; +$lang['dformat'] = 'Formato de Data (ver função PHP\'s strftime)'; +$lang['signature'] = 'O que inserir quando clicar no botão de assinatura do editor'; +$lang['showuseras'] = 'O que exibir quando mostrar o utilizador que editou a página pela última vez'; +$lang['toptoclevel'] = 'Nível de topo para a tabela de conteúdo'; +$lang['tocminheads'] = 'Quantidade mínima de cabeçalhos para a construção da tabela de conteúdos.'; +$lang['maxtoclevel'] = 'Nível máximo para a tabela de conteúdo'; +$lang['maxseclevel'] = 'Nível máximo para editar seção'; +$lang['camelcase'] = 'Usar CamelCase para links'; +$lang['deaccent'] = 'Como limpar nomes de páginas'; +$lang['useheading'] = 'Usar o primeiro cabeçalho para o nome da página'; +$lang['sneaky_index'] = 'Por padrão, o DokuWiki irá exibir todos os namespaces na visualização do índice. Ao ativar essa opção, serão escondidos aqueles em que o utilizador não tenha permissão de leitura. Isto pode resultar na ocultação de subnamespaces acessíveis, o que poderá tornar o índice inútil para certas configurações de ACL.'; +$lang['hidepages'] = 'Esconder páginas correspondentes com expressões regulares da pesquisa, índice e outros índices automáticos'; +$lang['useacl'] = 'Usar listas de controle de acesso'; +$lang['autopasswd'] = 'Auto-gerar senhas'; +$lang['authtype'] = 'Método de autenticação'; +$lang['passcrypt'] = 'Método de criptografia da senha'; +$lang['defaultgroup'] = 'Grupo padrão onde novos usuários serão colocados'; +$lang['superuser'] = 'Superusuário - um grupo, utilizador ou uma lista separada por vírgulas usuário1,@grupo1,usuário2 que tem acesso completo a todas as páginas e funções, independente das definições da ACL'; +$lang['manager'] = 'Gerenciador - um grupo, utilizador ou uma lista separada por vírgulas usuário1,@grupo1,usuário2 que tem acesso a certas funções de gerenciamento'; +$lang['profileconfirm'] = 'Confirmar mudanças no perfil com a senha'; +$lang['rememberme'] = 'Permitir cookies de login permanentes (lembrar-me)'; +$lang['disableactions'] = 'Desativar ações DokuWiki'; +$lang['disableactions_check'] = 'Verificar'; +$lang['disableactions_subscription'] = 'Subscrever/Des-subscrever'; +$lang['disableactions_wikicode'] = 'Ver fonte/Exportar Direto'; +$lang['disableactions_profile_delete'] = 'Excluir Sua Conta'; +$lang['disableactions_other'] = 'Outras ações (separadas por vírgula)'; +$lang['disableactions_rss'] = 'Sindicação XML (RSS)'; +$lang['auth_security_timeout'] = 'Tempo Limite para Autenticações (segundos)'; +$lang['securecookie'] = 'Os cookies definidos via HTTPS deverão ser enviados para o navegador somente via HTTPS? Desative essa opção quando somente a autenticação do seu wiki for realizada de maneira segura via SSL e a navegação de maneira insegura.'; +$lang['samesitecookie'] = 'Outro site usa este cookie. Deixe vazio e permita que o navagador decida a política'; +$lang['remote'] = 'Ativar o sistema de API remota. Isso permite que outros aplicativos acessem o wiki via XML-RPC ou outros mecanismos.'; +$lang['remoteuser'] = 'Restringe o acesso remoto da API aos grupos separados por vírgula ou aos usuários fornecidos aqui. Deixe em branco para dar acesso a todos.'; +$lang['remotecors'] = 'Habilitar Cross-Origin Resource Sharing (CORS) para interfaces remotas. Asterisco (*) permite todas as origens. Deixe em branco para negar CORS.'; +$lang['usewordblock'] = 'Bloquear spam baseado em lista de palavras (wordlist)'; +$lang['relnofollow'] = 'Usar rel="nofollow" em links externos'; +$lang['indexdelay'] = 'Tempo de espera antes da indexação (seg)'; +$lang['mailguard'] = 'Obscurecer endereços de email'; +$lang['iexssprotect'] = 'Verificar os arquivos enviados contra possíveis códigos maliciosos em HTML ou JavaScript'; +$lang['usedraft'] = 'Salvar o rascunho automaticamente durante a edição'; +$lang['locktime'] = 'Idade máxima para arquivos de lock (seg)'; +$lang['cachetime'] = 'Idade máxima para cache (seg)'; +$lang['target____wiki'] = 'Parâmetro "target" para links internos'; +$lang['target____interwiki'] = 'Parâmetro "target" para links entre wikis'; +$lang['target____extern'] = 'Parâmetro "target" para links externos'; +$lang['target____media'] = 'Parâmetro "target" para links de media'; +$lang['target____windows'] = 'Parâmetro "target" para links do Windows'; +$lang['mediarevisions'] = 'Ativar Mediarevisions?'; +$lang['refcheck'] = 'Verificar se a mídia está em uso antes de excluí-la'; +$lang['gdlib'] = 'Versão GD Lib'; +$lang['im_convert'] = 'Caminho para a ferramenta "convert" do ImageMagick'; +$lang['jpg_quality'] = 'Compressão/Qualidade JPG (0-100)'; +$lang['fetchsize'] = 'Tamanho máximo (bytes) que o fetch.php pode baixar de URLs externas, ex. para cache e redimensionamento de imagens externas.'; +$lang['subscribers'] = 'Habilitar o suporte a subscrição de páginas por e-mail'; +$lang['subscribe_time'] = 'Tempo após o qual as listas de subscrição e "digests" são enviados (seg); Isto deve ser inferior ao tempo especificado em recent_days.'; +$lang['notify'] = 'Sempre enviar notificações de mudanças para este endereço de e-mail'; +$lang['registernotify'] = 'Sempre enviar informações de usuários registados para este endereço de e-mail'; +$lang['mailfrom'] = 'Endereço de e-mail a ser utilizado para mensagens automáticas'; +$lang['mailreturnpath'] = 'Endereço de e-mail do destinatário para notificações não entregues'; +$lang['mailprefix'] = 'Prefixo de e-mail a ser utilizado para mensagens automáticas. Deixe em branco para usar o título do wiki'; +$lang['htmlmail'] = 'Envie e-mails multipartes em HTML para uma melhor aparência, mas maiores em tamanho. Desative para mensagens em texto simples.'; +$lang['dontlog'] = 'Desabilite a gravação de relatórios para estes tipos de relatórios.'; +$lang['logretain'] = 'Quantos dias manter no log.'; +$lang['sitemap'] = 'Gerar sitemap Google frequentemente (dias). 0 para desativar'; +$lang['rss_type'] = 'Tipo de feed XML'; +$lang['rss_linkto'] = 'Links de feed XML para'; +$lang['rss_content'] = 'O que deve ser exibido nos itens do alimentador XML?'; +$lang['rss_update'] = 'Intervalo de atualização do feed XML (seg)'; +$lang['rss_show_summary'] = 'Resumo de exibição do feed XML no título'; +$lang['rss_show_deleted'] = 'O feed XML mostra feeds excluídos'; +$lang['rss_media'] = 'Que tipo de alterações devem ser listadas no feed XML?'; +$lang['rss_media_o_both'] = 'ambos'; +$lang['rss_media_o_pages'] = 'páginas'; +$lang['rss_media_o_media'] = 'mídia'; +$lang['updatecheck'] = 'Verificar por atualizações e avisos de segurança? O DokuWiki precisa contactar o "splitbrain.org" para efetuar esta verificação.'; +$lang['userewrite'] = 'Usar URLs SEO'; +$lang['useslash'] = 'Usar a barra como separador de namespaces nas URLs'; +$lang['sepchar'] = 'Separador de palavras no nome da página'; +$lang['canonical'] = 'Usar URLs absolutas (http://servidor/caminho)'; +$lang['fnencode'] = 'Método de codificar nomes de arquivo não-ASCII.'; +$lang['autoplural'] = 'Verificar formas plurais nos links'; +$lang['compression'] = 'Método de compressão para arquivos attic'; +$lang['gzip_output'] = 'Usar Content-Encoding do gzip para código xhtml'; +$lang['compress'] = 'Compactar as saídas de CSS e JavaScript'; +$lang['cssdatauri'] = 'Tamanho em bytes até ao qual as imagens referenciadas em arquivos CSS devem ser embutidas diretamente no CSS para reduzir a carga de pedidos HTTP extra. 400 a 600 bytes é um bom valor. Escolher 0 para desativar.'; +$lang['send404'] = 'Enviar "HTTP 404/Página não encontrada" para páginas não existentes'; +$lang['broken_iua'] = 'A função "ignore_user_abort" não está a funcionar no seu sistema? Isso pode causar um índice de busca defeituoso. Sistemas com IIS+PHP/CGI são conhecidos por possuírem este problema. Veja o bug 852 para mais informações.'; +$lang['xsendfile'] = 'Usar o cabeçalho "X-Sendfile" para permitir o servidor de internet encaminhar arquivos estáticos? O seu servidor de internet precisa ter suporte a isso.'; +$lang['renderer_xhtml'] = 'Renderizador a ser utilizado para a saída principal do wiki (xhtml)'; +$lang['renderer__core'] = '%s (núcleo dokuwiki)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['search_nslimit'] = 'Limite a pesquisa aos atuais X namespaces. Quando uma pesquisa é executada a partir de uma página em um namespace mais profundo, os primeiros X namespaces serão adicionados como filtro'; +$lang['search_fragment'] = 'Especifique o comportamento de pesquisa de fragmento padrão'; +$lang['search_fragment_o_exact'] = 'exato'; +$lang['search_fragment_o_starts_with'] = 'começa com'; +$lang['search_fragment_o_ends_with'] = 'termina com'; +$lang['search_fragment_o_contains'] = 'contém'; +$lang['trustedproxy'] = 'Confie nos proxies de encaminhamento que correspondem a essa expressão regular sobre o verdadeiro IP do cliente que eles relatam. O padrão corresponde às redes locais. Deixe em branco para não confiar em proxy.'; +$lang['_feature_flags'] = 'Sinalizadores de recursos'; +$lang['defer_js'] = 'Adie a execução do javascript para depois da análise do HTML da página. Isso Melhora a velocidade da página, mas pode interromper um pequeno número de plugins.'; +$lang['hidewarnings'] = 'Não exibir nenhum aviso (Warning) emitido pelo PHP. Isso pode facilitar a transição para o PHP8+. Avisos ainda serão registrados no log de erros e devem ser reportados.'; +$lang['dnslookups'] = 'O DokuWiki irá procurar nomes de host para endereços IP remotos de usuários editando páginas. Se você tiver um servidor DNS lento, inoperante ou não quiser esse recurso, desabilite essa opção'; +$lang['jquerycdn'] = 'Os arquivos de script jQuery e jQuery UI devem ser carregados de um CDN? Isso gera solicitações HTTP adicionais mas os arquivos são carregados mais rapidamente e os usuários já podem tê-los armazenados em cache.'; +$lang['jquerycdn_o_0'] = 'Sem CDN, somente entrega local'; +$lang['jquerycdn_o_jquery'] = 'CDN em code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN em cdnjs.com'; +$lang['proxy____host'] = 'Nome do servidor proxy'; +$lang['proxy____port'] = 'Porta de Proxy'; +$lang['proxy____user'] = 'Nome de usuário Proxy'; +$lang['proxy____pass'] = 'Senha do Proxy '; +$lang['proxy____ssl'] = 'Usar SSL para conectar ao proxy'; +$lang['proxy____except'] = 'Expressão regular para bater com URLs para os quais o proxy deve ser ignorado.'; +$lang['license_o_'] = 'Nenhuma escolha'; +$lang['typography_o_0'] = 'nenhum'; +$lang['typography_o_1'] = 'excluindo aspas simples'; +$lang['typography_o_2'] = 'incluindo aspas simples (pode não funcionar sempre)'; +$lang['userewrite_o_0'] = 'nenhum'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki interno'; +$lang['deaccent_o_0'] = 'desligado'; +$lang['deaccent_o_1'] = 'remover acentos'; +$lang['deaccent_o_2'] = 'romanizar'; +$lang['gdlib_o_0'] = 'A GD Lib não está disponível'; +$lang['gdlib_o_1'] = 'Versão 1.x'; +$lang['gdlib_o_2'] = 'Auto-detecção'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstrato'; +$lang['rss_content_o_diff'] = 'Diferenças Unificadas'; +$lang['rss_content_o_htmldiff'] = 'Tabela diff formatada em HTML'; +$lang['rss_content_o_html'] = 'Conteúdo completo da página em HTML'; +$lang['rss_linkto_o_diff'] = 'visualizar diferenças'; +$lang['rss_linkto_o_page'] = 'página revista'; +$lang['rss_linkto_o_rev'] = 'lista de revisões'; +$lang['rss_linkto_o_current'] = 'página atual'; +$lang['compression_o_0'] = 'sem compressão'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'não usar'; +$lang['xsendfile_o_1'] = 'Cabeçalho proprietário lighttpd (anterior à versão 1.5)'; +$lang['xsendfile_o_2'] = 'Cabeçalho X-Sendfile padrão'; +$lang['xsendfile_o_3'] = 'Cabeçalho proprietário Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Nome de usuário'; +$lang['showuseras_o_username'] = 'Nome completo do usuário'; +$lang['showuseras_o_username_link'] = 'Nome completo do usuário como link do usuário interwiki'; +$lang['showuseras_o_email'] = 'E-mail do usuário (ofuscado de acordo com a configuração mailguard)'; +$lang['showuseras_o_email_link'] = 'E-mail do usuário como um link mailto:'; +$lang['useheading_o_0'] = 'Nunca'; +$lang['useheading_o_navigation'] = 'Apenas Navegação'; +$lang['useheading_o_content'] = 'Apenas Conteúdo Wiki'; +$lang['useheading_o_1'] = 'Sempre'; +$lang['readdircache'] = 'Idade máxima para a cache readdir (seg)'; diff --git a/lib/plugins/config/lang/ro/intro.txt b/lib/plugins/config/lang/ro/intro.txt new file mode 100644 index 0000000..f5cbbe8 --- /dev/null +++ b/lib/plugins/config/lang/ro/intro.txt @@ -0,0 +1,7 @@ +====== Manager Configurare ====== + +Folosiţi această pagină pentru a controla setările instalării DokuWiki. Pentru ajutor la probleme punctuale, consultaţi [[doku>config]]. Pentru mai multe detalii privind acest plugin, consultaţi [[doku>plugin:config]]. + +Setările pe un fond roşu-deschis sunt protejate şi nu pot fi modificate cu acest plugin. Setările pe un fond albastru sunt valori implicite iar cele pe fond alb au fost setate local pentru această instalare individualizată. Setările pe fond albastru şi alb pot fi modificate. + +Nu uitaţi să apăsaţi butonul **SALVEAZĂ** înainte de a părăsi această pagină; altfel, modificările aduse se vor pierde. diff --git a/lib/plugins/config/lang/ro/lang.php b/lib/plugins/config/lang/ro/lang.php new file mode 100644 index 0000000..3c91a25 --- /dev/null +++ b/lib/plugins/config/lang/ro/lang.php @@ -0,0 +1,182 @@ + + * @author Emanuel-Emeric Andrasi + * @author Emanuel-Emeric Andraşi + * @author Marius OLAR + */ +$lang['menu'] = 'Setări de Configurare'; +$lang['error'] = 'Setări nu au fost actualizate datorită unei valori incorecte; verificaţi modificările şi încercaţi din nou.
    Valorile incorecte vor apărea într-un chenar roşu.'; +$lang['updated'] = 'Setările au fost actualizate cu succes.'; +$lang['nochoice'] = '(nici o altă opţiune nu este disponibilă)'; +$lang['locked'] = 'Fişierul de setări nu poate fi actualizat. Dacă nu s-a dorit aceasta, asiguraţi-vă că numele şi drepturile de acces ale fişierului de setări localizate sunt corecte.'; +$lang['danger'] = 'Pericol: Modificarea aceastei opțiuni poate conduce la imposibilitatea accesării wiki-ului și a meniului de configurare!'; +$lang['warning'] = 'Atenție: Modificarea aceastei opțiuni poate duce la evenimente nedorite!'; +$lang['security'] = 'Alertă de securitate: Modificarea acestei opțiuni poate prezenta un risc de securitate!'; +$lang['_configuration_manager'] = 'Manager Configurare'; +$lang['_header_dokuwiki'] = 'Setări DokuWiki'; +$lang['_header_plugin'] = 'Setări Plugin-uri'; +$lang['_header_template'] = 'Setări Şabloane'; +$lang['_header_undefined'] = 'Setări Nedefinite'; +$lang['_basic'] = 'Setări de Bază'; +$lang['_display'] = 'Setări Afişare'; +$lang['_authentication'] = 'Setări Autentificare'; +$lang['_anti_spam'] = 'Setări Anti-Spam'; +$lang['_editing'] = 'Setări Editare'; +$lang['_links'] = 'Setări Legături'; +$lang['_media'] = 'Setări Media'; +$lang['_advanced'] = 'Setări Avansate'; +$lang['_network'] = 'Setări Reţea'; +$lang['_msg_setting_undefined'] = 'Nesetat metadata'; +$lang['_msg_setting_no_class'] = 'Nesetat class'; +$lang['_msg_setting_no_default'] = 'Nici o valoare implicită'; +$lang['title'] = 'Titlul wiki'; +$lang['start'] = 'Numele paginii de start'; +$lang['lang'] = 'Limbă'; +$lang['template'] = 'Şablon'; +$lang['tagline'] = 'Slogan (dacă templateul suportă opțiunea)'; +$lang['sidebar'] = 'Numele paginii barei laterale (dacă templateul suportă opțiunea), câmpul lăsat gol dezactivează bara laterală'; +$lang['license'] = 'Sub ce licenţă va fi publicat conţinutul?'; +$lang['savedir'] = 'Director pentru salvarea datelor'; +$lang['basedir'] = 'Director bază'; +$lang['baseurl'] = 'URL bază '; +$lang['cookiedir'] = 'Cale Cookie. Lăsați gol pentru a utiliza baseurl.'; +$lang['dmode'] = 'Mod creare director'; +$lang['fmode'] = 'Mod creare fişier'; +$lang['allowdebug'] = 'Permite depanarea dezactivaţi dacă cu e necesar!'; +$lang['recent'] = 'Modificări recente'; +$lang['recent_days'] = 'Câte modificări recente să se păstreze?'; +$lang['breadcrumbs'] = 'Numărul de "urme" lăsate'; +$lang['youarehere'] = 'Structura ierarhică a "urmelor" lăsate'; +$lang['fullpath'] = 'Arată calea completă a paginii în subsol'; +$lang['typography'] = 'Fă înlocuiri topografice'; +$lang['dformat'] = 'Format dată (vezi funcţia PHP strftime)'; +$lang['signature'] = 'Semnătura'; +$lang['showuseras'] = 'Ce se afişează la indicarea utilizatorului care a editat ultimul o pagină'; +$lang['toptoclevel'] = 'Primul nivel pentru cuprins'; +$lang['tocminheads'] = 'Numărul minim de titluri ce determină dacă se alcătuieşte Tabelul de Cuprins (TOC)'; +$lang['maxtoclevel'] = 'Nivelul maxim pentru cuprins'; +$lang['maxseclevel'] = 'Nivelul maxim de editare al secţiunii'; +$lang['camelcase'] = 'Foloseşte CamelCase pentru legături'; +$lang['deaccent'] = 'numedepagină curate'; +$lang['useheading'] = 'Foloseşte primul titlu pentru numele paginii'; +$lang['sneaky_index'] = 'Implicit, DokuWiki va arăta toate numele de spaţii la vizualizarea indexului. Activând această opţiune vor fi ascunse acelea la care utilizatorul nu are drepturi de citire. Aceasta poate determina ascunderea sub-numelor de spaţii accesibile. Aceasta poate face index-ul inutilizabil cu anumite setări ale ACL'; +$lang['hidepages'] = 'Ascunde paginile pereche (expresii regulate)'; +$lang['useacl'] = 'Utilizează liste de control al accesului'; +$lang['autopasswd'] = 'Parole autogenerate'; +$lang['authtype'] = 'Autentificare backend'; +$lang['passcrypt'] = 'Metoda de criptare a parolei'; +$lang['defaultgroup'] = 'Grup implicit'; +$lang['superuser'] = 'Superuser - un grup sau un utilizator cu acces complet la toate paginile şi funcţiile indiferent de setările ACL'; +$lang['manager'] = 'Manager - un grup sau un utilizator cu acces la anumite funcţii de management'; +$lang['profileconfirm'] = 'Confirmă schimbarea profilului cu parola'; +$lang['rememberme'] = 'Permiteţi cookies permanente la login (ţine-mă minte)'; +$lang['disableactions'] = 'Dezactivează acţiunile DokuWiki'; +$lang['disableactions_check'] = 'Verifică'; +$lang['disableactions_subscription'] = 'Subscrie/Anulează subscrierea'; +$lang['disableactions_wikicode'] = 'Vizualizează sursa/Export Raw'; +$lang['disableactions_other'] = 'Alte acţiuni (separate prin virgulă)'; +$lang['auth_security_timeout'] = 'Timpul de expirare al Autentificării Securizate (secunde)'; +$lang['securecookie'] = 'Cookies-urile setate via HTTPS să fie trimise doar via HTTPS de către browser? Dezactivaţi această opţiune numai când login-ul wiki-ului este securizat cu SSL dar navigarea wiki-ului se realizează nesecurizat.'; +$lang['remote'] = 'Activează sistemul remote API. Acesta permite altor aplicații să acceseze wiki-ul via XML-RPC sau alte mecanisme.'; +$lang['remoteuser'] = 'Restricționează accesul sistemului remote API la grupurile sau utilizatorii următori (separați prin virgulă). Lăsați câmpul gol pentru a da acces către toți.'; +$lang['usewordblock'] = 'Blochează spam-ul pe baza listei de cuvinte'; +$lang['relnofollow'] = 'Folosiţi rel="nofollow" pentru legăturile externe'; +$lang['indexdelay'] = 'Timpul de întârziere înainte de indexare (sec)'; +$lang['mailguard'] = 'Adrese de email acoperite'; +$lang['iexssprotect'] = 'Verifică fişierele încărcate pentru posibil cod periculos JavaScript sau HTML'; +$lang['usedraft'] = 'Salvează automat o schiţă în timpul editării'; +$lang['locktime'] = 'Durata maximă pentru blocarea fişierelor (secunde)'; +$lang['cachetime'] = 'Durata maximă pentru cache (secunde)'; +$lang['target____wiki'] = 'Fereastra ţintă pentru legăturile interne'; +$lang['target____interwiki'] = 'Fereastra ţintă pentru legăturile interwiki'; +$lang['target____extern'] = 'Fereastra ţintă pentru legăturile externe'; +$lang['target____media'] = 'Fereastra ţintă pentru legăturile media'; +$lang['target____windows'] = 'Fereastra ţintă pentru legăturile windows'; +$lang['mediarevisions'] = 'Activare Revizii Media?'; +$lang['refcheck'] = 'Verificare referinţă media'; +$lang['gdlib'] = 'Versiunea GD Lib'; +$lang['im_convert'] = 'Calea către instrumentul de conversie ImageMagick'; +$lang['jpg_quality'] = 'Calitatea compresiei JPG (0-100)'; +$lang['fetchsize'] = 'Dimensiunea maximă (byte) pe care fetch.php poate să descarce din exterior'; +$lang['subscribers'] = 'Activează suportul pentru subscrierea paginii'; +$lang['subscribe_time'] = 'Timpul după care lista de abonare şi digestie sunt trimise (sec); Aceasta ar trebui să fie mai mic decât timpul specificat în recent_days.'; +$lang['notify'] = 'Trimite notificări privind modificările pe această adresă de email'; +$lang['registernotify'] = 'Trimite informare noilor utilizatori înregistraţi pe această adresă de email'; +$lang['mailfrom'] = 'Adresa de email utilizată pentru mailuri automate'; +$lang['mailprefix'] = 'Prefix subiect e-mail de folosit pentru mail-uri automate'; +$lang['sitemap'] = 'Generează Google sitemap (zile)'; +$lang['rss_type'] = 'Tip flux XML'; +$lang['rss_linkto'] = 'Fluxul XML se leagă la'; +$lang['rss_content'] = 'Ce să afişez în obiectele fluxurilor XML'; +$lang['rss_update'] = 'Intervalul de actualizare a fluxului XML (sec)'; +$lang['rss_show_summary'] = 'Fluxul XML arată rezumat în titlu'; +$lang['rss_media'] = 'Ce fel de modificări ar trebui afișate în fluxul XML?'; +$lang['updatecheck'] = 'Verificare actualizări şi avertismente privind securitatea? DokuWiki trebuie să contacteze update.dokuwiki.org pentru această facilitate.'; +$lang['userewrite'] = 'Folosire URL-uri "nice"'; +$lang['useslash'] = 'Foloseşte slash-ul ca separator de spaţii de nume în URL-uri'; +$lang['sepchar'] = 'Separator cuvinte în numele paginii'; +$lang['canonical'] = 'Foloseşte URL-uri canonice'; +$lang['fnencode'] = 'Metoda de encodare a numelor fişierelor non-ASCII.'; +$lang['autoplural'] = 'Verifică formele de plural în legături'; +$lang['compression'] = 'Metoda de criptare a fişierelor pod'; +$lang['gzip_output'] = 'Foloseşte gzip pentru codarea conţinutului xhtml'; +$lang['compress'] = 'Compactează codul CSS şi javascript produs'; +$lang['cssdatauri'] = 'Dimensiunea în octeți până la care imaginile regasite în fișierele CSS ar trebui să fie incluse direct în stylesheet pentru a reduce supraîncărcarea antetului cererii HTTP. Această tehnică nu va funcționa în IE < 8! 400 până la 600 octeți sunt suficienți. Introduceți 0 pentru a dezactiva această opțiune.'; +$lang['send404'] = 'Trimite mesajul "HTTP 404/Page Not Found" pentru paginile inexistente'; +$lang['broken_iua'] = 'Funcţia ignore_user_abort nu funcţionează pe sistemul dumneavoastră? Aceasta poate determina nefuncţionarea indexului de căutare. IIS+PHP/CGI sunt cunoscute ca fiind nefuncţionale. Mai multe detalii găsiţi la Bug 852'; +$lang['xsendfile'] = 'Folosiţi header-ul X-Send pentru a-i permite serverului web să trimită fişiere statice? Serverul web trebuie să permită aceasta.'; +$lang['renderer_xhtml'] = 'Motorul de randare principal folosit pentru afişarea wiki în format xhtml'; +$lang['renderer__core'] = '%s (nucleu dokuwiki)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['proxy____host'] = 'Nume server Proxy'; +$lang['proxy____port'] = 'Port Proxy'; +$lang['proxy____user'] = 'Nume utilizator Proxy'; +$lang['proxy____pass'] = 'Parolă Proxy'; +$lang['proxy____ssl'] = 'Foloseşte SSL pentru conectare la Proxy'; +$lang['proxy____except'] = 'Expresie regulară de potrivit cu URL-uri pentru care proxy-ul trebuie păsuit.'; +$lang['license_o_'] = 'Nici una aleasă'; +$lang['typography_o_0'] = 'nimic'; +$lang['typography_o_1'] = 'Numai ghilimele duble'; +$lang['typography_o_2'] = 'Toate ghilimelele (s-ar putea să nu fucţioneze întotdeauna)'; +$lang['userewrite_o_0'] = 'nimic'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki intern'; +$lang['deaccent_o_0'] = 'închis'; +$lang['deaccent_o_1'] = 'înlătură accentele'; +$lang['deaccent_o_2'] = 'romanizează'; +$lang['gdlib_o_0'] = 'biblioteca GD Lib nu este disponibilă'; +$lang['gdlib_o_1'] = 'Versiunea 1.x'; +$lang['gdlib_o_2'] = 'Detectare automată'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstract'; +$lang['rss_content_o_diff'] = 'Diferenţe unificate'; +$lang['rss_content_o_htmldiff'] = 'Tabel diferenţe în format HTML'; +$lang['rss_content_o_html'] = 'Conţinut pagină complet HTML'; +$lang['rss_linkto_o_diff'] = 'vizualizare diferenţe'; +$lang['rss_linkto_o_page'] = 'pagina revizuită'; +$lang['rss_linkto_o_rev'] = 'lista revizuirilor'; +$lang['rss_linkto_o_current'] = 'pagina curentă'; +$lang['compression_o_0'] = 'nici una'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'nu se foloseşte'; +$lang['xsendfile_o_1'] = 'Header proprietar lighttpd (înaintea versiunii 1.5)'; +$lang['xsendfile_o_2'] = 'Header standard X-Sendfile'; +$lang['xsendfile_o_3'] = 'Header proprietar Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Numele de login'; +$lang['showuseras_o_username'] = 'Numele complet al utilizatorului'; +$lang['showuseras_o_email'] = 'Adresa de e-mail a utilizatorului (mascată conform setărilor de protecţie)'; +$lang['showuseras_o_email_link'] = 'Adresa de e-mail a utilizatorului ca mailto: link'; +$lang['useheading_o_0'] = 'Niciodată'; +$lang['useheading_o_navigation'] = 'Doar navigare'; +$lang['useheading_o_content'] = 'Doar conţinutul Wiki'; +$lang['useheading_o_1'] = 'Întotdeauna'; +$lang['readdircache'] = 'Vârsta maximă depozitare readdir (sec)'; diff --git a/lib/plugins/config/lang/ru/intro.txt b/lib/plugins/config/lang/ru/intro.txt new file mode 100644 index 0000000..2b4fe3d --- /dev/null +++ b/lib/plugins/config/lang/ru/intro.txt @@ -0,0 +1,7 @@ +====== Настройки вики ====== + +Здесь вы можете изменить настройки своей «Докувики». Для справки по конкретным опциям смотрите [[doku>config|Конфигурирование «Докувики»]]. Дополнительные детали об этом плагине доступны здесь: [[doku>plugin:config]]. + +Настройки, отображаемые на светло-красном фоне, защищены от изменений и не могут быть отредактированы с помощью этого плагина. Голубым фоном отмечены настройки со значениями по умолчанию, а белым фоном — настройки, которые были локально изменены для этой конкретной «Докувики». Как голубые, так и белые настройки доступны для изменения. + +Не забудьте нажать кнопку «**Сохранить**» перед тем, как покинуть эту страницу, иначе все ваши изменения будут потеряны. diff --git a/lib/plugins/config/lang/ru/lang.php b/lib/plugins/config/lang/ru/lang.php new file mode 100644 index 0000000..943d870 --- /dev/null +++ b/lib/plugins/config/lang/ru/lang.php @@ -0,0 +1,230 @@ + + * @author Aleksandr Selivanov + * @author Nikita + * @author Анатолий + * @author Yuriy Skalko + * @author Vyacheslav Strenadko + * @author Zhassulan + * @author Denis Simakov + * @author Andrew Pleshakov + * @author Змей Этерийский + * @author Hikaru Nakajima + * @author Alexei Tereschenko + * @author Alexander Sorkin + * @author Kirill Krasnov + * @author Vlad Tsybenko + * @author Aleksey Osadchiy + * @author Ladyko Andrey + * @author Eugene + * @author Johnny Utah + * @author RainbowSpike <1@2.ru> + * @author alexey + */ +$lang['menu'] = 'Настройки вики'; +$lang['error'] = 'Настройки не были сохранены из-за ошибки в одном из значений. Пожалуйста, проверьте свои изменения и попробуйте ещё раз.
    Неправильные значения будут обведены красной рамкой.'; +$lang['updated'] = 'Настройки успешно сохранены.'; +$lang['nochoice'] = '(нет других вариантов)'; +$lang['locked'] = 'Файл настройки недоступен для изменения. Если это не специально,
    убедитесь, что файл локальной настройки имеет правильное имя и права доступа.'; +$lang['danger'] = 'Внимание: изменение этой опции может сделать вашу вики и меню конфигурации недоступными.'; +$lang['warning'] = 'Предостережение: изменение этой опции может вызвать непредсказуемое поведение.'; +$lang['security'] = 'Предостережение по безопасности: изменение этой опции может вызвать риск, связанный с безопасностью.'; +$lang['_configuration_manager'] = 'Настройки вики'; +$lang['_header_dokuwiki'] = 'Параметры «Докувики»'; +$lang['_header_plugin'] = 'Параметры плагинов'; +$lang['_header_template'] = 'Параметры шаблонов'; +$lang['_header_undefined'] = 'Прочие параметры'; +$lang['_basic'] = 'Основные параметры'; +$lang['_display'] = 'Параметры отображения'; +$lang['_authentication'] = 'Параметры аутентификации'; +$lang['_anti_spam'] = 'Параметры блокировки спама'; +$lang['_editing'] = 'Параметры правки'; +$lang['_links'] = 'Параметры ссылок'; +$lang['_media'] = 'Параметры медиафайлов'; +$lang['_notifications'] = 'Параметры уведомлений'; +$lang['_syndication'] = 'Параметры синдикаций (RSS)'; +$lang['_advanced'] = 'Тонкая настройка'; +$lang['_network'] = 'Параметры сети'; +$lang['_msg_setting_undefined'] = 'Не найдены метаданные настроек.'; +$lang['_msg_setting_no_class'] = 'Не найден класс настроек.'; +$lang['_msg_setting_no_known_class'] = 'Класс настроек недоступен.'; +$lang['_msg_setting_no_default'] = 'Не задано значение по умолчанию.'; +$lang['title'] = 'Название (заголовок) вики'; +$lang['start'] = 'Имя страницы, используемой как стартовой в каждом пространства имён'; +$lang['lang'] = 'Язык интерфейса'; +$lang['template'] = 'Шаблон (дизайн)'; +$lang['tagline'] = 'Слоган (если поддерживается шаблоном)'; +$lang['sidebar'] = 'Боковая панель (если поддерживается шаблоном); пустое поле отключает боковую панель.'; +$lang['license'] = 'На условиях какой лицензии будет предоставляться содержимое вики?'; +$lang['savedir'] = 'Директория для данных'; +$lang['basedir'] = 'Корневая директория (например, /dokuwiki/). Оставьте пустым для автоопределения.'; +$lang['baseurl'] = 'Корневой адрес (URL) (например, http://www.yourserver.ru). Оставьте пустым для автоопределения.'; +$lang['cookiedir'] = 'Директория для cookie. Оставьте пустым для автоопределения.'; +$lang['dmode'] = 'Права для создаваемых директорий'; +$lang['fmode'] = 'Права для создаваемых файлов'; +$lang['allowdebug'] = 'Включить отладку. Отключите, если она вам не нужна!'; +$lang['recent'] = 'Недавние изменения (кол-во)'; +$lang['recent_days'] = 'На сколько дней назад сохранять недавние изменения'; +$lang['breadcrumbs'] = 'Вы посетили (количество страниц). Поставьте 0 (ноль) для отключения.'; +$lang['youarehere'] = 'Показывать «Вы находитесь здесь»'; +$lang['fullpath'] = 'Полный путь к документу внизу страницы'; +$lang['typography'] = 'Выполнять замену на типографские символы'; +$lang['dformat'] = 'Формат даты и времени (см. функцию PHP strftime)'; +$lang['signature'] = 'Шаблон подписи'; +$lang['showuseras'] = 'Что отображать при показе пользователя, редактировавшего страницу последним'; +$lang['toptoclevel'] = 'Мин. уровень в содержании'; +$lang['tocminheads'] = 'Мин. количество заголовков, при котором будет составлено содержание'; +$lang['maxtoclevel'] = 'Макс. уровень в содержании'; +$lang['maxseclevel'] = 'Макс. уровень для правки'; +$lang['camelcase'] = 'Использовать ВикиРегистр для ссылок'; +$lang['deaccent'] = 'Транслитерация в именах страниц'; +$lang['useheading'] = 'Первый заголовок вместо имени страницы'; +$lang['sneaky_index'] = 'По умолчанию, «Докувики» показывает все пространства имён на «Все страницы». Включение этой опции скроет пространства имён, для которых пользователь не имеет прав чтения. Это может привести к скрытию доступных вложенных пространств имён и потере функциональности индекса страниц при некоторых конфигурациях прав доступа.'; +$lang['hidepages'] = 'Скрыть страницы (регулярное выражение)'; +$lang['useacl'] = 'Использовать списки прав доступа'; +$lang['autopasswd'] = 'Автогенерация паролей'; +$lang['authtype'] = 'Механизм аутентификации'; +$lang['passcrypt'] = 'Метод шифрования пароля'; +$lang['defaultgroup'] = 'Группа по умолчанию. Все новые пользователю будут добавляться в эту группу.'; +$lang['superuser'] = 'Суперпользователь — группа или пользователь с полным доступом ко всем страницам и функциям администрирования, независимо от установок списков прав доступа. Перечень разделяйте запятыми: user1,@group1,user2'; +$lang['manager'] = 'Менеджер — группа или пользователь с доступом к определённым функциям управления. Перечень разделяйте запятыми: user1,@group1,user2'; +$lang['profileconfirm'] = 'Пароль для изменения профиля'; +$lang['rememberme'] = 'Разрешить перманентные куки (cookies) для входа («запомнить меня»)'; +$lang['disableactions'] = 'Заблокировать операции «Докувики»'; +$lang['disableactions_check'] = 'Проверка'; +$lang['disableactions_subscription'] = 'Подписка/Отмена подписки'; +$lang['disableactions_wikicode'] = 'Показ/экспорт исходного текста'; +$lang['disableactions_profile_delete'] = 'Удалить свой аккаунт'; +$lang['disableactions_other'] = 'Другие операции (через запятую)'; +$lang['disableactions_rss'] = 'XML-синдикация (RSS)'; +$lang['auth_security_timeout'] = 'Интервал для безопасности авторизации (сек.)'; +$lang['securecookie'] = 'Должны ли куки (cookies), выставленные через HTTPS, отправляться браузером только через HTTPS? Отключите эту опцию в случае, когда только логин вашей вики передаётся через SSL, а обычный просмотр осуществляется в небезопасном режиме.'; +$lang['samesitecookie'] = 'Атрибут SameSite для использования. Если его оставить пустым, браузер сам решит политику SameSite.'; +$lang['remote'] = 'Включить систему API для подключений. Это позволит другим приложениям получить доступ к вики через XML-RPC или другие механизмы.'; +$lang['remoteuser'] = 'Дать права для удалённого API-доступа пользователям, указанным здесь (разделяйте запятыми). Оставьте поле пустым для предоставления доступа всем.'; +$lang['remotecors'] = 'Включить кросс-доменный обмен ресурсами (CORS) для удаленных интерфейсов. Используйте звездочку (*) для разрешения всех источников. Оставьте пустым, чтобы отказать в CORS.'; +$lang['usewordblock'] = 'Блокировать спам по ключевым словам'; +$lang['relnofollow'] = 'Использовать rel="ugc nofollow" для внешних ссылок'; +$lang['indexdelay'] = 'Задержка перед индексированием (сек.)'; +$lang['mailguard'] = 'Кодировать адреса электронной почты'; +$lang['iexssprotect'] = 'Проверять закачанные файлы на наличие потенциально опасного кода JavaScript или HTML'; +$lang['usedraft'] = 'Автоматически сохранять черновик во время правки'; +$lang['locktime'] = 'Время блокировки страницы (сек.)'; +$lang['cachetime'] = 'Время жизни кэш-файла (сек.)'; +$lang['target____wiki'] = 'target для внутренних ссылок'; +$lang['target____interwiki'] = 'target для ссылок между вики'; +$lang['target____extern'] = 'target для внешних ссылок'; +$lang['target____media'] = 'target для ссылок на медиафайлы'; +$lang['target____windows'] = 'target для ссылок на сетевые каталоги'; +$lang['mediarevisions'] = 'Включение версий медиафайлов'; +$lang['refcheck'] = 'Проверять ссылки на медиафайлы'; +$lang['gdlib'] = 'Версия GD Lib'; +$lang['im_convert'] = 'Путь к ImageMagick'; +$lang['jpg_quality'] = 'Качество сжатия JPG (0–100)'; +$lang['fetchsize'] = 'Максимальный размер файла (в байтах), который fetch.php может скачивать с внешнего источника'; +$lang['subscribers'] = 'Разрешить подписку на изменения'; +$lang['subscribe_time'] = 'Интервал рассылки подписок и сводок (сек.). Должен быть меньше, чем значение, указанное в recent_days.'; +$lang['notify'] = 'Всегда отправлять сообщения об изменениях на этот электронный адрес'; +$lang['registernotify'] = 'Всегда отправлять информацию о новых зарегистрированных пользователях на этот электронный адрес'; +$lang['mailfrom'] = 'Электронный адрес вики (От:)'; +$lang['mailreturnpath'] = 'Адрес электронной почты для доставки отчёта о недоставленных сообщениях'; +$lang['mailprefix'] = 'Префикс, используемый для автоматического письма, станет темой сообщения. Оставьте поле пустым для использования названия вики.'; +$lang['htmlmail'] = 'Отправлять красивые, но более крупные HTML-письма. Отключите для отправки простых текстовых писем.'; +$lang['dontlog'] = 'Отключить ведение журнала для этих типов записей.'; +$lang['logretain'] = 'Сколько дней хранить логи.'; +$lang['sitemap'] = 'Число дней, через которое нужно создавать (обновлять) карту сайта для поисковиков (Гугл, Яндекс и др.). Укажите 0 (ноль) для отключения.'; +$lang['rss_type'] = 'Тип XML-ленты'; +$lang['rss_linkto'] = 'Ссылки в XML-ленте указывают на'; +$lang['rss_content'] = 'Что показывать в XML-ленте?'; +$lang['rss_update'] = 'Интервал обновления XML-ленты (сек.)'; +$lang['rss_show_summary'] = 'Показывать краткую выдержку в заголовках XML-ленты'; +$lang['rss_show_deleted'] = 'XML feed Показать удаленные каналы'; +$lang['rss_media'] = 'Какие изменения должны быть отображены в XML-ленте?'; +$lang['rss_media_o_both'] = 'оба'; +$lang['rss_media_o_pages'] = 'страницы'; +$lang['rss_media_o_media'] = 'медиа'; +$lang['updatecheck'] = 'Проверять наличие обновлений и предупреждений о безопасности? Для этого «Докувики» потребуется связываться с update.dokuwiki.org.'; +$lang['userewrite'] = 'Удобочитаемые адреса (URL)'; +$lang['useslash'] = 'Использовать слэш разделителем пространств имён в URL'; +$lang['sepchar'] = 'Разделитель слов в имени страницы'; +$lang['canonical'] = 'Полные канонические адреса (URL)'; +$lang['fnencode'] = 'Метод кодирования имён файлов, записанных не ASCII-символами.'; +$lang['autoplural'] = 'Проверять можественную форму имени страницы в ссылках'; +$lang['compression'] = 'Метод сжатия для архивных файлов'; +$lang['gzip_output'] = 'Использовать gzip-сжатие для xhtml (Content-Encoding)'; +$lang['compress'] = 'Сжимать файлы CSS и javascript'; +$lang['cssdatauri'] = 'Размер в байтах, до которого изображения, указанные в CSS-файлах, должны быть встроены прямо в таблицу стилей для уменьшения избыточных HTTP-запросов. Значение между 400 и 600 байт является хорошим. Укажите 0, чтобы отключить.'; +$lang['send404'] = 'Посылать «HTTP 404/Страница не найдена» для несуществующих страниц'; +$lang['broken_iua'] = 'Возможно, функция ignore_user_abort не работает в вашей системе? Это может привести к потере функциональности индексирования поиска. Эта проблема присутствует, например, в IIS+PHP/CGI.'; +$lang['xsendfile'] = 'Используете заголовок X-Sendfile для загрузки файлов на веб-сервер? Ваш веб-сервер должен поддерживать это.'; +$lang['renderer_xhtml'] = 'Обработчик основного (xhtml) вывода вики'; +$lang['renderer__core'] = '%s (ядро «Докувики»)'; +$lang['renderer__plugin'] = '%s (плагин)'; +$lang['search_nslimit'] = 'Ограничить поиск текущими пространствами имён X. Когда поиск выполняется со страницы в более глубоком пространстве имён, первые X-пространства имен будут добавлены в качестве фильтра.'; +$lang['search_fragment'] = 'Укажите поведение поиска фрагмента по умолчанию'; +$lang['search_fragment_o_exact'] = 'точно'; +$lang['search_fragment_o_starts_with'] = 'начинается на'; +$lang['search_fragment_o_ends_with'] = 'заканчивается'; +$lang['search_fragment_o_contains'] = 'содержит'; +$lang['trustedproxy'] = 'Доверять прокси-серверам, соответствующим этому регулярному выражению, в отношении реального IP-адреса клиента, который они сообщают. Значение по умолчанию соответствует локальным сетям. Оставьте пустым, чтобы не доверять никаким прокси-серверам.'; +$lang['_feature_flags'] = 'Флаги функций'; +$lang['defer_js'] = 'Отложено выполнение javascript после анализа HTML-кода страницы. Улучшает воспринимаемую скорость страницы, но может нарушить работу небольшого количества плагинов.'; +$lang['hidewarnings'] = 'Не отображать предупреждения, генерируемые PHP. Это может облегчить переход на PHP8+. Предупреждения по-прежнему будут записываться в журнал ошибок, и о них следует сообщать.'; +$lang['dnslookups'] = '«Докувики» ищет DNS-имена пользователей, редактирующих страницы. Если у вас нет DNS-сервера или он работает медленно, рекомендуем отключить эту опцию.'; +$lang['jquerycdn'] = 'Требуется ли загрузка jQuery-скриптов (включая jQuery UI-скрипты) из CDN сети? Данная функция увеличивает количество HTTP запросов, но загрузка файлов будет проходить быстрее и пользователи смогут кэшировать запросы.'; +$lang['jquerycdn_o_0'] = 'Не использовать CDN. Использовать только локальную доставку'; +$lang['jquerycdn_o_jquery'] = 'Использовать CDN с code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'Использовать CDN с cdnjs.com'; +$lang['proxy____host'] = 'proxy-адрес'; +$lang['proxy____port'] = 'proxy-порт'; +$lang['proxy____user'] = 'proxy-имя пользователя'; +$lang['proxy____pass'] = 'proxy-пароль'; +$lang['proxy____ssl'] = 'Использовать SSL для соединения с прокси'; +$lang['proxy____except'] = 'Регулярное выражение для адресов (URL), для которых прокси должен быть пропущен.'; +$lang['license_o_'] = 'Не выбрано'; +$lang['typography_o_0'] = 'нет'; +$lang['typography_o_1'] = 'только двойные кавычки'; +$lang['typography_o_2'] = 'все кавычки (может не всегда работать)'; +$lang['userewrite_o_0'] = '(нет)'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'средствами «Докувики»'; +$lang['deaccent_o_0'] = 'отключить'; +$lang['deaccent_o_1'] = 'убирать только диакр. знаки'; +$lang['deaccent_o_2'] = 'полная транслитерация'; +$lang['gdlib_o_0'] = 'GD Lib недоступна'; +$lang['gdlib_o_1'] = 'версия 1.x'; +$lang['gdlib_o_2'] = 'автоопределение'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'абстрактный'; +$lang['rss_content_o_diff'] = 'объединённый diff'; +$lang['rss_content_o_htmldiff'] = 'HTML-форматированная таблица diff'; +$lang['rss_content_o_html'] = 'полное содержимое HTML-страницы'; +$lang['rss_linkto_o_diff'] = 'отличия от текущей'; +$lang['rss_linkto_o_page'] = 'текст страницы'; +$lang['rss_linkto_o_rev'] = 'история правок'; +$lang['rss_linkto_o_current'] = 'текущая версия'; +$lang['compression_o_0'] = 'без сжатия'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'не используется'; +$lang['xsendfile_o_1'] = 'Проприетарный lighttpd-заголовок (до релиза 1.5)'; +$lang['xsendfile_o_2'] = 'Стандартный заголовок X-Sendfile'; +$lang['xsendfile_o_3'] = 'Проприетарный заголовок Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'логин'; +$lang['showuseras_o_username'] = 'полное имя пользователя'; +$lang['showuseras_o_username_link'] = 'полное имя пользователя как интервики-ссылка'; +$lang['showuseras_o_email'] = 'адрес эл. почты в шифрованном виде (см. mailguard)'; +$lang['showuseras_o_email_link'] = 'адрес эл. почты в виде ссылки mailto:'; +$lang['useheading_o_0'] = 'никогда'; +$lang['useheading_o_navigation'] = 'только в навигации'; +$lang['useheading_o_content'] = 'только в содержимом вики'; +$lang['useheading_o_1'] = 'всегда'; +$lang['readdircache'] = 'Максимальное время жизни кэша readdir (сек.)'; diff --git a/lib/plugins/config/lang/sk/intro.txt b/lib/plugins/config/lang/sk/intro.txt new file mode 100644 index 0000000..a3d15bf --- /dev/null +++ b/lib/plugins/config/lang/sk/intro.txt @@ -0,0 +1,7 @@ +====== Správa konfigurácie ====== + +Túto stránku môžete používať na zmenu nastavení Vašej DokuWiki inštalácie. Popis jednotlivých nastavení je uvedený v [[doku>config]]. Viac detailov o tomto plugine nájdete v [[doku>plugin:config]]. + +Nastavenia zobrazené na červenom pozadí sú neprístupné a nemôžu byť týmto pluginom zmenené. Nastavenia s modrým pozadím obsahujú prednastavené hodnoty a nastavenia s bielym pozadím boli nastavené lokálne pre túto konkrétnu inštaláciu. Nastavenia s modrým a bielym pozadím môžu byť zmenené. + +Nezabudnite stlačiť tlačidlo **Uložiť** pred opustením stránky, inak budú vaše zmeny stratené. diff --git a/lib/plugins/config/lang/sk/lang.php b/lib/plugins/config/lang/sk/lang.php new file mode 100644 index 0000000..4881a88 --- /dev/null +++ b/lib/plugins/config/lang/sk/lang.php @@ -0,0 +1,204 @@ + + * @author Peter Mydliar + * @author Tibor Repček + * @author Michal Mesko + * @author exusik + */ +$lang['menu'] = 'Nastavenia konfigurácie'; +$lang['error'] = 'Nastavenia neboli aktualizované kvôli neplatnej hodnote, prosím skontrolujte vaše zmeny a znovu ich pošlite.
    Nesprávna hodnota(y) bude ohraničená červeným okrajom.'; +$lang['updated'] = 'Nastavenia úspešne aktualizované.'; +$lang['nochoice'] = '(žiadne ďalšie dostupné voľby)'; +$lang['locked'] = 'Súbor s nastaveniami nemôže byť aktualizovaný, ak toto nie je zámerom,
    +uistite sa, že názov a práva lokálneho súboru sú správne.'; +$lang['danger'] = 'Nebezpečie: Zmeny tohto nastavenia môžu spôsobiť nedostupnosť wiki a nastavovacieho menu.'; +$lang['warning'] = 'Varovanie: Zmena tohto nastavenia môže viesť neželanému správaniu.'; +$lang['security'] = 'Bezpečnostné riziko: Zmenou tohto nastavenie môže vzniknúť bezpečnostné riziko.'; +$lang['_configuration_manager'] = 'Správa konfigurácie'; +$lang['_header_dokuwiki'] = 'Nastavenia DokuWiki'; +$lang['_header_plugin'] = 'Nastavenia plug-inov'; +$lang['_header_template'] = 'Nastavenia šablóny'; +$lang['_header_undefined'] = 'Nešpecifikované nastavenia'; +$lang['_basic'] = 'Základné nastavenia'; +$lang['_display'] = 'Nastavenia zobrazovania'; +$lang['_authentication'] = 'Nastavenia zabezpečenia'; +$lang['_anti_spam'] = 'Nastavenia anti-spamu'; +$lang['_editing'] = 'Nastavenia úprav'; +$lang['_links'] = 'Nastavenia odkazov'; +$lang['_media'] = 'Nastavenia médií'; +$lang['_notifications'] = 'Nastavenie upozornení'; +$lang['_syndication'] = 'Nastavenie poskytovania obsahu'; +$lang['_advanced'] = 'Rozšírené nastavenia'; +$lang['_network'] = 'Nastavenia siete'; +$lang['_msg_setting_undefined'] = 'Nenastavené metadata.'; +$lang['_msg_setting_no_class'] = 'Nenastavená trieda.'; +$lang['_msg_setting_no_default'] = 'Žiadna predvolená hodnota.'; +$lang['title'] = 'Názov wiki'; +$lang['start'] = 'Názov štartovacej stránky'; +$lang['lang'] = 'Jazyk'; +$lang['template'] = 'Šablóna'; +$lang['tagline'] = 'Slogan (ak ho šablóna podporuje)'; +$lang['sidebar'] = 'Meno bočného panela (ak ho šablóna podporuje), prázdne pole deaktivuje bočný panel'; +$lang['license'] = 'Pod ktorou licenciou bude publikovaný obsah stránky?'; +$lang['savedir'] = 'Adresár pre ukladanie dát'; +$lang['basedir'] = 'Hlavný adresár (napr. /dokuwiki/). Prázdna hodnota znamená použitie autodetekcie.'; +$lang['baseurl'] = 'Adresa servera (napr. http://www.yourserver.com). Prázdna hodnota znamená použitie autodetekcie.'; +$lang['cookiedir'] = 'Cesta k cookies. Prázdna hodnota znamená použitie adresy servera.'; +$lang['dmode'] = 'Spôsob vytvárania adresárov'; +$lang['fmode'] = 'Spôsob vytvárania súborov'; +$lang['allowdebug'] = 'Povoliť ladenie chýb deaktivujte, ak nie je potrebné!'; +$lang['recent'] = 'Posledné zmeny'; +$lang['recent_days'] = 'Koľko posledných zmien uchovávať (dni)'; +$lang['breadcrumbs'] = 'Počet záznamov histórie'; +$lang['youarehere'] = 'Nachádzate sa'; +$lang['fullpath'] = 'Zobrazovať plnú cestu k stránkam v pätičke'; +$lang['typography'] = 'Vykonať typografické zmeny'; +$lang['dformat'] = 'Formát dátumu (pozri funkciu PHP strftime)'; +$lang['signature'] = 'Podpis'; +$lang['showuseras'] = 'Čo použiť pri zobrazení používateľa, ktorý posledný upravoval stránku'; +$lang['toptoclevel'] = 'Najvyššia úroveň pre generovanie obsahu.'; +$lang['tocminheads'] = 'Minimálny počet nadpisov pre generovanie obsahu'; +$lang['maxtoclevel'] = 'Maximálna úroveň pre generovanie obsahu.'; +$lang['maxseclevel'] = 'Maximálna úroveň sekcie pre editáciu'; +$lang['camelcase'] = 'Použiť CamelCase pre odkazy'; +$lang['deaccent'] = 'Upraviť názvy stránok'; +$lang['useheading'] = 'Použiť nadpis pre názov stránky'; +$lang['sneaky_index'] = 'DokuWiki implicitne ukazuje v indexe všetky menné priestory. Povolením tejto voľby sa nezobrazia menné priestory, ku ktorým nemá používateľ právo na čítanie. Dôsledkom môže byť nezobrazenie vnorených prístupných menných priestorov. Táto voľba môže mať za následok nepoužiteľnosť indexu s určitými ACL nastaveniami.'; +$lang['hidepages'] = 'Skryť zodpovedajúce stránky (regulárne výrazy)'; +$lang['useacl'] = 'Použiť kontrolu prístupu (ACL)'; +$lang['autopasswd'] = 'Autogenerovanie hesla'; +$lang['authtype'] = 'Systém autentifikácie (back-end)'; +$lang['passcrypt'] = 'Spôsob šifrovania hesiel'; +$lang['defaultgroup'] = 'Predvolená skupina'; +$lang['superuser'] = 'Správca - skupina, používateľ alebo čiarkou oddelený zoznam "pouzivatel1,@skupina1,pouzivatel2" s plným prístupom ku všetkým stránkam a funkciám nezávisle od ACL nastavení'; +$lang['manager'] = 'Manažér - skupina, používateľ alebo čiarkou oddelený zoznam "pouzivatel1,@skupina1,pouzivatel2" s prístupom k vybraným správcovským funkciám'; +$lang['profileconfirm'] = 'Potvrdzovať zmeny profilu heslom'; +$lang['rememberme'] = 'Povoliť trvalé prihlasovacie cookies (zapamätaj si ma)'; +$lang['disableactions'] = 'Zakázať DokuWiki akcie'; +$lang['disableactions_check'] = 'Skontrolovať'; +$lang['disableactions_subscription'] = 'Povoliť/Zrušiť informovanie o zmenách stránky'; +$lang['disableactions_wikicode'] = 'Pozrieť zdroj/Exportovať zdroj'; +$lang['disableactions_profile_delete'] = 'Zrušenie vlastného účtu'; +$lang['disableactions_other'] = 'Iné akcie (oddelené čiarkou)'; +$lang['disableactions_rss'] = 'RSS'; +$lang['auth_security_timeout'] = 'Časový limit pri prihlasovaní (v sekundách)'; +$lang['securecookie'] = 'Mal by prehliadač posielať cookies nastavené cez HTTPS posielať iba cez HTTPS (bezpečné) pripojenie? Vypnite túto voľbu iba v prípade, ak je prihlasovanie do Vašej wiki zabezpečené SSL, ale prezeranie wiki je nezabezpečené.'; +$lang['remote'] = 'Povolenie vzdialeného API. Umožnuje iným aplikáciám pristupovať k wiki cez XML-RPC alebo iným spôsobom.'; +$lang['remoteuser'] = 'Obmedzenie použitia vzdialeného API skupinám alebo používateľom oddelených čiarkami. Prázdne pole poskytuje prístup pre každého používateľa.'; +$lang['usewordblock'] = 'Blokovať spam na základe zoznamu známych slov'; +$lang['relnofollow'] = 'Používať rel="nofollow" pre externé odkazy'; +$lang['indexdelay'] = 'Časové oneskorenie pred indexovaním (sek)'; +$lang['mailguard'] = 'Zamaskovať e-mailovú adresu'; +$lang['iexssprotect'] = 'Kontrolovať nahraté súbory na prítomnosť nebezpečného JavaScript alebo HTML kódu'; +$lang['usedraft'] = 'Automaticky ukladať koncept počas úpravy stránky'; +$lang['locktime'] = 'Maximálne trvanie blokovacích súborov (sek)'; +$lang['cachetime'] = 'Maximálne trvanie cache (sek)'; +$lang['target____wiki'] = 'Cieľové okno (target) pre interné odkazy'; +$lang['target____interwiki'] = 'Cieľové okno (target) pre interwiki odkazy'; +$lang['target____extern'] = 'Cieľové okno (target) pre externé odkazy'; +$lang['target____media'] = 'Cieľové okno (target) pre media odkazy'; +$lang['target____windows'] = 'Cieľové okno (target) pre windows odkazy'; +$lang['mediarevisions'] = 'Povoliť verzie súborov?'; +$lang['refcheck'] = 'Kontrolovať odkazy na médiá (pred vymazaním)'; +$lang['gdlib'] = 'Verzia GD Lib'; +$lang['im_convert'] = 'Cesta k ImageMagick convert tool'; +$lang['jpg_quality'] = 'Kvalita JPG kompresie (0-100)'; +$lang['fetchsize'] = 'Maximálna veľkosť (v bajtoch) pri sťahovaní z externých zdrojov'; +$lang['subscribers'] = 'Povoliť podporu informovania o zmenách stránky'; +$lang['subscribe_time'] = 'Časový inteval, po uplynutí ktorého sú zasielané informácie o zmenách stránky alebo menného priestoru (sek); hodnota by mala byť menšia ako čas zadaný pri položke recent_days.'; +$lang['notify'] = 'Posielať upozornenia na zmeny na túto e-mailovú adresu'; +$lang['registernotify'] = 'Posielať informáciu o nových užívateľoch na túto e-mailovú adresu'; +$lang['mailfrom'] = 'E-mailová adresa na automatické e-maily'; +$lang['mailprefix'] = 'Prefix predmetu emailovej spravy zasielanej automaticky'; +$lang['htmlmail'] = 'Posielanie lepšie vyzerajúceho ale objemnejšieho HTML mailu. Deaktivovaním sa budú posielať iba textové maily.'; +$lang['sitemap'] = 'Generovať Google sitemap (dni)'; +$lang['rss_type'] = 'Typ XML feedu'; +$lang['rss_linkto'] = 'XML zdroj odkazuje na'; +$lang['rss_content'] = 'Čo zobrazovať v XML feede?'; +$lang['rss_update'] = 'Časový interval obnovy XML feedu (sek.)'; +$lang['rss_show_summary'] = 'XML zdroj ukáže prehľad v názve'; +$lang['rss_media'] = 'Aký typ zmien by mal byť zobrazený v XML feede?'; +$lang['rss_media_o_both'] = 'oboje'; +$lang['rss_media_o_pages'] = 'strany'; +$lang['rss_media_o_media'] = 'média'; +$lang['updatecheck'] = 'Kontrolovať aktualizácie a bezpečnostné upozornenia? DokuWiki potrebuje pre túto funkciu prístup k update.dokuwiki.org.'; +$lang['userewrite'] = 'Používať nice URLs'; +$lang['useslash'] = 'Používať lomku (/) ako oddeľovač v URL'; +$lang['sepchar'] = 'Oddeľovač slov v názvoch stránok'; +$lang['canonical'] = 'Používať plne kanonické URL názvy'; +$lang['fnencode'] = 'Spôsob kódovania non-ASCII mien súborov.'; +$lang['autoplural'] = 'Kontrolovať množné číslo v odkazoch'; +$lang['compression'] = 'Metóda kompresie pre staré verzie stránok'; +$lang['gzip_output'] = 'Používať gzip Content-Encoding pre xhtml'; +$lang['compress'] = 'Komprimovať CSS a javascript výstup'; +$lang['cssdatauri'] = 'Veľkosť v bytoch, do ktorej by mali byť obrázky s odkazom v CSS vložené priamo do štýlu z dôvodu obmedzenia HTTP požiadaviek. Vhodná hodnota je od 400 do 600 bytov. Hodnota 0 deaktivuje túto metódu.'; +$lang['send404'] = 'Poslať "HTTP 404/Page Not Found" pre neexistujúce stránky'; +$lang['broken_iua'] = 'Je vo Vašom systéme funkcia ignore_user_abort poškodená? Môže to mať za následok nefunkčnosť vyhľadávania v indexe. IIS+PHP/CGI je známy tým, že nefunguje správne. Pozrite Bug 852 pre dalšie informácie.'; +$lang['xsendfile'] = 'Používať X-Sendfile hlavičku pre doručenie statických súborov webserverom? Webserver musí túto funkcionalitu podporovať.'; +$lang['renderer_xhtml'] = 'Používané vykresľovacie jadro pre hlavný (xhtml) wiki výstup'; +$lang['renderer__core'] = '%s (dokuwiki jadro)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['search_nslimit'] = 'Obmedzte vyhľadávanie na aktuálnych X menných priestorov. Ak je vyhľadávanie vyvolané zo stránky v hlbšom mennom priestore, prvých X menných priestorov bude pridaných ako filter'; +$lang['search_fragment_o_exact'] = 'presne'; +$lang['search_fragment_o_starts_with'] = 'začína s'; +$lang['search_fragment_o_ends_with'] = 'končí na'; +$lang['search_fragment_o_contains'] = 'obsahuje'; +$lang['defer_js'] = 'Odložiť vykonanie javascriptu po spracovaní HTML stránky. Zlepší sa vnímanie rýchlosti stránky, ale môže znefunkčniť niektoré pluginy.'; +$lang['dnslookups'] = 'DokuWiki hľadá mená vzdialených IP adries používateľov editujúcich stránky. Ak máte pomalý alebo nefunkčný DNS server alebo nechcete túto možnosť, deaktivujte túto voľbu'; +$lang['jquerycdn'] = 'Mali by byť jQuery a jQuery UI skripty načítané z CDN? Voľba zvýši počet dodatočných HTTP požiadaviek, ale súbory sa môžu načítať rýchlejšie a používatelia ich už môžu mať vo vyrovnávacej pamäti.'; +$lang['jquerycdn_o_0'] = 'Nepoužívať CDN, iba lokálne súbory'; +$lang['jquerycdn_o_jquery'] = 'CDN code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN cdnjs.com'; +$lang['proxy____host'] = 'Proxy server - názov'; +$lang['proxy____port'] = 'Proxy server - port'; +$lang['proxy____user'] = 'Proxy server - používateľské meno'; +$lang['proxy____pass'] = 'Proxy server - heslo'; +$lang['proxy____ssl'] = 'Proxy server - použiť SSL'; +$lang['proxy____except'] = 'Regulárny výraz popisujúci URL odkazy, pre ktoré by proxy nemala byť použitá.'; +$lang['license_o_'] = 'žiadna'; +$lang['typography_o_0'] = 'žiadne'; +$lang['typography_o_1'] = 'okrem jednoduchých úvodzoviek'; +$lang['typography_o_2'] = 'vrátane jednoduchých úvodzoviek (nemusí to vždy fungovať)'; +$lang['userewrite_o_0'] = 'žiadne'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki interné'; +$lang['deaccent_o_0'] = 'vypnuté'; +$lang['deaccent_o_1'] = 'odstrániť diakritiku'; +$lang['deaccent_o_2'] = 'romanizovať (do latinky)'; +$lang['gdlib_o_0'] = 'GD Lib nie je dostupná'; +$lang['gdlib_o_1'] = 'Verzia 1.x'; +$lang['gdlib_o_2'] = 'Autodetekcia'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstrakt'; +$lang['rss_content_o_diff'] = 'Normalizovaný Diff'; +$lang['rss_content_o_htmldiff'] = 'Tabuľka zmien v HTML formáte'; +$lang['rss_content_o_html'] = 'Obsah stránky v HTML formáte'; +$lang['rss_linkto_o_diff'] = 'prehľad zmien'; +$lang['rss_linkto_o_page'] = 'upravená stránka'; +$lang['rss_linkto_o_rev'] = 'zoznam zmien'; +$lang['rss_linkto_o_current'] = 'aktuálna stránka'; +$lang['compression_o_0'] = 'žiadna'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'nepoužívať'; +$lang['xsendfile_o_1'] = 'Proprietárna lighttpd hlavička (pre vydaním 1.5)'; +$lang['xsendfile_o_2'] = 'Štandardná X-Sendfile hlavička'; +$lang['xsendfile_o_3'] = 'Proprietárna Nginx X-Accel-Redirect hlavička'; +$lang['showuseras_o_loginname'] = 'Prihlasovacie meno'; +$lang['showuseras_o_username'] = 'Celé meno používateľa'; +$lang['showuseras_o_username_link'] = 'Celé meno používateľa ako interwiki odkaz'; +$lang['showuseras_o_email'] = 'E-mailová adresa používateľa (zamaskovaná podľa nastavenia)'; +$lang['showuseras_o_email_link'] = 'E-mailová adresa používateľa vo forme odkazu mailto:'; +$lang['useheading_o_0'] = 'Nikdy'; +$lang['useheading_o_navigation'] = 'Iba navigácia'; +$lang['useheading_o_content'] = 'Iba Wiki obsah'; +$lang['useheading_o_1'] = 'Vždy'; +$lang['readdircache'] = 'Maximálne trvanie readdir cache (sek)'; diff --git a/lib/plugins/config/lang/sl/intro.txt b/lib/plugins/config/lang/sl/intro.txt new file mode 100644 index 0000000..506cd34 --- /dev/null +++ b/lib/plugins/config/lang/sl/intro.txt @@ -0,0 +1,7 @@ +====== Splošne nastavitve ====== + +Na tej strani je mogoče spreminjati nastavitve sistema DokuWiki. Pomoč o posameznih nastavitvah je na voljo med [[doku>config|nastavitvami]]. Več podrobnosti o vstavku je na voljo na [[doku>plugin:config|nastavitvami vstavka]]. + +Nastavitve označene s svetlo rdečim ozadjem so zaščitene in jih s tem vstavkom ni mogoče spreminjati. Nastavitve označene s svetlo modrim ozadjem so privzete vrednosti in nastavitve z belim ozadjem so tiste, ki so bile določene krajevno posebej za to nastavitev. Spreminjati je mogoče vrednosti označene z modrimi in belim ozadjem. + +Spremembe je treba **shraniti**, da se uveljavijo, sicer se spremembe prezrejo. diff --git a/lib/plugins/config/lang/sl/lang.php b/lib/plugins/config/lang/sl/lang.php new file mode 100644 index 0000000..2acf690 --- /dev/null +++ b/lib/plugins/config/lang/sl/lang.php @@ -0,0 +1,181 @@ + + * @author Boštjan Seničar + * @author Gregor Skumavc (grega.skumavc@gmail.com) + * @author Matej Urbančič (mateju@svn.gnome.org) + */ +$lang['menu'] = 'Splošne nastavitve'; +$lang['error'] = 'Nastavitve niso shranjene zaradi neveljavne vrednosti.
    Neveljavna vrednost je označena z rdečim robom vnosnega polja.'; +$lang['updated'] = 'Nastavitve so uspešno posodobljene.'; +$lang['nochoice'] = '(ni drugih možnosti na voljo)'; +$lang['locked'] = 'Nastavitvene datoteke ni mogoče posodobiti.
    Preverite dovoljenja za spreminjanje in ime nastavitvene datoteke.'; +$lang['danger'] = 'Opozorilo: spreminjanje te možnosti lahko povzroči težave v delovanju sistema wiki.'; +$lang['warning'] = 'Opozorilo: spreminjanje te možnosti lahko vpliva na pravilno delovanje sistema wiki.'; +$lang['security'] = 'Varnostno opozorilo: spreminjanje te možnosti lahko vpliva na varnost sistema.'; +$lang['_configuration_manager'] = 'Upravljalnik nastavitev'; +$lang['_header_dokuwiki'] = 'Nastavitve DokuWiki'; +$lang['_header_plugin'] = 'Nastavitve vstavkov'; +$lang['_header_template'] = 'Nastavitve predlog'; +$lang['_header_undefined'] = 'Neopredeljene nastavitve'; +$lang['_basic'] = 'Osnovne nastavitve'; +$lang['_display'] = 'Nastavitve prikazovanja'; +$lang['_authentication'] = 'Nastavitve overjanja'; +$lang['_anti_spam'] = 'Nastavitve neželenih sporočil (Anti-Spam)'; +$lang['_editing'] = 'Nastavitve urejanja'; +$lang['_links'] = 'Nastavitve povezav'; +$lang['_media'] = 'Predstavne nastavitve'; +$lang['_advanced'] = 'Napredne nastavitve'; +$lang['_network'] = 'Omrežne nastavitve'; +$lang['_msg_setting_undefined'] = 'Ni nastavitvenih metapodatkov.'; +$lang['_msg_setting_no_class'] = 'Ni nastavitvenega razreda.'; +$lang['_msg_setting_no_default'] = 'Ni privzete vrednosti.'; +$lang['title'] = 'Naslov Wiki spletišča'; +$lang['start'] = 'Ime začetne strani wiki'; +$lang['lang'] = 'Jezik vmesnika'; +$lang['template'] = 'Predloga'; +$lang['tagline'] = 'Označna vrstica (ob podpori predloge)'; +$lang['sidebar'] = 'Ime strani stranske vrstice (ob podpori predloge); prazno polje onemogoči stransko vrstico.'; +$lang['license'] = 'Pod pogoji katerega dovoljenja je objavljena vsebina?'; +$lang['savedir'] = 'Mapa za shranjevanje podatkov'; +$lang['basedir'] = 'Pot do strežnika (npr. /dokuwiki/). Prazno polje določa samodejno zaznavanje'; +$lang['baseurl'] = 'Naslov URL strežnika (npr. http://www.streznik.si). Prazno polje določa samodejno zaznavanje'; +$lang['cookiedir'] = 'Pot do piškotka. Prazno polje določa uporabo osnovnega naslova (baseurl)'; +$lang['dmode'] = 'Način ustvarjanja map'; +$lang['fmode'] = 'Način ustvarjanja datotek'; +$lang['allowdebug'] = 'Dovoli razhroščevanje (po potrebi!)'; +$lang['recent'] = 'Nedavne spremembe'; +$lang['recent_days'] = 'Koliko nedavnih sprememb naj se ohrani (v dnevih)'; +$lang['breadcrumbs'] = 'Število drobtinic poti'; +$lang['youarehere'] = 'Hierarhične drobtinice poti'; +$lang['fullpath'] = 'Pokaži polno pot strani v nogi strani'; +$lang['typography'] = 'Omogoči tipografske zamenjave'; +$lang['dformat'] = 'Oblika zapisa časa (funkcija PHP strftime)'; +$lang['signature'] = 'Podpis'; +$lang['showuseras'] = 'Kaj prikazati za prikaz uporabnika, ki je zadnji urejal stran'; +$lang['toptoclevel'] = 'Vrhnja raven kazala'; +$lang['tocminheads'] = 'Najmanjše število naslovov za izgradnjo kazala'; +$lang['maxtoclevel'] = 'Najvišja raven kazala'; +$lang['maxseclevel'] = 'Največja raven urejanja odseka'; +$lang['camelcase'] = 'Uporabi EnoBesedni zapisa za povezave'; +$lang['deaccent'] = 'Počisti imena strani'; +$lang['useheading'] = 'Uporabi prvi naslov za ime strani'; +$lang['sneaky_index'] = 'Privzeto pokaže sistem DokuWiki vse imenske prostore v pogledu kazala. Z omogočanjem te možnosti bodo skriti vsi imenski prostori, v katere prijavljen uporabnik nima dovoljenj dostopa. S tem je mogoče preprečiti dostop do podrejenih strani. Možnost lahko vpliva na uporabnost nastavitev nadzora dostopa ACL.'; +$lang['hidepages'] = 'Skrij skladne strani (logični izraz)'; +$lang['useacl'] = 'Uporabi seznam nadzora dostopa (ACL)'; +$lang['autopasswd'] = 'Samodejno ustvari gesla'; +$lang['authtype'] = 'Ozadnji način overitve'; +$lang['passcrypt'] = 'Način šifriranja gesel'; +$lang['defaultgroup'] = 'Privzeta skupina'; +$lang['superuser'] = 'Skrbnik - skupina, uporabnik ali z vejico ločen seznam uporabnik1,@skupina1,uporabnik2 s polnim dostopom do vseh strani in možnosti, neodvisno od nastavitev nadzora dostopa ACL'; +$lang['manager'] = 'Upravljavec - skupina, uporabnik ali z vejico ločen seznam uporabnik1,@skupina1,uporabnik2 z dovoljenji za dostop do nekaterih možnosti upravljanja'; +$lang['profileconfirm'] = 'Potrdi spremembe profila z geslom'; +$lang['rememberme'] = 'Dovoli trajne prijavne piškotke (trajno pomnenje prijave)'; +$lang['disableactions'] = 'Onemogoči dejanja DokuWiki'; +$lang['disableactions_check'] = 'Preveri'; +$lang['disableactions_subscription'] = 'Naročanje/Preklic naročnine'; +$lang['disableactions_wikicode'] = 'Pogled izvorne kode/Surovi izvoz'; +$lang['disableactions_other'] = 'Druga dejanja (z vejico ločen seznam)'; +$lang['auth_security_timeout'] = 'Varnostna časovna omejitev overitve (v sekundah)'; +$lang['securecookie'] = 'Ali naj se piškotki poslani preko varne povezave HTTPS v brskalniku pošiljajo le preko HTTPS? Onemogočanje možnosti je priporočljivo le takrat, ko je prijava varovana s protokolom SSL, brskanje po strani pa ni posebej zavarovano.'; +$lang['usewordblock'] = 'Zaustavi neželeno besedilo glede na seznam besed'; +$lang['relnofollow'] = 'Uporabni možnost rel="nofollow" pri zunanjih povezavah'; +$lang['indexdelay'] = 'Časovni zamik pred ustvarjanjem kazala (v sekundah)'; +$lang['mailguard'] = 'Šifriraj elektronske naslove'; +$lang['iexssprotect'] = 'Preveri poslane datoteke za zlonamerno kodo JavaScript ali HTML'; +$lang['usedraft'] = 'Samodejno shrani osnutek med urejanjem strani'; +$lang['locktime'] = 'Največja dovoljena starost datotek zaklepa (v sekundah)'; +$lang['cachetime'] = 'Največja dovoljena starost predpomnilnika (v sekundah)'; +$lang['target____wiki'] = 'Ciljno okno za notranje povezave'; +$lang['target____interwiki'] = 'Ciljno okno za notranje wiki povezave'; +$lang['target____extern'] = 'Ciljno okno za zunanje povezave'; +$lang['target____media'] = 'Ciljno okno za predstavne povezave'; +$lang['target____windows'] = 'Ciljno okno za povezave oken'; +$lang['mediarevisions'] = 'Ali naj se omogočijo objave predstavnih vsebin?'; +$lang['refcheck'] = 'Preverjanje sklica predstavnih datotek'; +$lang['gdlib'] = 'Različica GD Lib'; +$lang['im_convert'] = 'Pot do orodja za pretvarjanje slik ImageMagick'; +$lang['jpg_quality'] = 'Kakovost stiskanja datotek JPG (0-100)'; +$lang['fetchsize'] = 'največja dovoljena velikost zunanjega prejemanja z datoteko fetch.php (v bajtih)'; +$lang['subscribers'] = 'Omogoči podporo naročanju na strani'; +$lang['subscribe_time'] = 'Čas po katerem so poslani povzetki sprememb (v sekundah); Vrednost mora biti krajša od časa, ki je določen z nedavno_dni.'; +$lang['notify'] = 'Pošlji obvestila o spremembah na določen elektronski naslov'; +$lang['registernotify'] = 'Pošlji obvestila o novih vpisanih uporabnikih na določen elektronski naslov'; +$lang['mailfrom'] = 'Elektronski naslov za samodejno poslana sporočila'; +$lang['mailprefix'] = 'Predpona zadeve elektronskega sporočila za samodejna sporočila.'; +$lang['sitemap'] = 'Ustvari Google kazalo strani (v dnevih)'; +$lang['rss_type'] = 'Vrsta virov XML'; +$lang['rss_linkto'] = 'XML viri so povezani z'; +$lang['rss_content'] = 'Kaj prikazati med predmeti virov XML?'; +$lang['rss_update'] = 'Časovni razmik posodobitve virov XML (v sekundah)'; +$lang['rss_show_summary'] = 'Viri XML so povzeti v naslovu'; +$lang['updatecheck'] = 'Ali naj sistem preveri za posodobitve in varnostna opozorila.'; +$lang['userewrite'] = 'Uporabi olepšan zapis naslovov URL'; +$lang['useslash'] = 'Uporabi poševnico kot ločilnik imenskih prostorov v naslovih URL'; +$lang['sepchar'] = 'Ločilnik besed imen strani'; +$lang['canonical'] = 'Uporabi polni kanonični zapis naslova URL'; +$lang['fnencode'] = 'Način kodiranja ne-ASCII imen datotek.'; +$lang['autoplural'] = 'Preveri množinske oblike povezav'; +$lang['compression'] = 'Način stiskanja za arhivirane datoteke'; +$lang['gzip_output'] = 'Uporabi stiskanje gzip vsebine za xhtml'; +$lang['compress'] = 'Združi odvod CSS in JavaScript v brskalniku'; +$lang['cssdatauri'] = 'Velikost sklicanih slik v bajtih, ki so navedene v datotekah CSS za zmanjšanje zahtev osveževanja strežnika HTTP. Ustrezne vrednosti so 400 do 600 bajtov. Vrednost 0 onemogoči možnost.'; +$lang['send404'] = 'Pošlji "HTTP 404/Strani ni mogoče najti" pri dostopu do neobstoječih strani'; +$lang['broken_iua'] = 'Ali je možnost ignore_user_abort okvarjena na sistemu? Napaka lahko vpliva na delovanje iskalnika. Napake so pogoste ob uporabi IIS+PHP/CGI. Več o tem si je mogoče prebrati v poročilu o hrošču 852.'; +$lang['xsendfile'] = 'Uporabi glavo X-Sendfile za prejemanje statičnih datotek. Spletni strežnik mora možnost podpirati.'; +$lang['renderer_xhtml'] = 'Izrisovalnik za odvod Wiki strani (xhtml)'; +$lang['renderer__core'] = '%s (jedro dokuwiki)'; +$lang['renderer__plugin'] = '%s (vstavek)'; +$lang['proxy____host'] = 'Ime posredniškega strežnika'; +$lang['proxy____port'] = 'Vrata posredniškega strežnika'; +$lang['proxy____user'] = 'Uporabniško ime posredniškega strežnika'; +$lang['proxy____pass'] = 'Geslo posredniškega strežnika'; +$lang['proxy____ssl'] = 'Uporabi varno povezavo SSL za povezavo z posredniškim strežnikom'; +$lang['proxy____except'] = 'Logični izrazi morajo biti skladni z naslovi URL, ki gredo mimo posredniškega strežnika.'; +$lang['license_o_'] = 'Ni izbranega dovoljenja'; +$lang['typography_o_0'] = 'brez'; +$lang['typography_o_1'] = 'izloči enojne narekovaje'; +$lang['typography_o_2'] = 'z enojnimi narekovaji (lahko včasih ne deluje)'; +$lang['userewrite_o_0'] = 'brez'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'notranji DokuWiki'; +$lang['deaccent_o_0'] = 'onemogočeno'; +$lang['deaccent_o_1'] = 'odstrani naglasne oznake'; +$lang['deaccent_o_2'] = 'pretvori v romanski zapis'; +$lang['gdlib_o_0'] = 'Knjižnica GD Lib ni na voljo'; +$lang['gdlib_o_1'] = 'Različica 1.x'; +$lang['gdlib_o_2'] = 'Samodejno zaznavanje'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Povzetek'; +$lang['rss_content_o_diff'] = 'Poenotena primerjava'; +$lang['rss_content_o_htmldiff'] = 'HTML oblikovana preglednica primerjave'; +$lang['rss_content_o_html'] = 'Polna HTML vsebina strani'; +$lang['rss_linkto_o_diff'] = 'primerjalni pogled'; +$lang['rss_linkto_o_page'] = 'pregledana stran'; +$lang['rss_linkto_o_rev'] = 'seznam pregledovanj'; +$lang['rss_linkto_o_current'] = 'trenutna stran'; +$lang['compression_o_0'] = 'brez'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'ne uporabi'; +$lang['xsendfile_o_1'] = 'lastniška glava lighttpd (pred različico 1.5)'; +$lang['xsendfile_o_2'] = 'običajna glava X-Sendfile'; +$lang['xsendfile_o_3'] = 'lastniška glava Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Prijavno ime'; +$lang['showuseras_o_username'] = 'Polno ime uporabnika'; +$lang['showuseras_o_email'] = 'Elektronski naslov uporabnika (šifriran po določilih varovanja)'; +$lang['showuseras_o_email_link'] = 'Elektronski naslov uporabnika kot povezava mailto:'; +$lang['useheading_o_0'] = 'nikoli'; +$lang['useheading_o_navigation'] = 'le za krmarjenje'; +$lang['useheading_o_content'] = 'le za vsebino Wiki'; +$lang['useheading_o_1'] = 'vedno'; +$lang['readdircache'] = 'Največja dovoljena starost predpomnilnika prebranih map (v sekundah)'; diff --git a/lib/plugins/config/lang/sq/intro.txt b/lib/plugins/config/lang/sq/intro.txt new file mode 100644 index 0000000..d2bab0f --- /dev/null +++ b/lib/plugins/config/lang/sq/intro.txt @@ -0,0 +1,7 @@ +====== Menaxheri Konfigurimit ====== + +Përdoreni këtë faqe për të kontrolluar kuadrot e instalimit të DokuWiki-t tuaj. Për ndihmë mbi kuadro individuale referojuni [[doku>config]]. Për më tepër detaje rreth këtij plugin-i shih [[doku>plugin:config]]. + +Kuadrot e treguara me një backgroudn me një ngjyrë të kuqe të lehtë janë të mbrojtura dhe nuk mund të ndryshohen me këtë plugin. Kuadrot e treguara me një background blu janë vlerat default dhe kuadrot e treguara me një background të bardhë janë vendosur lokalisht për këtë instalim të caktuar. Si kuadrot blu, ashtu edhe ato të bardhë mund të ndryshohen. + +Kujtohuni të shtypni butonin **Ruaj** para se të dilni nga kjo faqe ose ndryshimet tuaja do të humbasin. diff --git a/lib/plugins/config/lang/sq/lang.php b/lib/plugins/config/lang/sq/lang.php new file mode 100644 index 0000000..83867f8 --- /dev/null +++ b/lib/plugins/config/lang/sq/lang.php @@ -0,0 +1,172 @@ + + * @author Endrit Callaki + * @author Leonard Elezi + */ +$lang['menu'] = 'Konfigurimi i Kuadrove'; +$lang['error'] = 'Kuadrot nuk u përditësuan për shkak të një vlere të palejuar, ju lutem rishikoni ndryshimet tuaja dhe ridorëzojeni. +
    Vlerat e pasakta tregohen të rrethuara nga një kornizë e kuqe.'; +$lang['updated'] = 'Kuadrot u përditësuan me sukses.'; +$lang['nochoice'] = '(asnjë zgjedhje tjetër e disponueshme)'; +$lang['locked'] = 'Skedari i kuadrove nuk mund të përditësohet, nëse kjo është e paqëllimshme,
    sigurohuni që emri i skedarit të kuadrove lokale dhe të drejtat të jenë të sakta.'; +$lang['danger'] = 'Rrezik: Ndrishimi i kësaj alternative mund ta bëjë wiki-n dhe menunë tuaj të konfigurimit të pa aksesueshme.'; +$lang['warning'] = 'Paralajmërim: Ndryshimi i kësaj alternative mund të shkaktojë sjellje të padëshiruara.'; +$lang['security'] = 'Paralajmërim Sigurie: Ndryshimi i kësaj alternative mund të paraqesë një rrezik në siguri.'; +$lang['_configuration_manager'] = 'Menaxhuesi i Kuadrove'; +$lang['_header_dokuwiki'] = 'Kuadrot e DokuWiki-t'; +$lang['_header_plugin'] = 'Kuadrot e Plugin-eve'; +$lang['_header_template'] = 'Kuadrot e Template-eve'; +$lang['_header_undefined'] = 'Kuadro të Papërcaktuara'; +$lang['_basic'] = 'Kuadro Elementare'; +$lang['_display'] = 'Kuadrot e Shfaqjes'; +$lang['_authentication'] = 'Kuadrot e Autentikimit'; +$lang['_anti_spam'] = 'Kuadrot Anti-Spam'; +$lang['_editing'] = 'Kuadrot e Redaktimit'; +$lang['_links'] = 'Kuadrot e Link-eve'; +$lang['_media'] = 'Kuadrot e Medias'; +$lang['_advanced'] = 'Kuadro të Avancuara'; +$lang['_network'] = 'Kuadrot e Rrjetit'; +$lang['_msg_setting_undefined'] = 'Metadata pa kuadro.'; +$lang['_msg_setting_no_class'] = 'Klasë pa kuadro.'; +$lang['_msg_setting_no_default'] = 'Asnjë vlerë default.'; +$lang['title'] = 'Titulli i Wiki-t'; +$lang['start'] = 'Emri i faqes së fillimit'; +$lang['lang'] = 'Gjuha e ndërfaqes'; +$lang['template'] = 'Template'; +$lang['license'] = 'Nën cilën liçensë duhet të vihet përmbajtja juar?'; +$lang['savedir'] = 'Direktoria për të ruajtur të dhënat'; +$lang['basedir'] = 'Path-i i Serverit (psh /dokuwiki/). Lëre bosh për ta gjetur automatikisht.'; +$lang['baseurl'] = 'URL-ja serverit (psh http://www.serveriyt.com). Lëre bosh për ta gjetur automatikisht.'; +$lang['dmode'] = 'Mënyra krijim dosjeje.'; +$lang['fmode'] = 'Mënyra krijim skedari'; +$lang['allowdebug'] = 'Lejo debug çaktivizoje nëse nuk nevojitet!'; +$lang['recent'] = 'Ndryshimet më të fundit'; +$lang['recent_days'] = 'Sa ndryshime të fundit duhen mbajtur (ditë)'; +$lang['breadcrumbs'] = 'Numri i gjurmëve'; +$lang['youarehere'] = 'Gjurmë hierarkike'; +$lang['fullpath'] = 'Trego adresën e plotë të faqeve në footer.'; +$lang['typography'] = 'Bëj zëvendësime tipografike'; +$lang['dformat'] = 'Formati i Datës (shiko funksionin strftime e PHP-së)'; +$lang['signature'] = 'Firma'; +$lang['showuseras'] = 'Cfarë të shfaqësh kur t\'i tregosh përdoruesit faqen e fundit të redaktuar'; +$lang['toptoclevel'] = 'Niveli i Kreut për tabelën e përmbajtjes'; +$lang['tocminheads'] = 'Sasia minimum e titrave që përcaktojnë nëse TOC ndërtohet ose jo'; +$lang['maxtoclevel'] = 'Niveli maksimum për tabelën e përmbajtjes'; +$lang['maxseclevel'] = 'Niveli maksimum për redaktim të seksionit'; +$lang['camelcase'] = 'Përdor CamelCase (shkronja e parë e çdo fjale është kapitale) për linke-t'; +$lang['deaccent'] = 'Emra faqesh të pastër'; +$lang['useheading'] = 'Përdor titra të nivelit të parë për faqet e emrave'; +$lang['sneaky_index'] = 'Vetiu DokuWiki tregon të gjithë hapësirat e emrit në shikimin e index-it. Aktivizimi i kësaj alternative do të fshehë ato ku përdoruesi nuk ka të drejta leximi. Kjo mund të përfundojë në fshehje të nënhapësirave të emrit të aksesueshme. Kjo mund ta bëjë index-in të papërdorshëm me disa konfigurime të caktuara të ACL-së.'; +$lang['hidepages'] = 'Fshi faqet që përkojnë (shprehjet e rregullta)'; +$lang['useacl'] = 'Përdor lista kontrolli të aksesit'; +$lang['autopasswd'] = 'Autogjenero fjalëkalime'; +$lang['authtype'] = 'Backend autentikimi'; +$lang['passcrypt'] = 'Metoda e enkriptimit të fjalëkalimit'; +$lang['defaultgroup'] = 'Grupi default'; +$lang['superuser'] = 'Superpërdorues - grup, përdorues ose listë e ndarë me presje user1, @group1,user2 me akses të plotë në të gjitha faqet dhe funksionet pavarësisht kuadrove të ACL'; +$lang['manager'] = 'Menaxher - grup, përdorues ose listë e ndarë me presje user1,@group1,user2 me akses në disa funksione të caktuara menaxhimi'; +$lang['profileconfirm'] = 'Konfirmo ndryshimet ne profil me fjalëkalim'; +$lang['rememberme'] = 'Lejo cookies hyrjeje të përhershme (më kujto mua)'; +$lang['disableactions'] = 'Caktivizo veprimet e DokuWiki-it'; +$lang['disableactions_check'] = 'Kontrollo'; +$lang['disableactions_subscription'] = 'Abonohu/Fshi Abonim'; +$lang['disableactions_wikicode'] = 'Shiku kodin burim/ Eksportoje të Papërpunuar'; +$lang['disableactions_other'] = 'Veprime të tjera (të ndarë me presje)'; +$lang['auth_security_timeout'] = 'Koha e Përfundimit për Autentikim (sekonda)'; +$lang['securecookie'] = 'A duhet që cookies të vendosura nëpërmjet HTTPS të dërgohen vetëm nëpërmjet HTTPS nga shfletuesit? Caktivizojeni këtë alternativë kur vetëm hyrja në wiki-n tuaj sigurohet me SSL por shfletimi i wiki-t bëhet në mënyrë të pasigurtë.'; +$lang['usewordblock'] = 'Blloko spam-in duke u bazuar mbi listë fjalësh'; +$lang['relnofollow'] = 'Përdor rel="nofollow" në linke të jashtëm'; +$lang['indexdelay'] = 'Vonesa në kohë para index-imit (sekonda)'; +$lang['mailguard'] = 'Errëso adresat e email-it'; +$lang['iexssprotect'] = 'Kontrollo skedarët e ngarkuar për kod të mundshëm dashakeqës JavaScript ose HTML'; +$lang['usedraft'] = 'Ruaj automatikisht një skicë gjatë redaktimit'; +$lang['locktime'] = 'Mosha maksimale për kyçjen e skedarëve (sekonda)'; +$lang['cachetime'] = 'Mosha maksimale për cache (sekonda)'; +$lang['target____wiki'] = 'Dritarja target për link-e të brendshëm'; +$lang['target____interwiki'] = 'Dritarja target për link-e interwiki'; +$lang['target____extern'] = 'Dritarja target për link-e të jashtme'; +$lang['target____media'] = 'Dritarja target për link-e mediash'; +$lang['target____windows'] = 'Dritarja target për link-e windows-i'; +$lang['refcheck'] = 'Kontroll për referim mediash'; +$lang['gdlib'] = 'Versioni i GD Lib'; +$lang['im_convert'] = 'Path-i për tek mjeti i konvertimit ImageMagick'; +$lang['jpg_quality'] = 'Cilësia e kompresimit JPG (0-100)'; +$lang['fetchsize'] = 'Madhësia maksimale (bytes) që fetch.php mund të shkarkojë nga jashtë'; +$lang['subscribers'] = 'Aktivizo suportin për abonim faqesh'; +$lang['subscribe_time'] = 'Koha pas së cilës listat e abonimeve dhe konsumimet dërgohen (sekonda); Kjo duhet të jetë më e vogël se koha e specifikuar në ditët më të fundit'; +$lang['notify'] = 'Dërgo lajmërim për ndryshime te kjo adresë email-i'; +$lang['registernotify'] = 'Dërgo info për përdoruesit e sapo regjistruar te kjo adresë email-i'; +$lang['mailfrom'] = 'Adresa e email-it që do të përdoret për dërgimin e email-eve automatikë'; +$lang['sitemap'] = 'Gjenero Google sitemap (ditë)'; +$lang['rss_type'] = 'Tipi feed XML'; +$lang['rss_linkto'] = 'XML feed lidhet me'; +$lang['rss_content'] = 'Cfarë të shfaqësh në objektet XML feed?'; +$lang['rss_update'] = 'Intervali i përditësimit XML feed (sekonda)'; +$lang['rss_show_summary'] = 'XML feed trego përmbledhjen në titull'; +$lang['updatecheck'] = 'Kontrollo për përditësime dhe paralajmërime sigurie? DokuWiki duhet të kontaktojë me update.dokuwiki.org për këtë veti.'; +$lang['userewrite'] = 'Përdor URL të këndshme.'; +$lang['useslash'] = 'Përdor / si ndarës të hapësirave të emrit në URL'; +$lang['sepchar'] = 'Fjala ndarëse për emrin e faqes'; +$lang['canonical'] = 'Përdor URL kanonike të plota'; +$lang['autoplural'] = 'Kontrollo për forma shumës në link-e'; +$lang['compression'] = 'Metoda kompresimit për skedarët atikë'; +$lang['gzip_output'] = 'Përdor gzip Content-Encoding për xhtml'; +$lang['compress'] = 'Kompaktëso daljet CSS dhe JavaScript '; +$lang['send404'] = 'Dërgo "HTTP 404/Page Not Found" për faqe që nuk ekzistojnë'; +$lang['broken_iua'] = 'Funksioni ignore_user_abort është i prishur në sistemin tuaj? Kjo mund të shkaktojë një indeks kërkimi jo funksional. IIS+PHP/CGI njihen si të prishura. Shiko Bug 852 për më shumë info.'; +$lang['xsendfile'] = 'Përdor kokën X-Sendfile për të lejuar webserver-in të dërgojë skedarë statikë? Kjo duhet të suportohet nga webserver-i juaj.'; +$lang['renderer_xhtml'] = 'Riprodhuesi i përdorur për daljen wiki kryesore (xhtml)'; +$lang['renderer__core'] = '%s (dokuwiki core)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['proxy____host'] = 'Emri i serverit të proxy-t'; +$lang['proxy____port'] = 'Porta e proxy-t'; +$lang['proxy____user'] = 'Emri i përdoruesit për proxy-n'; +$lang['proxy____pass'] = 'Fjalëkalimi proxy-t'; +$lang['proxy____ssl'] = 'Përdor SSL për tu lidhur me proxy-n'; +$lang['license_o_'] = 'Nuk u zgjodh asgjë'; +$lang['typography_o_0'] = 'Asgjë'; +$lang['typography_o_1'] = 'përjashtim i thonjëzave teke'; +$lang['typography_o_2'] = 'përfshirje e thonjëzave teke (nuk punon gjithmonë) '; +$lang['userewrite_o_0'] = 'asgjë'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'Brendësia DokuWiki'; +$lang['deaccent_o_0'] = 'fikur'; +$lang['deaccent_o_1'] = 'hiq theksin'; +$lang['deaccent_o_2'] = 'romanizo'; +$lang['gdlib_o_0'] = 'GD Lib nuk është e disponueshme'; +$lang['gdlib_o_1'] = 'Versioni 1.x'; +$lang['gdlib_o_2'] = 'Dallim automatik'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstrakte'; +$lang['rss_content_o_diff'] = 'Ndryshime të njësuara'; +$lang['rss_content_o_htmldiff'] = 'Tabelë ndryshimesh e formatuar në HTML'; +$lang['rss_content_o_html'] = 'Përmbajtje e plotë faqeje HTML'; +$lang['rss_linkto_o_diff'] = 'shikimi ndryshimit'; +$lang['rss_linkto_o_page'] = 'faqja e rishikuar'; +$lang['rss_linkto_o_rev'] = 'lista e rishikimeve'; +$lang['rss_linkto_o_current'] = 'faqja aktuale'; +$lang['compression_o_0'] = 'asgjë'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'mos e përdor'; +$lang['xsendfile_o_1'] = 'Proprietary lighttpd header (para lëshimit 1.5)'; +$lang['xsendfile_o_2'] = 'X-Sendfile header standard'; +$lang['xsendfile_o_3'] = 'Proprietary Nginx X-Accel-Redirect header'; +$lang['showuseras_o_loginname'] = 'Emri hyrjes'; +$lang['showuseras_o_username'] = 'Emri i plotë i përdoruesit'; +$lang['showuseras_o_email'] = 'Adresa e email-it e përdoruesit (errësuar sipas kuadros mailguard)'; +$lang['showuseras_o_email_link'] = 'Adresa email e përdoruesit si një mailto: link'; +$lang['useheading_o_0'] = 'Kurrë'; +$lang['useheading_o_navigation'] = 'Vetëm për Navigim'; +$lang['useheading_o_content'] = 'Vetëm për Përmbajtje Wiki'; +$lang['useheading_o_1'] = 'Gjithmonë'; diff --git a/lib/plugins/config/lang/sr/intro.txt b/lib/plugins/config/lang/sr/intro.txt new file mode 100644 index 0000000..0ee76ed --- /dev/null +++ b/lib/plugins/config/lang/sr/intro.txt @@ -0,0 +1,7 @@ +====== Управљач подешавањима ====== + +Ову страну користите за контролу подешавања вашег DokuWiki-ја. За помоћ о индивидуалним поставкама погледајте [[doku>config]]. За више информација о додацима погледајте [[doku>plugin:config]]. + +Подешавања која имају светло црвену позадину су заштићена и не могу се мењати овим додатком. Подешавања која имају светло плаву позадину су подразумеване вредности и подешавања са белом позадином су локална за ову вики инсталацију. И плава и бела подешавања се могу мењати. + +Не заборавите да притиснете дугме **Сачувај** када завршите са изменама, у супротном ће ваше измене бити изгубљене. diff --git a/lib/plugins/config/lang/sr/lang.php b/lib/plugins/config/lang/sr/lang.php new file mode 100644 index 0000000..6b951ba --- /dev/null +++ b/lib/plugins/config/lang/sr/lang.php @@ -0,0 +1,176 @@ + + * @author Miroslav Šolti + * @author Марко М. Костић + */ +$lang['menu'] = 'Подешавања'; +$lang['error'] = 'Подешавања нису прихваћена јер постоји вредност са грешком, проверите измене које сте извршили и поновите слање.
    Вредност(и) са грешком су приказане са црвеним оквиром.'; +$lang['updated'] = 'Измене су сачуване.'; +$lang['nochoice'] = '(не постоји други избор)'; +$lang['locked'] = 'Датотека са подешавањима не може да се ажурира, ако вам то није намера проверите да ли су дозволе исправно постављене.'; +$lang['danger'] = 'Опасно: Променом ове опције може се десити да ваш вики и мени за подешавања буде недоступан.'; +$lang['warning'] = 'Упозорење: Промена ове опције може проузроковати нежељене ефекте.'; +$lang['security'] = 'Сигурносно упозорење: Промена ове опције може да проузрокује сигурносни ризик.'; +$lang['_configuration_manager'] = 'Управљач подешавањима'; +$lang['_header_dokuwiki'] = 'Подешавања Dokuwiki-ја'; +$lang['_header_plugin'] = 'Подешавања за додатке'; +$lang['_header_template'] = 'Подешавања за шаблоне'; +$lang['_header_undefined'] = 'Неразврстана подешавања'; +$lang['_basic'] = 'Основна подешавања'; +$lang['_display'] = 'Подешавања приказа'; +$lang['_authentication'] = 'Подешавања провере'; +$lang['_anti_spam'] = 'Подешавања за борбу против спама'; +$lang['_editing'] = 'Подешавања измена'; +$lang['_links'] = 'Подешавања линковања'; +$lang['_media'] = 'Подешавања медија'; +$lang['_advanced'] = 'Напредна подешавања'; +$lang['_network'] = 'Подешавања мреже'; +$lang['_msg_setting_undefined'] = 'Нема метаподатака подешавања'; +$lang['_msg_setting_no_class'] = 'Нема класе подешавања'; +$lang['_msg_setting_no_default'] = 'Нема подразумеване вредности'; +$lang['title'] = 'Назив викија'; +$lang['start'] = 'Назив почетне странице'; +$lang['lang'] = 'Језик'; +$lang['template'] = 'Шаблон'; +$lang['license'] = 'Под којом лиценцом желите да ваш материјал буде објављен?'; +$lang['savedir'] = 'Фасцикла у којој ће се чувати подаци'; +$lang['basedir'] = 'Основна фасцикла'; +$lang['baseurl'] = 'Основни УРЛ'; +$lang['dmode'] = 'Начин прављења фасцикла'; +$lang['fmode'] = 'Начин прављења датотека'; +$lang['allowdebug'] = 'Укључи дебаговање искључи ако није потребно!'; +$lang['recent'] = 'Последње промене'; +$lang['recent_days'] = 'Колико последњих промена чувати (дани)'; +$lang['breadcrumbs'] = 'Број пређених корака (страница)'; +$lang['youarehere'] = 'Хиерархијске кораке (странице)'; +$lang['fullpath'] = 'Објави целу путању странице у заглављу на дну стране'; +$lang['typography'] = 'Уради типографске замене'; +$lang['dformat'] = 'Облик датума (погледајте ПХПову strftime функцију)'; +$lang['signature'] = 'Потпис'; +$lang['showuseras'] = 'Шта приказати за исписивање корисника који је последњи вршио измене'; +$lang['toptoclevel'] = 'Највиши ниво за садржај'; +$lang['tocminheads'] = 'Минималан број наслова који одређују да ли ће Садржај бити направљен'; +$lang['maxtoclevel'] = 'Максимални ниво за садржај'; +$lang['maxseclevel'] = 'Максималан број секција које се мењају'; +$lang['camelcase'] = 'Користи CamelCase за линкове'; +$lang['deaccent'] = 'Чисти имена страница'; +$lang['useheading'] = 'Преузми наслов првог нивоа за назив странице'; +$lang['sneaky_index'] = 'По инсталацији DokuWiki ће у индексу приказати све именске просторе. Укључивањем ове опције именски простори у којима корисник нема право читања ће бити сакривени. Консеквенца је да ће и доступни подпростори бити сакривени. Ово доводи до неупотребљивости Права приступа у неким поставкама.'; +$lang['hidepages'] = 'Сакриј подударне странице (на основу регуларних израза)'; +$lang['useacl'] = 'Користи листу права приступа'; +$lang['autopasswd'] = 'Аутогенерисане лозинки'; +$lang['authtype'] = 'Позадински систем аутентификације'; +$lang['passcrypt'] = 'Метода шифровања лозинки'; +$lang['defaultgroup'] = 'Подразумевана група'; +$lang['superuser'] = 'Суперкорисник - група, корисник или зарезом одвојена листа корисника корисник1,@група1,корисник2 са отвореним проступом свим страницама и функцијама без обзира на поставке Контроле приступа'; +$lang['manager'] = 'Управник - група, корисник или зарезом одвојена листа корисника корисник1,@група1,корисник2 са отвореним проступом неким функцијама за управљање'; +$lang['profileconfirm'] = 'Потврди промене у профилу куцањем лозинке'; +$lang['rememberme'] = 'Дозволи стални колачић за пријављивање (запамти ме)'; +$lang['disableactions'] = 'Искључи DokuWiki наредбе'; +$lang['disableactions_check'] = 'Провера'; +$lang['disableactions_subscription'] = 'Претплата'; +$lang['disableactions_wikicode'] = 'Прикажи извор/Извези сирово'; +$lang['disableactions_other'] = 'Остале наредбе (раздвојене зарезом)'; +$lang['auth_security_timeout'] = 'Временска пауза у аутентификацији (секунде)'; +$lang['securecookie'] = 'Да ли колачићи који су постављени преко ХТТПС треба слати веб читачу само преко ХТТПС? Искључите ову опцију само ако је пријављивање на вики заштићено ССЛом а остали део викија незаштићен.'; +$lang['usewordblock'] = 'Блокирај спам на основу листе речи'; +$lang['relnofollow'] = 'Користи rel="nofollow" за спољне линкове'; +$lang['indexdelay'] = 'Одлагање индексирања (секунде)'; +$lang['mailguard'] = 'Замутити Е-адресе'; +$lang['iexssprotect'] = 'Провера потенцијално малициозног кода у Јаваскрипт или ХТМЛ коду'; +$lang['usedraft'] = 'Аутоматски сачувај скицу у току писања измена'; +$lang['locktime'] = 'МАксимално трајање закључавања датотека (сек)'; +$lang['cachetime'] = 'Максимално трајање оставе (сек)'; +$lang['target____wiki'] = 'Циљни прозор за интерне линкове'; +$lang['target____interwiki'] = 'Циљни прозор за међувики линкове'; +$lang['target____extern'] = 'Циљни прозор за спољне линкове'; +$lang['target____media'] = 'Циљни прозор за медијске линкове'; +$lang['target____windows'] = 'Циљни прозор за Виндоуз линкове'; +$lang['refcheck'] = 'Провери референце медијских датотека'; +$lang['gdlib'] = 'ГД Либ верзија'; +$lang['im_convert'] = 'Путања до алатке за коверзију ИмиџМеџик '; +$lang['jpg_quality'] = 'ЈПГ квалитет компресије (0-100)'; +$lang['fetchsize'] = 'Максимална величина (у бајтима) коју може да преузме fetch.php од споља'; +$lang['subscribers'] = 'Укључи могућност претплате за странице'; +$lang['subscribe_time'] = 'Време након ког се спискови претплатника и сижеи шаљу (у секундама); Ова цифра би требало да буде мања од цифре наведене под recent_days'; +$lang['notify'] = 'Пошаљи обавештења о променама на ову е-адресу'; +$lang['registernotify'] = 'Пошаљи обавештење о новорегистрованим корисницима на ову е-адресу'; +$lang['mailfrom'] = 'Е-адреса која се користи као пошиљаоц за аутоматске е-поруке'; +$lang['sitemap'] = 'Генериши Гугл мапу сајта (дан)'; +$lang['rss_type'] = 'Врста ИксМЛ довода'; +$lang['rss_linkto'] = 'ИксМЛ довод линкује на'; +$lang['rss_content'] = 'Шта треба приказати у ИксМЛ доводу?'; +$lang['rss_update'] = 'ИксМЛ'; +$lang['rss_show_summary'] = 'ИксМЛ довод приказује збир у наслову'; +$lang['updatecheck'] = 'Провера надоградњи и сигурносних упозорења? Dokuwiki мора да контактира update.dokuwiki.org ради добијања информација.'; +$lang['userewrite'] = 'Направи леп УРЛ'; +$lang['useslash'] = 'Користи косу црту у УРЛу за раздвајање именских простора '; +$lang['sepchar'] = 'Раздвајање речи у називу странице'; +$lang['canonical'] = 'Користи правилне УРЛове'; +$lang['fnencode'] = 'Метод кодирања не-ASCII имена фајлова:'; +$lang['autoplural'] = 'Провери облик множине у линковима'; +$lang['compression'] = 'Метод компресије за attic датотеке'; +$lang['gzip_output'] = 'Користи гзип шифрирање за иксХТМЛ'; +$lang['compress'] = 'Сажимај ЦСС и јаваскрипт'; +$lang['send404'] = 'Пошаљи поруку "ХТТП 404/Страница не постоји" за непостојеће странице'; +$lang['broken_iua'] = 'Да ли је функција ignore_user_abort function не ради на вашем систему? Ово може проузроковати неиндексирање података за претрагу. ИИС+ПХП/ЦГИ је често ван функције. Погледајте баг 852 за више информација.'; +$lang['xsendfile'] = 'Користи заглавље X-Sendfile да би веб сервер могао да испоручује статичке датотеке? Веб сервер треба да подржава ову функцију.'; +$lang['renderer_xhtml'] = 'Исцртавање користи главни (xhtml) вики испис'; +$lang['renderer__core'] = '%s (dokuwiki језгро)'; +$lang['renderer__plugin'] = '%s (додатак)'; +$lang['jquerycdn_o_0'] = 'Без CDN-a, само локална достава'; +$lang['jquerycdn_o_jquery'] = 'CDN на адреси code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN на cdnjs.com'; +$lang['proxy____host'] = 'Назив посредника (проксија)'; +$lang['proxy____port'] = 'Порт посредника (проксија)'; +$lang['proxy____user'] = 'Корисничко име на посреднику (проксију)'; +$lang['proxy____pass'] = 'Лозинка на посреднику (проксију)'; +$lang['proxy____ssl'] = 'Користи ССЛ за повезивање са посредником (проксијем)'; +$lang['proxy____except'] = 'Редован израз који би требало да се подудара са веб адресом странице за коју треба прескочити посредника (прокси).'; +$lang['license_o_'] = 'Није одабрано'; +$lang['typography_o_0'] = 'не'; +$lang['typography_o_1'] = 'Само дупли наводници'; +$lang['typography_o_2'] = 'Сви наводници (неће увек радити)'; +$lang['userewrite_o_0'] = 'не'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki интерно'; +$lang['deaccent_o_0'] = 'искључено'; +$lang['deaccent_o_1'] = 'уклони акценте'; +$lang['deaccent_o_2'] = 'романизуј'; +$lang['gdlib_o_0'] = 'ГД Либ није доступан'; +$lang['gdlib_o_1'] = 'Верзија 1.*'; +$lang['gdlib_o_2'] = 'Аутопроналажење'; +$lang['rss_type_o_rss'] = 'РСС 0.91'; +$lang['rss_type_o_rss1'] = 'РСС 1.0'; +$lang['rss_type_o_rss2'] = 'РСС 2.0'; +$lang['rss_type_o_atom'] = 'Атом 0.3'; +$lang['rss_type_o_atom1'] = 'Атом 1.0'; +$lang['rss_content_o_abstract'] = 'Издвојити'; +$lang['rss_content_o_diff'] = 'Једностране разлике'; +$lang['rss_content_o_htmldiff'] = 'ХТМЛ форматирана табела разлика'; +$lang['rss_content_o_html'] = 'ХТМЛ садржај странице'; +$lang['rss_linkto_o_diff'] = 'приказ разлика'; +$lang['rss_linkto_o_page'] = 'исправљена страница'; +$lang['rss_linkto_o_rev'] = 'листа исправки'; +$lang['rss_linkto_o_current'] = 'тренутна страница'; +$lang['compression_o_0'] = 'не'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'не'; +$lang['xsendfile_o_1'] = 'Власничко lighttpd заглавље (пре верзије 1.5)'; +$lang['xsendfile_o_2'] = 'Стандардно заглавље X-Sendfile'; +$lang['xsendfile_o_3'] = 'Власничко заглавље Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Корисничко име'; +$lang['showuseras_o_username'] = 'Име и презиме корисника'; +$lang['showuseras_o_username_link'] = 'Пуно име корисника као корисничка веза међувикија'; +$lang['showuseras_o_email'] = 'Е-адреса (замућено по подешавањима mailguard-а)'; +$lang['showuseras_o_email_link'] = 'Корисничка Е-адреса као mailto: веза'; +$lang['useheading_o_0'] = 'Никада'; +$lang['useheading_o_navigation'] = 'Сами навигација'; +$lang['useheading_o_content'] = 'Само за садржај викија'; +$lang['useheading_o_1'] = 'Увек'; +$lang['readdircache'] = 'Максимално време трајања за readdir cache (у секундама)'; diff --git a/lib/plugins/config/lang/sv/intro.txt b/lib/plugins/config/lang/sv/intro.txt new file mode 100644 index 0000000..fd77634 --- /dev/null +++ b/lib/plugins/config/lang/sv/intro.txt @@ -0,0 +1,7 @@ +====== Hantera inställningar ====== + +Använd den här sidan för att göra inställningar i din Dokuwiki. För hjälp angående specifika inställningar, se [[doku>config]]. För mer detaljer om den här insticksmodulen, se [[doku>plugin:config]]. + +Inställningar med en rosa bakgrund är skyddade och kan inte ändras med den här insticksmodulen. Inställningar med en blå bakgrund är standardvärden, och inställningar som visas med en vit bakgrund har ändrats i den här installationen. Både blåa och vita inställningar kan ändras. + +Kom i håg att trycka på knappen **Spara** innan du lämnar den här sidan, annars kommer ändringarna att gå förlorade. diff --git a/lib/plugins/config/lang/sv/lang.php b/lib/plugins/config/lang/sv/lang.php new file mode 100644 index 0000000..2452b85 --- /dev/null +++ b/lib/plugins/config/lang/sv/lang.php @@ -0,0 +1,205 @@ + + * @author Patrik K Lundberg + * @author Tor Härnqvist + * @author Per Foreby + * @author Nicklas Henriksson + * @author Håkan Sandell + * @author Dennis Karlsson + * @author Tormod Otter Johansson + * @author Pontus Bergendahl + * @author Emil Lind + * @author Bogge Bogge + * @author Peter Åström + */ +$lang['menu'] = 'Hantera inställningar'; +$lang['error'] = 'Inställningarna uppdaterades inte på grund av ett felaktigt värde. Titta igenom dina ändringar och försök sedan spara igen. +
    Felaktiga värden är omgivna av en röd ram.'; +$lang['updated'] = 'Inställningarna uppdaterade.'; +$lang['nochoice'] = '(inga andra val tillgängliga)'; +$lang['locked'] = 'Filen med inställningar kan inte uppdateras. Om det inte är meningen att det ska vara så,
    + kontrollera att filen med lokala inställningar har rätt namn och filskydd.'; +$lang['danger'] = 'Risk: Denna förändring kan göra wikin och inställningarna otillgängliga.'; +$lang['warning'] = 'Varning: Denna förändring kan orsaka icke åsyftade resultat.'; +$lang['security'] = 'Säkerhetsvarning: Denna förändring kan innebära en säkerhetsrisk.'; +$lang['_configuration_manager'] = 'Hantera inställningar'; +$lang['_header_dokuwiki'] = 'Inställningar för DokuWiki'; +$lang['_header_plugin'] = 'Inställningar för insticksmoduler'; +$lang['_header_template'] = 'Inställningar för mallar'; +$lang['_header_undefined'] = 'Odefinierade inställningar'; +$lang['_basic'] = 'Grundläggande inställningar'; +$lang['_display'] = 'Inställningar för presentation'; +$lang['_authentication'] = 'Inställningar för autentisering'; +$lang['_anti_spam'] = 'Inställningar för anti-spam'; +$lang['_editing'] = 'Inställningar för redigering'; +$lang['_links'] = 'Inställningar för länkar'; +$lang['_media'] = 'Inställningar för medier'; +$lang['_notifications'] = 'Noterings inställningar'; +$lang['_syndication'] = 'Syndikats inställningar'; +$lang['_advanced'] = 'Avancerade inställningar'; +$lang['_network'] = 'Nätverksinställningar'; +$lang['_msg_setting_undefined'] = 'Ingen inställningsmetadata.'; +$lang['_msg_setting_no_class'] = 'Ingen inställningsklass.'; +$lang['_msg_setting_no_default'] = 'Inget standardvärde.'; +$lang['title'] = 'Wikins namn'; +$lang['start'] = 'Startsidans namn'; +$lang['lang'] = 'Språk'; +$lang['template'] = 'Mall'; +$lang['sidebar'] = 'Sidofältets sidonamn (om mall stödjer det), tomt fällt deaktiverar sidofältet'; +$lang['license'] = 'Under vilken licens skall ditt innehåll publiceras?'; +$lang['savedir'] = 'Katalog för att spara data'; +$lang['basedir'] = 'Grundkatalog'; +$lang['baseurl'] = 'Grund-webbadress'; +$lang['cookiedir'] = 'Cookie sökväg. Lämna blankt för att använda basurl.'; +$lang['dmode'] = 'Filskydd för nya kataloger'; +$lang['fmode'] = 'Filskydd för nya filer'; +$lang['allowdebug'] = 'Tillåt felsökning stäng av om det inte behövs!'; +$lang['recent'] = 'Antal poster under "Nyligen ändrat"'; +$lang['recent_days'] = 'Hur många ändringar som ska sparas (dagar)'; +$lang['breadcrumbs'] = 'Antal spår'; +$lang['youarehere'] = 'Hierarkiska spår'; +$lang['fullpath'] = 'Visa fullständig sökväg i sidfoten'; +$lang['typography'] = 'Aktivera typografiska ersättningar'; +$lang['dformat'] = 'Datumformat (se PHP:s strftime-funktion)'; +$lang['signature'] = 'Signatur'; +$lang['showuseras'] = 'Vad som skall visas när man visar den användare som senast redigerade en sida'; +$lang['toptoclevel'] = 'Toppnivå för innehållsförteckning'; +$lang['tocminheads'] = 'Minimalt antal rubriker för att avgöra om innehållsförteckning byggs'; +$lang['maxtoclevel'] = 'Maximal nivå för innehållsförteckning'; +$lang['maxseclevel'] = 'Maximal nivå för redigering av rubriker'; +$lang['camelcase'] = 'Använd CamelCase för länkar'; +$lang['deaccent'] = 'Rena sidnamn'; +$lang['useheading'] = 'Använda första rubriken som sidnamn'; +$lang['sneaky_index'] = 'Som standard visar DokuWiki alla namnrymder på indexsidan. Genom att aktivera det här valet döljer man namnrymder som användaren inte har behörighet att läsa. Det kan leda till att man döljer åtkomliga undernamnrymder, och gör indexet oanvändbart med vissa ACL-inställningar.'; +$lang['hidepages'] = 'Dölj matchande sidor (reguljära uttryck)'; +$lang['useacl'] = 'Använd behörighetslista (ACL)'; +$lang['autopasswd'] = 'Autogenerera lösenord'; +$lang['authtype'] = 'System för autentisering'; +$lang['passcrypt'] = 'Metod för kryptering av lösenord'; +$lang['defaultgroup'] = 'Förvald grupp'; +$lang['superuser'] = 'Huvudadministratör - en grupp eller en användare med full tillgång till alla sidor och funktioner, oavsett behörighetsinställningars'; +$lang['manager'] = 'Administratör -- en grupp eller användare med tillgång till vissa administrativa funktioner.'; +$lang['profileconfirm'] = 'Bekräfta ändringarna i profilen med lösenordet'; +$lang['rememberme'] = 'Tillåt permanenta inloggningscookies (kom ihåg mig)'; +$lang['disableactions'] = 'Stäng av funktioner i DokuWiki'; +$lang['disableactions_check'] = 'Kontroll'; +$lang['disableactions_subscription'] = 'Prenumerera/Säg upp prenumeration'; +$lang['disableactions_wikicode'] = 'Visa källkod/Exportera råtext'; +$lang['disableactions_profile_delete'] = 'Ta bort eget konto'; +$lang['disableactions_other'] = 'Andra funktioner (kommaseparerade)'; +$lang['disableactions_rss'] = 'XML Syndikation (RSS)'; +$lang['auth_security_timeout'] = 'Autentisieringssäkerhets timeout (sekunder)'; +$lang['securecookie'] = 'Skall cookies som sätts via HTTPS endast skickas via HTTPS från webbläsaren? Avaktivera detta alternativ endast om inloggningen till din wiki är säkrad med SSL men läsning av wikin är osäkrad.'; +$lang['usewordblock'] = 'Blockera spam baserat på ordlista'; +$lang['relnofollow'] = 'Använd rel="nofollow" för externa länkar'; +$lang['indexdelay'] = 'Tidsfördröjning före indexering (sek)'; +$lang['mailguard'] = 'Koda e-postadresser'; +$lang['iexssprotect'] = 'Kontrollera om uppladdade filer innehåller eventuellt skadlig JavaScript eller HTML-kod'; +$lang['usedraft'] = 'Spara utkast automatiskt under redigering'; +$lang['locktime'] = 'Maximal livslängd för fillåsning (sek)'; +$lang['cachetime'] = 'Maximal livslängd för cache (sek)'; +$lang['target____wiki'] = 'Målfönster för interna länkar'; +$lang['target____interwiki'] = 'Målfönster för interwiki-länkar'; +$lang['target____extern'] = 'Målfönster för externa länkar'; +$lang['target____media'] = 'Målfönster för medialänkar'; +$lang['target____windows'] = 'Målfönster för windowslänkar'; +$lang['mediarevisions'] = 'Aktivera versionshantering för media?'; +$lang['refcheck'] = 'Kontrollera referenser till mediafiler'; +$lang['gdlib'] = 'Version av GD-biblioteket'; +$lang['im_convert'] = 'Sökväg till ImageMagicks konverteringsverktyg'; +$lang['jpg_quality'] = 'Kvalitet för JPG-komprimering (0-100)'; +$lang['fetchsize'] = 'Maximal storlek (bytes) som fetch.php får ladda ned externt'; +$lang['subscribers'] = 'Aktivera stöd för prenumeration på ändringar'; +$lang['notify'] = 'Skicka meddelande om ändrade sidor till den här e-postadressen'; +$lang['registernotify'] = 'Skicka meddelande om nyregistrerade användare till en här e-postadressen'; +$lang['mailfrom'] = 'Avsändaradress i automatiska e-postmeddelanden'; +$lang['mailreturnpath'] = 'Mottagarens mejladress för inga leveransnotifikationer'; +$lang['mailprefix'] = 'Prefix i början på ämnesraden vid automatiska e-postmeddelanden'; +$lang['dontlog'] = 'Avaktivera loggning för dessa typer av loggar'; +$lang['sitemap'] = 'Skapa Google sitemap (dagar)'; +$lang['rss_type'] = 'Typ av XML-flöde'; +$lang['rss_linkto'] = 'XML-flöde pekar på'; +$lang['rss_content'] = 'Vad ska visas för saker i XML-flödet?'; +$lang['rss_update'] = 'Uppdateringsintervall för XML-flöde (sek)'; +$lang['rss_show_summary'] = 'XML-flöde visar sammanfattning i rubriken'; +$lang['rss_show_deleted'] = 'XML flöde Visa raderade flöden'; +$lang['rss_media'] = 'Vilka ändringar ska listas i XML flödet?'; +$lang['rss_media_o_both'] = 'båda'; +$lang['rss_media_o_pages'] = 'sidor'; +$lang['rss_media_o_media'] = 'media'; +$lang['updatecheck'] = 'Kontrollera uppdateringar och säkerhetsvarningar? DokuWiki behöver kontakta update.dokuwiki.org för den här funktionen.'; +$lang['userewrite'] = 'Använd rena webbadresser'; +$lang['useslash'] = 'Använd snedstreck för att separera namnrymder i webbadresser'; +$lang['sepchar'] = 'Ersätt blanktecken i webbadresser med'; +$lang['canonical'] = 'Använd fullständiga webbadresser'; +$lang['fnencode'] = 'Metod för kodning av icke-ASCII filnamn.'; +$lang['autoplural'] = 'Leta efter pluralformer av länkar'; +$lang['compression'] = 'Metod för komprimering av gamla versioner'; +$lang['gzip_output'] = 'Använd gzip Content-Encoding för xhtml'; +$lang['compress'] = 'Komprimera CSS och javascript'; +$lang['send404'] = 'Skicka "HTTP 404/Page Not Found" för sidor som inte finns'; +$lang['broken_iua'] = 'Är funktionen ignore_user_abort trasig på ditt system? Det kan i så fall leda till att indexering av sökningar inte fungerar. Detta är ett känt problem med IIS+PHP/CGI. Se Bug 852 för mer info.'; +$lang['xsendfile'] = 'Använd X-Sendfile huvudet för att låta webservern leverera statiska filer? Din webserver behöver stöd för detta.'; +$lang['renderer_xhtml'] = 'Generera för användning i huvudwikipresentation (xhtml)'; +$lang['renderer__core'] = '%s (dokuwiki core)'; +$lang['renderer__plugin'] = '%s (plugin)'; +$lang['search_fragment_o_exact'] = 'exakt'; +$lang['search_fragment_o_starts_with'] = 'börjar med'; +$lang['search_fragment_o_ends_with'] = 'slutar med'; +$lang['search_fragment_o_contains'] = 'innehåller'; +$lang['jquerycdn_o_0'] = 'Ingen CDN, enbart lokal leverans'; +$lang['jquerycdn_o_jquery'] = 'CDN på code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN på cdnjs.com'; +$lang['proxy____host'] = 'Proxyserver'; +$lang['proxy____port'] = 'Proxyport'; +$lang['proxy____user'] = 'Användarnamn för proxy'; +$lang['proxy____pass'] = 'Lösenord för proxy'; +$lang['proxy____ssl'] = 'Använd ssl för anslutning till proxy'; +$lang['proxy____except'] = 'Regular expression för matchning av URL som proxy ska hoppa över.'; +$lang['license_o_'] = 'Ingen vald'; +$lang['typography_o_0'] = 'Inga'; +$lang['typography_o_1'] = 'enbart dubbla citattecken'; +$lang['typography_o_2'] = 'både dubbla och enkla citattecken (fungerar inte alltid)'; +$lang['userewrite_o_0'] = 'av'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki internt'; +$lang['deaccent_o_0'] = 'av'; +$lang['deaccent_o_1'] = 'ta bort accenter'; +$lang['deaccent_o_2'] = 'romanisera'; +$lang['gdlib_o_0'] = 'GD-bibliotek inte tillgängligt'; +$lang['gdlib_o_1'] = 'Version 1.x'; +$lang['gdlib_o_2'] = 'Automatisk detektering'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstrakt'; +$lang['rss_content_o_diff'] = 'Unified Diff'; +$lang['rss_content_o_htmldiff'] = 'HTML formaterad diff tabell'; +$lang['rss_content_o_html'] = 'Sidans innehåll i full HTML'; +$lang['rss_linkto_o_diff'] = 'lista på skillnader'; +$lang['rss_linkto_o_page'] = 'den reviderade sidan'; +$lang['rss_linkto_o_rev'] = 'lista över ändringar'; +$lang['rss_linkto_o_current'] = 'den aktuella sidan'; +$lang['compression_o_0'] = 'ingen'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'använd ej'; +$lang['xsendfile_o_1'] = 'Proprietär lighttpd-header (före version 1.5)'; +$lang['xsendfile_o_2'] = 'Standard X-Sendfile-huvud'; +$lang['xsendfile_o_3'] = 'Proprietär Nginx X-Accel-Redirect header'; +$lang['showuseras_o_loginname'] = 'Användarnamn'; +$lang['showuseras_o_username'] = 'Namn'; +$lang['showuseras_o_username_link'] = 'Användarens fullständiga namn som interwiki-användarlänk'; +$lang['showuseras_o_email'] = 'Användarens e-postadress (obfuskerad enligt inställningarna i mailguard)'; +$lang['showuseras_o_email_link'] = 'Användarens e-postadress som mailto: länk'; +$lang['useheading_o_0'] = 'Aldrig'; +$lang['useheading_o_navigation'] = 'Endst navigering'; +$lang['useheading_o_content'] = 'Endast innehåll i wiki'; +$lang['useheading_o_1'] = 'Alltid'; +$lang['readdircache'] = 'Max ålder för readdir cache (sek)'; diff --git a/lib/plugins/config/lang/th/lang.php b/lib/plugins/config/lang/th/lang.php new file mode 100644 index 0000000..9026ec3 --- /dev/null +++ b/lib/plugins/config/lang/th/lang.php @@ -0,0 +1,102 @@ + + * @author Kittithat Arnontavilas + * @author Arthit Suriyawongkul + * @author Thanasak Sompaisansin + */ +$lang['menu'] = 'ตั้งค่าการปรับแต่ง'; +$lang['updated'] = 'การปรับแต่งค่าถูกบันทึกเรียบร้อย'; +$lang['_configuration_manager'] = 'จัดการการปรับตั้งค่า'; +$lang['_header_dokuwiki'] = 'การตั้งค่า DokuWiki'; +$lang['_header_plugin'] = 'การตั้งค่า Plugin'; +$lang['_header_template'] = 'การตั้งค่าเทมเพลต'; +$lang['_basic'] = 'การตั้งค่าพื้นฐาน'; +$lang['_display'] = 'การตั้งค่าการแสดงผล'; +$lang['_authentication'] = 'การตั้งค่าสิทธิ์การเข้าถึง'; +$lang['_anti_spam'] = 'การตั้งค่าป้องกันสแปม'; +$lang['_editing'] = 'การตั้งค่าการแก้ไขปรับปรุง'; +$lang['_links'] = 'การตั้งค่าลิงก์'; +$lang['_media'] = 'การตั้งค่าภาพ-เสียง'; +$lang['_advanced'] = 'การตั้งค่าขั้นสูง'; +$lang['_network'] = 'การตั้งค่าเครือข่าย'; +$lang['start'] = 'ชื่อหน้าเริ่มต้น'; +$lang['lang'] = 'ภาษา'; +$lang['savedir'] = 'ไดเรคทอรีที่บันทึกข้อมูล'; +$lang['basedir'] = 'ไดเรคทอรีพื้นฐาน'; +$lang['baseurl'] = 'URL พื้นฐาน'; +$lang['recent'] = 'การเปลี่ยนแปลงล่าสุด'; +$lang['recent_days'] = 'จำนวนวันที่เก็บรายการที่ถูกแก้ไขล่าสุด'; +$lang['signature'] = 'ลายเซนต์'; +$lang['hidepages'] = 'ซ่อนหน้าที่เข้ากันได้ (regular expressions)'; +$lang['autopasswd'] = 'สร้างรหัสผ่านให้อัตโนมัติ'; +$lang['passcrypt'] = 'กระบวนการเข้ารหัส สำหรับเก็บบันทึกรหัสผ่าน'; +$lang['defaultgroup'] = 'กลุ่มมาตรฐาน'; +$lang['profileconfirm'] = 'ใส่รหัสผ่านเพื่อยืนยันการเปลี่ยนแปลงข้อมูล'; +$lang['rememberme'] = 'อนุญาตให้จดจำการ login แบบถาวร'; +$lang['disableactions_check'] = 'ตรวจสอบ'; +$lang['auth_security_timeout'] = 'ระยะเวลาที่จะตัดการเชื่อมต่อแบบการใช้งานด้วยสิทธิ์ผู้ใช้ (วินาที)'; +$lang['usewordblock'] = 'คำที่จะถือว่าเป็นสแปม'; +$lang['relnofollow'] = 'ใช้ rel="nofollow" สำหรับลิงก์ภายนอก'; +$lang['locktime'] = 'ระยะเวลานานสุด ที่จะล็อคไม่ให้แก้ไขไฟล์ (วินาที)'; +$lang['cachetime'] = 'ระยะเวลาสำหรับการเก็บแคช (วินาที)'; +$lang['target____wiki'] = 'เปิดแสดงลิงก์ภายใน ในหน้าเว็บแบบใด'; +$lang['target____interwiki'] = 'เปิดแสดงลิงก์ interwiki ในหน้าเว็บแบบใด'; +$lang['target____extern'] = 'เปิดแสดงลิงก์ภายนอก ในหน้าเว็บแบบใด'; +$lang['target____media'] = 'เปิดแสดงลิงก์ของมีเดีย ในหน้าเว็บแบบใด'; +$lang['target____windows'] = 'เปิดแสดงลิงก์ของวินโดวส์ ในหน้าเว็บแบบใด'; +$lang['gdlib'] = 'เลขรุ่นของ GD Library'; +$lang['fetchsize'] = 'ขนาดไฟล์ใหญ่สุด (bytes) fetch.php ที่จะดาวน์โหลดจากภายนอก'; +$lang['notify'] = 'ส่งการแจ้งเตือนไปยังที่อยู่อีเมลนี้'; +$lang['sitemap'] = 'สร้าง กูเกิ้ล ไซต์แมพ (จำนวนวัน)'; +$lang['rss_type'] = 'ชนิดของ XML feed'; +$lang['rss_linkto'] = 'ลิงก์เชื่อมโยงไปยัง XML feed'; +$lang['rss_content'] = 'ต้องการให้มีอะไรแสดงอยู่ใน XML feed บ้าง?'; +$lang['rss_update'] = 'ความถี่ในการอัพเดท XML feed (เป็นวินาที)'; +$lang['rss_show_summary'] = 'ไตเติ้ลของบทสรุปย่อของ XML feed'; +$lang['userewrite'] = 'แสดงที่อยู่เว็บ (URL) แบบอ่านเข้าใจง่าย'; +$lang['gzip_output'] = 'ใช้ gzip Content-Encoding สำหรับ xhtml'; +$lang['compress'] = 'บีบย่อ CSS และ javascript (เพื่อให้แสดงหน้าเว็บเร็วขึ้น)'; +$lang['send404'] = 'ให้แสดง "HTTP 404/Page Not Found" เมื่อไม่พบข้อมูลหน้านั้น'; +$lang['renderer__core'] = '%s (แกนหลักของ dokuwiki)'; +$lang['renderer__plugin'] = '%s (โปรแกรมเสริม - plugin)'; +$lang['proxy____host'] = 'ชื่อ server ของ proxy'; +$lang['proxy____port'] = 'port ของ proxy'; +$lang['proxy____user'] = 'user name ของ proxy'; +$lang['proxy____pass'] = 'รหัสผ่านของ proxy'; +$lang['proxy____ssl'] = 'ใช้ ssl ในการเชื่อมต่อกับ proxy'; +$lang['license_o_'] = 'ไม่ถูกเลือก'; +$lang['typography_o_0'] = 'ไม่มี'; +$lang['typography_o_1'] = 'ไม่รวมเครื่องหมายอัญประกาศเดี่ยว'; +$lang['typography_o_2'] = 'รวมเครื่องหมายอัญประกาศเดี่ยว (อาจใช้ไม่ได้ในบางครั้ง)'; +$lang['userewrite_o_0'] = 'ไม่มี'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['deaccent_o_0'] = 'ปิด'; +$lang['gdlib_o_1'] = 'Version 1.x'; +$lang['gdlib_o_2'] = 'ตรวจสอบอัตโนมัติ'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'บทคัดย่อ'; +$lang['rss_content_o_html'] = 'หน้าเนื้อหาแบบแสดง HTML เต็มรูปแบบ'; +$lang['rss_linkto_o_diff'] = 'มุมมองที่แตกต่าง'; +$lang['rss_linkto_o_rev'] = 'รายการของการปรับแก้ไข'; +$lang['rss_linkto_o_current'] = 'หน้าปัจจุบัน'; +$lang['compression_o_0'] = 'ไม่มีการบีบอัด'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'ไม่ใช้'; +$lang['xsendfile_o_2'] = 'หัวเอกสารแบบ Standard X-Sendfile'; +$lang['xsendfile_o_3'] = 'หัวเอกสารแบบ Proprietary Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'ชื่อผู้ใช้'; +$lang['showuseras_o_username'] = 'ชื่อ-นามสกุล'; +$lang['showuseras_o_email_link'] = 'อีเมลของผู้ใช้ ที่จะปรากฏ ณ mailto: link'; +$lang['useheading_o_0'] = 'ไม่เลย'; +$lang['useheading_o_navigation'] = 'เฉพาะตัวนำทาง'; +$lang['useheading_o_content'] = 'เฉพาะเนื้อหาวิกิ'; +$lang['useheading_o_1'] = 'เสมอ'; diff --git a/lib/plugins/config/lang/tr/intro.txt b/lib/plugins/config/lang/tr/intro.txt new file mode 100644 index 0000000..2602fb3 --- /dev/null +++ b/lib/plugins/config/lang/tr/intro.txt @@ -0,0 +1,7 @@ +====== Site Ayarları Yönetimi ====== + +Bu sayfayı DokuWiki kurulumunun ayarlarını değiştirmek için kullanabilirsiniz. Ayarların ayrıntıları için [[doku>config]] sayfasını kullanınız. Bu eklenti ile ilgili daha ayrıntılı bilgi için [[doku>plugin:config]] sayfasına bakınız. + +Açık kırmızı renkle gösterilenler bu eklenti ile değiştirilemez. Mavi ile gösterilenler varsayılan değerlerdir. Beyaz altyazı ile gösterilenler is bu kuruluma özel değiştirilmiş ayarlardır. Mavi ve beyaz ayarlar değiştirilebilir. + +Değişiklik yapmanız durumunda **Kaydet** tuşuna basmayı unutmayınız. Aksi takdirde sayfayı kapattığınızda tüm ayarlar silinecektir. diff --git a/lib/plugins/config/lang/tr/lang.php b/lib/plugins/config/lang/tr/lang.php new file mode 100644 index 0000000..1239d5c --- /dev/null +++ b/lib/plugins/config/lang/tr/lang.php @@ -0,0 +1,132 @@ + + * @author Hakan + * @author mahir + * @author Aydın Coşkuner + * @author Cihan Kahveci + * @author Yavuz Selim + * @author Caleb Maclennan + * @author farukerdemoncel + * @author Mete Cuma + */ +$lang['menu'] = 'Site Ayarları'; +$lang['error'] = 'Ayarlar yanlış bir değer girildiği için güncellenemedi. Lütfen değişikliklerinizi gözden geçirin ve tekrar gönderin. +
    Yanlış değer(ler) kırmızı çerçeve içinde gösterilecektir.'; +$lang['updated'] = 'Ayarlar başarıyla güncellendi.'; +$lang['nochoice'] = '(başka seçim bulunmamaktadır)'; +$lang['locked'] = 'Ayar dosyası güncellenemedi.
    +dosya adı ve yetkilerininin doğru olduğuna emin olun.'; +$lang['danger'] = 'Tehlike: Bu özelliği değiştirirseniz, wiki\'nize ve konfigürasyon menunüze ulaşamayabilirsiniz.'; +$lang['warning'] = 'Uyarı: Bu özelliği değiştirmek istenmeyen davranışa sebep olabilir.'; +$lang['security'] = 'Güvenlik Uyarısı: Bu özelliği değiştirmek güvenlik riski çıkartabilir.'; +$lang['_configuration_manager'] = 'Site Ayarları Yönetimi'; +$lang['_header_dokuwiki'] = 'DokuWiki Ayarları'; +$lang['_header_plugin'] = 'Eklenti Ayarları'; +$lang['_header_template'] = 'Şablon (Template) Ayarları'; +$lang['_header_undefined'] = 'Tanımsız Ayarlar'; +$lang['_basic'] = 'Ana Ayarlar'; +$lang['_display'] = 'Gösterim Ayarları'; +$lang['_authentication'] = 'Onaylama Ayarları'; +$lang['_anti_spam'] = 'Spam Engelleme Ayarları'; +$lang['_editing'] = 'Sayfa Yazımı Ayarları'; +$lang['_links'] = 'Bağlantı Ayarları'; +$lang['_media'] = 'Medya Ayarları'; +$lang['_advanced'] = 'Gelişmiş Ayarlar'; +$lang['_network'] = 'Ağ Ayarları'; +$lang['_msg_setting_undefined'] = 'Ayar üstverisi yok.'; +$lang['_msg_setting_no_class'] = 'Ayar sınıfı yok.'; +$lang['_msg_setting_no_default'] = 'Varsayılan değer yok.'; +$lang['title'] = 'Wiki başlığı'; +$lang['start'] = 'Ana sayfa adı'; +$lang['lang'] = 'Dil'; +$lang['template'] = 'Şablon (Template)'; +$lang['license'] = 'İçeriğinizi hangi lisans altında yayınlansın?'; +$lang['savedir'] = 'Verileri kaydetmek için kullanılacak klasör'; +$lang['basedir'] = 'Kök dizin'; +$lang['baseurl'] = 'Kök URL'; +$lang['dmode'] = 'Klasör oluşturma yetkisi'; +$lang['fmode'] = 'Dosya oluşturma yetkisi'; +$lang['allowdebug'] = 'Yanlış ayıklamasına izin ver lazım değilse etkisiz kıl!'; +$lang['recent'] = 'En son değiştirilenler'; +$lang['breadcrumbs'] = 'Ekmek kırıntıların sayısı'; +$lang['youarehere'] = 'hiyerarşik ekmek kırıntıları'; +$lang['fullpath'] = 'sayfaların tüm patikasını (full path) göster'; +$lang['typography'] = 'Tipografik değiştirmeleri yap'; +$lang['dformat'] = 'Tarih biçimi (PHP\'nin strftime fonksiyonuna bakın)'; +$lang['signature'] = 'İmza'; +$lang['showuseras'] = 'Bir sayfayı en son düzenleyen kullanıcıya ne gösterilsin'; +$lang['toptoclevel'] = 'İçindekiler için en üst seviye'; +$lang['tocminheads'] = 'İçindekilerin oluşturulması için gereken (en az) başlık sayısı'; +$lang['maxtoclevel'] = 'İçindekiler için en fazla seviye'; +$lang['maxseclevel'] = 'Bölümün azami düzenleme düzeyi'; +$lang['camelcase'] = 'Linkler için CamelCase kullan'; +$lang['deaccent'] = 'Sayfa adlarınız temizle'; +$lang['useheading'] = 'Sayfa isimleri için ilk başlığı kullan'; +$lang['useacl'] = 'Erişim kontrol listesini kullan'; +$lang['autopasswd'] = 'Parolaları otamatikmen üret'; +$lang['authtype'] = 'Kimlik denetleme arka uç'; +$lang['passcrypt'] = 'Parola şifreleme metodu'; +$lang['defaultgroup'] = 'Varsayılan grup'; +$lang['disableactions'] = 'DokuWiki eylemlerini etkisiz kıl'; +$lang['disableactions_check'] = 'Kontrol et'; +$lang['disableactions_subscription'] = 'Abone ol/Abonelikten vazgeç'; +$lang['usewordblock'] = 'Wordlistesine göre spam engelle'; +$lang['relnofollow'] = 'Dışsal linkler rel="nofollow" kullan'; +$lang['indexdelay'] = 'Indekslemeden evvel zaman gecikmesi (saniye)'; +$lang['mailguard'] = 'Email adreslerini karart'; +$lang['iexssprotect'] = 'Yüklenmiş dosyaları muhtemel kötu niyetli JavaScript veya HTML koduna kontrol et'; +$lang['refcheck'] = 'Araç kaynak denetimi'; +$lang['gdlib'] = 'GD Lib sürümü'; +$lang['jpg_quality'] = 'JPG sıkıştırma kalitesi [0-100]'; +$lang['mailfrom'] = 'Otomatik e-postalar için kullanılacak e-posta adresi'; +$lang['sitemap'] = 'Google site haritası oluştur (gün)'; +$lang['rss_content'] = 'XML beslemesinde ne gösterilsin?'; +$lang['rss_update'] = 'XML beslemesini güncelleme aralığı'; +$lang['rss_show_summary'] = 'XML beslemesinde özeti başlıkta göster'; +$lang['canonical'] = 'Tamolarak kurallara uygun URL\'leri kullan'; +$lang['renderer__core'] = '%s (dokuwiki çekirdeği)'; +$lang['renderer__plugin'] = '%s (eklenti)'; +$lang['proxy____host'] = 'Proxy sunucu adı'; +$lang['proxy____user'] = 'Proxy kullanıcı adı'; +$lang['proxy____pass'] = 'Proxy şifresi'; +$lang['proxy____ssl'] = 'Proxy ile bağlanırken ssl kullan'; +$lang['license_o_'] = 'Seçilmedi'; +$lang['typography_o_0'] = 'Yok'; +$lang['userewrite_o_0'] = 'hiçbiri'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki dahili'; +$lang['deaccent_o_0'] = 'Kapalı'; +$lang['deaccent_o_1'] = 'aksan işaretlerini kaldır'; +$lang['deaccent_o_2'] = 'roman harfleri kullan'; +$lang['gdlib_o_0'] = 'GD Lib mevcut değil'; +$lang['gdlib_o_1'] = 'Versiyon 1.x'; +$lang['gdlib_o_2'] = 'Otomatik tesbit'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Soyut'; +$lang['rss_content_o_diff'] = 'Birleştirilmiş Diff'; +$lang['rss_content_o_htmldiff'] = 'HTML biçimlendirilmiş diff tablosu'; +$lang['rss_content_o_html'] = 'Tüm HTML sayfa içeriği'; +$lang['rss_linkto_o_diff'] = 'görünümü değiştir'; +$lang['rss_linkto_o_page'] = 'gözden geçirilmiş sayfa'; +$lang['rss_linkto_o_rev'] = 'sürümlerin listesi'; +$lang['rss_linkto_o_current'] = 'Șu anki sayfa'; +$lang['compression_o_0'] = 'hiçbiri'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'kullanma'; +$lang['showuseras_o_loginname'] = 'Kullanıcı adı'; +$lang['showuseras_o_username'] = 'Kullanıcının tam adı'; +$lang['showuseras_o_email'] = 'Kullanıcının mail adresi (mailguard ayarlarına göre karartılıyor)'; +$lang['showuseras_o_email_link'] = 'Kullanıcının mail adresi mailto: linki şeklinde'; +$lang['useheading_o_0'] = 'Hiçbir zaman'; +$lang['useheading_o_navigation'] = 'Sadece Navigasyon'; +$lang['useheading_o_content'] = 'Sadece Wiki içeriği'; +$lang['useheading_o_1'] = 'Her zaman'; diff --git a/lib/plugins/config/lang/uk/intro.txt b/lib/plugins/config/lang/uk/intro.txt new file mode 100644 index 0000000..87abe1b --- /dev/null +++ b/lib/plugins/config/lang/uk/intro.txt @@ -0,0 +1,7 @@ +====== Налаштування Вікі ====== + +Використовуйте цю сторінку для налаштування ДокуВікі. Для довідок щодо конкретних параметрів дивіться [[doku>config]]. Для більш детальної інформації про цей доданок дивіться [[doku>plugin:config]]. + +Параметри, що виділені червоним кольором тла захищені та не можуть бути змінені за допомогою цього доданка. Параметри, з синім кольором тла мають значення по замовчуванню, а параметри з білим тлом були встановлені для цієї локальної інсталяції. Сині та білі параметри можуть бути змінені. + +Не забувайте натискати кнопку **ЗБЕРЕГТИ** до того, як покинути цю сторінку, інакше всі зміни буде втрачено. diff --git a/lib/plugins/config/lang/uk/lang.php b/lib/plugins/config/lang/uk/lang.php new file mode 100644 index 0000000..10846d2 --- /dev/null +++ b/lib/plugins/config/lang/uk/lang.php @@ -0,0 +1,193 @@ + + * @author Mykhailo + * @author velmyshanovnyi + * @author Dmytro Marchenko + * @author Oleksii + * @author Vitaly + * @author Oleksiy Voronin + * @author serg_stetsuk + * @author Oleksandr Kunytsia + * @author Maksim + * @author Nina Zolotova + * @author Roman + */ +$lang['menu'] = 'Налаштування Вікі'; +$lang['error'] = 'Параметри не збережено через помилкові значення. Будь ласка, перегляньте ваші зміни та спробуйте ще раз +
    Помилкові значення будуть виділені червоною рамкою.'; +$lang['updated'] = 'Параметри успішно збережено.'; +$lang['nochoice'] = '(інших варіантів не існує)'; +$lang['locked'] = 'Неможливо записати файл налаштувань. Переконайтеся,
    +що ім\'я та права доступу для локального файлу вказано правильно.'; +$lang['danger'] = 'УВАГА! Зміна цього параметру може призвести до недоступності вашої Вікі та меню конфігурації.'; +$lang['warning'] = 'УВАГА! Зміна цього параметру може призвести до непередбачуваних наслідків.'; +$lang['security'] = 'УВАГА! Зміна цього параметру може призвести до послаблення безпеки вашої Вікі.'; +$lang['_configuration_manager'] = 'Управління конфігурацією'; +$lang['_header_dokuwiki'] = 'Налаштування ДокуВікі'; +$lang['_header_plugin'] = 'Налаштування Доданків'; +$lang['_header_template'] = 'Налаштування шаблонів'; +$lang['_header_undefined'] = 'Невизначені налаштування'; +$lang['_basic'] = 'Базові налаштування'; +$lang['_display'] = 'Налаштування відображення'; +$lang['_authentication'] = 'Налаштування автентифікації'; +$lang['_anti_spam'] = 'Налаштування Анти-спаму'; +$lang['_editing'] = 'Налаштування редагування'; +$lang['_links'] = 'Налаштування посилань'; +$lang['_media'] = 'Налаштування медіа'; +$lang['_notifications'] = 'Налаштування сповіщень'; +$lang['_advanced'] = 'Розширені налаштування'; +$lang['_network'] = 'Налаштування мережі'; +$lang['_msg_setting_undefined'] = 'Немає метаданих параметру.'; +$lang['_msg_setting_no_class'] = 'Немає класу параметру.'; +$lang['_msg_setting_no_default'] = 'Немає значення за замовчуванням.'; +$lang['title'] = 'Назва Вікі'; +$lang['start'] = 'Назва стартової сторінки'; +$lang['lang'] = 'Мова'; +$lang['template'] = 'Шаблон'; +$lang['license'] = 'Під якою ліцензією слід публікувати вміст?'; +$lang['savedir'] = 'Папка для збереження даних'; +$lang['basedir'] = 'Коренева папка'; +$lang['baseurl'] = 'Кореневий URL'; +$lang['dmode'] = 'Права для створених папок'; +$lang['fmode'] = 'Права для створених файлів'; +$lang['allowdebug'] = 'Дозволити відлагодження вимкніть, якщо не потрібно!'; +$lang['recent'] = 'Останні зміни'; +$lang['recent_days'] = 'Скільки останніх змін пам\'ятати (дні)'; +$lang['breadcrumbs'] = 'Ви відвідали (кількість сторінок, що показується)'; +$lang['youarehere'] = 'Показувати "Ви тут"'; +$lang['fullpath'] = 'Повний шлях до документу'; +$lang['typography'] = 'Замінювати типографські символи'; +$lang['dformat'] = 'Формат дати (дивіться функцію strftime PHP)'; +$lang['signature'] = 'Підпис'; +$lang['showuseras'] = 'Що вказувати при відображенні користувача, який востаннє редагував сторінку'; +$lang['toptoclevel'] = 'Мінімальний рівень для змісту'; +$lang['tocminheads'] = 'Мінімальна кількість заголовків, необхідна для створення таблиці змісту'; +$lang['maxtoclevel'] = 'Максимальний рівень для таблиці змісту'; +$lang['maxseclevel'] = 'Максимальний рівень секції для редагування'; +$lang['camelcase'] = 'Використовувати CamelCase'; +$lang['deaccent'] = 'Транслітерація в іменах сторінок'; +$lang['useheading'] = 'Першій заголовок замість імені'; +$lang['sneaky_index'] = 'За замовчуванням, ДокуВікі показує всі простори імен в змісті. Активація цієї опції сховає ті простори, де користувач не має прав на читання. Результатом може бути неможливість доступу до певних відкритих просторів імен. Це зробить неможливим використання змісту при певних конфігураціях.'; +$lang['hidepages'] = 'Ховати сторінки (regular expressions)'; +$lang['useacl'] = 'Використовувати ACL'; +$lang['autopasswd'] = 'Автоматичне створення паролів'; +$lang['authtype'] = 'Аутентифікація'; +$lang['passcrypt'] = 'Метод шифрування паролів'; +$lang['defaultgroup'] = 'Група за замовчуванням'; +$lang['superuser'] = 'Суперкористувач'; +$lang['manager'] = 'Менеджер - група, користувач чи розділений комами список user1,@group1,user2 з правами до певних функцій керування'; +$lang['profileconfirm'] = 'Підтверджувати зміни профілю паролем'; +$lang['rememberme'] = 'Дозволити постійні файли cookies для входу (Запам\'ятати мене)'; +$lang['disableactions'] = 'Заборонити дії ДокуВікі'; +$lang['disableactions_check'] = 'Перевірити'; +$lang['disableactions_subscription'] = 'Підписатись/Відписатись'; +$lang['disableactions_wikicode'] = 'Переглянути код/Експорт'; +$lang['disableactions_profile_delete'] = 'Видалити власний акаунт'; +$lang['disableactions_other'] = 'Інші дії (розділені комами)'; +$lang['auth_security_timeout'] = 'Таймаут аутентифікації (в секундах)'; +$lang['securecookie'] = 'Чи повинен браузер надсилати файли cookies тільки через HTTPS? Вимкніть цей параметр, лише тоді, якщо вхід до Вікі захищено SSL, але перегляд сторінок відбувається у незахищеному режимі.'; +$lang['usewordblock'] = 'Блокувати спам по списку слів'; +$lang['relnofollow'] = 'Використовувати rel="nofollow"'; +$lang['indexdelay'] = 'Затримка перед індексацією'; +$lang['mailguard'] = 'Кодувати адреси e-mail'; +$lang['iexssprotect'] = 'Перевірте оновлені файли на можливі заборонені Javascript чи HTML коди'; +$lang['usedraft'] = 'Автоматично зберігати чернетку при редагуванні'; +$lang['locktime'] = 'Час блокування (сек)'; +$lang['cachetime'] = 'Максимальний вік кешу (сек)'; +$lang['target____wiki'] = 'Target для внутрішніх посилань'; +$lang['target____interwiki'] = 'Target для інтерВікі-посилань'; +$lang['target____extern'] = 'Target для зовнішніх посилань'; +$lang['target____media'] = 'Target для медіа-посилань'; +$lang['target____windows'] = 'Target для посилань на мережеві папки'; +$lang['refcheck'] = 'Перевіряти посилання на медіа-файлі'; +$lang['gdlib'] = 'Версія GD Lib'; +$lang['im_convert'] = 'Шлях до ImageMagick'; +$lang['jpg_quality'] = 'Якість компресії JPG (0-100)'; +$lang['fetchsize'] = 'Максимальний розмір (в байтах), що fetch.php може завантажувати з зовні'; +$lang['subscribers'] = 'Підписка на зміни'; +$lang['subscribe_time'] = 'Час, після якого список підписки та дайджести будуть надіслані (сек.); Має бути меншим за час, вказаний у перемінній recent_days'; +$lang['notify'] = 'E-mail для сповіщень'; +$lang['registernotify'] = 'Надсилати інформацію про нових користувачів на цю адресу'; +$lang['mailfrom'] = 'E-mail для автоматичних повідомлень'; +$lang['mailprefix'] = 'Префікс теми повідомлення, що використовується в автоматичній розсилці електронних листів'; +$lang['sitemap'] = 'Створювати мапу сайту для Google (дні)'; +$lang['rss_type'] = 'тип RSS'; +$lang['rss_linkto'] = 'посилання в RSS'; +$lang['rss_content'] = 'Що відображати в пунктах XML-feed'; +$lang['rss_update'] = 'Інтервал оновлення RSS (сек)'; +$lang['rss_show_summary'] = 'Показувати підсумки змін в заголовку XML-feed'; +$lang['rss_media_o_both'] = 'обидва'; +$lang['rss_media_o_pages'] = 'сторінки'; +$lang['rss_media_o_media'] = 'медіа'; +$lang['updatecheck'] = 'Перевірити наявність оновлень чи попереджень безпеки? Для цього ДокуВікі необхідно зв\'язатися зі update.dokuwiki.org.'; +$lang['userewrite'] = 'Красиві URL'; +$lang['useslash'] = 'Слеш, як розділювач просторів імен в URL'; +$lang['sepchar'] = 'Розділювач слів у імені сторінки'; +$lang['canonical'] = 'Канонічні URL'; +$lang['fnencode'] = 'Метод для кодування імен файлів, що містять не ASCII символи.'; +$lang['autoplural'] = 'Перевіряти множину у посиланнях'; +$lang['compression'] = 'Метод стиснення attic файлів'; +$lang['gzip_output'] = 'Використовувати gzip, як Content-Encoding для xhtml'; +$lang['compress'] = 'Стискати файли CSS та javascript'; +$lang['send404'] = 'Надсилати "HTTP 404/Сторінка не знайдена " для неіснуючих сторінок'; +$lang['broken_iua'] = 'У вашій системі зіпсована функція ignore_user_abort? Це може зіпсувати пошукову систему. IIS+PHP/CGI не працює. Дивіться Bug 852 для отримання додаткової інформації'; +$lang['xsendfile'] = 'Використовувати заголовок X-Sendfile для доставки статичних файлів веб сервером? Ваш веб сервер повинен підтримувати цю функцію.'; +$lang['renderer_xhtml'] = 'Транслятор (Renderer) для основного виводу wiki (xhtml)'; +$lang['renderer__core'] = '%s (ядро докуВікі)'; +$lang['renderer__plugin'] = '%s (доданок)'; +$lang['search_fragment_o_exact'] = 'точно'; +$lang['search_fragment_o_starts_with'] = 'почати з'; +$lang['search_fragment_o_ends_with'] = 'закінчити з'; +$lang['search_fragment_o_contains'] = 'містить'; +$lang['proxy____host'] = 'Адреса Proxy'; +$lang['proxy____port'] = 'Порт Proxy'; +$lang['proxy____user'] = 'Користувач Proxy'; +$lang['proxy____pass'] = 'Пароль Proxy'; +$lang['proxy____ssl'] = 'Використовувати ssl для з\'єднання з Proxy'; +$lang['proxy____except'] = 'Регулярний вираз для веб-адреси, яку проксі-сервер пропустить.'; +$lang['license_o_'] = 'не вибрано'; +$lang['typography_o_0'] = 'жодного'; +$lang['typography_o_1'] = 'Лише подвійні лапки'; +$lang['typography_o_2'] = 'Всі лапки (може не завжди працювати)'; +$lang['userewrite_o_0'] = 'немає'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'Засобами ДокуВікі'; +$lang['deaccent_o_0'] = 'вимкнено'; +$lang['deaccent_o_1'] = 'вилучати діакритичні знаки'; +$lang['deaccent_o_2'] = 'транслітерація'; +$lang['gdlib_o_0'] = 'GD Lib не доступна'; +$lang['gdlib_o_1'] = 'Версія 1.x'; +$lang['gdlib_o_2'] = 'Автовизначення'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Короткий зміст'; +$lang['rss_content_o_diff'] = 'Уніфіковані зміни (diff)'; +$lang['rss_content_o_htmldiff'] = 'Таблиця змін у форматі HTML'; +$lang['rss_content_o_html'] = 'Повний зміст сторінки HTML'; +$lang['rss_linkto_o_diff'] = 'перегляд відмінностей'; +$lang['rss_linkto_o_page'] = 'текст сторінки'; +$lang['rss_linkto_o_rev'] = 'перелік ревізій'; +$lang['rss_linkto_o_current'] = 'поточна сторінка'; +$lang['compression_o_0'] = 'немає'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'не використовувати'; +$lang['xsendfile_o_1'] = 'Фірмовий заголовок lighthttpd (до версії 1.5)'; +$lang['xsendfile_o_2'] = 'Стандартний X-Sendfile заголовок'; +$lang['xsendfile_o_3'] = 'Фірмовий заголовок Nginx X-Accel-Redirect'; +$lang['showuseras_o_loginname'] = 'Логін'; +$lang['showuseras_o_username'] = 'Повне ім’я користувача'; +$lang['showuseras_o_email'] = 'E-mail користувача (прихована відповідно до налаштувань)'; +$lang['showuseras_o_email_link'] = 'E-mail користувача як посилання mailto:'; +$lang['useheading_o_0'] = 'Ніколи'; +$lang['useheading_o_navigation'] = 'Лише для навігації'; +$lang['useheading_o_content'] = 'Лише у змісті'; +$lang['useheading_o_1'] = 'Завжди'; +$lang['readdircache'] = 'Максимальний вік для файлів кешу (сек.)'; diff --git a/lib/plugins/config/lang/vi/intro.txt b/lib/plugins/config/lang/vi/intro.txt new file mode 100644 index 0000000..eee89ef --- /dev/null +++ b/lib/plugins/config/lang/vi/intro.txt @@ -0,0 +1,7 @@ +====== Quản lý cấu hình ====== + +Sử dụng trang này để kiểm soát cài đặt cho trình cài đặt DokuWiki của bạn. Để được trợ giúp về cài đặt cá nhân, hãy tham khảo [[doku>config]]. Để biết thêm chi tiết về plugin này, xem [[doku>plugin:config]]. + +Những cài đặt hiển thị với nền đỏ nhạt được bảo vệ và không thể thay đổi bằng plugin này. Những cài đặt hiển thị với nền màu xanh là các giá trị mặc định và cài đặt được hiển thị với nền trắng đã được đặt cục bộ cho cài đặt cụ thể này. Cả hai cài đặt màu xanh và trắng có thể được thay đổi. + +Hãy nhớ nhấn nút **Lưu** trước khi rời trang này nếu không các thay đổi của bạn sẽ bị mất. \ No newline at end of file diff --git a/lib/plugins/config/lang/vi/lang.php b/lib/plugins/config/lang/vi/lang.php new file mode 100644 index 0000000..6c7b255 --- /dev/null +++ b/lib/plugins/config/lang/vi/lang.php @@ -0,0 +1,213 @@ + + * @author Minh + * @author Thien Hau + */ +$lang['menu'] = 'Cài đặt cấu hình'; +$lang['error'] = 'Không thể cập nhật cài đặt do giá trị không hợp lệ, vui lòng xem lại các thay đổi của bạn và gửi lại. +
    (Các) giá trị không chính xác sẽ được hiển thị bao quanh viền đỏ.'; +$lang['updated'] = 'Đã cập nhật cài đặt thành công .'; +$lang['nochoice'] = '(không có lựa chọn nào khác)'; +$lang['locked'] = 'Không thể cập nhật tập tin cài đặt, nếu điều này là vô ý,
    + đảm bảo tên tập tin cài đặt cục bộ và quyền đều chính xác.'; +$lang['danger'] = 'Nguy hiểm: Thay đổi tùy chọn này có thể khiến wiki và menu cấu hình của bạn không thể truy cập được.'; +$lang['warning'] = 'Cảnh báo: Thay đổi tùy chọn này có thể gây ra hành vi ngoài ý muốn.'; +$lang['security'] = 'Cảnh báo bảo mật: Thay đổi tùy chọn này có thể gây ra rủi ro bảo mật.'; +$lang['_configuration_manager'] = 'Quản lý cấu hình'; +$lang['_header_dokuwiki'] = 'DokuWiki'; +$lang['_header_plugin'] = 'Plugin tiện ích'; +$lang['_header_template'] = 'Chủ đề'; +$lang['_header_undefined'] = 'Cài đặt không xác định'; +$lang['_basic'] = 'Cơ bản'; +$lang['_display'] = 'Hiển thị'; +$lang['_authentication'] = 'Xác thực'; +$lang['_anti_spam'] = 'Chống Spam'; +$lang['_editing'] = 'Sửa đổi'; +$lang['_links'] = 'Liên kết'; +$lang['_media'] = 'Phương tiện'; +$lang['_notifications'] = 'Thông báo'; +$lang['_syndication'] = 'Đồng bộ (RSS)'; +$lang['_advanced'] = 'Nâng cao'; +$lang['_network'] = 'Mạng'; +$lang['_msg_setting_undefined'] = 'Không có cài đặt siêu dữ liệu.'; +$lang['_msg_setting_no_class'] = 'Không có lớp thiết lập.'; +$lang['_msg_setting_no_known_class'] = 'Lớp thiết lập không có sẵn.'; +$lang['_msg_setting_no_default'] = 'Không có giá trị mặc định.'; +$lang['title'] = 'Tiêu đề Wiki (tên wiki của bạn)'; +$lang['start'] = 'Tên trang sử dụng làm điểm bắt đầu cho mỗi không gian tên'; +$lang['lang'] = 'Ngôn ngữ giao diện'; +$lang['template'] = 'Chủ đề (thiết kế của wiki)'; +$lang['tagline'] = 'Khẩu hiệu (nếu chủ đề hỗ trợ)'; +$lang['sidebar'] = 'Tên trang thanh bên (nếu chủ đề hỗ trợ), để trống sẽ vô hiệu hóa thanh bên'; +$lang['license'] = 'Nội dung của bạn nên được phát hành dưới?'; +$lang['savedir'] = 'Đường dẫn lưu dữ liệu'; +$lang['basedir'] = 'Đường dẫn máy chủ (VD. /dokuwiki/). Để trống để tự động phát hiện.'; +$lang['baseurl'] = 'URL máy chủ (VD. http://www.yourserver.com). Để trống để tự động phát hiện.'; +$lang['cookiedir'] = 'Đường dẫn cookie. Để trống để sử dụng baseurl.'; +$lang['dmode'] = 'Chế độ tạo đường dẫn'; +$lang['fmode'] = 'Chế độ tạo tập tin'; +$lang['allowdebug'] = 'Cho phép gỡ lỗi. Vô hiệu hóa nếu không cần thiết!'; +$lang['recent'] = 'Số lượng mục trên mỗi trang trong thay đổi gần đây'; +$lang['recent_days'] = 'Có bao nhiêu thay đổi gần đây được giữ (ngày)'; +$lang['breadcrumbs'] = 'Số lượng mục trong thanh điều hướng "Trang đã xem". Đặt thành 0 để vô hiệu hóa.'; +$lang['youarehere'] = 'Sử dụng thanh điều hướng phân cấp (có thể bạn muốn tắt tùy chọn ở trên)'; +$lang['fullpath'] = 'Hiển thị đường dẫn đầy đủ của trang trong phần chân trang'; +$lang['typography'] = 'Thay thế đánh máy'; +$lang['dformat'] = 'Định dạng ngày (xem chức năng strftime của PHP)'; +$lang['signature'] = 'Nội dung nhập vào khi nhấn nút chữ ký trong trình sửa đổi'; +$lang['showuseras'] = 'Nội dung hiển thị khi xem thành viên cuối cùng sửa đổi trang'; +$lang['toptoclevel'] = 'Cấp cao nhất cho mục lục'; +$lang['tocminheads'] = 'Số lượng đề mục tối thiểu cần thiết để xây dựng bảng mục lục'; +$lang['maxtoclevel'] = 'Cấp tối đa cho bảng mục lục'; +$lang['maxseclevel'] = 'Cấp tối đa cho phần mục sửa đổi'; +$lang['camelcase'] = 'Sử dụng CamelCase cho các liên kết'; +$lang['deaccent'] = 'Cách làm sạch tên trang'; +$lang['useheading'] = 'Sử dụng đề mục đầu tiên làm tên trang'; +$lang['sneaky_index'] = 'Theo mặc định, DokuWiki sẽ hiển thị tất cả các không gian tên trong sơ đồ trang web. Bật tùy chọn này sẽ ẩn những nơi mà thành viên không có quyền đọc. Điều này có thể dẫn đến việc ẩn các không gian tên con có thể truy cập, có thể làm cho chỉ mục không thể sử dụng được với các thiết lập Danh sách quyền truy cập (ACL) nhất định.'; +$lang['hidepages'] = 'Ẩn các trang khớp với biểu thức chính quy này khỏi tìm kiếm, sơ đồ trang web và các chỉ mục tự động khác'; +$lang['useacl'] = 'Sử dụng Danh sách kiểm soát truy cập'; +$lang['autopasswd'] = 'Tự động tạo mật khẩu'; +$lang['authtype'] = 'Xác thực phụ trợ'; +$lang['passcrypt'] = 'Phương thức mã hóa mật khẩu'; +$lang['defaultgroup'] = 'Nhóm mặc định, tất cả thành viên mới sẽ được đặt trong nhóm này'; +$lang['superuser'] = 'Siêu thành viên - danh sách được phân tách bằng nhóm, thành viên hoặc dấu phẩy user1,@group1,user2 có toàn quyền truy cập vào tất cả các trang và chức năng bất kể cài đặt trong Danh sách kiểm soát truy cập (ACL)'; +$lang['manager'] = 'Quản lý - nhóm, thành viên hoặc danh sách được phân tách bằng dấu phẩy user1,@group1,user2 có quyền truy cập vào một số chức năng quản lý'; +$lang['profileconfirm'] = 'Xác nhận thay đổi hồ sơ bằng mật khẩu'; +$lang['rememberme'] = 'Cho phép cookie đăng nhập vĩnh viễn (nhớ tôi)'; +$lang['disableactions'] = 'Vô hiệu hóa hành động DokuWiki'; +$lang['disableactions_check'] = 'Kiểm tra'; +$lang['disableactions_subscription'] = 'Đăng ký/Hủy đăng ký'; +$lang['disableactions_wikicode'] = 'Xem mã nguồn/Xuất Raw'; +$lang['disableactions_profile_delete'] = 'Xóa tài khoản cá nhân'; +$lang['disableactions_other'] = 'Hành động khác (được phân tách bằng dấu phẩy)'; +$lang['disableactions_rss'] = 'Đồng bộ XML (RSS)'; +$lang['auth_security_timeout'] = 'Thời gian chờ xác thực bảo mật (giây)'; +$lang['securecookie'] = 'Có nên gửi cookie qua HTTPS qua trình duyệt HTTPS không? Vô hiệu hóa tùy chọn này khi chỉ đăng nhập wiki của bạn được bảo mật bằng SSL nhưng việc duyệt wiki được thực hiện không bảo mật.'; +$lang['samesitecookie'] = 'Thuộc tính cookie cùng một trang sẽ sử dụng. Để trống nó sẽ cho phép trình duyệt quyết định chính sách của cùng một trang.'; +$lang['remote'] = 'Kích hoạt hệ thống API từ xa. Cho phép các ứng dụng khác truy cập wiki thông qua XML-RPC hoặc các cơ chế khác.'; +$lang['remoteuser'] = 'Hạn chế quyền truy cập API từ xa đối với các nhóm hoặc thành viên được phân tách bằng dấu phẩy ở đây. Để trống sẽ cho phép mọi người truy cập.'; +$lang['remotecors'] = 'Cho phép Chia sẻ tài nguyên nguồn chéo (CORS) cho giao diện từ xa. Dấu hoa thị (*) để cho phép tất cả các nguồn. Để trống để từ chối CORS.'; +$lang['usewordblock'] = 'Chặn spam dựa trên danh sách từ'; +$lang['relnofollow'] = 'Dùng rel="ugc nofollow" cho liên kết ngoài'; +$lang['indexdelay'] = 'Thời gian trễ trước khi lập chỉ mục (giây)'; +$lang['mailguard'] = 'Làm xáo trộn địa chỉ thư điện tử'; +$lang['iexssprotect'] = 'Kiểm tra tập tin đã tải lên có thể có mã JavaScript hoặc HTML độc hại'; +$lang['usedraft'] = 'Tự động lưu bản nháp trong khi đang sửa đổi'; +$lang['locktime'] = 'Thời gian tối đa cho các tập tin khóa (giây)'; +$lang['cachetime'] = 'Thời gian tối đa cho bộ đệm (giây)'; +$lang['target____wiki'] = 'Cửa sổ đích cho các liên kết nội bộ'; +$lang['target____interwiki'] = 'Cửa sổ đích cho các liên kết liên wiki'; +$lang['target____extern'] = 'Cửa sổ đích cho các liên kết ngoài'; +$lang['target____media'] = 'Cửa sổ đích cho các liên kết phương tiện'; +$lang['target____windows'] = 'Cửa sổ đích cho các liên kết cửa sổ'; +$lang['mediarevisions'] = 'Kích hoạt Mediarevisions?'; +$lang['refcheck'] = 'Kiểm tra tập tin phương tiện xem có còn đang được sử dụng không trước khi xóa'; +$lang['gdlib'] = 'Phiên bản GD Lib'; +$lang['im_convert'] = 'Đường dẫn đến công cụ chuyển đổi của ImageMagick'; +$lang['jpg_quality'] = 'Chất lượng nén JPEG (0-100)'; +$lang['fetchsize'] = 'Kích thước tối đa (byte) fetch.php có thể tải xuống từ các URL bên ngoài, ví dụ: để lưu trữ và thay đổi kích thước hình ảnh bên ngoài.'; +$lang['subscribers'] = 'Cho phép thành viên đăng ký thay đổi trang bằng thư điện tử'; +$lang['subscribe_time'] = 'Thời gian danh sách đăng ký và thông báo được gửi (giây); Thời gian này phải nhỏ hơn thời gian được chỉ định trong recent_days.'; +$lang['notify'] = 'Luôn gửi thông báo thay đổi đến địa chỉ thư điện tử này'; +$lang['registernotify'] = 'Luôn gửi thông tin về thành viên mới đăng ký đến địa chỉ thư điện tử này'; +$lang['mailfrom'] = 'Đia chỉ thư điện tử người gửi sử dụng cho thư tự động'; +$lang['mailreturnpath'] = 'Địa chỉ thư điện tử người nhận cho thông báo không cung cấp'; +$lang['mailprefix'] = 'Tiền tố chủ đề thư điện tử sử dụng cho thư tự động. Để trống nếu muốn sử dụng tiêu đề wiki'; +$lang['htmlmail'] = 'Gửi tìm kiếm tốt hơn, nhưng kích thước lớn hơn thư điện tử HTML nhiều phần. Vô hiệu hóa cho thư chỉ có văn bản đơn thuần .'; +$lang['dontlog'] = 'Vô hiệu hóa ghi nhật ký đối với các loại nhật ký này.'; +$lang['sitemap'] = 'Tạo sơ đồ trang web của Google (sitemap) thường xuyên (tính theo ngày). Đặt thành 0 để vô hiệu hóa'; +$lang['rss_type'] = 'Loại nguồn cấp dữ liệu XML'; +$lang['rss_linkto'] = 'Liên kết đến nguồn cấp dữ liệu XML '; +$lang['rss_content'] = 'Hiển thị gì trong các mục nguồn cấp dữ liệu XML?'; +$lang['rss_update'] = 'Khoảng thời gian cập nhật nguồn cấp dữ liệu XML (giây)'; +$lang['rss_show_summary'] = 'Tóm tắt nguồn cấp dữ liệu XML trong tiêu đề'; +$lang['rss_show_deleted'] = 'Hiển thị nguồn cấp dữ liệu XML đã xóa'; +$lang['rss_media'] = 'Loại thay đổi nào sẽ được liệt kê trong nguồn cấp dữ liệu XML?'; +$lang['rss_media_o_both'] = 'cả hai'; +$lang['rss_media_o_pages'] = 'trang'; +$lang['rss_media_o_media'] = 'phương tiện'; +$lang['updatecheck'] = 'Kiểm tra cập nhật và cảnh báo bảo mật? DokuWiki cần kết nối với update.dokuwiki.org để sử dụng tính năng này.'; +$lang['userewrite'] = 'Sử dụng URL đẹp'; +$lang['useslash'] = 'Sử dụng dấu gạch chéo làm dấu phân cách không gian tên trong URL'; +$lang['sepchar'] = 'Phân cách từ trong tên trang'; +$lang['canonical'] = 'Sử dụng URL hoàn toàn kinh điển'; +$lang['fnencode'] = 'Phương pháp mã hóa tên tập tin không phải ASCII.'; +$lang['autoplural'] = 'Kiểm tra các hình thức số nhiều trong các liên kết'; +$lang['compression'] = 'Phương pháp nén cho các tập tin attic '; +$lang['gzip_output'] = 'Sử dụng mã hóa nội dung gzip cho xhtml'; +$lang['compress'] = 'Đầu ra CSS và javascript nhỏ gọn'; +$lang['cssdatauri'] = 'Kích thước tính theo byte mà hình ảnh được tham chiếu trong tập tin CSS nên được nhúng ngay vào bảng định kiểu để giảm yêu cầu đầu đề HTTP phía trước. 400 đến 600 bytes là các giá trị tốt. Đặt thành 0 để vô hiệu hóa.'; +$lang['send404'] = 'Gửi "HTTP 404/Không tìm thấy trang" cho những trang không tồn tại'; +$lang['broken_iua'] = 'Chức năng ign_user_abort có bị hỏng trên hệ thống của bạn không? Điều này có thể khiến chỉ mục tìm kiếm không hoạt động. IIS + PHP/CGI được biết sẽ bị hỏng. Xem Bug 852 để biết thêm thông tin.'; +$lang['xsendfile'] = 'Sử dụng đầu đề X-Sendfile cho phép máy chủ web cung cấp các tập tin tĩnh? Máy chủ web của bạn cần hỗ trợ cái này.'; +$lang['renderer_xhtml'] = 'Trình kết xuất để sử dụng cho đầu ra wiki chính (xhtml)'; +$lang['renderer__core'] = '%s (lõi dokuwiki)'; +$lang['renderer__plugin'] = '%s (tiện ích plugin)'; +$lang['search_nslimit'] = 'Giới hạn tìm kiếm trong không gian tên X hiện tại. Khi tìm kiếm được thực hiện từ một trang trong không gian tên sâu hơn, không gian tên X đầu tiên sẽ được thêm vào dưới dạng bộ lọc'; +$lang['search_fragment'] = 'Chỉ định hành vi tìm kiếm đoạn mặc định'; +$lang['search_fragment_o_exact'] = 'chính xác'; +$lang['search_fragment_o_starts_with'] = 'bắt đầu với'; +$lang['search_fragment_o_ends_with'] = 'kết thúc bằng'; +$lang['search_fragment_o_contains'] = 'chứa'; +$lang['trustedproxy'] = 'Những proxy chuyển tiếp tin cậy khớp với biểu thức chính quy này về IP máy khách thực mà họ báo cáo. Mặc định phù hợp với những mạng cục bộ. Để trống để tin tưởng không có proxy.'; +$lang['_feature_flags'] = 'Cờ đặc trưng'; +$lang['defer_js'] = 'Trì hoãn javascript được thực thi sau khi HTML của trang được phân tích cú pháp. Cải thiện tốc độ trang nhận thức nhưng có thể phá vỡ một số lượng nhỏ plugin.'; +$lang['hidewarnings'] = 'Không hiển thị bất kỳ cảnh báo nào được đưa ra bởi PHP. Điều này sẽ làm giảm chuyển giao tới PHP8+. Các cảnh báo sẽ vẫn được truy nhập vào sổ nhật ký log các lỗi và cần được báo cáo.'; +$lang['dnslookups'] = 'DokuWiki sẽ tra cứu tên máy chủ cho các địa chỉ IP từ xa của thành viên sửa đổi trang. Nếu bạn có máy chủ DNS chậm hoặc không hoạt động hoặc không muốn tính năng này, hãy tắt tùy chọn này'; +$lang['jquerycdn'] = 'Các tập tin script jQuery và jQuery UI có nên được tải từ CDN không? Việc này thêm các yêu cầu HTTP bổ sung, nhưng có thể tải tập tin nhanh hơn và người dùng có thể đã lưu chúng vào bộ nhớ cache.'; +$lang['jquerycdn_o_0'] = 'Không có CDN, chỉ tải nội bộ'; +$lang['jquerycdn_o_jquery'] = 'CDN tại code.jquery.com'; +$lang['jquerycdn_o_cdnjs'] = 'CDN tại cdnjs.com'; +$lang['proxy____host'] = 'Tên máy chủ Proxy'; +$lang['proxy____port'] = 'Cổng Proxy '; +$lang['proxy____user'] = 'Tên thành viên Proxy '; +$lang['proxy____pass'] = 'Mật khẩu Proxy '; +$lang['proxy____ssl'] = 'Sử dụng SSL khi kết nối với proxy'; +$lang['proxy____except'] = 'Biểu thức chính quy để khớp với các URL mà proxy nên được bỏ qua.'; +$lang['license_o_'] = 'Không chọn'; +$lang['typography_o_0'] = 'Không'; +$lang['typography_o_1'] = 'không bao gồm dấu ngoặc đơn'; +$lang['typography_o_2'] = 'bao gồm cả dấu ngoặc đơn (có thể không phải lúc nào cũng hoạt động)'; +$lang['userewrite_o_0'] = 'không'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'Nội bộ DokuWiki '; +$lang['deaccent_o_0'] = 'tắt'; +$lang['deaccent_o_1'] = 'xóa dấu'; +$lang['deaccent_o_2'] = 'La tinh hóa'; +$lang['gdlib_o_0'] = 'Không có sẵn GD Lib '; +$lang['gdlib_o_1'] = 'Phiên bản 1.x'; +$lang['gdlib_o_2'] = 'Tự động phát hiện'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = 'Abstract'; +$lang['rss_content_o_diff'] = 'Unified Diff'; +$lang['rss_content_o_htmldiff'] = 'bảng HTML định dạng khác'; +$lang['rss_content_o_html'] = 'Nội dung trang HTML đầy đủ'; +$lang['rss_linkto_o_diff'] = 'xem khác biệt'; +$lang['rss_linkto_o_page'] = 'Trang đã xem lại'; +$lang['rss_linkto_o_rev'] = 'Danh sách phiên bản'; +$lang['rss_linkto_o_current'] = 'trang hiện tại'; +$lang['compression_o_0'] = 'không'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = 'không sử dụng'; +$lang['xsendfile_o_1'] = 'Đầu đề lighttpd độc quyền (trước khi phát hành 1.5)'; +$lang['xsendfile_o_2'] = 'Đầu đề X-Sendfile tiêu chuẩn'; +$lang['xsendfile_o_3'] = 'Đầu đề Nginx X-Accel-Redirect độc quyền'; +$lang['showuseras_o_loginname'] = 'Tên đăng nhập'; +$lang['showuseras_o_username'] = 'Tên đầy đủ của thành viên'; +$lang['showuseras_o_username_link'] = 'Tên đầy đủ của thành viên dưới dạng liên kết thành viên liên wiki'; +$lang['showuseras_o_email'] = 'Địa chỉ thư điện tử của thành viên (bị xáo trộn theo cài đặt mailguard)'; +$lang['showuseras_o_email_link'] = 'Địa chỉ thư điện tử của thành viên dưới dạng mailto: link'; +$lang['useheading_o_0'] = 'Không bao giờ'; +$lang['useheading_o_navigation'] = 'Chỉ điều hướng'; +$lang['useheading_o_content'] = 'Chỉ nội dung Wiki'; +$lang['useheading_o_1'] = 'Luôn luôn'; +$lang['readdircache'] = 'Thời gian tối đa cho bộ nhớ cache readdir (giây)'; diff --git a/lib/plugins/config/lang/zh-tw/intro.txt b/lib/plugins/config/lang/zh-tw/intro.txt new file mode 100644 index 0000000..e131ec3 --- /dev/null +++ b/lib/plugins/config/lang/zh-tw/intro.txt @@ -0,0 +1,7 @@ +====== 設定管理器 ====== + +使用本頁控制您的 Dokuwiki 設定。您可以參閱 [[doku>config]],查看每個獨立設定的相關訊息。要知道更多設定管理器的資訊,請瀏覽 [[doku>plugin:config]]。 + +淡紅色背景的項目是受到保護的,不能通過這管理器更改。藍色背景的項目是系統的預設值,白色背景的項目是您更改過的。藍色和白色的設定項目都可以更改。 + +離開本頁之前,不要忘記點擊最下面的 **儲存** 按鈕,否則您的修改不會生效。 diff --git a/lib/plugins/config/lang/zh-tw/lang.php b/lib/plugins/config/lang/zh-tw/lang.php new file mode 100644 index 0000000..19b4cba --- /dev/null +++ b/lib/plugins/config/lang/zh-tw/lang.php @@ -0,0 +1,193 @@ + + * @author GHSRobert Ciang + * @author Li-Jiun Huang + * @author http://www.chinese-tools.com/tools/converter-simptrad.html + * @author Wayne San + * @author Cheng-Wei Chien + * @author Danny Lin + * @author Shuo-Ting Jian + * @author syaoranhinata + * @author Liou, Jhe-Yu + */ +$lang['menu'] = '系統設定'; +$lang['error'] = '因為含有不合規格的設定值,故未能更新設定。請檢查您的更改並重新送出。 +
    不正確的設定值,會以紅色方框包住。'; +$lang['updated'] = '設定已更新。'; +$lang['nochoice'] = '(無其他可用選項)'; +$lang['locked'] = '設定檔無法更新,若非故意,請確認本地檔名及權限正確。'; +$lang['danger'] = '危險:改變此選項,可能使您無法存取本 wiki 及設定選單。'; +$lang['warning'] = '警告:改變此選項可能導致不可預期的行為。'; +$lang['security'] = '安全性警告:改變此選項可能造成安全風險。'; +$lang['_configuration_manager'] = '設定管理器'; +$lang['_header_dokuwiki'] = 'DokuWiki 設定'; +$lang['_header_plugin'] = '附加元件設定'; +$lang['_header_template'] = '樣板設定'; +$lang['_header_undefined'] = '未定義設定'; +$lang['_basic'] = '基本設定'; +$lang['_display'] = '顯示設定'; +$lang['_authentication'] = '認證設定'; +$lang['_anti_spam'] = '反垃圾設定'; +$lang['_editing'] = '編輯設定'; +$lang['_links'] = '連結設定'; +$lang['_media'] = '媒體設定'; +$lang['_notifications'] = '提醒設定'; +$lang['_syndication'] = '聚合設定'; +$lang['_advanced'] = '進階設定'; +$lang['_network'] = '網路設定'; +$lang['_msg_setting_undefined'] = '設定的後設數據不存在。'; +$lang['_msg_setting_no_class'] = '設定的分類不存在。'; +$lang['_msg_setting_no_default'] = '無預設值'; +$lang['title'] = '本 wiki 的標題'; +$lang['start'] = '開始頁面的名稱'; +$lang['lang'] = '語系'; +$lang['template'] = '樣板'; +$lang['tagline'] = '副標題 (若樣板支援此功能)'; +$lang['sidebar'] = '側欄的頁面名稱 (若樣板支援此功能) 。若把它留空,則會停用側欄'; +$lang['license'] = '您希望您的內容採用哪種授權方式?'; +$lang['savedir'] = '儲存資料的目錄'; +$lang['basedir'] = '根目錄'; +$lang['baseurl'] = '根路徑 (URL)'; +$lang['cookiedir'] = 'Cookie 路徑。設定空白則使用 baseurl。'; +$lang['dmode'] = '目錄建立模式'; +$lang['fmode'] = '檔案建立模式'; +$lang['allowdebug'] = '允許除錯 (不需要請停用!)'; +$lang['recent'] = '最近更新'; +$lang['recent_days'] = '儲存多少天內的變更'; +$lang['breadcrumbs'] = '導覽路徑數量。輸入0表示停用。'; +$lang['youarehere'] = '顯示階層式導覽路徑 (若要用此功能,建議停用上方的選項)'; +$lang['fullpath'] = '顯示完整的路徑於頁面底部'; +$lang['typography'] = '進行字元替換'; +$lang['dformat'] = '日期格式 (參見 PHP 的 strftime 函數)'; +$lang['signature'] = '簽名'; +$lang['showuseras'] = '將最後編輯頁面的使用者顯示為:'; +$lang['toptoclevel'] = '目錄表的最上層級'; +$lang['tocminheads'] = '決定是否建立目錄表的最少標題數量'; +$lang['maxtoclevel'] = '目錄表顯示的最大層級'; +$lang['maxseclevel'] = '可編輯段落的最大層級'; +$lang['camelcase'] = '對連結使用 CamelCase'; +$lang['deaccent'] = '清理頁面名稱'; +$lang['useheading'] = '使用第一個標題作頁面名稱'; +$lang['sneaky_index'] = '預設情況下,DokuWiki 會在索引頁會顯示所有分類名稱。啟用此選項,會隱藏使用者沒有閱讀權限的頁面,但也可能將他可以閱讀的子頁面一併隱藏。在特定 ACL 設定下,這可能導致索引無法使用。'; +$lang['hidepages'] = '隱藏匹配的界面 (正規式)'; +$lang['useacl'] = '使用存取控制名單'; +$lang['autopasswd'] = '自動產生密碼'; +$lang['authtype'] = '認證後台管理方式'; +$lang['passcrypt'] = '密碼加密方式'; +$lang['defaultgroup'] = '預設群組'; +$lang['superuser'] = '超級使用者 —— 不論 ACL 如何設定,都能訪問所有頁面與功能的群組或使用者'; +$lang['manager'] = '管理員 —— 能訪問相應管理功能的群組或使用者'; +$lang['profileconfirm'] = '修改個人資料時需要確認密碼'; +$lang['rememberme'] = '允許自動登入 (記住我)'; +$lang['disableactions'] = '停用的 DokuWiki 動作'; +$lang['disableactions_check'] = '檢查'; +$lang['disableactions_subscription'] = '訂閱/取消訂閱'; +$lang['disableactions_wikicode'] = '檢視原始碼/匯出原始檔'; +$lang['disableactions_other'] = '其他功能 (逗號分隔)'; +$lang['auth_security_timeout'] = '安全認證的計時 (秒)'; +$lang['securecookie'] = 'HTTPS 頁面設定的 cookie 是否只能由瀏覽器經 HTTPS 傳送?取消此選項後,只有登入本 wiki 才會受 SSL 保護,瀏覽時則不受保護。'; +$lang['remote'] = '啟用遠程 API 系统。這允許其他程式經 XML-RPC 或其他機制來訪問本 wiki 。'; +$lang['remoteuser'] = '將遠程 API 的訪問權限,限制在指定的群組或使用者中。以逗號分隔群組或使用者。留空表示允許任何人訪問。'; +$lang['usewordblock'] = '根據字詞表阻擋垃圾訊息'; +$lang['relnofollow'] = '外部連結使用 rel="nofollow"'; +$lang['indexdelay'] = '建立索引前的延遲時間 (秒)'; +$lang['mailguard'] = '自動弄亂使用者的電郵地址,以作保護'; +$lang['iexssprotect'] = '檢查上傳的檔案中是否隱含惡意的 JavaScript 或 HTML 碼'; +$lang['usedraft'] = '編輯時自動儲存草稿'; +$lang['locktime'] = '檔案的最大鎖定時間 (秒)'; +$lang['cachetime'] = '緩存的最大存在時間 (秒)'; +$lang['target____wiki'] = '內部連結的目標視窗'; +$lang['target____interwiki'] = 'Wiki間互連的目標視窗'; +$lang['target____extern'] = '外部連結的目標視窗'; +$lang['target____media'] = '媒體連結的目標視窗'; +$lang['target____windows'] = 'Windows 連結的目標視窗'; +$lang['mediarevisions'] = '啟用媒體修訂歷史嗎?'; +$lang['refcheck'] = '媒體連結檢查'; +$lang['gdlib'] = 'GD Lib 版本'; +$lang['im_convert'] = 'ImageMagick 的轉換工具路徑'; +$lang['jpg_quality'] = 'JPG 壓縮品質(0-100)'; +$lang['fetchsize'] = 'fetch.php 可以從外部下載的最大檔案尺寸 (bytes)'; +$lang['subscribers'] = '啟用頁面訂閱'; +$lang['subscribe_time'] = '訂閱列表和摘要發送的時間間隔 (秒);這個值應該小於指定的最近更改保留時間 (recent_days)。'; +$lang['notify'] = '寄送變更通知信到這個電郵地址'; +$lang['registernotify'] = '寄送新使用者註冊資訊到這個電郵地址'; +$lang['mailfrom'] = '自動發送郵件時使用的郵件地址'; +$lang['mailprefix'] = '自動發送郵件時使用的標題前綴'; +$lang['htmlmail'] = '發送更加美觀,但體積會更大的 HTML 多部份電郵。若停用它,表示只發送純文字電郵。'; +$lang['sitemap'] = '產生 Google 網站地圖 (以多少天計算) 。輸入0表示停用'; +$lang['rss_type'] = 'XML feed 類型'; +$lang['rss_linkto'] = 'XML feed 連結到'; +$lang['rss_content'] = 'XML feed 項目中顯示什麼呢?'; +$lang['rss_update'] = 'XML feed 更新間隔時間 (秒)'; +$lang['rss_show_summary'] = '於標題中顯示簡要的 XML feed'; +$lang['rss_media'] = '在 XML feed 中應列出哪些變更?'; +$lang['updatecheck'] = '檢查更新與安全性警告?DokuWiki 需要聯繫 update.dokuwiki.org 才能使用此功能。'; +$lang['userewrite'] = '使用好看的 URL'; +$lang['useslash'] = '在 URL 中使用斜線作分類名稱的分隔字元'; +$lang['sepchar'] = '頁面名稱中單字的分隔字元'; +$lang['canonical'] = '使用最典型的 URL'; +$lang['fnencode'] = '非 ASCII 文件名稱的編輯方法。'; +$lang['autoplural'] = '檢查複數形式的連結 (英文)'; +$lang['compression'] = 'attic 文件的壓縮方式'; +$lang['gzip_output'] = '對 xhtml 使用 gzip 內容編碼'; +$lang['compress'] = '壓縮 CSS 與 JavaScript 的輸出'; +$lang['cssdatauri'] = '假如 CSS 中所引用的圖片小於該數字大小(bytes),圖片將被直接嵌入 CSS 中,以減少 HTTP Request 的發送。 推薦把此數值設定成 400600 bytes 之間。若輸入 0 則停用此功能。'; +$lang['send404'] = '存取不存在的頁面時送出 "HTTP 404/Page Not Found"'; +$lang['broken_iua'] = 'ignore_user_abort 功能失效了?這有可能導致搜索索引不可用。IIS+PHP/CGI 已損壞。請參閱 Bug 852 獲取更多訊息。'; +$lang['xsendfile'] = '使用 X-Sendfile 頭讓網頁伺服器發送狀態文件?您的網頁伺服器需要支持該功能。'; +$lang['renderer_xhtml'] = '主要 wiki 輸出 (xhtml) 的渲染器'; +$lang['renderer__core'] = '%s (dokuwiki 核心)'; +$lang['renderer__plugin'] = '%s (附加元件)'; +$lang['dnslookups'] = 'Dokuwiki 將查詢使用者編輯頁面的遠程 IP 位址主機名稱。若您的 DNS 伺服器速度較慢、失效,或者您不想要此功能,请停用此選項'; +$lang['proxy____host'] = 'Proxy 伺服器名稱'; +$lang['proxy____port'] = 'Proxy 連接埠'; +$lang['proxy____user'] = 'Proxy 使用者名稱'; +$lang['proxy____pass'] = 'Proxy 密碼'; +$lang['proxy____ssl'] = '使用 SSL 連接到 Proxy'; +$lang['proxy____except'] = '比對 proxy 代理時應跳過的地址的正規式。'; +$lang['license_o_'] = '未選擇'; +$lang['typography_o_0'] = '無'; +$lang['typography_o_1'] = '只限雙引號'; +$lang['typography_o_2'] = '包括單引號 (未必能運作)'; +$lang['userewrite_o_0'] = '無'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki 內部控制'; +$lang['deaccent_o_0'] = '關閉'; +$lang['deaccent_o_1'] = '移除重音符號'; +$lang['deaccent_o_2'] = '羅馬字母轉寫'; +$lang['gdlib_o_0'] = 'GD Lib 無法使用'; +$lang['gdlib_o_1'] = '版本 1.x'; +$lang['gdlib_o_2'] = '自動偵測'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = '摘要'; +$lang['rss_content_o_diff'] = '統一的差異'; +$lang['rss_content_o_htmldiff'] = 'HTML 格式的差異對照表'; +$lang['rss_content_o_html'] = '完整的 HTML 頁面內容'; +$lang['rss_linkto_o_diff'] = '差異檢視'; +$lang['rss_linkto_o_page'] = '已修訂的頁面'; +$lang['rss_linkto_o_rev'] = '版本清單'; +$lang['rss_linkto_o_current'] = '目前頁面'; +$lang['compression_o_0'] = '無'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = '不使用'; +$lang['xsendfile_o_1'] = '專有 lighttpd 標頭 (1.5 發佈前)'; +$lang['xsendfile_o_2'] = '標準 X-Sendfile 標頭'; +$lang['xsendfile_o_3'] = '專有 Nginx X-Accel-Redirect 標頭'; +$lang['showuseras_o_loginname'] = '登入名稱'; +$lang['showuseras_o_username'] = '完整姓名'; +$lang['showuseras_o_email'] = '使用者的電郵地址 (根據郵件監控設定混淆化)'; +$lang['showuseras_o_email_link'] = '使用者的電郵地址標示成 mailto: 連結'; +$lang['useheading_o_0'] = '永不'; +$lang['useheading_o_navigation'] = '僅導覽'; +$lang['useheading_o_content'] = '僅本 wiki 內容'; +$lang['useheading_o_1'] = '總是'; +$lang['readdircache'] = 'readdir 緩存的最大存在時間 (秒)'; diff --git a/lib/plugins/config/lang/zh/intro.txt b/lib/plugins/config/lang/zh/intro.txt new file mode 100644 index 0000000..43aa0a9 --- /dev/null +++ b/lib/plugins/config/lang/zh/intro.txt @@ -0,0 +1,7 @@ +====== 配置管理器 ====== + +使用本页中的内容来控制您的 DokuWiki 设置。 每个单独设置的相关信息请参阅 [[doku>config]]。 配置管理器的更多信息请参阅 [[doku>plugin:config]]。 + +淡红色背景的项目被保护,不能通过这个管理器更改。 蓝色背景的项目是系统的默认值,白色背景的项目是您作出更改的项目。蓝色和白色的设置项目都可以更改。 + +离开本页之前不要忘记点击最后的 **保存** 按钮,否则您做的修改不会生效。 diff --git a/lib/plugins/config/lang/zh/lang.php b/lib/plugins/config/lang/zh/lang.php new file mode 100644 index 0000000..fe27e7a --- /dev/null +++ b/lib/plugins/config/lang/zh/lang.php @@ -0,0 +1,243 @@ + + * @author Zhenzhe Huang <1991419264@qq.com> + * @author 林晓东 + * @author alair + * @author better + * @author 小李 + * @author VinnieChow + * @author Lakejason0 + * @author Phy + * @author Jenxi + * @author FENG.JIE + * @author Xin + * @author HaoNan + * @author Aaron Zhou + * @author lempel + * @author ZDYX + * @author http://www.chinese-tools.com/tools/converter-tradsimp.html + * @author Simon zhan + * @author ben + * @author lainme + * @author caii + * @author Hiphen Lee + * @author Shuo-Ting Jian + * @author Garfield + * @author JellyChen <451453325@qq.com> + * @author tai + * @author 高博 + * @author hznupeter + * @author kuma + * @author phy25 + */ +$lang['menu'] = '配置设置'; +$lang['error'] = '由于非法参数,设置没有更新。请检查您做的改动并重新提交。 +
    非法参数会用红框包围显示。'; +$lang['updated'] = '设置更新成功。'; +$lang['nochoice'] = '(没有其他可用选项)'; +$lang['locked'] = '设置文件无法更新。如果这是您没有意料到的,
    + 请确保本地设置文件的名称和权限设置正确。'; +$lang['danger'] = '危险:更改这个选项可能会使用你的Wiki页面和配置菜单无法进入。'; +$lang['warning'] = '注意:更改这个选项可能会造成未知结果。'; +$lang['security'] = '安全提示:更改这个选项可能会有安全隐患。'; +$lang['_configuration_manager'] = '配置管理器'; +$lang['_header_dokuwiki'] = 'DokuWiki 设置'; +$lang['_header_plugin'] = '插件设置'; +$lang['_header_template'] = '模板设置'; +$lang['_header_undefined'] = '其他设置'; +$lang['_basic'] = '基本设置'; +$lang['_display'] = '显示设置'; +$lang['_authentication'] = '认证设置'; +$lang['_anti_spam'] = '反垃圾邮件/评论设置'; +$lang['_editing'] = '编辑设置'; +$lang['_links'] = '链接设置'; +$lang['_media'] = '媒体设置'; +$lang['_notifications'] = '通知设置'; +$lang['_syndication'] = '聚合设置'; +$lang['_advanced'] = '高级设置'; +$lang['_network'] = '网络设置'; +$lang['_msg_setting_undefined'] = '设置的元数据不存在。'; +$lang['_msg_setting_no_class'] = '设置的分类不存在。'; +$lang['_msg_setting_no_known_class'] = '设置分类不可用'; +$lang['_msg_setting_no_default'] = '设置的默认值不存在。'; +$lang['title'] = '维基站点的标题'; +$lang['start'] = '开始页面的名称'; +$lang['lang'] = '语言'; +$lang['template'] = '模版'; +$lang['tagline'] = '副标题 (如果模板支持此功能)'; +$lang['sidebar'] = '侧边栏的页面名称 (如果模板支持此功能),留空以禁用侧边栏'; +$lang['license'] = '您愿意让你贡献的内容在何种许可方式下发布?'; +$lang['savedir'] = '保存数据的目录'; +$lang['basedir'] = '根目录'; +$lang['baseurl'] = '根路径(URL,比如 http://www.yourserver.com)。留空将使用自动检测。'; +$lang['cookiedir'] = 'Cookie 路径。留空以使用 baseurl。'; +$lang['dmode'] = '文件夹的创建模式'; +$lang['fmode'] = '文件的创建模式'; +$lang['allowdebug'] = '允许调试 如果您不需要调试,请勿勾选!'; +$lang['recent'] = '最近更新'; +$lang['recent_days'] = '保留多少天的最近更改(天)'; +$lang['breadcrumbs'] = '显示“足迹”的数量'; +$lang['youarehere'] = '显示“您在这里”'; +$lang['fullpath'] = '在页面底部显示完整路径'; +$lang['typography'] = '进行字符替换'; +$lang['dformat'] = '日期格式(参见 PHP 的 strftime 功能)'; +$lang['signature'] = '签名样式'; +$lang['showuseras'] = '显示用户为'; +$lang['toptoclevel'] = '目录的最顶层'; +$lang['tocminheads'] = '头条数目的最小数目,这将用于决定是否创建目录列表(TOC)'; +$lang['maxtoclevel'] = '目录的最多层次'; +$lang['maxseclevel'] = '段落编辑的最多层次'; +$lang['camelcase'] = '对链接使用 CamelCase'; +$lang['deaccent'] = '清理页面名称'; +$lang['useheading'] = '使用“标题 H1”作为页面名称'; +$lang['sneaky_index'] = '默认情况下,DokuWiki 在索引页会显示所有 namespace。启用该选项能隐藏那些用户没有权限阅读的页面。但也可能将用户能够阅读的子页面一并隐藏。这有可能导致在特定 ACL 设置下,索引功能不可用。'; +$lang['hidepages'] = '隐藏匹配的界面(正则表达式)'; +$lang['useacl'] = '使用访问控制列表(ACL)'; +$lang['autopasswd'] = '自动生成密码'; +$lang['authtype'] = '认证后台管理方式'; +$lang['passcrypt'] = '密码加密方法'; +$lang['defaultgroup'] = '默认组'; +$lang['superuser'] = '超级用户 - 不论 ACL 如何设置,都能访问所有页面与功能的用户组/用户'; +$lang['manager'] = '管理员 - 能访问相应管理功能的用户组/用户'; +$lang['profileconfirm'] = '更新个人信息时需要输入当前密码'; +$lang['rememberme'] = '允许在本地机长期保留登录cookies信息(记住我)'; +$lang['disableactions'] = '停用 DokuWiki 功能'; +$lang['disableactions_check'] = '检查'; +$lang['disableactions_subscription'] = '订阅/退订'; +$lang['disableactions_wikicode'] = '查看源文件/导出源文件'; +$lang['disableactions_profile_delete'] = '删除自己的账户'; +$lang['disableactions_other'] = '其他功能(用英文逗号分隔)'; +$lang['disableactions_rss'] = 'XML 同步 (RSS)'; +$lang['auth_security_timeout'] = '认证安全超时(秒)'; +$lang['securecookie'] = '要让浏览器须以HTTPS方式传送在HTTPS会话中设置的cookies吗?请只在登录过程为SSL加密而浏览维基为明文的情况下打开此选项。'; +$lang['samesitecookie'] = '要使用的SameSite Cookie属性。将其留空将由浏览器决定SameSite策略。'; +$lang['remote'] = '激活远程 API 系统。这允许其他程序通过 XML-RPC 或其他机制来访问维基。'; +$lang['remoteuser'] = '将远程 API 的访问权限限制在指定的组或用户中,以逗号分隔。留空则允许任何人访问。'; +$lang['remotecors'] = '为远程接口启用跨源资源共享 (CORS)。星号 (*) 表示允许所有来源。留空以拒绝 CORS。'; +$lang['usewordblock'] = '根据 wordlist 阻止垃圾评论'; +$lang['relnofollow'] = '对外部链接使用 rel="nofollow" 标签'; +$lang['indexdelay'] = '构建索引前的时间延滞(秒)'; +$lang['mailguard'] = '弄乱邮件地址(保护用户的邮件地址)'; +$lang['iexssprotect'] = '检验上传的文件以避免可能存在的恶意 JavaScript 或 HTML 代码'; +$lang['usedraft'] = '编辑时自动保存一份草稿'; +$lang['locktime'] = '独有编辑权/文件锁定的最长时间(秒)'; +$lang['cachetime'] = '缓存的最长时间(秒)'; +$lang['target____wiki'] = '内部链接的目标窗口'; +$lang['target____interwiki'] = 'Interwiki 链接的目标窗口'; +$lang['target____extern'] = '外部链接的目标窗口'; +$lang['target____media'] = '媒体文件链接的目标窗口'; +$lang['target____windows'] = 'Windows 链接的目标窗口'; +$lang['mediarevisions'] = '激活媒体修订历史?'; +$lang['refcheck'] = '检查媒体与页面的挂钩情况'; +$lang['gdlib'] = 'GD 库版本'; +$lang['im_convert'] = 'ImageMagick 转换工具的路径'; +$lang['jpg_quality'] = 'JPG 压缩质量(0-100)'; +$lang['fetchsize'] = 'fetch.php 能从外部下载的最大文件大小(字节)'; +$lang['subscribers'] = '启用页面订阅支持'; +$lang['subscribe_time'] = '订阅列表和摘要发送的时间间隔(秒);这应当小于指定的最近更改保留时间(recent_days)。 +'; +$lang['notify'] = '发送更改通知给这个邮件地址'; +$lang['registernotify'] = '发送新注册用户的信息给这个邮件地址'; +$lang['mailfrom'] = '自动发送邮件时使用的邮件地址'; +$lang['mailreturnpath'] = '非投递通知的收件人邮箱地址'; +$lang['mailprefix'] = '自动发送邮件时使用的邮件地址前缀'; +$lang['htmlmail'] = '发送更加美观,但体积更大的 HTML 多部分邮件。禁用则发送纯文本邮件。'; +$lang['dontlog'] = '为这些种类的日志禁用日志记录。'; +$lang['logretain'] = '日志要保留多少天。'; +$lang['sitemap'] = '生成 Google sitemap(天)'; +$lang['rss_type'] = 'XML feed 类型'; +$lang['rss_linkto'] = 'XML feed 链接到'; +$lang['rss_content'] = 'XML feed 项目中显示什么呢?'; +$lang['rss_update'] = 'XML feed 升级间隔(秒)'; +$lang['rss_show_summary'] = 'XML feed 在标题中显示摘要'; +$lang['rss_show_deleted'] = 'XML feed显示已删除的feed'; +$lang['rss_media'] = '在 XML 源中应该列出何种类型的更改?'; +$lang['rss_media_o_both'] = '两者均可'; +$lang['rss_media_o_pages'] = '页面'; +$lang['rss_media_o_media'] = '媒体'; +$lang['updatecheck'] = '自动检查更新并接收安全警告吗?开启该功能后 DokuWiki 将自动访问 update.dokuwiki.org。'; +$lang['userewrite'] = '使用更整洁的 URL'; +$lang['useslash'] = '在 URL 中使用斜杠作为命名空间的分隔符'; +$lang['sepchar'] = '页面名称中的单词分隔符'; +$lang['canonical'] = '使用完全标准的 URL'; +$lang['fnencode'] = '非 ASCII 文件名的编码方法。'; +$lang['autoplural'] = '在链接中检查多种格式'; +$lang['compression'] = 'attic 文件的压缩方式'; +$lang['gzip_output'] = '对 xhtml 使用 gzip 内容编码'; +$lang['compress'] = '使 CSS 和 javascript 的输出更紧密'; +$lang['cssdatauri'] = '字节数。CSS 文件引用的图片若小于该字节,则被直接嵌入样式表中来减少 HTTP 请求头的开销。这个技术在 IE 中不起作用。400600 字节是不错的值。设置为 0 则禁用。'; +$lang['send404'] = '发送 "HTTP 404/页面没有找到" 错误信息给不存在的页面'; +$lang['broken_iua'] = 'ignore_user_abort 功能失效了?这有可能导致搜索索引不可用。IIS+PHP/CGI 已损坏。请参阅 Bug 852 获取更多信息。'; +$lang['xsendfile'] = '使用 X-Sendfile 头让服务器发送状态文件?您的服务器需要支持该功能。'; +$lang['renderer_xhtml'] = '主维基页面 (xhtml) 输出使用的渲染'; +$lang['renderer__core'] = '%s(DokuWiki 内核)'; +$lang['renderer__plugin'] = '%s(插件)'; +$lang['search_nslimit'] = '限制搜索范围为当前若干层命名空间。当搜索在更深的命名空间中被执行时,前若干层命名空间将会被用来筛选'; +$lang['search_fragment'] = '指定默认的分段搜索方式'; +$lang['search_fragment_o_exact'] = '精确'; +$lang['search_fragment_o_starts_with'] = '开头为'; +$lang['search_fragment_o_ends_with'] = '结尾为'; +$lang['search_fragment_o_contains'] = '包含'; +$lang['trustedproxy'] = '信任转发代理与其正则表达式有关系,显示的是真实的客户端IP。默认匹配本地网络。留空则不选择任何代理。'; +$lang['_feature_flags'] = '功能标志'; +$lang['defer_js'] = '推迟在页面HTML解析后执行的JavaScript。提高了页面的感知速度,但可能会破坏少量插件。'; +$lang['hidewarnings'] = '不显示 PHP 发出的任何警告。这可以简化到 PHP8+ 的转换。警告仍将记录在错误日志中,并应报告。'; +$lang['dnslookups'] = 'DokuWiki 将会查询用户编辑页面的远程 IP 地址的主机名。如果您的 DNS 服务器比较缓慢或者不工作,或者您不想要这个功能,请禁用此选项。'; +$lang['jquerycdn'] = 'jQuery和jQuery UI脚本文件应该从CDN加载吗? +这会增加额外的HTTP请求,但文件加载可能会更快,且用户可能已经缓存过。'; +$lang['jquerycdn_o_0'] = '不使用CDN,只使用本地库'; +$lang['jquerycdn_o_jquery'] = 'code.jquery.com 的 CDN'; +$lang['jquerycdn_o_cdnjs'] = 'cdnjs.com 的 CDN'; +$lang['proxy____host'] = '代理服务器的名称'; +$lang['proxy____port'] = '代理服务器的端口'; +$lang['proxy____user'] = '代理服务器的用户名'; +$lang['proxy____pass'] = '代理服务器的密码'; +$lang['proxy____ssl'] = '使用 SSL 连接到代理服务器'; +$lang['proxy____except'] = '用来匹配代理应跳过的地址的正则表达式。'; +$lang['license_o_'] = '什么都没有选'; +$lang['typography_o_0'] = '无'; +$lang['typography_o_1'] = '仅限双引号'; +$lang['typography_o_2'] = '所有引号(不一定能正常运行)'; +$lang['userewrite_o_0'] = '无'; +$lang['userewrite_o_1'] = '.htaccess'; +$lang['userewrite_o_2'] = 'DokuWiki 内部控制'; +$lang['deaccent_o_0'] = '关闭'; +$lang['deaccent_o_1'] = '移除重音符号'; +$lang['deaccent_o_2'] = '用罗马字拼写'; +$lang['gdlib_o_0'] = 'GD 库不可用'; +$lang['gdlib_o_1'] = '1.x 版'; +$lang['gdlib_o_2'] = '自动检测'; +$lang['rss_type_o_rss'] = 'RSS 0.91'; +$lang['rss_type_o_rss1'] = 'RSS 1.0'; +$lang['rss_type_o_rss2'] = 'RSS 2.0'; +$lang['rss_type_o_atom'] = 'Atom 0.3'; +$lang['rss_type_o_atom1'] = 'Atom 1.0'; +$lang['rss_content_o_abstract'] = '摘要'; +$lang['rss_content_o_diff'] = '统一差异'; +$lang['rss_content_o_htmldiff'] = 'HTML 格式化的差异表'; +$lang['rss_content_o_html'] = '完整的 hTML 页面内容'; +$lang['rss_linkto_o_diff'] = '差别查看'; +$lang['rss_linkto_o_page'] = '已修订的页面'; +$lang['rss_linkto_o_rev'] = '修订列表'; +$lang['rss_linkto_o_current'] = '当前页面'; +$lang['compression_o_0'] = '无'; +$lang['compression_o_gz'] = 'gzip'; +$lang['compression_o_bz2'] = 'bz2'; +$lang['xsendfile_o_0'] = '不要使用'; +$lang['xsendfile_o_1'] = '专有 lighttpd 头(1.5 发布前)'; +$lang['xsendfile_o_2'] = '标准 X-Sendfile 头'; +$lang['xsendfile_o_3'] = '专有 Nginx X-Accel-Redirect 头'; +$lang['showuseras_o_loginname'] = '登录名'; +$lang['showuseras_o_username'] = '用户全名'; +$lang['showuseras_o_username_link'] = '使用用户全名作为维基内的用户链接'; +$lang['showuseras_o_email'] = '用户的电子邮箱(按邮箱保护设置加扰)'; +$lang['showuseras_o_email_link'] = '以mailto:形式显示用户的电子邮箱'; +$lang['useheading_o_0'] = '从不'; +$lang['useheading_o_navigation'] = '仅限导航'; +$lang['useheading_o_content'] = '仅限维基内容内'; +$lang['useheading_o_1'] = '一直'; +$lang['readdircache'] = 'readdir缓存的最长寿命(秒)'; diff --git a/lib/plugins/config/plugin.info.txt b/lib/plugins/config/plugin.info.txt new file mode 100644 index 0000000..05e879c --- /dev/null +++ b/lib/plugins/config/plugin.info.txt @@ -0,0 +1,7 @@ +base config +author Christopher Smith +email chris@jalakai.co.uk +date 2015-07-18 +name Configuration Manager +desc Manage Dokuwiki's Configuration Settings +url https://dokuwiki.org/plugin:config diff --git a/lib/plugins/config/settings/config.metadata.php b/lib/plugins/config/settings/config.metadata.php new file mode 100644 index 0000000..2935fb7 --- /dev/null +++ b/lib/plugins/config/settings/config.metadata.php @@ -0,0 +1,264 @@ +] = array(, => ); + * + * is the handler class name without the "setting_" prefix + * + * Defined classes (see core/Setting/*): + * Generic + * ------------------------------------------- + * '' - default class ('setting'), textarea, minimal input validation, setting output in quotes + * 'string' - single line text input, minimal input validation, setting output in quotes + * 'numeric' - text input, accepts numbers and arithmetic operators, setting output without quotes + * if given the '_min' and '_max' parameters are used for validation + * 'numericopt' - like above, but accepts empty values + * 'onoff' - checkbox input, setting output 0|1 + * 'multichoice' - select input (single choice), setting output with quotes, required _choices parameter + * 'email' - text input, input must conform to email address format, supports optional '_multiple' + * parameter for multiple comma separated email addresses + * 'password' - password input, minimal input validation, setting output text in quotes, maybe encoded + * according to the _code parameter + * 'dirchoice' - as multichoice, selection choices based on folders found at location specified in _dir + * parameter (required). A pattern can be used to restrict the folders to only those which + * match the pattern. + * 'multicheckbox'- a checkbox for each choice plus an "other" string input, config file setting is a comma + * separated list of checked choices + * 'fieldset' - used to group configuration settings, but is not itself a setting. To make this clear in + * the language files the keys for this type should start with '_'. + * 'array' - a simple (one dimensional) array of string values, shown as comma separated list in the + * config manager but saved as PHP array(). Values may not contain commas themselves. + * _pattern matching on the array values supported. + * 'regex' - regular expression string, normally without delimiters; as for string, in addition tested + * to see if will compile & run as a regex. in addition to _pattern, also accepts _delimiter + * (default '/') and _pregflags (default 'ui') + * + * Single Setting + * ------------------------------------------------- + * 'savedir' - as 'setting', input tested against initpath() (inc/init.php) + * 'sepchar' - as multichoice, selection constructed from string of valid values + * 'authtype' - as 'setting', input validated against a valid php file at expected location for auth files + * 'im_convert' - as 'setting', input must exist and be an im_convert module + * 'disableactions' - as 'setting' + * 'compression' - no additional parameters. checks php installation supports possible compression alternatives + * 'licence' - as multichoice, selection constructed from licence strings in language files + * 'renderer' - as multichoice, selection constructed from enabled renderer plugins which canRender() + * 'authtype' - as multichoice, selection constructed from the enabled auth plugins + * + * Any setting commented or missing will use 'setting' class - text input, minimal validation, quoted output + * + * Defined parameters: + * '_caution' - no value (default) or 'warning', 'danger', 'security'. display an alert along with the setting + * '_pattern' - string, a preg pattern. input is tested against this pattern before being accepted + * optional all classes, except onoff & multichoice which ignore it + * '_choices' - array of choices. used to populate a selection box. choice will be replaced by a localised + * language string, indexed by _o_, if one exists + * required by 'multichoice' & 'multicheckbox' classes, ignored by others + * '_dir' - location of directory to be used to populate choice list + * required by 'dirchoice' class, ignored by other classes + * '_combine' - complimentary output setting values which can be combined into a single display checkbox + * optional for 'multicheckbox', ignored by other classes + * '_code' - encoding method to use, accepted values: 'base64','uuencode','plain'. defaults to plain. + * '_min' - minimum numeric value, optional for 'numeric' and 'numericopt', ignored by others + * '_max' - maximum numeric value, optional for 'numeric' and 'numericopt', ignored by others + * '_delimiter' - string, default '/', a single character used as a delimiter for testing regex input values + * '_pregflags' - string, default 'ui', valid preg pattern modifiers used when testing regex input values, for more + * information see http://php.net/manual/en/reference.pcre.pattern.modifiers.php + * '_multiple' - bool, allow multiple comma separated email values; optional for 'email', ignored by others + * '_other' - how to handle other values (not listed in _choices). accepted values: 'always','exists','never' + * default value 'always'. 'exists' only shows 'other' input field when the setting contains value(s) + * not listed in choices (e.g. due to manual editing or update changing _choices). This is safer than + * 'never' as it will not discard unknown/other values. + * optional for 'multicheckbox', ignored by others + * + * The order of the settings influences the order in which they apppear in the config manager + * + * @author Chris Smith + */ + +$meta['_basic'] = ['fieldset']; +$meta['title'] = ['string']; +$meta['start'] = ['string', '_caution' => 'warning', '_pattern' => '!^[^:;/]+$!']; // don't accept namespaces +$meta['lang'] = ['dirchoice', '_dir' => DOKU_INC . 'inc/lang/']; +$meta['template'] = ['dirchoice', '_dir' => DOKU_INC . 'lib/tpl/', '_pattern' => '/^[\w-]+$/']; +$meta['tagline'] = ['string']; +$meta['sidebar'] = ['string']; +$meta['license'] = ['license']; +$meta['savedir'] = ['savedir', '_caution' => 'danger']; +$meta['basedir'] = ['string', '_caution' => 'danger']; +$meta['baseurl'] = ['string', '_caution' => 'danger']; +$meta['cookiedir'] = ['string', '_caution' => 'danger']; +$meta['dmode'] = ['numeric', '_pattern' => '/0[0-7]{3,4}/']; // only accept octal representation +$meta['fmode'] = ['numeric', '_pattern' => '/0[0-7]{3,4}/']; // only accept octal representation +$meta['allowdebug'] = ['onoff', '_caution' => 'security']; + +$meta['_display'] = ['fieldset']; +$meta['recent'] = ['numeric']; +$meta['recent_days'] = ['numeric']; +$meta['breadcrumbs'] = ['numeric', '_min' => 0]; +$meta['youarehere'] = ['onoff']; +$meta['fullpath'] = ['onoff', '_caution' => 'security']; +$meta['typography'] = ['multichoice', '_choices' => [0, 1, 2]]; +$meta['dformat'] = ['string']; +$meta['signature'] = ['string']; +$meta['showuseras'] = ['multichoice', '_choices' => ['loginname', 'username', 'username_link', 'email', 'email_link']]; +$meta['toptoclevel'] = ['multichoice', '_choices' => [1, 2, 3, 4, 5]]; // 5 toc levels +$meta['tocminheads'] = ['multichoice', '_choices' => [0, 1, 2, 3, 4, 5, 10, 15, 20]]; +$meta['maxtoclevel'] = ['multichoice', '_choices' => [0, 1, 2, 3, 4, 5]]; +$meta['maxseclevel'] = ['multichoice', '_choices' => [0, 1, 2, 3, 4, 5]]; // 0 for no sec edit buttons +$meta['camelcase'] = ['onoff', '_caution' => 'warning']; +$meta['deaccent'] = ['multichoice', '_choices' => [0, 1, 2], '_caution' => 'warning']; +$meta['useheading'] = ['multichoice', '_choices' => [0, 'navigation', 'content', 1]]; +$meta['sneaky_index'] = ['onoff']; +$meta['hidepages'] = ['regex']; + +$meta['_authentication'] = ['fieldset']; +$meta['useacl'] = ['onoff', '_caution' => 'danger']; +$meta['autopasswd'] = ['onoff']; +$meta['authtype'] = ['authtype', '_caution' => 'danger']; +$meta['passcrypt'] = ['multichoice', + '_choices' => [ + 'smd5', + 'md5', + 'apr1', + 'sha1', + 'ssha', + 'lsmd5', + 'crypt', + 'mysql', + 'my411', + 'kmd5', + 'pmd5', + 'hmd5', + 'mediawiki', + 'bcrypt', + 'djangomd5', + 'djangosha1', + 'djangopbkdf2_sha1', + 'djangopbkdf2_sha256', + 'sha512', + 'argon2i', + 'argon2id'] +]; +$meta['defaultgroup'] = ['string']; +$meta['superuser'] = ['string', '_caution' => 'danger']; +$meta['manager'] = ['string']; +$meta['profileconfirm'] = ['onoff']; +$meta['rememberme'] = ['onoff']; +$meta['disableactions'] = ['disableactions', + '_choices' => [ + 'backlink', + 'index', + 'recent', + 'revisions', + 'search', + 'subscription', + 'register', + 'resendpwd', + 'profile', + 'profile_delete', + 'edit', + 'wikicode', + 'check', + 'rss' + ], + '_combine' => [ + 'subscription' => ['subscribe', 'unsubscribe'], + 'wikicode' => ['source', 'export_raw'] + ] +]; +$meta['auth_security_timeout'] = ['numeric']; +$meta['securecookie'] = ['onoff']; +$meta['samesitecookie'] = ['multichoice', '_choices' => ['', 'Lax', 'Strict', 'None']]; +$meta['remote'] = ['onoff', '_caution' => 'security']; +$meta['remoteuser'] = ['string']; +$meta['remotecors'] = ['string', '_caution' => 'security']; + +$meta['_anti_spam'] = ['fieldset']; +$meta['usewordblock'] = ['onoff']; +$meta['relnofollow'] = ['onoff']; +$meta['indexdelay'] = ['numeric']; +$meta['mailguard'] = ['multichoice', '_choices' => ['visible', 'hex', 'none']]; +$meta['iexssprotect'] = ['onoff', '_caution' => 'security']; + +$meta['_editing'] = ['fieldset']; +$meta['usedraft'] = ['onoff']; +$meta['locktime'] = ['numeric']; +$meta['cachetime'] = ['numeric']; + +$meta['_links'] = ['fieldset']; +$meta['target____wiki'] = ['string']; +$meta['target____interwiki'] = ['string']; +$meta['target____extern'] = ['string']; +$meta['target____media'] = ['string']; +$meta['target____windows'] = ['string']; + +$meta['_media'] = ['fieldset']; +$meta['mediarevisions'] = ['onoff']; +$meta['gdlib'] = ['multichoice', '_choices' => [0, 1, 2]]; +$meta['im_convert'] = ['im_convert']; +$meta['jpg_quality'] = ['numeric', '_pattern' => '/^100$|^[1-9]?\d$/']; //(0-100) +$meta['fetchsize'] = ['numeric']; +$meta['refcheck'] = ['onoff']; + +$meta['_notifications'] = ['fieldset']; +$meta['subscribers'] = ['onoff']; +$meta['subscribe_time'] = ['numeric']; +$meta['notify'] = ['email', '_multiple' => true]; +$meta['registernotify'] = ['email', '_multiple' => true]; +$meta['mailfrom'] = ['email', '_placeholders' => true]; +$meta['mailreturnpath'] = ['email', '_placeholders' => true]; +$meta['mailprefix'] = ['string']; +$meta['htmlmail'] = ['onoff']; +$meta['dontlog'] = ['disableactions', '_choices' => ['error', 'debug', 'deprecated']]; +$meta['logretain'] = ['numeric', '_min' => 0, '_pattern' => '/^\d+$/']; + +$meta['_syndication'] = ['fieldset']; +$meta['sitemap'] = ['numeric']; +$meta['rss_type'] = ['multichoice', '_choices' => ['rss', 'rss1', 'rss2', 'atom', 'atom1']]; +$meta['rss_linkto'] = ['multichoice', '_choices' => ['diff', 'page', 'rev', 'current']]; +$meta['rss_content'] = ['multichoice', '_choices' => ['abstract', 'diff', 'htmldiff', 'html']]; +$meta['rss_media'] = ['multichoice', '_choices' => ['both', 'pages', 'media']]; +$meta['rss_update'] = ['numeric']; +$meta['rss_show_summary'] = ['onoff']; +$meta['rss_show_deleted'] = ['onoff']; + +$meta['_advanced'] = ['fieldset']; +$meta['updatecheck'] = ['onoff']; +$meta['userewrite'] = ['multichoice', '_choices' => [0, 1, 2], '_caution' => 'danger']; +$meta['useslash'] = ['onoff']; +$meta['sepchar'] = ['sepchar', '_caution' => 'warning']; +$meta['canonical'] = ['onoff']; +$meta['fnencode'] = ['multichoice', '_choices' => ['url', 'safe', 'utf-8'], '_caution' => 'warning']; +$meta['autoplural'] = ['onoff']; +$meta['compress'] = ['onoff']; +$meta['cssdatauri'] = ['numeric', '_pattern' => '/^\d+$/']; +$meta['gzip_output'] = ['onoff']; +$meta['send404'] = ['onoff']; +$meta['compression'] = ['compression', '_caution' => 'warning']; +$meta['broken_iua'] = ['onoff']; +$meta['xsendfile'] = ['multichoice', '_choices' => [0, 1, 2, 3], '_caution' => 'warning']; +$meta['renderer_xhtml'] = ['renderer', '_format' => 'xhtml', '_choices' => ['xhtml'], '_caution' => 'warning']; +$meta['readdircache'] = ['numeric']; +$meta['search_nslimit'] = ['numeric', '_min' => 0]; +$meta['search_fragment'] = ['multichoice', '_choices' => ['exact', 'starts_with', 'ends_with', 'contains']]; +$meta['trustedproxy'] = ['regex']; + +$meta['_feature_flags'] = ['fieldset']; +$meta['defer_js'] = ['onoff']; +$meta['hidewarnings'] = ['onoff']; + +$meta['_network'] = ['fieldset']; +$meta['dnslookups'] = ['onoff']; +$meta['jquerycdn'] = ['multichoice', '_choices' => [0, 'jquery', 'cdnjs']]; +$meta['proxy____host'] = ['string', '_pattern' => '#^(|[a-z0-9\-\.+]+)$#i']; +$meta['proxy____port'] = ['numericopt']; +$meta['proxy____user'] = ['string']; +$meta['proxy____pass'] = ['password', '_code' => 'base64']; +$meta['proxy____ssl'] = ['onoff']; +$meta['proxy____except'] = ['string']; diff --git a/lib/plugins/config/style.css b/lib/plugins/config/style.css new file mode 100644 index 0000000..054021e --- /dev/null +++ b/lib/plugins/config/style.css @@ -0,0 +1,167 @@ +/* plugin:configmanager */ +#config__manager div.success, +#config__manager div.error, +#config__manager div.info { + background-position: 0.5em; + padding: 0.5em; + text-align: center; +} + +#config__manager fieldset { + margin: 1em; + width: auto; + margin-bottom: 2em; + background-color: __background_alt__; + color: __text__; + padding: 0 1em; +} +[dir=rtl] #config__manager fieldset { + clear: both; +} +#config__manager legend { + font-size: 1.25em; +} + +#config__manager form { } +#config__manager table { + margin: 1em 0; + width: 100%; +} + +#config__manager fieldset td { + text-align: left; +} +[dir=rtl] #config__manager fieldset td { + text-align: right; +} +#config__manager fieldset td.value { + /* fixed data column width */ + width: 31em; +} + +[dir=rtl] #config__manager label { + text-align: right; +} +[dir=rtl] #config__manager td.value input.checkbox { + float: right; + padding-left: 0; + padding-right: 0.7em; +} +[dir=rtl] #config__manager td.value label { + float: left; +} + +#config__manager td.label { + padding: 0.8em 0 0.6em 1em; + vertical-align: top; +} +[dir=rtl] #config__manager td.label { + padding: 0.8em 1em 0.6em 0; +} + +#config__manager td.label label { + clear: left; + display: block; +} +[dir=rtl] #config__manager td.label label { + clear: right; +} +#config__manager td.label img { + padding: 0 10px; + vertical-align: middle; + float: right; +} +[dir=rtl] #config__manager td.label img { + float: left; +} + +#config__manager td.label span.outkey { + font-size: 70%; + margin-top: -1.7em; + margin-left: -1em; + display: block; + background-color: __background__; + color: __text_neu__; + float: left; + padding: 0 0.1em; + position: relative; + z-index: 1; +} +[dir=rtl] #config__manager td.label span.outkey { + float: right; + margin-right: 1em; +} + +#config__manager td input.edit { + width: 30em; +} +#config__manager td .input { + width: 30.8em; +} +#config__manager td select.edit { } +#config__manager td textarea.edit { + width: 27.5em; + height: 4em; +} + +#config__manager td textarea.edit:focus { + height: 10em; +} + +#config__manager tr .input, +#config__manager tr input, +#config__manager tr textarea, +#config__manager tr select { + background-color: #fff; + color: #000; +} + +#config__manager tr.default .input, +#config__manager tr.default input, +#config__manager tr.default textarea, +#config__manager tr.default select, +#config__manager .selectiondefault { + background-color: #ccddff; + color: #000; +} + +#config__manager tr.protected .input, +#config__manager tr.protected input, +#config__manager tr.protected textarea, +#config__manager tr.protected select, +#config__manager tr.protected .selection { + background-color: #ffcccc!important; + color: #000 !important; +} + +#config__manager td.error { background-color: red; color: #000; } + +#config__manager .selection { + width: 14.8em; + float: left; + margin: 0 0.3em 2px 0; +} +[dir=rtl] #config__manager .selection { + width: 14.8em; + float: right; + margin: 0 0 2px 0.3em; +} + +#config__manager .selection label { + float: right; + width: 14em; + font-size: 90%; +} + + +#config__manager .other { + clear: both; + padding-top: 0.5em; +} + +#config__manager .other label { + padding-left: 2px; + font-size: 90%; +} + +/* end plugin:configmanager */ diff --git a/lib/plugins/extension/action.php b/lib/plugins/extension/action.php new file mode 100644 index 0000000..116208a --- /dev/null +++ b/lib/plugins/extension/action.php @@ -0,0 +1,90 @@ + + */ +class action_plugin_extension extends ActionPlugin +{ + /** + * Registers a callback function for a given event + * + * @param EventHandler $controller DokuWiki's event controller object + * @return void + */ + public function register(EventHandler $controller) + { + $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'info'); + } + + /** + * Create the detail info for a single plugin + * + * @param Event $event + * @param $param + */ + public function info(Event $event, $param) + { + global $USERINFO; + global $INPUT; + + if ($event->data != 'plugin_extension') return; + $event->preventDefault(); + $event->stopPropagation(); + + /** @var admin_plugin_extension $admin */ + $admin = plugin_load('admin', 'extension'); + if (!$admin->isAccessibleByCurrentUser()) { + http_status(403); + echo 'Forbidden'; + exit; + } + + $ext = $INPUT->str('ext'); + if (!$ext) { + http_status(400); + echo 'no extension given'; + return; + } + + /** @var helper_plugin_extension_extension $extension */ + $extension = plugin_load('helper', 'extension_extension'); + $extension->setExtension($ext); + + $act = $INPUT->str('act'); + switch ($act) { + case 'enable': + case 'disable': + if (getSecurityToken() != $INPUT->str('sectok')) { + http_status(403); + echo 'Security Token did not match. Possible CSRF attack.'; + return; + } + + $extension->$act(); //enables/disables + $reverse = ($act == 'disable') ? 'enable' : 'disable'; + + $return = [ + 'state' => $act . 'd', // isn't English wonderful? :-) + 'reverse' => $reverse, + 'label' => $extension->getLang('btn_' . $reverse), + ]; + + header('Content-Type: application/json'); + echo json_encode($return, JSON_THROW_ON_ERROR); + break; + + case 'info': + default: + /** @var helper_plugin_extension_list $list */ + $list = plugin_load('helper', 'extension_list'); + header('Content-Type: text/html; charset=utf-8'); + echo $list->makeInfo($extension); + } + } +} diff --git a/lib/plugins/extension/admin.php b/lib/plugins/extension/admin.php new file mode 100644 index 0000000..9dad127 --- /dev/null +++ b/lib/plugins/extension/admin.php @@ -0,0 +1,188 @@ + + */ + +/** + * Admin part of the extension manager + */ +class admin_plugin_extension extends AdminPlugin +{ + protected $infoFor; + /** @var helper_plugin_extension_gui */ + protected $gui; + + /** + * Constructor + * + * loads additional helpers + */ + public function __construct() + { + $this->gui = plugin_load('helper', 'extension_gui'); + } + + /** + * @return int sort number in admin menu + */ + public function getMenuSort() + { + return 0; + } + + /** + * @return bool true if only access for superuser, false is for superusers and moderators + */ + public function forAdminOnly() + { + return true; + } + + /** + * Execute the requested action(s) and initialize the plugin repository + */ + public function handle() + { + global $INPUT; + // initialize the remote repository + /* @var helper_plugin_extension_repository $repository */ + $repository = $this->loadHelper('extension_repository'); + + if (!$repository->hasAccess(!$INPUT->bool('purge'))) { + $url = $this->gui->tabURL('', ['purge' => 1], '&'); + msg($this->getLang('repo_error') . + ' [' . $this->getLang('repo_retry') . ']', -1); + } + + if (!in_array('ssl', stream_get_transports())) { + msg($this->getLang('nossl'), -1); + } + + /* @var helper_plugin_extension_extension $extension */ + $extension = $this->loadHelper('extension_extension'); + + try { + if ($INPUT->post->has('fn') && checkSecurityToken()) { + $actions = $INPUT->post->arr('fn'); + foreach ($actions as $action => $extensions) { + foreach ($extensions as $extname => $label) { + switch ($action) { + case 'install': + case 'reinstall': + case 'update': + $extension->setExtension($extname); + $installed = $extension->installOrUpdate(); + foreach ($installed as $info) { + msg(sprintf( + $this->getLang('msg_' . $info['type'] . '_' . $info['action'] . '_success'), + $info['base'] + ), 1); + } + break; + case 'uninstall': + $extension->setExtension($extname); + $status = $extension->uninstall(); + if ($status) { + msg(sprintf( + $this->getLang('msg_delete_success'), + hsc($extension->getDisplayName()) + ), 1); + } else { + msg(sprintf( + $this->getLang('msg_delete_failed'), + hsc($extension->getDisplayName()) + ), -1); + } + break; + case 'enable': + $extension->setExtension($extname); + $status = $extension->enable(); + if ($status !== true) { + msg($status, -1); + } else { + msg(sprintf( + $this->getLang('msg_enabled'), + hsc($extension->getDisplayName()) + ), 1); + } + break; + case 'disable': + $extension->setExtension($extname); + $status = $extension->disable(); + if ($status !== true) { + msg($status, -1); + } else { + msg(sprintf( + $this->getLang('msg_disabled'), + hsc($extension->getDisplayName()) + ), 1); + } + break; + } + } + } + send_redirect($this->gui->tabURL('', [], '&', true)); + } elseif ($INPUT->post->str('installurl') && checkSecurityToken()) { + $installed = $extension->installFromURL( + $INPUT->post->str('installurl'), + $INPUT->post->bool('overwrite') + ); + foreach ($installed as $info) { + msg(sprintf( + $this->getLang('msg_' . $info['type'] . '_' . $info['action'] . '_success'), + $info['base'] + ), 1); + } + send_redirect($this->gui->tabURL('', [], '&', true)); + } elseif (isset($_FILES['installfile']) && checkSecurityToken()) { + $installed = $extension->installFromUpload('installfile', $INPUT->post->bool('overwrite')); + foreach ($installed as $info) { + msg(sprintf( + $this->getLang('msg_' . $info['type'] . '_' . $info['action'] . '_success'), + $info['base'] + ), 1); + } + send_redirect($this->gui->tabURL('', [], '&', true)); + } + } catch (Exception $e) { + msg($e->getMessage(), -1); + send_redirect($this->gui->tabURL('', [], '&', true)); + } + } + + /** + * Render HTML output + */ + public function html() + { + echo '

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

    ' . DOKU_LF; + echo '
    ' . DOKU_LF; + + $this->gui->tabNavigation(); + + switch ($this->gui->currentTab()) { + case 'search': + $this->gui->tabSearch(); + break; + case 'templates': + $this->gui->tabTemplates(); + break; + case 'install': + $this->gui->tabInstall(); + break; + case 'plugins': + default: + $this->gui->tabPlugins(); + } + + echo '
    ' . DOKU_LF; + } +} + +// vim:ts=4:sw=4:et: diff --git a/lib/plugins/extension/admin.svg b/lib/plugins/extension/admin.svg new file mode 100644 index 0000000..6bd7c0d --- /dev/null +++ b/lib/plugins/extension/admin.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/plugins/extension/all.less b/lib/plugins/extension/all.less new file mode 100644 index 0000000..3d9688e --- /dev/null +++ b/lib/plugins/extension/all.less @@ -0,0 +1,37 @@ + +@media only screen and (max-width: 600px) { + +#extension__list .legend { + > div { + padding-left: 0; + } + + div.screenshot { + margin: 0 .5em .5em 0; + } + + h2 { + width: auto; + float: none; + } + + div.linkbar { + clear: left; + } +} + +[dir=rtl] #extension__list .legend { + > div { + padding-right: 0; + } + + div.screenshot { + margin: 0 0 .5em .5em; + } + + div.linkbar { + clear: right; + } +} + +} /* /@media */ diff --git a/lib/plugins/extension/cli.php b/lib/plugins/extension/cli.php new file mode 100644 index 0000000..019b8d6 --- /dev/null +++ b/lib/plugins/extension/cli.php @@ -0,0 +1,392 @@ + + */ +class cli_plugin_extension extends CLIPlugin +{ + /** @inheritdoc */ + protected function setup(Options $options) + { + // general setup + $options->setHelp( + "Manage plugins and templates for this DokuWiki instance\n\n" . + "Status codes:\n" . + " i - installed\n" . + " b - bundled with DokuWiki\n" . + " g - installed via git\n" . + " d - disabled\n" . + " u - update available\n" + ); + + // search + $options->registerCommand('search', 'Search for an extension'); + $options->registerOption('max', 'Maximum number of results (default 10)', 'm', 'number', 'search'); + $options->registerOption('verbose', 'Show detailed extension information', 'v', false, 'search'); + $options->registerArgument('query', 'The keyword(s) to search for', true, 'search'); + + // list + $options->registerCommand('list', 'List installed extensions'); + $options->registerOption('verbose', 'Show detailed extension information', 'v', false, 'list'); + $options->registerOption('filter', 'Filter by this status', 'f', 'status', 'list'); + + // upgrade + $options->registerCommand('upgrade', 'Update all installed extensions to their latest versions'); + + // install + $options->registerCommand('install', 'Install or upgrade extensions'); + $options->registerArgument( + 'extensions...', + 'One or more extensions to install. Either by name or download URL', + true, + 'install' + ); + + // uninstall + $options->registerCommand('uninstall', 'Uninstall a new extension'); + $options->registerArgument('extensions...', 'One or more extensions to install', true, 'uninstall'); + + // enable + $options->registerCommand('enable', 'Enable installed extensions'); + $options->registerArgument('extensions...', 'One or more extensions to enable', true, 'enable'); + + // disable + $options->registerCommand('disable', 'Disable installed extensions'); + $options->registerArgument('extensions...', 'One or more extensions to disable', true, 'disable'); + } + + /** @inheritdoc */ + protected function main(Options $options) + { + /** @var helper_plugin_extension_repository $repo */ + $repo = plugin_load('helper', 'extension_repository'); + if (!$repo->hasAccess(false)) { + $this->warning('Extension Repository API is not accessible, no remote info available!'); + } + + switch ($options->getCmd()) { + case 'list': + $ret = $this->cmdList($options->getOpt('verbose'), $options->getOpt('filter', '')); + break; + case 'search': + $ret = $this->cmdSearch( + implode(' ', $options->getArgs()), + $options->getOpt('verbose'), + (int)$options->getOpt('max', 10) + ); + break; + case 'install': + $ret = $this->cmdInstall($options->getArgs()); + break; + case 'uninstall': + $ret = $this->cmdUnInstall($options->getArgs()); + break; + case 'enable': + $ret = $this->cmdEnable(true, $options->getArgs()); + break; + case 'disable': + $ret = $this->cmdEnable(false, $options->getArgs()); + break; + case 'upgrade': + $ret = $this->cmdUpgrade(); + break; + default: + echo $options->help(); + $ret = 0; + } + + exit($ret); + } + + /** + * Upgrade all extensions + * + * @return int + */ + protected function cmdUpgrade() + { + /* @var helper_plugin_extension_extension $ext */ + $ext = $this->loadHelper('extension_extension'); + $list = $this->getInstalledExtensions(); + + $ok = 0; + foreach ($list as $extname) { + $ext->setExtension($extname); + $date = $ext->getInstalledVersion(); + $avail = $ext->getLastUpdate(); + if ($avail && $avail > $date && !$ext->isBundled()) { + $ok += $this->cmdInstall([$extname]); + } + } + + return $ok; + } + + /** + * Enable or disable one or more extensions + * + * @param bool $set + * @param string[] $extensions + * @return int + */ + protected function cmdEnable($set, $extensions) + { + /* @var helper_plugin_extension_extension $ext */ + $ext = $this->loadHelper('extension_extension'); + + $ok = 0; + foreach ($extensions as $extname) { + $ext->setExtension($extname); + if (!$ext->isInstalled()) { + $this->error(sprintf('Extension %s is not installed', $ext->getID())); + ++$ok; + continue; + } + + if ($set) { + $status = $ext->enable(); + $msg = 'msg_enabled'; + } else { + $status = $ext->disable(); + $msg = 'msg_disabled'; + } + + if ($status !== true) { + $this->error($status); + ++$ok; + continue; + } else { + $this->success(sprintf($this->getLang($msg), $ext->getID())); + } + } + + return $ok; + } + + /** + * Uninstall one or more extensions + * + * @param string[] $extensions + * @return int + */ + protected function cmdUnInstall($extensions) + { + /* @var helper_plugin_extension_extension $ext */ + $ext = $this->loadHelper('extension_extension'); + + $ok = 0; + foreach ($extensions as $extname) { + $ext->setExtension($extname); + if (!$ext->isInstalled()) { + $this->error(sprintf('Extension %s is not installed', $ext->getID())); + ++$ok; + continue; + } + + $status = $ext->uninstall(); + if ($status) { + $this->success(sprintf($this->getLang('msg_delete_success'), $ext->getID())); + } else { + $this->error(sprintf($this->getLang('msg_delete_failed'), hsc($ext->getID()))); + $ok = 1; + } + } + + return $ok; + } + + /** + * Install one or more extensions + * + * @param string[] $extensions + * @return int + */ + protected function cmdInstall($extensions) + { + /* @var helper_plugin_extension_extension $ext */ + $ext = $this->loadHelper('extension_extension'); + + $ok = 0; + foreach ($extensions as $extname) { + $installed = []; + + if (preg_match("/^https?:\/\//i", $extname)) { + try { + $installed = $ext->installFromURL($extname, true); + } catch (Exception $e) { + $this->error($e->getMessage()); + ++$ok; + } + } else { + $ext->setExtension($extname); + + if (!$ext->getDownloadURL()) { + ++$ok; + $this->error( + sprintf('Could not find download for %s', $ext->getID()) + ); + continue; + } + + try { + $installed = $ext->installOrUpdate(); + } catch (Exception $e) { + $this->error($e->getMessage()); + ++$ok; + } + } + + foreach ($installed as $info) { + $this->success( + sprintf( + $this->getLang('msg_' . $info['type'] . '_' . $info['action'] . '_success'), + $info['base'] + ) + ); + } + } + return $ok; + } + + /** + * Search for an extension + * + * @param string $query + * @param bool $showdetails + * @param int $max + * @return int + * @throws Exception + */ + protected function cmdSearch($query, $showdetails, $max) + { + /** @var helper_plugin_extension_repository $repository */ + $repository = $this->loadHelper('extension_repository'); + $result = $repository->search($query); + if ($max) { + $result = array_slice($result, 0, $max); + } + + $this->listExtensions($result, $showdetails); + return 0; + } + + /** + * @param bool $showdetails + * @param string $filter + * @return int + * @throws Exception + */ + protected function cmdList($showdetails, $filter) + { + $list = $this->getInstalledExtensions(); + $this->listExtensions($list, $showdetails, $filter); + + return 0; + } + + /** + * Get all installed extensions + * + * @return array + */ + protected function getInstalledExtensions() + { + /** @var Doku_Plugin_Controller $plugin_controller */ + global $plugin_controller; + $pluginlist = $plugin_controller->getList('', true); + $tpllist = glob(DOKU_INC . 'lib/tpl/*', GLOB_ONLYDIR); + $tpllist = array_map(static fn($path) => 'template:' . basename($path), $tpllist); + + $list = array_merge($pluginlist, $tpllist); + sort($list); + return $list; + } + + /** + * List the given extensions + * + * @param string[] $list + * @param bool $details display details + * @param string $filter filter for this status + * @throws Exception + */ + protected function listExtensions($list, $details, $filter = '') + { + /** @var helper_plugin_extension_extension $ext */ + $ext = $this->loadHelper('extension_extension'); + $tr = new TableFormatter($this->colors); + + + foreach ($list as $name) { + $ext->setExtension($name); + + $status = ''; + if ($ext->isInstalled()) { + $date = $ext->getInstalledVersion(); + $avail = $ext->getLastUpdate(); + $status = 'i'; + if ($avail && $avail > $date) { + $vcolor = Colors::C_RED; + $status .= 'u'; + } else { + $vcolor = Colors::C_GREEN; + } + if ($ext->isGitControlled()) $status = 'g'; + if ($ext->isBundled()) $status = 'b'; + if ($ext->isEnabled()) { + $ecolor = Colors::C_BROWN; + } else { + $ecolor = Colors::C_DARKGRAY; + $status .= 'd'; + } + } else { + $ecolor = null; + $date = $ext->getLastUpdate(); + $vcolor = null; + } + + if ($filter && strpos($status, $filter) === false) { + continue; + } + + echo $tr->format( + [20, 3, 12, '*'], + [ + $ext->getID(), + $status, + $date, + strip_tags(sprintf( + $this->getLang('extensionby'), + $ext->getDisplayName(), + $this->colors->wrap($ext->getAuthor(), Colors::C_PURPLE) + )) + ], + [ + $ecolor, + Colors::C_YELLOW, + $vcolor, + null, + ] + ); + + if (!$details) continue; + + echo $tr->format( + [5, '*'], + ['', $ext->getDescription()], + [null, Colors::C_CYAN] + ); + } + } +} diff --git a/lib/plugins/extension/helper/extension.php b/lib/plugins/extension/helper/extension.php new file mode 100644 index 0000000..7757c97 --- /dev/null +++ b/lib/plugins/extension/helper/extension.php @@ -0,0 +1,1320 @@ + + */ + +use dokuwiki\Extension\Plugin; +use dokuwiki\Extension\PluginInterface; +use dokuwiki\Utf8\PhpString; +use splitbrain\PHPArchive\Tar; +use splitbrain\PHPArchive\ArchiveIOException; +use splitbrain\PHPArchive\Zip; +use dokuwiki\HTTP\DokuHTTPClient; +use dokuwiki\Extension\PluginController; + +/** + * Class helper_plugin_extension_extension represents a single extension (plugin or template) + */ +class helper_plugin_extension_extension extends Plugin +{ + private $id; + private $base; + private $is_template = false; + private $localInfo; + private $remoteInfo; + private $managerData; + /** @var helper_plugin_extension_repository $repository */ + private $repository; + + /** @var array list of temporary directories */ + private $temporary = []; + + /** @var string where templates are installed to */ + private $tpllib = ''; + + /** + * helper_plugin_extension_extension constructor. + */ + public function __construct() + { + $this->tpllib = dirname(tpl_incdir()) . '/'; + } + + /** + * Destructor + * + * deletes any dangling temporary directories + */ + public function __destruct() + { + foreach ($this->temporary as $dir) { + io_rmdir($dir, true); + } + } + + /** + * @return bool false, this component is not a singleton + */ + public function isSingleton() + { + return false; + } + + /** + * Set the name of the extension this instance shall represents, triggers loading the local and remote data + * + * @param string $id The id of the extension (prefixed with template: for templates) + * @return bool If some (local or remote) data was found + */ + public function setExtension($id) + { + $id = cleanID($id); + $this->id = $id; + + $this->base = $id; + + if (str_starts_with($id, 'template:')) { + $this->base = substr($id, 9); + $this->is_template = true; + } else { + $this->is_template = false; + } + + $this->localInfo = []; + $this->managerData = []; + $this->remoteInfo = []; + + if ($this->isInstalled()) { + $this->readLocalData(); + $this->readManagerData(); + } + + if ($this->repository == null) { + $this->repository = $this->loadHelper('extension_repository'); + } + + $this->remoteInfo = $this->repository->getData($this->getID()); + + return ($this->localInfo || $this->remoteInfo); + } + + /** + * If the extension is installed locally + * + * @return bool If the extension is installed locally + */ + public function isInstalled() + { + return is_dir($this->getInstallDir()); + } + + /** + * If the extension is under git control + * + * @return bool + */ + public function isGitControlled() + { + if (!$this->isInstalled()) return false; + return file_exists($this->getInstallDir() . '/.git'); + } + + /** + * If the extension is bundled + * + * @return bool If the extension is bundled + */ + public function isBundled() + { + if (!empty($this->remoteInfo['bundled'])) return $this->remoteInfo['bundled']; + return in_array( + $this->id, + [ + 'authad', + 'authldap', + 'authpdo', + 'authplain', + 'acl', + 'config', + 'extension', + 'info', + 'popularity', + 'revert', + 'safefnrecode', + 'styling', + 'testing', + 'usermanager', + 'logviewer', + 'template:dokuwiki' + ] + ); + } + + /** + * If the extension is protected against any modification (disable/uninstall) + * + * @return bool if the extension is protected + */ + public function isProtected() + { + // never allow deinstalling the current auth plugin: + global $conf; + if ($this->id == $conf['authtype']) return true; + + /** @var PluginController $plugin_controller */ + global $plugin_controller; + $cascade = $plugin_controller->getCascade(); + return (isset($cascade['protected'][$this->id]) && $cascade['protected'][$this->id]); + } + + /** + * If the extension is installed in the correct directory + * + * @return bool If the extension is installed in the correct directory + */ + public function isInWrongFolder() + { + return $this->base != $this->getBase(); + } + + /** + * If the extension is enabled + * + * @return bool If the extension is enabled + */ + public function isEnabled() + { + global $conf; + if ($this->isTemplate()) { + return ($conf['template'] == $this->getBase()); + } + + /* @var PluginController $plugin_controller */ + global $plugin_controller; + return $plugin_controller->isEnabled($this->base); + } + + /** + * If the extension should be updated, i.e. if an updated version is available + * + * @return bool If an update is available + */ + public function updateAvailable() + { + if (!$this->isInstalled()) return false; + if ($this->isBundled()) return false; + $lastupdate = $this->getLastUpdate(); + if ($lastupdate === false) return false; + $installed = $this->getInstalledVersion(); + if ($installed === false || $installed === $this->getLang('unknownversion')) return true; + return $this->getInstalledVersion() < $this->getLastUpdate(); + } + + /** + * If the extension is a template + * + * @return bool If this extension is a template + */ + public function isTemplate() + { + return $this->is_template; + } + + /** + * Get the ID of the extension + * + * This is the same as getName() for plugins, for templates it's getName() prefixed with 'template:' + * + * @return string + */ + public function getID() + { + return $this->id; + } + + /** + * Get the name of the installation directory + * + * @return string The name of the installation directory + */ + public function getInstallName() + { + return $this->base; + } + + // Data from plugin.info.txt/template.info.txt or the repo when not available locally + /** + * Get the basename of the extension + * + * @return string The basename + */ + public function getBase() + { + if (!empty($this->localInfo['base'])) return $this->localInfo['base']; + return $this->base; + } + + /** + * Get the display name of the extension + * + * @return string The display name + */ + public function getDisplayName() + { + if (!empty($this->localInfo['name'])) return $this->localInfo['name']; + if (!empty($this->remoteInfo['name'])) return $this->remoteInfo['name']; + return $this->base; + } + + /** + * Get the author name of the extension + * + * @return string|bool The name of the author or false if there is none + */ + public function getAuthor() + { + if (!empty($this->localInfo['author'])) return $this->localInfo['author']; + if (!empty($this->remoteInfo['author'])) return $this->remoteInfo['author']; + return false; + } + + /** + * Get the email of the author of the extension if there is any + * + * @return string|bool The email address or false if there is none + */ + public function getEmail() + { + // email is only in the local data + if (!empty($this->localInfo['email'])) return $this->localInfo['email']; + return false; + } + + /** + * Get the email id, i.e. the md5sum of the email + * + * @return string|bool The md5sum of the email if there is any, false otherwise + */ + public function getEmailID() + { + if (!empty($this->remoteInfo['emailid'])) return $this->remoteInfo['emailid']; + if (!empty($this->localInfo['email'])) return md5($this->localInfo['email']); + return false; + } + + /** + * Get the description of the extension + * + * @return string The description + */ + public function getDescription() + { + if (!empty($this->localInfo['desc'])) return $this->localInfo['desc']; + if (!empty($this->remoteInfo['description'])) return $this->remoteInfo['description']; + return ''; + } + + /** + * Get the URL of the extension, usually a page on dokuwiki.org + * + * @return string The URL + */ + public function getURL() + { + if (!empty($this->localInfo['url'])) return $this->localInfo['url']; + return 'https://www.dokuwiki.org/' . + ($this->isTemplate() ? 'template' : 'plugin') . ':' . $this->getBase(); + } + + /** + * Get the installed version of the extension + * + * @return string|bool The version, usually in the form yyyy-mm-dd if there is any + */ + public function getInstalledVersion() + { + if (!empty($this->localInfo['date'])) return $this->localInfo['date']; + if ($this->isInstalled()) return $this->getLang('unknownversion'); + return false; + } + + /** + * Get the install date of the current version + * + * @return string|bool The date of the last update or false if not available + */ + public function getUpdateDate() + { + if (!empty($this->managerData['updated'])) return $this->managerData['updated']; + return $this->getInstallDate(); + } + + /** + * Get the date of the installation of the plugin + * + * @return string|bool The date of the installation or false if not available + */ + public function getInstallDate() + { + if (!empty($this->managerData['installed'])) return $this->managerData['installed']; + return false; + } + + /** + * Get the names of the dependencies of this extension + * + * @return array The base names of the dependencies + */ + public function getDependencies() + { + if (!empty($this->remoteInfo['dependencies'])) return $this->remoteInfo['dependencies']; + return []; + } + + /** + * Get the names of the missing dependencies + * + * @return array The base names of the missing dependencies + */ + public function getMissingDependencies() + { + /* @var PluginController $plugin_controller */ + global $plugin_controller; + $dependencies = $this->getDependencies(); + $missing_dependencies = []; + foreach ($dependencies as $dependency) { + if (!$plugin_controller->isEnabled($dependency)) { + $missing_dependencies[] = $dependency; + } + } + return $missing_dependencies; + } + + /** + * Get the names of all conflicting extensions + * + * @return array The names of the conflicting extensions + */ + public function getConflicts() + { + if (!empty($this->remoteInfo['conflicts'])) return $this->remoteInfo['conflicts']; + return []; + } + + /** + * Get the names of similar extensions + * + * @return array The names of similar extensions + */ + public function getSimilarExtensions() + { + if (!empty($this->remoteInfo['similar'])) return $this->remoteInfo['similar']; + return []; + } + + /** + * Get the names of the tags of the extension + * + * @return array The names of the tags of the extension + */ + public function getTags() + { + if (!empty($this->remoteInfo['tags'])) return $this->remoteInfo['tags']; + return []; + } + + /** + * Get the popularity information as floating point number [0,1] + * + * @return float|bool The popularity information or false if it isn't available + */ + public function getPopularity() + { + if (!empty($this->remoteInfo['popularity'])) return $this->remoteInfo['popularity']; + return false; + } + + /** + * Get the text of the update message if there is any + * + * @return string|bool The update message if there is any, false otherwise + */ + public function getUpdateMessage() + { + if (!empty($this->remoteInfo['updatemessage'])) return $this->remoteInfo['updatemessage']; + return false; + } + + /** + * Get the text of the security warning if there is any + * + * @return string|bool The security warning if there is any, false otherwise + */ + public function getSecurityWarning() + { + if (!empty($this->remoteInfo['securitywarning'])) return $this->remoteInfo['securitywarning']; + return false; + } + + /** + * Get the text of the security issue if there is any + * + * @return string|bool The security issue if there is any, false otherwise + */ + public function getSecurityIssue() + { + if (!empty($this->remoteInfo['securityissue'])) return $this->remoteInfo['securityissue']; + return false; + } + + /** + * Get the URL of the screenshot of the extension if there is any + * + * @return string|bool The screenshot URL if there is any, false otherwise + */ + public function getScreenshotURL() + { + if (!empty($this->remoteInfo['screenshoturl'])) return $this->remoteInfo['screenshoturl']; + return false; + } + + /** + * Get the URL of the thumbnail of the extension if there is any + * + * @return string|bool The thumbnail URL if there is any, false otherwise + */ + public function getThumbnailURL() + { + if (!empty($this->remoteInfo['thumbnailurl'])) return $this->remoteInfo['thumbnailurl']; + return false; + } + /** + * Get the last used download URL of the extension if there is any + * + * @return string|bool The previously used download URL, false if the extension has been installed manually + */ + public function getLastDownloadURL() + { + if (!empty($this->managerData['downloadurl'])) return $this->managerData['downloadurl']; + return false; + } + + /** + * Get the download URL of the extension if there is any + * + * @return string|bool The download URL if there is any, false otherwise + */ + public function getDownloadURL() + { + if (!empty($this->remoteInfo['downloadurl'])) return $this->remoteInfo['downloadurl']; + return false; + } + + /** + * If the download URL has changed since the last download + * + * @return bool If the download URL has changed + */ + public function hasDownloadURLChanged() + { + $lasturl = $this->getLastDownloadURL(); + $currenturl = $this->getDownloadURL(); + return ($lasturl && $currenturl && $lasturl != $currenturl); + } + + /** + * Get the bug tracker URL of the extension if there is any + * + * @return string|bool The bug tracker URL if there is any, false otherwise + */ + public function getBugtrackerURL() + { + if (!empty($this->remoteInfo['bugtracker'])) return $this->remoteInfo['bugtracker']; + return false; + } + + /** + * Get the URL of the source repository if there is any + * + * @return string|bool The URL of the source repository if there is any, false otherwise + */ + public function getSourcerepoURL() + { + if (!empty($this->remoteInfo['sourcerepo'])) return $this->remoteInfo['sourcerepo']; + return false; + } + + /** + * Get the donation URL of the extension if there is any + * + * @return string|bool The donation URL if there is any, false otherwise + */ + public function getDonationURL() + { + if (!empty($this->remoteInfo['donationurl'])) return $this->remoteInfo['donationurl']; + return false; + } + + /** + * Get the extension type(s) + * + * @return array The type(s) as array of strings + */ + public function getTypes() + { + if (!empty($this->remoteInfo['types'])) return $this->remoteInfo['types']; + if ($this->isTemplate()) return [32 => 'template']; + return []; + } + + /** + * Get a list of all DokuWiki versions this extension is compatible with + * + * @return array The versions in the form yyyy-mm-dd => ('label' => label, 'implicit' => implicit) + */ + public function getCompatibleVersions() + { + if (!empty($this->remoteInfo['compatible'])) return $this->remoteInfo['compatible']; + return []; + } + + /** + * Get the date of the last available update + * + * @return string|bool The last available update in the form yyyy-mm-dd if there is any, false otherwise + */ + public function getLastUpdate() + { + if (!empty($this->remoteInfo['lastupdate'])) return $this->remoteInfo['lastupdate']; + return false; + } + + /** + * Get the base path of the extension + * + * @return string The base path of the extension + */ + public function getInstallDir() + { + if ($this->isTemplate()) { + return $this->tpllib . $this->base; + } else { + return DOKU_PLUGIN . $this->base; + } + } + + /** + * The type of extension installation + * + * @return string One of "none", "manual", "git" or "automatic" + */ + public function getInstallType() + { + if (!$this->isInstalled()) return 'none'; + if (!empty($this->managerData)) return 'automatic'; + if (is_dir($this->getInstallDir() . '/.git')) return 'git'; + return 'manual'; + } + + /** + * If the extension can probably be installed/updated or uninstalled + * + * @return bool|string True or error string + */ + public function canModify() + { + if ($this->isInstalled()) { + if (!is_writable($this->getInstallDir())) { + return 'noperms'; + } + } + + if ($this->isTemplate() && !is_writable($this->tpllib)) { + return 'notplperms'; + } elseif (!is_writable(DOKU_PLUGIN)) { + return 'nopluginperms'; + } + return true; + } + + /** + * Install an extension from a user upload + * + * @param string $field name of the upload file + * @param boolean $overwrite overwrite folder if the extension name is the same + * @throws Exception when something goes wrong + * @return array The list of installed extensions + */ + public function installFromUpload($field, $overwrite = true) + { + if ($_FILES[$field]['error']) { + throw new Exception($this->getLang('msg_upload_failed') . ' (' . $_FILES[$field]['error'] . ')'); + } + + $tmp = $this->mkTmpDir(); + if (!$tmp) throw new Exception($this->getLang('error_dircreate')); + + // filename may contain the plugin name for old style plugins... + $basename = basename($_FILES[$field]['name']); + $basename = preg_replace('/\.(tar\.gz|tar\.bz|tar\.bz2|tar|tgz|tbz|zip)$/', '', $basename); + $basename = preg_replace('/[\W]+/', '', $basename); + + if (!move_uploaded_file($_FILES[$field]['tmp_name'], "$tmp/upload.archive")) { + throw new Exception($this->getLang('msg_upload_failed')); + } + $installed = $this->installArchive("$tmp/upload.archive", $overwrite, $basename); + $this->updateManagerData('', $installed); + $this->removeDeletedfiles($installed); + $this->purgeCache(); + return $installed; + } + + /** + * Install an extension from a remote URL + * + * @param string $url + * @param boolean $overwrite overwrite folder if the extension name is the same + * @throws Exception when something goes wrong + * @return array The list of installed extensions + */ + public function installFromURL($url, $overwrite = true) + { + $path = $this->download($url); + $installed = $this->installArchive($path, $overwrite); + $this->updateManagerData($url, $installed); + $this->removeDeletedfiles($installed); + $this->purgeCache(); + return $installed; + } + + /** + * Install or update the extension + * + * @throws \Exception when something goes wrong + * @return array The list of installed extensions + */ + public function installOrUpdate() + { + $url = $this->getDownloadURL(); + $path = $this->download($url); + $installed = $this->installArchive($path, $this->isInstalled(), $this->getBase()); + $this->updateManagerData($url, $installed); + + // refresh extension information + if (!isset($installed[$this->getID()])) { + throw new Exception('Error, the requested extension hasn\'t been installed or updated'); + } + $this->removeDeletedfiles($installed); + $this->setExtension($this->getID()); + $this->purgeCache(); + return $installed; + } + + /** + * Uninstall the extension + * + * @return bool If the plugin was sucessfully uninstalled + */ + public function uninstall() + { + $this->purgeCache(); + return io_rmdir($this->getInstallDir(), true); + } + + /** + * Enable the extension + * + * @return bool|string True or an error message + */ + public function enable() + { + if ($this->isTemplate()) return $this->getLang('notimplemented'); + if (!$this->isInstalled()) return $this->getLang('notinstalled'); + if ($this->isEnabled()) return $this->getLang('alreadyenabled'); + + /* @var PluginController $plugin_controller */ + global $plugin_controller; + if ($plugin_controller->enable($this->base)) { + $this->purgeCache(); + return true; + } else { + return $this->getLang('pluginlistsaveerror'); + } + } + + /** + * Disable the extension + * + * @return bool|string True or an error message + */ + public function disable() + { + if ($this->isTemplate()) return $this->getLang('notimplemented'); + + /* @var PluginController $plugin_controller */ + global $plugin_controller; + if (!$this->isInstalled()) return $this->getLang('notinstalled'); + if (!$this->isEnabled()) return $this->getLang('alreadydisabled'); + if ($plugin_controller->disable($this->base)) { + $this->purgeCache(); + return true; + } else { + return $this->getLang('pluginlistsaveerror'); + } + } + + /** + * Purge the cache by touching the main configuration file + */ + protected function purgeCache() + { + global $config_cascade; + + // expire dokuwiki caches + // touching local.php expires wiki page, JS and CSS caches + @touch(reset($config_cascade['main']['local'])); + } + + /** + * Read local extension data either from info.txt or getInfo() + */ + protected function readLocalData() + { + if ($this->isTemplate()) { + $infopath = $this->getInstallDir() . '/template.info.txt'; + } else { + $infopath = $this->getInstallDir() . '/plugin.info.txt'; + } + + if (is_readable($infopath)) { + $this->localInfo = confToHash($infopath); + } elseif (!$this->isTemplate() && $this->isEnabled()) { + $path = $this->getInstallDir() . '/'; + $plugin = null; + + foreach (PluginController::PLUGIN_TYPES as $type) { + if (file_exists($path . $type . '.php')) { + $plugin = plugin_load($type, $this->base); + if ($plugin instanceof PluginInterface) break; + } + + if ($dh = @opendir($path . $type . '/')) { + while (false !== ($cp = readdir($dh))) { + if ($cp == '.' || $cp == '..' || !str_ends_with(strtolower($cp), '.php')) continue; + + $plugin = plugin_load($type, $this->base . '_' . substr($cp, 0, -4)); + if ($plugin instanceof PluginInterface) break; + } + if ($plugin instanceof PluginInterface) break; + closedir($dh); + } + } + + if ($plugin instanceof PluginInterface) { + $this->localInfo = $plugin->getInfo(); + } + } + } + + /** + * Save the given URL and current datetime in the manager.dat file of all installed extensions + * + * @param string $url Where the extension was downloaded from. (empty for manual installs via upload) + * @param array $installed Optional list of installed plugins + */ + protected function updateManagerData($url = '', $installed = null) + { + $origID = $this->getID(); + + if (is_null($installed)) { + $installed = [$origID]; + } + + foreach (array_keys($installed) as $ext) { + if ($this->getID() != $ext) $this->setExtension($ext); + if ($url) { + $this->managerData['downloadurl'] = $url; + } elseif (isset($this->managerData['downloadurl'])) { + unset($this->managerData['downloadurl']); + } + if (isset($this->managerData['installed'])) { + $this->managerData['updated'] = date('r'); + } else { + $this->managerData['installed'] = date('r'); + } + $this->writeManagerData(); + } + + if ($this->getID() != $origID) $this->setExtension($origID); + } + + /** + * Read the manager.dat file + */ + protected function readManagerData() + { + $managerpath = $this->getInstallDir() . '/manager.dat'; + if (is_readable($managerpath)) { + $file = @file($managerpath); + if (!empty($file)) { + foreach ($file as $line) { + [$key, $value] = sexplode('=', trim($line, DOKU_LF), 2, ''); + $key = trim($key); + $value = trim($value); + // backwards compatible with old plugin manager + if ($key == 'url') $key = 'downloadurl'; + $this->managerData[$key] = $value; + } + } + } + } + + /** + * Write the manager.data file + */ + protected function writeManagerData() + { + $managerpath = $this->getInstallDir() . '/manager.dat'; + $data = ''; + foreach ($this->managerData as $k => $v) { + $data .= $k . '=' . $v . DOKU_LF; + } + io_saveFile($managerpath, $data); + } + + /** + * Returns a temporary directory + * + * The directory is registered for cleanup when the class is destroyed + * + * @return false|string + */ + protected function mkTmpDir() + { + $dir = io_mktmpdir(); + if (!$dir) return false; + $this->temporary[] = $dir; + return $dir; + } + + /** + * downloads a file from the net and saves it + * + * - $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 + * @author Chris Smith + * + * @param string $url url to download + * @param string $file path to file or directory where to save + * @param string $defaultName fallback for name of download + * @return bool|string if failed false, otherwise true or the name of the file in the given dir + */ + protected function downloadToFile($url, $file, $defaultName = '') + { + global $conf; + $http = new DokuHTTPClient(); + $http->max_bodysize = 0; + $http->timeout = 25; //max. 25 sec + $http->keep_alive = false; // we do single ops here, no need for keep-alive + $http->agent = 'DokuWiki HTTP Client (Extension Manager)'; + + $data = $http->get($url); + if ($data === false) return false; + + $name = ''; + if (isset($http->resp_headers['content-disposition'])) { + $content_disposition = $http->resp_headers['content-disposition']; + $match = []; + if ( + is_string($content_disposition) && + preg_match('/attachment;\s*filename\s*=\s*"([^"]*)"/i', $content_disposition, $match) + ) { + $name = PhpString::basename($match[1]); + } + } + + if (!$name) { + if (!$defaultName) return false; + $name = $defaultName; + } + + $file .= $name; + + $fileexists = file_exists($file); + $fp = @fopen($file, "w"); + if (!$fp) return false; + fwrite($fp, $data); + fclose($fp); + if (!$fileexists && $conf['fperm']) chmod($file, $conf['fperm']); + return $name; + } + + /** + * Download an archive to a protected path + * + * @param string $url The url to get the archive from + * @throws Exception when something goes wrong + * @return string The path where the archive was saved + */ + public function download($url) + { + // check the url + if (!preg_match('/https?:\/\//i', $url)) { + throw new Exception($this->getLang('error_badurl')); + } + + // try to get the file from the path (used as plugin name fallback) + $file = parse_url($url, PHP_URL_PATH); + if (is_null($file)) { + $file = md5($url); + } else { + $file = PhpString::basename($file); + } + + // create tmp directory for download + if (!($tmp = $this->mkTmpDir())) { + throw new Exception($this->getLang('error_dircreate')); + } + + // download + if (!$file = $this->downloadToFile($url, $tmp . '/', $file)) { + io_rmdir($tmp, true); + throw new Exception(sprintf( + $this->getLang('error_download'), + '' . hsc($url) . '' + )); + } + + return $tmp . '/' . $file; + } + + /** + * @param string $file The path to the archive that shall be installed + * @param bool $overwrite If an already installed plugin should be overwritten + * @param string $base The basename of the plugin if it's known + * @throws Exception when something went wrong + * @return array list of installed extensions + */ + public function installArchive($file, $overwrite = false, $base = '') + { + $installed_extensions = []; + + // create tmp directory for decompression + if (!($tmp = $this->mkTmpDir())) { + throw new Exception($this->getLang('error_dircreate')); + } + + // add default base folder if specified to handle case where zip doesn't contain this + if ($base && !@mkdir($tmp . '/' . $base)) { + throw new Exception($this->getLang('error_dircreate')); + } + + // decompress + $this->decompress($file, "$tmp/" . $base); + + // search $tmp/$base for the folder(s) that has been created + // move the folder(s) to lib/.. + $result = ['old' => [], 'new' => []]; + $default = ($this->isTemplate() ? 'template' : 'plugin'); + if (!$this->findFolders($result, $tmp . '/' . $base, $default)) { + throw new Exception($this->getLang('error_findfolder')); + } + + // choose correct result array + if (count($result['new'])) { + $install = $result['new']; + } else { + $install = $result['old']; + } + + if (!count($install)) { + throw new Exception($this->getLang('error_findfolder')); + } + + // now install all found items + foreach ($install as $item) { + // where to install? + if ($item['type'] == 'template') { + $target_base_dir = $this->tpllib; + } else { + $target_base_dir = DOKU_PLUGIN; + } + + if (!empty($item['base'])) { + // use base set in info.txt + } elseif ($base && count($install) == 1) { + $item['base'] = $base; + } else { + // default - use directory as found in zip + // plugins from github/master without *.info.txt will install in wrong folder + // but using $info->id will make 'code3' fail (which should install in lib/code/..) + $item['base'] = basename($item['tmp']); + } + + // check to make sure we aren't overwriting anything + $target = $target_base_dir . $item['base']; + if (!$overwrite && file_exists($target)) { + // this info message is not being exposed via exception, + // so that it's not interrupting the installation + msg(sprintf($this->getLang('msg_nooverwrite'), $item['base'])); + continue; + } + + $action = file_exists($target) ? 'update' : 'install'; + + // copy action + if ($this->dircopy($item['tmp'], $target)) { + // return info + $id = $item['base']; + if ($item['type'] == 'template') { + $id = 'template:' . $id; + } + $installed_extensions[$id] = [ + 'base' => $item['base'], + 'type' => $item['type'], + 'action' => $action + ]; + } else { + throw new Exception(sprintf( + $this->getLang('error_copy') . DOKU_LF, + '' . $item['base'] . '' + )); + } + } + + // cleanup + if ($tmp) io_rmdir($tmp, true); + if (function_exists('opcache_reset')) { + opcache_reset(); + } + + return $installed_extensions; + } + + /** + * Find out what was in the extracted directory + * + * Correct folders are searched recursively using the "*.info.txt" configs + * as indicator for a root folder. When such a file is found, it's base + * setting is used (when set). All folders found by this method are stored + * in the 'new' key of the $result array. + * + * For backwards compatibility all found top level folders are stored as + * in the 'old' key of the $result array. + * + * When no items are found in 'new' the copy mechanism should fall back + * the 'old' list. + * + * @author Andreas Gohr + * @param array $result - results are stored here + * @param string $directory - the temp directory where the package was unpacked to + * @param string $default_type - type used if no info.txt available + * @param string $subdir - a subdirectory. do not set. used by recursion + * @return bool - false on error + */ + protected function findFolders(&$result, $directory, $default_type = 'plugin', $subdir = '') + { + $this_dir = "$directory$subdir"; + $dh = @opendir($this_dir); + if (!$dh) return false; + + $found_dirs = []; + $found_files = 0; + $found_template_parts = 0; + while (false !== ($f = readdir($dh))) { + if ($f == '.' || $f == '..') continue; + + if (is_dir("$this_dir/$f")) { + $found_dirs[] = "$subdir/$f"; + } else { + // it's a file -> check for config + $found_files++; + switch ($f) { + case 'plugin.info.txt': + case 'template.info.txt': + // we have found a clear marker, save and return + $info = []; + $type = explode('.', $f, 2); + $info['type'] = $type[0]; + $info['tmp'] = $this_dir; + $conf = confToHash("$this_dir/$f"); + $info['base'] = basename($conf['base']); + $result['new'][] = $info; + return true; + + case 'main.php': + case 'details.php': + case 'mediamanager.php': + case 'style.ini': + $found_template_parts++; + break; + } + } + } + closedir($dh); + + // files where found but no info.txt - use old method + if ($found_files) { + $info = []; + $info['tmp'] = $this_dir; + // does this look like a template or should we use the default type? + if ($found_template_parts >= 2) { + $info['type'] = 'template'; + } else { + $info['type'] = $default_type; + } + + $result['old'][] = $info; + return true; + } + + // we have no files yet -> recurse + foreach ($found_dirs as $found_dir) { + $this->findFolders($result, $directory, $default_type, "$found_dir"); + } + return true; + } + + /** + * Decompress a given file to the given target directory + * + * Determines the compression type from the file extension + * + * @param string $file archive to extract + * @param string $target directory to extract to + * @throws Exception + * @return bool + */ + private function decompress($file, $target) + { + // decompression library doesn't like target folders ending in "/" + if (str_ends_with($target, '/')) $target = substr($target, 0, -1); + + $ext = $this->guessArchiveType($file); + if (in_array($ext, ['tar', 'bz', 'gz'])) { + try { + $tar = new Tar(); + $tar->open($file); + $tar->extract($target); + } catch (ArchiveIOException $e) { + throw new Exception($this->getLang('error_decompress') . ' ' . $e->getMessage(), $e->getCode(), $e); + } + + return true; + } elseif ($ext == 'zip') { + try { + $zip = new Zip(); + $zip->open($file); + $zip->extract($target); + } catch (ArchiveIOException $e) { + throw new Exception($this->getLang('error_decompress') . ' ' . $e->getMessage(), $e->getCode(), $e); + } + + return true; + } + + // the only case when we don't get one of the recognized archive types is + // when the archive file can't be read + throw new Exception($this->getLang('error_decompress') . ' Couldn\'t read archive file'); + } + + /** + * Determine the archive type of the given file + * + * Reads the first magic bytes of the given file for content type guessing, + * if neither bz, gz or zip are recognized, tar is assumed. + * + * @author Andreas Gohr + * @param string $file The file to analyze + * @return string|false false if the file can't be read, otherwise an "extension" + */ + private function guessArchiveType($file) + { + $fh = fopen($file, 'rb'); + if (!$fh) return false; + $magic = fread($fh, 5); + fclose($fh); + + if (strpos($magic, "\x42\x5a") === 0) return 'bz'; + if (strpos($magic, "\x1f\x8b") === 0) return 'gz'; + if (strpos($magic, "\x50\x4b\x03\x04") === 0) return 'zip'; + return 'tar'; + } + + /** + * Copy with recursive sub-directory support + * + * @param string $src filename path to file + * @param string $dst filename path to file + * @return bool|int|string + */ + private function dircopy($src, $dst) + { + global $conf; + + if (is_dir($src)) { + if (!$dh = @opendir($src)) return false; + + if ($ok = io_mkdir_p($dst)) { + while ($ok && (false !== ($f = readdir($dh)))) { + if ($f == '..' || $f == '.') continue; + $ok = $this->dircopy("$src/$f", "$dst/$f"); + } + } + + closedir($dh); + return $ok; + } else { + $existed = file_exists($dst); + + if (!@copy($src, $dst)) return false; + if (!$existed && $conf['fperm']) chmod($dst, $conf['fperm']); + @touch($dst, filemtime($src)); + } + + return true; + } + + /** + * Delete outdated files from updated plugins + * + * @param array $installed + */ + private function removeDeletedfiles($installed) + { + foreach ($installed as $extension) { + // only on update + if ($extension['action'] == 'install') continue; + + // get definition file + if ($extension['type'] == 'template') { + $extensiondir = $this->tpllib; + } else { + $extensiondir = DOKU_PLUGIN; + } + $extensiondir = $extensiondir . $extension['base'] . '/'; + $definitionfile = $extensiondir . 'deleted.files'; + if (!file_exists($definitionfile)) continue; + + // delete the old files + $list = file($definitionfile); + + foreach ($list as $line) { + $line = trim(preg_replace('/#.*$/', '', $line)); + if (!$line) continue; + $file = $extensiondir . $line; + if (!file_exists($file)) continue; + + io_rmdir($file, true); + } + } + } +} + +// vim:ts=4:sw=4:et: diff --git a/lib/plugins/extension/helper/gui.php b/lib/plugins/extension/helper/gui.php new file mode 100644 index 0000000..4495af1 --- /dev/null +++ b/lib/plugins/extension/helper/gui.php @@ -0,0 +1,240 @@ + + */ + +use dokuwiki\Extension\Plugin; +use dokuwiki\Form\Form; + +/** + * Class helper_plugin_extension_list takes care of the overall GUI + */ +class helper_plugin_extension_gui extends Plugin +{ + protected $tabs = ['plugins', 'templates', 'search', 'install']; + + /** @var string the extension that should have an open info window FIXME currently broken */ + protected $infoFor = ''; + + /** + * Constructor + * + * initializes requested info window + */ + public function __construct() + { + global $INPUT; + $this->infoFor = $INPUT->str('info'); + } + + /** + * display the plugin tab + */ + public function tabPlugins() + { + echo '
    '; + echo $this->locale_xhtml('intro_plugins'); + echo '
    '; + + $pluginlist = plugin_list('', true); + /* @var helper_plugin_extension_extension $extension */ + $extension = $this->loadHelper('extension_extension'); + /* @var helper_plugin_extension_list $list */ + $list = $this->loadHelper('extension_list'); + + $form = new Form([ + 'action' => $this->tabURL('', [], '&'), + 'id' => 'extension__list', + ]); + $list->startForm(); + foreach ($pluginlist as $name) { + $extension->setExtension($name); + $list->addRow($extension, $extension->getID() == $this->infoFor); + } + $list->endForm(); + $form->addHTML($list->render(true)); + echo $form->toHTML(); + } + + /** + * Display the template tab + */ + public function tabTemplates() + { + echo '
    '; + echo $this->locale_xhtml('intro_templates'); + echo '
    '; + + // FIXME do we have a real way? + $tpllist = glob(DOKU_INC . 'lib/tpl/*', GLOB_ONLYDIR); + $tpllist = array_map('basename', $tpllist); + sort($tpllist); + + /* @var helper_plugin_extension_extension $extension */ + $extension = $this->loadHelper('extension_extension'); + /* @var helper_plugin_extension_list $list */ + $list = $this->loadHelper('extension_list'); + + $form = new Form([ + 'action' => $this->tabURL('', [], '&'), + 'id' => 'extension__list', + ]); + $list->startForm(); + foreach ($tpllist as $name) { + $extension->setExtension("template:$name"); + $list->addRow($extension, $extension->getID() == $this->infoFor); + } + $list->endForm(); + $form->addHTML($list->render(true)); + echo $form->toHTML(); + } + + /** + * Display the search tab + */ + public function tabSearch() + { + global $INPUT; + echo '
    '; + echo $this->locale_xhtml('intro_search'); + echo '
    '; + + $form = new Form([ + 'action' => $this->tabURL('', [], '&'), + 'class' => 'search', + ]); + $form->addTagOpen('div')->addClass('no'); + $form->addTextInput('q', $this->getLang('search_for')) + ->addClass('edit') + ->val($INPUT->str('q')); + $form->addButton('submit', $this->getLang('search')) + ->attrs(['type' => 'submit', 'title' => $this->getLang('search')]); + $form->addTagClose('div'); + echo $form->toHTML(); + + if (!$INPUT->bool('q')) return; + + /* @var helper_plugin_extension_repository $repository FIXME should we use some gloabl instance? */ + $repository = $this->loadHelper('extension_repository'); + $result = $repository->search($INPUT->str('q')); + + /* @var helper_plugin_extension_extension $extension */ + $extension = $this->loadHelper('extension_extension'); + /* @var helper_plugin_extension_list $list */ + $list = $this->loadHelper('extension_list'); + + $form = new Form([ + 'action' => $this->tabURL('', [], '&'), + 'id' => 'extension__list', + ]); + $list->startForm(); + if ($result) { + foreach ($result as $name) { + $extension->setExtension($name); + $list->addRow($extension, $extension->getID() == $this->infoFor); + } + } else { + $list->nothingFound(); + } + $list->endForm(); + $form->addHTML($list->render(true)); + echo $form->toHTML(); + } + + /** + * Display the template tab + */ + public function tabInstall() + { + global $lang; + echo '
    '; + echo $this->locale_xhtml('intro_install'); + echo '
    '; + + $form = new Form([ + 'action' => $this->tabURL('', [], '&'), + 'enctype' => 'multipart/form-data', + 'class' => 'install', + ]); + $form->addTagOpen('div')->addClass('no'); + $form->addTextInput('installurl', $this->getLang('install_url')) + ->addClass('block') + ->attrs(['type' => 'url']); + $form->addTag('br'); + $form->addTextInput('installfile', $this->getLang('install_upload')) + ->addClass('block') + ->attrs(['type' => 'file']); + $form->addTag('br'); + $form->addCheckbox('overwrite', $lang['js']['media_overwrt']) + ->addClass('block'); + $form->addTag('br'); + $form->addButton('', $this->getLang('btn_install')) + ->attrs(['type' => 'submit', 'title' => $this->getLang('btn_install')]); + $form->addTagClose('div'); + echo $form->toHTML(); + } + + /** + * Print the tab navigation + * + * @fixme style active one + */ + public function tabNavigation() + { + echo '
      '; + foreach ($this->tabs as $tab) { + $url = $this->tabURL($tab); + if ($this->currentTab() == $tab) { + $class = ' active'; + } else { + $class = ''; + } + echo '
    • ' . + $this->getLang('tab_' . $tab) . '
    • '; + } + echo '
    '; + } + + /** + * Return the currently selected tab + * + * @return string + */ + public function currentTab() + { + global $INPUT; + + $tab = $INPUT->str('tab', 'plugins', true); + if (!in_array($tab, $this->tabs)) $tab = 'plugins'; + return $tab; + } + + /** + * Create an URL inside the extension manager + * + * @param string $tab tab to load, empty for current tab + * @param array $params associative array of parameter to set + * @param string $sep seperator to build the URL + * @param bool $absolute create absolute URLs? + * @return string + */ + public function tabURL($tab = '', $params = [], $sep = '&', $absolute = false) + { + global $ID; + global $INPUT; + + if (!$tab) $tab = $this->currentTab(); + $defaults = [ + 'do' => 'admin', + 'page' => 'extension', + 'tab' => $tab + ]; + if ($tab == 'search') $defaults['q'] = $INPUT->str('q'); + + return wl($ID, array_merge($defaults, $params), $absolute, $sep); + } +} diff --git a/lib/plugins/extension/helper/list.php b/lib/plugins/extension/helper/list.php new file mode 100644 index 0000000..385ab0d --- /dev/null +++ b/lib/plugins/extension/helper/list.php @@ -0,0 +1,674 @@ + + */ +/** + * Class helper_plugin_extension_list takes care of creating a HTML list of extensions + */ +class helper_plugin_extension_list extends Plugin +{ + protected $form = ''; + /** @var helper_plugin_extension_gui */ + protected $gui; + + /** + * Constructor + * + * loads additional helpers + */ + public function __construct() + { + $this->gui = plugin_load('helper', 'extension_gui'); + } + + /** + * Initialize the extension table form + */ + public function startForm() + { + $this->form .= '
      '; + } + + /** + * Build single row of extension table + * + * @param helper_plugin_extension_extension $extension The extension that shall be added + * @param bool $showinfo Show the info area + */ + public function addRow(helper_plugin_extension_extension $extension, $showinfo = false) + { + $this->startRow($extension); + $this->populateColumn('legend', $this->makeLegend($extension, $showinfo)); + $this->populateColumn('actions', $this->makeActions($extension)); + $this->endRow(); + } + + /** + * Adds a header to the form + * + * @param string $id The id of the header + * @param string $header The content of the header + * @param int $level The level of the header + */ + public function addHeader($id, $header, $level = 2) + { + $this->form .= '' . hsc($header) . '' . DOKU_LF; + } + + /** + * Adds a paragraph to the form + * + * @param string $data The content + */ + public function addParagraph($data) + { + $this->form .= '

      ' . hsc($data) . '

      ' . DOKU_LF; + } + + /** + * Add hidden fields to the form with the given data + * + * @param array $data key-value list of fields and their values to add + */ + public function addHidden(array $data) + { + $this->form .= '
      '; + foreach ($data as $key => $value) { + $this->form .= ''; + } + $this->form .= '
      ' . DOKU_LF; + } + + /** + * Add closing tags + */ + public function endForm() + { + $this->form .= '
    '; + } + + /** + * Show message when no results are found + */ + public function nothingFound() + { + global $lang; + $this->form .= '
  • ' . $lang['nothingfound'] . '
  • '; + } + + /** + * Print the form + * + * @param bool $returnonly whether to return html or print + */ + public function render($returnonly = false) + { + if ($returnonly) return $this->form; + echo $this->form; + } + + /** + * Start the HTML for the row for the extension + * + * @param helper_plugin_extension_extension $extension The extension + */ + private function startRow(helper_plugin_extension_extension $extension) + { + $this->form .= '
  • '; + } + + /** + * Add a column with the given class and content + * @param string $class The class name + * @param string $html The content + */ + private function populateColumn($class, $html) + { + $this->form .= '
    ' . $html . '
    ' . DOKU_LF; + } + + /** + * End the row + */ + private function endRow() + { + $this->form .= '
  • ' . DOKU_LF; + } + + /** + * Generate the link to the plugin homepage + * + * @param helper_plugin_extension_extension $extension The extension + * @return string The HTML code + */ + public function makeHomepageLink(helper_plugin_extension_extension $extension) + { + global $conf; + $url = $extension->getURL(); + if (strtolower(parse_url($url, PHP_URL_HOST)) == 'www.dokuwiki.org') { + $linktype = 'interwiki'; + } else { + $linktype = 'extern'; + } + $param = [ + 'href' => $url, + 'title' => $url, + 'class' => ($linktype == 'extern') ? 'urlextern' : 'interwiki iw_doku', + 'target' => $conf['target'][$linktype], + 'rel' => ($linktype == 'extern') ? 'noopener' : '' + ]; + if ($linktype == 'extern' && $conf['relnofollow']) { + $param['rel'] = implode(' ', [$param['rel'], 'ugc nofollow']); + } + $html = ' ' . + $this->getLang('homepage_link') . ''; + return $html; + } + + /** + * Generate the class name for the row of the extension + * + * @param helper_plugin_extension_extension $extension The extension object + * @return string The class name + */ + public function makeClass(helper_plugin_extension_extension $extension) + { + $class = ($extension->isTemplate()) ? 'template' : 'plugin'; + if ($extension->isInstalled()) { + $class .= ' installed'; + $class .= ($extension->isEnabled()) ? ' enabled' : ' disabled'; + if ($extension->updateAvailable()) $class .= ' updatable'; + } + if (!$extension->canModify()) $class .= ' notselect'; + if ($extension->isProtected()) $class .= ' protected'; + //if($this->showinfo) $class.= ' showinfo'; + return $class; + } + + /** + * Generate a link to the author of the extension + * + * @param helper_plugin_extension_extension $extension The extension object + * @return string The HTML code of the link + */ + public function makeAuthor(helper_plugin_extension_extension $extension) + { + if ($extension->getAuthor()) { + $mailid = $extension->getEmailID(); + if ($mailid) { + $url = $this->gui->tabURL('search', ['q' => 'authorid:' . $mailid]); + $html = '' . + ' ' . + hsc($extension->getAuthor()) . ''; + } else { + $html = '' . hsc($extension->getAuthor()) . ''; + } + $html = '' . $html . ''; + } else { + $html = '' . $this->getLang('unknown_author') . '' . DOKU_LF; + } + return $html; + } + + /** + * Get the link and image tag for the screenshot/thumbnail + * + * @param helper_plugin_extension_extension $extension The extension object + * @return string The HTML code + */ + public function makeScreenshot(helper_plugin_extension_extension $extension) + { + $screen = $extension->getScreenshotURL(); + $thumb = $extension->getThumbnailURL(); + + if ($screen) { + // use protocol independent URLs for images coming from us #595 + $screen = str_replace('http://www.dokuwiki.org', '//www.dokuwiki.org', $screen); + $thumb = str_replace('http://www.dokuwiki.org', '//www.dokuwiki.org', $thumb); + + $title = sprintf($this->getLang('screenshot'), hsc($extension->getDisplayName())); + $img = '' . + '' . $title . '' . + ''; + } elseif ($extension->isTemplate()) { + $img = ''; + } else { + $img = ''; + } + $html = '
    ' . $img . '
    ' . DOKU_LF; + return $html; + } + + /** + * Extension main description + * + * @param helper_plugin_extension_extension $extension The extension object + * @param bool $showinfo Show the info section + * @return string The HTML code + */ + public function makeLegend(helper_plugin_extension_extension $extension, $showinfo = false) + { + $html = '
    '; + $html .= '

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

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

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

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

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

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

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

    '; + } + if ( + $extension->isEnabled() && + in_array('Auth', $extension->getTypes()) && + $conf['authtype'] != $extension->getID() + ) { + $errors .= '

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

    '; + } + } elseif (($canmod = $extension->canModify()) === true) { + if ($extension->getDownloadURL()) { + $html .= $this->makeAction('install', $extension); + } + } else { + $errors .= '
    ' . $this->getLang($canmod) . '
    '; + } + + if (!$extension->isInstalled() && $extension->getDownloadURL()) { + $html .= ' ' . $this->getLang('available_version') . ' '; + $html .= ($extension->getLastUpdate() + ? hsc($extension->getLastUpdate()) + : $this->getLang('unknown')) . ''; + } + + return $html . ' ' . $errors . DOKU_LF; + } + + /** + * Display an action button for an extension + * + * @param string $action The action + * @param helper_plugin_extension_extension $extension The extension + * @return string The HTML code + */ + public function makeAction($action, $extension) + { + $title = ''; + + if ($action == 'install' || $action == 'reinstall') { + $title = 'title="' . hsc($extension->getDownloadURL()) . '"'; + } + + $classes = 'button ' . $action; + $name = 'fn[' . $action . '][' . hsc($extension->getID()) . ']'; + + $html = ' '; + return $html; + } + + /** + * Plugin/template status + * + * @param helper_plugin_extension_extension $extension The extension + * @return string The description of all relevant statusses + */ + public function makeStatus(helper_plugin_extension_extension $extension) + { + $status = []; + + if ($extension->isInstalled()) { + $status[] = $this->getLang('status_installed'); + if ($extension->isProtected()) { + $status[] = $this->getLang('status_protected'); + } else { + $status[] = $extension->isEnabled() + ? $this->getLang('status_enabled') + : $this->getLang('status_disabled'); + } + } else { + $status[] = $this->getLang('status_not_installed'); + } + if (!$extension->canModify()) $status[] = $this->getLang('status_unmodifiable'); + if ($extension->isBundled()) $status[] = $this->getLang('status_bundled'); + $status[] = $extension->isTemplate() + ? $this->getLang('status_template') + : $this->getLang('status_plugin'); + return implode(', ', $status); + } +} diff --git a/lib/plugins/extension/helper/repository.php b/lib/plugins/extension/helper/repository.php new file mode 100644 index 0000000..75e57ad --- /dev/null +++ b/lib/plugins/extension/helper/repository.php @@ -0,0 +1,223 @@ + + */ + +use dokuwiki\Cache\Cache; +use dokuwiki\Extension\Plugin; +use dokuwiki\Extension\PluginController; +use dokuwiki\HTTP\DokuHTTPClient; + +/** + * Class helper_plugin_extension_repository provides access to the extension repository on dokuwiki.org + */ +class helper_plugin_extension_repository extends Plugin +{ + public const EXTENSION_REPOSITORY_API = 'https://www.dokuwiki.org/lib/plugins/pluginrepo/api.php'; + + private $loaded_extensions = []; + private $has_access; + + /** + * Initialize the repository (cache), fetches data for all installed plugins + */ + public function init() + { + /* @var PluginController $plugin_controller */ + global $plugin_controller; + if ($this->hasAccess()) { + $list = $plugin_controller->getList('', true); + $request_data = ['fmt' => 'json']; + $request_needed = false; + foreach ($list as $name) { + $cache = new Cache('##extension_manager##' . $name, '.repo'); + + if ( + !isset($this->loaded_extensions[$name]) && + $this->hasAccess() && + !$cache->useCache(['age' => 3600 * 24]) + ) { + $this->loaded_extensions[$name] = true; + $request_data['ext'][] = $name; + $request_needed = true; + } + } + + if ($request_needed) { + $httpclient = new DokuHTTPClient(); + $data = $httpclient->post(self::EXTENSION_REPOSITORY_API, $request_data); + if ($data !== false) { + try { + $extensions = json_decode($data, true, 512, JSON_THROW_ON_ERROR); + foreach ($extensions as $extension) { + $cache = new Cache('##extension_manager##' . $extension['plugin'], '.repo'); + $cache->storeCache(serialize($extension)); + } + } catch (JsonException $e) { + msg($this->getLang('repo_badresponse'), -1); + $this->has_access = false; + } + } else { + $this->has_access = false; + } + } + } + } + + /** + * If repository access is available + * + * @param bool $usecache use cached result if still valid + * @return bool If repository access is available + */ + public function hasAccess($usecache = true) + { + if ($this->has_access === null) { + $cache = new Cache('##extension_manager###hasAccess', '.repo'); + + if (!$cache->useCache(['age' => 60 * 10, 'purge' => !$usecache])) { + $httpclient = new DokuHTTPClient(); + $httpclient->timeout = 5; + $data = $httpclient->get(self::EXTENSION_REPOSITORY_API . '?cmd=ping'); + if ($data === false) { + $this->has_access = false; + $cache->storeCache(0); + } elseif ($data !== '1') { + msg($this->getLang('repo_badresponse'), -1); + $this->has_access = false; + $cache->storeCache(0); + } else { + $this->has_access = true; + $cache->storeCache(1); + } + } else { + $this->has_access = ($cache->retrieveCache(false) == 1); + } + } + return $this->has_access; + } + + /** + * Get the remote data of an individual plugin or template + * + * @param string $name The plugin name to get the data for, template names need to be prefix by 'template:' + * @return array The data or null if nothing was found (possibly no repository access) + */ + public function getData($name) + { + $cache = new Cache('##extension_manager##' . $name, '.repo'); + + if ( + !isset($this->loaded_extensions[$name]) && + $this->hasAccess() && + !$cache->useCache(['age' => 3600 * 24]) + ) { + $this->loaded_extensions[$name] = true; + $httpclient = new DokuHTTPClient(); + $data = $httpclient->get(self::EXTENSION_REPOSITORY_API . '?fmt=json&ext[]=' . urlencode($name)); + if ($data !== false) { + try { + $result = json_decode($data, true, 512, JSON_THROW_ON_ERROR); + if (count($result)) { + $cache->storeCache(serialize($result[0])); + return $result[0]; + } + } catch (JsonException $e) { + msg($this->getLang('repo_badresponse'), -1); + $this->has_access = false; + } + } else { + $this->has_access = false; + } + } + if (file_exists($cache->cache)) { + return unserialize($cache->retrieveCache(false)); + } + return []; + } + + /** + * Search for plugins or templates using the given query string + * + * @param string $q the query string + * @return array a list of matching extensions + */ + public function search($q) + { + $query = $this->parseQuery($q); + $query['fmt'] = 'json'; + + $httpclient = new DokuHTTPClient(); + $data = $httpclient->post(self::EXTENSION_REPOSITORY_API, $query); + if ($data === false) return []; + try { + $result = json_decode($data, true, 512, JSON_THROW_ON_ERROR); + } catch (JsonException $e) { + msg($this->getLang('repo_badresponse'), -1); + return []; + } + + $ids = []; + + // store cache info for each extension + foreach ($result as $ext) { + $name = $ext['plugin']; + $cache = new Cache('##extension_manager##' . $name, '.repo'); + $cache->storeCache(serialize($ext)); + $ids[] = $name; + } + + return $ids; + } + + /** + * Parses special queries from the query string + * + * @param string $q + * @return array + */ + protected function parseQuery($q) + { + $parameters = ['tag' => [], 'mail' => [], 'type' => [], 'ext' => []]; + + // extract tags + if (preg_match_all('/(^|\s)(tag:([\S]+))/', $q, $matches, PREG_SET_ORDER)) { + foreach ($matches as $m) { + $q = str_replace($m[2], '', $q); + $parameters['tag'][] = $m[3]; + } + } + // extract author ids + if (preg_match_all('/(^|\s)(authorid:([\S]+))/', $q, $matches, PREG_SET_ORDER)) { + foreach ($matches as $m) { + $q = str_replace($m[2], '', $q); + $parameters['mail'][] = $m[3]; + } + } + // extract extensions + if (preg_match_all('/(^|\s)(ext:([\S]+))/', $q, $matches, PREG_SET_ORDER)) { + foreach ($matches as $m) { + $q = str_replace($m[2], '', $q); + $parameters['ext'][] = $m[3]; + } + } + // extract types + if (preg_match_all('/(^|\s)(type:([\S]+))/', $q, $matches, PREG_SET_ORDER)) { + foreach ($matches as $m) { + $q = str_replace($m[2], '', $q); + $parameters['type'][] = $m[3]; + } + } + + // FIXME make integer from type value + + $parameters['q'] = trim($q); + return $parameters; + } +} + +// vim:ts=4:sw=4:et: diff --git a/lib/plugins/extension/images/bug.gif b/lib/plugins/extension/images/bug.gif new file mode 100644 index 0000000000000000000000000000000000000000..08c1ca1f106e8d8d3e7b703590d8adbe53e6b373 GIT binary patch literal 194 zcmV;z06qUlNk%w1VGsZi0P_z3k&%&$i;JV9qgh#5w6wI0jEre%X-`j2g@uK3a&muv ze@910zP`T5$jI2(*Z=?kA^8La000jFEC2ui01yBW000DU@X7hWEHq1iAJWwn1WBS8 z8ekOxf)LK9u|U%hiNKVGB_RQZV5mp{7Lt(*AmlI!hQq|AXb3n30sxAdD7Jt=HVhq@ wC11km8n_NJMM0Y-FuXO10YOl3AEX)vJpcoM2S^%bg@7O#e~lmuh!YV2JJIt*K>z>% literal 0 HcmV?d00001 diff --git a/lib/plugins/extension/images/disabled.png b/lib/plugins/extension/images/disabled.png new file mode 100644 index 0000000000000000000000000000000000000000..9c18b0452a1c3620341532f32fabc7444070d666 GIT binary patch literal 1163 zcmV;61a$j}P)uy`kx;ja=n@zHrBqo{6B{Qd!f)J{s{os53@;fKPLGTRr zytN0Iyktod0O~PX^ z^uUW@$o_F95K0ao?prmOTAvbF*iS5qQJY|-xwbfhTk(*nAq=YHk4J|_HXpumO z>G!^4e>e$}9NHm9R`2eM@F4PF0YIA&tP_MxKwvS$BEJlK1tpvh>~|0A=Z_5 zpaYs|=@>~m#?T@JHz~my#$Y-Q>(ni~;YJ-<;36F9BoPAM6+FX?+2Al|nSj}-HVmz) zcbaScK8F%yVub1pplWn19WzUi1*$s?I3Da40#ru-DP!oN-B6)XDcmBuI!h2U@+++Z zA;<{I92F_!II!ffzy?=^g@nYDdVfF!t5q$POXZ2GTJ;V$t1IyBsbfp^W#zbNRGI?C zR&uGs9sOz7Us{NIDSOQ=Ca=3@yzsX$mJ{W^My0_ zHjQjD6S3GXPWI<{WNDP+?@0oeGxQd5Fje*Xqn&@=nZA1F^y!m(_kGYg_uX-i@Zj+bTwLGHu4x*#_zk1$7VixApa$_H1y3KFFxye+*3ydWO;PN$}p_*l#rjz;}y##o|UUZMBr759E0wB7$~ zB9kdx`r*P%t*61B7pAU~t1p|a8?&?7iBhp0q9p!eKHr4#@u^=fU%q)lQEFuXz&)pS zx_X9tR%2JBX;zCdArlNn>#EwgJvlk|eX&?s1OUxdcQsrs*G}(h^qes1`uIn>_8i;p d+7o2Z!#~zl*-Z=4Zek`sok!2w9RKNnV6P ztuRdkWM2?9`oOkr9PBs%cOI&$!b{WU91tqu@cVse3$>uS+E1ybcR%Ll=8@0m-*H{1 zCQXBG==c_m8WQPysyx_)K@>&EbburXRaF|NZaujD;Ms#GFCRU9`TE_*cOO1~`TFhW&tHE*;NSoM z|D~tAiUyiy=jq}YQo)!k;L4`*;fJJvLxba#>4I!O9JMNEC^U$#@t-kSlI6#OWgMF~ sZrD)3dH9S-Quzopr0M83xJ^%m! literal 0 HcmV?d00001 diff --git a/lib/plugins/extension/images/enabled.png b/lib/plugins/extension/images/enabled.png new file mode 100644 index 0000000000000000000000000000000000000000..edbbb5b3cd494fc7d7b67f3fef56a03eb50559c4 GIT binary patch literal 1172 zcmV;F1Z(?=P)VEty*{4uDZ;%ob_re-Jiwj<@1lFyWbFqd&5v&s zZ){Gu&xCbe1EC;ihHoEuvikSovDF_sIu-_Z?XIW(p7Z#(|7?8t)%S4mr!{{3gZPV2 zH@P1-Z*?|D;{hfDK|ly{9Gk6VKsU!DfA09t``sc$hzd#o+e1l>FMUK4oKAvx7 zXlf2TduX?FrfnzRq$jq6>02b!N()N4&DByX=+D?2Vw16;Uh~w3y2cxOTQ^Px1GN~s z*^71HC=!cGoc&EiTI$_nI~%A*t!yIF%58uZ0Lp_X2k;z3BCm?f-KP49@|NbRV`tCb z(97as?>nxo07}EOtKqRiTd=$eqy%k{EPx4vfmsBy0T94BxNZiN32RH;)|UNk^}F=Z(1Zk}0f+(v@&F2qaT}ofeIhF48O%^g*sAsWBil6pL&78kh%uFE zHVF3&kZXX6906IzSe}Sk4AOy|&%iCXjH#srrJ6|iTvFf}mM+01wvc!H88}mUh(s1F z>VgL>;{H`e);(!X8cu#xQ+`hqbiE|8Ha=h9($zD0ddK#SbEiHz z@&Dcm(;|HT?UmHN*4KwBq8pBc*-}_i_BoeSX}QtN$ZYlE!eU`|VsdIG6jbpb3?7ai zZHHyMhxWDZxX`w>Wf{8qGlkCX@i!x3cK*bPlOC^|hfF33DQ#P_IOW6> zNH03DEgP$=bLj2uGH(qJO?&M1@G$2bu1hQu39-h;9gyw{(y0ZEjhGO^CIDazo;W;c z8i$kwA_8L!f^#TBKv7j_nifzLCEC=SfEVF$?@C|aoG%^^Ma#;<%|uj@PA@6rV@ZsT zP8O2M*`CqS`Ag@{4XhM3=uu$>Kmb5!dV1CDADHS+EgB_?h&Rs8WO4Os|1Xy>|M_V$ zxsnFJi%#vXk7xKkw*CiJC^&h*Kc?%k%<^*PufD#UKc-SkGXU}c3;-qo8-P>1HG4!@ mtPfxRjTIeR-k+i%p~yce1p70DNMtzx00004GI{VgV~i*`4+s$8lcw%#tVXfA9Op_xmBTyUfmcU*~o9<0|KL>DJ?+Hcxiw z+@^E4?wum|?@9czs>OP#(!PkY@Y-E-hhAS|KbrB;qOU&7XIVU{7YFB-O&B9F5M0g*Hpax|59A7 z@qCIY6c>KXi7U!~*niPS{0||!po#wdz}KR0^4~{hQ_Y%0vKM3mpY(q<%^t;39smdFd&;r_o_2DdL;9qTh-8o8 z10L!V?UTMNl6CyYqx{X`{7t$^TdY^UMW2%A)4iJFmHMV_ z&TL-F-=!nxV{*~w%brUg8Oau9_m%v%PajRF7{B`!#1T9nJXiQ^@J#S*`kE5FBi*bW zCX?*Z5<)7(d(Ojv4(|z`jXhKJbn1ztVtl#mYVe=BzG(~s{4sLOvwa>q>CnSFKL6Zv z&p!K%dnWdD$y2F^VAKVWa@oVrLkP*-uBd!Pd?$ED0n>fSi$4T+mDCfTx9Rzk391X-u^t_4pS+`9QH<<_ST!9 zc-%c6eXRJ==wt5jAG%%ghd*4}^Qotvw)gYx&s@+H%@A zfN#9H>3w=G-`e{T_ej%+gGU0q-97fBe>`UAuO1T}nF#U7SevKG?lS4^UiM2IJY$^p_9w@p!);|3J5HUAuJY>^es~MLR}2 z1)YEF(zR>1ZVzaf9`KLC?9P(rcZi|J1f5)`pkqOYXh+w{b^eJo4}hiz;z)6JN2JMF z-TC|;m@m2M+__W7jvZWwqWgmm4irCi?$X5wt}aBRa*=}UH^t3vBu5|sL!CR3;C^?1 zar@wY*WsIvojP^a7!S6i%QiW!bqU3bsMMJ{@Dv?7+~3}{kKUJQcVF~A*WTT~vqQ&@ zAmmsN-gQ`uW7<9ZP%DOlZws4Tm#4b_{`U9X*Uq(zwGG-i(CxgxLx&t0gbi8$hI05W zQr4!uh5~D%Y3te++#9rY?RMPPzWx3GM)X?-f*+z~mt!_Y(5_wEd)>W-_qcmq+a2xh zyU&x5I}L+TO5i4?$BUr-eeK$|z4xAb?k>FBfn-P9cJ2P10%lp3{jv07JRa}H)A8=R z++D$)!Cmg|9rxVZwk=35JpA}OAUq9ncav-rM9IUA0Pny1?z`@EcSi4Uce=ZF+|Lr7e8G)_rEx3e4_aZMAXTK~s|AB5M-uCyk{nPmu-YSw?Zn@dry!Vz{Z@mq4 z7nQ)R_7z+Vjot(oE6ILY@`pUpHKozwl5=jyIJew!-tq|TzuQR^dokAnsTTpt@P59*>N>Nz+6e&CYPaNQ0SPD{Zr1-f1x`j_} zgP+SU}l@8MQ!Aj>~rE{>- zIaui&taJ{p=^R|sIk={Ca81XSnGUY$99+}Us>{JOor7yS|G!w%iKM2^JUntiq~Wgb z(_h~m`Bfx+*cVucOZ~9$=*TZ4=^1G(u%$9zcaHoblK%5|SkFrRu%dP3oJhL)=U8n^ zebviF&WfZfl2}Dc{kZ1D$Z?TmS*Kg0k%CD2if^z`nEL9eAks3j|Imsr_U-!Ycadl$ zUG{0VSvIw6Sz+YpNUF_893hk7FGe+4Pr% z*s@Ny_yjMf_uPzalXUUN*+cPq6TUt#$=8#A;p=bj=lk~zvCXhCxv%3l-+XdGEw~NU>e@EvNGR+@r|Q(<$r*?#p~tbMFl|wEY?@c~D+ga^XG% zN6CFZ?b!!Gq<1akqo4RG`}1r%Rf#93kKe%^$}d~s=gcbp`2FpC`N3U$OJ+WQKISXF z{?*a^d2xoX|Jap3xBVWkXIAmY!@uBLzCM9J&rI_zyPxLIH-5|4HwEMumc#d)#n&e! z`JTNmlADFQ`SZUD$!(9F*`H-IgE6DjvCDqUo}JA+K~wnUMIcJu|8*vNW_I7l$4AcE zvh$lBeCf#fKj5X*SO27V)8Acy=cR7{DvgJvcVCSMrVgF{J@#Dr4?Oa}zDRP%75^xS zq?(QY4y5U?TSm$v>0u3!Qflv4Uqhssg|vr5zk-Gvz8l``yw9PB^mmu=#ozA0Zftu0 zyVOPZJ@AUmdOWxO_bWVD{aF9? z{Nu6RpKkFb-mrfM4s-<1?}W>xzqta_PeyO;eORPvBwdxpI&bD*AWEIIZa24GlNFI; zBIzUkf!EVJe!*Y3-aGM(^ykgss_9d{;4eOOl)*-1~L<`@3)u zprOeHzxw4#kYnobnN#75`0pD04NnD>+|sGXL*3gysxvO(F^b0L0!Z+G`xpg}#_+hr ze>xYy^8)_AlluD~LWc3XlSbfJNS6a&KWRoJ^2e2YttIxdl83fD{`51VXVjn8x@9wL z8=rx-_MqiS7qxr--SVRHeQ!K<*KbZewlI=C5gQD}txmi9jrYr2l-CbzduA&v%(upy zTmP)D?h9}^)xnbxY2#W&?%E9j33K!GCi)1UAzC9Yw_or z&gEqw`AfIEAN+f{D^I`C8m5Q&y_b7)av& zJhZ(0HN1V_aYOvOi_7aD#k=q)c6IWqtFP)&UR=Iw)V-Jg;n%-7^Q6}24J}q%QF1+(<{Et6ZT{95;?HX{|?=Sep87H=C+48h_Ib3vKfktMJENndu0U{SRJv{?AW4;nIJ!~)poi6HyckUl}e#@3;bsL2jGHa7A8EtU&(f#RtTkzaHqdJ{`{_ifn=;E#; z%L~fW$Gpg|L*6TIQl6Q-FS;+YcTcb<_$mF(7(6HW__N}UBRyCkLe%Q;%%v?&ZJkQp1$-RvUw_B#l``KbPgEqg~kf7^{c-a5CipvV>ND!BZD=l|!<)0&Fxcklhw^L;Nq^r*+qJrpS}6*>C9A;5Ix_vOvX8%Ff{^L5u= zFjAR+4S&x@#OssDOX+fHe|8m z(c&hT-ru$7qfhrbv&kWCjy}{$(9)s1Um_a_ItU6+4UG;heecVQi%QSC9m;s9`7$+>STZov^>TN) zyDYdg^YXyLfyHm6yB>|0{Zk|wJ^K1vZo9jEm*0zxHm|;3{QBNkZ@lc%%Pzg-lFMFe z{#vRR)KP?F5RH~yc+;)7-_2U7>7}nmUoCiL-(N4k(y!euf|9J5YFS(aWUrfGmB~HyW!!~*>dKef;9r@e-1BwUK zx4Za{f4uB3_$lb0`s>+85NbpMy523|3~W&k@`a~dbDEYrp?jK z_3M`m@Am8FkuxIo!SBnr{%bcESAO_>^BC+(o)~E;ynfn8KV%QfHtgO$?N5b~*4PRj z@#!AiYe??j^0?0MUvFswI^~D>&Wfc15AH<7x(Cn_yF5_sc+tkaqH~xE!a#<)vq~*yM~8t z&YqXee8A1bLpNs6&*CNQQ=Xs2zih40vmJpIe;Z}1&kp1;jv zSFZDJe87FT|2q$;bM3?>>A>N0wwS%BF))`1Rzk`1O_~nB14F z-}A$s^xk@|NxzP5#^nB8FE_z%V5;fuYxvqiZd5ibjdBz14?m=^c$Hbt4aiS8pH!32 zwI99(dqnA-t+>5+$bPJYWj5o5Oda5U(v!I{c=h_-Ty~3W#G=){hHZ16e{ELnw^%+)N6I0JROGZTA;^aG$B{@41idf$ z>6^H)e8(PKk4>gG+}4ykpt0>xa5B03$0SzslF9lhC4BYn@3N<6_v{(=+jCEE^Wwf# zh6}H$q^fcDd()-48ck_3jr_%UUCc|H}_!u`;QVmrO+$Kw=VmS&SXJx^9y3hAmR!jXbD2OzRBv0R(O4DAteT$8@^p5*riRtJF8q=*ivG$f~ z*nSQ-I4}KYnmg`a_KRUtGgbEPj_l#sa-VZ_THK{f(CzDMCZ)}^m*2B~AYe|Q^Sjl#n7Uys4}Sb6fAqHGom(aCp?#dj<)|2m>?e?2P8 z4Tw`B{CbDJKHGvn4{C|!v&;$na#rrkY5eIVemRcsd8H-4-XN+I^tittp>J5E=U9&) zj+u2f4Pb80R12mr8zF#V_0WQ{q$$dC+!0+pL-yD2>dItEw_s`D*f8h5YzvTgrpOzlQ(AL)>JY{~()RO$^ zDZGNSM#-P9)Jz&upB$=3?N8S?kJKZ4y6jJx+DPQg$-9%O^gDQWrX+F-&n%pbzsK>{phgxy|G#YDpuzCvKONK{5B|R^ z&htNn{6lw&2z@Vx-pJoIkGuX~zwqLVFTe8YYp=iY#+z@w z_4YgO4jMdo$b0V%bHg&jN4OE0k)zxwS6=XbbadwZc+>dyME?OVy!g^9pm<~8z&GD| z#}f=4Hf;Eakt0R{pS=J6=wNhu%;+%%W17W3=i6U?Irsc`-__%X;@uZ`B6{>GbclB>Z(z?7#N^}c)GjSj{J}?PY1m~0Ha5H)+Sa~PMSPv@|5V5=+yMIsTl8r{>CFG_4eEE4jMFM z2qn$Yz~Q)YoDYfI|k!ghKIv}mNT0S(y7y?PoELYD6A@quS>}6Boea+S_8x=79oy_6GbwO zBvmu2X1bZFSucuj+RPQ3IMDX9sOzG%`Aslq7VsQnP2xnjOq8lq#S< zKdb~g4BDe)NXk(sO__>8XH>bWU{)~O&1slB2Y=!P)P`KkEG!&WLWKe$p!}d5%*_er z2J_t9!uY!WFTC)w@r$WK9Ycpwhngvd4C%n@tl6{Y%$Ykcm{%~rAYPm3PtOd+I(V=Q zEzfEtMG8fbY|h-d^XAWA5G)85x&^WLTBzi}X-YyGlC#8+RK|=dhy~-#o4>$;GPWp| zAN2Ks17)d_?Wl5ymWmW1=<-7@T;vuNE+%14p*Bfz%Mm44%4XVhPLUH_uwdcBMT^~H zR~=oFsg6hEHD*HeLsAc>!9puiC`TpnjG0C}e*tJ0S644tvNX0d8egrsz5;WgM_V|abd{A}bTAQ)j+tX{487W|c57U1W=-717l%el>C?7t`czz= zf7%$w_YYXLdd-^JwfIwu2P_L8z`#R?q~=4jp}9ePGx-3{9}fTnps%f6yLMf$E{HET za*JC?Mvbga(uaf01UZCH#V=jH0_vXH$2Rj){FV`0bqY!-G&XDHgDOwRS!t?_i^$6EC6VL z0$4%;NCD&k^jr9VWs+dX0af5_SpEywr~C2&3uQs30SFKrxGfnzfjVH-gP>(0072b! zkc$9xLCpayPzY4AnSiweTYFun~ zz^v3*5t8FXxRM!?9D$zH$dF)1G$cMC7fH+$P=7HoF=8`*B9P2x9HA%E6=g{<<+}BC zb%+HkkS|coSbjnl&c#rL5;G)9VZJOe^dvb_W~~@t)%lU|vZe=vSCKt-WXljN`_A$OPpbuvAng5W8mbqnad6bz1?QR5VvPh>WG<`M)mw=lD~+Eu$H1xsU0q2@j; z7&S6WT9#tU-6%9@doVuHB6&0ak~pZ2DTf?TYtVgj5l|HaYd9otr2$L*ix$Tg7sOW~ z`^atcxl^%|#fI6uc=map(`MZeEJ`n26px|ql+(ZFb0_Pg;oe@!HqsYO9^sE8&za}u zW#%u4E{HBHh}U^VsjfCrW5V<`T55$Afvh-~dcn1uo0>O&-u&2n6uY_F6X?p93pOYc zK6ysfiuw^%nQE(Gj+^V|MNtH9(3oN6Ng<<1hLFQl7gDllojEI*<-*c)4oc5;VLhk% zh+$q8J&2)Rng`V3F%vo+$;q0RLCNi6^cC9voNBP2vn8PY%Ox4YBRRyZCQPPLw z`B-AX2;BOjRm!11`I3G{RZx|gi7&@&zGce)k zjNf(i)OCgu?^h{B;jLkEKM z0Rc};S55?Ebdyp5r@*x(#9k~mk)^HH(s1wr?*yO})Fz${0E72W0SdnI12KELqM$)1su> zm`6R24CJB&c1|N9yJ^ws1v82Wfg1}2btt`CaluPORv-FH0AFjE2{2RzU-K2LH(j%P zi(?`+MrreK6yjL~7DP1s0WFa*Br3Jj*{ph&fBVoa|7QF}RBbkvk7Q@ z7{pXnvXE(;sYK+1nc^UcK{O|rBRD(<;THkT4Atrl3?9Z`kGu%INUSL8W@i{jWAoB; z=Ybdi6#|pNhWf$KJ^~|IB3lBXdRj!_xd`8d#KfVY(_%Sc)rt(FR1L!!h9u4;uqEo4 zzaX{%xo!dSt4nM!X}yMpE=o(&4Wqs(NC_ULB1zqR2h!N0%t8=*l&RWC10$@NQ7}~* z_D9s8>1mnY7cC|(R^0btjgA>sx5hAoC}hMu!$}f`FG>;H3Kt8Yg&LNJif8IqC6R_z znqp?2ucCs)OACODv3y{pCaV0vR?ev+B{mSYB)5x~xFxJ7+;U)JRa0I^cz`&^vIXNf zf-%=vlwFN+f;*No9vKs3f}T2-yDJmGk3w(>e>H5TYKryDLX?9j$K0}dL$@lYYUqhF zZa;NaQ@$vHvrBHMNd!#@Em#erB6T&vs!R>4(Nz#YF8i5ZL1ktt9ve<4eOS+`ngn_M zs?{hbS78Q-A}`QLO#t3KLTD!evLd%~k~O{1A;s`A*_AbJGR9jPd#A*jht0N4%RMfRLe(0P|QHf;HP>nlpLa$FT;f-RD_ak zLlSlC-THK$p<-W*TKGh{fhTy;!DhY5QgeptLsTqSOfaKTnk+Of#SIBa_Ga@YdZHo0 za-r%FPYKh##F#(O7g~)lohAV%Cn}`nVGbVH0@E2Rmho_WBwq;75Fy-#P{#Y5M}!z2 z)T@DN0ZIWX1&f!-cx(bP9)xp90P2(RngpmlBALdhcJo%ZHM3bFXl%dce~eVD6DdPe zA(vM81jB>Eqa>flVHq|7W9NE9*t;m2G%DfXcC*Z*d(|*^Y3dDHVMW`sxd^h zSl#gt;M&GUEDvlVEEXn}B`HI&>}*up`v=T6JVhnIkZLJMEDvnj$i45_zZ%YJtgf zLFf$|9tlf9l;k-TCXiZvpcy)sN4+?+;JB?RmS(fCN2jvD#0Fa+s zQ2;EA;A^G}?-eP7zqeg^AdDBbr{KwzB`(S?Tke)OtXRHcIkS%?T!w#UpLgIss!cp5 zRo*mw#`taA8yrq9$I31;b_fp{KNJDN^utO)la~ilbzD+$i_(}tuq4(95Bu27z;9-+ zqDo^E;fZ}Nj4AuM>hzLoq|g}G0S3IFJu)lCA$F?;S>jrqLC<6EMf@U|=OTIm0I^4x zig_|tO&T7LfwhEyqKG34m9j!fk+xuw5Tf^V6-LS!ITWtK2!#g5)Sz4eaPtFHH*Nu{ zn-~GHU-`*p3|I;flPrbOLM5(U5i4-q+~~X*$}yK%Pc%UHwqa4-P)*{P2F?=O;4la= zU2cjr%)|KeP=9Xlu|WXd7wIIHbFrF}iBnXRwF4v$KLj-|Aggq->&a9vdjLO^O9v{p{Vo@(2~AbVA69`_WOHpqj6qp$ zyBX0cl+0B#0Vy`AkRkM!GuVEduO5YZgo#-RP7$I=V`t6H$PkTihmxbJ5U^DtMoukjS9-^-yaQp%dOfJ@L{590-Lm4 z$9;v%U(_bW3YUjML4ufNAeW#uGiGeT*rthpN}L46kf+xJx0+!A#JD(M!{@s(!PwZi z%y?kdCW&o8w~}Hw29T<3h9pGjM398H!T5rT^!SQIDS$Lc4BT=Qu|*OJ(2c4$l5qh> z0PKun<29I2#&I}*Zt`xpe^2LW5h{orY_X~h%=qOpom z1w+4nq(mf#p{rH`)b8bqj-c?2*o@-D77d3*47eGKFh)XZivCTT*HRfm!_;XsyZ6GWZ7on~3Ym`hw}I=3^8scHFlMKAYm?jvNB?{CzQ37(_mo$ESrcXR#8JVBBfTd zA&hJ~g{TOD^_BQU-+OT#FKX-P*Na+`Ula7qJm0>7I-xD!^%Q;+s0B$nxaj7H`5OR&e4>ztX#3 zhd`xZR)Ys!iK%5{3yIR5^vGqa1aNw)(6$W>2?`Couod}BfBfmK*T5OOC$YOW_ z2*utvk%+w9^9Y7EtLck1Y|kWDP7;I$CoqXa9Yyx`&G7~cbNt^?T4Cii!v zn<0C}39Bb9KzVBV3mk^jETBDzC45`E4)AaDX6(&w2J?&Mu|BsMhPCQWx-;1ujOMne z(A&Co+M3<^!PYJI03_m^;SBj-hC}7kVGMz;gysQ)xwrd)e?T~eFq^<<;d4kojB_3U zVhTjjG#=ZY$1(u7mu(7iI!m*m-G>^a`IrV_J~UiBKoAxWzz(?{AQP~{Pe6iEK3s=l zz?*Im7WU&gAo`;MxxJj(cz_9bC9-${3vxa49y20aO%V?|W1uqvc)$vVE;v8^kG`u@ z7Muf$Z2ADBCdH^@8a9c%3A60YIglOEVA%7-h67 zYAPSrL(dg{^@4-zik2V}E0`hp26|t)5^)FXX!sv;bNyF^8AtA$TZ7EQZxs20-$c+z z6?{Sswv^MWSNWI;xvPlI17Ly-R7|;Kr&T;AEAB|cf>zcrU^8ZVu^$jK^Kr*4&!RmM zFk|+Lm9dqv#A;uXFw@a*^VpT+LTHW9GdE+QwxvMNnH9@}<cRBI1SQ zrC`s+c?ewR)eJbh#VJf3k0>}GL-|M_`UwkE*f|WH!P;}aU=c@Ov^ZE?kf@V~Gzv79 z+_gOfTVYXSW7F195uunuJ>(V|B@&~2%Ru)5g_x;1EW|+Ds1PeixB;~Y&ny9z7{h&8 zOHbSvfUbNMhk-frT$X>qeAbwXGA7XM$hVohhC}ESOuwvJ-TMxv3!4 zF^tN#r$9krWrrvfeht!KcEOw?aJt1ph|Zw;>bmiPOTY$%B3c&DKB6c`t*Z^A1d4k2 zp^6V0Bv;X_^ud_I0S47!m2O&w*fjuslE@jP+XisgkNyu4g~rT6mq&Pkji6W#?4|_M zg6R$rA~OT%$i1+gjvopKR_M(z95GKeH8X8GDbqNS%1`@?zMn3CA80i>YUIcf!`*N< z?8~9=y*Fg=pm*PS=k2%N9QelTuf6)p%P+n7!hrrbn(W3TM~@jj8b^>bSWl^AwvcY!YHN;>4F5AsW`=);chXGPfz&JkHg7`=)J*%HOw1t zypG9Je+jH2MW^8;!4x;yP1;sDal!=hHg*gL8ZlxR6$7=u{ie+Z0><G(V7uu_@k~g@HaX`6vvGK&YBR{Day-dIvM(P6i465Z#AtE?_&_ucJUhqD z-Y^S$%QL_x<_4LFNewkTCy+N_c9KT|E40BpF2-#D1fLm_VK7PrJ@Q74gfU6@=5f-O zs21#-k03aA&TNAItr!nnq7xyMEjxro!8``TIw+A>VY4s106n{SW)Ti8)h;0M9PDCa z%o!k^1X7aJKn6N7^6H-PI=GT#M4hJQ#pd+iW6j(lV#|cuF=2p-F$%1MJ!a6@9 z2_c%0kaSSOd+$kk1HE8G*ViQgSF5WRFJ80|#F{B+G0n<}6CoaYTV8)+71E*W#{pDD zxG+Z;GD`!c;t!C{YcJCaK(`!(%a$zhBWjjVKL_L_FMmmRL0)^(dhZ^Fmc1p%W$It5<AR=Q{GVDGXqfw?i;e5+)?q--kaQ*((wP#+jYV{)m4-5< zKatOk8`gU|o8SS0$y+xagAVmN!wfxm(}wkRWYmur3RKZXaZORwyME}u81FyO&Efo} z!S#(Uv>C>E`8}Kod~$vgOd~$S`9Ur@rx^V1y9~ZwF7XW;pb07P0J$h+D7fYL)OZ$q zF&>WKQh_jUTDN%x_=MiknbpQCSAeoWV|sx8>ef-5urwGRooW3gXP!8SKUT67`N`HWK57fi1_UtgNPneotSL`b;cdoE(p7f=P+?X*nqlCe1oI zJ(;I`9_E5pycjOz)95U_kWZ1(s%4#idNeb|e7d|B3&x|%YdrWL9Uh^A@sQpSx-HGx zi<2=eoF3K3ScuSsr8b2oaS3VC8x(vi!KU1(aSWB(p}siwE#30I?r=s!#0eh_p$LV1 zk}6VI+GXV;iE@T<1hl2#)1vQO9}JPQ!x^eP@HtIU)JI=Zg=A8@^ar~}T>(x6VMXV4k_rj0l@3}w-hi4>= z4@b?ISX`Bx zz8w`8Q?`l((&bXNH&M+Hg!41==AtZ_y%FexQ3B(6PL=BOc^9$X+l;CbR6upAWI`fl z2e0%-qp7w-0A;pD1%zU&&IVGk1rEI|nE)wFmbohJSZpzTf(oTwFsqKWmaow`F{uDP z>npoK=6#+;kfBK9ZX#~aZL&%E5{+?8@=)Zo(kHY`Qthu|(F#GRYGoCPu_{oEH>z4$ zAwwKK1Y%~fcnsySo4T3xDhn)mj_MYMFgV>H0wZ5TYFaVW;p?Yj2h$2w36H#a=74oH z3LTtD-Rkh*{Vg~Li<7y)Q8^%mhwJHJ2=C3ouCjP$%;@Oo^!uX$?SfHBC}sFiH}q>V z^KZaz0Boo%j$KCqu1`El1E|A$`DWFJ;jb^pLDSn>jKV2pQ7ps&Bi=t9tu0Os0@Q@1#NMJhM$Be-`c91prYU!w6a z%~cvo!?jrO=Ei(#x(2S14nP5L%86hQdTLP|dxe!7v1tgEL1(OQNy5S(B$x~4uCh93 zjsRU#aB9{~!X~Kjj2r(6V-LbIO_3&Spo_{5%c{aS&RQIz)TD@(g1PGv?U5xE4h_JBkxkwV+4~s9(zie8(#W`O{yN5OCJN>yqC#l^nhrCJ zay?y|C=F}|@hFbkf^xkmw|KP%_32PUGK7y)RBasg zEovznF2hP`-^j;I+#aS;wyYD7Xu_1yxWsrp2h(t}31tu{eMQ3xN~MWeHeA&kXwKAN z)P!loOe!%@umKnlQGi)yd|_YV$zdMC_>7N95~d0GU_@*idzeN|Qjw4jLW42N*nZyvkaY^cC#iVir~`7ECh`qjHw0Nia>;%4z{J4fSXc)?#=Z zRd?+gkMDdvYj7)Ml(J#?qjPw}p~bDwmFs?n7%-L5B&ViUZ&Q>co7R zPlL&N+KFHPi@JH5PFd8m= zQ1{4Iil9m&n4jQX4yK{J0Y z2F_1D8Enj8^5YSZ5WceR29EJw!TB-RD*%U)UV)xya&0Ya4UQpyG7B~1ZX_4MP^(l# zXD}^*1Z}uz( zV$+|8_0R*CSaLp?NN^Rw%+sTDiN!m;`7Yoc%YerAnMi2G!>wE+SV()}c)2K(b0izk zJCYo54NeLmtYIA?CsAT2<%~wA<`Du*DEgqv4rswIl-PoYk55b(GSRTAWx5De!C1lQ z#B~|i%R(6%C7NG=V0eps7*Mg3ZX%?G8-_-=QN~kws6TP zsv#j7R^bezbVJTjB{D)n-gDk$<%O;2A?L@5LJ{ndNRhfFPzLSX z$|HtTjmqIHtYJ7N(wdO0@hYj;pm~L_XRLZ=VaIgne66rHtQD-vFhaToC#Vq>pL}v+ zb%NZjoiJ4=P=qYaN+^Xjo1vGC(4pmgz^-t)TIxf#7xY!S&y{N`yR=GXd=jkrHT8{L zIfhVjl@Mc$5}`7vH&MC0K;CQ}Pjgk9SRb;=Lm*VzH3QAnB@(ACuAyLy&BTq$>6=ih zc@nPRhE*uy3msmtLS95sqM)q8RY(z$#>y?#O}T01OIOMtb`s-eMlgN7jYILVmf#vZ zC7(lUD*Iofl`zP&;Kl9-cTMWCAHnIk@op@(r^>&e%P~y*_#PHMB8rU;uzwYd%8VT0 zMl>LrBmB6*-^xGf*m<~CmI$y(hPFZQVK?eCf?-zChK&fPXb6}BjW1D}z|}{9A~!Yw zl=>vx?-DLz$%n+|pZ=0c@6tpHS0BkTNPr3jzdZf|OR5oI-By?y{wPVf39$<8#ksK` zv#uAuVTK1&egbe@WlykFoCqdHv8g7o_OaiFV-aeTmhLQ+agk&IH!Oj?q7%~)z8n8B zlqT%UEdu5)70QaX1YQhcMTuZ?deY>|0Jkb}p7bN6EManJ+WZB9-7(}ZBJ$JJEE~zk#-n^_WC;`*SVy)^HG!`GU7gr?)Cgh?!x4GgPAA`Vfcb2M2@E-3e_{}8rE%A2j>gnJd!aBP*`B}1mePw zLYCo5IYkN+V8QNd1%)~Ko)}dG0^lOzLZKJ}1k^(^aiMN6QD3oxPYDL&0XLyCWxdWq z-wJlCFqyEtCgAOyAOs^mxuZt><2SfMBr_Y;kZe_qBAp^2DN0a-iV+Yf0Z`)&t_3Vm zs6yB{dJ3uS6WvJ2{n&1RIRP%Hy+2ItH3N~%Pjv98Hs0uC(gmlx1??cS& zoyqSzz(NP~-@MUwsGF&j+YSfC3cceU_4a% zMyKM^X9(&+^7Lyv1Ny^Ww4=t=3+<#z?_9g^bO^x~5j8y+sL2IpW|#|PhC~^h=nz(3 znw`NunPoLUun9ZMZNz!pG@r z)4VqCwif9v(7$G@orwgdhJ%mT8*}qF0sbhJv1FoITU=tCpg)ATm$e^~V2WwXr%x`i zS`Oq=2?L?6=?FBLrCDJH)ic*CW!pL_2V`ckfTlH_Fv76KDwfBTDn< zbwp-?P&Gmh7Lv~E&?U5-8tS|n3W(W5l%*eDC48gz*$dLOC=f)gpNgxHQ$ zjP&$e@abWwbQmO3fhHC5w8 z7~FH>Sw$@$un4h<4L}9orx`wJ6Bjf;u+zLcp~`!-xWQnjf$i)j4`AvjB^$Ni#$*wi zr&zyI9XH33O`TnCM5Gg+xNpOrFlyA|aAXh1H#3uQbkR3L39tAxy49vz17mcf%4l(( z5C{Dl*d1mPC|%-Ho%Lpm9Uc_L`QMOLkn(J+8`}VGv4zI&s_ZTkt1OHEGoe$~cIKGp zOa1*joG~BC8;hgem<;a|{zyU&j6dKUdwwqQu}-GqAT0*u4LlvJ=PfLpP90@q1~w*d z3Z_6_5vibf$fz9{2AQ3P9mZP;Jc7#x0USq{@B(&NjZTHS*_Tyv<;h*nkOT5mt1c60 zG@Qrh^dMHsm3RKA5r}4MqR|aVN=D~zF(MApq7%p%wcO#DY&sjAgaeepB(}sgHtn1+ z?rQO%FjcR!w>Xj=cK5+KP>C}NagxRGvL!BV^S(-Wqmw6gF&IX}(NqXCIw6KWy4Yy_ zhy&?n5wBSAoWAkLYpU#2%M-g;T)>si;);^QW@*`u)a$*u8;qI>pKPazCr=5c;5aca zFqS5^h)ROX34qs9#gjKG2@YPxM!0TDDek~ZO|*PFoULQ@xO+rJk);$b0O>Ag<)kP& z4mGIbP@*L93D3{t%yOgg>{=_w(*b0xJd96D&FqRRg{3PeB}#FL7P9cCx9%h?EvV5lmWNIcZ`g zT}FXaL+IQiL%!-D1sy>qghd?TwJqytMKBJlCJgjkgklo35pruFFATuqRZ(1vALvSj zrJM|Rxc`CeeIo&e_aufrSd3ty5@($&0=%0Coj=h87;YO4z|4*)sO1ItPB4X{;*sL5 zS~Oukz%(!j4sIjb+Lj`Q$Sp}=-utx5G8uC>=?d+06aUNRS$NO0`+UaPxD*T6rF#bbZTTw;C)iVKd z3Tlui(6OI}>QWknI*_H5^(Cw*o({Vi`=QsiCuPSe7wV(v^l*83!0)vQGcop6VEgNp6Yo@7PC z0tI<8S>+51V_*RZ1{g{GrSwlBj6!X}Z z%h~`a>M^ie_~L?U1#L13>V7yc;QDPz^k?itQnWT?%%{8~>7%=)9EHrF0;{VN3Mb$M zRX;42vva+_B^9Pq<|-?0Mk!2#43VW`KeImKEb`+%1c6FF_8Kv6`B>Ll!n}&xeatIN zb;@)kp2+(TOcR+(u^li~+MO8Q-%*hywvqG@=ntS(Hpj{>q6+ePKQhmTf|fHw;xG;3 zq7|<3Aiq>Jh-pMFlvlj}-+=mWY8)Sx6vRL9BKLQItWkj#1mv4+vjhPxTFFn1P2G)i zH2i-mv_-X{VW8z3yL-ew2mbas3oT6=b7qA)g>4#x=}FYoEL<})K<)ZDwU%U>Lvn50 z8Gxl4D+FBEvTI0)C%T+dTxE3XEU6O6x*ky1P_^V8(osyjtc8n6RWqYA>v4w(e<1c% z{St}rVw`SJqom=rpi#I>X>4Oq_5IN0C*6MHEhb!L3TD^R;^LY(OchtS^Ouo8Zx`5g zVQVsZ&b1s#&zU`^a1OeOkvKOv=d4RmC_!Lqs6ZfayFbNiR~VT$;OF4%O>`bR-pO1* zZMC27QQCzjRpAtuh`~1QlDb*gtKvPg;`uHPw!NY00#*L*73&b)p5hfVUK8V(x>pyV zwM)%H+^$=&(7cnijIXMBg_n0IF)qbTErXg}Qo%6COtHyou&@BF0$^$fwzRc-U%Ej| zC6j5k5F*dvjl6|yWy213i=&H8WNZe3!Ewip{zdongKN&b(Pv}h4zMm0T37g>dIbco zJAGnZRd4RTy{=yx=bScXO|Eefk!^&6rI}^;q6Tnw@msp4zEG0p2iL^yG9s>T^Zqby zK`v!e_~mGV7k2aIwLsMBWS#Yrh&O4;M`;ObYg{zmZ@>Zt{ctjjx-mFG? z*VS=dd|!lH!?-xjd%wE3o333`>uOi5p}Xi_rKYco!>~KT6)~T`xt+VZt&791HdtGY zMYY;^|Nf!FptHP8hj#0)&%$cOJXA;F(EU*y57|-_p(<(&T^dUr?>Lnxw;O_;LT%`oCIe#@9Q?iHn{am z8KCLy7G^{(%ah{happ4QUH9g}x-NX<&UmnC$woHUvT(L*5cMY zX0Y{xZQHhQ`(O(T1Kx8Ly`rt`M{~f8p1E3|A7|un{xZw*A8oL2pyAz~`ei z{nzNjDKO}G6zd&$aFg2V|Ig-4>OIwne;)zlzY`hw`2hM)ez(#O@ zKbyk#vZ^uUL1>}|1u$zVaq#ZG?){tpvIQi3fSog<8{LK#7Cs5zk!=-!{rto5VQm*M zJTC65c_Hc7tq;~`*gJ5gH8nFQK>7#+NX`Hl0Kk9+5Q}|uVYk+;b9GC&jerQ|HDH&! zRckPU$%`mL&44mQ=YlW-vh_h~-C8z3SjH!qAHs$(36r6U6$?VjoeDzgy}$sh_63Nb znYH+`3^81e=%t7!3>(f!0zG<9L>OfDRsLff<|FuwU`??4MWztDer+vhnEgkDSqx#2 zk%($kAhQMrmO=0Y{9nVOC#07aax&of76+@CfoTU8h|xcG<%*i3nw4SY;uD}|&)$n+ z?cieoR3KueU$P&p2v+_bIaEV?2YRzn@xTnC80=F3n5PaoIP*6j!5)IkSnTCWE(9?j z!)bvgJ3sy`rEqe;7!CYz)GLY|fn`g9YeMz=i|a}OxeTT-$`~Yi&Ypb~s+YJWDfTOJ zOV|Ndz(`fPEv3PQDF7-DKEObXCoqqoF#szVw+Le_ypMPJmR%AKmnSrh9vj~FW z8dRj!TBj{quKxOM?5MnAL%7go5aYO~6P z$&fTfQ{nGghP{i=de5prwVTZ_!l4Iau!qIgOT(vNg6Zekn}Jm7^xZ&j#g?I zoK5N7lr*qAW?eM6Z7Us=q3sAB&=AwtWrbw*;2|J0v!Eoa(HBQ5d{U)#!LyYXEHVMu z09DegGwl0WfQ`NMZ1ay$Uw(^7g)JdCLz5BHHxw7tF*K%*p|xgX7L=ecj%=#7n3AW} zxE7W6GAJ=F5f-mfNEPoMN(&Pi>kLYb@V|v5#&m}+sTm%yTAho?tOvPE;spoSwxtV| z1LT~DluHM5K~}P01vp0q0PFUyg0!0UQXX5#S3Ph~nTni~Rt6)Zz_nrmEm_$`0D!tHO5`4_ zT&@Hv^rzA_SNh9Fwa`N~tM0LyiRhJWrwUdrLd9jQo66p$wsXLftedJSa-#*?g8ZoX z@W-uQrrh}w%!N8f>TKM*oxIb=C^sRW5cHF{Hdb3r)J|iQ_)*GtX&4wZmC!MSc3*J3CKTHGedCGJnVqZRPU+Y1^GI+E>j2Su98`r6ZeY8 zbP^Q~lDvNaX3u2@^!ozm?Dm(3?Fdgcc{mwX7YRB-#hIT_cv|patxRg5j$p%IHg4F! z53|&&1B7QKqonVFH|sUX4xSD6Il7QDVJn-x;ZF{@H#R&3w@`evdB~myPtan+6ZLHb z>!8t ztXmzQ@BvV-aHo~sOihgMR{W{pp9BL?n@Hkr$)5tm3;_DJ0QYX&MtWO&Kx&c&dE6UX zfHxp6Ir*gnv>b#0FudV*;QnyIlJv45pe_~dlN58pr3dOC<3oQr+`nD88*7f?M-PC1 zD}T^zFT~AUcc2AG127-*kCulYYBB4FLe?#i57^{3Rnv?C8*O=?#heuvWMDi$yh27m z(5H1n1_8f*ML!5OR^x*atvW(E$h^b&oA0_WFAhPgfp<*7oEVdE8>-iDs6!mm>Y*hr zmNzVeiM>_)n8DW?8C8xb;1y``-^Xwy z4}^a%yyEuO(pnzy(*t~8IZlApVK{vxAjKhuVFq!aPD?+ywdq!;(fU7FwIZxAF$JC{ z$fZvOB56=I#85=w%EfCj5!AR#32NW z=FElaVz|WN18fSGty;QFkRZ4EEDPoeDt%b+7ln@%FOngIxDW^0gX$!J`_d)B5>$Iw zeU=HZegXSFhqLb`b!ZECiev`ADMYsz$bGR2HUvP{xSo{O&l1Qr}$II~(jutJ9Ed(~fss)J+Ia}#s@iSi`3;3#B z#PDwJUY0=o!#Wk8f#@yASGmN$Tr(noRP|)#j~5<%fK3S@f3&s6#}*4c+wgFFOQ5t| zm0pM))-PP5Cj-_^yBL@qpvFQLmpg60#WKGjKlU@j{Y2L1Aa!g{STK7PZamB(bOtq( z2J)4v{bcm zfDVP_{~{$|EM+rIfrCTxItqvJwDVp$DK;rtIZ2#H^eh8!ZJV(2lvf@%6;s5FXB% zOs?n7J3dE_rwv?q2v4}3)C^2^<}ci~_oT$_No=|E03SZ<4U-P~t(9-m&XgL!H&UBQ zG{z;&7sArGlV~wiJJ)%pp+#YQ9eoqlCJf5Lz^j}eA!w5};2mll4O^nqV>23HauORn zMBz}SAw#-^eZbZ^6JuzpTG>K-{er3}l@-M;1~;|WrM5-Qu3(yuKh1YFGH zG2m!F`;bB(&nWL4=RO)Sm(evv%rn4q76`TD%e=WcBUL;^E~cS{jB|~KB4aAxO1|(j za>=~;!TkL=VU7Q_!qk7Aa(N>l%W$YnB6^PRheuh>T*OaSY2g0*0$7b-Y|&DtR^%jl z*o&4+s4`DaD9lKTbP&bI&ebfWy)X$OL|77{sWOp-m84&SCXhuO#=xlQ-J0~>`~)BeAl|Q^*?JDc`V49ZEh;M|G1^Lw z-Y@(YuBefpXmA#9G?>s(P2Hrm;*(9s!Ly1dR4gkO)u0Glxe}|1q0s%tQ&>Fu>JRiD z#E~9Fi`So z>s%c-+<|;eaD)sNq5QfBmy1xenAW5;L1)AL+_l~a@V-RI-2#PKI|R>ULg|5fPtVbF zpo_qfhy`2jZsRh=NQGBQ-@6(zaenrB{vYjj3U&G@C##e26dEZ!PM%)I zPZ{HyiNW5@ThypNgnT$LkaIQ!83ZW^-wV%F*Lb&hBe%Oha38p>OSIjbgS|P}47)Q1 zi23jU54){XzhE<9d$6sV+uh-j0oA*#+r)tAWjmMv+!ZF@2zCp$12((g+m1O5*u!Ru zQ1QaYS<}Gm@Duxp*rWhV0SgD*arY|+%#Kz&(sOe%G#0%5`Lz=&P$Jm&;da~c=OzTp zF^~E@Y&Qdz-{wRh%t?B!TyW{bcI;V{G#=lZ0Kzmy80wHG76^KYx}k%uTsR4Jh`K+= zKVd&ih$a}?0Nf8zLu*I&VR@KAfTf!yo9Ka1A#A{B3J-WJ-cHf@ws@rNW;#FDJ_y?# z7LWeM?H}d~`?Lxu0QIE#K&V7{aQ?#*paPm9Tu6&o8x;D?2UwKJg+m{L71~D~$ci-s zst_E|i=sI7(l;{8Vwfd6ANYk^8AF(9nJ5K1!_^<+Zhq2-KExhd?x^DtybU_};LTha zM$a$`$d7CBSmp zFI+I$GkN4EV2;f7D{Z%9*%h5;Yk}TZBYQMbL5Lf%L19r;IhXm`CqB3mo*?iaTfGJ+ z=8W1GOTJj~$dRRjDh=~vTYA7zwH29_HH9^6Y`$*z!P*Jr9)vGoM=; zEDu&hf!9~CHWhNy%uyEm@Ga3B=%emtvCv?h!NkYR2c! zrk}YnFM2;ZhWBV41!7nlqdc{^=My%;x-vG$u7cGX(8t^tE{ZMU^>@^El3K{PYH}?V za%9WeR^72)kmOKiu{ccOgA35jI(ND=zual{sR06|ZA)Dey)75;!vmrVR-)KLbsbh4 z1}KCHtlA0TKF}x1G?GK~m_aZ%#gCv0=BMY)7Y2ZvFx!uviK}`^|g;mCr{6 zb7FIosLoj%*O~Nka7bW^c;7_Nu;p8pSW^qE`rvvH_)wgC$s)3dx88m-D6!9Zhx zPoNI;2uwr!?E%oc>u0O=`4U$Vi#CrU*G@rm{E)mVR<#ei?flaZyRfeR)^Mpp(3#b> z5)LCa3ssn{ADdV##a+-Sn!p42l6594zvSRKSFPtU5$X8=+rkZ|#_$9}_(<}Qo>M=| z{wf=br2kf*{dG2oq))HO{x<9I{j==v@I6zLy)c`O{4IM?HhoAvzGix6f1k}v<(JR0 zeVWYYx9|o2%HD)sFIpT}#Zu3LH`sEE*Q^VRK=oiPadET$i zHz(muesXK_@!|=u%URbC@|xkD?qI=kaIB_lc56Mny9{1=T?wl6a`l&+Fd`1iFJi9{ zeBk`tzL9rlgI`@hr^Q1=6fLz$E3lq6yhUc#YTeAjMkBh=uf{gH3+NnE_s{(8VBS81 z)#+Y7hGhd6Yr>){)4nkVudd<7`w%s0%=J=H*G#~3-;>+l>DLW(FCWtgeZUzI88(g4GoVt{t$p!D(8y$24E0A<} znVe$|9LOtnumO0;Du8))AgESflyI8p#!;!xknk?qz~IJx3qa>PSaO<+eIsz{!|wH? zPXZgbD168Sbm@#X*N+|2HR3W2I1ddLtPu;1M{1O7K^uO8GV^$REq8oY`GzXiZe(^i zLl_++mb5|jLom3gXxb0^RanPG5wej0LV>B#%qCO@n*mtVL0=R$x{z#ahU^59Ydm2d zN#`(uvMCnBYMgCK*us*WT4N1%E>NcgwRkj72A%qGzieV z%?I!a>*^Q-)#vA@PC5#342|WZYZF7DvBi*YI3h!1dIKFl zwPVvJwZvf;f8P_->jCp)rwgN#TsWQ@{_y&x8pikrHEjICMl)t;(jR-QhFMCDLv+d2 z^!IN)Gd-PoAUszN2tBBu3LA1r?=TnN@dx&@m@Q7!S_6$ytUrdgm!Ss+nM7QTg3vF9 z)3g3GY_V#ckeF)ZxFgUl!RJKiL8+9ZvHgxdxnU8^(^{9(j~IXD54rvy77dl2u+>W? zz>n1HiDs?Hgg^l^gIMUd2uv37b4@(rSgRA+GInA?1cr4&oR}UPHbH%s5LKSAIR^8n zx+EjKXf&_9{}^9jE)wTkb{UrL(2rEUfeV$#+0h$9tG0GO5(_UWt5Tr*_2XJ7j!`oV zs?ChLC;7HE@*-UE4dX7$Jym;%pDTR_7n>ZzF0wBhUcfl>Veq{nzAH+ohB(5CTCq?j zFtJ7-+z__?S4rdBYUqwP+2n`jpqX=Z-D2OrMM{_URA5M)tZ1Nigo#F#5H5K`|E1DKStkPcjiZZv8n1gd&OWrYu*(fDfB zTNsNyRn)+ap+)LbvF7VTcB5q8r2i3(Wcu+KIZk=Lt3u7%u$WL->a#wC{tzZ87AP=R z{`Bj|q13=d2z+(zB$t2BERI`Kfctjc7#oUiW7nhAj$HJ~cXvBaMypL8Ub76Xr zzoUjl2Y1%?fqfDK>K39Af(liWGBT1GpVB(P2u^}W;%mtn1Tl6D-;Vb~iY#})q6|8u z!Q@yhLFcwViVsA$KAGFbQ1(VBiO5cjMRfaSN?|1lSz=d}pHr}>Vgf(5PVC`x?neC! zYNI4!&Zt}SvSj7@|CM!qyLJ|37~kL8AR3SGB8(>{3UXUs11DsyqDWN&2gJk>R48pX zZHb}50t$&xYE*<)G)66VV2rwjw*G$4GxM$0nC$E((CIt#{(YXA`QBM}|CCT5HoVT~ z-hRhe*JdjmC+nyEQA*Wm@O7rnm7(c=@t-&)BNzKkWTc39sB>k#M3Hkn_P%;J;fHjc zfi3CKM7jzZ%^e!;qx`iVW#El1hlCo>ZbW*EE7cBSv$Qf|k+NkCZ`3Mp+5MZTdT~3i z7{Ek-r_d-VL)$xP6o|dgFqEGy8xCC9_8|^BlNjwZzIo*~zHOp7^wN>+n`Cmi-3t=- zG)jLWUA1!SIgZsV($U66(hMC!uHNl)D>uSplb0w+22%x2_nyJ)A~6TIFbKo;UQ$bq z43S8K*PLb&jSr+updNgCOBP(-c*Yh?rJ`M?7|oGnwODe@bA){)UV9T(mJmLVTB^oN{`5t`lS3YG^3azy4IN40NR#h!9PvjNmN=S5i*M! z#cAg5z79maa3C5=)<>WNRcrhegjrG(C_nz)Zc8M<|A_3_m=k_fABl#+{K9egOPJLj%cDPyeGROHrb>{NkE;$# zpqLkigKPav^bDNPSL9eC#=v*dWU~tdE=&uyPO-p38W+eon`M5m=aQI05FAVBHN(N9 zm^tnY&kU3@g~Pn7ylZliv5k-*Udeguh6+8io1AbRhtJG$Co3mh1F@V5@LX<}=A14t z-0tdCV|ch|yc-qt$){A?w2sSzov$@~W52QxdbcLqL?li~XdaF}%;# zNwy|wYBoLR7Nom@Szr96;dbtH zm|ybfnQC!)Q77^;PtAA6XIjjlGY?WJ8V!^3k_W*it)auMgK2C`@%VDpjGs)HoZUom zUxi7g2wHCnP0IGM2c0t{bR;xq3PDIlTOBl&@NC*t@AkA12Bi52zvQJEM<%8^_CRfc z>)YM0sb|g+C+lABx>FeleSfA`qi9ATtWHt|Q$R}!Q_Lm{b($*~ad|r0Zu<@yJ}j-$ zG{ZrCAdITe=Y>J|XX734#HbEiDIr-m%CrD#zgdvL2aYrTz!hbLXapC-cvjp5pEcL$ z3qWib#Xqw=xYpZXpx<_T+r<@DM43fh6UYo2Gr;TuTBEox*PatpATP@+u25hQP;sy< zZI({nfo7^J17(_1USP1D*y3o#hYTYkCfx#b`M%!k*qcErrCQ1Il0AhnjiZt#&kSHO z=>sZJyM+ZrhM}MiJ5Wo}DAHm+NfVbIgPA{yFah_#g|4kg-QHw*yC7Eo4r|-&ezlD< zTo+lTKr1#dRpTp0QAuH~K1s}OOGhP-eSROqm4Xro0WX6Xun}NY3E0Y>6MhEbT3-84 zd-HoT_UAxCnA72*m{?0I=+>c45AKe(_ni>xSa_C!3N%mg;&1!czk@sTtb}Vj<$SPD zE!;gv3$IU@8*!schS({^`4K%v>$);5x8+;g3--37Ro_d?Pj4fxqlBz;Rc6hk6%Tq` z+IDwx+y@aD%8}&F3S8xlGs12Ge3!ighxlvj!C4*~ha)lcuOW5QZssxl#KfsciPA&6 z5;;oa5Hk;Fe1v=G!*TvpNp*4v$kjYkbQmwH z;U6-&97vwr>Q;&Xw*=D6KKsGr%a}}*8*%IL;2+{%ugY3E1GS-_U^PV{;A3PJ7ngx} zw2zMyJbQ<(N0-mVGY>pWp^k*n4<7h)LIFgkPh0d}7Jb|wc*&bOSoaU!c&1xFNepvGGAu+)am=yfM zUYe1xR%l;YkpeE)KAaqI6qAvU%n;4*_azp$4k#qcTi3~)O@QVkQIhaulrJi#=h%is zBZ5dmF_eYn?Hh8V5HfOZDUN$UYNp9$O%juH@CMNG&RKUu8ETdvdurh-QH>0FFY*(nj*)7%e&8IX)~H2WSnPFkdt);cVmy7~sY3F#{sqLU-uw?Qc>`c{fRo6gA32pCAt( zg9R|qnxrW)Nb#9?w`ZmVewm~G?PhrUlA|Au>A=0f5mbrenLra4WApvsR4@~*KplX{ zFc{6oYtunW|J8CS*4TNY8r}a%AifaBVvVmn#@!6%lnaE( z)z=ahdr0qILyP>#!30woU?^@tFK99haAHC++SnJF2`Ub=o+e&@pK%6-F%fvzJ&Iw# z$b0tLL%&}BF;3o|5x#!l?J=WKA-7wC1>Y4QoM;r4@1QPT?6s#|& zf-Y~RNHE8%2j@zyi3tc3aFHtvzT$3_BVqT3u68hYi_#KEMc9lxd)DOSa}b0?Ln;1} zfQX-I_dw-T!vr9ZBxzIz=r9AK=Vp;-eOj5E&n1+vjNFuDn1}m%*bM{pC6^gTmn;>9 z*af`AUm#k>`L1N*R^E?$&bVz7HEoM9${g2m_;oJS2Dd(91jqdU~H@!TtH3!H`71CTz!zJUA1!d1=QdA>YTN!>-D97h4>7+BG9#f=-Acjx-o zj+UcG`9EJfI=c7hz0a@n$G7g?c_P10AHMgP7f|_i#a~=N{qk4+WB!M4^LOu_J{$pX z?k2edyx9E==AE1h$WL=j~@J`RE`@YuB!P(#l*zcknEf}r ze?2ZSSK;~U3x!oMw~%v*ET~cumF=4e-d5heqG7 z?Y)*XJj!wEe=t3)d$XHy1Y-KI*96 zK?mi|VGt@2NFgiI3~ZbwE%Mw$`{S5k>j|G z`AzCx27)21d?`f{Id$1>hWHdum+%CH+jX~UHG#(%gtQ^Z&4s&uwD1W< z&w?JnGIeQ9uf3n@4V4y_2eKKNUCcjOn30F?gg^knUVKoDH)_170o_RVhrz|hu z&Zg_Uyc35mUIks@WSWmHyF93IYZ{bY#tJ`ocDmWr&Fx%d0>E>p{{OseI19k+{P8Ovo_je#s-U3`-MO#) k290Gms!=dp`mw-~flVG6Q01Egx=bju2RA%Wu|CW3KlZci7-kP61+gd02z4BHsCOt5RN Q0}3;Ey85}Sb4q9e0BTYVLjV8( literal 0 HcmV?d00001 diff --git a/lib/plugins/extension/images/plugin.png b/lib/plugins/extension/images/plugin.png new file mode 100644 index 0000000000000000000000000000000000000000..62424b2c7a15fad2e05f1674ef3c04f6c353d6eb GIT binary patch literal 4054 zcmXBXhd^T^1|I_KDXb&l0B zlZuj(P50NY_v7>WKL3Vqf-zj1hUzL62?+^}u8xK&U=WZNB^mHa4i_krkU-Ln4a_x* z{;s&F_}@yvm4YiPD=h<8URM5Z73CHGRtc^OTy=F-H8^xN`rm5MHUIXe=FPv=f~%{m ztpisNuA#o+@7@Ay{I@1x&41U@0^HxVf@^DSYXbv#*Y@rm7(jbFaDUg)-q8UD(Am-1 z2?o&B+0_LG(B0MD4F-Ve#$dnzuox^B3;>74;lKcTa6LU>0KGlEy`(_jEI(=#(*0PknszXt=rzsKXj00?*j0SsW4Fgptd zFgH6l2L>=dH$M*surR-{00ywQu(${Y@L}=82QUEQ2O<#+V2QZ21O~9YwES-?%PT8j z0IMsj|F*Wewgv{UUX9)vBO#$a)74Nl4n31USJ9AsP4bPg&Fb9jEQc@7a0YL>tvgvMz5n zSp}Xj&>DC>HrLMnUN#d+U9PdDvXA)DeA!56U+8ALrTc!y>?s*%X~U=u!K5|EYRVtR zT)BLHM0Fuqs+!19@j61x*5!d>lGqL-rw2cxuDfeg(Ym^UYJICS^s#X|igi~l@|r_0 zXL2m6SdRZ|&=AVmqwJHiYbGSaMCwJu=mY3`DH(}{pjvYs12bxw1dV~qiK=|X6a%P; z2$cx;ZZCW=0qwJMJG5yc|6pY;i4j)J|t zlbc^P|Kd#>Oz~WL#X}>Q!67#8til^HC{3Xds=XQ#X%>y)d=V$www}YY73eH#BA_>+ zB$;q^KzWl(DZ|(v+Bhbb<}6wv)@S$T2kRb0UZ{G~IWA)6@S-_?-Z6=T8uF)k=|8S=lAz2*jU1#_Hm#17n6Av zA^ol*svg*W+jxpX0&@V8HuK&id3$C*idwHalP5N}mj+jPqy=epHBhh#%JfgmO4-yo zp2WaWPhDO$SO0tWnqIQo>GU`KGHgIb_OTZ~@63?33&x34J$<?CrMGQ-46qwQqIiCQB`6?x7HPZ;v%J` zsiEVB_~;v#TD#PVuo8O$^1{LT?qlBKwKv|!ocd5%yus+Y`bDf7ZJuxi6R>ggXO zs=A8*u<7=R^2)1^fv2!1pAHufykLwRG{5?z-JPbW=y^hI$QSFPHlj4GZ-K>ZiD{|i z3+nbZnr35R!`=A_D;~x1qS-B}7;+^AdCxnH4-KF)JbW5NKkd=aQC(W9T#5S3f8JC<1$>% z=r(;4bGebYD_K&RrXW7j649*88#4o+7vFy))iht7DcLu%f3V}iyKv{=MUHvRghykY znm)x1YR>0Ry{ky$oY1eDw=#|DUg_yrycr52U(?}AiSeqfDQS3KrNcMuLLgDMA^_cQE}9XEnNQ2a`XihSCs0nb#`0*YS!iwBLE@ zX&l+vjO*qx`77HBC;DREtkgV9s_D{DKl)!B`c(YA<^8!67VW6Hl4A?aRu9{nK62Y^ zZ%@7Myg!;JfsMnQTh#8y%LDR03YgM{HG;-LYt$v$@n~z?yEG3{YCBgN#YJcg)BG|Z z_ygKsZN_{M;rp>xN3aX+w-5| z^K_efWviAS$9OjA|Qx^B@cLyA0y%cN-F%x(L41MtS54< z%ShF!frIX?ndCldfYU{moQ7F?A$}{4p6nu|XuNTx*=KUy@7ZnN*VnmjiHfT|hVfYj zA7vFA8$Qm`Z!u;y<1Apg<3hk2g)ph<`(&M;2YK+DjqXD-?R*2~`}3v!WJ%5{S&ZIs zL&alAVsY;}hW%=9bg9^ex48Sb^}se;ia+NCo+NR4tgVOmEZY?jY=*g!Vix;^ONlvO z5{J0MeI@fXIaXvgIftSUv)eXqq233tB|1G$_XW-*+zmf7eBvgzG4c{@*S~chvl~aE z5O^eqy(Io5j@2y%CZ_GgUX)Q)m$A5v+lb9P=<^YMNvw&Q>RB@AGj%%a^BlYFb}{ZnF~rhBAn~I5a&V56`y3Qsz;@kig{*K_xT+^H$OdYw0~#0?K_`}OKMTH zo-}C+ICMaMQzcP1owA0iJ}OIIR(Msy_NDD&;N`vba_#TN@p3vE(l^hROrotm+Pc@| zDj2T_Tf{e5TX;($(yki7#I7;g=_F%gDGe7N)H+`oIc?)L3G(vv(s7EqU-aKhO*5V8 z4|RIio#0$A7TZW(47Q-H{SfU~Z0ex6k(!4Ntj>HUcZZ&$?R;wW>_--t+Qjp?0H*DB zq5LhY5IgHrN8bw}i&ly0_CmoGv5Tma4XdOtwJX;-UXH>OAXD9CKg${UB$PMrv!oVg z8{cghhKhW%JlQJ{$U=u1%B)IIN?ygW+WTSXh06NO`b{U1&wl3=lEveWecfZu#LI9c zLM-AhJyJ<~d?X9y=7xTkKqiz1Wwi)l-B%kpn1vtJCl@|u|vnW zd9Kg#VccQsc85%=VL{wz3!fVG(=TB@2ZA;sgpUO#Dd?h|v)_~c<)OFZC52y#usBuJ z>GEHOnxFVfNH$USKymIITy=}#LI@j{pAifKvR|&>!@JhxMDy$LD&BPJTl(m`n_1Q0 z46mw?of9ZYY$6J*AnVt|>8OG=6Cj^Tu6@u@BVFt#FRrh+CBrQSp(8A|_j_aRC*Sv{ z9m=-8#Pg%06Uiy3=LE6sbi48hl{GWhr`bC<=jK0fQ;FFPiS%vn(j$XuN%FGa7|D;U z=ym1@>w{PQz!Gdyw{otJa$)bMHK!%R1a6q6V4Fvi^@Vj@YV)mYv^a`$NYfK3GTc%X z9o~}~h!|I5ywY}~oictCH77C>-4d@*9i>98thGFLSky~!)aYdJuggA#}lWTO<$db-KB0ZELDFa7_#56NRx+n=q z^fBWbwXjWnjY#S~qo2;_oGH&JFEpsFh$N_O$($KYLY`22>Qp_E*u0}Gn9?BPl9nS6 z)F?Y57u#*~hB783CMEHtPnD7-*0h3#nV?KK^Q6fm${l6)a)K=k>Snwm3Fr1+(&vbs zO~F+QPR*+$AuT$5{mom5;5!M9&B&36g`10ZUIR!aI5b1l)~Dj<3_uR@B{SgO&spHx n&+nQF1wVU`t(Y%ttiOK&d2&r=KUtzE00000NkvXXu0mjfkkO8I literal 0 HcmV?d00001 diff --git a/lib/plugins/extension/images/template.png b/lib/plugins/extension/images/template.png new file mode 100644 index 0000000000000000000000000000000000000000..67240d1eb0c8fb91f7db528c20296a1029512497 GIT binary patch literal 5206 zcmV-c6shZpP)#^nbqC?i+`}5|k|0ND>ZF+kq|A3Aqq#c0PBZL#i z{6N-02{T`pjjqx~FMr91hxL)Sm!cQiTI7$mjBq8ZUR=abs9xbZDCRdtjNwC#6V=Ux zp^a?zLON=DQS`9f9@t5;bW5;1OOL#pLr@7=Vf2B;+0U?qZj{lE+Q9fd(O5yV4dM&= z#IW3HjOx0u>$C;?u%k(G{({YE*WQt2?vnY2Ok(x9AzBZsU8^=sNo%D?DceS%)o!_k zDL}4{70;(5R_?(M$n;3nRvTKQTcQ{7CDlyW(%AVZ{&rYUS+Jm@P^+S1ZNL9lsXNw1 z;kAH^s4y(vBYAqBH0Mt6w&`Qc5^(01%*pv@YSCery*08$iL;FbQR?Av`1~uO%!{C0 z8>p#NYIb&ZZf*`g@mL(~D#>gjOdC15ve&B;+M>h$4zwX?!&26Ek;FwkM5(P6`tb1B z>9l*jelnQ=J|tj_$76aq=GR~lVkTZDX*3!o63K;yVlJ2C03uMywz*29%CC@>VI1-o zpbcaEBTHSj-Y1t#Ei;=k3x5pS!RP`NzQQ_6ug9bD<>f`c-v^OGp_oX- zc{5z{f0hP=!R_ts-Q8U>nJkyfGc&V}WFt9iTPWK@JoZiu2sM8yXvHjBAQ?-qP*(Z| z;_Yqc=H_N?Z7rS7m@DPQa%TQM^?JQ#vpE`%KY#w5!h=E%VvX4(3)UJVIex4H+y4YK z0XeXdY)uiWEQvD-!~XgCc`lnPSIS&G7Gw`MkIC~TJT#Y=mss7OKCQ-LF#;tK2OL{O zmlZwx*deSHv}X^rLE1m6EK!t=_i8p9*uFM4HgMarmG~)}P7`EfJafZrI`nS0d);Wv z=kuk~vXO4eE&s7aSFxiX>|#mg;Ju(d;P{&}p{w3i@Gu;lp4L}ZR6^Wg2e@rBBm&JOqxnr zrCQa)16p}$lb{#Y$Z=!!`pNe8c2X%zqThhRz^mc2sIiApc6x4ZadFWv%^I;V;Y+Tr zt}v0>7dC|3zQDEenNS0Qm@xMlm#)mTCLX8(-U_>|UBA zN;@cH>7*3wHS|X89EmlRAss+`? zZDoGYic+iU`s{W{;V6=_=rSpXVR(Ig&1Owp=0Wgbb#*le0(+4vaa_jD&Hu5Zj>qHC z=q*E@%VjH-3O~ zk>eG#+_?$`9i19GS85RW!D&<~Ww~VZi&JOK1KQGS`~~xcC{)UoL^2Vz6TUn@1GJ%R z=jL)C7aP?o_El70UY;*5E^4(MJSciV=kR5>ss|ZQ2kl?8$O4LmWj2u5jGH+=KK}ak zD?a0=tPX8B7+zjo@#3Z?sO{3yQdIBHpFc5kVUj25g%wIx8UGqyB01k&KDLIv)PR8Ns$nB;88WIs-W5U{QUIG*iBD}J62Z8 zt~Apx|M)Q)4sG2K=l6=>1*cl(BG1n+3Lih_@;Q~-2)HtUUFO%AXG{V*%GQy!--h#5i|jhgcLe6d*6^M0i3 z>jn&*0gMbu9Ud|md_+LJ+Jl3Got-a1EKs{fh@vTiT|A$HCN+XpvOc$Qcyt8Uj7QR3 z0pbqG2yW6=W!%Qv+Il{pi&Sfom(g(4?sT4>y0$emr=aE$(FkRKf1h%}fW%>4DwS|5 zU~`9mhrh%!m-sM(yBO#3SY3*O)=*FdMAkA#w_7b#OQj|AhjEjK2Zz0WPr;d+TwY#A zJxWHj5y$`nUJYfuzsf+Jn8Z5+G@b)eCd%1K!s`Xd4n%|KISn{m#8Z;VX6;2yWNcH- z&?O%Unjm!vN3;D&ZwgJRaBo{b93)xSyS!K~jXN^_zWcim)7z=~o3USUr;M4u&nm%OuURbVoKIP{!Lu6b9j7 zM7#DrjyiyFwHGpo_yvDj;zJDa?PNQ!0w{89ToZecGCP>2yGdeo z8d+8&XM$>jogDTC&PWB94XVzbl}^y&*a+5Y)w(IdEJHU43n9kd-d@x)PQ4|Z>LlSh zaN6k%!P}E;Hj9$o>Uk5`YPE@I>Y{$XdcYUL=WSLu4MM@H=>4GSIwDUw#LZd5Ob=!r zCLc!4hJu~2|GR^pot-HZiy!Cb5ojntv*TsbY5%JeJyZt7zk)2u^E2LfujkOi^YP?4gw961PUgE!_f~2vO8*%%umukq@3$h zQ&$wlHPh1auoXuvNN9ZoB?T0bkN*E(>K74b6zUWmbxdMQ(DG0m>95($nRBwTax;1v z?%c=8eXP6B-fKV3i3i~E`dTP^0kk?k244b_qecIG?Dh5g2yC)Kj^wi7UXg4g z#5zPre?+anZC$^9E&4$Sc@A9Kh|@L_VvJ$&FEXyqi&q^ZYm!9NFscOqYP}`y%LX1A z%iX(cVe#K7YnLt&=xUA=bcK`Qr@%U5Xb|2ej!9rd zfFEW}U{kA`H6Bmy5nWWT*A?gpRN-^hi6|I{TbvR3oTIqlHooD@Wq9aIm!^@yN-Ukc z^CSTE;lq2(8rMN!=_UL7@1tBM(Pxl_guoU!$XS>JF8<`iBt=GWHOyBOEtO| zgx(;t!%tK}^ARCYx0jY8UFOo;Mr>0%$tao(iw2*E)rOJP=lx-39!%XSO3f*A`E+s; zX+Zu7J>%2&u|Ns|h-{EfXIvx^_11@w@HZ-8h+p5mtlRSCy z1l56P6S4r@u$P=fb$~dhAY?y`jWre*Nt36SKf7Ho>2rDJGQ>t0bfEkv!-}|a5f~Cv zCp6BdS`5&Er3!A^QI)L>FB()RV&1CNYT*>bfv{+KXl-Gk9!`p0htIRUy@R2|W+u2} z0cavkd_2&fnz{h>My*o?cyxS(YM+>xoSpq8dz!*M!JJ|MN#dA_XzPjiBgJ(FWx>@` z(N9o1<>cq*=4P>ABNl03aEg$SG`;rQwPKzLS&&~!KnZuC(^1W}a>4!K7EwKd)+Wio zg}xrm$h$8$P+e>bcGDp$UwJqBT_wqjg(|lcCgW7B(-Z}i z;MeEpRom#oNTTiSXP8999|0#a*VEl76#i<6Hs1sLfo2Cs9-@yj(}1G?pDz4gF3mBC z;u{iCAgOjw#>9z4SJ*=t&{-VDmBQCzqtXWA$kD-d%mhoI4rFxsK3c+d*($%lDJ+{T zPp^LAXSzQ~hhND*zwPOhL*%+~v+?8jI7Wq(ASRTOCA^aFA_bF2G-6L^M%qw%r*Wl< zk}wnO7qcj?4P*=E1V)wQ8K#V~d%sG3`)|sbcj@TJHnQi(aM?31Ry2_NxC85>=@@SE=T!@&dGd~ALkP2UD zI&2^X^COU`#3Z7}7@CN`1KdPN65?nT8g$wnimCv5soCUUp?yt0P!+M-N%NCo_0b~N zx*<6M{{G(k=lJL-hNcdYXjcvUXQ z5>6&)13Gfe#~`|b0VFZVC=GEm@|9;GGCpABLi9{ZeL~g>KJGZLid2f~WmTk|qAE^n zzvk=nfZ@hfIQY@IXru_>C3z22$Z)~F`3A%;_=>^119BET%x-s&hS)>&wPNS%?J{l7 z+BUF2JIAEDN}3gg%rQ);vM{6FYM*>Q(Hrx=(%cAjMjrTb&F1gcAl2 z7))SIuLL>y_uydT{(Y{TLuNuBc8pNEw*Worm`*dUw&dOK-gS^QB5lL5#zW+tL#{DX zpv>z@W1GI3ot=vhBZV-7CbG+SqY+~gcD6g6cifS0jKO3bIUSzo&Yjg{7!!JaO!DYM zlm!VRwz4vy?{)X+i7`gi)jOvF6a0pV8f$H!3%UYr+h{Dph^0WW{I_yl^ncu$7cX|{ zVeH1j_q%cZhH7G`I-H*}BG8pXvdU&M!w-nSu?TF+0C|I^P!vrMwmTi>H(97J&;{aU zLdz!)zLe_N&zM%u-q@9C3y7bDx>u^FhE7WwO(MNq{63hU5=(Z}DsdCjyNRNv7t zEfZ14L}u&>&H$xhKuU5Y3we$MGV`k_4%RyHjGu5#59()7asHO6egb9rvqmzl@djVM zd=dVLR+H+T^9efW7A(XiV1DBh3^P5+F!KVuL2a&YTmV`#Vz5-y7yxaQz Q9smFU07*qoM6N<$g2wylng9R* literal 0 HcmV?d00001 diff --git a/lib/plugins/extension/images/up.png b/lib/plugins/extension/images/up.png new file mode 100644 index 0000000000000000000000000000000000000000..531b2dd7bc710855ce1e5e47be1333fcf6927c45 GIT binary patch literal 197 zcmeAS@N?(olHy`uVBq!ia0vp@Ak4uGBwbBK{D72GfKQ0)?xPp?9J{pl_~ip9f#}M? zQ&*3lzj5-y%~Ka|Ub=bz>aF|NZaujD;Ms#GFCRU9`TE_*cOO1~`TFhW&tHE*;NSoM z|D~tAiUyiy=jq}YQo)!k;L3KRqDjVyW1fJu_I8dQ^)tr~9Xh1S^N_RHsF^{&<@jM1 t#ytvh`pP^Xx{W>N{ysy*_V;cOY#l>d7kuLGLI;OXk;vd$@?2>_brU=jcT literal 0 HcmV?d00001 diff --git a/lib/plugins/extension/images/warning.png b/lib/plugins/extension/images/warning.png new file mode 100644 index 0000000000000000000000000000000000000000..c1af79f0ffa5b8ebe561b8983fb0e843d8157e4d GIT binary patch literal 606 zcmV-k0-^nhP)s@-?Yg@xwu(D5|Mz`c{zL@sR^ShQGsDX~?>r1MhKOJ-*vLcj*&a(s z-U@SyS$eDYz9i(pL>`1>&{wm+#aF$rTZm5~A0o2K_+)o5HqrHi+(mIyVVQrtGdcHg zM=-~|xf?L??c%ynsbQM1OM>v%hk`-Kz9{TG`jE#4O3MxBWN;VzF%GZ8~K%1Ex zKxtzi3Tt}0BR88uITq+}fSCvV4M)K$39wFUnLTi37Uj*yz{Hnku5S*kTEN63{<r0{vH@U)b2iwRCwyLEyPpt7iUijF*xg= sXYvT-cu-kMt3a;Ob5`2dYyO>o0+dW++45D~@&Et;07*qoM6N<$g2|K?%m4rY literal 0 HcmV?d00001 diff --git a/lib/plugins/extension/lang/bg/intro_install.txt b/lib/plugins/extension/lang/bg/intro_install.txt new file mode 100644 index 0000000..34b9248 --- /dev/null +++ b/lib/plugins/extension/lang/bg/intro_install.txt @@ -0,0 +1 @@ +От тук можете да инсталирате ръчно приставки и шаблони като качите архив или посочите URL за сваляне на архива. \ No newline at end of file diff --git a/lib/plugins/extension/lang/bg/intro_plugins.txt b/lib/plugins/extension/lang/bg/intro_plugins.txt new file mode 100644 index 0000000..927f617 --- /dev/null +++ b/lib/plugins/extension/lang/bg/intro_plugins.txt @@ -0,0 +1 @@ +Това са инсталираните приставки. От тук можете да ги включвате и изключвате както и да ги деинсталирате. Тук ще виждате и наличните актуализации, като преди всяка такава прочетете документацията на съответната приставка. \ No newline at end of file diff --git a/lib/plugins/extension/lang/bg/intro_search.txt b/lib/plugins/extension/lang/bg/intro_search.txt new file mode 100644 index 0000000..f41c8c6 --- /dev/null +++ b/lib/plugins/extension/lang/bg/intro_search.txt @@ -0,0 +1 @@ +От тук имате достъп до всички налични [[doku>plugins|приставки]] и [[doku>template|шаблони]] за DokuWiki, които са дело на трети лица. Имайте предвид, че кодът им е потенциален **риск за сигурността на сървъра**! Повече по темата можете да прочетете в [[doku>security#plugin_security|plugin security]] first. diff --git a/lib/plugins/extension/lang/bg/intro_templates.txt b/lib/plugins/extension/lang/bg/intro_templates.txt new file mode 100644 index 0000000..8824b4d --- /dev/null +++ b/lib/plugins/extension/lang/bg/intro_templates.txt @@ -0,0 +1 @@ +Това са инсталираните шаблони. Можете да определите кой шаблон да се ползва от [[?do=admin&page=config|Настройки]]. \ No newline at end of file diff --git a/lib/plugins/extension/lang/bg/lang.php b/lib/plugins/extension/lang/bg/lang.php new file mode 100644 index 0000000..69ec260 --- /dev/null +++ b/lib/plugins/extension/lang/bg/lang.php @@ -0,0 +1,84 @@ + + */ +$lang['menu'] = 'Диспечер на приставки'; +$lang['tab_plugins'] = 'Инсталирани приставки'; +$lang['tab_templates'] = 'Инсталирани шаблони'; +$lang['tab_search'] = 'Търсене и инсталиране'; +$lang['tab_install'] = 'Ръчно инсталиране'; +$lang['notimplemented'] = 'Функционалността все още не реализирана'; +$lang['notinstalled'] = 'Приставката не е инсталирана'; +$lang['alreadyenabled'] = 'Приставката е включена'; +$lang['alreadydisabled'] = 'Приставката е изключена'; +$lang['pluginlistsaveerror'] = 'Възникна грешка при записването на списъка с приставки'; +$lang['unknownauthor'] = 'Неизвестен автор'; +$lang['unknownversion'] = 'Неизвестна версия'; +$lang['btn_info'] = 'Повече информация'; +$lang['btn_update'] = 'Актуализиране'; +$lang['btn_uninstall'] = 'Деинсталиране'; +$lang['btn_enable'] = 'Включване'; +$lang['btn_disable'] = 'Изключване'; +$lang['btn_install'] = 'Инсталиране'; +$lang['btn_reinstall'] = 'Преинсталиране'; +$lang['js']['reallydel'] = 'Наистина ли желаете приставката да бъде деинсталирана?'; +$lang['js']['display_viewoptions'] = 'Филтриране:'; +$lang['js']['display_enabled'] = 'включени'; +$lang['js']['display_disabled'] = 'изключени'; +$lang['js']['display_updatable'] = 'с налични актуализации'; +$lang['search_for'] = 'Търсене за приставки:'; +$lang['search'] = 'Търсене'; +$lang['extensionby'] = '%s от %s'; +$lang['popularity'] = 'Популярност: %s%%'; +$lang['homepage_link'] = 'Документи'; +$lang['tags'] = 'Етикети:'; +$lang['author_hint'] = 'Търсене за други приставки от този автор'; +$lang['installed'] = 'Инсталирано:'; +$lang['downloadurl'] = 'Сваляне от URL:'; +$lang['repository'] = 'Хранилище:'; +$lang['unknown'] = 'неизвестно'; +$lang['installed_version'] = 'Инсталирана версия:'; +$lang['install_date'] = 'Посл. актуализиране:'; +$lang['available_version'] = 'Налична версия:'; +$lang['compatible'] = 'Съвместимост с:'; +$lang['depends'] = 'Изисква:'; +$lang['similar'] = 'Наподобява:'; +$lang['conflicts'] = 'В кофликт с:'; +$lang['donate'] = 'Харесва ли ви?'; +$lang['donate_action'] = 'Купете на автора кафе!'; +$lang['repo_retry'] = 'Повторен опит'; +$lang['provides'] = 'Осигурява:'; +$lang['status'] = 'Състояние:'; +$lang['status_installed'] = 'инсталирана'; +$lang['status_not_installed'] = 'неинсталирана'; +$lang['status_protected'] = 'защитена'; +$lang['status_enabled'] = 'включена'; +$lang['status_disabled'] = 'изключена'; +$lang['status_plugin'] = 'приставка'; +$lang['status_template'] = 'шаблон'; +$lang['msg_enabled'] = 'Приставката "%s" е включена'; +$lang['msg_disabled'] = 'Приставката "%s" е изключена'; +$lang['msg_delete_success'] = 'Приставката "%s" е деинсталирана'; +$lang['msg_delete_failed'] = 'Деинсталирането на приставката "%s" се провали '; +$lang['msg_template_install_success'] = 'Шаблонът "%s" е инсталиран успешно'; +$lang['msg_template_update_success'] = 'Шаблонът "%s" е актуализиран успешно'; +$lang['msg_plugin_install_success'] = 'Приставката "%s" е инсталирана успешно'; +$lang['msg_plugin_update_success'] = 'Приставката "%s" е актуализирана успешно'; +$lang['msg_upload_failed'] = 'Качването на файлът се провали'; +$lang['missing_dependency'] = 'Изискван компонент липсва или е изключен: %s'; +$lang['security_issue'] = 'Проблем със сигурността: %s'; +$lang['security_warning'] = 'Предупреждние за сигурността: %s'; +$lang['update_available'] = 'Актуализация: Налична е нова версия - %s'; +$lang['wrong_folder'] = 'Некоректно инсталирана приставка: Преименувайте директорията "%s" на "%s".'; +$lang['error_badurl'] = 'URL адресите трябва да започват с http или https'; +$lang['error_dircreate'] = 'Създаването на временна поапка за получаване на файла не е възможно'; +$lang['error_download'] = 'Невъзможност за сваляне на файл: %s'; +$lang['noperms'] = 'Директория на разширението не е достъпна за писане'; +$lang['notplperms'] = 'Директория на шаблона не е достъпна за писане'; +$lang['nopluginperms'] = 'Директория на приставката не е достъпна за писане'; +$lang['install_url'] = 'Инсталиране от URL:'; +$lang['install_upload'] = 'Качване:'; +$lang['repo_error'] = 'Няма връзка с хранилището на добавката. Проверете възможна ли е комуникацията www.dokuwiki.org и прокси настройките.'; diff --git a/lib/plugins/extension/lang/ca/lang.php b/lib/plugins/extension/lang/ca/lang.php new file mode 100644 index 0000000..76fe584 --- /dev/null +++ b/lib/plugins/extension/lang/ca/lang.php @@ -0,0 +1,73 @@ + + */ +$lang['menu'] = 'Gestor d’extensions'; +$lang['tab_plugins'] = 'Connectors instal·lats'; +$lang['tab_templates'] = 'Plantilles instal·lades'; +$lang['tab_search'] = 'Cerca i instal·la'; +$lang['tab_install'] = 'Instal·lació manual'; +$lang['notimplemented'] = 'Encara no s’ha implementat aquesta prestació'; +$lang['notinstalled'] = 'No s’ha instal·lat aquesta extensió'; +$lang['alreadyenabled'] = 'Ja s’ha activat aquesta extensió'; +$lang['alreadydisabled'] = 'Ja s’ha desactivat aquesta extensió'; +$lang['pluginlistsaveerror'] = 'S’ha produït un error en desar la llista de connectors'; +$lang['unknownauthor'] = 'Autor desconegut'; +$lang['unknownversion'] = 'Versió desconeguda'; +$lang['btn_info'] = 'Mostra’n més informació'; +$lang['btn_update'] = 'Actualitza'; +$lang['btn_uninstall'] = 'Desinstal·la'; +$lang['btn_enable'] = 'Activa'; +$lang['btn_disable'] = 'Desactiva'; +$lang['btn_install'] = 'Instal·la'; +$lang['btn_reinstall'] = 'Reinstal·la'; +$lang['js']['reallydel'] = 'Esteu segur que voleu desinstal·lar aquesta extensió?'; +$lang['js']['display_viewoptions'] = 'Opcions de visualització:'; +$lang['js']['display_enabled'] = 'activat'; +$lang['js']['display_disabled'] = 'desactivat'; +$lang['js']['display_updatable'] = 'actualitzable'; +$lang['search_for'] = 'Cerca l’extensió:'; +$lang['search'] = 'Cerca'; +$lang['extensionby'] = '%s de %s'; +$lang['screenshot'] = 'Captura de pantalla de %s'; +$lang['popularity'] = 'Popularitat: %s %%'; +$lang['homepage_link'] = 'Documentació'; +$lang['bugs_features'] = 'Problemes'; +$lang['tags'] = 'Etiquetes:'; +$lang['author_hint'] = 'Cerca extensions d’aquest autor'; +$lang['installed'] = 'Instal·lat:'; +$lang['downloadurl'] = 'URL de baixada:'; +$lang['repository'] = 'Repositori:'; +$lang['unknown'] = 'desconegut'; +$lang['installed_version'] = 'Versió instal·lada:'; +$lang['install_date'] = 'La darrera actualització:'; +$lang['available_version'] = 'Versió disponible:'; +$lang['compatible'] = 'Compatible amb:'; +$lang['depends'] = 'Depèn de:'; +$lang['similar'] = 'Semblant a:'; +$lang['conflicts'] = 'Entra en conflicte amb:'; +$lang['donate'] = 'Us agrada això?'; +$lang['donate_action'] = 'Compreu un cafè a l’autor!'; +$lang['repo_retry'] = 'Torna a provar'; +$lang['provides'] = 'Proporciona:'; +$lang['status'] = 'Estat:'; +$lang['status_installed'] = 'instal·lat'; +$lang['status_not_installed'] = 'no instal·lat'; +$lang['status_protected'] = 'protegit'; +$lang['status_enabled'] = 'activat'; +$lang['status_disabled'] = 'desactivat'; +$lang['status_unmodifiable'] = 'immodificable'; +$lang['status_plugin'] = 'connector'; +$lang['status_template'] = 'plantilla'; +$lang['msg_delete_failed'] = 'Ha fallat la desinstal·lació de l’extensió %s'; +$lang['msg_upload_failed'] = 'Ha fallat l’actualització del fitxer'; +$lang['security_issue'] = 'Problema de seguretat: %s '; +$lang['security_warning'] = 'Avís de seguretat: %s'; +$lang['wrong_folder'] = 'El connector s’ha instal·lat incorrectament: canvieu el nom del directori del connector «%s» a «%s». '; +$lang['url_change'] = 'L’URL ha canviat: l’URL de baixada ha canviat des de la darrera baixada. Reviseu que l’URL nou sigui vàlid abans d’actualitzar l’extensió.
    Nou: %s
    Anterior: %s '; +$lang['error_badurl'] = 'Els URL han de començar per http o https'; +$lang['error_download'] = 'No es pot baixar el fitxer: %s'; +$lang['install_url'] = 'Instal·la a partir d’un URL:'; diff --git a/lib/plugins/extension/lang/ckb/intro_install.txt b/lib/plugins/extension/lang/ckb/intro_install.txt new file mode 100644 index 0000000..09b3762 --- /dev/null +++ b/lib/plugins/extension/lang/ckb/intro_install.txt @@ -0,0 +1 @@ +لێرە دەتوانیت بە دەستی پێوەکراو و تێمپلەیتەکان دابمەزرێنیت بە بارکردن یان دابینکردنی URL ی داگرتنی ڕاستەوخۆ. \ No newline at end of file diff --git a/lib/plugins/extension/lang/ckb/intro_plugins.txt b/lib/plugins/extension/lang/ckb/intro_plugins.txt new file mode 100644 index 0000000..6a07b98 --- /dev/null +++ b/lib/plugins/extension/lang/ckb/intro_plugins.txt @@ -0,0 +1 @@ +ئەمانە ئەو پێوەکراوانەن کە لە ئێستادا لە دۆکوویکیی تۆدا دامەزرێنراون. دەتوانیت لێرە بە توانایان بکەیت یان ناچالاکیان بکەیت یان تەنانەت بە تەواوی فڕێیان بدەی. نوێکردنەوەکانی پێوەکراو لێرە هەروەها نیشان دەدرێن، دڵنیابە لەوەی کە دۆکیومێنتی پێوەکراوەکە بخوێنیتەوە پێش نوێکردنەوە. \ No newline at end of file diff --git a/lib/plugins/extension/lang/ckb/intro_search.txt b/lib/plugins/extension/lang/ckb/intro_search.txt new file mode 100644 index 0000000..f16a32f --- /dev/null +++ b/lib/plugins/extension/lang/ckb/intro_search.txt @@ -0,0 +1 @@ +ئەم خشتەبەندە دەستگەیشتنت دەداتێ بە هەموو پارتی 3یەمی بەردەست !!doku>plugins|plugins!! و template|templates!! بۆ دۆکویکی. تکایە ئاگاداری ئەوە بە کە دامەزراندنی کۆدی 3ەم پارت لەوانەیە مەترسی **security**, لەوانەیە بتەوێت دەربارەی .doku>security#plugin_security|plugin security!! سەرەتا بخوێنیتەوە. \ No newline at end of file diff --git a/lib/plugins/extension/lang/ckb/intro_templates.txt b/lib/plugins/extension/lang/ckb/intro_templates.txt new file mode 100644 index 0000000..b5e3520 --- /dev/null +++ b/lib/plugins/extension/lang/ckb/intro_templates.txt @@ -0,0 +1 @@ +ئەمانە تێمپلەیتەکانن لە ئێستادا دامەزراوە لە دۆکووویکی خۆت. دەتوانیت تێمپلەیتەکە دیاریبکەیت بۆ ئەوەی بەکاربێت لە .?do=admin&page=config| بەڕێوەبەری شێوەپێدان \ No newline at end of file diff --git a/lib/plugins/extension/lang/ckb/lang.php b/lib/plugins/extension/lang/ckb/lang.php new file mode 100644 index 0000000..fccbaa4 --- /dev/null +++ b/lib/plugins/extension/lang/ckb/lang.php @@ -0,0 +1,96 @@ + + */ +$lang['menu'] = 'بەڕێوەبەری درێژکراوە'; +$lang['tab_plugins'] = 'پێوەکراوەکان دامەزرێنراو'; +$lang['tab_templates'] = 'تێمپلەیتە دامەزراوەکان'; +$lang['tab_search'] = 'گەڕان و دامەزراندن'; +$lang['tab_install'] = 'دامەزراندنی دەستی'; +$lang['notimplemented'] = 'ئەم تایبەتمەندیە هێشتا جێبەجێ نەکراوە'; +$lang['notinstalled'] = 'ئەم درێژکراوەیە دانەمەزراوە'; +$lang['alreadyenabled'] = 'ئەم درێژکراوەیە پێشتر چالاک کراوە'; +$lang['alreadydisabled'] = 'ئەم درێژکراوەیە پێشتر لەکارخراوە'; +$lang['pluginlistsaveerror'] = 'هەڵەیەک هەبوو لە پاشەکەوتکردنی لیستی پێوەکراو'; +$lang['unknownauthor'] = 'نووسەری نەناسراو'; +$lang['unknownversion'] = 'وەشانێکی نەناسراو'; +$lang['btn_info'] = 'زانیاری زیاتر پیشان بدە'; +$lang['btn_update'] = 'نوێکردنەوە'; +$lang['btn_uninstall'] = 'لابردن'; +$lang['btn_enable'] = 'چالاککردن'; +$lang['btn_disable'] = 'لەکارخستنی'; +$lang['btn_install'] = 'دامەزراندن'; +$lang['btn_reinstall'] = 'دووبارە دامەزراندن'; +$lang['js']['reallydel'] = 'بەڕاستی ئەم درێژکراوەیە لادەبەیت؟'; +$lang['js']['display_viewoptions'] = 'بینینی هەڵبژاردنەکان:'; +$lang['js']['display_enabled'] = 'چالاک کراوە'; +$lang['js']['display_disabled'] = 'ناچالاککراوە'; +$lang['js']['display_updatable'] = 'بەها'; +$lang['search_for'] = 'بەدواگەڕانی درێژکراوە:'; +$lang['search'] = 'گەڕان'; +$lang['extensionby'] = '%s لەلایەن %s'; +$lang['screenshot'] = 'گرتەی %s'; +$lang['popularity'] = 'ناوبانگ: %s%%'; +$lang['homepage_link'] = 'بەڵگەنامەکان'; +$lang['bugs_features'] = 'هەڵەکان'; +$lang['tags'] = 'تاگەکان:'; +$lang['author_hint'] = 'گەڕان لە درێژکراوەکان لەلایەن ئەم نوسەرەوە'; +$lang['installed'] = 'دامەزرێنراوە:'; +$lang['downloadurl'] = 'داگرتنی URL:'; +$lang['repository'] = 'کۆگا:'; +$lang['unknown'] = ' نەزانراو'; +$lang['installed_version'] = 'وەشانی دامەزراو:'; +$lang['install_date'] = 'دوا نوێکردنەوەت:'; +$lang['available_version'] = 'وەشانی بەردەست:'; +$lang['compatible'] = 'گونجاو لەگەڵ:'; +$lang['depends'] = 'پشت دەبەستێت بە:'; +$lang['similar'] = 'هاوشێوەی:'; +$lang['conflicts'] = 'ناکۆکی لەگەڵ:'; +$lang['donate'] = 'وەکوو ئەمە?'; +$lang['donate_action'] = 'قاوەیەک بۆ نوسەرەکە بکڕە'; +$lang['repo_retry'] = 'دووبارە هەوڵ بدە'; +$lang['provides'] = 'دابین دەکات:'; +$lang['status'] = 'دۆخ:'; +$lang['status_installed'] = 'دامەزرێنراوە'; +$lang['status_not_installed'] = 'دانەمەزراوە'; +$lang['status_protected'] = 'پارێزراوە'; +$lang['status_enabled'] = 'چالاک کراوە'; +$lang['status_disabled'] = 'ناچالاککراوە'; +$lang['status_unmodifiable'] = 'بێ مۆدیلە'; +$lang['status_plugin'] = 'پێوەکراو'; +$lang['status_template'] = 'ڕووکار'; +$lang['status_bundled'] = 'بە یەک'; +$lang['msg_enabled'] = 'پێوەکراو %s چالاک کرا'; +$lang['msg_disabled'] = 'پێوەکراو %s ناچالاک کرا'; +$lang['msg_delete_success'] = 'پێوەدانی %s لابردراوە'; +$lang['msg_delete_failed'] = 'لابردنی پێوەکراو %s سەرکەوتوو نەبوو'; +$lang['msg_template_install_success'] = 'داڕێژە %s بە سەرکەوتوویی دامەزرێنرا'; +$lang['msg_template_update_success'] = 'داڕێژە %s بە سەرکەوتوویی نوێکرایەوە'; +$lang['msg_plugin_install_success'] = 'پێوەکراو %s بە سەرکەوتوویی دامەزرێنرا'; +$lang['msg_plugin_update_success'] = 'پێوەکراو %s بە سەرکەوتوویی نوێکرایەوە'; +$lang['msg_upload_failed'] = 'بارکردنی فایلەکە سەرکەوتوو نەبوو'; +$lang['msg_nooverwrite'] = 'درێژکراوەی %s پێشتر هەیە بۆیە نەنووسراوە تەوە; بۆ نووسینەوە، بژاردەی نووسینەوە دابنێ'; +$lang['missing_dependency'] = ' لە پشت پێبەستن بە ناچالاک: %s'; +$lang['security_issue'] = ' ئاسایش: %s'; +$lang['security_warning'] = ' پاراستن: %s'; +$lang['update_available'] = 'ئەپدەیت: وەشانی نوێی %s بەردەستە.'; +$lang['wrong_folder'] = 'Plugin بە هەڵە دابەزێنرا: ناونانەوەی پێڕستی پێوەکراو "%s" بۆ "%s".'; +$lang['url_change'] = ' URL گۆڕا: داگرتنی URL لە دوا داگرتنەوە گۆڕاوە. پشکنین بکە ئەگەر URL ە نوێکە دروستە پێش نوێکردنەوەی پێوەکراوەکە.
    نوێ: %s
    Old: %s'; +$lang['error_badurl'] = 'پێویستە URLەکان بە http یان https دەست پێبکەن'; +$lang['error_dircreate'] = 'ناتوانێت فۆڵدەری کاتی دروست بکات بۆ وەرگرتنی داگرتن'; +$lang['error_download'] = 'ناتوانێت فایلەکە دابگرێت: %s'; +$lang['error_decompress'] = 'ناتوانێت فایلە داگیراوەکە دابەزێنێت. ئەمە لەوانەیە لە ئەنجامی داگرتنێکی خراپدا بێت، کە لە حاڵەتی داگرتندا دەبێت دووبارە هەوڵ بدەیتەوە؛ یان فۆرماتی گوشاردانان لەوانەیە نەزانرابێت، کە لە حاڵەتی داگرتن و دامەزراندنی دەستیدا پێویستە.'; +$lang['error_findfolder'] = 'ناتوانێت ڕێنیشاندەری درێژکراوەکە دیاری بکات، پێویستە بە دەستی داگرتن و دامەزراندنی بکەیت'; +$lang['error_copy'] = 'هەڵەیەک لە کۆپی کردنی فایل دا هەبوو لە کاتی هەوڵدان بۆ دامەزراندنی فایلەکان بۆ دایەرێکتۆری %s: لەوانەیە دیسک پڕ بێت یان مۆڵەتەکانی چوونە ژورەوەی فایل ەکە نادروست بێت. ئەمە لەوانەیە ئەنجامی ئەوە بێت کە پێوەکراوێکی کەمێک دامەزرابێت و دامەزراندنی ویکیی ەکەت بە ناجێگیری جێبهێڵێت'; +$lang['noperms'] = 'ڕێنیشاندەری درێژکراوە کە توانای دەستکاریکردنی نییە'; +$lang['notplperms'] = 'ڕێنیشاندەر تێمپلەیت توانای دەستکاریکردنی نییە'; +$lang['nopluginperms'] = 'دایەرێکتەری پێوەکراو توانای دەستکاریکردنی نیە'; +$lang['git'] = 'ئەم درێژکراوەیە لە ڕێگەی git ەوە دامەزراوە، لەوانەیە نەتەوێ لێرە نوێی بکەیتەوە.'; +$lang['auth'] = 'ئەم پێوەکراوە بە تەبا نییە لە شێوەپێداندا، لە کاربخە.'; +$lang['install_url'] = 'دامەزراندن لە URL:'; +$lang['install_upload'] = 'پێوەکراو باربکە:'; +$lang['repo_error'] = 'ناتوانرێت پەیوەندی بە کۆگای پێوەکراوبکرێت. دڵنیابە لەوەی ڕاژەکارەکەت رێگەپێدراوە پەیوەندی www.dokuwiki.org و سێری ڕێکبەندەکانی پرۆکسی ەکەت بکە.'; +$lang['nossl'] = 'پی.پی.پی ەکەت پێدەچێت پاڵپشتی SSL لەدەست بدا. داگرتن کارناکات بۆ زۆرێک لە درێژکراوەکانی DokuWiki.'; diff --git a/lib/plugins/extension/lang/cs/intro_install.txt b/lib/plugins/extension/lang/cs/intro_install.txt new file mode 100644 index 0000000..b274959 --- /dev/null +++ b/lib/plugins/extension/lang/cs/intro_install.txt @@ -0,0 +1 @@ +Zde můžete ručně instalovat zásuvné moduly a šablony vzhledu, buď nahráním, nebo zadáním přímé URL pro stažení. \ No newline at end of file diff --git a/lib/plugins/extension/lang/cs/intro_plugins.txt b/lib/plugins/extension/lang/cs/intro_plugins.txt new file mode 100644 index 0000000..a6f6274 --- /dev/null +++ b/lib/plugins/extension/lang/cs/intro_plugins.txt @@ -0,0 +1 @@ +Toto je seznam momentálně nainstalovaných zásuvných modulů vaší DokuWiki. V tomto seznamu je lze zapínat, vypínat nebo kompletně odinstalovat. Jsou zde také vidět dostupné aktualizace pro moduly, ale před jejich případným aktualizováním si vždy přečtěte jejich dokumentaci. \ No newline at end of file diff --git a/lib/plugins/extension/lang/cs/intro_search.txt b/lib/plugins/extension/lang/cs/intro_search.txt new file mode 100644 index 0000000..b1659a5 --- /dev/null +++ b/lib/plugins/extension/lang/cs/intro_search.txt @@ -0,0 +1 @@ +Tato záložka poskytuje náhled na všechny dostupné [[doku>plugins|moduly]] a [[doku>cs:template|šablony]] třetích stran pro DokuWiki. Jejich instalací se múžete vystavit **bezpečnostním rizikům** o kterých se můžete více dočíst v oddíle [[doku>security#plugin_security|plugin security]]. diff --git a/lib/plugins/extension/lang/cs/intro_templates.txt b/lib/plugins/extension/lang/cs/intro_templates.txt new file mode 100644 index 0000000..ae157db --- /dev/null +++ b/lib/plugins/extension/lang/cs/intro_templates.txt @@ -0,0 +1 @@ +Toto jsou šablony, které jsou momentálně nainstalovány v této DokuWiki. Aktuálně používanou šablonu lze vybrat ve [[?do=admin&page=config|Správci rozšíření]]. \ No newline at end of file diff --git a/lib/plugins/extension/lang/cs/lang.php b/lib/plugins/extension/lang/cs/lang.php new file mode 100644 index 0000000..a62ed48 --- /dev/null +++ b/lib/plugins/extension/lang/cs/lang.php @@ -0,0 +1,100 @@ + + * @author Petr Kajzar + * @author Viktor Zavadil + * @author Jaroslav Lichtblau + * @author Turkislav + */ +$lang['menu'] = 'Správa rozšíření'; +$lang['tab_plugins'] = 'Instalované moduly'; +$lang['tab_templates'] = 'Instalované šablony'; +$lang['tab_search'] = 'Vyhledat a instalovat'; +$lang['tab_install'] = 'Ruční instalace'; +$lang['notimplemented'] = 'Tato vychytávka není dosud implementována'; +$lang['notinstalled'] = 'Toto rozšíření není instalováno'; +$lang['alreadyenabled'] = 'Toto rozšíření je již povoleno'; +$lang['alreadydisabled'] = 'Toto rozšíření je již vypnuto'; +$lang['pluginlistsaveerror'] = 'Došlo k chybě při ukládání seznamu zásuvných modulů'; +$lang['unknownauthor'] = 'Neznámý autor'; +$lang['unknownversion'] = 'Neznámá verze'; +$lang['btn_info'] = 'Zobrazit více informací'; +$lang['btn_update'] = 'Aktualizovat'; +$lang['btn_uninstall'] = 'Odinstalovat'; +$lang['btn_enable'] = 'Povolit'; +$lang['btn_disable'] = 'Zakázat'; +$lang['btn_install'] = 'Instalovat'; +$lang['btn_reinstall'] = 'Přeinstalovat'; +$lang['js']['reallydel'] = 'Opravdu odinstalovat toto rozšíření?'; +$lang['js']['display_viewoptions'] = 'Zobrazit možnosti:'; +$lang['js']['display_enabled'] = 'povolené'; +$lang['js']['display_disabled'] = 'zakázané'; +$lang['js']['display_updatable'] = 'aktualizovatelné'; +$lang['search_for'] = 'Hledat rozšíření:'; +$lang['search'] = 'Hledat'; +$lang['extensionby'] = '%s od %s'; +$lang['screenshot'] = 'Screenshot %s'; +$lang['popularity'] = 'Popularita: %s%%'; +$lang['homepage_link'] = 'Dokumenty'; +$lang['bugs_features'] = 'Chyby'; +$lang['tags'] = 'Štítky:'; +$lang['author_hint'] = 'Vyhledat rozšíření podle tohoto autora'; +$lang['installed'] = 'Nainstalováno:'; +$lang['downloadurl'] = 'URL stahování:'; +$lang['repository'] = 'Repozitář:'; +$lang['unknown'] = 'neznámý'; +$lang['installed_version'] = 'Nainstalovaná verze:'; +$lang['install_date'] = 'Poslední aktualizace'; +$lang['available_version'] = 'Dostupná verze:'; +$lang['compatible'] = 'Kompatibilní s:'; +$lang['depends'] = 'Závisí na:'; +$lang['similar'] = 'Podobný jako:'; +$lang['conflicts'] = 'Koliduje s:'; +$lang['donate'] = 'Líbí se ti to?'; +$lang['donate_action'] = 'Kup autorovi kávu!'; +$lang['repo_retry'] = 'Opakovat'; +$lang['provides'] = 'Poskytuje:'; +$lang['status'] = 'Stav:'; +$lang['status_installed'] = 'instalovaný'; +$lang['status_not_installed'] = 'nenainstalovaný'; +$lang['status_protected'] = 'chráněný'; +$lang['status_enabled'] = 'povolený'; +$lang['status_disabled'] = 'zakázaný'; +$lang['status_unmodifiable'] = 'neměnný'; +$lang['status_plugin'] = 'zásuvný modul'; +$lang['status_template'] = 'šablona'; +$lang['status_bundled'] = 'svázaný'; +$lang['msg_enabled'] = 'Zásuvný modul %s povolen'; +$lang['msg_disabled'] = 'Zásuvný modul %s zakázán'; +$lang['msg_delete_success'] = 'Rozšíření %s odinstalováno'; +$lang['msg_delete_failed'] = 'Odinstalování rozšíření %s selhalo'; +$lang['msg_template_install_success'] = 'Šablona %s úspěšně nainstalována'; +$lang['msg_template_update_success'] = 'Šablona %s úspěšně aktualizována'; +$lang['msg_plugin_install_success'] = 'Zásuvný modul %s úspěšně nainstalován.'; +$lang['msg_plugin_update_success'] = 'Zásuvný modul %s úspěšně aktualizován.'; +$lang['msg_upload_failed'] = 'Nahrávání souboru selhalo'; +$lang['msg_nooverwrite'] = 'Rozšíření %s již existuje, proto nebylo přepsáno; pro přepsání zatrhněte příslušnou možnost'; +$lang['missing_dependency'] = 'Chybějící nebo zakázaná závislost: %s'; +$lang['security_issue'] = 'Bezpečnostní problém: %s'; +$lang['security_warning'] = 'Bezpečnostní varování: %s'; +$lang['update_available'] = 'Aktualizace: Je dostupná nová verze %s.'; +$lang['wrong_folder'] = 'Zásuvný modul nesprávně nainstalován: Přejmenujte adresář modulu "%s" na "%s".'; +$lang['url_change'] = 'URL se změnila: URL pro stahování se změnila od poslední aktualizace. Před další aktualizací tohoto rozšíření ověřte správnost nové URL.
    Nová: %s
    Stará: %s'; +$lang['error_badurl'] = 'Adresy URL by měly začínat s http nebo https'; +$lang['error_dircreate'] = 'Nelze vytvořit dočasný adresář pro přijetí stahování'; +$lang['error_download'] = 'Nelze stáhnout soubor: %s'; +$lang['error_decompress'] = 'Selhalo rozbalení staženého souboru. Toto je nejspíš důsledek poškození souboru při přenosu, zkuste soubor stáhnout znovu; případně nemusel být rozpoznán formát sbaleného souboru a bude třeba přistoupit k ruční instalaci. '; +$lang['error_findfolder'] = 'Nelze rozpoznat adresář pro rozšíření, je třeba stáhnout a instalovat ručně'; +$lang['error_copy'] = 'Došlo k chybě kopírování souborů při pokusu nainstalovat soubory do adresáře %s: může být plný disk nebo špatně nastavena přístupová práva. Tato chyba mohla zapříčinit pouze částečnou instalaci zásuvného modulu a uvést wiki do nestabilního stavu.'; +$lang['noperms'] = 'Nelze zapisovat do adresáře pro rozšíření'; +$lang['notplperms'] = 'Nelze zapisovat do odkládacího adresáře'; +$lang['nopluginperms'] = 'Nelze zapisovat do adresáře se zásuvnými moduly'; +$lang['git'] = 'Toto rozšíření bylo nainstalováno přes git. Touto cestou ho nejspíš tady aktualizovat nechcete.'; +$lang['auth'] = 'Tento ověřovací zásuvný modul není povolen v nastavení, zvažte jeho deaktivaci.'; +$lang['install_url'] = 'Nainstalovat z URL:'; +$lang['install_upload'] = 'Nahrát rozšíření:'; +$lang['repo_error'] = 'Nelze kontaktovat repozitář se zásuvnými moduly. Ujistěte se, že váš server může kontaktovat www.dokuwiki.org a zkontrolujte nastavení proxy.'; +$lang['nossl'] = 'Použité PHP pravděpodobně nepodporuje SSL. Stažení mnoha DokuWiki rozšíření nebude fungovat.'; diff --git a/lib/plugins/extension/lang/cy/intro_install.txt b/lib/plugins/extension/lang/cy/intro_install.txt new file mode 100644 index 0000000..2bc933e --- /dev/null +++ b/lib/plugins/extension/lang/cy/intro_install.txt @@ -0,0 +1 @@ +Gallwch chi arsefydlu ategion a thempledau gan law yma, naill ai gan eu lanlwytho neu gan gyflwyno URL lawrlwytho uniongyrchol. diff --git a/lib/plugins/extension/lang/cy/intro_plugins.txt b/lib/plugins/extension/lang/cy/intro_plugins.txt new file mode 100644 index 0000000..dd49a7a --- /dev/null +++ b/lib/plugins/extension/lang/cy/intro_plugins.txt @@ -0,0 +1 @@ +Dyma'r ategion sydd wedi\'u harsefydlu yn eich DokuWiki yn bresennol. Gallwch chi eu galluogi neu eu hanalluogi nhw neu hyd yn oed eu dad-arsefydlu yn llwyr yma. Caiff diweddariadau'r ategion eu dangos yma hefyd, sicrhewch eich bod chi'n darllen dogfennaeth yr ategyn cyn diweddaru. diff --git a/lib/plugins/extension/lang/cy/intro_search.txt b/lib/plugins/extension/lang/cy/intro_search.txt new file mode 100644 index 0000000..d60f70f --- /dev/null +++ b/lib/plugins/extension/lang/cy/intro_search.txt @@ -0,0 +1 @@ +Mae'r tab hwn yn rhoi mynediad i bob [[doku>plugins|ategyn]] a [[doku>template|thempled]] 3ydd parti ar gael ar gyfer DokuWiki. Sylwch fod arsefydlu cod 3ydd parti yn achosi **risg diogelwch**. Efallai hoffech chi ddarllen mwy ar [[doku>security#plugin_security|ddiogelwch ategion]] yn gyntaf. diff --git a/lib/plugins/extension/lang/cy/intro_templates.txt b/lib/plugins/extension/lang/cy/intro_templates.txt new file mode 100644 index 0000000..4947145 --- /dev/null +++ b/lib/plugins/extension/lang/cy/intro_templates.txt @@ -0,0 +1 @@ +Dyma'r templedau sydd wedi'u harsefydlu yn eich DokuWiki yn bresennol. Gallwch chi ddewis y templed i'w ddefnyddio yn y [[?do=admin&page=config|Rheolwr Ffurfwedd]]. diff --git a/lib/plugins/extension/lang/cy/lang.php b/lib/plugins/extension/lang/cy/lang.php new file mode 100644 index 0000000..2a2a8c8 --- /dev/null +++ b/lib/plugins/extension/lang/cy/lang.php @@ -0,0 +1,111 @@ + + * @author Christopher Smith + * @author Alan Davies + */ + +$lang['menu'] = 'Rheolwr Estyniadau'; + +$lang['tab_plugins'] = 'Ategion a Arsefydlwyd'; +$lang['tab_templates'] = 'Templedau a Arsefydlwyd'; +$lang['tab_search'] = 'Chwilio ac Arsefydlu'; +$lang['tab_install'] = 'Arsefydlu gan Law'; + +$lang['notimplemented'] = '\'Dyw\'r nodwedd hon heb ei rhoi ar waith eto'; +$lang['notinstalled'] = '\'Dyw\'r estyniad hwn heb ei arsefydlu'; +$lang['alreadyenabled'] = 'Cafodd yr estyniad hwn ei alluogi'; +$lang['alreadydisabled'] = 'Cafodd yr estyniad hwn ei analluogi'; +$lang['pluginlistsaveerror'] = 'Roedd gwall wrth gadw\'r rhestr ategion'; +$lang['unknownauthor'] = 'Awdur anhysbys'; +$lang['unknownversion'] = 'Fersiwn anhysbys'; + +$lang['btn_info'] = 'Dangos wybodaeth bellach'; +$lang['btn_update'] = 'Diweddaru'; +$lang['btn_uninstall'] = 'Dad-arsefydlu'; +$lang['btn_enable'] = 'Galluogi'; +$lang['btn_disable'] = 'Analluogi'; +$lang['btn_install'] = 'Arsyfydlu'; +$lang['btn_reinstall'] = 'Ail-arsefydlu'; + +$lang['js']['reallydel'] = 'Ydych chi wir am ddad-arsefydlu\'r estyniad hwn?'; + +$lang['search_for'] = 'Chwilio Estyniadau:'; +$lang['search'] = 'Chwilio'; + +$lang['extensionby'] = '%s gan %s'; +$lang['screenshot'] = 'Sgrinlun %s'; +$lang['popularity'] = 'Poblogrwydd: %s%%'; +$lang['homepage_link'] = 'Dogfennau'; +$lang['bugs_features'] = 'Bygiau'; +$lang['tags'] = 'Tagiau:'; +$lang['author_hint'] = 'Chwilio estyniadau gan awdur'; +$lang['installed'] = 'Arsefydlwyd:'; +$lang['downloadurl'] = 'URL Lawlwytho:'; +$lang['repository'] = 'Ystorfa:'; +$lang['unknown'] = 'anhysbys'; +$lang['installed_version'] = 'Fersiwn a arsefydlwyd:'; +$lang['install_date'] = 'Eich diweddariad diwethaf:'; +$lang['available_version'] = 'Fersiwn ar gael:'; +$lang['compatible'] = 'Yn gydnaws â:'; +$lang['depends'] = 'Yn dibynnu ar:'; +$lang['similar'] = 'Yn debyg i:'; +$lang['conflicts'] = 'Y gwrthdaro â:'; +$lang['donate'] = 'Fel hwn?'; +$lang['donate_action'] = 'Prynwch goffi i\'r awdur!'; +$lang['repo_retry'] = 'Ailgeisio'; +$lang['provides'] = 'Darparu:'; +$lang['status'] = 'Statws:'; +$lang['status_installed'] = 'arsefydlwyd'; +$lang['status_not_installed'] = 'heb ei arsefydlu'; +$lang['status_protected'] = 'amddiffynwyd'; +$lang['status_enabled'] = 'galluogwyd'; +$lang['status_disabled'] = 'analluogwyd'; +$lang['status_unmodifiable'] = 'methu addasu'; +$lang['status_plugin'] = 'ategyn'; +$lang['status_template'] = 'templed'; +$lang['status_bundled'] = 'bwndlwyd'; + +$lang['msg_enabled'] = 'Galluogwyd ategyn %s'; +$lang['msg_disabled'] = 'Analluogwyd ategyn %s'; +$lang['msg_delete_success'] = 'Dad-arsefydlwyd estyniad %s'; +$lang['msg_delete_failed'] = 'Methodd dad-arsefydlu estyniad %s'; +$lang['msg_template_install_success'] = 'Arsefydlwyd templed %s yn llwyddiannus'; +$lang['msg_template_update_success'] = 'Diweddarwyd templed %s yn llwyddiannus'; +$lang['msg_plugin_install_success'] = 'Arsefydlwyd ategyn %s yn llwyddiannus'; +$lang['msg_plugin_update_success'] = 'Diweddarwyd ategyn %s yn llwyddiannus'; +$lang['msg_upload_failed'] = 'Methodd lanlwytho\'r ffeil'; + +$lang['missing_dependency'] = 'Missing or disabled dependency: %s'; +$lang['security_issue'] = 'Mater Diogelwch: %s'; +$lang['security_warning'] = 'Rhybudd Diogelwch: %s'; +$lang['update_available'] = 'Diweddariad: Mae fersiwn newydd %s ar gael.'; +$lang['wrong_folder'] = 'Ategyn wedi\'i arsefydlu\'n anghywir: Ailenwch ffolder yr ategyn o "%s" i "%s".'; +$lang['url_change'] = 'Newid i\'r URL: Newidiodd yr URL lawlwytho ers y diweddariad diwethaf. Gwiriwch i weld os yw\'r URL newydd yn ddilys cyn diweddaru\'r estyniad.
    Newydd: %s
    Hen: %s'; + +$lang['error_badurl'] = 'Dylai URL ddechrau gyda http neu https'; +$lang['error_dircreate'] = 'Methu â chreu ffolder dros dro er mwyn derbyn y lawrlwythiad'; +$lang['error_download'] = 'Methu lawrlwytho\'r ffeil: %s'; +$lang['error_decompress'] = 'Methu datgywasgu\'r ffeil a lawrlwythwyd. Gall hwn fod o ganlyniad i lawrlwythiad gwael, felly ceisiwch eto; neu gall fod fformat y cywasgiad fod yn anhysbys, felly bydd yn rhaid i chi lawlwytho ac arsefydlu gan law.'; +$lang['error_findfolder'] = 'Methu ag adnabod ffolder yr estyniad, bydd angen lawrlwytho ac arsefydlu gan law'; +$lang['error_copy'] = 'Roedd gwall copïo ffeil wrth geisio arsefydlu ffeiliau i\'r ffolder %s: gall fod y ddisgen yn llawn neu gall hawliau mynediad i ffeiliau fod yn anghywir. Gall hwn fod wedi achosi ategyn sydd wedi arsefydlu\'n rhannol ac sydd wedi ansefydlogi\'ch arsefydliad wici'; + +$lang['noperms'] = '\'Sdim modd ysgrifennu i\'r ffolder estyniadau'; +$lang['notplperms'] = '\'Sdim modd ysgrifennu i\'r ffolder templedau'; + +$lang['nopluginperms'] = '\'Sdim modd ysgrifennu i\'r ffolder ategion'; +$lang['git'] = 'Cafodd yr estyniad hwn ei arsefydlu gan git, mae\'n bosib na fyddwch chi am ei ddiweddaru yma.'; +$lang['auth'] = '\'Dyw\'r ategyn dilysu hwn heb ei alluogi yn y ffurfwedd, ystyriwch ei analluogi.'; + +$lang['install_url'] = 'Arsefydlu o URL:'; +$lang['install_upload'] = 'Lanlwytho Estyniad:'; + +$lang['repo_error'] = 'Doedd dim modd cysylltu â\'r ystorfa ategion. Sicrhewch fod hawl gan eich gweinydd i gysylltu â www.dokuwiki.org a gwiriwch eich gosodiadau procsi.'; +$lang['nossl'] = 'Mae\'n debyg \'dyw eich PHP ddim yn cynnal SSL. Na fydd lawrlwytho yn gweithio ar gyfer nifer o estyniadau DokuWiki.'; + +$lang['js']['display_viewoptions'] = 'Opsiynau Golwg:'; +$lang['js']['display_enabled'] = 'galluogwyd'; +$lang['js']['display_disabled'] = 'analluogwyd'; +$lang['js']['display_updatable'] = 'gallu diweddaru'; diff --git a/lib/plugins/extension/lang/da/intro_install.txt b/lib/plugins/extension/lang/da/intro_install.txt new file mode 100644 index 0000000..b686f3f --- /dev/null +++ b/lib/plugins/extension/lang/da/intro_install.txt @@ -0,0 +1 @@ +Her kan du installerer udvidelser eller temaer manuelt, ved enten at uploade dem eller angive en direkte URL til download. \ No newline at end of file diff --git a/lib/plugins/extension/lang/da/intro_plugins.txt b/lib/plugins/extension/lang/da/intro_plugins.txt new file mode 100644 index 0000000..1c4e787 --- /dev/null +++ b/lib/plugins/extension/lang/da/intro_plugins.txt @@ -0,0 +1 @@ +Dette er de udvidelser du aktuelt har installeret i din DokuWiki. Du kan aktivere, deaktive eller fjerne udvidelser fra denne side. Opdateringer til udvidelser vises også her - husk at læse dokumentationen til en udvidelse inden du opdaterer den. \ No newline at end of file diff --git a/lib/plugins/extension/lang/da/intro_search.txt b/lib/plugins/extension/lang/da/intro_search.txt new file mode 100644 index 0000000..11caf32 --- /dev/null +++ b/lib/plugins/extension/lang/da/intro_search.txt @@ -0,0 +1 @@ +Denne fane giver dig adgang til alle tredje-parts [[doku>plugins|udvidelser]] og [[doku>template|temaer]] til DokuWiki. Vær opmærksom på at installation af tredje-parts kode kan være en **sikkerhedsrisiko**. Overvej at læse dokumentation af [[doku>security#plugin_security|sikkerhed vedr. udvidelser]] først. \ No newline at end of file diff --git a/lib/plugins/extension/lang/da/intro_templates.txt b/lib/plugins/extension/lang/da/intro_templates.txt new file mode 100644 index 0000000..fb1868b --- /dev/null +++ b/lib/plugins/extension/lang/da/intro_templates.txt @@ -0,0 +1 @@ +Dette er de temaer du aktuelt har installeret i din DokuWiki. Du kan vælge det tema du vil benytte under [[?do=admin&page=config|Opsætningsstyring]]. \ No newline at end of file diff --git a/lib/plugins/extension/lang/da/lang.php b/lib/plugins/extension/lang/da/lang.php new file mode 100644 index 0000000..83a0223 --- /dev/null +++ b/lib/plugins/extension/lang/da/lang.php @@ -0,0 +1,97 @@ + + * @author Søren Birk + */ +$lang['menu'] = 'Udvidelseshåndtering'; +$lang['tab_plugins'] = 'Installerede udvidelser'; +$lang['tab_templates'] = 'Installerede temaer'; +$lang['tab_search'] = 'Søg og installer'; +$lang['tab_install'] = 'Manuel installation'; +$lang['notimplemented'] = 'Denne funktion er ikke implementeret endnu'; +$lang['notinstalled'] = 'Denne udvidelse er ikke installeret'; +$lang['alreadyenabled'] = 'Denne udvidelse er allerede aktiveret'; +$lang['alreadydisabled'] = 'Denne udvidelse er allerede deaktiveret'; +$lang['pluginlistsaveerror'] = 'Der opstod en fejl under opdatering af udvidelseslisten'; +$lang['unknownauthor'] = 'Ukendt udvikler'; +$lang['unknownversion'] = 'Ukendt version'; +$lang['btn_info'] = 'Vis mere information'; +$lang['btn_update'] = 'Opdater'; +$lang['btn_uninstall'] = 'Afinstaller'; +$lang['btn_enable'] = 'Aktiver'; +$lang['btn_disable'] = 'Deaktiver'; +$lang['btn_install'] = 'Installer'; +$lang['btn_reinstall'] = 'Geninstaller'; +$lang['js']['reallydel'] = 'Er du sikker på at du vil afinstallere denne udvidelse?'; +$lang['js']['display_viewoptions'] = 'Visningsindstillinger:'; +$lang['js']['display_enabled'] = 'aktiveret'; +$lang['js']['display_disabled'] = 'deaktiveret'; +$lang['js']['display_updatable'] = 'kan opdateres'; +$lang['search_for'] = 'Søg efter udvidelse:'; +$lang['search'] = 'Søg'; +$lang['extensionby'] = '%s af %s'; +$lang['screenshot'] = 'Skærmbillede af %s'; +$lang['popularity'] = 'Popularitet: %s%%'; +$lang['homepage_link'] = 'Dokumenter'; +$lang['bugs_features'] = 'Fejl'; +$lang['tags'] = 'Tags:'; +$lang['author_hint'] = 'Søg efter udvidelser udgivet af denne udvikler'; +$lang['installed'] = 'Installeret:'; +$lang['downloadurl'] = 'Download URL:'; +$lang['repository'] = 'Arkiv:'; +$lang['unknown'] = 'ukendt'; +$lang['installed_version'] = 'Installeret version:'; +$lang['install_date'] = 'Din sidste opdatering:'; +$lang['available_version'] = 'Tilgængelig version:'; +$lang['compatible'] = 'Kompatibel med:'; +$lang['depends'] = 'Afhængig af:'; +$lang['similar'] = 'Ligner:'; +$lang['conflicts'] = 'Konflikter med:'; +$lang['donate'] = 'Synes du om denne?'; +$lang['donate_action'] = 'Køb en kop kaffe til udvikleren!'; +$lang['repo_retry'] = 'Førsøg igen'; +$lang['provides'] = 'Giver:'; +$lang['status'] = 'Status:'; +$lang['status_installed'] = 'installeret'; +$lang['status_not_installed'] = 'ikke installeret'; +$lang['status_protected'] = 'beskyttet'; +$lang['status_enabled'] = 'aktiveret'; +$lang['status_disabled'] = 'deaktiveret'; +$lang['status_unmodifiable'] = 'låst for ændringer'; +$lang['status_plugin'] = 'udvidelse'; +$lang['status_template'] = 'tema'; +$lang['status_bundled'] = 'inkluderet'; +$lang['msg_enabled'] = 'Udvidelsen %s aktiveret'; +$lang['msg_disabled'] = 'Udvidelsen %s deaktiveret'; +$lang['msg_delete_success'] = 'Udvidelsen %s afinstalleret'; +$lang['msg_delete_failed'] = 'Kunne ikke afinstallere udvidelsen %s'; +$lang['msg_template_install_success'] = 'Temaet %s blev installeret'; +$lang['msg_template_update_success'] = 'Temaet %s blev opdateret'; +$lang['msg_plugin_install_success'] = 'Udvidelsen %s blev installeret'; +$lang['msg_plugin_update_success'] = 'Udvidelsen %s blev opdateret'; +$lang['msg_upload_failed'] = 'Kunne ikke uploade filen'; +$lang['msg_nooverwrite'] = 'Udvidelsen %s findes allerede og overskrives ikke. For at overskrive, marker indstillingen for overskrivelse'; +$lang['missing_dependency'] = 'Manglende eller deaktiveret afhængighed: %s'; +$lang['security_issue'] = 'Sikkerhedsproblem: %s'; +$lang['security_warning'] = 'Sikkerhedsadvarsel: %s'; +$lang['update_available'] = 'Opdatering: Ny version %s er tilgængelig.'; +$lang['wrong_folder'] = 'Udvidelse ikke installeret korrekt: Omdøb udvidelses-mappe "%s" til "%s".'; +$lang['url_change'] = 'URL ændret: Download-URL er blevet ændret siden sidste download. Kontrollér om den nye URL er valid, inden udvidelsen opdateres.
    Ny: %s
    Gammel: %s'; +$lang['error_badurl'] = 'URL\'er skal starte med http eller https'; +$lang['error_dircreate'] = 'Ikke i stand til at oprette midlertidig mappe til modtagelse af download'; +$lang['error_download'] = 'Ikke i stand til at downloade filen: %s'; +$lang['error_decompress'] = 'Ikke i stand til at dekomprimere den downloadede fil. Dette kan være et resultat af en dårlig download (i så fald bør du prøve igen), eller komprimeringsformatet kan være ukendt - i så fald bliver nød til at downloade og installere manuelt.'; +$lang['error_findfolder'] = 'Ikke i stand til at identificere udvidelsesmappe - du bliver nød til at downloade og installere manuelt.'; +$lang['error_copy'] = 'Der opstod en kopieringsfejl under installation af filer til mappen %s: disken kan være fuld, eller mangel på fil-tilladelser. Dette kan have resulteret i en delvist installeret udvidelse, hvilket kan gøre din wiki-installation ustabil.'; +$lang['noperms'] = 'Udvidelsesmappe er ikke skrivbar'; +$lang['notplperms'] = 'Temamappe er ikke skrivbar'; +$lang['nopluginperms'] = 'Udvidelsesmappe er ikke skrivbar'; +$lang['git'] = 'Udvidelsen blev installeret via git - du bør muligvis ikke opdatere herfra.'; +$lang['auth'] = 'Auth-udvidelse er ikke aktiveret i konfigurationen - overvej at deaktivere den.'; +$lang['install_url'] = 'Installér fra URL:'; +$lang['install_upload'] = 'Upload udvidelse:'; +$lang['repo_error'] = 'Udvidelses-arkivet kunne ikke kontaktes. Kontrollér at din server kan kontakte www.dokuwiki.org kontrollér dine proxy-indstillinger.'; +$lang['nossl'] = 'Din PHP lader til at mangle understøttelse for SSL. Mange DokuWiki udvidelser vil ikke kunne downloades.'; diff --git a/lib/plugins/extension/lang/de-informal/intro_install.txt b/lib/plugins/extension/lang/de-informal/intro_install.txt new file mode 100644 index 0000000..2aa2e06 --- /dev/null +++ b/lib/plugins/extension/lang/de-informal/intro_install.txt @@ -0,0 +1 @@ +Hier kannst Du Plugins und Templates von Hand installieren indem Du sie hochlädst oder eine Download-URL angibst. \ No newline at end of file diff --git a/lib/plugins/extension/lang/de-informal/intro_plugins.txt b/lib/plugins/extension/lang/de-informal/intro_plugins.txt new file mode 100644 index 0000000..b02041e --- /dev/null +++ b/lib/plugins/extension/lang/de-informal/intro_plugins.txt @@ -0,0 +1 @@ +Dies sind die Plugins, die bereits installiert sind. Du kannst sie hier an- oder abschalten oder sie komplett deinstallieren. Außerdem werden hier Updates zu den installierten Plugins angezeigt. Bitte lies vor einem Update die zugehörige Dokumentation. diff --git a/lib/plugins/extension/lang/de-informal/intro_search.txt b/lib/plugins/extension/lang/de-informal/intro_search.txt new file mode 100644 index 0000000..2c2191b --- /dev/null +++ b/lib/plugins/extension/lang/de-informal/intro_search.txt @@ -0,0 +1 @@ +Dieser Tab gibt Dir Zugriff auf alle vorhandenen [[doku>de:plugins|Plugins]] und [[doku>de:template|Templates]] für DokuWiki. Bitte bedenke, dass jede installierte Erweiterung ein Sicherheitsrisiko darstellen kann. Du solltest vor einer Installation die [[doku>security#plugin_security|Plugin Security]] Informationen lesen. diff --git a/lib/plugins/extension/lang/de-informal/intro_templates.txt b/lib/plugins/extension/lang/de-informal/intro_templates.txt new file mode 100644 index 0000000..aac2643 --- /dev/null +++ b/lib/plugins/extension/lang/de-informal/intro_templates.txt @@ -0,0 +1 @@ +Die folgenden Templates sind momentan in deinem DokuWiki installiert. Du kannst das zu verwendende Template im [[?do=admin&page=config|Konfigurations-Manager]] auswählen. \ No newline at end of file diff --git a/lib/plugins/extension/lang/de-informal/lang.php b/lib/plugins/extension/lang/de-informal/lang.php new file mode 100644 index 0000000..4164e25 --- /dev/null +++ b/lib/plugins/extension/lang/de-informal/lang.php @@ -0,0 +1,97 @@ + + * @author Felix + */ +$lang['menu'] = 'Erweiterungen verwalten'; +$lang['tab_plugins'] = 'Installierte Plugins'; +$lang['tab_templates'] = 'Installierte Templates'; +$lang['tab_search'] = 'Suchen und installieren'; +$lang['tab_install'] = 'Manuelle Installation'; +$lang['notimplemented'] = 'Dieses Feature wurde leider noch nicht eingebaut'; +$lang['notinstalled'] = 'Diese Erweiterung ist nicht installiert'; +$lang['alreadyenabled'] = 'Diese Erweiterung wurde bereits aktiviert'; +$lang['alreadydisabled'] = 'Diese Erweiterung wurde bereits deaktiviert'; +$lang['pluginlistsaveerror'] = 'Fehler beim Speichern der Plugin-Liste'; +$lang['unknownauthor'] = 'Unbekannter Autor'; +$lang['unknownversion'] = 'Unbekannte Version'; +$lang['btn_info'] = 'Zeige mehr Infos'; +$lang['btn_update'] = 'Update'; +$lang['btn_uninstall'] = 'Deinstallation'; +$lang['btn_enable'] = 'Aktivieren'; +$lang['btn_disable'] = 'Deaktivieren'; +$lang['btn_install'] = 'Installation'; +$lang['btn_reinstall'] = 'Neuinstallation'; +$lang['js']['reallydel'] = 'Möchtest du diese Erweiterung wirklich deinstallieren'; +$lang['js']['display_viewoptions'] = 'Einstellungen anzeigen:'; +$lang['js']['display_enabled'] = 'aktiviert'; +$lang['js']['display_disabled'] = 'deaktiviert'; +$lang['js']['display_updatable'] = 'Update verfügbar'; +$lang['search_for'] = 'Suche Erweiterung:'; +$lang['search'] = 'Suche'; +$lang['extensionby'] = '%s von %s'; +$lang['screenshot'] = 'Screenshot von %s'; +$lang['popularity'] = 'Popularität: %s%%'; +$lang['homepage_link'] = 'Doku'; +$lang['bugs_features'] = 'Bugs'; +$lang['tags'] = 'Schlagworte:'; +$lang['author_hint'] = 'Suche Erweiterungen dieses Autors'; +$lang['installed'] = 'Installiert:'; +$lang['downloadurl'] = 'URL zum Herunterladen:'; +$lang['repository'] = 'Quelle:'; +$lang['unknown'] = 'unbekannt'; +$lang['installed_version'] = 'Installierte Version:'; +$lang['install_date'] = 'Dein letztes Update:'; +$lang['available_version'] = 'Verfügbare Version:'; +$lang['compatible'] = 'Kompatibel mit:'; +$lang['depends'] = 'Abhängig von:'; +$lang['similar'] = 'Ähnlich wie:'; +$lang['conflicts'] = 'Nicht kompatibel mit:'; +$lang['donate'] = 'Nützlich?'; +$lang['donate_action'] = 'Spendiere dem Autor einen Kaffee!'; +$lang['repo_retry'] = 'Wiederholen'; +$lang['provides'] = 'Enthält:'; +$lang['status'] = 'Status'; +$lang['status_installed'] = 'installiert'; +$lang['status_not_installed'] = 'nicht installiert'; +$lang['status_protected'] = 'geschützt'; +$lang['status_enabled'] = 'aktiviert'; +$lang['status_disabled'] = 'deaktiviert'; +$lang['status_unmodifiable'] = 'unveränderlich'; +$lang['status_plugin'] = 'Plugin'; +$lang['status_template'] = 'Template'; +$lang['status_bundled'] = 'gebündelt'; +$lang['msg_enabled'] = 'Plugin %s ist aktiviert'; +$lang['msg_disabled'] = 'Erweiterung %s ist deaktiviert'; +$lang['msg_delete_success'] = 'Erweiterung %s wurde entfernt'; +$lang['msg_delete_failed'] = 'Deinstallation der Erweiterung %s fehlgeschlagen'; +$lang['msg_template_install_success'] = 'Das Template %s wurde erfolgreich installiert'; +$lang['msg_template_update_success'] = 'Das Update des Templates %s war erfolgreich '; +$lang['msg_plugin_install_success'] = 'Das Plugin %s wurde erfolgreich installiert'; +$lang['msg_plugin_update_success'] = 'Das Update des Plugins %s war erfolgreich'; +$lang['msg_upload_failed'] = 'Fehler beim Hochladen der Datei'; +$lang['msg_nooverwrite'] = 'Die Erweiterung %s ist bereits vorhanden, sodass sie nicht überschrieben wird. Zum Überschreiben aktiviere die Option "Überschreiben".'; +$lang['missing_dependency'] = 'Fehlende oder deaktivierte Abhängigkeit:%s'; +$lang['security_issue'] = 'Sicherheitsproblem: %s'; +$lang['security_warning'] = 'Sicherheitswarnung: %s'; +$lang['update_available'] = 'Update: Version %s steht zum Download bereit.'; +$lang['wrong_folder'] = 'Plugin wurde nicht korrekt installiert: Benenne das Plugin-Verzeichnis "%s" in "%s" um.'; +$lang['url_change'] = 'URL geändert: Die Download-URL wurde seit dem letzten Download geändert. Internetadresse vor Aktualisierung der Erweiterung auf Gültigkeit prüfen.
    Neu: %s
    Alt: %s'; +$lang['error_badurl'] = 'URLs sollten mit http oder https beginnen'; +$lang['error_dircreate'] = 'Temporärer Ordner konnte nicht erstellt werden um Download zu abzuspeichern'; +$lang['error_download'] = 'Download der Datei: %s nicht möglich.'; +$lang['error_decompress'] = 'Die heruntergeladene Datei konnte nicht entpackt werden. Dies kann die Folge eines fehlerhaften Downloads sein. In diesem Fall solltest du versuchen den Vorgang zu wiederholen. Es kann auch die Folge eines unbekannten Kompressionsformates sein, in diesem Fall musst du die Datei selber herunterladen und manuell installieren.'; +$lang['error_findfolder'] = 'Das Erweiterungs-Verzeichnis konnte nicht identifiziert werden, lade die Datei herunter und installiere sie manuell.'; +$lang['error_copy'] = 'Beim Versuch Dateien in den Ordner %s: zu installieren trat ein Kopierfehler auf. Die Dateizugriffsberechtigungen könnten falsch sein. Dies kann an einem unvollständig installierten Plugin liegen und beeinträchtigt somit die Stabilität deiner Wiki-Installation.'; +$lang['noperms'] = 'Das Erweiterungs-Verzeichnis ist schreibgeschützt'; +$lang['notplperms'] = 'Das Template-Verzeichnis ist schreibgeschützt'; +$lang['nopluginperms'] = 'Das Plugin-Verzeichnis ist schreibgeschützt'; +$lang['git'] = 'Diese Erweiterung wurde über git installiert und sollte daher nicht hier aktualisiert werden.'; +$lang['auth'] = 'Dieses Auth-Plugin ist in der Konfiguration nicht aktiviert, Du solltest es deaktivieren.'; +$lang['install_url'] = 'Von URL installieren:'; +$lang['install_upload'] = 'Erweiterung hochladen:'; +$lang['repo_error'] = 'Es konnte keine Verbindung zum Plugin-Verzeichnis hergestellt werden. Stelle sicher, dass der Server Verbindung mit www.dokuwiki.org aufnehmen darf und überprüfe deine Proxy-Einstellungen.'; +$lang['nossl'] = 'Deine PHP-Installation scheint SSL nicht zu unterstützen. Das Herunterladen vieler DokuWiki-Erweiterungen wird scheitern.'; diff --git a/lib/plugins/extension/lang/de/intro_install.txt b/lib/plugins/extension/lang/de/intro_install.txt new file mode 100644 index 0000000..4ecebe9 --- /dev/null +++ b/lib/plugins/extension/lang/de/intro_install.txt @@ -0,0 +1 @@ +Hier können Sie Plugins und Templates von Hand installieren indem Sie sie hochladen oder eine Download-URL angeben. \ No newline at end of file diff --git a/lib/plugins/extension/lang/de/intro_plugins.txt b/lib/plugins/extension/lang/de/intro_plugins.txt new file mode 100644 index 0000000..5ea4cf1 --- /dev/null +++ b/lib/plugins/extension/lang/de/intro_plugins.txt @@ -0,0 +1 @@ +Dies sind die Plugins, die bereits installiert sind. Sie können sie hier an- oder abschalten oder sie komplett deinstallieren. Außerdem werden hier Updates zu den installierten Plugins angezeigt. Bitte lesen Sie vor einem Update die zugehörige Dokumentation. diff --git a/lib/plugins/extension/lang/de/intro_search.txt b/lib/plugins/extension/lang/de/intro_search.txt new file mode 100644 index 0000000..12b439d --- /dev/null +++ b/lib/plugins/extension/lang/de/intro_search.txt @@ -0,0 +1 @@ +Dieser Tab gibt Ihnen Zugriff auf alle vorhandenen [[doku>de:plugins|Plugins]] und [[doku>de:template|Templates]] für DokuWiki. Bitte bedenken Sie, dass jede installierte Erweiterung ein Sicherheitsrisiko darstellen kann. Sie sollten vor einer Installation die [[doku>security#plugin_security|Plugin Security]] Informationen lesen. diff --git a/lib/plugins/extension/lang/de/intro_templates.txt b/lib/plugins/extension/lang/de/intro_templates.txt new file mode 100644 index 0000000..d71ce62 --- /dev/null +++ b/lib/plugins/extension/lang/de/intro_templates.txt @@ -0,0 +1 @@ +Dies sind die in Ihrem Dokuwiki installierten Templates. Sie können das gewünschte Template im [[?do=admin&page=config|Konfigurations Manager]] aktivieren. \ No newline at end of file diff --git a/lib/plugins/extension/lang/de/lang.php b/lib/plugins/extension/lang/de/lang.php new file mode 100644 index 0000000..5291bad --- /dev/null +++ b/lib/plugins/extension/lang/de/lang.php @@ -0,0 +1,105 @@ + + * @author Benjamin Molitor + * @author H. Richard + * @author Joerg + * @author Simon + * @author Hoisl + * @author Dominik Mahr + * @author Noel Tilliot + * @author Philip Knack + * @author Hella Breitkopf + */ +$lang['menu'] = 'Erweiterungen verwalten'; +$lang['tab_plugins'] = 'Installierte Plugins'; +$lang['tab_templates'] = 'Installierte Templates'; +$lang['tab_search'] = 'Suchen und Installieren'; +$lang['tab_install'] = 'Manuell installieren'; +$lang['notimplemented'] = 'Dieses Fähigkeit/Eigenschaft wurde noch nicht implementiert'; +$lang['notinstalled'] = 'Diese Erweiterung ist nicht installiert'; +$lang['alreadyenabled'] = 'Diese Erweiterung ist bereits aktiviert'; +$lang['alreadydisabled'] = 'Diese Erweiterung ist bereits deaktiviert'; +$lang['pluginlistsaveerror'] = 'Es gab einen Fehler beim Speichern der Plugin-Liste'; +$lang['unknownauthor'] = 'Unbekannter Autor'; +$lang['unknownversion'] = 'Unbekannte Version'; +$lang['btn_info'] = 'Zeige weitere Info'; +$lang['btn_update'] = 'Update'; +$lang['btn_uninstall'] = 'Deinstallation'; +$lang['btn_enable'] = 'Aktivieren'; +$lang['btn_disable'] = 'Deaktivieren'; +$lang['btn_install'] = 'Installieren'; +$lang['btn_reinstall'] = 'Neu installieren'; +$lang['js']['reallydel'] = 'Wollen Sie diese Erweiterung wirklich löschen?'; +$lang['js']['display_viewoptions'] = 'Optionen anzeigen'; +$lang['js']['display_enabled'] = 'aktiviert'; +$lang['js']['display_disabled'] = 'deaktiviert'; +$lang['js']['display_updatable'] = 'aktualisierbar'; +$lang['search_for'] = 'Erweiterung suchen:'; +$lang['search'] = 'Suchen'; +$lang['extensionby'] = '%s von %s'; +$lang['screenshot'] = 'Bildschirmfoto von %s'; +$lang['popularity'] = 'Popularität: %s%%'; +$lang['homepage_link'] = 'Doku'; +$lang['bugs_features'] = 'Bugs'; +$lang['tags'] = 'Schlagworte'; +$lang['author_hint'] = 'Suche weitere Erweiterungen dieses Autors'; +$lang['installed'] = 'Installiert:'; +$lang['downloadurl'] = 'Download-URL:'; +$lang['repository'] = 'Quelle:'; +$lang['unknown'] = 'unbekannt'; +$lang['installed_version'] = 'Installierte Version:'; +$lang['install_date'] = 'Ihr letztes Update:'; +$lang['available_version'] = 'Verfügbare Version: '; +$lang['compatible'] = 'Kompatibel mit:'; +$lang['depends'] = 'Benötigt:'; +$lang['similar'] = 'Ist ähnlich zu:'; +$lang['conflicts'] = 'Nicht kompatibel mit:'; +$lang['donate'] = 'Nützlich?'; +$lang['donate_action'] = 'Spendieren Sie dem Autor einen Kaffee!'; +$lang['repo_retry'] = 'Neu versuchen'; +$lang['provides'] = 'Enthält'; +$lang['status'] = 'Status'; +$lang['status_installed'] = 'installiert'; +$lang['status_not_installed'] = 'nicht installiert'; +$lang['status_protected'] = 'geschützt'; +$lang['status_enabled'] = 'aktiviert'; +$lang['status_disabled'] = 'deaktiviert'; +$lang['status_unmodifiable'] = 'unveränderlich'; +$lang['status_plugin'] = 'Plugin'; +$lang['status_template'] = 'Template'; +$lang['status_bundled'] = 'gebündelt'; +$lang['msg_enabled'] = 'Plugin %s ist aktiviert'; +$lang['msg_disabled'] = 'Erweiterung %s ist deaktiviert'; +$lang['msg_delete_success'] = 'Erweiterung %s wurde entfernt'; +$lang['msg_delete_failed'] = 'Deinstallation der Erweiterung %s fehlgeschlagen'; +$lang['msg_template_install_success'] = 'Das Template %s wurde erfolgreich installiert'; +$lang['msg_template_update_success'] = 'Das Update des Templates %s war erfolgreich '; +$lang['msg_plugin_install_success'] = 'Das Plugin %s wurde erfolgreich installiert'; +$lang['msg_plugin_update_success'] = 'Das Update des Plugins %s war erfolgreich'; +$lang['msg_upload_failed'] = 'Fehler beim Hochladen der Datei'; +$lang['msg_nooverwrite'] = 'Die Erweiterung %s ist bereits vorhanden, sodass sie nicht überschrieben wird. Zum Überschreiben aktivieren Sie die Option "Überschreiben".'; +$lang['missing_dependency'] = 'fehlende oder deaktivierte Abhängigkeit:%s'; +$lang['security_issue'] = 'Sicherheitsproblem: %s'; +$lang['security_warning'] = 'Sicherheitswarnung: %s'; +$lang['update_available'] = 'Update: Version %s steht zum Download bereit.'; +$lang['wrong_folder'] = 'Plugin wurde nicht korrekt installiert: Benennen Sie das Plugin-Verzeichnis "%s" in "%s" um.'; +$lang['url_change'] = 'URL geändert: Die Download-URL wurde seit dem letzten Download geändert. Internetadresse vor Aktualisierung der Erweiterung auf Gültigkeit prüfen.
    Neu: %s
    Alt: %s'; +$lang['error_badurl'] = 'URLs sollten mit http oder https beginnen'; +$lang['error_dircreate'] = 'Temporärer Ordner konnte nicht erstellt werden, um Download zu abzuspeichern'; +$lang['error_download'] = 'Download der Datei: %s nicht möglich.'; +$lang['error_decompress'] = 'Die heruntergeladene Datei konnte nicht entpackt werden. Dies kann die Folge eines fehlerhaften Downloads sein. In diesem Fall sollten Sie versuchen den Vorgang zu wiederholen. Es kann auch die Folge eines unbekannten Kompressionsformates sein, in diesem Fall müssen Sie die Datei selber herunterladen und manuell installieren.'; +$lang['error_findfolder'] = 'Das Erweiterungs-Verzeichnis konnte nicht identifiziert werden, laden und installieren Sie die Datei manuell.'; +$lang['error_copy'] = 'Beim Versuch Dateien in den Ordner %s: zu installieren trat ein Kopierfehler auf. Die Dateizugriffsberechtigungen könnten falsch sein. Dies kann an einem unvollständig installierten Plugin liegen und beeinträchtigt somit die Stabilität Ihre Wiki-Installation.'; +$lang['noperms'] = 'Das Erweiterungs-Verzeichnis ist schreibgeschützt'; +$lang['notplperms'] = 'Das Template-Verzeichnis ist schreibgeschützt'; +$lang['nopluginperms'] = 'Das Plugin-Verzeichnis ist schreibgeschützt'; +$lang['git'] = 'Diese Erweiterung wurde über git installiert und sollte daher nicht hier aktualisiert werden.'; +$lang['auth'] = 'Dieses Auth-Plugin ist in der Konfiguration nicht aktiviert, Sie sollten es deaktivieren.'; +$lang['install_url'] = 'Von Webadresse (URL) installieren'; +$lang['install_upload'] = 'Erweiterung hochladen:'; +$lang['repo_error'] = 'Es konnte keine Verbindung zum Plugin-Verzeichnis hergestellt werden. Stellen Sie sicher, dass der Server Verbindung mit www.dokuwiki.org aufnehmen darf und überprüfen Sie ihre Proxy-Einstellungen.'; +$lang['nossl'] = 'Ihr PHP scheint SSL nicht zu unterstützen. Das Herunterladen vieler DokuWiki-Erweiterungen wird scheitern.'; diff --git a/lib/plugins/extension/lang/el/intro_install.txt b/lib/plugins/extension/lang/el/intro_install.txt new file mode 100644 index 0000000..f2177e1 --- /dev/null +++ b/lib/plugins/extension/lang/el/intro_install.txt @@ -0,0 +1 @@ +Εδώ μπορείτε να εγκαταστήσετε πρόσθετα και πρότυπα είτε ανεβάζοντάς τα είτε μέσω URL. diff --git a/lib/plugins/extension/lang/el/intro_plugins.txt b/lib/plugins/extension/lang/el/intro_plugins.txt new file mode 100644 index 0000000..2377d29 --- /dev/null +++ b/lib/plugins/extension/lang/el/intro_plugins.txt @@ -0,0 +1 @@ +Αυτά είναι το εγκατεστημένα πρόσθετα στο DokuWiki σας. Εδώ μπορείτε να τα ενεργοποιήσετε, απενεργοποιήσετε ή να απεγκαταστήσετε. Εδώ εμφανίζονται και ενημερώσεις των πρόσθετων, διαβάστε την τεκμηρίωση του κάθε πρόσθετου πριν την ενημέρωση. diff --git a/lib/plugins/extension/lang/el/intro_search.txt b/lib/plugins/extension/lang/el/intro_search.txt new file mode 100644 index 0000000..7e95281 --- /dev/null +++ b/lib/plugins/extension/lang/el/intro_search.txt @@ -0,0 +1 @@ +Σε αυτή την καρτέλα έχετε πρόσβαση σε [[doku>plugins|plugins]] and [[doku>template|templates]] DokuWiki. Η εγκατάσταση λογισμικού τρίτων δημιουργών αποτελεί **ρίσκο ασφάλειας**, για το οποίο μπορείτε να διαβάσετε το [[doku>security#plugin_security|plugin security]] diff --git a/lib/plugins/extension/lang/el/intro_templates.txt b/lib/plugins/extension/lang/el/intro_templates.txt new file mode 100644 index 0000000..d8d212e --- /dev/null +++ b/lib/plugins/extension/lang/el/intro_templates.txt @@ -0,0 +1 @@ +Αυτά είναι τα πρότυπα που είναι τώρα εγκαταστημένα στο DokuWiki. σας. Μπορείτε να επιλέξετε αυτό που θα χρησιμοποιήσετε [[?do=admin&page=config|Configuration Manager]]. diff --git a/lib/plugins/extension/lang/el/lang.php b/lib/plugins/extension/lang/el/lang.php new file mode 100644 index 0000000..599b1b6 --- /dev/null +++ b/lib/plugins/extension/lang/el/lang.php @@ -0,0 +1,105 @@ +%s
    από %s '; +$lang['screenshot'] = 'Στιγμιότυπο %s '; +$lang['popularity'] = 'Δημοτικότητα: %s%%'; +$lang['homepage_link'] = 'Έγγραφα '; +$lang['bugs_features'] = 'Σφάλματα'; +$lang['tags'] = 'Ετικέτες '; +$lang['author_hint'] = 'Αναζητήστε πρόσθετα από αυτόν τον δημιουργό'; +$lang['installed'] = 'Εγκατεστημένα:'; +$lang['downloadurl'] = 'Κατέβασμα από URL:'; +$lang['repository'] = 'Αρχειοθήκη'; +$lang['unknown'] = 'άγνωστο '; +$lang['installed_version'] = 'Εγκατεστημένη έκδοση:'; +$lang['install_date'] = 'Τελευταία ενημέρωση:'; +$lang['available_version'] = 'Διαθέσιμη έκδοση:'; +$lang['compatible'] = 'Συμβατό με:'; +$lang['depends'] = 'Εξαρτάται από:'; +$lang['similar'] = 'Παρόμοιο με : '; +$lang['conflicts'] = 'Συγκρούεται με:'; +$lang['donate'] = 'Δωρεά '; +$lang['donate_action'] = 'Αγόρασε στον δημιουργό έναν καφέ!'; +$lang['repo_retry'] = 'Προσπαθήστε πάλι'; +$lang['provides'] = 'Παρέχει; '; +$lang['status'] = 'Κατάσταση:'; +$lang['status_installed'] = 'εγκαταστημένο'; +$lang['status_not_installed'] = 'μη εγκαταστημένο'; +$lang['status_protected'] = 'προστατευμένο'; +$lang['status_enabled'] = 'ενεργοποιημένο'; +$lang['status_disabled'] = 'απενεργοποιημένο'; +$lang['status_unmodifiable'] = 'μη τροποποιήσιμο'; +$lang['status_plugin'] = 'πρόσθετο'; +$lang['status_template'] = 'πρότυπο'; +$lang['status_bundled'] = 'σε ομάδα'; + +$lang['msg_enabled'] = 'Το πρόσθετο %s ενεργοποιήθηκε'; +$lang['msg_disabled'] = 'Το πρόσθετο %s απενεργοποιήθηκε'; +$lang['msg_delete_success'] = 'Η επέκταση %s δεν εγκαταστάθηκε '; +$lang['msg_delete_failed'] = 'Η ακύρωση εγκατάστασης %s απέτυχε'; +$lang['msg_template_install_success'] = 'Το πρότυπο %s εγκαταστάθηκε με επιτυχία '; +$lang['msg_template_update_success'] = 'Το πρότυπο %s ενημερώθηκε με επιτυχία '; +$lang['msg_plugin_install_success'] = 'Το πρόσθετο %s εγκαταστάθηκε με επιτυχία '; +$lang['msg_plugin_update_success'] = 'Το πρόσθετο %s ενημερώθηκε με επιτυχία '; +$lang['msg_upload_failed'] = 'Το ανέβασμα του αρχείου απέτυχε'; + +$lang['missing_dependency'] = 'Εξάρτηση που λείπει ή απενεργοποιήθηκε: %s'; +$lang['security_issue'] = 'Θέμα ασφάλειας: %s '; +$lang['security_warning'] = 'Προειδοποίηση Ασφάλειας: %s '; +$lang['update_available'] = 'Ενημέρωση: Η νέα έκδοση %s είναι διαθέσιμη.'; +$lang['wrong_folder'] = 'Λανθασμένη εγκατάσταση του πρόσθετου: Μετονομάστε το φάκελο "%s" σε "%s".'; +$lang['url_change'] = 'To URL άλλαξε: Το URL άλλαξε από το προηγούμενο κατέβασμα. Ελέγξετε την ορθότητα του νέου URL πριν την ενημέρωση του πρόσθετου.
    Καινούργιο: %s
    Παλιό: %s'; + +$lang['error_badurl'] = 'Τα URLs πρέπει να αρχίζουν με http ή https'; +$lang['error_dircreate'] = 'Σφάλμα κατά τη δημιουργία προσωρινού φακέλου για το κατέβασμα του αρχείου'; +$lang['error_download'] = 'Σφάλμα κατά τη λήψη του αρχείου : %s'; +$lang['error_findfolder'] = 'Αδύνατος ο προσδιορισμός του φακέλου του πρόσθετου. Πρέπει να το κατεβάσετε και εγκαταστήσετε χειροκίνητα'; +$lang['error_copy'] = 'Σφάλμα κατά την αντιγραφή του αρχείου στην προσπάθεια εγκατάστασης αρχείων στο φάκελο %s: ο δίσκος είναι πιθανόν γεμάτος, ή δεν υπάρχουν δικαιώματα πρόσβασης στον φάκελο. Πιθανή μερική εγκατάσταση του πρόσθετου με αποτέλεσμα την ασταθή λειτουργία του wiki.'; + +$lang['noperms'] = 'Δεν υπάρχουν δικαιώματα εγγραφής στο φάκελο των πρόσσθετων'; +$lang['notplperms'] = 'Δεν υπάρχουν δικαιώματα εγγραφής στο φάκελο των προτύπων'; +$lang['nopluginperms'] = 'Δεν υπάρχουν δικαιώματα εγγραφής στο φάκελο των πρόσσθετων'; +$lang['git'] = 'Αυτό το πρόσθετο εγκαταστάθηκε μέσω git, μπορεί να μην θέλετε να το ανανεώσετε εδώ.'; +$lang['auth'] = 'Αυτό το πρόσθετο ταυτοποίησης δεν έχει ενεργοποιηθεί κατά στις ρυθμίσεις, εξετάστε μήπως θέλετε να το απενεργοποιήσετε.'; + +$lang['install_url'] = 'Εγκατάσταση από το URL:'; +$lang['install_upload'] = 'Ανεβάστε το πρόσθετο:'; + +$lang['repo_error'] = 'Σφάλμα επικοινωνίας με την αρχειοθήκη πρόσθετων. Βεβαιωθείτε ότι είναι προσβάσιμο το www.dokuwiki.org και ελέγξετε τις σχετικές ρυθμίσεις proxy.'; +$lang['nossl'] = 'Your PHP seems to miss SSL support. Downloading will not work for many DokuWiki extensions.'; + +$lang['js']['display_viewoptions'] = 'Επιλογές εμφάνισης:'; +$lang['js']['display_enabled'] = 'ενεργοποιημένο'; +$lang['js']['display_disabled'] = 'απενεργοποιημένο'; +$lang['js']['display_updatable'] = 'ανανεώσιμο'; + diff --git a/lib/plugins/extension/lang/en/intro_install.txt b/lib/plugins/extension/lang/en/intro_install.txt new file mode 100644 index 0000000..a5d5ab0 --- /dev/null +++ b/lib/plugins/extension/lang/en/intro_install.txt @@ -0,0 +1 @@ +Here you can manually install plugins and templates by either uploading them or providing a direct download URL. diff --git a/lib/plugins/extension/lang/en/intro_plugins.txt b/lib/plugins/extension/lang/en/intro_plugins.txt new file mode 100644 index 0000000..4e42efe --- /dev/null +++ b/lib/plugins/extension/lang/en/intro_plugins.txt @@ -0,0 +1 @@ +These are the plugins currently installed in your DokuWiki. You can enable or disable or even completely uninstall them here. Plugin updates are shown here as well, be sure to read the plugin's documentation before updating. \ No newline at end of file diff --git a/lib/plugins/extension/lang/en/intro_search.txt b/lib/plugins/extension/lang/en/intro_search.txt new file mode 100644 index 0000000..81aa431 --- /dev/null +++ b/lib/plugins/extension/lang/en/intro_search.txt @@ -0,0 +1 @@ +This tab gives you access to all available 3rd party [[doku>plugins|plugins]] and [[doku>template|templates]] for DokuWiki. Please be aware that installing 3rd party code may pose a **security risk**, you may want to read about [[doku>security#plugin_security|plugin security]] first. diff --git a/lib/plugins/extension/lang/en/intro_templates.txt b/lib/plugins/extension/lang/en/intro_templates.txt new file mode 100644 index 0000000..012a749 --- /dev/null +++ b/lib/plugins/extension/lang/en/intro_templates.txt @@ -0,0 +1 @@ +These are the templates currently installed in your DokuWiki. You can select the template to be used in the [[?do=admin&page=config|Configuration Manager]]. diff --git a/lib/plugins/extension/lang/en/lang.php b/lib/plugins/extension/lang/en/lang.php new file mode 100644 index 0000000..a0d2496 --- /dev/null +++ b/lib/plugins/extension/lang/en/lang.php @@ -0,0 +1,112 @@ + + * @author Christopher Smith + */ + +$lang['menu'] = 'Extension Manager'; + +$lang['tab_plugins'] = 'Installed Plugins'; +$lang['tab_templates'] = 'Installed Templates'; +$lang['tab_search'] = 'Search and Install'; +$lang['tab_install'] = 'Manual Install'; + +$lang['notimplemented'] = 'This feature hasn\'t been implemented yet'; +$lang['notinstalled'] = 'This extension is not installed'; +$lang['alreadyenabled'] = 'This extension has already been enabled'; +$lang['alreadydisabled'] = 'This extension has already been disabled'; +$lang['pluginlistsaveerror'] = 'There was an error saving the plugin list'; +$lang['unknownauthor'] = 'Unknown author'; +$lang['unknownversion'] = 'Unknown version'; + +$lang['btn_info'] = 'Show more info'; +$lang['btn_update'] = 'Update'; +$lang['btn_uninstall'] = 'Uninstall'; +$lang['btn_enable'] = 'Enable'; +$lang['btn_disable'] = 'Disable'; +$lang['btn_install'] = 'Install'; +$lang['btn_reinstall'] = 'Re-install'; + +$lang['js']['reallydel'] = 'Really uninstall this extension?'; + +$lang['search_for'] = 'Search Extension:'; +$lang['search'] = 'Search'; + +$lang['extensionby'] = '%s by %s'; +$lang['screenshot'] = 'Screenshot of %s'; +$lang['popularity'] = 'Popularity: %s%%'; +$lang['homepage_link'] = 'Docs'; +$lang['bugs_features'] = 'Bugs'; +$lang['tags'] = 'Tags:'; +$lang['author_hint'] = 'Search extensions by this author'; +$lang['installed'] = 'Installed:'; +$lang['downloadurl'] = 'Download URL:'; +$lang['repository'] = 'Repository:'; +$lang['unknown'] = 'unknown'; +$lang['installed_version'] = 'Installed version:'; +$lang['install_date'] = 'Your last update:'; +$lang['available_version'] = 'Available version:'; +$lang['compatible'] = 'Compatible with:'; +$lang['depends'] = 'Depends on:'; +$lang['similar'] = 'Similar to:'; +$lang['conflicts'] = 'Conflicts with:'; +$lang['donate'] = 'Like this?'; +$lang['donate_action'] = 'Buy the author a coffee!'; +$lang['repo_retry'] = 'Retry'; +$lang['provides'] = 'Provides:'; +$lang['status'] = 'Status:'; +$lang['status_installed'] = 'installed'; +$lang['status_not_installed'] = 'not installed'; +$lang['status_protected'] = 'protected'; +$lang['status_enabled'] = 'enabled'; +$lang['status_disabled'] = 'disabled'; +$lang['status_unmodifiable'] = 'unmodifiable'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'template'; +$lang['status_bundled'] = 'bundled'; + +$lang['msg_enabled'] = 'Plugin %s enabled'; +$lang['msg_disabled'] = 'Plugin %s disabled'; +$lang['msg_delete_success'] = 'Extension %s uninstalled'; +$lang['msg_delete_failed'] = 'Uninstalling Extension %s failed'; +$lang['msg_template_install_success'] = 'Template %s installed successfully'; +$lang['msg_template_update_success'] = 'Template %s updated successfully'; +$lang['msg_plugin_install_success'] = 'Plugin %s installed successfully'; +$lang['msg_plugin_update_success'] = 'Plugin %s updated successfully'; +$lang['msg_upload_failed'] = 'Uploading the file failed'; +$lang['msg_nooverwrite'] = 'Extension %s already exists so it is not being overwritten; to overwrite, tick the overwrite option'; + +$lang['missing_dependency'] = 'Missing or disabled dependency: %s'; +$lang['security_issue'] = 'Security Issue: %s'; +$lang['security_warning'] = 'Security Warning: %s'; +$lang['update_message'] = 'Update Message: %s'; +$lang['update_available'] = 'Update: New version %s is available.'; +$lang['wrong_folder'] = 'Plugin installed incorrectly: Rename plugin directory "%s" to "%s".'; +$lang['url_change'] = 'URL changed: Download URL has changed since last download. Check if the new URL is valid before updating the extension.
    New: %s
    Old: %s'; + +$lang['error_badurl'] = 'URLs should start with http or https'; +$lang['error_dircreate'] = 'Unable to create temporary folder to receive download'; +$lang['error_download'] = 'Unable to download the file: %s'; +$lang['error_decompress'] = 'Unable to decompress the downloaded file. This maybe as a result of a bad download, in which case you should try again; or the compression format may be unknown, in which case you will need to download and install manually.'; +$lang['error_findfolder'] = 'Unable to identify extension directory, you need to download and install manually'; +$lang['error_copy'] = 'There was a file copy error while attempting to install files for directory %s: the disk could be full or file access permissions may be incorrect. This may have resulted in a partially installed plugin and leave your wiki installation unstable'; + +$lang['noperms'] = 'Extension directory is not writable'; +$lang['notplperms'] = 'Template directory is not writable'; +$lang['nopluginperms'] = 'Plugin directory is not writable'; +$lang['git'] = 'This extension was installed via git, you may not want to update it here.'; +$lang['auth'] = 'This auth plugin is not enabled in configuration, consider disabling it.'; + +$lang['install_url'] = 'Install from URL:'; +$lang['install_upload'] = 'Upload Extension:'; + +$lang['repo_badresponse'] = 'The plugin repository returned an invalid response.'; +$lang['repo_error'] = 'The plugin repository could not be contacted. Make sure your server is allowed to contact www.dokuwiki.org and check your proxy settings.'; +$lang['nossl'] = 'Your PHP seems to miss SSL support. Downloading will not work for many DokuWiki extensions.'; + +$lang['js']['display_viewoptions'] = 'View Options:'; +$lang['js']['display_enabled'] = 'enabled'; +$lang['js']['display_disabled'] = 'disabled'; +$lang['js']['display_updatable'] = 'updatable'; diff --git a/lib/plugins/extension/lang/eo/intro_install.txt b/lib/plugins/extension/lang/eo/intro_install.txt new file mode 100644 index 0000000..d9c63da --- /dev/null +++ b/lib/plugins/extension/lang/eo/intro_install.txt @@ -0,0 +1 @@ +Tie vi povas permane instali kromaĵojn kaj ŝablonojn tra alŝuto aŭ indiko de URL por rekta elŝuto. \ No newline at end of file diff --git a/lib/plugins/extension/lang/eo/intro_plugins.txt b/lib/plugins/extension/lang/eo/intro_plugins.txt new file mode 100644 index 0000000..cc7ae66 --- /dev/null +++ b/lib/plugins/extension/lang/eo/intro_plugins.txt @@ -0,0 +1 @@ +Jenaj kromaĵoj momente estas instalitaj en via DokuWiki. Vi povas ebligi, malebligi aŭ eĉ tute malinstali ilin tie. Ankaŭ montriĝos aktualigoj de kromaĵoj -- certiĝu, ke vi legis la dokumentadon de la kromaĵo antaŭ aktualigo. \ No newline at end of file diff --git a/lib/plugins/extension/lang/eo/intro_search.txt b/lib/plugins/extension/lang/eo/intro_search.txt new file mode 100644 index 0000000..c42096a --- /dev/null +++ b/lib/plugins/extension/lang/eo/intro_search.txt @@ -0,0 +1 @@ +Tiu tabelo donas aliron al ĉiuj haveblaj eksteraj [[doku>plugins|kromaĵoj]] kaj [[doku>template|ŝablonoj]] por DokuWiki. Bonvolu konscii, ke instali eksteran kodaĵon povas enkonduki **sekurecriskon**, prefere legu antaŭe pri [[doku>security#plugin_security|sekureco de kromaĵo]]. diff --git a/lib/plugins/extension/lang/eo/intro_templates.txt b/lib/plugins/extension/lang/eo/intro_templates.txt new file mode 100644 index 0000000..6dc0ef6 --- /dev/null +++ b/lib/plugins/extension/lang/eo/intro_templates.txt @@ -0,0 +1 @@ +Jenaj ŝablonoj momente instaliĝis en via DokuWiki. Elektu la ŝablonon por uzi en la [[?do=admin&page=config|Opcia administrilo]]. \ No newline at end of file diff --git a/lib/plugins/extension/lang/eo/lang.php b/lib/plugins/extension/lang/eo/lang.php new file mode 100644 index 0000000..bcac85d --- /dev/null +++ b/lib/plugins/extension/lang/eo/lang.php @@ -0,0 +1,89 @@ + + * @author Robert Bogenschneider + */ +$lang['menu'] = 'Aldonaĵa administrado'; +$lang['tab_plugins'] = 'Instalitaj kromaĵoj'; +$lang['tab_templates'] = 'Instalitaj ŝablonoj'; +$lang['tab_search'] = 'Serĉi kaj instali'; +$lang['tab_install'] = 'Permana instalado'; +$lang['notimplemented'] = 'Tiu funkcio ankoraŭ ne realiĝis'; +$lang['notinstalled'] = 'Tiu aldonaĵo ne estas instalita'; +$lang['alreadyenabled'] = 'Tiu aldonaĵo jam ebliĝis'; +$lang['alreadydisabled'] = 'Tiu aldonaĵo jam malebliĝis'; +$lang['pluginlistsaveerror'] = 'Okazis eraro dum la kromaĵlisto konserviĝis'; +$lang['unknownauthor'] = 'Nekonata aŭtoro'; +$lang['unknownversion'] = 'Nekonata versio'; +$lang['btn_info'] = 'Montri pliajn informojn'; +$lang['btn_update'] = 'Aktualigi'; +$lang['btn_uninstall'] = 'Malinstali'; +$lang['btn_enable'] = 'Ebligi'; +$lang['btn_disable'] = 'Malebligi'; +$lang['btn_install'] = 'Instali'; +$lang['btn_reinstall'] = 'Re-instali'; +$lang['js']['reallydel'] = 'Ĉu vere malinstali la aldonaĵon?'; +$lang['js']['display_updatable'] = 'ĝisdatigebla'; +$lang['search_for'] = 'Serĉi la aldonaĵon:'; +$lang['search'] = 'Serĉi'; +$lang['extensionby'] = '%s fare de %s'; +$lang['screenshot'] = 'Ekrankopio de %s'; +$lang['popularity'] = 'Populareco: %s%%'; +$lang['homepage_link'] = 'Dokumentoj'; +$lang['bugs_features'] = 'Cimoj'; +$lang['tags'] = 'Etikedoj:'; +$lang['author_hint'] = 'Serĉi aldonaĵojn laŭ tiu aŭtoro:'; +$lang['installed'] = 'Instalitaj:'; +$lang['downloadurl'] = 'URL por elŝuti:'; +$lang['repository'] = 'Kodbranĉo:'; +$lang['unknown'] = 'nekonata'; +$lang['installed_version'] = 'Instalita versio:'; +$lang['install_date'] = 'Via lasta aktualigo:'; +$lang['available_version'] = 'Havebla versio:'; +$lang['compatible'] = 'Kompatibla kun:'; +$lang['depends'] = 'Dependas de:'; +$lang['similar'] = 'Simila al:'; +$lang['conflicts'] = 'Konfliktas kun:'; +$lang['donate'] = 'Ĉu vi ŝatas tion?'; +$lang['donate_action'] = 'Aĉetu kafon al la aŭtoro!'; +$lang['repo_retry'] = 'Reprovi'; +$lang['provides'] = 'Provizas per:'; +$lang['status'] = 'Statuso:'; +$lang['status_installed'] = 'instalita'; +$lang['status_not_installed'] = 'ne instalita'; +$lang['status_protected'] = 'protektita'; +$lang['status_enabled'] = 'ebligita'; +$lang['status_disabled'] = 'malebligita'; +$lang['status_unmodifiable'] = 'neŝanĝebla'; +$lang['status_plugin'] = 'kromaĵo'; +$lang['status_template'] = 'ŝablono'; +$lang['status_bundled'] = 'kunliverita'; +$lang['msg_enabled'] = 'Kromaĵo %s ebligita'; +$lang['msg_disabled'] = 'Kromaĵo %s malebligita'; +$lang['msg_delete_success'] = 'Aldonaĵo %s malinstaliĝis'; +$lang['msg_template_install_success'] = 'Ŝablono %s sukcese instaliĝis'; +$lang['msg_template_update_success'] = 'Ŝablono %s sukcese aktualiĝis'; +$lang['msg_plugin_install_success'] = 'Kromaĵo %s sukcese instaliĝis'; +$lang['msg_plugin_update_success'] = 'Kromaĵo %s sukcese aktualiĝis'; +$lang['msg_upload_failed'] = 'Ne eblis alŝuti la dosieron'; +$lang['missing_dependency'] = 'Mankanta aŭ malebligita dependeco: %s'; +$lang['security_issue'] = 'Sekureca problemo: %s'; +$lang['security_warning'] = 'Sekureca averto: %s'; +$lang['update_available'] = 'Aktualigo: Nova versio %s haveblas.'; +$lang['wrong_folder'] = 'Kromaĵo instalita malĝuste: Renomu la kromaĵdosierujon "%s" al "%s".'; +$lang['url_change'] = 'URL ŝanĝita: La elŝuta URL ŝanĝiĝis ekde la lasta elŝuto. Kontrolu, ĉu la nova URL validas antaŭ aktualigi aldonaĵon.
    Nova: %s
    Malnova: %s'; +$lang['error_badurl'] = 'URLoj komenciĝu per http aŭ https'; +$lang['error_dircreate'] = 'Ne eblis krei portempan dosierujon por akcepti la elŝuton'; +$lang['error_download'] = 'Ne eblis elŝuti la dosieron: %s'; +$lang['error_decompress'] = 'Ne eblis malpaki la elŝutitan dosieron. Kialo povus esti fuŝa elŝuto, kaj vi reprovu; aŭ la pakiga formato estas nekonata, kaj vi devas elŝuti kaj instali permane.'; +$lang['error_findfolder'] = 'Ne eblis rekoni la aldonaĵ-dosierujon, vi devas elŝuti kaj instali permane'; +$lang['error_copy'] = 'Okazis kopiad-eraro dum la provo instali dosierojn por la dosierujo %s: la disko povus esti plena aŭ la alirpermesoj por dosieroj malĝustaj. Rezulto eble estas nur parte instalita kromaĵo, kiu malstabiligas vian vikion'; +$lang['noperms'] = 'La aldonaĵ-dosierujo ne estas skribebla'; +$lang['notplperms'] = 'La ŝablon-dosierujo ne estas skribebla'; +$lang['nopluginperms'] = 'La kromaĵ-dosierujo ne estas skribebla'; +$lang['git'] = 'Tiu aldonaĵo estis instalita pere de git, eble vi ne aktualigu ĝin ĉi tie.'; +$lang['install_url'] = 'Instali de URL:'; +$lang['install_upload'] = 'Alŝuti aldonaĵon:'; diff --git a/lib/plugins/extension/lang/es/intro_install.txt b/lib/plugins/extension/lang/es/intro_install.txt new file mode 100644 index 0000000..533396b --- /dev/null +++ b/lib/plugins/extension/lang/es/intro_install.txt @@ -0,0 +1 @@ +Aquí se puede instalar manualmente los plugins y las plantillas, ya sea cargándolos o dando una URL de descarga directa. \ No newline at end of file diff --git a/lib/plugins/extension/lang/es/intro_plugins.txt b/lib/plugins/extension/lang/es/intro_plugins.txt new file mode 100644 index 0000000..4805021 --- /dev/null +++ b/lib/plugins/extension/lang/es/intro_plugins.txt @@ -0,0 +1 @@ +Estos son los plugins actualmente instalados en su DokuWiki. Puede activar, desactivar o incluso desinstalar completamente desde aquí. Actualizaciones de los Plugin se muestran también aquí, asegúrese de leer la documentación del plugin antes de actualizar. \ No newline at end of file diff --git a/lib/plugins/extension/lang/es/intro_search.txt b/lib/plugins/extension/lang/es/intro_search.txt new file mode 100644 index 0000000..0942262 --- /dev/null +++ b/lib/plugins/extension/lang/es/intro_search.txt @@ -0,0 +1 @@ +Esta pestaña te da acceso a todos los [[doku>es:plugins]] de 3as partes disponibles y [[doku>es:template|plantillas]] para DokuWiki. Tenga en cuenta que la instalación de código de terceras partes puede plantear un **riesgo de seguridad**, es posible que desee leer primero sobre [[doku>security#plugin_security|plugin security]]. diff --git a/lib/plugins/extension/lang/es/intro_templates.txt b/lib/plugins/extension/lang/es/intro_templates.txt new file mode 100644 index 0000000..4ede9a1 --- /dev/null +++ b/lib/plugins/extension/lang/es/intro_templates.txt @@ -0,0 +1 @@ +Estas son las plantillas actualmente instalados en su DokuWiki. Puede seleccionar la plantilla que se utilizará en [[?do=admin&page=config|Configuration Manager]] \ No newline at end of file diff --git a/lib/plugins/extension/lang/es/lang.php b/lib/plugins/extension/lang/es/lang.php new file mode 100644 index 0000000..492efb3 --- /dev/null +++ b/lib/plugins/extension/lang/es/lang.php @@ -0,0 +1,101 @@ + + * @author Antonio Bueno + * @author Antonio Castilla + * @author Jonathan Hernández + * @author Álvaro Iradier + * @author Mauricio Segura + */ +$lang['menu'] = 'Administrador de Extensiones '; +$lang['tab_plugins'] = 'Plugins instalados'; +$lang['tab_templates'] = 'Plantillas instaladas'; +$lang['tab_search'] = 'Buscar e instalar'; +$lang['tab_install'] = 'Instalación manual'; +$lang['notimplemented'] = 'Esta característica no se ha implementado aún'; +$lang['notinstalled'] = 'Esta expensión no está instalada'; +$lang['alreadyenabled'] = 'Esta extensión ya había sido activada'; +$lang['alreadydisabled'] = 'Esta extensión ya había sido desactivada'; +$lang['pluginlistsaveerror'] = 'Se ha producido un error al guardar la lista de plugins'; +$lang['unknownauthor'] = 'autor desconocido'; +$lang['unknownversion'] = 'versión desconocida'; +$lang['btn_info'] = 'Mostrar más información'; +$lang['btn_update'] = 'Actualizar'; +$lang['btn_uninstall'] = 'Desinstalar'; +$lang['btn_enable'] = 'Activar'; +$lang['btn_disable'] = 'Desactivar'; +$lang['btn_install'] = 'Instalar'; +$lang['btn_reinstall'] = 'Reinstalar'; +$lang['js']['reallydel'] = '¿Realmente quiere desinstalar esta extensión?'; +$lang['js']['display_viewoptions'] = 'Ver opciones:'; +$lang['js']['display_enabled'] = 'habilitado'; +$lang['js']['display_disabled'] = 'deshabilitado'; +$lang['js']['display_updatable'] = 'actualizable'; +$lang['search_for'] = 'Extensión de búsqueda :'; +$lang['search'] = 'Buscar'; +$lang['extensionby'] = '%s por %s'; +$lang['screenshot'] = 'Captura de %s'; +$lang['popularity'] = 'Popularidad:%s%%'; +$lang['homepage_link'] = 'Documentos'; +$lang['bugs_features'] = 'Bugs'; +$lang['tags'] = 'Etiquetas:'; +$lang['author_hint'] = 'Buscar extensiones de este autor'; +$lang['installed'] = 'Instalado:'; +$lang['downloadurl'] = 'URL de descarga:'; +$lang['repository'] = 'Repositorio:'; +$lang['unknown'] = 'desconocido'; +$lang['installed_version'] = 'Versión instalada:'; +$lang['install_date'] = 'Tú última actualización:'; +$lang['available_version'] = 'Versión disponible:'; +$lang['compatible'] = 'Compatible con:'; +$lang['depends'] = 'Dependencias:'; +$lang['similar'] = 'Similar a:'; +$lang['conflicts'] = 'Conflictos con:'; +$lang['donate'] = '¿Cómo está?'; +$lang['donate_action'] = '¡Págale un café al autor!'; +$lang['repo_retry'] = 'Trate otra vez'; +$lang['provides'] = 'Provee: '; +$lang['status'] = 'Estado:'; +$lang['status_installed'] = 'instalado'; +$lang['status_not_installed'] = 'no instalado'; +$lang['status_protected'] = 'protegido'; +$lang['status_enabled'] = 'activado'; +$lang['status_disabled'] = 'desactivado'; +$lang['status_unmodifiable'] = 'no modificable'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'plantilla'; +$lang['status_bundled'] = 'agrupado'; +$lang['msg_enabled'] = 'Plugin %s activado'; +$lang['msg_disabled'] = 'Plugin %s desactivado'; +$lang['msg_delete_success'] = 'Extensión %s desinstalada'; +$lang['msg_delete_failed'] = 'La desinstalación de la extensión %s ha fallado'; +$lang['msg_template_install_success'] = 'Plantilla %s instalada con éxito'; +$lang['msg_template_update_success'] = 'Plantilla %s actualizada con éxito'; +$lang['msg_plugin_install_success'] = 'Plugin %s instalado con éxito'; +$lang['msg_plugin_update_success'] = 'Plugin %s actualizado con éxito'; +$lang['msg_upload_failed'] = 'Falló la carga del archivo'; +$lang['msg_nooverwrite'] = 'La extensión %s ya existe, por lo que no se sobrescribe; para sobrescribirla, marque la opción de sobrescritura'; +$lang['missing_dependency'] = 'Dependencia deshabilitada o perdida: %s'; +$lang['security_issue'] = 'Problema de seguridad: %s'; +$lang['security_warning'] = 'Aviso de seguridad: %s'; +$lang['update_available'] = 'Actualizar: Nueva versión %s disponible.'; +$lang['wrong_folder'] = '"Plugin" instalado incorrectamente: Cambie el nombre del directorio del plugin "%s" a "%s".'; +$lang['url_change'] = 'URL actualizada: El Download URL ha cambiado desde el último download. Verifica si el nuevo URL es valido antes de actualizar la extensión .
    Nuevo: %s
    Viejo: %s'; +$lang['error_badurl'] = 'URLs deberían empezar con http o https'; +$lang['error_dircreate'] = 'No es posible de crear un directorio temporero para poder recibir el download'; +$lang['error_download'] = 'No es posible descargar el documento: %s'; +$lang['error_decompress'] = 'No se pudo descomprimir el fichero descargado. Puede ser a causa de una descarga incorrecta, en cuyo caso puedes intentarlo de nuevo; o puede que el formato de compresión sea desconocido, en cuyo caso necesitarás descargar e instalar manualmente.'; +$lang['error_findfolder'] = 'No se ha podido identificar el directorio de la extensión, es necesario descargar e instalar manualmente'; +$lang['error_copy'] = 'Hubo un error durante la copia de archivos al intentar instalar los archivos del directorio %s: el disco puede estar lleno o los permisos de acceso a los archivos pueden ser incorrectos. Esto puede haber dado lugar a un plugin instalado parcialmente y dejar su instalación wiki inestable'; +$lang['noperms'] = 'El directorio de extensiones no tiene permiso de escritura.'; +$lang['notplperms'] = 'El directorio de plantillas no tiene permiso de escritura.'; +$lang['nopluginperms'] = 'No se puede escribir en el directorio de plugins'; +$lang['git'] = 'Esta extensión fue instalada a través de git, quizás usted no quiera actualizarla aquí mismo.'; +$lang['auth'] = 'Este plugin de autenticación no está habilitada en la configuración, considere la posibilidad de desactivarlo.'; +$lang['install_url'] = 'Instalar desde URL:'; +$lang['install_upload'] = 'Subir Extensión:'; +$lang['repo_error'] = 'El repositorio de plugins no puede ser contactado. Asegúrese que su servidor pueda contactar www.dokuwiki.org y verificar la configuración de su proxy.'; +$lang['nossl'] = 'Tu PHP parece no tener soporte SSL. Las descargas no funcionaran para muchas extensiones de DokuWiki.'; diff --git a/lib/plugins/extension/lang/fa/intro_install.txt b/lib/plugins/extension/lang/fa/intro_install.txt new file mode 100644 index 0000000..93c2b97 --- /dev/null +++ b/lib/plugins/extension/lang/fa/intro_install.txt @@ -0,0 +1 @@ +در اینجا می‌توانید افزونه‌ها و قالب‌ها را به صورت دستی از طریق آپلودشان یا با ارائهٔ لینک مستقیم دانلود نصب کنید. \ No newline at end of file diff --git a/lib/plugins/extension/lang/fa/intro_plugins.txt b/lib/plugins/extension/lang/fa/intro_plugins.txt new file mode 100644 index 0000000..7d7d331 --- /dev/null +++ b/lib/plugins/extension/lang/fa/intro_plugins.txt @@ -0,0 +1 @@ +این‌ها افزونه‌هایی است که اکنون روی داکو ویکی شما نصب می‌باشند. از اینجا می‌توانید آن‌ها را غیرفعال، فعال یا به طور کامل حذف نمایید. به‌روزرسانی افزونه‌ها نیز در اینجا نمایش داده می‌شود. پیش از به‌روزرسانی مطمئن شوید که مستندات افزونه را مطالعه نموده‌اید. \ No newline at end of file diff --git a/lib/plugins/extension/lang/fa/intro_search.txt b/lib/plugins/extension/lang/fa/intro_search.txt new file mode 100644 index 0000000..f47b242 --- /dev/null +++ b/lib/plugins/extension/lang/fa/intro_search.txt @@ -0,0 +1 @@ +این شاخه به تمام [[doku>plugins|افزونه‌ها]] و [[doku>template|قالب‌های]] نسل سوم داکو ویکی دسترسی می‌دهد. لطفا دقت کنید که نصب کد نسل سوم یک **ریسک امنیتی** است برای همین بهتر است که ابتدا [[doku>security#plugin_security|امنیت افزونه]] را مطالعه نمایید. diff --git a/lib/plugins/extension/lang/fa/intro_templates.txt b/lib/plugins/extension/lang/fa/intro_templates.txt new file mode 100644 index 0000000..1a127c0 --- /dev/null +++ b/lib/plugins/extension/lang/fa/intro_templates.txt @@ -0,0 +1 @@ +این‌ها قالب‌هاییست که اکنون در داکو ویکی شما نصب می‌باشد. شما می‌توانید قالبی که می‌خواهید استفاده شود را در [[?do=admin&page=config|تنظیمات پیکربندی]] انتخاب نمایید. \ No newline at end of file diff --git a/lib/plugins/extension/lang/fa/lang.php b/lib/plugins/extension/lang/fa/lang.php new file mode 100644 index 0000000..63345fd --- /dev/null +++ b/lib/plugins/extension/lang/fa/lang.php @@ -0,0 +1,97 @@ + + * @author Masoud Sadrnezhaad + * @author Sam01 + */ +$lang['menu'] = 'مدیریت افزونه ها'; +$lang['tab_plugins'] = 'پلاگین های نصب شده'; +$lang['tab_templates'] = 'قالب های نصب شده'; +$lang['tab_search'] = 'جستجو و نصب'; +$lang['tab_install'] = 'نصب دستی'; +$lang['notimplemented'] = 'این قابلیت هنوز پیاده‌سازی نشده'; +$lang['notinstalled'] = 'این افزونه نصب نشده است'; +$lang['alreadyenabled'] = 'این افزونه فعال شده است'; +$lang['alreadydisabled'] = 'این افزونه غیرفعال شده است'; +$lang['pluginlistsaveerror'] = 'یک خطا هنگام ذخیره‌سازی این افزونه رخ داده'; +$lang['unknownauthor'] = 'نویسنده نامشخص'; +$lang['unknownversion'] = 'نسخه ناشناخته'; +$lang['btn_info'] = 'نمایش اطلاعات بیشتر'; +$lang['btn_update'] = 'به روز رسانی'; +$lang['btn_uninstall'] = 'حذف'; +$lang['btn_enable'] = 'فعال'; +$lang['btn_disable'] = 'غیرفعال'; +$lang['btn_install'] = 'نصب'; +$lang['btn_reinstall'] = 'نصب مجدد'; +$lang['js']['reallydel'] = 'واقعا می‌خواهید این افزونه را حذف کنید؟'; +$lang['js']['display_viewoptions'] = 'نمایش گزینه‌ها:'; +$lang['js']['display_enabled'] = 'فعال'; +$lang['js']['display_disabled'] = 'غیرفعال'; +$lang['js']['display_updatable'] = 'قابل به‌روزرسانی'; +$lang['search_for'] = 'جستجوی افزونه:'; +$lang['search'] = 'جستجو'; +$lang['extensionby'] = '%s به وسیلهٔ %s'; +$lang['screenshot'] = 'اسکرین شات %s'; +$lang['popularity'] = 'محبوبیت: %s%%'; +$lang['homepage_link'] = 'مستندات'; +$lang['bugs_features'] = 'اشکالات'; +$lang['tags'] = 'برچسب ها:'; +$lang['author_hint'] = 'جستجوی افزونه‌های این نویسنده'; +$lang['installed'] = 'نصب شده:'; +$lang['downloadurl'] = 'لینک دانلود:'; +$lang['repository'] = 'مخزن:'; +$lang['unknown'] = 'ناشناخته'; +$lang['installed_version'] = 'نسخه نصب شده:'; +$lang['install_date'] = 'آخرین به‌روزرسانی شما:'; +$lang['available_version'] = 'نسخه در دسترس:'; +$lang['compatible'] = 'سازگار با:'; +$lang['depends'] = 'وابسته به:'; +$lang['similar'] = 'شبیه به:'; +$lang['conflicts'] = 'تداخل دارد با:'; +$lang['donate'] = 'به این علاقه‌مندید؟'; +$lang['donate_action'] = 'برای نویسنده یک فنجان قهوه بخرید!'; +$lang['repo_retry'] = 'دوباره'; +$lang['provides'] = 'شامل می‌شود:'; +$lang['status'] = 'وضعیت'; +$lang['status_installed'] = 'نصب شده'; +$lang['status_not_installed'] = 'نصب نشده'; +$lang['status_protected'] = 'محافظت شده'; +$lang['status_enabled'] = 'فعال'; +$lang['status_disabled'] = 'غیرفعال'; +$lang['status_unmodifiable'] = 'غیرقابل تغییر'; +$lang['status_plugin'] = 'پلاگین'; +$lang['status_template'] = 'قالب'; +$lang['status_bundled'] = 'باندل شده'; +$lang['msg_enabled'] = 'افزونه %s فعال شده'; +$lang['msg_disabled'] = 'افزونه %s غیرفعال شده'; +$lang['msg_delete_success'] = 'افزونه %s حذف شده'; +$lang['msg_delete_failed'] = 'حذف افزونه %s ناموفق بود'; +$lang['msg_template_install_success'] = 'قالب %s با موفقیت نصب شد'; +$lang['msg_template_update_success'] = 'قالب %s با موفقیت به‌روزرسانی شد'; +$lang['msg_plugin_install_success'] = 'افزونهٔ %s با موفقیت نصب شد'; +$lang['msg_plugin_update_success'] = 'افزونهٔ %s با موفقیت نصب شد'; +$lang['msg_upload_failed'] = 'بارگذاری فایل ناموفق بود'; +$lang['missing_dependency'] = 'نیازمندی وجود ندارد یا غیرفعال است: %s'; +$lang['security_issue'] = 'اشکال امنیتی: %s'; +$lang['security_warning'] = 'اخطار امنیتی: %s'; +$lang['update_available'] = 'به‌روزرسانی نسخهٔ جدید %s موجود است.'; +$lang['wrong_folder'] = 'افزونه اشتباه نصب شده: نام پوشهٔ افزونه را از "%s" به "%s" تغییر دهید.'; +$lang['url_change'] = 'لینک تغییر کرد: لینک دانلود از آخرین دانلود تغییر کرد. پیش از به‌روزرسانی افزونه، چک کنید که لینک جدید درست باشد.
    جدید: %s
    قدیمی: %s'; +$lang['error_badurl'] = 'لینک‌ها باید با http یا https شروع شوند'; +$lang['error_dircreate'] = 'امکان ایجاد پوشهٔ موقت برای دریافت دانلود وجود ندارد'; +$lang['error_download'] = 'امکان دانلود فایل وجود ندارد: %s'; +$lang['error_decompress'] = 'امکان خارج کردن فایل دانلود شده از حالت فشرده وجود ندارد. این می‌توانید در اثر دانلود ناقص باشد که در اینصورت باید دوباره تلاش کنید؛ یا اینکه فرمت فشرده‌سازی نامعلوم است که در اینصورت باید به صورت دستی دانلود و نصب نمایید.'; +$lang['error_findfolder'] = 'امکان تشخیص پوشهٔ افزونه وجود ندارد. باید به صورت دستی دانلود و نصب کنید.'; +$lang['error_copy'] = 'هنگام تلاش برای نصب فایل‌ها برای پوشهٔ %s خطای کپی فایل وجود دارد: رسانه ذخیره‌سازی می‌تواند پر باشد یا پرمیشن‌های فایل نادرست است. این می‌تواند باعث نصب بخشی از افزونه شده باشد و ویکی را ناپایدار نماید.'; +$lang['noperms'] = 'پوشه افزونه ها قابل نوشتن نیست'; +$lang['notplperms'] = 'پوشه قالب ها قابل نوشتن نیست'; +$lang['nopluginperms'] = 'پوشه پلاگین ها قابل نوشتن نیست'; +$lang['git'] = 'این افزونه از طریق گیت نصب شده، شما نباید آن را از اینجا به‌روزرسانی کنید.'; +$lang['auth'] = 'این افزونهٔ auth در بخش تنظیمات فعال نشده، غیرفعالش کنید.'; +$lang['install_url'] = 'نصب از آدرس:'; +$lang['install_upload'] = 'بارگذاری افزونه:'; +$lang['repo_error'] = 'امکان ارتباط با مخزن افزونه‌ها وجود ندارد. مطمئن شوید که سرور شما اجازهٔ ارتباط با www.dokuwiki.org را دارد و تنظیمات پراکسی را چک کنید.'; +$lang['nossl'] = 'به نظر می‌آید که PHP شما از SSL پشتیبانی نمی‌کند. دانلود کردن برای بسیاری از افزونه‌های داکو ویکی کار نمی‌کند.'; diff --git a/lib/plugins/extension/lang/fi/lang.php b/lib/plugins/extension/lang/fi/lang.php new file mode 100644 index 0000000..08052fe --- /dev/null +++ b/lib/plugins/extension/lang/fi/lang.php @@ -0,0 +1,37 @@ + + */ +$lang['tab_plugins'] = 'Asennetut liitännäiset'; +$lang['tab_search'] = 'Etsi ja asenna'; +$lang['tab_install'] = 'Manuaalinen asennus'; +$lang['notimplemented'] = 'Tätä ominaisuutta ei ole vielä toteutettu'; +$lang['notinstalled'] = 'Tätä laajennusta ei ole asennettu'; +$lang['alreadyenabled'] = 'Tämä laajennus on jo käytössä'; +$lang['alreadydisabled'] = 'Tämä laajennus on jo otettu pois käytöstä'; +$lang['pluginlistsaveerror'] = 'Tapahtui virhe tallentaessa liitännäislistaa'; +$lang['unknownauthor'] = 'Tuntematon tekijä'; +$lang['unknownversion'] = 'Tuntematon versio'; +$lang['btn_info'] = 'Näytä lisää tietoa'; +$lang['btn_update'] = 'Päivitä'; +$lang['btn_enable'] = 'Ota käyttöön'; +$lang['btn_disable'] = 'Poista käytöstä'; +$lang['btn_install'] = 'Asenna'; +$lang['btn_reinstall'] = 'Uudelleenasenna'; +$lang['js']['reallydel'] = 'Haluatko varmasti poistaa tämän laajennuksen?'; +$lang['search_for'] = 'Etsi laajennusta:'; +$lang['search'] = 'Etsi'; +$lang['downloadurl'] = 'Lataa URL-osoite'; +$lang['installed_version'] = 'Asennettu versio'; +$lang['install_date'] = 'Sinun viimeinen päivitys:'; +$lang['available_version'] = 'Saatavissa oleva versio:'; +$lang['status_installed'] = 'asennettu'; +$lang['status_protected'] = 'suojattu'; +$lang['status_enabled'] = 'otettu käyttöön'; +$lang['status_disabled'] = 'otettu pois käytöstä'; +$lang['status_plugin'] = 'liitännäinen'; +$lang['install_url'] = 'Asenna URL-osoitteesta:'; +$lang['install_upload'] = 'Ladattu laajennus:'; diff --git a/lib/plugins/extension/lang/fr/intro_install.txt b/lib/plugins/extension/lang/fr/intro_install.txt new file mode 100644 index 0000000..4c31e55 --- /dev/null +++ b/lib/plugins/extension/lang/fr/intro_install.txt @@ -0,0 +1 @@ +Ici, vous pouvez installer des extensions, greffons et thèmes. Soit en les téléversant, soit en indiquant une URL de téléchargement. \ No newline at end of file diff --git a/lib/plugins/extension/lang/fr/intro_plugins.txt b/lib/plugins/extension/lang/fr/intro_plugins.txt new file mode 100644 index 0000000..a40b863 --- /dev/null +++ b/lib/plugins/extension/lang/fr/intro_plugins.txt @@ -0,0 +1 @@ +Voilà la liste des extensions actuellement installées. À partir d'ici, vous pouvez les activer, les désactiver ou même les désinstaller complètement. Cette page affiche également les mises à jour. Assurez vous de lire la documentation avant de faire la mise à jour. \ No newline at end of file diff --git a/lib/plugins/extension/lang/fr/intro_search.txt b/lib/plugins/extension/lang/fr/intro_search.txt new file mode 100644 index 0000000..7b8012b --- /dev/null +++ b/lib/plugins/extension/lang/fr/intro_search.txt @@ -0,0 +1 @@ +Cet onglet vous donne accès à toutes les [[doku>fr:plugins|extensions]] et les [[doku>fr:template|thèmes]] de tierces parties. Restez conscients qu'installer du code de tierce partie peut poser un problème de **sécurité**. Vous voudrez peut-être au préalable lire l'article sur la [[doku>fr:security##securite_des_plugins|sécurité des greffons]]. diff --git a/lib/plugins/extension/lang/fr/intro_templates.txt b/lib/plugins/extension/lang/fr/intro_templates.txt new file mode 100644 index 0000000..a0a1336 --- /dev/null +++ b/lib/plugins/extension/lang/fr/intro_templates.txt @@ -0,0 +1 @@ +Voici la liste des thèmes actuellement installés. Le [[?do=admin&page=config|gestionnaire de configuration]] vous permet de choisir le thème à utiliser. \ No newline at end of file diff --git a/lib/plugins/extension/lang/fr/lang.php b/lib/plugins/extension/lang/fr/lang.php new file mode 100644 index 0000000..1f5f2b1 --- /dev/null +++ b/lib/plugins/extension/lang/fr/lang.php @@ -0,0 +1,102 @@ + + * @author Pierre Henriot + * @author Damien Regad + * @author Yves Grandvalet + * @author Carbain Frédéric + * @author Nicolas Friedli + */ +$lang['menu'] = 'Gestionnaire d\'extensions'; +$lang['tab_plugins'] = 'Greffons installés'; +$lang['tab_templates'] = 'Thèmes installés'; +$lang['tab_search'] = 'Rechercher et installer'; +$lang['tab_install'] = 'Installation manuelle'; +$lang['notimplemented'] = 'Cette fonctionnalité n\'est pas encore installée'; +$lang['notinstalled'] = 'Cette extension n\'est pas installée'; +$lang['alreadyenabled'] = 'Cette extension a déjà été installée'; +$lang['alreadydisabled'] = 'Cette extension a déjà été désactivée'; +$lang['pluginlistsaveerror'] = 'Une erreur s\'est produite lors de l\'enregistrement de la liste des greffons.'; +$lang['unknownauthor'] = 'Auteur inconnu'; +$lang['unknownversion'] = 'Version inconnue'; +$lang['btn_info'] = 'Montrer plus d\'informations'; +$lang['btn_update'] = 'Mettre à jour'; +$lang['btn_uninstall'] = 'Désinstaller'; +$lang['btn_enable'] = 'Activer'; +$lang['btn_disable'] = 'Désactiver'; +$lang['btn_install'] = 'Installer'; +$lang['btn_reinstall'] = 'Réinstaller'; +$lang['js']['reallydel'] = 'Vraiment désinstaller cette extension'; +$lang['js']['display_viewoptions'] = 'Voir les options:'; +$lang['js']['display_enabled'] = 'activé'; +$lang['js']['display_disabled'] = 'désactivé'; +$lang['js']['display_updatable'] = 'Mise à jour possible'; +$lang['search_for'] = 'Rechercher l\'extension :'; +$lang['search'] = 'Chercher'; +$lang['extensionby'] = '%s de %s'; +$lang['screenshot'] = 'Aperçu de %s'; +$lang['popularity'] = 'Popularité : %s%%'; +$lang['homepage_link'] = 'Documentation'; +$lang['bugs_features'] = 'Bogues'; +$lang['tags'] = 'Étiquettes :'; +$lang['author_hint'] = 'Chercher les extensions de cet auteur'; +$lang['installed'] = 'Installés :'; +$lang['downloadurl'] = 'Téléchargement :'; +$lang['repository'] = 'Dépôt : '; +$lang['unknown'] = 'inconnu'; +$lang['installed_version'] = 'Version installée :'; +$lang['install_date'] = 'Dernière mise à jour :'; +$lang['available_version'] = 'Version disponible :'; +$lang['compatible'] = 'Compatible avec :'; +$lang['depends'] = 'Dépend de :'; +$lang['similar'] = 'Similaire à :'; +$lang['conflicts'] = 'En conflit avec :'; +$lang['donate'] = 'Vous aimez ?'; +$lang['donate_action'] = 'Payer un café à l\'auteur !'; +$lang['repo_retry'] = 'Réessayer'; +$lang['provides'] = 'Fournit :'; +$lang['status'] = 'État :'; +$lang['status_installed'] = 'installé'; +$lang['status_not_installed'] = 'non installé'; +$lang['status_protected'] = 'protégé'; +$lang['status_enabled'] = 'activé'; +$lang['status_disabled'] = 'désactivé'; +$lang['status_unmodifiable'] = 'non modifiable'; +$lang['status_plugin'] = 'greffon'; +$lang['status_template'] = 'thème'; +$lang['status_bundled'] = 'fourni'; +$lang['msg_enabled'] = 'Greffon %s activé'; +$lang['msg_disabled'] = 'Greffon %s désactivé'; +$lang['msg_delete_success'] = 'Extension %s désinstallée.'; +$lang['msg_delete_failed'] = 'Échec de la désinstallation de l\'extension %s'; +$lang['msg_template_install_success'] = 'Thème %s installé avec succès'; +$lang['msg_template_update_success'] = 'Thème %s mis à jour avec succès'; +$lang['msg_plugin_install_success'] = 'Greffon %s installé avec succès'; +$lang['msg_plugin_update_success'] = 'Greffon %s mis à jour avec succès'; +$lang['msg_upload_failed'] = 'Téléversement échoué'; +$lang['msg_nooverwrite'] = 'L\'extension %s existe déjà et ne sera pas remplacée. Pour la remplacer, cocher l\'option de remplacement d\'extension.'; +$lang['missing_dependency'] = 'Dépendance absente ou désactivée : %s'; +$lang['security_issue'] = 'Problème de sécurité : %s'; +$lang['security_warning'] = 'Avertissement de sécurité : %s'; +$lang['update_available'] = 'Mise à jour : la version %s est disponible.'; +$lang['wrong_folder'] = 'Greffon installé incorrectement : renommer le dossier du greffon "%s" en "%s".'; +$lang['url_change'] = 'URL modifiée : L\'URL de téléchargement a changé depuis le dernier téléchargement. Vérifiez si l\'URL est valide avant de mettre à jour l\'extension.
    Nouvelle URL : %s
    Ancien : %s'; +$lang['error_badurl'] = 'Les URL doivent commencer par http ou https'; +$lang['error_dircreate'] = 'Impossible de créer le dossier temporaire pour le téléchargement.'; +$lang['error_download'] = 'Impossible de télécharger le fichier : %s'; +$lang['error_decompress'] = 'Impossible de décompresser le fichier téléchargé. C\'est peut être le résultat d\'une erreur de téléchargement, auquel cas vous devriez réessayer. Le format de compression est peut-être inconnu. Dans ce cas il vous faudra procéder à une installation manuelle.'; +$lang['error_findfolder'] = 'Impossible d\'identifier le dossier de l\'extension. Vous devez procéder à une installation manuelle.'; +$lang['error_copy'] = 'Une erreur de copie de fichier s\'est produite lors de l\'installation des fichiers dans le dossier %s. Il se peut que le disque soit plein, ou que les permissions d\'accès aux fichiers soient incorrectes. Il est possible que le greffon soit partiellement installé et que cela laisse votre installation de DokuWiki instable.'; +$lang['noperms'] = 'Impossible d\'écrire dans le dossier des extensions.'; +$lang['notplperms'] = 'Impossible d\'écrire dans le dossier des thèmes.'; +$lang['nopluginperms'] = 'Impossible d\'écrire dans le dossier des greffons.'; +$lang['git'] = 'Cette extension a été installé via git, vous voudrez peut-être ne pas la mettre à jour ici.'; +$lang['auth'] = 'Votre configuration n\'utilise pas ce greffon d\'authentification. Vous devriez songer à le désactiver.'; +$lang['install_url'] = 'Installez depuis l\'URL :'; +$lang['install_upload'] = 'Téléversez l\'extension :'; +$lang['repo_badresponse'] = 'Le référentiel d\'extensions a retourné une réponse invalide.'; +$lang['repo_error'] = 'Le référentiel d\'extensions est injoignable. Veuillez vous assurer que votre serveur web est autorisé à contacter www.dokuwiki.org et vérifier ses paramètres de proxy.'; +$lang['nossl'] = 'Votre version de PHP semble ne pas prendre en charge SSL. Le téléchargement de nombreuses extensions va échouer.'; diff --git a/lib/plugins/extension/lang/he/lang.php b/lib/plugins/extension/lang/he/lang.php new file mode 100644 index 0000000..ecdc19c --- /dev/null +++ b/lib/plugins/extension/lang/he/lang.php @@ -0,0 +1,26 @@ + + */ +$lang['menu'] = 'מנהל הרחבות'; +$lang['tab_plugins'] = 'תוספים מותקנים'; +$lang['tab_templates'] = 'תבניות מותקנות'; +$lang['tab_install'] = 'התקנה ידנית'; +$lang['notinstalled'] = 'הרחבה זו לא מותקנת'; +$lang['status_not_installed'] = 'לא מותקן'; +$lang['status_protected'] = 'מוגן'; +$lang['status_enabled'] = 'מופעל'; +$lang['status_disabled'] = 'מושבת'; +$lang['status_unmodifiable'] = 'לא ניתן לשינוי'; +$lang['status_plugin'] = 'תוסף'; +$lang['status_template'] = 'תבנית'; +$lang['msg_enabled'] = 'תוסף %s מופעל'; +$lang['msg_disabled'] = 'תוסף %s מושבת'; +$lang['msg_delete_success'] = 'הרחבה %s הוסרה'; +$lang['msg_delete_failed'] = 'הסרת ההרחבה %s נכשלה'; +$lang['msg_template_install_success'] = 'תבנית %s הותקנה בהצלחה'; +$lang['msg_template_update_success'] = 'תבנית %s עודכנה בהצלחה'; +$lang['error_download'] = 'לא ניתן להוריד את הקובץ: %s'; diff --git a/lib/plugins/extension/lang/hr/intro_install.txt b/lib/plugins/extension/lang/hr/intro_install.txt new file mode 100644 index 0000000..f3274b0 --- /dev/null +++ b/lib/plugins/extension/lang/hr/intro_install.txt @@ -0,0 +1 @@ +Ovdje možete ručno postaviti dodatak (plugin) i predložak (template) bilo učitavanjem ili navođenjem URL adrese za direktno učitavanje. \ No newline at end of file diff --git a/lib/plugins/extension/lang/hr/intro_plugins.txt b/lib/plugins/extension/lang/hr/intro_plugins.txt new file mode 100644 index 0000000..0c458ee --- /dev/null +++ b/lib/plugins/extension/lang/hr/intro_plugins.txt @@ -0,0 +1 @@ +Ovo su dodaci (plugin) trenutno postavljeni na Vašem DokuWiku-u. Možete ih omogućiti, onemogućiti ili u potpunosti ukloniti. Nadogradnje dodataka su također prikazane, obavezno pročitajte dokumentaciju dodatka prije nadogradnje. \ No newline at end of file diff --git a/lib/plugins/extension/lang/hr/intro_search.txt b/lib/plugins/extension/lang/hr/intro_search.txt new file mode 100644 index 0000000..88b6c3a --- /dev/null +++ b/lib/plugins/extension/lang/hr/intro_search.txt @@ -0,0 +1 @@ +Ovdje možete potražiti i druge dostupne [[doku>plugins|dodatke]] i [[doku>template|predloške]] za DokuWiki. Molimo budite svjesni da postavljanje koda razvijenog od treće strane može biti **sigurnosni rizik**, možda želite prvo pročitati o [[doku>security#plugin_security|sigurnosti dodataka]]. diff --git a/lib/plugins/extension/lang/hr/intro_templates.txt b/lib/plugins/extension/lang/hr/intro_templates.txt new file mode 100644 index 0000000..76dafe6 --- /dev/null +++ b/lib/plugins/extension/lang/hr/intro_templates.txt @@ -0,0 +1 @@ +Ovo su predlošci trenutno postavljeni na Vašem DokuWiki-u. Koji se predložak koristi možete odabrati na [[?do=admin&page=config|Upravitelju postavki]]. \ No newline at end of file diff --git a/lib/plugins/extension/lang/hr/lang.php b/lib/plugins/extension/lang/hr/lang.php new file mode 100644 index 0000000..697806d --- /dev/null +++ b/lib/plugins/extension/lang/hr/lang.php @@ -0,0 +1,95 @@ + + */ +$lang['menu'] = 'Upravitelj proširenja'; +$lang['tab_plugins'] = 'Ugrađeni dodatci'; +$lang['tab_templates'] = 'Ugrađeni predlošci'; +$lang['tab_search'] = 'Potraži i ugradi'; +$lang['tab_install'] = 'Ručna ugradnja'; +$lang['notimplemented'] = 'Ova mogućnost još nije napravljena'; +$lang['notinstalled'] = 'Proširenje nije ugrađeno'; +$lang['alreadyenabled'] = 'Ovo proširenje je već omogućeno'; +$lang['alreadydisabled'] = 'Ovo proširenje je već onemogućeno'; +$lang['pluginlistsaveerror'] = 'Dogodila se greška pri snimanju liste dodataka'; +$lang['unknownauthor'] = 'Nepoznat autor'; +$lang['unknownversion'] = 'Nepoznata inačica'; +$lang['btn_info'] = 'Prikaži više informacija'; +$lang['btn_update'] = 'Ažuriraj'; +$lang['btn_uninstall'] = 'Ukloni'; +$lang['btn_enable'] = 'Omogući'; +$lang['btn_disable'] = 'Onemogući'; +$lang['btn_install'] = 'Ugradi'; +$lang['btn_reinstall'] = 'Ponovno ugradi'; +$lang['js']['reallydel'] = 'Zaista ukloniti ovo proširenje?'; +$lang['js']['display_viewoptions'] = 'Opcije pregleda:'; +$lang['js']['display_enabled'] = 'omogućen'; +$lang['js']['display_disabled'] = 'onemogućen'; +$lang['js']['display_updatable'] = 'izmjenjiv'; +$lang['search_for'] = 'Pretraži proširenja'; +$lang['search'] = 'Pretraži'; +$lang['extensionby'] = '%s po %s'; +$lang['screenshot'] = 'Slika zaslona od %s'; +$lang['popularity'] = 'Popularnost: %s%%'; +$lang['homepage_link'] = 'Upute'; +$lang['bugs_features'] = 'Greške'; +$lang['tags'] = 'Oznake:'; +$lang['author_hint'] = 'Potraži proširenja od ovog autora'; +$lang['installed'] = 'Ugrađeno:'; +$lang['downloadurl'] = 'URL adresa preuzimanja:'; +$lang['repository'] = 'Repozitorij:'; +$lang['unknown'] = 'nepoznat'; +$lang['installed_version'] = 'Ugrađena inačica:'; +$lang['install_date'] = 'Vaše zadnje osvježavanje:'; +$lang['available_version'] = 'Dostupna inačica'; +$lang['compatible'] = 'Kompatibilan s:'; +$lang['depends'] = 'Zavisi o:'; +$lang['similar'] = 'Sličan s:'; +$lang['conflicts'] = 'U sukobu s:'; +$lang['donate'] = 'Poput ovog?'; +$lang['donate_action'] = 'Kupite autoru kavu!'; +$lang['repo_retry'] = 'Ponovi'; +$lang['provides'] = 'Osigurava:'; +$lang['status'] = 'Status:'; +$lang['status_installed'] = 'ugrađen'; +$lang['status_not_installed'] = 'nije ugrađen'; +$lang['status_protected'] = 'zaštićen'; +$lang['status_enabled'] = 'omogućen'; +$lang['status_disabled'] = 'onemogućen'; +$lang['status_unmodifiable'] = 'neizmjenjiv'; +$lang['status_plugin'] = 'dodatak'; +$lang['status_template'] = 'predložak'; +$lang['status_bundled'] = 'ugrađen'; +$lang['msg_enabled'] = 'Dodatak %s omogućen'; +$lang['msg_disabled'] = 'Dodatak %s onemogućen'; +$lang['msg_delete_success'] = 'Proširenje %s uklonjeno'; +$lang['msg_delete_failed'] = 'Uklanjanje proširenja %s nije uspjelo'; +$lang['msg_template_install_success'] = 'Predložak %s uspješno ugrađen'; +$lang['msg_template_update_success'] = 'Predložak %s uspješno nadograđen'; +$lang['msg_plugin_install_success'] = 'Dodatak %s uspješno ugrađen'; +$lang['msg_plugin_update_success'] = 'Dodatak %s uspješno nadograđen'; +$lang['msg_upload_failed'] = 'Učitavanje datoteke nije uspjelo'; +$lang['missing_dependency'] = 'Nedostaje ili onemogućena zavisnost: %s'; +$lang['security_issue'] = 'Sigurnosno pitanje: %s'; +$lang['security_warning'] = 'Sigurnosno upozorenje: %s'; +$lang['update_available'] = 'Nadogranja: Nova inačica %s je dostupna.'; +$lang['wrong_folder'] = 'Dodatak neispravno ugrađen: Preimenujte mapu dodatka iz "%s" u "%s".'; +$lang['url_change'] = 'URL izmijenjen: Adresa za preuzimanje je promijenjena od zadnjeg preuzimanja. Provjerite da li je novu URL valjan prije nadogradnje proširenja.
    Novi: %s
    Stari: %s'; +$lang['error_badurl'] = 'URL adrese trebaju započinjati sa http ili https'; +$lang['error_dircreate'] = 'Ne mogu napraviti privremenu mapu za prihvat preuzimanja'; +$lang['error_download'] = 'Ne mogu preuzeti datoteku: %s'; +$lang['error_decompress'] = 'Ne mogu raspakirati preuzetu datoteku. To može biti rezultati lošeg preuzimanja i tada treba pokušati ponovo; ili format sažimanja je nepoznat i u tom slučaju treba datoteku ručno preuzeti i ugraditi.'; +$lang['error_findfolder'] = 'Ne mogu odrediti mapu proširenja, trebate ga ručno preuzeti i ugraditi'; +$lang['error_copy'] = 'Dogodila se greška pri kopiranju dok je pokušavanja ugradnja datoteka u mapu %s: disk može biti pun ili dozvole pristupa nisu dobre. Ovo može rezultirati djelomično ugrađenim dodatkom i može učiniti Vaš wiki nestabilnim'; +$lang['noperms'] = 'Nije moguće pisati u mapu proširanja'; +$lang['notplperms'] = 'Nije moguće pisati u mapu predloška'; +$lang['nopluginperms'] = 'Nije moguće pisati u mapu dodatka'; +$lang['git'] = 'Proširenje je ugrađeno preko Git-a, možda ga ne želite nadograđivati ovdje.'; +$lang['auth'] = 'Autorizacijski dodatak nije podešen, razmotrite njegovo onemogućavanje kao dodatka.'; +$lang['install_url'] = 'Ugradi s URL-a:'; +$lang['install_upload'] = 'Učitaj proširenje:'; +$lang['repo_error'] = 'Repozitorij dodataka nije dostupan. Budite sigurni da server može pristupiti www.dokuwiki.org i provjerite proxy postavke.'; +$lang['nossl'] = 'Izgleda da korišteni PHP ne podržava SSL. Učitavanje neće raditi na mnogim DokuWiki dodatcima.'; diff --git a/lib/plugins/extension/lang/hu/intro_install.txt b/lib/plugins/extension/lang/hu/intro_install.txt new file mode 100644 index 0000000..8427e7d --- /dev/null +++ b/lib/plugins/extension/lang/hu/intro_install.txt @@ -0,0 +1 @@ +Itt új modulokat és sablonokat telepíthetsz feltöltéssel vagy a csomagra hivatkozó URL megadásával. \ No newline at end of file diff --git a/lib/plugins/extension/lang/hu/intro_plugins.txt b/lib/plugins/extension/lang/hu/intro_plugins.txt new file mode 100644 index 0000000..8a3e92d --- /dev/null +++ b/lib/plugins/extension/lang/hu/intro_plugins.txt @@ -0,0 +1 @@ +A DokuWiki rendszerben telepített modulok az alábbiak. Engedélyezheted, letilthatod vagy teljesen le is törölheted ezeket. A modulokhoz tartozó frissítések is itt láthatók, viszont frissítés előtt mindenképp olvasd el az utasításokat a modul dokumentációjában is! \ No newline at end of file diff --git a/lib/plugins/extension/lang/hu/intro_search.txt b/lib/plugins/extension/lang/hu/intro_search.txt new file mode 100644 index 0000000..aaa34eb --- /dev/null +++ b/lib/plugins/extension/lang/hu/intro_search.txt @@ -0,0 +1 @@ +Ezen a fülön harmadik fél által készített [[doku>plugins|modulokat]] és [[doku>template|sablonokat]] találsz a DokuWiki-hez. Ne feledd, hogy a harmadik féltől származó kódok **biztonsági kockázatot** jelenthetnek, ennek a [[doku>security#plugin_security|modulok biztonsága]] oldalon olvashatsz utána a telepítés előtt. diff --git a/lib/plugins/extension/lang/hu/intro_templates.txt b/lib/plugins/extension/lang/hu/intro_templates.txt new file mode 100644 index 0000000..c0ad92b --- /dev/null +++ b/lib/plugins/extension/lang/hu/intro_templates.txt @@ -0,0 +1 @@ +A DokuWiki rendszerben telepített sablonok az alábbiak. A használt sablont a [[?do=admin&page=config|Beállítóközpontban]] választhatod ki. \ No newline at end of file diff --git a/lib/plugins/extension/lang/hu/lang.php b/lib/plugins/extension/lang/hu/lang.php new file mode 100644 index 0000000..ef220c7 --- /dev/null +++ b/lib/plugins/extension/lang/hu/lang.php @@ -0,0 +1,97 @@ + + * @author Marton Sebok + */ +$lang['menu'] = 'Bővítménykezelő'; +$lang['tab_plugins'] = 'Telepített modulok'; +$lang['tab_templates'] = 'Telepített sablonok'; +$lang['tab_search'] = 'Keresés és telepítés'; +$lang['tab_install'] = 'Kézi telepítés'; +$lang['notimplemented'] = 'Ez a funkció még nincs implementálva'; +$lang['notinstalled'] = 'Ez a bővítmény nincs telepítve'; +$lang['alreadyenabled'] = 'Ez a bővítmény már engedélyezve van'; +$lang['alreadydisabled'] = 'Ez a bővítmény már le van tiltva'; +$lang['pluginlistsaveerror'] = 'Hiba történt a modulok listájának mentésekor'; +$lang['unknownauthor'] = 'Ismeretlen szerző'; +$lang['unknownversion'] = 'Ismeretlen verzió'; +$lang['btn_info'] = 'További információk megjelenítése'; +$lang['btn_update'] = 'Frissítés'; +$lang['btn_uninstall'] = 'Törlés'; +$lang['btn_enable'] = 'Engedélyezés'; +$lang['btn_disable'] = 'Letiltás'; +$lang['btn_install'] = 'Telepítés'; +$lang['btn_reinstall'] = 'Újratelepítés'; +$lang['js']['reallydel'] = 'Biztosan törlöd ezt a bővítményt?'; +$lang['js']['display_viewoptions'] = 'Nézet beállításai:'; +$lang['js']['display_enabled'] = 'engedélyezve'; +$lang['js']['display_disabled'] = 'letiltva'; +$lang['js']['display_updatable'] = 'frissíthető'; +$lang['search_for'] = 'Bővítmények keresése:'; +$lang['search'] = 'Keresés'; +$lang['extensionby'] = '%s, %s szerzőtől'; +$lang['screenshot'] = '%s képernyőképe'; +$lang['popularity'] = 'Népszerűség: %s%%'; +$lang['homepage_link'] = 'Dokumentáció'; +$lang['bugs_features'] = 'Hibák'; +$lang['tags'] = 'Címkék:'; +$lang['author_hint'] = 'Bővítmények keresése ettől a szerzőtől'; +$lang['installed'] = 'Telepítve:'; +$lang['downloadurl'] = 'Csomag URL:'; +$lang['repository'] = 'Repository:'; +$lang['unknown'] = 'ismeretlen'; +$lang['installed_version'] = 'Telepített verzió:'; +$lang['install_date'] = 'Utoljára frissítve:'; +$lang['available_version'] = 'Elérhető verzió:'; +$lang['compatible'] = 'Kompatibilis rendszerek:'; +$lang['depends'] = 'Függőségek:'; +$lang['similar'] = 'Hasonló bővítmények:'; +$lang['conflicts'] = 'Ütközést okozó bővítmények:'; +$lang['donate'] = 'Tetszik?'; +$lang['donate_action'] = 'Hívd meg a szerzőjét egy kávéra!'; +$lang['repo_retry'] = 'Újra'; +$lang['provides'] = 'Szolgáltatások:'; +$lang['status'] = 'Állapot:'; +$lang['status_installed'] = 'telepítve'; +$lang['status_not_installed'] = 'nincs telepítve'; +$lang['status_protected'] = 'védett'; +$lang['status_enabled'] = 'engedélyezve'; +$lang['status_disabled'] = 'letiltva'; +$lang['status_unmodifiable'] = 'nem lehet módosítani'; +$lang['status_plugin'] = 'modul'; +$lang['status_template'] = 'sablon'; +$lang['status_bundled'] = 'beépített'; +$lang['msg_enabled'] = 'A(z) %s modul engedélyezve'; +$lang['msg_disabled'] = 'A(z) %s modul letiltva'; +$lang['msg_delete_success'] = 'A bővítmény %s törölve'; +$lang['msg_delete_failed'] = 'A(z) %s bővítmény eltávolítása sikertelen'; +$lang['msg_template_install_success'] = 'A(z) %s sablon sikeresen telepítve'; +$lang['msg_template_update_success'] = 'A(z) %s sablon sikeresen frissítve'; +$lang['msg_plugin_install_success'] = 'A(z) %s modul sikeresen telepítve'; +$lang['msg_plugin_update_success'] = 'A(z) %s modul sikeresen frissítve'; +$lang['msg_upload_failed'] = 'A fájl feltöltése sikertelen'; +$lang['msg_nooverwrite'] = 'A % bővítmény már létezik, így nem írtuk felül. A felülíráshoz jelöld be a jelölőnégyzetet.'; +$lang['missing_dependency'] = 'Hiányzó vagy letiltott függőség: %s'; +$lang['security_issue'] = 'Biztonsági probléma: %s'; +$lang['security_warning'] = 'Biztonsági figyelmeztetés: %s'; +$lang['update_available'] = 'Frissítés: Elérhető %s új verziója.'; +$lang['wrong_folder'] = 'A modul telepítése sikertelen: Nevezd át a modul könyvtárát "%s" névről "%s" névre!'; +$lang['url_change'] = 'Az URL megváltozott: A csomag URL-je megváltozott az utolsó letöltés óta. A bővítmény frissítése előtt ellenőrizd az új URL helyességét!
    Új: %s
    Régi: %s'; +$lang['error_badurl'] = 'Az URL-nek "http"-vel vagy "https"-sel kell kezdődnie'; +$lang['error_dircreate'] = 'A letöltéshez az ideiglenes könyvtár létrehozása sikertelen'; +$lang['error_download'] = 'A(z) %s fájl letöltése sikertelen'; +$lang['error_decompress'] = 'A letöltött fájlt nem lehet kicsomagolni. Ezt okozhatja a fájl sérülése (ebben az esetben próbáld újra letölteni) vagy egy ismeretlen tömörítési formátum használata (ilyenkor kézzel kell telepítened).'; +$lang['error_findfolder'] = 'A bővítményhez tartozó könyvtárat nem sikerült megállapítani, kézzel kell letöltened és telepítened'; +$lang['error_copy'] = 'Egy fájl másolása közben hiba történt a %s könyvtárban: lehet, hogy a lemez megtelt vagy nincsenek megfelelő írási jogaid. A telepítés megszakadása a modul hibás működését eredményezheti és instabil állapotba hozhatja a wikit'; +$lang['noperms'] = 'A bővítmény könyvtára nem írható'; +$lang['notplperms'] = 'A sablon könyvtára nem írható'; +$lang['nopluginperms'] = 'A modul könyvtára nem írható'; +$lang['git'] = 'Ezt a bővítményt git-tel telepítették, lehet, hogy nem itt célszerű frissíteni'; +$lang['auth'] = 'Ez az autentikációs modul nincs engedélyezve a beállításokban, érdemes lehet letiltani.'; +$lang['install_url'] = 'Telepítés erről az URL-ről:'; +$lang['install_upload'] = 'Bővítmény feltöltése:'; +$lang['repo_error'] = 'A modul repository-ja nem érhető el. Bizonyosodj meg róla, hogy a szervereden engedélyezett a www.dokuwiki.org cím elérése és ellenőrizd a proxy beállításaidat!'; +$lang['nossl'] = 'Úgy tűnik, a PHP konfigurációd nem támogatja az SSL-t. Néhány DokuWiki bővítmény letöltése sikertelen lehet.'; diff --git a/lib/plugins/extension/lang/it/intro_install.txt b/lib/plugins/extension/lang/it/intro_install.txt new file mode 100644 index 0000000..5106500 --- /dev/null +++ b/lib/plugins/extension/lang/it/intro_install.txt @@ -0,0 +1 @@ +Qui potete installare manualmente plugin e template, sia caricandoli in upload sia fornendo una URL per scaricarli direttamente. \ No newline at end of file diff --git a/lib/plugins/extension/lang/it/intro_plugins.txt b/lib/plugins/extension/lang/it/intro_plugins.txt new file mode 100644 index 0000000..cd7825f --- /dev/null +++ b/lib/plugins/extension/lang/it/intro_plugins.txt @@ -0,0 +1 @@ +Questi sono i plugin attualmente installati nel vostro DokuWiki. Qui potete abilitarli o disabilitarli o addirittura disinstallarli completamente. Qui sono mostrati anche gli aggiornamenti dei plugin, assicurativi di leggere la relativa documentazione prima di aggiornarli. \ No newline at end of file diff --git a/lib/plugins/extension/lang/it/intro_search.txt b/lib/plugins/extension/lang/it/intro_search.txt new file mode 100644 index 0000000..40eace5 --- /dev/null +++ b/lib/plugins/extension/lang/it/intro_search.txt @@ -0,0 +1 @@ +Questa sezione ti da accesso a tutti i [[doku>it:plugins|plugin]] e [[doku>it:template|temi]] di terze parti disponibili per DokuWiki. Sappi che l'installazione di codice di terze parti potrebbe rappresentare un **rischio di sicurezza**, quindi, forse, prima vorresti informarti a proposito della [[doku>security#plugin_security|sicurezza dei plugin]]. diff --git a/lib/plugins/extension/lang/it/intro_templates.txt b/lib/plugins/extension/lang/it/intro_templates.txt new file mode 100644 index 0000000..a38d868 --- /dev/null +++ b/lib/plugins/extension/lang/it/intro_templates.txt @@ -0,0 +1 @@ +Questi sono i temi attualmente installati nel tuo DokuWiki. Puoi selezionare il tema da usare in [[?do=admin&page=config|Configurazione Wiki]]. \ No newline at end of file diff --git a/lib/plugins/extension/lang/it/lang.php b/lib/plugins/extension/lang/it/lang.php new file mode 100644 index 0000000..adbfb48 --- /dev/null +++ b/lib/plugins/extension/lang/it/lang.php @@ -0,0 +1,100 @@ + + * @author Francesco + * @author Fabio + * @author Torpedo + * @author Maurizio + */ +$lang['menu'] = 'Manager delle Extension'; +$lang['tab_plugins'] = 'Plugin Installati'; +$lang['tab_templates'] = 'Template Installati'; +$lang['tab_search'] = 'Ricerca e Installazione'; +$lang['tab_install'] = 'Installazione Manuale'; +$lang['notimplemented'] = 'Questa funzionalità non è ancora stata implementata'; +$lang['notinstalled'] = 'Questa extension non è installata'; +$lang['alreadyenabled'] = 'Questa extension è già stata abilitata'; +$lang['alreadydisabled'] = 'Questa extension à già stata disabilitata'; +$lang['pluginlistsaveerror'] = 'Si è verificato un errore durante il salvataggio dell\'elenco dei plugin'; +$lang['unknownauthor'] = 'Autore sconosciuto'; +$lang['unknownversion'] = 'Revisione sconosciuta'; +$lang['btn_info'] = 'Mostra maggiori informazioni'; +$lang['btn_update'] = 'Aggiorna'; +$lang['btn_uninstall'] = 'Disinstalla'; +$lang['btn_enable'] = 'Abilita'; +$lang['btn_disable'] = 'Disabilita'; +$lang['btn_install'] = 'Installa'; +$lang['btn_reinstall'] = 'Reinstalla'; +$lang['js']['reallydel'] = 'Sicuro di disinstallare questa estensione?'; +$lang['js']['display_viewoptions'] = 'Opzioni di Visualizzazione:'; +$lang['js']['display_enabled'] = 'abilitato'; +$lang['js']['display_disabled'] = 'disabilitato'; +$lang['js']['display_updatable'] = 'aggiornabile'; +$lang['search_for'] = 'Extension di Ricerca:'; +$lang['search'] = 'Cerca'; +$lang['extensionby'] = '%s da %s'; +$lang['screenshot'] = 'Screenshot di %s'; +$lang['popularity'] = 'Popolarità: %s%%'; +$lang['homepage_link'] = 'Documenti'; +$lang['bugs_features'] = 'Bug'; +$lang['tags'] = 'Tag:'; +$lang['author_hint'] = 'Cerca estensioni per questo autore'; +$lang['installed'] = 'Installato:'; +$lang['downloadurl'] = 'URL download:'; +$lang['repository'] = 'Repository'; +$lang['unknown'] = 'sconosciuto'; +$lang['installed_version'] = 'Versione installata'; +$lang['install_date'] = 'Il tuo ultimo aggiornamento:'; +$lang['available_version'] = 'Versione disponibile:'; +$lang['compatible'] = 'Compatibile con:'; +$lang['depends'] = 'Dipende da:'; +$lang['similar'] = 'Simile a:'; +$lang['conflicts'] = 'Conflitto con:'; +$lang['donate'] = 'Simile a questo?'; +$lang['donate_action'] = 'Paga un caffè all\'autore!'; +$lang['repo_retry'] = 'Riprova'; +$lang['provides'] = 'Fornisce:'; +$lang['status'] = 'Status:'; +$lang['status_installed'] = 'installato'; +$lang['status_not_installed'] = 'non installato'; +$lang['status_protected'] = 'protetto'; +$lang['status_enabled'] = 'abilitato'; +$lang['status_disabled'] = 'disabilitato'; +$lang['status_unmodifiable'] = 'inmodificabile'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'modello'; +$lang['status_bundled'] = 'accoppiato'; +$lang['msg_enabled'] = 'Plugin %s abilitato'; +$lang['msg_disabled'] = 'Plugin %s disabilitato'; +$lang['msg_delete_success'] = 'Estensione %s disinstallata'; +$lang['msg_delete_failed'] = 'Disinstallazione dell\'Extension %s fallita'; +$lang['msg_template_install_success'] = 'Il template %s è stato installato correttamente'; +$lang['msg_template_update_success'] = 'Il Template %s è stato aggiornato correttamente'; +$lang['msg_plugin_install_success'] = 'Plugin %s installato con successo'; +$lang['msg_plugin_update_success'] = 'Plugin %s aggiornato con successo'; +$lang['msg_upload_failed'] = 'Caricamento del file fallito'; +$lang['msg_nooverwrite'] = 'L\'estensione %s esiste già e non è stata sovrascritta; per sovrascriverla, seleziona l\'opzione "overwrite" o "sovrascrivi"'; +$lang['missing_dependency'] = 'Dipendenza mancante o disabilitata: %s'; +$lang['security_issue'] = 'Problema di sicurezza: %s'; +$lang['security_warning'] = 'Avvertimento di sicurezza: %s'; +$lang['update_available'] = 'Aggiornamento: Nuova versione %s disponibile.'; +$lang['wrong_folder'] = 'Plugin non installato correttamente: rinomina la directory del plugin "%s" in "%s".'; +$lang['url_change'] = 'URL cambiato: l\'URL per il download è cambiato dall\'ultima volta che è stato utilizzato. Controlla se il nuovo URL è valido prima di aggiornare l\'estensione.
    Nuovo: %s
    Vecchio: %s'; +$lang['error_badurl'] = 'URLs deve iniziare con http o https'; +$lang['error_dircreate'] = 'Impossibile creare una cartella temporanea per ricevere il download'; +$lang['error_download'] = 'Impossibile scaricare il file: %s'; +$lang['error_decompress'] = 'Impossibile decomprimere il file scaricato. Ciò può dipendere da errori in fase di download, nel qual caso dovreste ripetere l\'operazione; oppure il formato di compressione è sconosciuto, e in questo caso dovrete scaricare e installare manualmente.'; +$lang['error_findfolder'] = 'Impossibile identificare la directory dell\'extension, dovrete scaricare e installare manualmente'; +$lang['error_copy'] = 'C\'è stato un errore di copia dei file mentre si tentava di copiare i file per la directory %s: il disco potrebbe essere pieno o i pemessi di accesso ai file potrebbero essere sbagliati. Questo potrebbe aver causato una parziale installazione dei plugin lasciando il tuo wiki instabile'; +$lang['noperms'] = 'La directory Extension non è scrivibile'; +$lang['notplperms'] = 'Il modello di cartella non è scrivibile'; +$lang['nopluginperms'] = 'La cartella plugin non è scrivibile'; +$lang['git'] = 'Questa extension è stata installata da git, potreste non volerla aggiornare qui.'; +$lang['auth'] = 'Questo plugin di autenticazione non è abilitato nella configurazione, considera di disabilitarlo.'; +$lang['install_url'] = 'Installa da URL:'; +$lang['install_upload'] = 'Caricamento Extension:'; +$lang['repo_error'] = 'Il repository dei plugin non può essere raggiunto. Assicuratevi che il vostro server sia abilitato a contattare l\'indirizzo www.dokuwiki.org e controllate le impostazioni del vostro proxy.'; +$lang['nossl'] = 'La tua installazione PHP sembra mancare del supporto SSL. I download per molte estensioni di DokuWiki non funzioneranno.'; diff --git a/lib/plugins/extension/lang/ja/intro_install.txt b/lib/plugins/extension/lang/ja/intro_install.txt new file mode 100644 index 0000000..9f99b82 --- /dev/null +++ b/lib/plugins/extension/lang/ja/intro_install.txt @@ -0,0 +1 @@ +アップロードするかダウンロードURLを指定して、手動でプラグインやテンプレートをインストールできます。 diff --git a/lib/plugins/extension/lang/ja/intro_plugins.txt b/lib/plugins/extension/lang/ja/intro_plugins.txt new file mode 100644 index 0000000..b8251c7 --- /dev/null +++ b/lib/plugins/extension/lang/ja/intro_plugins.txt @@ -0,0 +1 @@ +このDokuWikiに現在インストールされているプラグインです。これらプラグインを有効化、無効化、アンインストールできます。更新はできる場合のみ表示されます。更新前に、プラグインの解説をお読みください。 \ No newline at end of file diff --git a/lib/plugins/extension/lang/ja/intro_search.txt b/lib/plugins/extension/lang/ja/intro_search.txt new file mode 100644 index 0000000..1998e8d --- /dev/null +++ b/lib/plugins/extension/lang/ja/intro_search.txt @@ -0,0 +1 @@ +このタブでは、DokuWiki用の利用可能なすべてのサードパーティの[[doku>ja:plugins|プラグイン]]と[[doku>ja:template|テンプレート]]にアクセスできます。サードパーティ製のコードには、**セキュリティ上のリスク**の可能性があることに注意してください。最初に[[doku>ja:security#プラグインのセキュリティ|プラグインのセキュリティ]]を読むことをお勧めします。 diff --git a/lib/plugins/extension/lang/ja/intro_templates.txt b/lib/plugins/extension/lang/ja/intro_templates.txt new file mode 100644 index 0000000..5de6d2f --- /dev/null +++ b/lib/plugins/extension/lang/ja/intro_templates.txt @@ -0,0 +1 @@ +このDokuWikiに現在インストールされているテンプレートです。使用するテンプレートは[[?do=admin&page=config|設定管理]]で選択できます。 \ No newline at end of file diff --git a/lib/plugins/extension/lang/ja/lang.php b/lib/plugins/extension/lang/ja/lang.php new file mode 100644 index 0000000..0d0e6f4 --- /dev/null +++ b/lib/plugins/extension/lang/ja/lang.php @@ -0,0 +1,100 @@ + + * @author Hideaki SAWADA + * @author PzF_X + * @author Satoshi Sahara + * @author Ikuo Obataya + */ +$lang['menu'] = '拡張機能管理'; +$lang['tab_plugins'] = 'インストール済プラグイン'; +$lang['tab_templates'] = 'インストール済テンプレート'; +$lang['tab_search'] = '検索とインストール'; +$lang['tab_install'] = '手動インストール'; +$lang['notimplemented'] = 'この機能は未実装です。'; +$lang['notinstalled'] = 'この拡張機能はインストールされていません。'; +$lang['alreadyenabled'] = 'この拡張機能は有効です。'; +$lang['alreadydisabled'] = 'この拡張機能は無効です。'; +$lang['pluginlistsaveerror'] = 'プラグイン一覧の保存中にエラーが発生しました。'; +$lang['unknownauthor'] = '作者不明'; +$lang['unknownversion'] = 'バージョン不明'; +$lang['btn_info'] = '詳細情報を表示する'; +$lang['btn_update'] = '更新'; +$lang['btn_uninstall'] = 'アンインストール'; +$lang['btn_enable'] = '有効化'; +$lang['btn_disable'] = '無効化'; +$lang['btn_install'] = 'インストール'; +$lang['btn_reinstall'] = '再インストール'; +$lang['js']['reallydel'] = 'この拡張機能を本当にアンインストールしますか?'; +$lang['js']['display_viewoptions'] = '表示オプション: '; +$lang['js']['display_enabled'] = '有効'; +$lang['js']['display_disabled'] = '無効'; +$lang['js']['display_updatable'] = '更新可能'; +$lang['search_for'] = '拡張機能の検索:'; +$lang['search'] = '検索'; +$lang['extensionby'] = '%s 作者: %s'; +$lang['screenshot'] = '%s のスクリーンショット'; +$lang['popularity'] = '利用状況:%s%%'; +$lang['homepage_link'] = '解説'; +$lang['bugs_features'] = 'バグ'; +$lang['tags'] = 'タグ:'; +$lang['author_hint'] = 'この作者で拡張機能を検索'; +$lang['installed'] = 'インストール済:'; +$lang['downloadurl'] = 'ダウンロード URL:'; +$lang['repository'] = 'リポジトリ:'; +$lang['unknown'] = '不明'; +$lang['installed_version'] = 'インストール済バージョン:'; +$lang['install_date'] = '最終更新日:'; +$lang['available_version'] = '利用可能バージョン:'; +$lang['compatible'] = '互換性のあるバージョン:'; +$lang['depends'] = '必須プラグイン:'; +$lang['similar'] = '類似しているプラグイン:'; +$lang['conflicts'] = '競合するプラグイン:'; +$lang['donate'] = '気に入りましたか?'; +$lang['donate_action'] = '寄付先はこちら'; +$lang['repo_retry'] = '再実行'; +$lang['provides'] = '機能:'; +$lang['status'] = '状態:'; +$lang['status_installed'] = 'インストール済'; +$lang['status_not_installed'] = '未インストール'; +$lang['status_protected'] = '保護されています'; +$lang['status_enabled'] = '有効'; +$lang['status_disabled'] = '無効'; +$lang['status_unmodifiable'] = '編集不可'; +$lang['status_plugin'] = 'プラグイン'; +$lang['status_template'] = 'テンプレート'; +$lang['status_bundled'] = '同梱'; +$lang['msg_enabled'] = '%s プラグインを有効化しました。'; +$lang['msg_disabled'] = '%s プラグインを無効化しました。'; +$lang['msg_delete_success'] = '拡張機能 %s をアンインストールしました。'; +$lang['msg_delete_failed'] = '拡張機能 %s のアンインストールに失敗しました。'; +$lang['msg_template_install_success'] = '%s テンプレートは正常にインストールされました。'; +$lang['msg_template_update_success'] = '%s テンプレートは正常に更新されました。'; +$lang['msg_plugin_install_success'] = '%s プラグインは正常にインストールされました。'; +$lang['msg_plugin_update_success'] = '%s プラグインは正常に更新されました。'; +$lang['msg_upload_failed'] = 'ファイルのアップロードに失敗しました。'; +$lang['msg_nooverwrite'] = '拡張機能 %s は既に存在するため上書きされません。上書きするには、上書きオプションにチェックを入れて下さい。'; +$lang['missing_dependency'] = '依存関係が欠落または無効: %s'; +$lang['security_issue'] = 'セキュリティ上の問題: %s'; +$lang['security_warning'] = 'セキュリティ警告: %s'; +$lang['update_available'] = '更新: %sの新バージョンが利用可能です。'; +$lang['wrong_folder'] = 'プラグインは正しくインストールされませんでした: プラグインのディレクトリを "%s" から "%s" へ変更して下さい。'; +$lang['url_change'] = 'URL が変更されました: 最後にダウンロードした後、ダウンロード URL が変更されました。拡張機能のアップデート前に新 URL が正しいかを確認して下さい。
    新:%s
    旧:%s'; +$lang['error_badurl'] = 'URLはhttpかhttpsで始まる必要があります。'; +$lang['error_dircreate'] = 'ダウンロード用の一時フォルダが作成できません。'; +$lang['error_download'] = 'ファイルをダウンロードできません:%s'; +$lang['error_decompress'] = 'ダウンロードしたファイルを解凍できません。ダウンロードに失敗した結果こうなったのであれば、再度試して下さい。圧縮形式が不明の場合は、手動でダウンロード・インストールしてください。'; +$lang['error_findfolder'] = '拡張機能ディレクトリを認識できません。手動でダウンロード・インストールしてください。'; +$lang['error_copy'] = '%s ディレクトリのファイルをインストールしようとした時、ファイルコピーエラーが発生しました。ディスクの空き容量が不足しているかもしれませんし、ファイルのアクセス権が正しくないかもしれません。今回の操作の結果、プラグインが一部分インストールされ、wiki が不安定になるかもしれません。'; +$lang['noperms'] = '拡張機能ディレクトリが書き込み不可です。'; +$lang['notplperms'] = 'テンプレートディレクトリが書き込み不可です。'; +$lang['nopluginperms'] = 'プラグインディレクトリが書き込み不可です。'; +$lang['git'] = 'この拡張機能は Git 経由でインストールされており、ここで更新すべきでないかもしれません。'; +$lang['auth'] = 'この認証プラグインは設定管理画面で有効化されていません。この画面で無効化する事もご検討頂けます。'; +$lang['install_url'] = 'URL からインストール:'; +$lang['install_upload'] = '拡張機能をアップロード:'; +$lang['repo_error'] = 'プラグインのリポジトリに接続できません。サーバーが www.dokuwiki.org に接続できることやプロキシの設定を確認して下さい。'; +$lang['nossl'] = 'お使いのPHP機能がSSLをサポートしていないため、拡張機能のダウンロードが正常に動作しません。'; diff --git a/lib/plugins/extension/lang/ko/intro_install.txt b/lib/plugins/extension/lang/ko/intro_install.txt new file mode 100644 index 0000000..269df29 --- /dev/null +++ b/lib/plugins/extension/lang/ko/intro_install.txt @@ -0,0 +1 @@ +여기에 플러그인과 템플릿을 수동으로 올리거나 직접 다운로드 URL을 제공하여 수동으로 설치할 수 있습니다. \ No newline at end of file diff --git a/lib/plugins/extension/lang/ko/intro_plugins.txt b/lib/plugins/extension/lang/ko/intro_plugins.txt new file mode 100644 index 0000000..9ac7a3d --- /dev/null +++ b/lib/plugins/extension/lang/ko/intro_plugins.txt @@ -0,0 +1 @@ +도쿠위키에 현재 설치된 플러그인입니다. 여기에서 플러그인을 활성화 또는 비활성화하거나 심지어 완전히 제거할 수 있습니다. 또한 플러그인 업데이트는 여기에 보여집니다. 업데이트하기 전에 플러그인의 설명문서를 읽으십시오. \ No newline at end of file diff --git a/lib/plugins/extension/lang/ko/intro_search.txt b/lib/plugins/extension/lang/ko/intro_search.txt new file mode 100644 index 0000000..e7bfca5 --- /dev/null +++ b/lib/plugins/extension/lang/ko/intro_search.txt @@ -0,0 +1 @@ +이 탭은 도쿠위키를 위한 사용할 수 있는 모든 타사 [[doku>ko:plugins|플러그인]]과 [[doku>ko:template|템플릿에]] 접근하도록 제공합니다. 타사 코드를 설치하면 **보안 위험에 노출**될 수 있음을 유의하십시오, 먼저 [[doku>security#plugin_security|플러그인 보안]]에 대해 읽을 수 있습니다. diff --git a/lib/plugins/extension/lang/ko/intro_templates.txt b/lib/plugins/extension/lang/ko/intro_templates.txt new file mode 100644 index 0000000..d4320b8 --- /dev/null +++ b/lib/plugins/extension/lang/ko/intro_templates.txt @@ -0,0 +1 @@ +도쿠위키에 현재 설치된 템플릿입니다. [[?do=admin&page=config|환경 설정 관리자]]에서 사용하는 템플릿을 선택할 수 있습니다. \ No newline at end of file diff --git a/lib/plugins/extension/lang/ko/lang.php b/lib/plugins/extension/lang/ko/lang.php new file mode 100644 index 0000000..50ec739 --- /dev/null +++ b/lib/plugins/extension/lang/ko/lang.php @@ -0,0 +1,97 @@ + + * @author Myeongjin + * @author hyeonsoft + */ +$lang['menu'] = '확장 기능 관리자'; +$lang['tab_plugins'] = '설치된 플러그인'; +$lang['tab_templates'] = '설치된 템플릿'; +$lang['tab_search'] = '검색하고 설치'; +$lang['tab_install'] = '수동 설치'; +$lang['notimplemented'] = '이 기능은 아직 구현되지 않았습니다'; +$lang['notinstalled'] = '이 확장 기능은 설치되어 있지 않습니다'; +$lang['alreadyenabled'] = '이 확장 기능이 이미 활성화되어 있습니다'; +$lang['alreadydisabled'] = '이 확장 기능이 이미 비활성화되어 있습니다'; +$lang['pluginlistsaveerror'] = '플러그인 목록을 저장하는 중 오류가 있었습니다'; +$lang['unknownauthor'] = '알 수 없는 저자'; +$lang['unknownversion'] = '알 수 없는 버전'; +$lang['btn_info'] = '정보 더 보기'; +$lang['btn_update'] = '업데이트'; +$lang['btn_uninstall'] = '제거'; +$lang['btn_enable'] = '활성화'; +$lang['btn_disable'] = '비활성화'; +$lang['btn_install'] = '설치'; +$lang['btn_reinstall'] = '다시 설치'; +$lang['js']['reallydel'] = '정말 이 확장 기능을 제거하겠습니까?'; +$lang['js']['display_viewoptions'] = '보기 옵션:'; +$lang['js']['display_enabled'] = '활성화됨'; +$lang['js']['display_disabled'] = '비활성화됨'; +$lang['js']['display_updatable'] = '업데이트할 수 있음'; +$lang['search_for'] = '확장 기능 검색:'; +$lang['search'] = '검색'; +$lang['extensionby'] = '%s (저자 %s)'; +$lang['screenshot'] = '%s의 스크린샷'; +$lang['popularity'] = '인기: %s%%'; +$lang['homepage_link'] = '문서'; +$lang['bugs_features'] = '버그'; +$lang['tags'] = '태그:'; +$lang['author_hint'] = '이 저자로 확장 기능 검색'; +$lang['installed'] = '설치됨:'; +$lang['downloadurl'] = '다운로드 URL:'; +$lang['repository'] = '저장소:'; +$lang['unknown'] = '알 수 없음'; +$lang['installed_version'] = '설치된 버전:'; +$lang['install_date'] = '마지막 업데이트:'; +$lang['available_version'] = '가능한 버전:'; +$lang['compatible'] = '다음과의 호환성:'; +$lang['depends'] = '다음에 의존:'; +$lang['similar'] = '다음과 비슷:'; +$lang['conflicts'] = '다음과 충돌:'; +$lang['donate'] = '이것이 좋나요?'; +$lang['donate_action'] = '저자에게 커피를 사주세요!'; +$lang['repo_retry'] = '다시 시도'; +$lang['provides'] = '제공:'; +$lang['status'] = '상태:'; +$lang['status_installed'] = '설치됨'; +$lang['status_not_installed'] = '설치되지 않음'; +$lang['status_protected'] = '보호됨'; +$lang['status_enabled'] = '활성화됨'; +$lang['status_disabled'] = '비활성화됨'; +$lang['status_unmodifiable'] = '수정할 수 없음'; +$lang['status_plugin'] = '플러그인'; +$lang['status_template'] = '템플릿'; +$lang['status_bundled'] = '포함'; +$lang['msg_enabled'] = '%s 플러그인이 활성화되었습니다'; +$lang['msg_disabled'] = '%s 플러그인이 비활성화되었습니다'; +$lang['msg_delete_success'] = '%s 확장 기능이 제거되었습니다'; +$lang['msg_delete_failed'] = '%s 확장 기능 제거에 실패했습니다'; +$lang['msg_template_install_success'] = '%s 템플릿을 성공적으로 설치했습니다'; +$lang['msg_template_update_success'] = '%s 템플릿을 성공적으로 업데이트했습니다'; +$lang['msg_plugin_install_success'] = '%s 플러그인을 성공적으로 설치했습니다'; +$lang['msg_plugin_update_success'] = '%s 플러그인을 성공적으로 업데이트했습니다'; +$lang['msg_upload_failed'] = '파일 올리기에 실패했습니다'; +$lang['missing_dependency'] = '의존성을 잃었거나 비활성화되어 있습니다: %s'; +$lang['security_issue'] = '보안 문제: %s'; +$lang['security_warning'] = '보안 경고: %s'; +$lang['update_available'] = '업데이트: 새 버전 %s(을)를 사용할 수 있습니다.'; +$lang['wrong_folder'] = '플러그인이 올바르지 않게 설치됨: 플러그인 디렉터리를 "%s"에서 "%s"로 이름을 바꾸세요.'; +$lang['url_change'] = 'URL이 바뀜: 다운로드 URL이 최신 다운로드 이래로 바뀌었습니다. 확장 기능을 업데이트하기 전에 새 URL이 올바른지 확인하세요.
    새 URL: %s
    오래된 URL: %s'; +$lang['error_badurl'] = 'URL은 http나 https로 시작해야 합니다'; +$lang['error_dircreate'] = '다운로드를 받을 임시 폴더를 만들 수 없습니다'; +$lang['error_download'] = '파일을 다운로드할 수 없습니다: %s'; +$lang['error_decompress'] = '다운로드한 파일의 압축을 풀 수 없습니다. 이는 아마도 잘못된 다운로드의 결과로, 이럴 경우 다시 시도해야 합니다; 또는 압축 형식을 알 수 없으며, 이럴 경우 수동으로 다운로드하고 설치해야 합니다.'; +$lang['error_findfolder'] = '확장 기능 디렉터리를 식별할 수 없습니다, 수동으로 다운로드하고 설치해야 합니다'; +$lang['error_copy'] = '%s 디렉터리에 파일을 설치하는 동안 파일 복사 오류가 발생했습니다: 디스크가 꽉 찼거나 파일 접근 권한이 잘못되었을 수도 있습니다. 플러그인이 부분적으로 설치되어 위키가 불안정할지도 모릅니다'; +$lang['noperms'] = '확장 기능 디렉터리에 쓸 수 없습니다'; +$lang['notplperms'] = '임시 디렉터리에 쓸 수 없습니다'; +$lang['nopluginperms'] = '플러그인 디렉터리에 쓸 수 없습니다'; +$lang['git'] = '이 확장 기능은 git를 통해 설치되었으며, 여기에서 업데이트할 수 없을 수 있습니다.'; +$lang['auth'] = '이 인증 플러그인은 환경 설정에서 활성화할 수 없습니다, 그것을 비활성화하는 것을 고려하세요.'; +$lang['install_url'] = 'URL에서 설치:'; +$lang['install_upload'] = '확장 기능 올리기:'; +$lang['repo_error'] = '플러그인 저장소에 연결할 수 없습니다. 서버가 www.dokuwiki.org에 연결할 수 있는지 확인하고 프록시 설정을 확인하세요.'; +$lang['nossl'] = 'PHP가 SSL 지원을 하지 않는 것으로 보입니다. 많은 도쿠위키 확장 기능의 다운로드가 작동하지 않을 것입니다.'; diff --git a/lib/plugins/extension/lang/lv/intro_templates.txt b/lib/plugins/extension/lang/lv/intro_templates.txt new file mode 100644 index 0000000..1014c7c --- /dev/null +++ b/lib/plugins/extension/lang/lv/intro_templates.txt @@ -0,0 +1 @@ +DokuWiki ir instalēti šādi šabloni. Lietojamo šablonu var norādīt [[?do=admin&page=config|Konfigurācijas lapā]]. \ No newline at end of file diff --git a/lib/plugins/extension/lang/lv/lang.php b/lib/plugins/extension/lang/lv/lang.php new file mode 100644 index 0000000..b3e5ce0 --- /dev/null +++ b/lib/plugins/extension/lang/lv/lang.php @@ -0,0 +1,8 @@ + + */ +$lang['msg_delete_success'] = 'Papildinājums %s atinstalēts'; diff --git a/lib/plugins/extension/lang/nl/intro_install.txt b/lib/plugins/extension/lang/nl/intro_install.txt new file mode 100644 index 0000000..6a0b410 --- /dev/null +++ b/lib/plugins/extension/lang/nl/intro_install.txt @@ -0,0 +1 @@ +Hier kunt u handmatig plugins en templates installeren door deze te uploaden of door een directe download URL op te geven. \ No newline at end of file diff --git a/lib/plugins/extension/lang/nl/intro_plugins.txt b/lib/plugins/extension/lang/nl/intro_plugins.txt new file mode 100644 index 0000000..e12bdf0 --- /dev/null +++ b/lib/plugins/extension/lang/nl/intro_plugins.txt @@ -0,0 +1 @@ +Dit zijn de momenteel in uw Dokuwiki geïnstalleerde plugins. U kunt deze hier aan of uitschakelen danwel geheel deïnstalleren. Plugin updates zijn hier ook opgenomen, lees de plugin documentatie voordat u update. \ No newline at end of file diff --git a/lib/plugins/extension/lang/nl/intro_search.txt b/lib/plugins/extension/lang/nl/intro_search.txt new file mode 100644 index 0000000..0530f13 --- /dev/null +++ b/lib/plugins/extension/lang/nl/intro_search.txt @@ -0,0 +1 @@ +Deze tab verschaft u toegang tot alle [[doku>nl:plugins|plugins]] en [[doku>nl:template|templates]] vervaardigd door derden en bestemd voor Dokuwiki. Houdt er rekening mee dat indien u Plugins van derden installeert deze een **veiligheids risico ** kunnen bevatten, geadviseerd wordt om eerst te lezen [[doku>security#plugin_security|plugin security]]. diff --git a/lib/plugins/extension/lang/nl/intro_templates.txt b/lib/plugins/extension/lang/nl/intro_templates.txt new file mode 100644 index 0000000..52c96ce --- /dev/null +++ b/lib/plugins/extension/lang/nl/intro_templates.txt @@ -0,0 +1 @@ +Deze templates zijn thans in DokuWiki geïnstalleerd. U kunt een template selecteren middels [[?do=admin&page=config|Configuration Manager]] . \ No newline at end of file diff --git a/lib/plugins/extension/lang/nl/lang.php b/lib/plugins/extension/lang/nl/lang.php new file mode 100644 index 0000000..67fe36b --- /dev/null +++ b/lib/plugins/extension/lang/nl/lang.php @@ -0,0 +1,102 @@ + + * @author Rene + * @author Gerrit Uitslag + * @author Johan Vervloet + * @author Mijndert + * @author Johan Wijnker + * @author hugo smet + */ +$lang['menu'] = 'Uitbreidingen'; +$lang['tab_plugins'] = 'Geïnstalleerde Plugins'; +$lang['tab_templates'] = 'Geïnstalleerde Templates'; +$lang['tab_search'] = 'Zoek en installeer'; +$lang['tab_install'] = 'Handmatige installatie'; +$lang['notimplemented'] = 'Deze toepassing is nog niet geïnstalleerd'; +$lang['notinstalled'] = 'Deze uitbreiding is nog niet geïnstalleerd'; +$lang['alreadyenabled'] = 'Deze uitbreiding is reeds ingeschakeld'; +$lang['alreadydisabled'] = 'Deze uitbreiding is reeds uitgeschakeld'; +$lang['pluginlistsaveerror'] = 'Fout bij het opslaan van de plugin lijst'; +$lang['unknownauthor'] = 'Onbekende auteur'; +$lang['unknownversion'] = 'Onbekende versie'; +$lang['btn_info'] = 'Toon meer informatie'; +$lang['btn_update'] = 'Update'; +$lang['btn_uninstall'] = 'Deinstalleer'; +$lang['btn_enable'] = 'Schakel aan'; +$lang['btn_disable'] = 'Schakel uit'; +$lang['btn_install'] = 'Installeer'; +$lang['btn_reinstall'] = 'Her-installeer'; +$lang['js']['reallydel'] = 'Wilt u deze uitbreiding deinstalleren?'; +$lang['js']['display_viewoptions'] = 'Weergave opties:'; +$lang['js']['display_enabled'] = 'ingeschakeld'; +$lang['js']['display_disabled'] = 'uitgeschakeld'; +$lang['js']['display_updatable'] = 'update beschikbaar'; +$lang['search_for'] = 'Zoek Uitbreiding:'; +$lang['search'] = 'Zoek'; +$lang['extensionby'] = '%s by %s'; +$lang['screenshot'] = 'Schermafdruk bij %s'; +$lang['popularity'] = 'Populariteit: %s%%'; +$lang['homepage_link'] = 'Documentatie'; +$lang['bugs_features'] = 'Bugs'; +$lang['tags'] = 'Tags:'; +$lang['author_hint'] = 'Zoek uitbreidingen van deze auteur:'; +$lang['installed'] = 'Geinstalleerd:'; +$lang['downloadurl'] = 'Download URL:'; +$lang['repository'] = 'Centrale opslag:'; +$lang['unknown'] = 'onbekend'; +$lang['installed_version'] = 'Geïnstalleerde versie:'; +$lang['install_date'] = 'Uw laatste update:'; +$lang['available_version'] = 'Beschikbare versie:'; +$lang['compatible'] = 'Compatible met:'; +$lang['depends'] = 'Afhankelijk van:'; +$lang['similar'] = 'Soortgelijk:'; +$lang['conflicts'] = 'Conflicteerd met:'; +$lang['donate'] = 'Vindt u dit leuk?'; +$lang['donate_action'] = 'Koop een kop koffie voor de auteur!'; +$lang['repo_retry'] = 'Herhaal'; +$lang['provides'] = 'Zorgt voor:'; +$lang['status'] = 'Status:'; +$lang['status_installed'] = 'Geïnstalleerd'; +$lang['status_not_installed'] = 'niet geïnstalleerd '; +$lang['status_protected'] = 'beschermd'; +$lang['status_enabled'] = 'ingeschakeld'; +$lang['status_disabled'] = 'uitgeschakeld'; +$lang['status_unmodifiable'] = 'Niet wijzigbaar'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'template'; +$lang['status_bundled'] = 'Gebundeld'; +$lang['msg_enabled'] = 'Plugin %s ingeschakeld'; +$lang['msg_disabled'] = 'Plugin %s uitgeschakeld'; +$lang['msg_delete_success'] = 'Uitbreiding %s gedeinstalleerd'; +$lang['msg_delete_failed'] = 'Het deïnstalleren van de extensie %s is mislukt.'; +$lang['msg_template_install_success'] = 'Template %s werd succesvol geïnstalleerd'; +$lang['msg_template_update_success'] = 'Template %s werd succesvol geüpdatet'; +$lang['msg_plugin_install_success'] = 'Plugin %s werd succesvol geïnstalleerd'; +$lang['msg_plugin_update_success'] = 'Plugin %s werd succesvol geüpdatet'; +$lang['msg_upload_failed'] = 'Uploaden van het bestand is mislukt'; +$lang['msg_nooverwrite'] = 'Uitbreiding %s bestaat al en wordt niet overschreven; vink de optie Bestaande bestanden overschrijven aan om te overschrijven'; +$lang['missing_dependency'] = 'niet aanwezige of uitgeschakelde afhankelijkheid %s'; +$lang['security_issue'] = 'Veiligheids kwestie: %s'; +$lang['security_warning'] = 'Veiligheids Waarschuwing %s'; +$lang['update_available'] = 'Update: Nieuwe versie %s is beschikbaar.'; +$lang['wrong_folder'] = 'Plugin onjuist geïnstalleerd: Hernoem de plugin directory van "%s" naar "%s"'; +$lang['url_change'] = 'URL gewijzigd: Download URL is gewijzigd sinds de laatste download. Controleer of de nieuwe URL juist is voordat u de uitbreiding updatet.
    Nieuw:%s
    Vorig: %s'; +$lang['error_badurl'] = 'URLs moeten beginnen met http of https'; +$lang['error_dircreate'] = 'De tijdelijke map kon niet worden gemaakt om de download te ontvangen'; +$lang['error_download'] = 'Het is niet mogelijk het bestand te downloaden: %s'; +$lang['error_decompress'] = 'Onmogelijk om het gedownloade bestand uit te pakken. Dit is wellicht het gevolg van een onvolledige/onjuiste download, in welk geval u het nog eens moet proberen; of het compressie formaat is onbekend in welk geval u het bestand handmatig moet downloaden en installeren.'; +$lang['error_findfolder'] = 'Onmogelijk om de uitbreidings directory te vinden, u moet het zelf downloaden en installeren'; +$lang['error_copy'] = 'Er was een bestand kopieer fout tijdens het installeren van bestanden in directory %s: de schijf kan vol zijn of de bestand toegangs rechten kunnen onjuist zijn. Dit kan tot gevolg hebben dat de plugin slechts gedeeltelijk werd geïnstalleerd waardoor uw wiki installatie onstabiel is '; +$lang['noperms'] = 'Uitbreidings directory is niet schrijfbaar'; +$lang['notplperms'] = 'Template directory is niet schrijfbaar'; +$lang['nopluginperms'] = 'Plugin directory is niet schrijfbaar'; +$lang['git'] = 'De uitbreiding werd geïnstalleerd via git, u wilt deze hier wellicht niet aanpassen.'; +$lang['auth'] = 'Deze auth plugin is niet geactiveerd in de configuratie, overweeg het om uit te schakelen.'; +$lang['install_url'] = 'Installeer vanaf URL:'; +$lang['install_upload'] = 'Upload Uitbreiding:'; +$lang['repo_error'] = 'Er kon geen verbinding worden gemaakt met de centrale plugin opslag. Controleer of de server verbinding mag maken met www.dokuwiki.org en controleer de proxy instellingen.'; +$lang['nossl'] = 'Je PHP mist SSL ondersteuning. Downloaden werkt niet met veel DokuWiki extensies.'; diff --git a/lib/plugins/extension/lang/no/intro_install.txt b/lib/plugins/extension/lang/no/intro_install.txt new file mode 100644 index 0000000..6453cae --- /dev/null +++ b/lib/plugins/extension/lang/no/intro_install.txt @@ -0,0 +1 @@ +Her kan du manuellt installere programtillegg eller maler, enten ved å laste de opp, eller ved å skrive inn nettadressen til utvidelsen \ No newline at end of file diff --git a/lib/plugins/extension/lang/no/intro_plugins.txt b/lib/plugins/extension/lang/no/intro_plugins.txt new file mode 100644 index 0000000..e9e34d1 --- /dev/null +++ b/lib/plugins/extension/lang/no/intro_plugins.txt @@ -0,0 +1 @@ +Her finner du de programtillegg som er installert i din DokuWiki. Du kan slå av/på, eller avistallere dine programtillegg her. Oppdatering av programtillegg vil også vises her, men du bør lese dokumentasjonen for disse før du oppdaterere. \ No newline at end of file diff --git a/lib/plugins/extension/lang/no/intro_search.txt b/lib/plugins/extension/lang/no/intro_search.txt new file mode 100644 index 0000000..32af4ff --- /dev/null +++ b/lib/plugins/extension/lang/no/intro_search.txt @@ -0,0 +1 @@ +Denne fanen gir deg tillgang til alle tilgjengelige tredjeparts [[doku>plugins|programtillegg]] og [[doku>template|maler]] for DokuWiki. Merk at det å installere tillegg fra tredjepart kan innebære en **sikerhetsrisiko**. Les mer om [[doku>security#plugin_security|sikkerhet og tillegg ]] før installasjon av disse. diff --git a/lib/plugins/extension/lang/no/intro_templates.txt b/lib/plugins/extension/lang/no/intro_templates.txt new file mode 100644 index 0000000..0649620 --- /dev/null +++ b/lib/plugins/extension/lang/no/intro_templates.txt @@ -0,0 +1,2 @@ +Her finner du malene som nå er installert i denne DokuWikien. Her velger du malen som brukes i siden for [[?do=admin&page=config|konfigurasjonsinnstillinger]]. + diff --git a/lib/plugins/extension/lang/no/lang.php b/lib/plugins/extension/lang/no/lang.php new file mode 100644 index 0000000..0ceec58 --- /dev/null +++ b/lib/plugins/extension/lang/no/lang.php @@ -0,0 +1,95 @@ + + */ +$lang['menu'] = 'Utvidelsesbehandling'; +$lang['tab_plugins'] = 'Installerte programtillegg'; +$lang['tab_templates'] = 'Installerte maler'; +$lang['tab_search'] = 'Søk og installer'; +$lang['tab_install'] = 'Manuell installasjon'; +$lang['notimplemented'] = 'Denne funksjon er ikke laget ennå'; +$lang['notinstalled'] = 'Denne utvidelsen er ikke installert '; +$lang['alreadyenabled'] = 'Denne utvidelsen er allerede slått på'; +$lang['alreadydisabled'] = 'Denne utvidelsen er allerede slått av'; +$lang['pluginlistsaveerror'] = 'Det oppsto en feil ved lagring av programlisten'; +$lang['unknownauthor'] = 'Ukjent utvikler'; +$lang['unknownversion'] = 'Ukjent versjon'; +$lang['btn_info'] = 'Vis mer info'; +$lang['btn_update'] = 'Oppdater'; +$lang['btn_uninstall'] = 'Avinstaller'; +$lang['btn_enable'] = 'Slå på'; +$lang['btn_disable'] = 'Slå av'; +$lang['btn_install'] = 'Installer'; +$lang['btn_reinstall'] = 'Installer på nytt'; +$lang['js']['reallydel'] = 'Vil du virkelig avinstallere denne utvidelsen?'; +$lang['js']['display_viewoptions'] = 'Filtrer etter:'; +$lang['js']['display_enabled'] = 'slått på'; +$lang['js']['display_disabled'] = 'slått av'; +$lang['js']['display_updatable'] = 'Oppdaterbar'; +$lang['search_for'] = 'Finn programtillegg:'; +$lang['search'] = 'Søk'; +$lang['extensionby'] = '%s av %s'; +$lang['screenshot'] = 'Skjermbilde av %s'; +$lang['popularity'] = 'Popularitet: %s%%'; +$lang['homepage_link'] = 'Dok.'; +$lang['bugs_features'] = 'Feilm.'; +$lang['tags'] = 'Stikkord:'; +$lang['author_hint'] = 'Let etter programmtilleg fra denne utvikler'; +$lang['installed'] = 'Installert:'; +$lang['downloadurl'] = 'URL for nedlasting:'; +$lang['repository'] = 'Lager:'; +$lang['unknown'] = 'ukjent'; +$lang['installed_version'] = 'Installert versjon'; +$lang['install_date'] = 'Sist oppdatert:'; +$lang['available_version'] = 'Tilgengelig versjon:'; +$lang['compatible'] = 'Kompatibel med:'; +$lang['depends'] = 'Avhenger av:'; +$lang['similar'] = 'Ligner på:'; +$lang['conflicts'] = 'I konflikt med:'; +$lang['donate'] = 'Liker du denne?'; +$lang['donate_action'] = 'Kjøp en kaffe til utvikleren!'; +$lang['repo_retry'] = 'Forsøk igjen'; +$lang['provides'] = 'Tilbyr:'; +$lang['status'] = 'Status:'; +$lang['status_installed'] = 'installert'; +$lang['status_not_installed'] = 'ikke installert'; +$lang['status_protected'] = 'beskyttet'; +$lang['status_enabled'] = 'slått på '; +$lang['status_disabled'] = 'slått av'; +$lang['status_unmodifiable'] = 'ikke-modifiserbar'; +$lang['status_plugin'] = 'programtillegg'; +$lang['status_template'] = 'mal'; +$lang['status_bundled'] = 'pakke'; +$lang['msg_enabled'] = 'Programtillegg %s er slått på '; +$lang['msg_disabled'] = 'Programtillegg %s er slått av '; +$lang['msg_delete_success'] = 'Utvidelse %s ble avinstallert'; +$lang['msg_delete_failed'] = 'Avinstallering av utvidelse %s feilet'; +$lang['msg_template_install_success'] = 'Mal %s ble installert'; +$lang['msg_template_update_success'] = 'Mal %s ble oppdatert'; +$lang['msg_plugin_install_success'] = 'Programtillegg %s ble installert'; +$lang['msg_plugin_update_success'] = 'Programtillegg %s ble oppdatert'; +$lang['msg_upload_failed'] = 'Opplasting av fil feilet'; +$lang['missing_dependency'] = 'Manglende eller avslått avhengighet: %s'; +$lang['security_issue'] = 'Sikerhetsproblem: %s'; +$lang['security_warning'] = 'Sikerhetsvarsel: %s'; +$lang['update_available'] = 'Oppdater: Ny versjon %s er tilgjengelig.'; +$lang['wrong_folder'] = 'Programtillegg feil installert: Døp om mappen for programtillegg "%s" til "%s".'; +$lang['url_change'] = 'URL er endret: URL for nedlasning er blitt endret sidene siste nedlastning. Sjekk at den nye URLen er gyldig før du oppdatere utvidelsen.
    Ny: %s
    Gammel: %s'; +$lang['error_badurl'] = 'URLer bør starte med http eller https'; +$lang['error_dircreate'] = 'Klarte ikke opprette midlertidig mappe nedlasting'; +$lang['error_download'] = 'Klarte ikke laste ned filen: %s'; +$lang['error_decompress'] = 'Klarte ikke pakke ut nedlastet fil. Muligens fordi nedlastingen feilet, da bør du prøve igjen; eller så kan komprimeringsformatet være ukjent, i så fall må du laste ned og installere utvidelsen manuelt.'; +$lang['error_findfolder'] = 'Klarte ikke finne utvidelsesmappen, du må laste ned og installere manuelt'; +$lang['error_copy'] = 'Det oppsto en kopieringsfeil ved installasjon av filer i katalogen %s : disken kan være full eller filens tilgangsrettigheter kan være feil. Denne feilen kan ha resultert i en delvis installert programtillegg, og kan føre til at din wiki vil være ustabil.'; +$lang['noperms'] = 'Mappen for utvidelser er ikke skrivbar'; +$lang['notplperms'] = 'Mappen for maler er ikke skrivbar'; +$lang['nopluginperms'] = 'Mappen for programtillegg er ikke skrivbar'; +$lang['git'] = 'Denne utvidelsen ble installert via git, du vl kanskje ikke oppdatere den herfra.'; +$lang['auth'] = 'Denne autentiseringsutvidelser er i konfigurasjonsinstillingene ikke slått på. vurder å slå den av.'; +$lang['install_url'] = 'Installer fra URL:'; +$lang['install_upload'] = 'Last opp utvidelse:'; +$lang['repo_error'] = 'Lagret for programtillegg kunne ikke kontaktes. Kontroller at din server har rettigheter til å kontakte www.dokuwiki.org, sjekk også instillinger for hurtiglager (proxy).'; +$lang['nossl'] = 'DIn PHP-installasjon mangler støtte for SSL. Nedlastning vil derfor ikke virke for mange DokuWIki-utvidelser.'; diff --git a/lib/plugins/extension/lang/pl/intro_install.txt b/lib/plugins/extension/lang/pl/intro_install.txt new file mode 100644 index 0000000..338d939 --- /dev/null +++ b/lib/plugins/extension/lang/pl/intro_install.txt @@ -0,0 +1 @@ +Tutaj możesz ręcznie zainstalować wtyczki i szablony, przesyłając je lub podając bezpośredni adres URL do pobrania. \ No newline at end of file diff --git a/lib/plugins/extension/lang/pl/intro_plugins.txt b/lib/plugins/extension/lang/pl/intro_plugins.txt new file mode 100644 index 0000000..d228485 --- /dev/null +++ b/lib/plugins/extension/lang/pl/intro_plugins.txt @@ -0,0 +1 @@ +Są to wtyczki aktualnie zainstalowane w twoim DokuWiki. Możesz je tutaj włączyć lub wyłączyć, a nawet całkowicie odinstalować. Znajdziesz tu również informację o nowych wersjach. Przed aktualizacją koniecznie przeczytaj dokumentację wtyczki. \ No newline at end of file diff --git a/lib/plugins/extension/lang/pl/intro_search.txt b/lib/plugins/extension/lang/pl/intro_search.txt new file mode 100644 index 0000000..b6e497f --- /dev/null +++ b/lib/plugins/extension/lang/pl/intro_search.txt @@ -0,0 +1 @@ +W tej zakładka znajdziesz wszystkie [[doku>pl:plugins|wtyczki]] i [[doku>pl:template|szablony]] przygotowane dla DokuWiki przez osoby trzecie. Należy pamiętać, że instalacja kodu zewnętrznego może stwarzać ** zagrożenie bezpieczeństwa **. Koniecznie przeczytaj o [[doku>security#plugin_security|bezpieczeństwie wtyczek]]. diff --git a/lib/plugins/extension/lang/pl/intro_templates.txt b/lib/plugins/extension/lang/pl/intro_templates.txt new file mode 100644 index 0000000..ef90cbf --- /dev/null +++ b/lib/plugins/extension/lang/pl/intro_templates.txt @@ -0,0 +1 @@ +Są to szablony aktualnie zainstalowane w twoim DokuWiki. [[?do=admin&page=config|Menadżer konfiguracji]] pozwala wybrać używany szablon. \ No newline at end of file diff --git a/lib/plugins/extension/lang/pl/lang.php b/lib/plugins/extension/lang/pl/lang.php new file mode 100644 index 0000000..37e82cb --- /dev/null +++ b/lib/plugins/extension/lang/pl/lang.php @@ -0,0 +1,102 @@ + + * @author pavulondit + * @author Wojciech Lichota + * @author Max + * @author Mati + */ +$lang['menu'] = 'Menedżer rozszerzeń'; +$lang['tab_plugins'] = 'Zainstalowane dodatki'; +$lang['tab_templates'] = 'Zainstalowane Szablony'; +$lang['tab_search'] = 'Znajdź i zainstaluj'; +$lang['tab_install'] = 'Instalacja ręczna'; +$lang['notimplemented'] = 'Ta funkcja nie została jeszcze zaimplementowana'; +$lang['notinstalled'] = 'Te rozszerzenie nie zostało zainstalowane'; +$lang['alreadyenabled'] = 'Te rozszerzenie jest już uruchomione'; +$lang['alreadydisabled'] = 'Rozszerzenie zostało wyłączone'; +$lang['pluginlistsaveerror'] = 'Wystąpił błąd podczas zapisywania listy wtyczek'; +$lang['unknownauthor'] = 'Nieznany autor'; +$lang['unknownversion'] = 'Nieznana wersja'; +$lang['btn_info'] = 'Pokaż więcej informacji'; +$lang['btn_update'] = 'Aktualizuj'; +$lang['btn_uninstall'] = 'Odinstaluj'; +$lang['btn_enable'] = 'Uruchom'; +$lang['btn_disable'] = 'Wyłącz'; +$lang['btn_install'] = 'Instaluj'; +$lang['btn_reinstall'] = 'Ponowna instalacja'; +$lang['js']['reallydel'] = 'Naprawdę odinstalować te rozszerzenie?'; +$lang['js']['display_viewoptions'] = 'Zobacz Opcje'; +$lang['js']['display_enabled'] = 'włącz'; +$lang['js']['display_disabled'] = 'wyłącz'; +$lang['js']['display_updatable'] = 'do aktualizacji'; +$lang['search_for'] = 'Szukaj rozszerzenia:'; +$lang['search'] = 'Szukaj'; +$lang['extensionby'] = '%s przez %s'; +$lang['screenshot'] = 'Zrzut ekranu z %s'; +$lang['popularity'] = 'Popularność: %s%%'; +$lang['homepage_link'] = 'Dokumenty'; +$lang['bugs_features'] = 'Błędy'; +$lang['tags'] = 'Tagi:'; +$lang['author_hint'] = 'Szukaj rozszerzenia po autorze'; +$lang['installed'] = 'Zainstalowano:'; +$lang['downloadurl'] = 'Pobierz URL'; +$lang['repository'] = 'Repozytorium'; +$lang['unknown'] = 'nie znany'; +$lang['installed_version'] = 'Zainstalowana wersja:'; +$lang['install_date'] = 'Twoja ostatnia aktualizacja:'; +$lang['available_version'] = 'Dostępna wersja:'; +$lang['compatible'] = 'Zgodny z:'; +$lang['depends'] = 'Zależy od:'; +$lang['similar'] = 'Podobny do:'; +$lang['conflicts'] = 'Konflikt z:'; +$lang['donate'] = 'Lubisz to?'; +$lang['donate_action'] = 'Kup autorowi kawę!'; +$lang['repo_retry'] = 'Ponów'; +$lang['provides'] = 'Dostawcy:'; +$lang['status'] = 'Status:'; +$lang['status_installed'] = 'zainstalowano'; +$lang['status_not_installed'] = 'nie zainstalowano'; +$lang['status_protected'] = 'chroniony'; +$lang['status_enabled'] = 'uruchomione'; +$lang['status_disabled'] = 'wyłączone'; +$lang['status_unmodifiable'] = 'niemodyfikowalny'; +$lang['status_plugin'] = 'dodatek'; +$lang['status_template'] = 'szablon'; +$lang['status_bundled'] = 'paczka'; +$lang['msg_enabled'] = 'Dodatek %s włączony'; +$lang['msg_disabled'] = 'Dodatek %s wyłączony'; +$lang['msg_delete_success'] = 'Rozszerzenie %s odinstalowane'; +$lang['msg_delete_failed'] = 'Odinstalowywanie rozszerzenia %s nie powiodło się'; +$lang['msg_template_install_success'] = 'Szablon %s został zainstalowany'; +$lang['msg_template_update_success'] = 'Szablon %s został zaktualizowany'; +$lang['msg_plugin_install_success'] = 'Dodatek %s został zainstalowany'; +$lang['msg_plugin_update_success'] = 'Dodatek %s został zaktualizowany'; +$lang['msg_upload_failed'] = 'Ładowanie pliku nie powiodło się'; +$lang['msg_nooverwrite'] = 'Rozszerzenie %s już istnieje więc nie zostanie nadpisane; aby nadpisać zaznacz opcję nadpisz.'; +$lang['missing_dependency'] = 'Brakująca lub wyłączona zależność: %s'; +$lang['security_issue'] = 'Problemy bezpieczeństwa: %s'; +$lang['security_warning'] = 'Alert Bezpieczeństwa:%s'; +$lang['update_message'] = 'Wiadomość o aktualizacji: %s'; +$lang['update_available'] = 'Uaktualnij Nowa wersja %s jest dostępna.'; +$lang['wrong_folder'] = 'Nieprawidłowo zainstalowana wtyczka: Zmień nazwę katalogu wtyczek z "%s" na "%s".'; +$lang['url_change'] = 'URL został zmieniony:URL zmienił się od czasu ostatniego pobrania. Przed aktualizacją rozszerzenia, sprawdź czy nowy adres URL jest prawidłowy.
    Nowy: %s
    Stary: %s'; +$lang['error_badurl'] = 'URL powinien zaczynać się od http lub https'; +$lang['error_dircreate'] = 'Nie można utworzyć tymczasowego folderu pobierania '; +$lang['error_download'] = 'Nie można pobrać pliku %s'; +$lang['error_decompress'] = 'Nie można rozpakować pobranego pliku. Może to być spowodowane złym pobieraniem, w takim przypadku powinieneś spróbować ponownie; lub format kompresji może być nieznany, w takim przypadku należy ręcznie pobrać i zainstalować.'; +$lang['error_findfolder'] = 'Nie można zidentyfikować katalogu z rozszerzeniami, musisz pobrać i zainstalować ręcznie'; +$lang['error_copy'] = 'Wystąpił błąd kopiowania pliku podczas próby zainstalowania plików dla katalogu %s: dysk może być pełny lub uprawnienia dostępu do pliku mogą być niepoprawne. Mogło to spowodować częściowo zainstalowaną wtyczkę i pozostawić twoją instalację wiki niestabilną'; +$lang['noperms'] = 'Katalog z rozszerzeniami nie posiada uprawnień zapisu'; +$lang['notplperms'] = 'Katalog z szablonami nie posiada uprawnień zapisu'; +$lang['nopluginperms'] = 'Katalog z wtyczkami nie posiada uprawnień zapisu'; +$lang['git'] = 'To rozszerzenie zostało zainstalowane przez git, możesz nie chcieć go aktualizować tutaj.'; +$lang['auth'] = 'Ta wtyczka autoryzacji nie jest włączona w konfiguracji, rozważ jej wyłączenie.'; +$lang['install_url'] = 'Instaluj z URL:'; +$lang['install_upload'] = 'Załaduj Rozszerzenie '; +$lang['repo_badresponse'] = 'Repozytorium wtyczek zwróciło nieprawidłową odpowiedź.'; +$lang['repo_error'] = 'Nie można skontaktować się z repozytorium wtyczek. Upewnij się, że twój serwer może skontaktować się z www.dokuwiki.org i sprawdzić ustawienia serwera proxy.'; +$lang['nossl'] = 'Twój PHP wydaje się nie obsługiwać protokołu SSL. Pobieranie nie zadziała dla wielu rozszerzeń DokuWiki.'; diff --git a/lib/plugins/extension/lang/pt-br/intro_install.txt b/lib/plugins/extension/lang/pt-br/intro_install.txt new file mode 100644 index 0000000..08527b0 --- /dev/null +++ b/lib/plugins/extension/lang/pt-br/intro_install.txt @@ -0,0 +1 @@ +Aqui você pode instalar extensões e modelos manualmente, ou subindo eles ou submetendo uma URL de baixar diretamente. \ No newline at end of file diff --git a/lib/plugins/extension/lang/pt-br/intro_plugins.txt b/lib/plugins/extension/lang/pt-br/intro_plugins.txt new file mode 100644 index 0000000..e0a8c7f --- /dev/null +++ b/lib/plugins/extension/lang/pt-br/intro_plugins.txt @@ -0,0 +1 @@ +Estas são as extensões instaladas atualmente no seu DokuWiki. Você pode habilitar ou desabilitar ou desinstalar completamente elas aqui. Atualizações das extensões também são mostradas, certifique-se de ler a documentação da extensão antes de atualizá-la. \ No newline at end of file diff --git a/lib/plugins/extension/lang/pt-br/intro_search.txt b/lib/plugins/extension/lang/pt-br/intro_search.txt new file mode 100644 index 0000000..965ac30 --- /dev/null +++ b/lib/plugins/extension/lang/pt-br/intro_search.txt @@ -0,0 +1 @@ +Esta aba lhe dá acesso a [[doku>plugins|extensões]] e [[doku>template|modelos]] disponibilizados por terceiros para o DokuWiki. Favor ter cuidado pois instalar código de terceiros pode acarretar um **risco de segurança**, você poderia ler sobre [[doku>security#plugin_security|segurança de extensões]] primeiramente. diff --git a/lib/plugins/extension/lang/pt-br/intro_templates.txt b/lib/plugins/extension/lang/pt-br/intro_templates.txt new file mode 100644 index 0000000..aa3e07f --- /dev/null +++ b/lib/plugins/extension/lang/pt-br/intro_templates.txt @@ -0,0 +1 @@ +Estes são os modelos instalados atualmente no seu DokuWiki. Você pode selecionar o modelo a ser usado no [[?do=admin&page=config|Configuration Manager]]. \ No newline at end of file diff --git a/lib/plugins/extension/lang/pt-br/lang.php b/lib/plugins/extension/lang/pt-br/lang.php new file mode 100644 index 0000000..79cb3b0 --- /dev/null +++ b/lib/plugins/extension/lang/pt-br/lang.php @@ -0,0 +1,100 @@ + + * @author Davi Jorge + * @author Felipe Castro + * @author Hudson FAS + * @author Frederico Gonçalves Guimarães + */ +$lang['menu'] = 'Gerenciador de extensões'; +$lang['tab_plugins'] = 'Extensões instaladas'; +$lang['tab_templates'] = 'Modelos instalados'; +$lang['tab_search'] = 'Procurar e instalar'; +$lang['tab_install'] = 'Instalar manualmente'; +$lang['notimplemented'] = 'Esta função ainda não foi implementada'; +$lang['notinstalled'] = 'Esta extensão não está instalada'; +$lang['alreadyenabled'] = 'Esta extensão já foi habilitada'; +$lang['alreadydisabled'] = 'Esta extensão já foi desabilitada'; +$lang['pluginlistsaveerror'] = 'Houve um erro ao salvar a lista de extensões'; +$lang['unknownauthor'] = 'Autor desconhecido'; +$lang['unknownversion'] = 'Versão desconhecida'; +$lang['btn_info'] = 'Mostrar mais informações'; +$lang['btn_update'] = 'Atualizar'; +$lang['btn_uninstall'] = 'Desinstalar'; +$lang['btn_enable'] = 'Habilitar'; +$lang['btn_disable'] = 'Desabilitar'; +$lang['btn_install'] = 'Instalar'; +$lang['btn_reinstall'] = 'Re-instalar'; +$lang['js']['reallydel'] = 'Quer mesmo desinstalar esta extensão?'; +$lang['js']['display_viewoptions'] = 'Opções de visualização:'; +$lang['js']['display_enabled'] = 'habilitado'; +$lang['js']['display_disabled'] = 'desabilitado'; +$lang['js']['display_updatable'] = 'atualizável'; +$lang['search_for'] = 'Procurar extensão:'; +$lang['search'] = 'Procurar'; +$lang['extensionby'] = '%s de %s'; +$lang['screenshot'] = 'Tela congelada de %s'; +$lang['popularity'] = 'Popularidade: %s%%'; +$lang['homepage_link'] = 'Docs'; +$lang['bugs_features'] = 'Erros'; +$lang['tags'] = 'Etiquetas:'; +$lang['author_hint'] = 'Procurar extensões deste autor'; +$lang['installed'] = 'Instalado:'; +$lang['downloadurl'] = 'URL para baixar:'; +$lang['repository'] = 'Repositório:'; +$lang['unknown'] = 'desconhecido'; +$lang['installed_version'] = 'Versão instalada:'; +$lang['install_date'] = 'Sua última atualização:'; +$lang['available_version'] = 'Versão disponível:'; +$lang['compatible'] = 'Compatível com:'; +$lang['depends'] = 'Depende de:'; +$lang['similar'] = 'Similar a:'; +$lang['conflicts'] = 'Colide com:'; +$lang['donate'] = 'Gostou deste?'; +$lang['donate_action'] = 'Pague um café ao autor!'; +$lang['repo_retry'] = 'Tentar de novo'; +$lang['provides'] = 'Disponibiliza:'; +$lang['status'] = 'Estado:'; +$lang['status_installed'] = 'instalado'; +$lang['status_not_installed'] = 'não instalado'; +$lang['status_protected'] = 'protegido'; +$lang['status_enabled'] = 'habilitado'; +$lang['status_disabled'] = 'desabilitado'; +$lang['status_unmodifiable'] = 'não modificável'; +$lang['status_plugin'] = 'extensão'; +$lang['status_template'] = 'modelo'; +$lang['status_bundled'] = 'agrupado'; +$lang['msg_enabled'] = 'Extensão %s habilitada'; +$lang['msg_disabled'] = 'Extensão %s desabilitada'; +$lang['msg_delete_success'] = 'Extensão %s desinstalada'; +$lang['msg_delete_failed'] = 'Falha na desinstalação da extensão %s'; +$lang['msg_template_install_success'] = 'Modelo %s instalado com sucesso'; +$lang['msg_template_update_success'] = 'Modelo %s atualizado com sucesso'; +$lang['msg_plugin_install_success'] = 'Extensão %s instalada com sucesso'; +$lang['msg_plugin_update_success'] = 'Extensão %s atualizada com sucesso'; +$lang['msg_upload_failed'] = 'Subida do arquivo falhou'; +$lang['msg_nooverwrite'] = 'A extensão %s já existe e, portanto, não está sendo substituída; para substituir, marque a opção de substituição'; +$lang['missing_dependency'] = 'Dependência faltante ou desabilitada: %s'; +$lang['security_issue'] = 'Problema com segurança: %s'; +$lang['security_warning'] = 'Aviso sobre segurança: %s'; +$lang['update_available'] = 'Atualização: Nova versão %s está disponível.'; +$lang['wrong_folder'] = 'Extensão instalada incorretamente: Renomeie o diretório de extensões "%s" para "%s".'; +$lang['url_change'] = 'URL mudou: A URL para baixar mudou desde a última baixada. Verifique se a nova URL é válida antes de atualizar a extensão.
    Novo: %s
    Velho: %s'; +$lang['error_badurl'] = 'O URL deve começar com http ou https'; +$lang['error_dircreate'] = 'Impossível criar pasta temporária para receber o download'; +$lang['error_download'] = 'Impossável baixar o arquivo: %s'; +$lang['error_decompress'] = 'Impossável descompimir o arquivo baixado. Isso pode ser resultado de um download ruim que neste caso pode ser tentado novamente; ou o formato da compressão pode ser desconhecido, neste caso baixe e instale manualmente.'; +$lang['error_findfolder'] = 'Impossíl identificar a extensão do diretório, você deve baixar e instalar manualmente.'; +$lang['error_copy'] = 'Houve um erro de cópia de arquivo durante a tentativa de instalar os arquivos para o diretório %s : o disco pode estar cheio ou as permissões de acesso ao arquivo podem estar incorreta. Isso pode ter resultado em um plugin parcialmente instalado e deixar a sua instalação wiki instável'; +$lang['noperms'] = 'Diretório de extensão não é gravável'; +$lang['notplperms'] = 'Diretório de modelo (Template) não é gravável'; +$lang['nopluginperms'] = 'Diretório de plugin não é gravável'; +$lang['git'] = 'A extensão foi instalada via git, você talvez não queira atualizá-lo aqui.'; +$lang['auth'] = 'O plugin auth não está ativado na configuração, considere desativá-lo.'; +$lang['install_url'] = 'Instale a partir do URL:'; +$lang['install_upload'] = 'Publicar Extensão:'; +$lang['repo_error'] = 'O repositório de plugin não pode ser contactado. Certifique-se de que o servidor pode acessar www.dokuwiki.org e confira suas configurações de proxy.'; +$lang['nossl'] = 'Sua instalação PHP parece que não suporta SSL. Algumas extensões DokuWiki não serão baixadas.'; diff --git a/lib/plugins/extension/lang/pt/intro_install.txt b/lib/plugins/extension/lang/pt/intro_install.txt new file mode 100644 index 0000000..049cc8c --- /dev/null +++ b/lib/plugins/extension/lang/pt/intro_install.txt @@ -0,0 +1 @@ +Aqui você pode instalar manualmente plugins e modelos enviando-os ou fornecendo uma URL de download direto. \ No newline at end of file diff --git a/lib/plugins/extension/lang/pt/intro_plugins.txt b/lib/plugins/extension/lang/pt/intro_plugins.txt new file mode 100644 index 0000000..a789250 --- /dev/null +++ b/lib/plugins/extension/lang/pt/intro_plugins.txt @@ -0,0 +1 @@ +Estes são os plugins instalados atualmente em seu DokuWiki. Você pode ativar, desativar ou desinstalá-los completamente aqui. Atualizações de plugins também são mostradas aqui, não se esqueça de ler a documentação do plug-in antes de atualizar. \ No newline at end of file diff --git a/lib/plugins/extension/lang/pt/intro_search.txt b/lib/plugins/extension/lang/pt/intro_search.txt new file mode 100644 index 0000000..565f5b7 --- /dev/null +++ b/lib/plugins/extension/lang/pt/intro_search.txt @@ -0,0 +1 @@ +Esta aba lhe dá acesso a todos os [[doku>plugins|plugins]] e [[doku>template|modelos]] de terceiros disponíveis para o DokuWiki. Esteja ciente de que a instalação de componentes de terceiros pode representar um **risco de segurança**. Você pode querer ler sobre [[doku>segurança#plugin_security|segurança de plug-ins]] antes de realizar a instalação de módulos. diff --git a/lib/plugins/extension/lang/pt/intro_templates.txt b/lib/plugins/extension/lang/pt/intro_templates.txt new file mode 100644 index 0000000..405141a --- /dev/null +++ b/lib/plugins/extension/lang/pt/intro_templates.txt @@ -0,0 +1 @@ +Estes são os modelos atualmente instalados em seu DokuWiki. Você pode selecionar o modelo a ser usado no [[?do=admin&page=config|Gerenciador de Configuração]]. diff --git a/lib/plugins/extension/lang/pt/lang.php b/lib/plugins/extension/lang/pt/lang.php new file mode 100644 index 0000000..82d020f --- /dev/null +++ b/lib/plugins/extension/lang/pt/lang.php @@ -0,0 +1,149 @@ + + * @author Rafael Fernandes + * @author Eduardo Mozart de Oliveira + * @author Gustavo B. Schenkel + * @author Paulo + * @author Mario AlexandTeixeira dos Santos + * @author Maykon Oliveira + * @author José Vieira + * @author Guido Salatino + * @author Romulo Pereira + * @author Paulo Carmino + * @author Alfredo Silva + * @author Guilherme Sá + */ +$lang['menu'] = 'Gerenciador de Extensões'; +$lang['tab_plugins'] = 'Plugins Instalados'; +$lang['tab_templates'] = 'Modelos Instalados'; +$lang['tab_search'] = 'Pesquisar e Instalar'; +$lang['tab_install'] = 'Instalação Manual'; +$lang['notimplemented'] = 'Este recurso não foi implementado ainda'; +$lang['notinstalled'] = 'Esta extensão não está instalada'; +$lang['alreadyenabled'] = 'Esta extensão já foi ativada'; +$lang['alreadydisabled'] = 'Esta extensão já foi desativada'; +$lang['pluginlistsaveerror'] = 'Houve um erro ao salvar a lista de plugins'; +$lang['unknownauthor'] = 'Autor desconhecido'; +$lang['unknownversion'] = 'Versão desconhecida'; +$lang['btn_info'] = 'Mostrar mais informações'; +$lang['btn_update'] = 'Atualizar'; +$lang['btn_uninstall'] = 'Desinstalar'; +$lang['btn_enable'] = 'Ativar'; +$lang['btn_disable'] = 'Desativar'; +$lang['btn_install'] = 'Instalar'; +$lang['btn_reinstall'] = 'Reinstalar'; +$lang['js']['reallydel'] = 'Confirma a desinstalação desta extensão?'; +$lang['js']['display_viewoptions'] = 'Opções de Visualização:'; +$lang['js']['display_enabled'] = 'ativado'; +$lang['js']['display_disabled'] = 'desativado'; +$lang['js']['display_updatable'] = 'atualizável'; +$lang['search_for'] = 'Pesquisar Extensão:'; +$lang['search'] = 'Pesquisar'; +$lang['extensionby'] = '%s by %s'; +$lang['screenshot'] = 'Screenshot de %s'; +$lang['popularity'] = 'Popularidade: %s%%'; +$lang['homepage_link'] = 'Documentos'; +$lang['bugs_features'] = 'Erros'; +$lang['tags'] = 'Rótulos:'; +$lang['author_hint'] = 'Pesquisar extensões deste autor'; +$lang['installed'] = 'Instalado: +'; +$lang['downloadurl'] = 'Baixar URL: +'; +$lang['repository'] = 'Repositório: +'; +$lang['unknown'] = 'desconhecido +'; +$lang['installed_version'] = 'Versão instalada:'; +$lang['install_date'] = 'Sua última atualização:'; +$lang['available_version'] = 'Versão disponível: +'; +$lang['compatible'] = 'Compatível com:'; +$lang['depends'] = 'Depende de: +'; +$lang['similar'] = 'Semelhante a: +'; +$lang['conflicts'] = 'Conflita com: +'; +$lang['donate'] = 'Assim? +'; +$lang['donate_action'] = 'Pague um café para o autor!'; +$lang['repo_retry'] = 'Tentar novamente +'; +$lang['provides'] = 'Fornece: +'; +$lang['status'] = 'Status: +'; +$lang['status_installed'] = 'instalado +'; +$lang['status_not_installed'] = 'não instalado +'; +$lang['status_protected'] = 'protegido +'; +$lang['status_enabled'] = 'ativado'; +$lang['status_disabled'] = 'desativado'; +$lang['status_unmodifiable'] = 'inalterável'; +$lang['status_plugin'] = 'plugin +'; +$lang['status_template'] = 'modelo +'; +$lang['status_bundled'] = 'empacotado +'; +$lang['msg_enabled'] = 'Plugin %s ativado +'; +$lang['msg_disabled'] = 'Plugin %s desativado'; +$lang['msg_delete_success'] = 'Extensão %s desinstalada'; +$lang['msg_delete_failed'] = 'A desinstalação da Extensão %s falhou +'; +$lang['msg_template_install_success'] = 'Modelo %s instalado com sucesso'; +$lang['msg_template_update_success'] = 'Modelo %s atualizado com sucesso +'; +$lang['msg_plugin_install_success'] = 'Plugin %s instalado com sucesso +'; +$lang['msg_plugin_update_success'] = 'Plugin %s atualizado com sucesso +'; +$lang['msg_upload_failed'] = 'O envio do arquivo falhou +'; +$lang['msg_nooverwrite'] = 'A extensão %s já existe e não será substituída. Para substituir, marque a opção de substituição'; +$lang['missing_dependency'] = 'dependência ausente ou desabilitada: %s +'; +$lang['security_issue'] = 'Questão de Segurança: %s +'; +$lang['security_warning'] = 'Aviso de Segurança: %s'; +$lang['update_available'] = 'Atualização: Nova versão %s está disponível. +'; +$lang['wrong_folder'] = 'Plugin instalado incorretamente: Renomear pasta de plugins de "%s" para "%s". +'; +$lang['url_change'] = 'A URL mudou: A URL para download mudou desde o último download. Verifique se a nova URL é válida antes de atualizar a extensão
    Nova:%s
    Antiga:%s +'; +$lang['error_badurl'] = 'URLs deve começar com http ou https +'; +$lang['error_dircreate'] = 'Não é possível criar pasta temporária para receber o download +'; +$lang['error_download'] = 'Não é possível baixar o arquivo:%s +'; +$lang['error_decompress'] = 'Não é possível descompactar o arquivo baixado. Talvez seja resultado de um download ruim e nesse caso você deve tentar novamente; ou o formato de compressão pode ser desconhecido e nesse caso, você precisará baixar e instalar manualmente.'; +$lang['error_findfolder'] = 'Não foi possível identificar diretório de extensão, você precisa baixar e instalar manualmente +'; +$lang['error_copy'] = 'Houve um erro na cópia do arquivo durante a tentativa de instalar os arquivos para o diretório %s: o disco pode estar cheio ou as permissões de acesso incorretas. Isso pode ter resultado em um plugin parcialmente instalado e tornar instável seu wiki +'; +$lang['noperms'] = 'Diretório da extensão não é gravável +'; +$lang['notplperms'] = 'Diretório do modelo não é gravável +'; +$lang['nopluginperms'] = 'Diretório do plugin não é gravável +'; +$lang['git'] = 'Esta extensão foi instalada via git, você pode não querer atualizá-la aqui. +'; +$lang['auth'] = 'Este plugin não está ativado na configuração, considere desativá-lo.'; +$lang['install_url'] = 'Instalar a partir da URL:'; +$lang['install_upload'] = 'Enviar Extensão:'; +$lang['repo_badresponse'] = 'O repositório de plugin retornou uma mensagem inválida.'; +$lang['repo_error'] = 'O repositório do plugin não pôde ser contactado. Verifique se o seu servidor está autorizado a conectar com www.dokuwiki.org e verifique as configurações de proxy do servidor. +'; +$lang['nossl'] = 'Seu PHP parece que perdeu o suporte a SSL. O download não vai funcionar para muitas extensões DokuWiki. +'; diff --git a/lib/plugins/extension/lang/ru/intro_install.txt b/lib/plugins/extension/lang/ru/intro_install.txt new file mode 100644 index 0000000..94382db --- /dev/null +++ b/lib/plugins/extension/lang/ru/intro_install.txt @@ -0,0 +1 @@ +Здесь вы можете самостоятельно установить плагины и шаблоны, загрузив их или указав прямую (direct) ссылку для скачивания. \ No newline at end of file diff --git a/lib/plugins/extension/lang/ru/intro_plugins.txt b/lib/plugins/extension/lang/ru/intro_plugins.txt new file mode 100644 index 0000000..96d1742 --- /dev/null +++ b/lib/plugins/extension/lang/ru/intro_plugins.txt @@ -0,0 +1 @@ +Плагины, установленные в вашей «Докувики». Здесь вы можете их включить/отключить или даже полностью удалить. Также здесь показываются обновления плагинов; обязательно прочтите документацию плагина перед обновлением. \ No newline at end of file diff --git a/lib/plugins/extension/lang/ru/intro_search.txt b/lib/plugins/extension/lang/ru/intro_search.txt new file mode 100644 index 0000000..c60bfdc --- /dev/null +++ b/lib/plugins/extension/lang/ru/intro_search.txt @@ -0,0 +1 @@ +Вкладка даёт вам доступ ко всем имеющимся сторонним [[doku>ru:plugins|плагинам]] и [[doku>ru:template|шаблонам]] для «Докувики». Имейте в виду, что установка стороннего кода может представлять **угрозу безопасности**. Возможно, вам нужно сперва прочитать о [[doku>security#plugin_security|безопасности плагинов]]. diff --git a/lib/plugins/extension/lang/ru/intro_templates.txt b/lib/plugins/extension/lang/ru/intro_templates.txt new file mode 100644 index 0000000..a71ad67 --- /dev/null +++ b/lib/plugins/extension/lang/ru/intro_templates.txt @@ -0,0 +1 @@ +Шаблоны (темы оформления), установленные в вашей «Докувики». Шаблон, который нужно использовать, выбирается в [[?do=admin&page=config|настройках вики]] \ No newline at end of file diff --git a/lib/plugins/extension/lang/ru/lang.php b/lib/plugins/extension/lang/ru/lang.php new file mode 100644 index 0000000..4be05f7 --- /dev/null +++ b/lib/plugins/extension/lang/ru/lang.php @@ -0,0 +1,106 @@ + + * @author Impeck + * @author Aleksandr Selivanov + * @author Анатолий + * @author Igor Degraf + * @author Type-kun + * @author Vitaly Filatenko + * @author Alex P + * @author Takumo <9206984@mail.ru> + */ +$lang['menu'] = 'Управление дополнениями'; +$lang['tab_plugins'] = 'Установленные плагины'; +$lang['tab_templates'] = 'Установленные шаблоны'; +$lang['tab_search'] = 'Поиск и установка'; +$lang['tab_install'] = 'Ручная установка'; +$lang['notimplemented'] = 'Эта возможность ещё не реализована'; +$lang['notinstalled'] = 'Это дополнение не установлено'; +$lang['alreadyenabled'] = 'Это дополнение уже включено'; +$lang['alreadydisabled'] = 'Это дополнение уже отключено'; +$lang['pluginlistsaveerror'] = 'Ошибка при сохранении списка плагинов'; +$lang['unknownauthor'] = 'Автор неизвестен'; +$lang['unknownversion'] = 'Версия неизвестна'; +$lang['btn_info'] = 'Подробнее'; +$lang['btn_update'] = 'Обновить'; +$lang['btn_uninstall'] = 'Удалить'; +$lang['btn_enable'] = 'Включить'; +$lang['btn_disable'] = 'Отключить'; +$lang['btn_install'] = 'Установить'; +$lang['btn_reinstall'] = 'Переустановить'; +$lang['js']['reallydel'] = 'Действительно удалить это дополнение?'; +$lang['js']['display_viewoptions'] = 'Показать как:'; +$lang['js']['display_enabled'] = 'включён'; +$lang['js']['display_disabled'] = 'отключён'; +$lang['js']['display_updatable'] = 'обновление'; +$lang['search_for'] = 'Поиск дополнения'; +$lang['search'] = 'Найти'; +$lang['extensionby'] = '%s %s'; +$lang['screenshot'] = 'Скриншот: %s'; +$lang['popularity'] = 'Популярность: %s%%'; +$lang['homepage_link'] = 'Описание'; +$lang['bugs_features'] = 'Баг-трекер'; +$lang['tags'] = 'Метки:'; +$lang['author_hint'] = 'Найти дополнения этого автора'; +$lang['installed'] = 'Установлен'; +$lang['downloadurl'] = 'URL скачивания'; +$lang['repository'] = 'Репозиторий'; +$lang['unknown'] = 'неизвестно'; +$lang['installed_version'] = 'Версия'; +$lang['install_date'] = 'Обновлено'; +$lang['available_version'] = 'Доступная версия'; +$lang['compatible'] = 'Совместимость'; +$lang['depends'] = 'Зависит от'; +$lang['similar'] = 'Похож на'; +$lang['conflicts'] = 'Конфликтует с'; +$lang['donate'] = 'Нравится?'; +$lang['donate_action'] = 'Купить автору кофе!'; +$lang['repo_retry'] = 'Повторить'; +$lang['provides'] = 'Предоставляет'; +$lang['status'] = 'Статус'; +$lang['status_installed'] = 'установлен'; +$lang['status_not_installed'] = 'не установлен'; +$lang['status_protected'] = 'защищён'; +$lang['status_enabled'] = 'включён'; +$lang['status_disabled'] = 'отключён'; +$lang['status_unmodifiable'] = 'неизменяем'; +$lang['status_plugin'] = 'плагин'; +$lang['status_template'] = 'шаблон'; +$lang['status_bundled'] = 'в комплекте'; +$lang['msg_enabled'] = 'Плагин %s включён'; +$lang['msg_disabled'] = 'Плагин %s отключён'; +$lang['msg_delete_success'] = 'Дополнение %s удалено'; +$lang['msg_delete_failed'] = 'Не удалось удалить дополнение %s'; +$lang['msg_template_install_success'] = 'Шаблон %s успешно установлен'; +$lang['msg_template_update_success'] = 'Шаблон %s успешно обновлён'; +$lang['msg_plugin_install_success'] = 'Плагин %s успешно установлен'; +$lang['msg_plugin_update_success'] = 'Плагин %s успешно обновлён'; +$lang['msg_upload_failed'] = 'Не удалось загрузить файл'; +$lang['msg_nooverwrite'] = 'Расширение %s уже существует, поэтому оно не перезаписано; для перезаписи отметьте опцию перезаписи'; +$lang['missing_dependency'] = 'Отсутствует или отключена зависимость: %s'; +$lang['security_issue'] = 'Проблема безопасности: %s'; +$lang['security_warning'] = 'Предупреждение безопасности: %s'; +$lang['update_message'] = 'Сообщение об обновлении: %s'; +$lang['update_available'] = 'Обновление: доступна новая версия %s'; +$lang['wrong_folder'] = 'Плагин установлен неправильно: переименуйте директорию плагина из %s в %s'; +$lang['url_change'] = 'Ссылка изменилась: ссылка для загрузки изменилась с прошлого раза. Проверьте новую ссылку прежде, чем обновлять дополнение.
    Новая: %s
    Старая: %s'; +$lang['error_badurl'] = 'Ссылка должна начинаться с http или https'; +$lang['error_dircreate'] = 'Не удалось создать временную директорию для загрузки'; +$lang['error_download'] = 'Не удалось загрузить файл: %s'; +$lang['error_decompress'] = 'Не удалось распаковать загруженный файл. Возможно, файл был повреждён при загрузке — тогда нужно попробовать ещё раз. Либо неизвестен формат архива — тогда загрузку и установку надо произвести вручную'; +$lang['error_findfolder'] = 'Не удалось определить директорию для дополнения, загрузку и установку надо произвести вручную.'; +$lang['error_copy'] = 'Возникла ошибка копирования файлов в директорию %s: возможно, диск переполнен, или неверно выставлены права доступа. Это могло привести к неполной установке плагина и нарушить работу вашей вики.'; +$lang['noperms'] = 'Директория для дополнений недоступна для записи'; +$lang['notplperms'] = 'Директория для шаблонов недоступна для записи'; +$lang['nopluginperms'] = 'Директория для плагинов недоступна для записи'; +$lang['git'] = 'Это дополнение было установлено через git. Вы не можете обновить его тут.'; +$lang['auth'] = 'Этот auth-плагин не включён в конфигурации, подумайте об его отключении'; +$lang['install_url'] = 'Установить с адреса'; +$lang['install_upload'] = 'Загрузить дополнение'; +$lang['repo_badresponse'] = 'Репозиторий плагинов вернул недопустимый ответ.'; +$lang['repo_error'] = 'Репозиторий плагина недоступен. Убедитесь, что у вашей вики есть доступ к www.dokuwiki.org, а также проверьте настройки соединения прокси.'; +$lang['nossl'] = 'Ваша конфигурация PHP не имеет поддержки SSL. Это нарушит скачивание для многих дополнений.'; diff --git a/lib/plugins/extension/lang/sk/intro_install.txt b/lib/plugins/extension/lang/sk/intro_install.txt new file mode 100644 index 0000000..bfff6a4 --- /dev/null +++ b/lib/plugins/extension/lang/sk/intro_install.txt @@ -0,0 +1 @@ +Tu môžete manuálne nainštalovať rozšírenia a témy. Buď ich nahráte, alebo zadáte priamu adresu na stiahnutie. diff --git a/lib/plugins/extension/lang/sk/intro_plugins.txt b/lib/plugins/extension/lang/sk/intro_plugins.txt new file mode 100644 index 0000000..381341b --- /dev/null +++ b/lib/plugins/extension/lang/sk/intro_plugins.txt @@ -0,0 +1 @@ +Toto sú aktuálne nainštalované rozšírenia vo Vašom systéme DokuWiki. Tu ich môžete povoliť, zakázať alebo odinštalovať. Tiež tu nájdete aj aktualizácie rozšírení. Pred aktualizovaním si prečítajte dokumentáciu rozšírenia. diff --git a/lib/plugins/extension/lang/sk/intro_search.txt b/lib/plugins/extension/lang/sk/intro_search.txt new file mode 100644 index 0000000..920193a --- /dev/null +++ b/lib/plugins/extension/lang/sk/intro_search.txt @@ -0,0 +1 @@ +Táto záložka vám dáva prístup k všetkým dostupným rozšíreniam a témam pre DokuWiki od tretích strán. Prosím, myslite na to, že inštalácia kódu od tretích strán môže predstavovať **bezpečnostné riziko**. Prečítajte si najskôr [[doku>security#plugin_security|o zabezpečení rozšírení]]. diff --git a/lib/plugins/extension/lang/sk/intro_templates.txt b/lib/plugins/extension/lang/sk/intro_templates.txt new file mode 100644 index 0000000..ca1c4ed --- /dev/null +++ b/lib/plugins/extension/lang/sk/intro_templates.txt @@ -0,0 +1 @@ +Toto sú aktuálne nainštalované témy vo Vašom systéme DokuWiki. Tému, ktorú chcete použiť, môžete vybrať v [[?do=admin&page=config|Nastavení konfigurácie]]. diff --git a/lib/plugins/extension/lang/sk/lang.php b/lib/plugins/extension/lang/sk/lang.php new file mode 100644 index 0000000..c316b01 --- /dev/null +++ b/lib/plugins/extension/lang/sk/lang.php @@ -0,0 +1,99 @@ + + * @author Tibor Repček + */ +$lang['menu'] = 'Správca rozšírení'; +$lang['tab_plugins'] = 'Inštalované rozšírenia'; +$lang['tab_templates'] = 'Inštalované šablóny'; +$lang['tab_search'] = 'Hľadanie a inštalácia'; +$lang['tab_install'] = 'Manuálna inštalácia'; +$lang['notimplemented'] = 'Táto vlastnosť ešte nebola implementovaná'; +$lang['notinstalled'] = 'Toto rozšírenie nie je nainštalované'; +$lang['alreadyenabled'] = 'Toto rozšírenie už bolo povolené'; +$lang['alreadydisabled'] = 'Toto rozšírenie už bolo zakázané'; +$lang['pluginlistsaveerror'] = 'Pri ukladaní zoznamu rozšírení sa vyskytla chyba'; +$lang['unknownauthor'] = 'Neznámy autor'; +$lang['unknownversion'] = 'Neznáma verzia'; +$lang['btn_info'] = 'Viac informácií'; +$lang['btn_update'] = 'Aktualizácia'; +$lang['btn_uninstall'] = 'Odinštalovanie'; +$lang['btn_enable'] = 'Povolenie'; +$lang['btn_disable'] = 'Zablokovanie'; +$lang['btn_install'] = 'Inštalácia'; +$lang['btn_reinstall'] = 'Re-Inštalácia'; +$lang['js']['reallydel'] = 'Naozaj chcete toto rozšírenie odinštalovať?'; +$lang['js']['display_viewoptions'] = 'Zobraziť možnosti:'; +$lang['js']['display_enabled'] = 'povolené'; +$lang['js']['display_disabled'] = 'zakázané'; +$lang['js']['display_updatable'] = 'aktualizovateľné'; +$lang['search_for'] = 'Hľadať rozšírenie:'; +$lang['search'] = 'Vyhľadávanie'; +$lang['extensionby'] = '%s od %s'; +$lang['screenshot'] = 'Obrázok od %s'; +$lang['popularity'] = 'Popularita: %s%%'; +$lang['homepage_link'] = 'Dokumentácia'; +$lang['bugs_features'] = 'Chyby:'; +$lang['tags'] = 'Kľúčové slová:'; +$lang['author_hint'] = 'Hľadať rozšírenia podľa autora'; +$lang['installed'] = 'Nainštalované:'; +$lang['downloadurl'] = 'Stiahnuť z:'; +$lang['repository'] = 'Repozitár:'; +$lang['unknown'] = 'neznámy'; +$lang['installed_version'] = 'Inštalovaná verzia:'; +$lang['install_date'] = 'Posledná aktualizácia:'; +$lang['available_version'] = 'Dostupné verzie:'; +$lang['compatible'] = 'Kompaktibilita:'; +$lang['depends'] = 'Závislé na:'; +$lang['similar'] = 'Podobné:'; +$lang['conflicts'] = 'V konflikte:'; +$lang['donate'] = 'Páči sa Vám?'; +$lang['donate_action'] = 'Kúpte autorovi kávu!'; +$lang['repo_retry'] = 'Znovu skúsiť'; +$lang['provides'] = 'Poskytuje:'; +$lang['status'] = 'Stav:'; +$lang['status_installed'] = 'inštalovaný'; +$lang['status_not_installed'] = 'neinštalovaný'; +$lang['status_protected'] = 'chránený'; +$lang['status_enabled'] = 'povolený'; +$lang['status_disabled'] = 'nepovolený'; +$lang['status_unmodifiable'] = 'nezmeniteľný'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'šablóna'; +$lang['status_bundled'] = 'vstavaný'; +$lang['msg_enabled'] = 'Plugin %s povolený'; +$lang['msg_disabled'] = 'Plugin %s nepovolený'; +$lang['msg_delete_success'] = 'Rozšírenie %s odinštalované'; +$lang['msg_delete_failed'] = 'Odinštalovanie rozšírenia %s sa nepodarilo'; +$lang['msg_template_install_success'] = 'Šablóna %s úspešne nainštalovaná'; +$lang['msg_template_update_success'] = 'Šablóna %s úspešne aktualizovaná'; +$lang['msg_plugin_install_success'] = 'Plugin %s úspešne nainštalovaný'; +$lang['msg_plugin_update_success'] = 'Plugin %s úspešne aktualizovaný'; +$lang['msg_upload_failed'] = 'Nahrávanie súboru zlyhalo'; +$lang['msg_nooverwrite'] = 'Rozšírenie %s už existuje a nebude prepísané; aby ste ho prepísali, povoľte príslušnú voľbu'; +$lang['missing_dependency'] = 'Chýbajúca alebo nepovolená závislosť: %s'; +$lang['security_issue'] = 'Bezpečnostný problém: %s'; +$lang['security_warning'] = 'Bezpečnostné upozornenie: %s'; +$lang['update_available'] = 'Aktualizácia: Nová verzia %s.'; +$lang['wrong_folder'] = 'Plugin nesprávne nainštalovaný: Premenujte adresár s pluginom "%s" na "%s".'; +$lang['url_change'] = 'URL sa zmenila: URL na stiahnutie sa od posledného sťahovania zmenila. Pred aktualizáciou rozšírenia skontrolujte, či je nová URL správna.
    Nová: %s
    Stará: %s'; +$lang['error_badurl'] = 'URL by mali mať na začiatku http alebo https'; +$lang['error_dircreate'] = 'Nie je možné vytvoriť dočasný adresár pre uloženie sťahovaného súboru'; +$lang['error_download'] = 'Nie je možné stiahnuť súbor: %s'; +$lang['error_decompress'] = 'Nie je možné dekomprimovať stiahnutý súbor. Môže to byť dôvodom chyby sťahovania (v tom prípade to skúste znova) alebo neznámym kompresným formátom (v tom prípade musíte stiahnuť a inštalovať manuálne).'; +$lang['error_findfolder'] = 'Nepodarilo sa identifikovať cestu rozšírenia. Rozšírenie musíte stiahnuť a inštalovať manuálne.'; +$lang['error_copy'] = 'Chyba kopírovania pri inštalácii do adresára %s: disk môže byť plný alebo nemáte potrebné prístupové oprávnenie. Dôsledkom može byť čiastočne inštalovaný plugin a nestabilná wiki inštalácia.'; +$lang['noperms'] = 'Do priečinka rozšírenia sa nedá zapisovať.'; +$lang['notplperms'] = 'Do priečinka s témou sa nedá zapisovať.'; +$lang['nopluginperms'] = 'Do priečinka s pluginom sa nedá zapisovať.'; +$lang['git'] = 'Toto rozšírenie bolo nainštalované cez git. Nemali by ste ho tu aktualizovať.'; +$lang['auth'] = 'Toto rozšírenie nie je povolené v nastaveniach. Zvážte jeho zakázanie.'; +$lang['install_url'] = 'Inštalácia z URL:'; +$lang['install_upload'] = 'Nahrať rozšírenie:'; +$lang['repo_error'] = 'Nepodarilo sa kontaktovať repozitár rozšírenia. Uistite sa, že váš server má povolené kontaktovať www.dokuwiki.org a skontrolujte nastavenia proxy.'; +$lang['nossl'] = 'Vaše PHP zrejme nepodporuje SSL. Sťahovanie nebude funkčné pre mnohé rozšírenia.'; diff --git a/lib/plugins/extension/lang/sr/intro_install.txt b/lib/plugins/extension/lang/sr/intro_install.txt new file mode 100644 index 0000000..b05dc2c --- /dev/null +++ b/lib/plugins/extension/lang/sr/intro_install.txt @@ -0,0 +1 @@ +Овде можете ручно инсталирати прикључке и шаблоне тако што ћете их отпремити или унети адресу за директно преузимање. \ No newline at end of file diff --git a/lib/plugins/extension/lang/sr/lang.php b/lib/plugins/extension/lang/sr/lang.php new file mode 100644 index 0000000..a4fc884 --- /dev/null +++ b/lib/plugins/extension/lang/sr/lang.php @@ -0,0 +1,66 @@ + + */ +$lang['menu'] = 'Управник проширења'; +$lang['tab_plugins'] = 'Инсталирани прикључци'; +$lang['tab_templates'] = 'Инсталирани шаблони'; +$lang['tab_search'] = 'Тражи и инсталирај'; +$lang['tab_install'] = 'Ручно инсталирање'; +$lang['notimplemented'] = 'Ова могућност још није израђена'; +$lang['notinstalled'] = 'Ово проширење још није инсталирано'; +$lang['alreadyenabled'] = 'Ово проширење је већ омогућено'; +$lang['alreadydisabled'] = 'Ово проширење је већ онемогућено'; +$lang['pluginlistsaveerror'] = 'Догодила се грешка приликом чувања списка прикључака'; +$lang['unknownauthor'] = 'Непознат творац'; +$lang['unknownversion'] = 'Непознато издање'; +$lang['btn_info'] = 'Прикажи још података'; +$lang['btn_update'] = 'Ажурирај'; +$lang['btn_uninstall'] = 'Деинсталирај'; +$lang['btn_enable'] = 'Омогући'; +$lang['btn_disable'] = 'Онемогући'; +$lang['btn_install'] = 'Инсталирај'; +$lang['btn_reinstall'] = 'Поново инсталирај'; +$lang['js']['reallydel'] = 'Заиста деинсталирати ово проширење?'; +$lang['js']['display_viewoptions'] = 'Опције приказа:'; +$lang['js']['display_enabled'] = 'омогућено'; +$lang['js']['display_disabled'] = 'онемогућено'; +$lang['js']['display_updatable'] = 'могуће ажурирати'; +$lang['search_for'] = 'Претражи проширење:'; +$lang['search'] = 'Претрага'; +$lang['screenshot'] = 'Снимак екрана од %s'; +$lang['popularity'] = 'Популарност: %s%%'; +$lang['homepage_link'] = 'Документа'; +$lang['bugs_features'] = 'Грешке'; +$lang['tags'] = 'Ознаке:'; +$lang['author_hint'] = 'Претражи проширења овог творца'; +$lang['installed'] = 'Инсталирано:'; +$lang['downloadurl'] = 'Адреса за преузимање:'; +$lang['repository'] = 'Ризница:'; +$lang['unknown'] = 'непознато'; +$lang['installed_version'] = 'Инсталирано издање:'; +$lang['install_date'] = 'Ваше последње ажурирање:'; +$lang['available_version'] = 'Доступно издање:'; +$lang['compatible'] = 'Подударно са:'; +$lang['depends'] = 'Зависи од:'; +$lang['similar'] = 'Слично као:'; +$lang['conflicts'] = 'У сукобу са:'; +$lang['donate'] = 'Свиђа вам се?'; +$lang['donate_action'] = 'Купите творцу шољицу кафе!'; +$lang['repo_retry'] = 'Поново покушај'; +$lang['provides'] = 'Пружа:'; +$lang['status'] = 'Стање:'; +$lang['status_installed'] = 'инсталирано'; +$lang['status_not_installed'] = 'није инсталирано'; +$lang['status_protected'] = 'заштићено'; +$lang['status_enabled'] = 'омогућено'; +$lang['status_disabled'] = 'онемогућено'; +$lang['status_unmodifiable'] = 'неизмењиво'; +$lang['status_plugin'] = 'прикључак'; +$lang['status_template'] = 'шаблон'; +$lang['status_bundled'] = 'упаковано'; +$lang['msg_enabled'] = 'Прикључак %s је омогућен'; +$lang['msg_disabled'] = 'Прикључак %s је онемогућен'; diff --git a/lib/plugins/extension/lang/sv/lang.php b/lib/plugins/extension/lang/sv/lang.php new file mode 100644 index 0000000..87bebad --- /dev/null +++ b/lib/plugins/extension/lang/sv/lang.php @@ -0,0 +1,94 @@ + + * @author Tor Härnqvist + */ +$lang['menu'] = 'Tilläggshanterare'; +$lang['tab_plugins'] = 'Installerade plugins'; +$lang['tab_templates'] = 'Installerade templat'; +$lang['tab_search'] = 'Sök och installera'; +$lang['tab_install'] = 'Manuell installation'; +$lang['notimplemented'] = 'Denna funktion har ännu inte implementerats'; +$lang['notinstalled'] = 'Tillägget är inte installerat'; +$lang['alreadyenabled'] = 'Tillägget har redan aktiverats'; +$lang['alreadydisabled'] = 'Tillägget har redan avaktiverats'; +$lang['pluginlistsaveerror'] = 'Det fanns ett error när plugin listan skulle sparas'; +$lang['unknownauthor'] = 'Okänd skapare'; +$lang['unknownversion'] = 'Okänd version'; +$lang['btn_info'] = 'Visa mer info'; +$lang['btn_update'] = 'Uppdatera'; +$lang['btn_uninstall'] = 'Avinstallera'; +$lang['btn_enable'] = 'Aktivera'; +$lang['btn_disable'] = 'Avaktivera'; +$lang['btn_install'] = 'Installera'; +$lang['btn_reinstall'] = 'Ominstallera'; +$lang['js']['reallydel'] = 'Vill du verkligen avinstallera detta tillägg?'; +$lang['js']['display_viewoptions'] = 'Visa alternativ:'; +$lang['js']['display_enabled'] = 'aktivera'; +$lang['js']['display_disabled'] = 'avaktivera'; +$lang['js']['display_updatable'] = 'möjlig att uppdatera'; +$lang['search_for'] = 'Sök Tillägg'; +$lang['search'] = 'Sök'; +$lang['extensionby'] = '%s av %s'; +$lang['screenshot'] = 'Skärmdump av %s'; +$lang['popularity'] = 'Populatitet: %s%%'; +$lang['homepage_link'] = 'Dokumentation'; +$lang['bugs_features'] = 'Buggar'; +$lang['tags'] = 'Taggar:'; +$lang['author_hint'] = 'Sök tillägg baserat på användare'; +$lang['installed'] = 'Installerat:'; +$lang['downloadurl'] = 'Nedladdningslänk:'; +$lang['repository'] = 'Förvar:'; +$lang['unknown'] = 'okänd'; +$lang['installed_version'] = 'Installerad version:'; +$lang['install_date'] = 'Din senaste uppdatering:'; +$lang['available_version'] = 'Tillgänglig version:'; +$lang['compatible'] = 'Kompatibel med:'; +$lang['depends'] = 'Beroende av:'; +$lang['similar'] = 'Liknande som:'; +$lang['conflicts'] = 'Konflikt med:'; +$lang['donate'] = 'Som denna?'; +$lang['donate_action'] = 'Köp en kaffe till skaparen'; +$lang['repo_retry'] = 'Försök igen'; +$lang['provides'] = 'Tillhandahåller:'; +$lang['status'] = 'Status:'; +$lang['status_installed'] = 'installerad'; +$lang['status_not_installed'] = 'inte installerad'; +$lang['status_protected'] = 'skyddad'; +$lang['status_enabled'] = 'aktiverad'; +$lang['status_disabled'] = 'avaktiverad'; +$lang['status_unmodifiable'] = 'ej modifierbar'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'mall'; +$lang['status_bundled'] = 'sammanslagna'; +$lang['msg_enabled'] = 'Tillägg %s aktiverat'; +$lang['msg_disabled'] = 'Tillägg %s avaktiverat'; +$lang['msg_delete_success'] = 'Tillägg %s avinstallerat'; +$lang['msg_delete_failed'] = 'Avinstallerar Tillägg %s misslyckades'; +$lang['msg_template_install_success'] = 'Templat %s installerades framgångsrikt'; +$lang['msg_template_update_success'] = 'Templat %s uppdaterades framgångsrikt'; +$lang['msg_plugin_install_success'] = 'Installation av Plugin %s lyckades'; +$lang['msg_plugin_update_success'] = 'Uppdatering av Plugin %s lyckades'; +$lang['msg_upload_failed'] = 'Uppladdning av filen misslyckades'; +$lang['msg_nooverwrite'] = 'Tillägg %s existerar redan, så det blir inte överskrivet; för att skriva över, välj "skriv över" alternativet'; +$lang['missing_dependency'] = 'Saknar eller avaktiverat beroende: %s'; +$lang['security_issue'] = 'Säkerhetsproblem: %s'; +$lang['security_warning'] = 'Säkerhetsvarning: %s'; +$lang['update_available'] = 'Uppdatering: Ny version av %s är tillgänglig.'; +$lang['wrong_folder'] = 'Plugin installerades inkorrekt: Döp om plugin mapp "%s" till "%s".'; +$lang['url_change'] = 'URL ändrad: Nedladdningslänken har ändrats sedan senaste nedladdning. Kontrollera om den nya sökvägen är giltig innan du uppdaterar tillägget.
    Ny sökväg: %s
    Gammal sökväg: %s'; +$lang['error_badurl'] = 'URL:er borde inledas med http eller https'; +$lang['error_dircreate'] = 'Kunde inte skapa temporär katalog för nedladdning'; +$lang['error_download'] = 'Kunde inte ladda ner filen: %s'; +$lang['error_findfolder'] = 'Kan inte identifiera tilläggsmapp, du måste ladda ner och installera manuellt'; +$lang['noperms'] = 'Tilläggsmapp är inte skrivbar'; +$lang['notplperms'] = 'Templatkatalogen är inte skrivbar'; +$lang['nopluginperms'] = 'Tilläggskatalogen är inte skrivbar'; +$lang['git'] = 'Tillägget installerades via git, du kanske vill uppdatera det här.'; +$lang['auth'] = 'Det här "auth" pluginet är inte aktiverat i konfigurationen, överväg att avaktivera det.'; +$lang['install_url'] = 'Installera från URL:'; +$lang['install_upload'] = 'Ladda upp tillägg:'; +$lang['nossl'] = 'Din PHP tycks sakna SSL-stöd. Nedladdning kommer inte att fungera för många DokuWiki-tillägg.'; diff --git a/lib/plugins/extension/lang/tr/lang.php b/lib/plugins/extension/lang/tr/lang.php new file mode 100644 index 0000000..bddb9e5 --- /dev/null +++ b/lib/plugins/extension/lang/tr/lang.php @@ -0,0 +1,61 @@ + + * @author Mete Cuma + */ +$lang['menu'] = 'Genişletme Yöneticisi'; +$lang['tab_plugins'] = 'Kurulmuş Eklentiler'; +$lang['tab_templates'] = 'Kurulmuş Şablonlar'; +$lang['tab_search'] = 'Ara ve Kur'; +$lang['tab_install'] = 'Elle Kurulum'; +$lang['notimplemented'] = 'Bu özellik henüz uygulamaya geçmemiştir'; +$lang['notinstalled'] = 'Bu genişletme yüklü değildir'; +$lang['alreadyenabled'] = 'Bu genişletme zaten etkinleştirilmiştir.'; +$lang['alreadydisabled'] = 'Bu genişletme zaten pasifleştirilmiştir'; +$lang['pluginlistsaveerror'] = 'Eklenti listesini kaydederken bir hata oluştu.'; +$lang['unknownauthor'] = 'Bilinmeyen yazar'; +$lang['unknownversion'] = 'Bilinmeyen sürüm'; +$lang['btn_info'] = 'Daha fazla bilgi göster'; +$lang['btn_update'] = 'Güncelle'; +$lang['btn_uninstall'] = 'Kaldır'; +$lang['btn_enable'] = 'Etkinleştir'; +$lang['btn_disable'] = 'Pasifleştir'; +$lang['btn_install'] = 'Kur'; +$lang['btn_reinstall'] = 'Yeniden kur'; +$lang['js']['reallydel'] = 'Genişletme gerçekten kaldırılsın mı?'; +$lang['search_for'] = 'Genişletme Ara:'; +$lang['search'] = 'Ara'; +$lang['extensionby'] = '%s tarafından %s'; +$lang['screenshot'] = '%s ekran görüntüsü'; +$lang['popularity'] = 'Rağbet: %s%%'; +$lang['homepage_link'] = 'Belgeler'; +$lang['bugs_features'] = 'Hatalar'; +$lang['tags'] = 'Etiketler:'; +$lang['author_hint'] = 'Bu yazarın genişletmelerini ara.'; +$lang['installed'] = 'Kurulu:'; +$lang['downloadurl'] = 'İndirme bağlantısı:'; +$lang['repository'] = 'Veri havuzu:'; +$lang['unknown'] = 'bilinmeyen'; +$lang['installed_version'] = 'Kurulu sürüm:'; +$lang['install_date'] = 'Son güncellemeniz:'; +$lang['available_version'] = 'Müsait sürüm:'; +$lang['compatible'] = 'Şununla uyumlu:'; +$lang['depends'] = 'Şuna bağımlı'; +$lang['similar'] = 'Şununla benzer'; +$lang['conflicts'] = 'Şununla çelişir:'; +$lang['donate'] = 'Beğendiniz mi?'; +$lang['donate_action'] = 'Yazara bir kahve ısmarlayın!'; +$lang['repo_retry'] = 'Yeniden dene'; +$lang['provides'] = 'Sağlar:'; +$lang['status'] = 'Durum:'; +$lang['status_installed'] = 'kurulu'; +$lang['status_not_installed'] = 'kurulu değil'; +$lang['status_protected'] = 'korunmuş'; +$lang['status_enabled'] = 'etkin'; +$lang['status_disabled'] = 'hizmet dışı'; +$lang['status_unmodifiable'] = 'değiştirilemez'; +$lang['status_plugin'] = 'eklenti'; +$lang['status_template'] = 'şablon'; diff --git a/lib/plugins/extension/lang/uk/lang.php b/lib/plugins/extension/lang/uk/lang.php new file mode 100644 index 0000000..5b44807 --- /dev/null +++ b/lib/plugins/extension/lang/uk/lang.php @@ -0,0 +1,51 @@ + + * @author Dmytro Marchenko + */ +$lang['menu'] = 'Менеджер розширень'; +$lang['tab_plugins'] = 'Встановлені плагіни'; +$lang['tab_templates'] = 'Встановлені шаблони'; +$lang['tab_search'] = 'Пошук та встановлення'; +$lang['tab_install'] = 'Встановити вручну'; +$lang['notimplemented'] = 'Ця функція ще не була реалізована'; +$lang['notinstalled'] = 'Це розширення не встановлено'; +$lang['alreadyenabled'] = 'Це розширення вже ввімкнено'; +$lang['alreadydisabled'] = 'Це розширення вже вимкнено'; +$lang['pluginlistsaveerror'] = 'Під час збереження списку плагінів сталася помилка'; +$lang['unknownauthor'] = 'Невідомий автор'; +$lang['unknownversion'] = 'Невідома версія'; +$lang['btn_info'] = 'Показати більше інформації'; +$lang['btn_update'] = 'Оновити'; +$lang['btn_uninstall'] = 'Видалити'; +$lang['btn_enable'] = 'Увімкнути'; +$lang['btn_disable'] = 'Вимкнути'; +$lang['btn_install'] = 'Встановити'; +$lang['btn_reinstall'] = 'Перевстановити'; +$lang['js']['reallydel'] = 'Дійсно видалити це розширення?'; +$lang['js']['display_viewoptions'] = 'Параметри перегляду:'; +$lang['js']['display_enabled'] = 'увімкнено'; +$lang['js']['display_disabled'] = 'вимкнено'; +$lang['js']['display_updatable'] = 'оновлюваний'; +$lang['search_for'] = 'Пошук розширень:'; +$lang['search'] = 'Пошук'; +$lang['bugs_features'] = 'Помилки'; +$lang['tags'] = 'Теги:'; +$lang['installed'] = 'Встановлено:'; +$lang['repository'] = 'Репозиторій:'; +$lang['installed_version'] = 'Встановлена версія:'; +$lang['available_version'] = 'Доступна версія:'; +$lang['compatible'] = 'Сумісний з:'; +$lang['repo_retry'] = 'Спробувати знову'; +$lang['status'] = 'Статус:'; +$lang['status_installed'] = 'Статус:'; +$lang['status_not_installed'] = 'не встановлено'; +$lang['status_protected'] = 'захищений'; +$lang['status_enabled'] = 'увімкнено'; +$lang['status_disabled'] = 'вимкнено'; +$lang['status_plugin'] = 'плагін'; +$lang['status_template'] = 'шаблон'; +$lang['install_url'] = 'Встановити з URL-адреси:'; diff --git a/lib/plugins/extension/lang/vi/intro_install.txt b/lib/plugins/extension/lang/vi/intro_install.txt new file mode 100644 index 0000000..91d6d2d --- /dev/null +++ b/lib/plugins/extension/lang/vi/intro_install.txt @@ -0,0 +1 @@ +Tại đây, bạn có thể cài đặt thủ công các plugin và chủ đề bằng cách tải chúng lên hoặc cung cấp URL tải xuống trực tiếp. \ No newline at end of file diff --git a/lib/plugins/extension/lang/vi/intro_plugins.txt b/lib/plugins/extension/lang/vi/intro_plugins.txt new file mode 100644 index 0000000..635d8b0 --- /dev/null +++ b/lib/plugins/extension/lang/vi/intro_plugins.txt @@ -0,0 +1 @@ +Đây là những plugin hiện đã được cài đặt trong DokuWiki của bạn. Bạn có thể bật hoặc tắt hoặc thậm chí gỡ cài đặt hoàn toàn chúng ở đây. Cập nhật plugin cũng được hiển thị ở đây, nhớ đọc tài liệu của plugin trước khi cập nhật. \ No newline at end of file diff --git a/lib/plugins/extension/lang/vi/intro_search.txt b/lib/plugins/extension/lang/vi/intro_search.txt new file mode 100644 index 0000000..a5183b9 --- /dev/null +++ b/lib/plugins/extension/lang/vi/intro_search.txt @@ -0,0 +1 @@ +Tab này cho phép bạn truy cập vào tất cả [[doku>plugins|plugins]] và [[doku>template|chủ đề]] có sẵn cho DokuWiki của các bên thứ 3. Xin lưu ý rằng việc cài đặt mã của bên thứ 3 có thể gây ra **rủi ro bảo mật**, bạn có thể muốn đọc về [[doku>security#plugin_security|bảo mật plugin]] trước. \ No newline at end of file diff --git a/lib/plugins/extension/lang/vi/intro_templates.txt b/lib/plugins/extension/lang/vi/intro_templates.txt new file mode 100644 index 0000000..d0a5b67 --- /dev/null +++ b/lib/plugins/extension/lang/vi/intro_templates.txt @@ -0,0 +1 @@ +Đây là những chủ đề hiện được cài đặt trong DokuWiki của bạn. Bạn có thể chọn chủ đề sử dụng trong [[?do=admin&page=config|Quản lý cấu hình]]. \ No newline at end of file diff --git a/lib/plugins/extension/lang/vi/lang.php b/lib/plugins/extension/lang/vi/lang.php new file mode 100644 index 0000000..d8fdcc9 --- /dev/null +++ b/lib/plugins/extension/lang/vi/lang.php @@ -0,0 +1,96 @@ + + */ +$lang['menu'] = 'Quản lý phần mở rộng'; +$lang['tab_plugins'] = 'Plugin đã cài đặt'; +$lang['tab_templates'] = 'Chủ đề đã cài đặt'; +$lang['tab_search'] = 'Tìm kiếm và Cài đặt'; +$lang['tab_install'] = 'Cài đặt thủ công'; +$lang['notimplemented'] = 'Tính năng này chưa được triển khai'; +$lang['notinstalled'] = 'Phần mở rộng này chưa được cài đặt'; +$lang['alreadyenabled'] = 'Phần mở rộng này đã được kích hoạt'; +$lang['alreadydisabled'] = 'Phần mở rộng này đã bị vô hiệu hóa'; +$lang['pluginlistsaveerror'] = 'Có lỗi khi lưu danh sách plugin'; +$lang['unknownauthor'] = 'Không rõ tác giả'; +$lang['unknownversion'] = 'Không rõ phiên bản'; +$lang['btn_info'] = 'Hiện thêm thông tin'; +$lang['btn_update'] = 'Cập nhật'; +$lang['btn_uninstall'] = 'Gỡ bỏ'; +$lang['btn_enable'] = 'Kích hoạt'; +$lang['btn_disable'] = 'Vô hiệu hóa'; +$lang['btn_install'] = 'Cài đặt'; +$lang['btn_reinstall'] = 'Cài đặt lại'; +$lang['js']['reallydel'] = 'Thực sự muốn gỡ cài đặt phần mở rộng này?'; +$lang['js']['display_viewoptions'] = 'Tùy chọn xem:'; +$lang['js']['display_enabled'] = 'đã kích hoạt'; +$lang['js']['display_disabled'] = 'đã vô hiệu hóa'; +$lang['js']['display_updatable'] = 'có sẫn cập nhật'; +$lang['search_for'] = 'Tìm kiếm phần mở rộng:'; +$lang['search'] = 'Tìm kiếm'; +$lang['extensionby'] = '%s bởi %s'; +$lang['screenshot'] = 'Ảnh chụp màn hình của %s'; +$lang['popularity'] = 'Độ phổ biến: %s%%'; +$lang['homepage_link'] = 'Tài liệu'; +$lang['bugs_features'] = 'Lỗi'; +$lang['tags'] = 'Thẻ'; +$lang['author_hint'] = 'Tìm kiếm phần mở rộng của tác giả này'; +$lang['installed'] = 'Đã cài đặt:'; +$lang['downloadurl'] = 'URL tải về:'; +$lang['repository'] = 'Repository:'; +$lang['unknown'] = 'không rõ'; +$lang['installed_version'] = 'Phiên bản đã cài đặt:'; +$lang['install_date'] = 'Cập nhật cuối cùng của bạn:'; +$lang['available_version'] = 'Có sẵn phiên bản:'; +$lang['compatible'] = 'Tương thích với:'; +$lang['depends'] = 'Phụ thuộc vào:'; +$lang['similar'] = 'Tương tự như:'; +$lang['conflicts'] = 'Xung đột với:'; +$lang['donate'] = 'Thích thứ này?'; +$lang['donate_action'] = 'Mua cho tác giả một ly cà phê!'; +$lang['repo_retry'] = 'Thử lại'; +$lang['provides'] = 'Cung cấp:'; +$lang['status'] = 'Trạng thái:'; +$lang['status_installed'] = 'đã cài đặt'; +$lang['status_not_installed'] = 'chưa cài đặt'; +$lang['status_protected'] = 'đã bảo vệ'; +$lang['status_enabled'] = 'đã kích hoạt'; +$lang['status_disabled'] = 'đã vô hiệu hóa'; +$lang['status_unmodifiable'] = 'không thể thay đổi'; +$lang['status_plugin'] = 'plugin'; +$lang['status_template'] = 'chủ đề'; +$lang['status_bundled'] = 'đi kèm'; +$lang['msg_enabled'] = 'Đã kích hoạt plugin %s'; +$lang['msg_disabled'] = 'Đã vô hiệu hóa plugin %s'; +$lang['msg_delete_success'] = 'Đã gỡ cài đặt phần mở rộng %s'; +$lang['msg_delete_failed'] = 'Thất bại khi gỡ cài đặt phần mở rộng %s'; +$lang['msg_template_install_success'] = 'Cài đặt thành công chủ đề %s'; +$lang['msg_template_update_success'] = 'Cập nhật thành công chủ đề %s'; +$lang['msg_plugin_install_success'] = 'Cài đặt thành công plugin %s'; +$lang['msg_plugin_update_success'] = 'Cập nhật thành công plugin %s'; +$lang['msg_upload_failed'] = 'Tải tập tin không thành công'; +$lang['msg_nooverwrite'] = 'Phần mở rộng %s đã tồn tại để không bị ghi đè; để ghi đè, đánh dấu tùy chọn ghi đè'; +$lang['missing_dependency'] = 'Thiếu hoặc đã vô hiệu hóa phần phụ thuộc: %s'; +$lang['security_issue'] = 'Vấn đề bảo mật: %s'; +$lang['security_warning'] = 'Cảnh báo bảo mật: %s'; +$lang['update_available'] = 'Cập nhật: Phiên bản mới %s hiện có sẵn.'; +$lang['wrong_folder'] = 'Plugin đã được cài đặt không đúng: Đổi tên đường dẫn plugin "%s" thành "%s".'; +$lang['url_change'] = 'URL thay đổi:URL tải xuống đã thay đổi kể từ lần tải xuống trước. Kiểm tra xem URL mới có hợp lệ không trước khi cập nhật phần mở rộng.
    Mới: %s
    Cũ: %s'; +$lang['error_badurl'] = 'URL phải bắt đầu bằng http hoặc https'; +$lang['error_dircreate'] = 'Không thể tạo thư mục tạm thời để nhận tải xuống'; +$lang['error_download'] = 'Không thể tải xuống tập tin: %s'; +$lang['error_decompress'] = 'Không thể giải nén tập tin đã tải xuống. Việc này có thể là kết quả của một tải xuống xấu, trường hợp này bạn nên thử lại; hoặc nếu định dạng nén có thể không xác định, bạn sẽ cần phải tải xuống và cài đặt thủ công.'; +$lang['error_findfolder'] = 'Không thể xác định đường dẫn phần mở rộng, bạn cần tải xuống và cài đặt thủ công'; +$lang['error_copy'] = 'Có lỗi sao chép tập tin trong khi cố gắng cài đặt tập tin cho đường dẫn %s: đĩa có thể đầy hoặc quyền truy cập tập tin có thể không chính xác. Việc này có thể đã dẫn đến plugin được cài đặt một phần và khiến cài đặt wiki của bạn không ổn định'; +$lang['noperms'] = 'Không thể ghi đường dẫn phần mở rộng'; +$lang['notplperms'] = 'Không thể ghi đường dẫn Chủ đề'; +$lang['nopluginperms'] = 'Không thể ghi đường dẫn Plugin'; +$lang['git'] = 'Phần mở rộng này đã được cài đặt qua git, bạn có thể không muốn cập nhật nó ở đây.'; +$lang['auth'] = 'Plugin xác thực này không được kích hoạt trong cấu hình, hãy xem xét đến việc vô hiệu hóa nó.'; +$lang['install_url'] = 'Cài đặt từ URL:'; +$lang['install_upload'] = 'Tải lên phần mở rộng:'; +$lang['repo_error'] = 'Không thể kết nối đến Kho lưu trữ plugin. Đảm bảo rằng máy chủ của bạn được phép kết nối với www.dokuwiki.org và kiểm tra cài đặt proxy của bạn.'; +$lang['nossl'] = 'PHP của bạn dường như bỏ lỡ hỗ trợ SSL. Tải xuống sẽ không hoạt động đối với nhiều phần mở rộng DokuWiki.'; diff --git a/lib/plugins/extension/lang/zh-tw/intro_install.txt b/lib/plugins/extension/lang/zh-tw/intro_install.txt new file mode 100644 index 0000000..3ba93f5 --- /dev/null +++ b/lib/plugins/extension/lang/zh-tw/intro_install.txt @@ -0,0 +1 @@ +在此你可以透過檔案上傳或提供下載網址的方式,進行手動安裝外掛與版型風格。 \ No newline at end of file diff --git a/lib/plugins/extension/lang/zh-tw/intro_plugins.txt b/lib/plugins/extension/lang/zh-tw/intro_plugins.txt new file mode 100644 index 0000000..b5b77a2 --- /dev/null +++ b/lib/plugins/extension/lang/zh-tw/intro_plugins.txt @@ -0,0 +1 @@ +已經有一些外掛套件被安裝在你的DokuWiki之中。你可以在這裡啟用、禁用,甚至是完全移除它們。如外掛可更新也同時會顯示在這裡,請確保在更新前先閱讀過該套件之文件。 \ No newline at end of file diff --git a/lib/plugins/extension/lang/zh-tw/lang.php b/lib/plugins/extension/lang/zh-tw/lang.php new file mode 100644 index 0000000..c8249c3 --- /dev/null +++ b/lib/plugins/extension/lang/zh-tw/lang.php @@ -0,0 +1,86 @@ + + * @author GHSRobert Ciang + * @author Stan + * @author June-Hao Hou + * @author lioujheyu + */ +$lang['menu'] = '延伸功能管理'; +$lang['tab_plugins'] = '已安裝外掛'; +$lang['tab_templates'] = '已安裝裝模版 +'; +$lang['tab_search'] = '搜尋與安裝'; +$lang['tab_install'] = '手動安裝'; +$lang['notimplemented'] = '此功能尚未完成'; +$lang['notinstalled'] = '此延伸功能尚未安裝'; +$lang['alreadyenabled'] = '此延伸功能已經安裝'; +$lang['alreadydisabled'] = '此延伸功能停用'; +$lang['unknownauthor'] = '作者未知'; +$lang['unknownversion'] = '版本未知'; +$lang['btn_info'] = '顯示更多訊息'; +$lang['btn_update'] = '更新'; +$lang['btn_uninstall'] = '移除安裝'; +$lang['btn_enable'] = '啟用'; +$lang['btn_disable'] = '停用'; +$lang['btn_install'] = '安裝'; +$lang['btn_reinstall'] = '重新安裝'; +$lang['js']['reallydel'] = '確定要移除此延伸功能?'; +$lang['js']['display_enabled'] = '啟用'; +$lang['js']['display_disabled'] = '禁用'; +$lang['js']['display_updatable'] = '可更新'; +$lang['search_for'] = '搜尋延伸功能:'; +$lang['search'] = '搜尋'; +$lang['homepage_link'] = '文件'; +$lang['tags'] = '標籤:'; +$lang['author_hint'] = '搜尋相同作者的延伸功能'; +$lang['installed'] = '已安裝:'; +$lang['downloadurl'] = '下載網址:'; +$lang['unknown'] = '未知'; +$lang['installed_version'] = '已安裝版本:'; +$lang['install_date'] = '你最後一次更新: '; +$lang['available_version'] = '可用版本:'; +$lang['compatible'] = '相容於:'; +$lang['depends'] = '依賴於: '; +$lang['similar'] = '類似於: '; +$lang['conflicts'] = '相衝突於: '; +$lang['donate'] = '像這樣?'; +$lang['donate_action'] = '請作者一杯咖啡!'; +$lang['repo_retry'] = '再試一次'; +$lang['status'] = '狀態:'; +$lang['status_installed'] = '已安裝'; +$lang['status_not_installed'] = '未安裝'; +$lang['status_protected'] = '已保護'; +$lang['status_enabled'] = '作用中'; +$lang['status_disabled'] = '停用中'; +$lang['status_unmodifiable'] = '不可更動'; +$lang['status_plugin'] = '外掛'; +$lang['status_template'] = '模板'; +$lang['status_bundled'] = '已綑綁內附'; +$lang['msg_enabled'] = '外掛 %s 已啟用'; +$lang['msg_disabled'] = '外掛 %s 已禁用'; +$lang['msg_delete_failed'] = '解除安裝 %s 失敗'; +$lang['msg_template_install_success'] = '模板 %s 已成功安裝'; +$lang['msg_template_update_success'] = '模板 %s 已成功更新'; +$lang['msg_plugin_install_success'] = '外掛 %s 已成功安裝'; +$lang['msg_plugin_update_success'] = '外掛 %s 已成功更新'; +$lang['msg_upload_failed'] = '上傳檔案失敗'; +$lang['missing_dependency'] = '遺失或禁用相依性套件: %s'; +$lang['security_issue'] = '安全性問題: %s'; +$lang['security_warning'] = '安全問題警告: %s'; +$lang['update_available'] = '更新: 已可取得 %s 的新版本'; +$lang['wrong_folder'] = '外掛安裝不正確: 將外掛資料夾從 "%s" 更名至 "%s"。'; +$lang['url_change'] = '網址已變更: 自從上次下載後下載網址已變更。在更新延伸功能前請先檢查新網址是否可用。
    新: %s
    舊: %s'; +$lang['error_dircreate'] = '無法建立暫存目錄以接收下載檔案'; +$lang['error_download'] = '無法下載檔案:%s'; +$lang['error_decompress'] = '無法解壓縮檔案。這可能是下載品質不佳所致,在這個情況下你應該再試一次;也有可能是因為無法辨識的壓縮格式,在這個情況下你應該自行下載並手動安裝'; +$lang['error_findfolder'] = '無法辨認延伸功能資料夾,你必須自行下載並手動安裝'; +$lang['noperms'] = '延伸功能資料夾無法寫入'; +$lang['notplperms'] = '版型資料夾無法寫入'; +$lang['nopluginperms'] = '外掛資料夾無法寫入'; +$lang['git'] = '此延伸功能是透過git安裝的,最好不要用上傳方式。'; +$lang['install_url'] = '透過網址安裝:'; +$lang['install_upload'] = '上傳延伸功能:'; diff --git a/lib/plugins/extension/lang/zh/intro_install.txt b/lib/plugins/extension/lang/zh/intro_install.txt new file mode 100644 index 0000000..6408393 --- /dev/null +++ b/lib/plugins/extension/lang/zh/intro_install.txt @@ -0,0 +1 @@ +你可以通过上传或直接提供下载链接来安装插件和模板。 \ No newline at end of file diff --git a/lib/plugins/extension/lang/zh/intro_plugins.txt b/lib/plugins/extension/lang/zh/intro_plugins.txt new file mode 100644 index 0000000..69cb343 --- /dev/null +++ b/lib/plugins/extension/lang/zh/intro_plugins.txt @@ -0,0 +1 @@ +这些是你当前已经安装的插件。你可以在这里启用和禁用甚至卸载它们。插件的更新信息也显示在这,请一定在更新之前阅读插件的文档。 \ No newline at end of file diff --git a/lib/plugins/extension/lang/zh/intro_search.txt b/lib/plugins/extension/lang/zh/intro_search.txt new file mode 100644 index 0000000..aa979ab --- /dev/null +++ b/lib/plugins/extension/lang/zh/intro_search.txt @@ -0,0 +1 @@ +这个标签会为你展示所有 DokuWiki 的第三方[[doku>zh:plugins|插件]]和[[doku>zh:template|模板]]。但你需要知道这些由第三方提供的代码可能会给你带来**安全方面的风险**,你最好先读一下[[doku>security#plugin_security|插件安全性]]。 diff --git a/lib/plugins/extension/lang/zh/intro_templates.txt b/lib/plugins/extension/lang/zh/intro_templates.txt new file mode 100644 index 0000000..10c1bed --- /dev/null +++ b/lib/plugins/extension/lang/zh/intro_templates.txt @@ -0,0 +1 @@ +DokuWiki 当前所使用的模板已经安装了,你可以在[[?do=admin&page=config|配置管理器]]里选择你要的模板。 \ No newline at end of file diff --git a/lib/plugins/extension/lang/zh/lang.php b/lib/plugins/extension/lang/zh/lang.php new file mode 100644 index 0000000..10eac2c --- /dev/null +++ b/lib/plugins/extension/lang/zh/lang.php @@ -0,0 +1,108 @@ + + * @author chuachua + * @author Xin + * @author lempel + * @author Cupen + * @author xiqingongzi + * @author qinghao + * @author lainme + * @author Errol + * @author phy25 + * @author fengyqf + */ +$lang['menu'] = '扩展管理器'; +$lang['tab_plugins'] = '现有插件'; +$lang['tab_templates'] = '现有模板'; +$lang['tab_search'] = '搜索安装'; +$lang['tab_install'] = '手动安装'; +$lang['notimplemented'] = '未实现的特性'; +$lang['notinstalled'] = '该扩展未安装'; +$lang['alreadyenabled'] = '该扩展已激活'; +$lang['alreadydisabled'] = '该扩展已关闭'; +$lang['pluginlistsaveerror'] = '保存插件列表时出现错误'; +$lang['unknownauthor'] = '未知作者'; +$lang['unknownversion'] = '未知版本'; +$lang['btn_info'] = '查看更多信息'; +$lang['btn_update'] = '更新'; +$lang['btn_uninstall'] = '卸载'; +$lang['btn_enable'] = '激活'; +$lang['btn_disable'] = '关闭'; +$lang['btn_install'] = '安装'; +$lang['btn_reinstall'] = '重新安装'; +$lang['js']['reallydel'] = '确定卸载这个扩展吗?'; +$lang['js']['display_viewoptions'] = '查看选项:'; +$lang['js']['display_enabled'] = '启用'; +$lang['js']['display_disabled'] = '禁用'; +$lang['js']['display_updatable'] = '可更新'; +$lang['search_for'] = '搜索扩展'; +$lang['search'] = '搜索'; +$lang['extensionby'] = '%s by %s'; +$lang['screenshot'] = '%s 的截图'; +$lang['popularity'] = '人气: %s%%'; +$lang['homepage_link'] = '文档'; +$lang['bugs_features'] = '错误'; +$lang['tags'] = '标签:'; +$lang['author_hint'] = '搜索这个作者的扩展'; +$lang['installed'] = '已安装的:'; +$lang['downloadurl'] = '下载地址:'; +$lang['repository'] = '版本库:'; +$lang['unknown'] = '未知的'; +$lang['installed_version'] = '已安装版本:'; +$lang['install_date'] = '您的最后一次升级:'; +$lang['available_version'] = '可用版本:'; +$lang['compatible'] = '兼容于:'; +$lang['depends'] = '依赖于:'; +$lang['similar'] = '相似于:'; +$lang['conflicts'] = '冲突于:'; +$lang['donate'] = '喜欢吗?'; +$lang['donate_action'] = '赞赏作者一杯咖啡的钱!'; +$lang['repo_retry'] = '重试'; +$lang['provides'] = '提供:'; +$lang['status'] = '状态:'; +$lang['status_installed'] = '已安装的'; +$lang['status_not_installed'] = '未安装'; +$lang['status_protected'] = '受保护'; +$lang['status_enabled'] = '启用'; +$lang['status_disabled'] = '禁用'; +$lang['status_unmodifiable'] = '不可修改'; +$lang['status_plugin'] = '插件'; +$lang['status_template'] = '模板'; +$lang['status_bundled'] = '内建'; +$lang['msg_enabled'] = '插件 %s 已启用'; +$lang['msg_disabled'] = '插件 %s 已禁用'; +$lang['msg_delete_success'] = '%s 扩展没有安装'; +$lang['msg_delete_failed'] = '卸载扩展 %s 失败'; +$lang['msg_template_install_success'] = '模板 %s 安装成功'; +$lang['msg_template_update_success'] = '模板 %s 更新成功'; +$lang['msg_plugin_install_success'] = '插件 %s 安装成功'; +$lang['msg_plugin_update_success'] = '插件 %s 更新成功'; +$lang['msg_upload_failed'] = '上传文件失败'; +$lang['msg_nooverwrite'] = '扩展名 %s 已存在,因此不会被覆盖;要覆盖,请选中覆盖选项。'; +$lang['missing_dependency'] = '缺少或者被禁用的依赖: %s'; +$lang['security_issue'] = '安全问题: %s'; +$lang['security_warning'] = '安全警告: %s'; +$lang['update_message'] = '更新提醒:%s'; +$lang['update_available'] = '更新:新版本 %s 已经可用。'; +$lang['wrong_folder'] = '扩展安装错误:请将扩展目录 "%s" 重命名为 "%s"。'; +$lang['url_change'] = 'URL 已改变:自上次下载以来的下载 URL 已经改变。请在更新扩展前检查新 URL 是否有效。
    新的:%s
    旧的:%s'; +$lang['error_badurl'] = 'URL 应当以 http 或者 https 作为开头'; +$lang['error_dircreate'] = '无法创建用于保存下载的临时文件夹'; +$lang['error_download'] = '无法下载文件:%s'; +$lang['error_decompress'] = '无法解压下载的文件。这可能是由于文件损坏,在这种情况下您可以重试。这也可能是由于压缩格式是未知的,在这种情况下您需要手动下载并且安装。'; +$lang['error_findfolder'] = '无法识别扩展目录,您需要手动下载和安装'; +$lang['error_copy'] = '在尝试安装文件到目录 %s 时出现文件复制错误:可能磁盘已满或文件权限不正确。这可能导致扩展安装不完整,并使您的维基处在不稳定状态'; +$lang['noperms'] = '扩展目录不可写'; +$lang['notplperms'] = '模板目录不可写'; +$lang['nopluginperms'] = '插件目录不可写'; +$lang['git'] = '这个扩展是通过 Git 安装的,您可能不想在这里升级它'; +$lang['auth'] = '这个认证插件没有在配置中启用,请考虑禁用它。'; +$lang['install_url'] = '从 URL 安装:'; +$lang['install_upload'] = '上传扩展:'; +$lang['repo_badresponse'] = '插件库返回无效响应。'; +$lang['repo_error'] = '无法连接到扩展库。请确定您的服务器可以连接 www.dokuwiki.org 并检查您的代理设置。'; +$lang['nossl'] = '您的 PHP 似乎不支持 SSL,这将导致无法下载多数 DokuWiki 扩展。'; diff --git a/lib/plugins/extension/plugin.info.txt b/lib/plugins/extension/plugin.info.txt new file mode 100644 index 0000000..7ee84dc --- /dev/null +++ b/lib/plugins/extension/plugin.info.txt @@ -0,0 +1,7 @@ +base extension +author Michael Hamann +email michael@content-space.de +date 2015-07-26 +name Extension Manager +desc Allows managing and installing plugins and templates +url https://www.dokuwiki.org/plugin:extension diff --git a/lib/plugins/extension/script.js b/lib/plugins/extension/script.js new file mode 100644 index 0000000..7742b15 --- /dev/null +++ b/lib/plugins/extension/script.js @@ -0,0 +1,149 @@ +jQuery(function(){ + + var $extmgr = jQuery('#extension__manager'); + + /** + * Confirm uninstalling + */ + $extmgr.find('button.uninstall').on('click', function(e){ + if(!window.confirm(LANG.plugins.extension.reallydel)){ + e.preventDefault(); + return false; + } + return true; + }); + + /** + * very simple lightbox + * @link http://webdesign.tutsplus.com/tutorials/htmlcss-tutorials/super-simple-lightbox-with-css-and-jquery/ + */ + $extmgr.find('a.extension_screenshot').on('click', function(e) { + e.preventDefault(); + + //Get clicked link href + var image_href = jQuery(this).attr("href"); + + // create lightbox if needed + var $lightbox = jQuery('#plugin__extensionlightbox'); + if(!$lightbox.length){ + $lightbox = jQuery('

    Click to close

    ') + .appendTo(jQuery('body')) + .hide() + .on('click', function(){ + $lightbox.hide(); + }); + } + + // fill and show it + $lightbox + .show() + .find('div').html(''); + + + return false; + }); + + /** + * Enable/Disable extension via AJAX + */ + $extmgr.find('button.disable, button.enable').on('click', function (e) { + e.preventDefault(); + var $btn = jQuery(this); + + // get current state + var extension = $btn.attr('name').split('[')[2]; + extension = extension.substr(0, extension.length - 1); + var act = ($btn.hasClass('disable')) ? 'disable' : 'enable'; + + // disable while we wait + $btn.attr('disabled', 'disabled'); + $btn.css('cursor', 'wait'); + + // execute + jQuery.get( + DOKU_BASE + 'lib/exe/ajax.php', + { + call: 'plugin_extension', + ext: extension, + act: act, + sectok: $btn.parents('form').find('input[name=sectok]').val() + }, + function (data) { + $btn.css('cursor', '') + .removeAttr('disabled') + .removeClass('disable') + .removeClass('enable') + .text(data.label) + .addClass(data.reverse) + .parents('li') + .removeClass('disabled') + .removeClass('enabled') + .addClass(data.state); + } + ).fail(function() { + $btn.css('cursor', '') + .removeAttr('disabled'); + }); + }); + + /** + * AJAX detail infos + */ + $extmgr.find('a.info').on('click', function(e){ + e.preventDefault(); + + var $link = jQuery(this); + var $details = $link.parent().find('dl.details'); + if($details.length){ + $link.toggleClass('close'); + $details.toggle(); + return; + } + + $link.addClass('close'); + jQuery.get( + DOKU_BASE + 'lib/exe/ajax.php', + { + call: 'plugin_extension', + ext: $link.data('extid'), + act: 'info' + }, + function(data){ + $link.parent().append(data); + } + ); + }); + + /** + Create section for enabling/disabling viewing options + */ + if ( $extmgr.find('.plugins, .templates').hasClass('active') ) { + var $extlist = jQuery('#extension__list'); + $extlist.addClass('hasDisplayOptions'); + + var $displayOpts = jQuery('

    ', { id: 'extension__viewoptions'} ).appendTo($extmgr.find( '.panelHeader' )); + $displayOpts.append(LANG.plugins.extension.display_viewoptions); + + var displayOptionsHandler = function(){ + $extlist.toggleClass( this.name ); + DokuCookie.setValue('ext_'+this.name, $extlist.hasClass(this.name) ? '1' : '0'); + }; + + jQuery(['enabled', 'disabled', 'updatable']).each(function(index, chkName){ + var $label = jQuery( '' ) + .appendTo($displayOpts); + var $input = jQuery( '', { type: 'checkbox', name: chkName }) + .on('change', displayOptionsHandler) + .appendTo($label); + + var previous = DokuCookie.getValue('ext_'+chkName); + if(typeof previous === "undefined" || previous == '1') { + $input.trigger('click'); + } + + jQuery( '' ) + .append(' '+LANG.plugins.extension['display_'+chkName]) + .appendTo($label); + }); + } +}); diff --git a/lib/plugins/extension/style.less b/lib/plugins/extension/style.less new file mode 100644 index 0000000..261fa1c --- /dev/null +++ b/lib/plugins/extension/style.less @@ -0,0 +1,386 @@ +/* + * Extension plugin styles + * + * @author Christopher Smith + * @author Piyush Mishra + * @author Håkan Sandell + * @author Anika Henke + */ + +/** + * very simple lightbox + * @link http://webdesign.tutsplus.com/tutorials/htmlcss-tutorials/super-simple-lightbox-with-css-and-jquery/ + */ +#plugin__extensionlightbox { + position: fixed; + top: 0; + left: 0; + width: 100%; + height: 100%; + background: url(images/overlay.png) repeat; + text-align: center; + cursor: pointer; + z-index: 9999; + + p { + text-align: right; + color: #fff; + margin-right: 20px; + font-size: 12px; + } + + img { + box-shadow: 0 0 25px #111; + max-width: 90%; + max-height: 90%; + } +} + +/** + * general styles + */ +#extension__manager { + // tab layout - most of it is in the main template + ul.tabs li.active a { + background-color: @ini_background_alt; + border-bottom: solid 1px @ini_background_alt; + z-index: 2; + } + .panelHeader { + background-color: @ini_background_alt; + margin: 0 0 10px 0; + padding: 10px 10px 8px; + overflow: hidden; + } + + // message spacing + div.msg { + margin: 0.4em 0 0 0; + } +} + +/* + * extensions table + */ +#extension__list { + ul.extensionList { + margin-left: 0; + margin-right: 0; + padding: 0; + list-style: none; + } + + ul.extensionList li { + margin: 0 0 .5em; + padding: 0 0 .5em; + color: @ini_text; + border-bottom: 1px solid @ini_border; + overflow: hidden; + } + + button { + margin-bottom: .3em; + } +} + +/** + * extension table left column + */ +#extension__list .legend { + position: relative; + width: 75%; + float: left; + + // padding + > div { + padding: 0 .5em 0 132px; + border-right: 1px solid @ini_background_alt; + overflow: hidden; + } + + // screenshot + div.screenshot { + margin-top: 4px; + margin-left: -132px; + max-width: 120px; + float: left; + position: relative; + + img { + width: 120px; + height: 70px; + border-radius: 5px; + box-shadow: 2px 2px 2px #666; + } + + span { + min-height: 24px; + min-width: 24px; + position: absolute; + left: 0; + top: 0; + } + } + + // plugin headline + h2 { + width: 100%; + float: right; + margin: 0.2em 0 0.5em; + font-size: 100%; + font-weight: normal; + border: none; + + strong { + font-size: 120%; + font-weight: bold; + vertical-align: baseline; + } + } + + // description + p { + margin: 0 0 0.6em 0; + } + + // popularity bar + div.popularity { + background-color: @ini_background; + border: 1px solid silver; + height: .4em; + margin: 0 auto; + padding: 1px; + width: 5.5em; + position: absolute; + right: .5em; + top: 0.2em; + + div { + background-color: @ini_border; + height: 100%; + } + } + + // Docs, Bugs, Tags + div.linkbar { + font-size: 85%; + + span.tags { + padding-left: 18px; + background: transparent url(images/tag.png) no-repeat 0 0; + } + + a.bugs { + padding-left: 18px; + background: transparent url(images/bug.gif) no-repeat 0 0; + } + } + + // more info button + a.info { + background: transparent url(images/down.png) no-repeat 0 0; + border-width: 0; + height: 13px; + width: 13px; + text-indent: -9999px; + float: right; + margin: .5em 0 0; + overflow: hidden; + + &.close { + background: transparent url(images/up.png) no-repeat 0 0; + } + } + + // detailed info box + dl.details { + margin: 0.4em 0 0 0; + font-size: 85%; + border-top: 1px solid @ini_background_alt; + clear: both; + + dt { + clear: left; + float: left; + width: 25%; + margin: 0; + text-align: right; + font-weight: normal; + padding: 0.2em 5px 0 0; + font-weight: bold; + } + + dd { + margin-left: 25%; + padding: 0.2em 0 0 5px; + + a.donate { + padding-left: 18px; + background: transparent url(images/donate.png) left center no-repeat; + } + } + } +} + +[dir=rtl] #extension__list .legend { + float: right; + + > div { + padding: 0 132px 0 .5em; + border-left: 1px solid @ini_background_alt; + border-right-width: 0; + } + + div.screenshot { + margin-left: 0; + margin-right: -132px; + float: right; + + span { + left: auto; + right: 0; + } + } + + h2 { + float: left; + } + + div.popularity { + right: auto; + left: .5em; + } + + div.linkbar span.tags, + dl.details dd a.donate { + padding-left: 0; + padding-right: 18px; + background-position: top right; + } + + a.info { + float: left; + } + + dl.details { + dt { + clear: right; + float: right; + text-align: left; + padding-left: 5px; + padding-right: 0; + } + + dd { + margin-left: 0; + margin-right: 25%; + padding-left: 0; + padding-right: 5px; + } + } +} + +/* + * Enabled/Disabled overrides + */ +#extension__list { + + &.hasDisplayOptions { + .enabled, + .disabled, + .updatable { + display: none; + } + + &.enabled .enabled, + &.disabled .disabled, + &.updatable .updatable { + display: block; + } + } + + .enabled div.screenshot span { + background: transparent url(images/enabled.png) no-repeat 2px 2px; + } + + .disabled div.screenshot span { + background: transparent url(images/disabled.png) no-repeat 2px 2px; + } + + .disabled .legend { + opacity: 0.7; + } +} + +/** + * extension table right column + */ +#extension__manager .actions { + padding: 0; + font-size: 95%; + width: 25%; + float: right; + text-align: right; + + .version { + display: block; + } + + p { + margin: 0.2em 0; + text-align: center; + } + + p.permerror { + margin-left: 0.4em; + text-align: left; + padding-left: 19px; + background: transparent url(images/warning.png) center left no-repeat; + line-height: 18px; + font-size: 12px; + } +} + +[dir=rtl] #extension__manager .actions { + float: left; + text-align: left; + + p.permerror { + margin-left: 0; + margin-right: 0.4em; + text-align: right; + padding-left: 0; + padding-right: 19px; + background-position: center right; + } +} + +/** + * Search form + */ +#extension__manager form.search { + display: block; + margin-bottom: 2em; + + span { + font-weight: bold; + } + + input.edit { + width: 25em; + } +} + +/** + * Install form + */ +#extension__manager form.install { + text-align: center; + display: block; + width: 60%; +} + +#extension__viewoptions label { + margin-left: 1em; + vertical-align: baseline; +} diff --git a/lib/plugins/index.html b/lib/plugins/index.html new file mode 100644 index 0000000..977f90e --- /dev/null +++ b/lib/plugins/index.html @@ -0,0 +1,11 @@ + + + + + +nothing here... + + + + + diff --git a/lib/plugins/indexmenu/.github/workflows/dokuwiki.yml b/lib/plugins/indexmenu/.github/workflows/dokuwiki.yml new file mode 100644 index 0000000..ed134c5 --- /dev/null +++ b/lib/plugins/indexmenu/.github/workflows/dokuwiki.yml @@ -0,0 +1,11 @@ +name: DokuWiki Default Tasks +on: + push: + pull_request: + schedule: + - cron: '14 17 21 * *' + + +jobs: + all: + uses: dokuwiki/github-action/.github/workflows/all.yml@main diff --git a/lib/plugins/indexmenu/CREDITS b/lib/plugins/indexmenu/CREDITS new file mode 100644 index 0000000..3ec7881 --- /dev/null +++ b/lib/plugins/indexmenu/CREDITS @@ -0,0 +1,64 @@ +Thanks to: + +Geir Landro: + Dtree Javascript code. + +Roland Hellebart: + The Dtree idea. + +Chris Beetle: + The root namespace index. + +Gleb: + The nons e headpage option suggestion. + +Malyfred: + Resolved incorrect namespaces levels bug. + +Raymond Elferink: + Resolved incorrect ACLs bug. + +Ilya Lebedev: + Skip index option. + +Franck Baron: + Js id option. + +Jon B: + Skip file option. + +Neosky: + Javascript toolbar bug. + +Paul Grove: + Css dynamic properties and suggestion of js theme with differents image formats + +Anja Vag: + Great help in testing and finding bugs. + +Blaz: + Current page highliting suggestion. + +Adrien CLERC: + Start page bug. + +Ryan Jake and Fullindex plugin: + Sort by metada suggestion. + +Herman Huitema: + Context menu search function and great help in testing patches. + +Thomas Binder: + Fixed a bug with msort/nsort that did not manage empty arrays. + +Fabian Pfannes: + German language + +Urban: + Context menu patch and other suggestions + +Gerrit Uitslag (Klap-in): + Rewrite of indexmenu to add new dokuwiki compatibility + Added a new toolbar wizard + add ''hsort'' for sorting [[config:startpage]] pages to top of listing + many others improvements diff --git a/lib/plugins/indexmenu/Search.php b/lib/plugins/indexmenu/Search.php new file mode 100644 index 0000000..90dfe0f --- /dev/null +++ b/lib/plugins/indexmenu/Search.php @@ -0,0 +1,871 @@ +sort = $sort['sort']; + $this->msort = $sort['msort']; + $this->rsort = $sort['rsort']; + $this->nsort = $sort['nsort']; + $this->group = $sort['group']; + $this->hsort = $sort['hsort']; + } + + /** + * Build the data array for fancytree from search results + * + * @param array $data results from search + * @param bool $isInit true if first level of nodes from tree, false if next levels + * @param bool $currentPage current wikipage id + * @param bool $isNopg if nopg is set + * @return array + */ + public function buildFancytreeData($data, $isInit, $currentPage, $isNopg) + { + if (empty($data)) return []; + + $children = []; + $opts = [ + 'currentPage' => $currentPage, + 'isParentLazy' => false, + 'nopg' => $isNopg + ]; + $hasActiveNode = false; + $this->makeNodes($data, -1, 0, $children, $hasActiveNode, $opts); + + if ($isInit) { + $nodes['children'] = $children; + return $nodes; + } else { + return $children; + } + } + + /** + * Collects the children at the same level since last parsed item + * + * @param array $data results from search + * @param int $indexLatestParsedItem + * @param int $previousLevel level of parent + * @param array $nodes by reference, here the child nodes are stored + * @param bool $hasActiveNode active node must be unique, needs tracking + * @param array $opts

      + *
    • $opts['currentPage'] string id of main article
    • + *
    • $opts['isParentLazy'] bool Used for recognizing the extra level below lazy nodes
    • + *
    • $opts['nopg'] bool needed for currentpage handling
    • + *
    + * @return int latest parsed item from data array + */ + private function makeNodes(&$data, $indexLatestParsedItem, $previousLevel, &$nodes, &$hasActiveNode, $opts) + { + $i = 0; + $counter = 0; + foreach ($data as $i => $item) { + //skip parsed items + if ($i <= $indexLatestParsedItem) { + continue; + } + + if ($item['level'] < $previousLevel || $counter === 0 && $item['level'] == $previousLevel) { + return $i - 1; + } + $node = [ + 'title' => $item['title'], + 'key' => $item['id'] . ($item['type'] === 'f' ? '' : ':'), //ensure ns is unique + 'hns' => $item['hns'] //false if not available + ]; + + // f=file, d=directory, l=directory which is lazy loaded later + if ($item['type'] == 'f') { + // let php create url (considering rewriting etc) + $node['url'] = wl($item['id']); + + //set current page to active + if ($opts['currentPage'] == $item['id']) { + if (!$hasActiveNode) { + $node['active'] = true; + $hasActiveNode = true; + } + } + } else { + // type: d/l + $node['folder'] = true; + // let php create url (considering rewriting etc) + $node['url'] = $item['hns'] === false ? false : wl($item['hns']); + if (!$item['hnsExists']) { + //change link color + $node['hnsNotExisting'] = true; + } + + if ($item['open'] === true) { + $node['expanded'] = true; + } + + $node['children'] = []; + $indexLatestParsedItem = $this->makeNodes( + $data, + $i, + $item['level'], + $node['children'], + $hasActiveNode, + [ + 'currentPage' => $opts['currentPage'], + 'isParentLazy' => $item['type'] === 'l', + 'nopg' => $opts['nopg'] + ] + ); + + // a lazy node, but because we have sometime no pages or nodes (due e.g. acl/hidden/nopg), it could be + // empty. Therefore we did extra work by walking a level deeper and check here whether it has children + if ($item['type'] === 'l') { + if (empty($node['children'])) { + //an empty lazy node, is not marked lazy + if ($opts['isParentLazy']) { + //a lazy node with a lazy parent has no children loaded, so stays always empty + //(these nodes are not really used, but only counted) + $node['lazy'] = true; + unset($node['children']); + } + } else { + //has children, so mark lazy + $node['lazy'] = true; + unset($node['children']); //do not keep, because these nodes do not know yet their child folders + } + } + + //might be duplicated if hide_headpage is disabled, or with nopg and a :same: headpage + //mark active after processing children, such that deepest level is activated + if ( + $item['hns'] === $opts['currentPage'] + || $opts['nopg'] && getNS($opts['currentPage']) === $item['id'] + ) { + //with hide_headpage enabled, the parent node must be actived + //special: nopg has no pages, therefore, mark its parent node active + if (!$hasActiveNode) { + $node['active'] = true; + $hasActiveNode = true; + } + } + } + + if ($item['type'] === 'f' || !empty($node['children']) || isset($node['lazy']) || $item['hns'] !== false) { + // add only files, non-empty folders, lazy-loaded or folder with only a headpage + $nodes[] = $node; + } + + $previousLevel = $item['level']; + $counter++; + } + return $i; + } + + + /** + * Search pages/folders depending on the given options $opts + * + * @param string $ns + * @param array $opts
      + *
    • $opts['skipns'] string regexp matching namespaceids to skip (ignored)
    • + *
    • $opts['skipfile'] string regexp matching pageids to skip (ignored)
    • + *
    • $opts['skipnscombined'] array regexp matching namespaceids to skip
    • + *
    • $opts['skipfilecombined'] array regexp matching pageids to skip
    • + *
    • $opts['headpage'] string headpages options or pageids
    • + *
    • $opts['level'] int desired depth of main namespace, -1 = all levels
    • + *
    • $opts['subnss'] array with entries: array(namespaceid,level) specifying namespaces with their own + * number of opened levels
    • + *
    • $opts['nons'] bool exclude namespace nodes
    • + *
    • $opts['max'] int If initially closed, the node at max level will retrieve all its child nodes + * through the AJAX mechanism
    • + *
    • $opts['nopg'] bool exclude page nodes
    • + *
    • $opts['hide_headpage'] int don't hide (0) or hide (1)
    • + *
    • $opts['js'] bool use js-render (only used for old 'searchIndexmenuItems')
    • + *
    + * @return array The results of the search + */ + public function search($ns, $opts): array + { + global $conf; + + if (!empty($opts['tempNew'])) { + //a specific callback for Fancytree + $callback = [$this, 'searchIndexmenuItemsNew']; + } else { + $callback = [$this, 'searchIndexmenuItems']; + } + $dataDir = $conf['datadir']; + $data = []; + $fsDir = "/" . utf8_encodeFN(str_replace(':', '/', $ns)); + if ($this->sort || $this->msort || $this->rsort || $this->hsort) { + $this->customSearch($data, $dataDir, $callback, $opts, $fsDir); + } else { + search($data, $dataDir, $callback, $opts, $fsDir); + } + return $data; + } + + /** + * Callback that adds an item of namespace/page to the browsable index, if it fits in the specified options + * + * @param array $data Already collected nodes + * @param string $base Where to start the search, usually this is $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 depth + * @param array $opts Option array as given to search():
      + *
    • $opts['skipns'] string regexp matching namespaceids to skip (ignored),
    • + *
    • $opts['skipfile'] string regexp matching pageids to skip (ignored),
    • + *
    • $opts['skipnscombined'] array regexp matching namespaceids to skip,
    • + *
    • $opts['skipfilecombined'] array regexp matching pageids to skip,
    • + *
    • $opts['headpage'] string headpages options or pageids,
    • + *
    • $opts['level'] int desired depth of main namespace, -1 = all levels,
    • + *
    • $opts['subnss'] array with entries: array(namespaceid,level) specifying namespaces with their own number + * of opened levels,
    • + *
    • $opts['nons'] bool Exclude namespace nodes,
    • + *
    • $opts['max'] int If initially closed, the node at max level will retrieve all its child nodes through + * the AJAX mechanism,
    • + *
    • $opts['nopg'] bool Exclude page nodes,
    • + *
    • $opts['hide_headpage'] int don't hide (0) or hide (1),
    • + *
    • $opts['js'] bool use js-render
    • + *
    + * @return bool if this directory should be traversed (true) or not (false) + * + * @author Andreas Gohr + * modified by Samuele Tognini + */ + public function searchIndexmenuItems(&$data, $base, $file, $type, $lvl, $opts) + { + global $conf; + + $hns = false; + $isOpen = false; + $title = null; + $skipns = $opts['skipnscombined']; + $skipfile = $opts['skipfilecombined']; + $headpage = $opts['headpage']; + $id = pathID($file); + + if ($type == 'd') { + // Skip folders in plugin conf + foreach ($skipns as $skipn) { + if (!empty($skipn) && preg_match($skipn, $id)) { + return false; + } + } + //check ACL (for sneaky_index namespaces too). + if ($conf['sneaky_index'] && auth_quickaclcheck($id . ':') < AUTH_READ) return false; + + //Open requested level + if ($opts['level'] > $lvl || $opts['level'] == -1) { + $isOpen = true; + } + //Search optional subnamespaces with + if (!empty($opts['subnss'])) { + $subnss = $opts['subnss']; + $counter = count($subnss); + for ($a = 0; $a < $counter; $a++) { + if (preg_match("/^" . $id . "($|:.+)/i", $subnss[$a][0], $match)) { + //It contains a subnamespace + $isOpen = true; + } elseif (preg_match("/^" . $subnss[$a][0] . "(:.*)/i", $id, $match)) { + //It's inside a subnamespace, check level + // -1 is open all, otherwise count number of levels in the remainer of the pageid + // (match[0] is always prefixed with :) + if ($subnss[$a][1] == -1 || substr_count($match[1], ":") < $subnss[$a][1]) { + $isOpen = true; + } else { + $isOpen = false; + } + } + } + } + + //decide if it should be traversed + if ($opts['nons']) { + return $isOpen; // in nons, level is only way to show/hide nodes (in nons nodes are not expandable) + } elseif ($opts['max'] > 0 && !$isOpen && $lvl >= $opts['max']) { + //Stop recursive searching + $shouldBeTraversed = false; + //change type + $type = "l"; + } elseif ($opts['js']) { + $shouldBeTraversed = true; //TODO if js tree, then traverse deeper??? + } else { + $shouldBeTraversed = $isOpen; + } + //Set title and headpage + $title = static::getNamespaceTitle($id, $headpage, $hns); + // when excluding page nodes: guess a headpage based on the headpage setting + if ($opts['nopg'] && $hns === false) { + $hns = $this->guessHeadpage($headpage, $id); + } + } else { + //Nopg. Dont show pages + if ($opts['nopg']) return false; + + $shouldBeTraversed = true; + //Nons.Set all pages at first level + if ($opts['nons']) { + $lvl = 1; + } + //don't add + if (substr($file, -4) != '.txt') return false; + //check hiddens and acl + if (isHiddenPage($id) || auth_quickaclcheck($id) < AUTH_READ) return false; + //Skip files in plugin conf + foreach ($skipfile as $skipf) { + if (!empty($skipf) && preg_match($skipf, $id)) { + return false; + } + } + //Skip headpages to hide (nons has no namespace nodes, therefore, no duplicated links to headpage) + if (!$opts['nons'] && !empty($headpage) && $opts['hide_headpage']) { + //start page is in root + if ($id == $conf['start']) return false; + + $ahp = explode(",", $headpage); + foreach ($ahp as $hp) { + switch ($hp) { + case ":inside:": + if (noNS($id) == noNS(getNS($id))) return false; + break; + case ":same:": + if (@is_dir(dirname(wikiFN($id)) . "/" . utf8_encodeFN(noNS($id)))) return false; + break; + //it' s an inside start + case ":start:": + if (noNS($id) == $conf['start']) return false; + break; + default: + if (noNS($id) == cleanID($hp)) return false; + } + } + } + //Set title + if ($conf['useheading'] == 1 || $conf['useheading'] === 'navigation') { + $title = p_get_first_heading($id, false); + } + if (is_null($title)) { + $title = noNS($id); + } + $title = hsc($title); + } + + $item = [ + 'id' => $id, + 'type' => $type, + 'level' => $lvl, + 'open' => $isOpen, + 'title' => $title, + 'hns' => $hns, + 'file' => $file, + 'shouldBeTraversed' => $shouldBeTraversed + ]; + $item['sort'] = $this->getSortValue($item); + $data[] = $item; + + return $shouldBeTraversed; + } + + /** + * Callback that adds an item of namespace/page to the browsable index, if it fits in the specified options + * + * TODO Version as used for Fancytree js tree + * + * @param array $data indexed array of collected nodes, each item has:
      + *
    • $item['id'] string namespace or page id
    • + *
    • $item['type'] string f/d/l
    • + *
    • $item['level'] string current recursion depth (start count at 1)
    • + *
    • $item['open'] bool if a node is open
    • + *
    • $item['title'] string
    • + *
    • $item['hns'] string|false page id or false
    • + *
    • $item['hnsExists'] bool only false if hns is guessed(not-existing) for nopg
    • + *
    • $item['file'] string path to file or directory
    • + *
    • $item['shouldBeTraversed'] bool directory should be searched
    • + *
    • $item['sort'] mixed sort value
    • + *
    + * @param string $base Where to start the search, usually this is $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 depth + * @param array $opts Option array as given to search()
      + *
    • $opts['skipns'] string regexp matching namespaceids to skip (ignored)
    • + *
    • $opts['skipfile'] string regexp matching pageids to skip (ignored)
    • + *
    • $opts['skipnscombined'] array regexp matching namespaceids to skip
    • + *
    • $opts['skipfilecombined'] array regexp matching pageids to skip
    • + *
    • $opts['headpage'] string headpages options or pageids
    • + *
    • $opts['level'] int desired depth of main namespace, -1 = all levels
    • + *
    • $opts['subnss'] array with entries: array(namespaceid,level) specifying namespaces with their + * own level
    • + *
    • $opts['nons'] bool exclude namespace nodes
    • + *
    • $opts['max'] int If initially closed, the node at max level will retrieve all its child nodes + * through the AJAX mechanism
    • + *
    • $opts['nopg'] bool exclude page nodes
    • + *
    • $opts['hide_headpage'] int don't hide (0) or hide (1)
    • + *
    + * @return bool if this directory should be traversed (true) or not (false) + * + * @author Andreas Gohr + * modified by Samuele Tognini + */ + public function searchIndexmenuItemsNew(&$data, $base, $file, $type, $lvl, $opts) + { + global $conf; + + $hns = false; + $isOpen = false; + $title = null; + $skipns = $opts['skipnscombined']; + $skipfile = $opts['skipfilecombined']; + $headpage = $opts['headpage']; + $hnsExists = true; //nopg guesses pages + $id = pathID($file); + + if ($type == 'd') { + // Skip folders in plugin conf + foreach ($skipns as $skipn) { + if (!empty($skipn) && preg_match($skipn, $id)) { + return false; + } + } + //check ACL (for sneaky_index namespaces too). + if ($conf['sneaky_index'] && auth_quickaclcheck($id . ':') < AUTH_READ) return false; + + //Open requested level + if ($opts['level'] > $lvl || $opts['level'] == -1) { + $isOpen = true; + } + + //Search optional subnamespaces with + $isFolderAdjacentToSubNss = false; + if (!empty($opts['subnss'])) { + $subnss = $opts['subnss']; + $counter = count($subnss); + + for ($a = 0; $a < $counter; $a++) { + if (preg_match("/^" . $id . "($|:.+)/i", $subnss[$a][0], $match)) { + //this folder contains a subnamespace + $isOpen = true; + } elseif (preg_match("/^" . $subnss[$a][0] . "(:.*)/i", $id, $match)) { + //this folder is inside a subnamespace, check level + if ($subnss[$a][1] == -1 || substr_count($match[1], ":") < $subnss[$a][1]) { + $isOpen = true; + } else { + $isOpen = false; + } + } elseif ( + preg_match( + "/^" . (($ns = getNS($id)) === false ? '' : $ns) . "($|:.+)/i", + $subnss[$a][0], + $match + ) + ) { + // parent folder contains a subnamespace, if level deeper it does not match anymore + // that is handled with normal >max handling + $isOpen = false; + if ($opts['max'] > 0) { + $isFolderAdjacentToSubNss = true; + } + } + } + } + + //decide if it should be traversed + if ($opts['nons']) { + return $isOpen; // in nons, level is only way to show/hide nodes (in nons nodes are not expandable) + } elseif ($opts['max'] > 0 && !$isOpen) { // note: for Fancytree >=1 is used + // limited levels per request, node is closed + if ($lvl == $opts['max'] || $isFolderAdjacentToSubNss) { + // change type, more nodes should be loaded by ajax, but for nopg we need extra level to determine + // if folder is empty + // and folders adjacent to subns must be traversed as well + $type = "l"; + $shouldBeTraversed = true; + } elseif ($lvl > $opts['max']) { // deeper lvls only used temporary for checking existance children + //change type, more nodes should be loaded by ajax + $type = "l"; // use lazy loading + $shouldBeTraversed = false; + } else { + //node is closed, but still more levels requested with max + $shouldBeTraversed = true; + } + } else { + $shouldBeTraversed = $isOpen; + } + + //Set title and headpage + $title = static::getNamespaceTitle($id, $headpage, $hns); + + // when excluding page nodes: guess a headpage based on the headpage setting + if ($opts['nopg'] && $hns === false) { + $hns = $this->guessHeadpage($headpage, $id); + $hnsExists = false; + } + } else { + //Nopg.Dont show pages + if ($opts['nopg']) return false; + + $shouldBeTraversed = true; + //Nons.Set all pages at first level + if ($opts['nons']) { + $lvl = 1; + } + //don't add + if (substr($file, -4) != '.txt') return false; + //check hiddens and acl + if (isHiddenPage($id) || auth_quickaclcheck($id) < AUTH_READ) return false; + //Skip files in plugin conf + foreach ($skipfile as $skipf) { + if (!empty($skipf) && preg_match($skipf, $id)) { + return false; + } + } + //Skip headpages to hide + if (!$opts['nons'] && !empty($headpage) && $opts['hide_headpage']) { + //start page is in root + if ($id == $conf['start']) return false; + + $hpOptions = explode(",", $headpage); + foreach ($hpOptions as $hp) { + switch ($hp) { + case ":inside:": + if (noNS($id) == noNS(getNS($id))) return false; + break; + case ":same:": + if (@is_dir(dirname(wikiFN($id)) . "/" . utf8_encodeFN(noNS($id)))) return false; + break; + //it' s an inside start + case ":start:": + if (noNS($id) == $conf['start']) return false; + break; + default: + if (noNS($id) == cleanID($hp)) return false; + } + } + } + + //Set title + if ($conf['useheading'] == 1 || $conf['useheading'] === 'navigation') { + $title = p_get_first_heading($id, false); + } + if (is_null($title)) { + $title = noNS($id); + } + $title = hsc($title); + } + + $item = [ + 'id' => $id, + 'type' => $type, + 'level' => $lvl, + 'open' => $isOpen, + 'title' => $title, + 'hns' => $hns, + 'hnsExists' => $hnsExists, + 'file' => $file, + 'shouldBeTraversed' => $shouldBeTraversed + ]; + $item['sort'] = $this->getSortValue($item); + $data[] = $item; + + return $shouldBeTraversed; + } + + /** + * callback that recurse directory + * + * This function recurses into a given base directory + * and calls the supplied function for each file and directory + * + * Similar to search() of inc/search.php, but has extended sorting options + * + * @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 List of indexmenu options + * @param string $dir Current directory beyond $base + * @param int $lvl Recursion Level + * + * @author Andreas Gohr + * @author modified by Samuele Tognini + */ + public function customSearch(&$data, $base, $func, $opts, $dir = '', $lvl = 1) + { + $dirs = []; + $files = []; + $files_tmp = []; + $dirs_tmp = []; + $count = count($data); + + //read in directories and files + $dh = @opendir($base . '/' . $dir); + if (!$dh) return; + while (($file = readdir($dh)) !== false) { + //skip hidden files and upper dirs + if (preg_match('/^[._]/', $file)) continue; + if (is_dir($base . '/' . $dir . '/' . $file)) { + $dirs[] = $dir . '/' . $file; + continue; + } + $files[] = $dir . '/' . $file; + } + closedir($dh); + + //Collect and sort files + foreach ($files as $file) { + call_user_func_array($func, [&$files_tmp, $base, $file, 'f', $lvl, $opts]); + } + usort($files_tmp, [$this, "compareNodes"]); + + //Collect and sort dirs + if ($this->nsort) { + //collect the wanted directories in dirs_tmp + foreach ($dirs as $dir) { + call_user_func_array($func, [&$dirs_tmp, $base, $dir, 'd', $lvl, $opts]); + } + if($this->group) { + //group directories and pages, and sort separately + $dirsAndFiles = $dirs_tmp; + } else { + // no grouping + //mix directories and pages and sort together + $dirsAndFiles = array_merge($dirs_tmp, $files_tmp); + } + + usort($dirsAndFiles, [$this, "compareNodes"]); + + //add and search each directory + foreach ($dirsAndFiles as $dirOrFile) { + $data[] = $dirOrFile; + if ($dirOrFile['type'] != 'f' && $dirOrFile['shouldBeTraversed']) { + $this->customSearch($data, $base, $func, $opts, $dirOrFile['file'], $lvl + 1); + } + } + } else { + //sort by directory name + Sort::sort($dirs); + //collect directories + foreach ($dirs as $dir) { + if (call_user_func_array($func, [&$data, $base, $dir, 'd', $lvl, $opts])) { + $this->customSearch($data, $base, $func, $opts, $dir, $lvl + 1); + } + } + } + + //count added items + $added = count($data) - $count; + + if ($added === 0 && $files_tmp === []) { + //remove empty directory again, only if it has not a headpage associated + $lastItem = end($data); + if (!$lastItem['hns']) { + array_pop($data); + } + } elseif (!($this->nsort && !$this->group)) { + //add files to index + $data = array_merge($data, $files_tmp); + } + } + + + /** + * Get namespace title, checking for headpages + * + * @param string $ns namespace + * @param string $headpage comma-separated headpages options and headpages + * @param string|false $hns reference pageid of headpage, false when not existing + * @return string when headpage & heading on: title of headpage, otherwise: namespace name + * + * @author Samuele Tognini + */ + public static function getNamespaceTitle($ns, $headpage, &$hns) + { + global $conf; + $hns = false; + $title = noNS($ns); + if (empty($headpage)) { + return $title; + } + $hpOptions = explode(",", $headpage); + foreach ($hpOptions as $hp) { + switch ($hp) { + case ":inside:": + $page = $ns . ":" . noNS($ns); + break; + case ":same:": + $page = $ns; + break; + //it's an inside start + case ":start:": + $page = ltrim($ns . ":" . $conf['start'], ":"); + break; + //inside pages + default: + if (!blank($hp)) { //empty setting results in empty string here + $page = $ns . ":" . $hp; + } + } + //check headpage + if (@file_exists(wikiFN($page)) && auth_quickaclcheck($page) >= AUTH_READ) { + if ($conf['useheading'] == 1 || $conf['useheading'] === 'navigation') { + $title_tmp = p_get_first_heading($page, false); + if (!is_null($title_tmp)) { + $title = $title_tmp; + } + } + $title = hsc($title); + $hns = $page; + //headpage found, exit for + break; + } + } + return $title; + } + + + /** + * callback that sorts nodes + * + * @param array $a first node as array with 'sort' entry + * @param array $b second node as array with 'sort' entry + * @return int if less than zero 1st node is less than 2nd, otherwise equal respectively larger + */ + private function compareNodes($a, $b) + { + if ($this->rsort) { + return Sort::strcmp($b['sort'], $a['sort']); + } else { + return Sort::strcmp($a['sort'], $b['sort']); + } + } + + /** + * Add sort information to item. + * + * @param array $item + * @return bool|int|mixed|string + * + * @author Samuele Tognini + */ + private function getSortValue($item) + { + global $conf; + + $sort = false; + $page = false; + if ($item['type'] == 'd' || $item['type'] == 'l') { + //Fake order info when nsort is not requested + if ($this->nsort) { + $page = $item['hns']; + } else { + $sort = 0; + } + } + if ($item['type'] == 'f') { + $page = $item['id']; + } + if ($page) { + if ($this->hsort && noNS($item['id']) == $conf['start']) { + $sort = 1; + } + if ($this->msort) { + $sort = p_get_metadata($page, $this->msort); + } + if (!$sort && $this->sort) { + switch ($this->sort) { + case 't': + $sort = $item['title']; + break; + case 'd': + $sort = @filectime(wikiFN($page)); + break; + } + } + } + if ($sort === false) { + $sort = noNS($item['id']); + } + return $sort; + } + + /** + * Guess based on first option of the headpage config setting (default :start: if enabled) the headpage of the node + * + * @param string $headpage config setting + * @param string $ns namespace + * @return string guessed headpage + */ + private function guessHeadpage(string $headpage, string $ns): string + { + global $conf; + $hns = false; + + $hpOptions = explode(",", $headpage); + foreach ($hpOptions as $hp) { + switch ($hp) { + case ":inside:": + $hns = $ns . ":" . noNS($ns); + break 2; + case ":same:": + $hns = $ns; + break 2; + //it's an inside start + case ":start:": + $hns = ltrim($ns . ":" . $conf['start'], ":"); + break 2; + //inside pages + default: + if (!blank($hp)) { + $hns = $ns . ":" . $hp; + break 2; + } + } + } + + if ($hns === false) { + //fallback to start if headpage setting was empty + $hns = ltrim($ns . ":" . $conf['start'], ":"); + } + return $hns; + } +} diff --git a/lib/plugins/indexmenu/_test/ActionTest.php b/lib/plugins/indexmenu/_test/ActionTest.php new file mode 100644 index 0000000..e55a7a7 --- /dev/null +++ b/lib/plugins/indexmenu/_test/ActionTest.php @@ -0,0 +1,35 @@ +pluginsEnabled[] = 'indexmenu'; + parent::setUp(); // this enables the include plugin +// $this->helper = plugin_load('helper', 'include'); + +// global $conf; +// $conf['hidepages'] = 'inclhidden:hidden'; + + // for testing hidden pages + saveWikiText('ns2:bpage', "======H1======\nText", 'Sort different naturally/title/page'); + saveWikiText('ns2:apage', "======H3======\nText", 'Sort different naturally/title/page'); + saveWikiText('ns2:cpage', "======H2======\nText", 'Sort different naturally/title/page'); + + // pages on different levels + saveWikiText('ns1:ns1:apage', 'Page on level 1', 'Created page on level 1'); + saveWikiText('ns1:lvl2:lvl3:lvl4:apage', 'Page on level 4', 'Created page on level 4'); + saveWikiText('ns1:ns2:apage', 'Page on level 2', 'Created page on level 2'); + saveWikiText('ns1:ns0:bpage', 'Page on level 2', 'Created page on level 2'); + } + +} diff --git a/lib/plugins/indexmenu/_test/AjaxRequestsTest.php b/lib/plugins/indexmenu/_test/AjaxRequestsTest.php new file mode 100644 index 0000000..4fe5163 --- /dev/null +++ b/lib/plugins/indexmenu/_test/AjaxRequestsTest.php @@ -0,0 +1,345 @@ +pluginsEnabled[] = 'indexmenu'; + parent::setUp(); // this enables the indexmenu plugin + + //needed for 'tsort' to use First headings, sets title during search, otherwise as fallback page name used. + global $conf; + $conf['useheading'] = 'navigation'; + + + // for testing sorting pages + saveWikiText('ns2:cpage', "======Bb======\nText", 'Sort different page/title/creation date'); + sleep(1); // ensure different timestamps for 'dsort' + saveWikiText('ns2:bpage', "======Aa======\nText", 'Sort different page/title/creation date'); + sleep(1); + saveWikiText('ns2:apage', "======Cc======\nText", 'Sort different page/title/creation date'); + + //ensures title is added to metadata of page + idx_addPage('ns2:cpage'); + idx_addPage('ns2:bpage'); + idx_addPage('ns2:apage'); + + // pages on different levels + saveWikiText('ns1:ns2:apage', "======Bb======\nPage on level 2", 'Created page on level 2'); + saveWikiText('ns1:ns1:apage', "======Ee======\nPage on level 2", 'Created page on level 2'); + saveWikiText('ns1:ns1:lvl3:lvl4:apage', "======Cc======\nPage on levl 4", 'Page on level 4'); + saveWikiText('ns1:ns1:start', "======Aa======\nPage on level 2", 'Startpage on level 2'); + saveWikiText('ns1:ns0:bpage', "======Aa2======\nPage on level 2", 'Created page on level 2'); + saveWikiText('ns1:apage', "======Dd======\nPage on level 1", 'Created page on level 1'); + + //ensures title is added to metadata + idx_addPage('ns1:ns1:apage'); + idx_addPage('ns1:ns1:lvl3:lvl4:apage'); + idx_addPage('ns1:ns1:start'); + idx_addPage('ns1:ns2:apage'); + idx_addPage('ns1:ns0:bpage'); + idx_addPage('ns1:apage'); + } + + /** + * DataProvider for the builtin Ajax calls + * + * @return array + */ + public static function indexmenuCalls() + { + return [ + // Call, POST parameters, result function + [ + 'indexmenu', + AjaxRequestsTest::prepareParams(['level' => 1]), + 'expectedResultWiki' + ], + [ + 'indexmenu', + AjaxRequestsTest::prepareParams(['ns' => 'ns2', 'level' => 1]), + 'expectedResultNs2PageSort' + ], + [ + 'indexmenu', + AjaxRequestsTest::prepareParams(['ns' => 'ns2', 'level' => 1, 'sort' => 't']), + 'expectedResultNs2TitleSort' + ], + [ + 'indexmenu', + AjaxRequestsTest::prepareParams(['ns' => 'ns2', 'level' => 1, 'sort' => 'd']), + 'expectedResultNs2CreationDateSort' + ], + [ + 'indexmenu', + AjaxRequestsTest::prepareParams(['ns' => 'ns1', 'level' => 1, 'sort' => 't']), + 'expectedResultNs1TitleSort' + ], + [ + 'indexmenu', + AjaxRequestsTest::prepareParams(['ns' => 'ns1', 'level' => 1, 'sort' => 't', 'nsort' => 1]), + 'expectedResultNs1TitleSortNamespaceSort' + ] + ]; + } + + /** + * @dataProvider indexmenuCalls + * + * @param string $call + * @param array $post + * @param $expectedResult + */ + public function testBasicSorting($call, $post, $expectedResult) + { + $request = new TestRequest(); + $response = $request->post(['call' => $call] + $post, '/lib/exe/ajax.php'); +// $this->assertNotEquals("AJAX call '$call' unknown!\n", $response->getContent()); + +//var_export(json_decode($response->getContent()), true); // print as PHP array + + $actualArray = json_decode($response->getContent(), true); + unset($actualArray['debug']); + unset($actualArray['sort']); + unset($actualArray['opts']); + + $this->assertEquals($this->$expectedResult(), $actualArray); + +// $regexp: null, or regexp pattern to match +// example: '/^
    exampleIndex = "{{indexmenu>:}}"; +// +// parent::__construct(); +// } + + /** + * Create from list of values the output array of handle() + * + * @param array $values + * @return array aligned similar to output of handle() + */ + private function createData($values) + { + + [ + $ns, $theme, $identifier, $nocookie, $navbar, $noscroll, $maxjs, $notoc, $jsajax, $context, $nomenu, + $sort, $msort, $rsort, $nsort, $level, $nons, $nopg, $subnss, $max, $maxAjax, $js, $skipns, $skipfile, + $skipnscombined, $skipfilecombined, $hsort, $headpage, $hide_headpage, $jsVersion + ] = $values; + + return [ + $ns, + [ + 'theme' => $theme, + 'identifier' => $identifier, + 'nocookie' => $nocookie, + 'navbar' => $navbar, + 'noscroll' => $noscroll, + 'maxJs' => $maxjs, + 'notoc' => $notoc, + 'jsAjax' => $jsajax, + 'context' => $context, + 'nomenu' => $nomenu, + ], + [ + 'sort' => $sort, + 'msort' => $msort, + 'rsort' => $rsort, + 'nsort' => $nsort, + 'hsort' => $hsort, + ], + [ + 'level' => $level, + 'nons' => $nons, + 'nopg' => $nopg, + 'subnss' => $subnss, + 'max' => $max, + 'js' => $js, + 'skipns' => $skipns, + 'skipfile' => $skipfile, + 'skipnscombined' => $skipnscombined, + 'skipfilecombined' => $skipfilecombined, + 'headpage' => $headpage, + 'hide_headpage' => $hide_headpage, + 'maxajax' => $maxAjax, + 'navbar' => $navbar, + 'theme' => $theme + ], + $jsVersion + ]; + } + + /** + * Data provider + * + * @return array[] + */ + public static function someSyntaxes() + { + return [ + //root ns (empty is not recognized..) + // [syntax, data] + [ + "{{indexmenu>:}}", + [ + '', 'default', 'random', false, false, false, 1, false, '', false, false, + 0, false, false, false, -1, false, false, [], 0, 1, false, '', '', [''], [''], false, + ":start:,:same:,:inside:", 1, 1 + ] + ], + //root ns, #levels=1, js renderer + [ + "{{indexmenu>#1|js}}", + [ + '', 'default', 'random', false, false, false, 1, false, '', false, false, + 0, false, false, false, 1, false, false, [], 0, 1, true, '', '', [''], [''], false, + ":start:,:same:,:inside:", 1, 1 + ] + ], + //root ns, #levels=2, all not js specific options (nocookie is from context) + [ + "{{indexmenu>#2 test#6|navbar context tsort dsort msort hsort rsort nsort nons nopg}}", + [ + '', 'default', 'random', true, true, false, 1, false, '&sort=t&msort=indexmenu_n&rsort=1&nsort=1&hsort=1&nopg=1', true, false, + 't', 'indexmenu_n', true, true, 2, true, true, [['test', 6]], 0, 1, false, '', '', [''], [''], true, + ":start:,:same:,:inside:", 1, 1 + ] + ], + //root ns, #levels=2, js renderer, all not js specific options + [ + "{{indexmenu>#2 test#6|navbar js#bj_ubuntu.png context tsort dsort msort hsort rsort nsort nons nopg}}", + [ + '', 'bj_ubuntu.png', 'random', true, true, false, 1, false, '&sort=t&msort=indexmenu_n&rsort=1&nsort=1&hsort=1&nopg=1', true, false, + 't', 'indexmenu_n', true, true, 2, true, true, [['test', 6]], 0, 1, true, '', '', [''], [''], true, + ":start:,:same:,:inside:", 1, 1 + ] + ], + //root ns, #levels=1, all options + [ + "{{indexmenu>#1|navbar context nocookie noscroll notoc nomenu dsort msort#date:modified hsort rsort nsort nons nopg max#2#4 maxjs#3 id#54321}}", + [ + '', 'default', 'random', true, true, true, 1, true, '&sort=d&msort=date modified&rsort=1&nsort=1&hsort=1&nopg=1', true, true, + 'd', 'date modified', true, true, 1, true, true, [], 0, 1, false, '', '', [''], [''], true, + ":start:,:same:,:inside:", 1, 1 + ] + ], + //root ns, #levels=1, js renderer, all options + [ + "{{indexmenu>#1|js#bj_ubuntu.png navbar context nocookie noscroll notoc nomenu dsort msort#date:modified hsort rsort nsort nons nopg max#2#4 maxjs#3 id#54321}}", + [ + '', 'bj_ubuntu.png', 54321, true, true, true, 3, true, '&sort=d&msort=date modified&rsort=1&nsort=1&hsort=1&nopg=1&max=4', true, true, + 'd', 'date modified', true, true, 1, true, true, [], 2, 4, true, '', '', [''], [''], true, + ":start:,:same:,:inside:", 1, 1 + ] + ], + //root ns, #levels=1, skipfile and ns + + [ + "{{indexmenu>#1 test|skipfile+/(^myusers:spaces$|privatens:userss)/ skipns=/(^myusers:spaces$|privatens:users)/ id#ns}}", + [ + '', 'default', 'random', false, false, false, 1, false, '&skipns=%3D/%28%5Emyusers%3Aspaces%24%7Cprivatens%3Ausers%29/&skipfile=%2B/%28%5Emyusers%3Aspaces%24%7Cprivatens%3Auserss%29/', false, false, + 0, false, false, false, 1, false, false, [['test', -1]], 0, 1, false, '=/(^myusers:spaces$|privatens:users)/', + '+/(^myusers:spaces$|privatens:userss)/', ['/(^myusers:spaces$|privatens:users)/'], ['', '/(^myusers:spaces$|privatens:userss)/'], false, + ":start:,:same:,:inside:", 1, 1 + ] + ], + //root ns, #levels=1, js renderer, skipfile and ns + [ + "{{indexmenu>#1 test|js skipfile=/(^myusers:spaces$|privatens:userss)/ skipns+/(^myusers:spaces$|privatens:userssss)/ id#ns}}", + [ + '', 'default', 0, false, false, false, 1, false, '&skipns=%2B/%28%5Emyusers%3Aspaces%24%7Cprivatens%3Auserssss%29/&skipfile=%3D/%28%5Emyusers%3Aspaces%24%7Cprivatens%3Auserss%29/', false, false, + 0, false, false, false, 1, false, false, [['test', -1]], 0, 1, true, '+/(^myusers:spaces$|privatens:userssss)/', + '=/(^myusers:spaces$|privatens:userss)/', ['', '/(^myusers:spaces$|privatens:userssss)/'], ['/(^myusers:spaces$|privatens:userss)/'], false, + ":start:,:same:,:inside:", 1, 1 + ] + ] + ]; + } + + /** + * Parse the syntax to options + * expect: different combinations with or without js option, covers recognizing all syntax options + * + * @dataProvider someSyntaxes + */ + public function testHandle($syntax, $changedData) + { + $plugin = new syntax_plugin_indexmenu_indexmenu(); + + $null = new Doku_Handler(); + $result = $plugin->handle($syntax, 0, 40, $null); + + //copy unique generated number, which is about 23 characters + $len_id = strlen($result[1]['identifier']); + if (!is_numeric($changedData[2]) && ($len_id > 18 && $len_id <= 23)) { + $changedData[2] = $result[1]['identifier']; + } + $data = $this->createData($changedData); + + $this->assertEquals($data, $result, 'Data array corrupted'); + } + + + /** + * Data provider + * + * @return array[] + */ + public static function differentNSs() + { + $pageInRoot = 'page'; + $pageInLvl1 = 'ns:page'; + $pageInLvl2 = 'ns1:ns2:page'; + return [ + //indexmenu on page at root level + ['{{indexmenu>|}}', '', [], $pageInRoot], + ['{{indexmenu>#1}}', '', [], $pageInRoot], + ['{{indexmenu>:}}', '', [], $pageInRoot], + ['{{indexmenu>.}}', '', [], $pageInRoot], + ['{{indexmenu>.:}}', '', [], $pageInRoot], + ['{{indexmenu>..}}', '', [], $pageInRoot], + ['{{indexmenu>..:}}', '', [], $pageInRoot], + ['{{indexmenu>myns}}', 'myns', [], $pageInRoot], + ['{{indexmenu>:myns}}', 'myns', [], $pageInRoot], + ['{{indexmenu>.myns}}', 'myns', [], $pageInRoot], + ['{{indexmenu>.:myns}}', 'myns', [], $pageInRoot], + ['{{indexmenu>..myns}}', 'myns', [], $pageInRoot], + ['{{indexmenu>..:myns}}', 'myns', [], $pageInRoot], + + //indexmenu on page in a namespace + ['{{indexmenu>|}}', '', [], $pageInLvl1], + ['{{indexmenu>#1}}', '', [], $pageInLvl1], + ['{{indexmenu>:}}', '', [], $pageInLvl1], + ['{{indexmenu>.}}', 'ns', [], $pageInLvl1], + ['{{indexmenu>.:}}', 'ns', [], $pageInLvl1], + ['{{indexmenu>..}}', '', [], $pageInLvl1], + ['{{indexmenu>..:}}', '', [], $pageInLvl1], + ['{{indexmenu>myns}}', 'myns', [], $pageInLvl1], //was ns:myns + ['{{indexmenu>:myns}}', 'myns', [], $pageInLvl1], + ['{{indexmenu>.myns}}', 'ns:myns', [], $pageInLvl1], + ['{{indexmenu>.:myns}}', 'ns:myns', [], $pageInLvl1], + ['{{indexmenu>..myns}}', 'myns', [], $pageInLvl1], + ['{{indexmenu>..:myns}}', 'myns', [], $pageInLvl1], + ['{{indexmenu>myns:myns}}', 'myns:myns', [], $pageInLvl2], + + //indexmenu on page in a namespace + ['{{indexmenu>|}}', '', [], $pageInLvl2], + ['{{indexmenu>#1}}', '', [], $pageInLvl2], + ['{{indexmenu>:}}', '', [], $pageInLvl2], + ['{{indexmenu>.}}', 'ns1:ns2', [], $pageInLvl2], + ['{{indexmenu>.:}}', 'ns1:ns2', [], $pageInLvl2], + ['{{indexmenu>..}}', '', [], $pageInLvl2], //strange indexmenu specific exception! TODO remove? + ['{{indexmenu>..:}}', 'ns1', [], $pageInLvl2], + ['{{indexmenu>myns}}', 'myns', [], $pageInLvl2], //was ns1:ns2:myns + ['{{indexmenu>:myns}}', 'myns', [], $pageInLvl2], + ['{{indexmenu>.myns}}', 'ns1:ns2:myns', [], $pageInLvl2], + ['{{indexmenu>.:myns}}', 'ns1:ns2:myns', [], $pageInLvl2], + ['{{indexmenu>..myns}}', 'ns1:myns', [], $pageInLvl2], + ['{{indexmenu>..:myns}}', 'ns1:myns', [], $pageInLvl2], + ['{{indexmenu>myns:myns}}', 'myns:myns', [], $pageInLvl2], + + ['{{indexmenu>..:..:myns}}', 'ns1:myns', [], 'ns1:ns2:ns3:page'], + ['{{indexmenu>0}}', '0', [], 'ns1:page'], //was ns1:0 + + //indexmenu on page at root level and subns + ['{{indexmenu> #1|}}', '', [], $pageInLvl2], //no subns, spaces before are removed + ['{{indexmenu>#1 #1}}', '', [['', 1]], $pageInLvl2], + ['{{indexmenu>: :}}', '', [['', -1]], $pageInLvl2], + ['{{indexmenu>. .}}', 'ns1:ns2', [['ns1:ns2', -1]], $pageInLvl2], + ['{{indexmenu>.: .:}}', 'ns1:ns2', [['ns1:ns2', -1]], $pageInLvl2], + ['{{indexmenu>.. ..}}', '', [['', -1]], $pageInLvl2], + ['{{indexmenu>..: ..:}}', 'ns1', [['ns1', -1]], $pageInLvl2], + ['{{indexmenu>myns myns}}', 'myns', [['myns', -1]], $pageInLvl2], //was ns1:ns2:myns + ['{{indexmenu>:myns :myns}}', 'myns', [['myns', -1]], $pageInLvl2], + ['{{indexmenu>.myns .myns}}', 'ns1:ns2:myns', [['ns1:ns2:myns', -1]], $pageInLvl2], + ['{{indexmenu>.:myns .:myns}}', 'ns1:ns2:myns', [['ns1:ns2:myns', -1]], $pageInLvl2], + ['{{indexmenu>..myns ..myns}}', 'ns1:myns', [['ns1:myns', -1]], $pageInLvl2], + ['{{indexmenu>..:myns ..myns}}', 'ns1:myns', [['ns1:myns', -1]], $pageInLvl2], + ['{{indexmenu>myns:myns myns:myns}}', 'myns:myns', [['myns:myns', -1]], $pageInLvl2], + + //indexmenu on page in a namespace + ['{{indexmenu>|}}', '', [], $pageInLvl2], + ['{{indexmenu>#1}}', '', [], $pageInLvl2], + ['{{indexmenu>:}}', '', [], $pageInLvl2], + ['{{indexmenu>.}}', 'ns1:ns2', [], $pageInLvl2], + ['{{indexmenu>.:}}', 'ns1:ns2', [], $pageInLvl2], + ['{{indexmenu>..}}', '', [], $pageInLvl2], //strange indexmenu specific exception! TODO remove? + ['{{indexmenu>..:}}', 'ns1', [], $pageInLvl2], + ['{{indexmenu>myns:}}', 'myns', [], $pageInLvl2], //was ns1:ns2:myns + ['{{indexmenu>:myns:}}', 'myns', [], $pageInLvl2], + ['{{indexmenu>.myns:}}', 'ns1:ns2:myns', [], $pageInLvl2], + ['{{indexmenu>.:myns:}}', 'ns1:ns2:myns', [], $pageInLvl2], + ['{{indexmenu>..myns:}}', 'ns1:myns', [], $pageInLvl2], + ['{{indexmenu>..:myns:}}', 'ns1:myns', [], $pageInLvl2], + ['{{indexmenu>myns:myns:}}', 'myns:myns', [], $pageInLvl2], + ]; + } + + /** + * Parse the syntax to options + * expect: different combinations with or without js option, covers recognizing all syntax options + * + * @dataProvider differentNSs + */ + public function testResolving($syntax, $expectedNs, $expectedSubNss, $pageWithIndexmenu) + { + global $ID; + $ID = $pageWithIndexmenu; + + $plugin = new syntax_plugin_indexmenu_indexmenu(); + + $null = new Doku_Handler(); + $result = $plugin->handle($syntax, 0, 40, $null); + + $this->assertEquals($expectedNs, $result[0], 'check resolved ns'); + $this->assertEquals($expectedSubNss, $result[3]['subnss'], 'check resolved subNSs'); + } + + /** + * Rendering for nonexisting namespace + * expect: no paragraph due to no message set + * expect: one paragraph, since message set + * expect: contains namespace which replaced {{ns}} + * expect: message contained rendered italic syntax + */ + public function testRenderEmptymsg() + { + global $conf; + + $noexistns = 'nonexisting:namespace'; + $emptyindexsyntax = "{{indexmenu>$noexistns}}"; + + $xhtml = new Doku_Renderer_xhtml(); + $plugin = new syntax_plugin_indexmenu_indexmenu(); + + $null = new Doku_Handler(); + $result = $plugin->handle($emptyindexsyntax, 0, 10, $null); + + //no empty message + $plugin->render('xhtml', $xhtml, $result); + + $doc = (new Document())->html($xhtml->doc); + $this->assertEquals(0, $doc->find('p')->count()); + + // Fill in empty message + $conf['plugin']['indexmenu']['empty_msg'] = 'This namespace is //empty//: {{ns}}'; + $plugin->render('xhtml', $xhtml, $result); + $doc = (new Document())->html($xhtml->doc); + + $this->assertEquals(1, $doc->find('p')->count()); +// $this->assertEquals(1, $doc->find("p:contains($noexistns)")->count()); + $this->assertEquals(1, $doc->find("p em")->count()); + } + +} diff --git a/lib/plugins/indexmenu/action.php b/lib/plugins/indexmenu/action.php new file mode 100644 index 0000000..e413c63 --- /dev/null +++ b/lib/plugins/indexmenu/action.php @@ -0,0 +1,561 @@ + + */ + +use dokuwiki\Extension\ActionPlugin; +use dokuwiki\Extension\Event; +use dokuwiki\Extension\EventHandler; +use dokuwiki\plugin\indexmenu\Search; +use dokuwiki\Ui\Index; + +/** + * Class action_plugin_indexmenu + */ +class action_plugin_indexmenu extends ActionPlugin +{ + /** + * plugin should use this method to register its handlers with the dokuwiki's event controller + * + * @param EventHandler $controller DokuWiki's event controller object. + */ + public function register(EventHandler $controller) + { + if ($this->getConf('only_admins')) { + $controller->register_hook('IO_WIKIPAGE_WRITE', 'BEFORE', $this, 'removeSyntaxIfNotAdmin'); + } + if ($this->getConf('page_index') != '') { + $controller->register_hook('TPL_ACT_RENDER', 'BEFORE', $this, 'loadOwnIndexPage'); + } + $controller->register_hook('DOKUWIKI_STARTED', 'AFTER', $this, 'extendJSINFO'); + $controller->register_hook('PARSER_CACHE_USE', 'BEFORE', $this, 'purgeCache'); + if ($this->getConf('show_sort')) { + $controller->register_hook('TPL_CONTENT_DISPLAY', 'BEFORE', $this, 'showSortNumberAtTopOfPage'); + } + $controller->register_hook('AJAX_CALL_UNKNOWN', 'BEFORE', $this, 'ajaxCalls'); + $controller->register_hook('TPL_METAHEADER_OUTPUT', 'BEFORE', $this, 'addStylesForSkins'); + } + + /** + * Check if user has permission to insert indexmenu + * + * @param Event $event + * + * @author Samuele Tognini + */ + public function removeSyntaxIfNotAdmin(Event $event) + { + global $INFO; + if (!$INFO['ismanager']) { + $event->data[0][1] = preg_replace("/{{indexmenu(|_n)>.+?}}/", "", $event->data[0][1]); + } + } + + /** + * Add additional info to $JSINFO + * + * @param Event $event + * + * @author Gerrit Uitslag + * @author Samuele Tognini + */ + public function extendJSINFO(Event $event) + { + global $INFO, $JSINFO; + + $JSINFO['isadmin'] = (int)$INFO['isadmin']; + $JSINFO['isauth'] = isset($INFO['userinfo']) ? (int) $INFO['userinfo'] : 0; + } + + /** + * Check for pages changes and eventually purge cache. + * + * @param Event $event + * + * @author Samuele Tognini + */ + public function purgeCache(Event $event) + { + global $ID; + global $conf; + global $INPUT; + global $INFO; + + /** @var cache_parser $cache */ + $cache = &$event->data; + + if (!isset($cache->page)) return; + //purge only xhtml cache + if ($cache->mode != "xhtml") return; + //Check if it is an indexmenu page + if (!p_get_metadata($ID, 'indexmenu hasindexmenu')) return; + + $aclcache = $this->getConf('aclcache'); + if ($conf['useacl']) { + $newkey = false; + if ($aclcache == 'user') { + //Cache per user + if ($INPUT->server->str('REMOTE_USER')) { + $newkey = $INPUT->server->str('REMOTE_USER'); + } + } elseif ($aclcache == 'groups') { + //Cache per groups + if (isset($INFO['userinfo']['grps'])) { + $newkey = implode('#', $INFO['userinfo']['grps']); + } + } + if ($newkey) { + $cache->key .= "#" . $newkey; + $cache->cache = getCacheName($cache->key, $cache->ext); + } + } + //Check if a page is more recent than purgefile. + if (@filemtime($cache->cache) < @filemtime($conf['cachedir'] . '/purgefile')) { + $event->preventDefault(); + $event->stopPropagation(); + $event->result = false; + } + } + + /** + * Render a defined page as index. + * + * @param Event $event + * + * @author Samuele Tognini + */ + public function loadOwnIndexPage(Event $event) + { + if ('index' != $event->data) return; + if (!file_exists(wikiFN($this->getConf('page_index')))) return; + + global $lang; + + echo '

    ' . $lang['btn_index'] . "

    \n"; + echo p_wiki_xhtml($this->getConf('page_index')); + $event->preventDefault(); + $event->stopPropagation(); + } + + /** + * Display the indexmenu sort number. + * + * @param Event $event + * + * @author Samuele Tognini + */ + public function showSortNumberAtTopOfPage(Event $event) + { + global $ID, $ACT, $INFO; + if ($INFO['isadmin'] && $ACT == 'show') { + if ($n = p_get_metadata($ID, 'indexmenu_n')) { + echo '
    '; + echo $this->getLang('showsort') . $n; + echo '
    '; + } + } + } + + /** + * Handles ajax requests for indexmenu + * + * @param Event $event + */ + public function ajaxCalls(Event $event) + { + if ($event->data !== 'indexmenu') { + return; + } + //no other ajax call handlers needed + $event->stopPropagation(); + $event->preventDefault(); + + global $INPUT; + switch ($INPUT->str('req')) { + case 'local': + //list themes + $this->getlocalThemes(); + break; + + case 'toc': + //print toc preview + if ($INPUT->has('id')) { + echo $this->printToc($INPUT->str('id')); + } + break; + + case 'index': + //for dTree + //retrieval of data of the extra nodes for the indexmenu (if ajax loading set with max#m(#n) + if ($INPUT->has('idx')) { + echo $this->printIndex($INPUT->str('idx')); + } + break; + + case 'fancytree': + //data for new index build with Fancytree + $this->getDataFancyTree(); + break; + } + } + + /** + * Handles ajax requests for FancyTree + * + * @return void + */ + private function getDataFancyTree() + { + global $INPUT; + + $ns = $INPUT->str('ns', ''); + $ns = rtrim($ns, ':'); + //key of directory has extra : on the end + $level = -1; //opened levels. -1=all levels open + $max = 1; //levels to load by lazyloading. Before the default was 0. CHANGED to 1. + $skipFileCombined = []; + $skipNsCombined = []; + + if ($INPUT->int('max') > 0) { + $max = $INPUT->int('max'); // max#n#m, if init: #n, otherwise #m + $level = $max; + } + if ($INPUT->int('level', -10) >= -1) { + $level = $INPUT->int('level'); + } + $isInit = $INPUT->bool('init'); + + $currentPage = $INPUT->str('currentpage'); + if ($isInit) { + $subnss = $INPUT->arr('subnss'); + // if 'navbar' is enabled add current ns to list + if ($INPUT->bool('navbar')) { + $currentNs = getNS($currentPage); + if ($currentNs !== false) { + $subnss[] = [$currentNs, 1]; + } + } + // alternative, via javascript.. https://wwwendt.de/tech/fancytree/doc/jsdoc/Fancytree.html#loadKeyPath + } else { + //not set via javascript at the moment.. ajax opens per level, so subnss has no use here + $subnss = $INPUT->str('subnss'); + if ($subnss !== '') { + $subnss = [[cleanID($subnss), 1]]; + } + } + + $skipf = $INPUT->str('skipfile'); + $skipFileCombined[] = $this->getConf('skip_file'); + if (!empty($skipf)) { + $index = 0; + //prefix is '=' or '+' + if ($skipf[0] == '+') { + $index = 1; + } + $skipFileCombined[$index] = substr($skipf, 1); + } + $skipn = $INPUT->str('skipns'); + $skipNsCombined[] = $this->getConf('skip_index'); + if (!empty($skipn)) { + $index = 0; + //prefix is '=' or '+' + if ($skipn[0] == '+') { + $index = 1; + } + $skipNsCombined[$index] = substr($skipn, 1); + } + + $opts = [ + //only set for init, lazy requests equal to max + 'level' => $level, + //nons only needed for init as it has no nested nodes + 'nons' => $INPUT->bool('nons'), + 'nopg' => $INPUT->bool('nopg'), + //init with complex array, empty if lazy loading + 'subnss' => $subnss, + 'max' => $max, + 'skipnscombined' => $skipNsCombined, + 'skipfilecombined' => $skipFileCombined, + 'headpage' => $this->getConf('headpage'), + 'hide_headpage' => $this->getConf('hide_headpage'), + ]; + + $sort = [ + 'sort' => $INPUT->str('sort'), + 'msort' => $INPUT->str('msort'), + 'rsort' => $INPUT->bool('rsort'), + 'nsort' => $INPUT->bool('nsort'), + 'group' => $INPUT->bool('group'), + 'hsort' => $INPUT->bool('hsort') + ]; + + $opts['tempNew'] = true; //TODO temporary for recognizing treenew in the search function + + $search = new Search($sort); + $data = $search->search($ns, $opts); + $fancytreeData = $search->buildFancytreeData($data, $isInit, $currentPage, $opts['nopg']); + + //add eventually debug info + if ($isInit) { + //for lazy loading are other items than children not supported. +// $fancytreeData['opts'] = $opts; +// $fancytreeData['sort'] = $sort; +// $fancytreeData['debug'] = $data; + } else { + //returns only children, therefore, add debug info to first child +// $fancytreeData[0]['opts'] = $opts; +// $fancytreeData[0]['sort'] = $sort; +// $fancytreeData[0]['debug'] = $data; + } + + header('Content-Type: application/json'); + echo json_encode($fancytreeData); + } + + /** + * Print a list of local themes + * + * @author Samuele Tognini + * @author Gerrit Uitslag + */ + private function getlocalThemes() + { + header('Content-Type: application/json'); + + $themebase = 'lib/plugins/indexmenu/images'; + + $handle = @opendir(DOKU_INC . $themebase); + $themes = []; + while (false !== ($file = readdir($handle))) { + if ( + is_dir(DOKU_INC . $themebase . '/' . $file) + && $file != "." + && $file != ".." + && $file != "repository" + && $file != "tmp" + && $file != ".svn" + ) { + $themes[] = $file; + } + } + closedir($handle); + sort($themes); + + echo json_encode([ + 'themebase' => $themebase, + 'themes' => $themes + ]); + } + + /** + * Print a toc preview + * + * @param string $id + * @return string + * + * @author Samuele Tognini + * @author Andreas Gohr + */ + private function printToc($id) + { + $id = cleanID($id); + if (auth_quickaclcheck($id) < AUTH_READ) return ''; + + $meta = p_get_metadata($id); + $toc = $meta['description']['tableofcontents'] ?? []; + + if (count($toc) > 1) { + //display ToC of two or more headings + $out = $this->renderToc($toc); + } else { + //display page abstract + $out = $this->renderAbstract($id, $meta); + } + return $out; + } + + /** + * Return the TOC rendered to XHTML + * + * @param $toc + * @return string + * + * @author Andreas Gohr + * @author Gerrit Uitslag + */ + private function renderToc($toc) + { + global $lang; + $out = '
    '; + $out .= $lang['toc']; + $out .= '
    '; + $out .= '
    '; + $out .= html_buildlist($toc, 'toc', [$this, 'formatIndexmenuListTocItem'], null, true); + $out .= '
    '; + return $out; + } + + /** + * Return the page abstract rendered to XHTML + * + * @param $id + * @param array $meta by reference + * @return string + */ + private function renderAbstract($id, $meta) + { + $out = ''; + if ($meta['description']['abstract']) { + $out .= '
    '; + $out .= p_render('xhtml', p_get_instructions($meta['description']['abstract']), $info); + $out .= '
    '; + } + return $out; + } + + /** + * Callback for html_buildlist + * + * @param $item + * @return string + */ + public function formatIndexmenuListTocItem($item) + { + global $INPUT; + + $id = cleanID($INPUT->str('id')); + + if (isset($item['hid'])) { + $link = '#' . $item['hid']; + } else { + $link = $item['link']; + } + + //prefix anchers with page id + if ($link[0] == '#') { + $link = wl($id, $link, false, ''); + } + return '' . hsc($item['title']) . ''; + } + + /** + * Print index nodes + * + * @param $ns + * @return string + * + * @author Rene Hadler + * @author Samuele Tognini + * @author Andreas Gohr + */ + private function printIndex($ns) + { + global $conf, $INPUT; + $idxm = new syntax_plugin_indexmenu_indexmenu(); + $ns = $idxm->parseNs(rawurldecode($ns)); + $level = -1; + $max = 0; + $data = []; + $skipfilecombined = []; + $skipnscombined = []; + + if ($INPUT->int('max') > 0) { + $max = $INPUT->int('max'); + $level = $max; + } + $nss = $INPUT->str('nss', '', true); + $sort['sort'] = $INPUT->str('sort', '', true); + $sort['msort'] = $INPUT->str('msort', '', true); + $sort['rsort'] = $INPUT->bool('rsort', false, true); + $sort['nsort'] = $INPUT->bool('nsort', false, true); + $sort['group'] = $INPUT->bool('group', false, true); + $sort['hsort'] = $INPUT->bool('hsort', false, true); + $search = new Search($sort); + $fsdir = "/" . utf8_encodeFN(str_replace(':', '/', $ns)); + + $skipf = utf8_decodeFN($INPUT->str('skipfile')); + $skipfilecombined[] = $this->getConf('skip_file'); + if (!empty($skipf)) { + $index = 0; + if ($skipf[0] == '+') { + $index = 1; + } + $skipfilecombined[$index] = substr($skipf, 1); + } + $skipn = utf8_decodeFN($INPUT->str('skipns')); + $skipnscombined[] = $this->getConf('skip_index'); + if (!empty($skipn)) { + $index = 0; + if ($skipn[0] == '+') { + $index = 1; + } + $skipnscombined[$index] = substr($skipn, 1); + } + + $opts = [ + 'level' => $level, + 'nons' => $INPUT->bool('nons', false, true), + 'nss' => [[$nss, 1]], + 'max' => $max, + 'js' => false, + 'nopg' => $INPUT->bool('nopg', false, true), + 'skipnscombined' => $skipnscombined, + 'skipfilecombined' => $skipfilecombined, + 'headpage' => $idxm->getConf('headpage'), + 'hide_headpage' => $idxm->getConf('hide_headpage') + ]; + if ($sort['sort'] || $sort['msort'] || $sort['rsort'] || $sort['hsort']) { + $search->customSearch($data, $conf['datadir'], [$search, 'searchIndexmenuItems'], $opts, $fsdir); + } else { + search($data, $conf['datadir'], [$search, 'searchIndexmenuItems'], $opts, $fsdir); + } + + $out = ''; + if ($INPUT->int('nojs') === 1) { + $idx = new Index(); + $out_tmp = html_buildlist($data, 'idx', [$idxm, 'formatIndexmenuItem'], [$idx, 'tagListItem']); + $out .= preg_replace('/
    '; + $html .= ''; + + return $html; + } + +} diff --git a/lib/tpl/bootstrap3/compat/inc/Menu/PageMenu.php b/lib/tpl/bootstrap3/compat/inc/Menu/PageMenu.php new file mode 100644 index 0000000..9c0a55e --- /dev/null +++ b/lib/tpl/bootstrap3/compat/inc/Menu/PageMenu.php @@ -0,0 +1,23 @@ + + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +global $updateVersion; +$dokuwiki_version = floatval($updateVersion); + +define('DOKU_VERSION', $dokuwiki_version); +define('DOKU_VERSION_HOGFATHER', 51); // 2020-07-29 +define('DOKU_VERSION_GREEBO', 50); // 2018-04-22 (PHP >= 5.6) +define('DOKU_VERSION_FRUSTERICK_MANNERS', 49); // 2017-02-19 (PHP >= 5.4 ???) +define('DOKU_VERSION_ELENOR_OF_TSORT', 48); // 2016-06-26 +define('DOKU_VERSION_DETRITUS', 47); // 2015-08-10 (PHP >= 5.3.3) + + +// Load compatibility Menu classes for pre-Greebo releases +if (DOKU_VERSION > 0 && DOKU_VERSION < DOKU_VERSION_GREEBO) { + + define('DOKU_INC_COMPAT', realpath(dirname(__FILE__) . '/../') . '/'); + + require DOKU_INC_COMPAT . "inc/Menu/MenuInterface.php"; + require DOKU_INC_COMPAT . "inc/Menu/AbstractMenu.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/AbstractItem.php"; + + require DOKU_INC_COMPAT . "inc/Menu/UserMenu.php"; + require DOKU_INC_COMPAT . "inc/Menu/MobileMenu.php"; + require DOKU_INC_COMPAT . "inc/Menu/PageMenu.php"; + require DOKU_INC_COMPAT . "inc/Menu/SiteMenu.php"; + require DOKU_INC_COMPAT . "inc/Menu/DetailMenu.php"; + + require DOKU_INC_COMPAT . "inc/Menu/Item/ImgBackto.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Top.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Edit.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Profile.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Revisions.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Backlink.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Back.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Login.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Index.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Register.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/MediaManager.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Subscribe.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Recent.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Media.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Resendpwd.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Admin.php"; + require DOKU_INC_COMPAT . "inc/Menu/Item/Revert.php"; + +} + +// Load template class for previous "Frusterick Manners" (2017-02-19) releases +if (DOKU_VERSION < DOKU_VERSION_FRUSTERICK_MANNERS) { + + $tpl_incdir = tpl_incdir(); + + require $tpl_incdir . 'Template.php'; + require $tpl_incdir . 'SVG.php'; + +} + +/** + * copied from core (available since Greebo) + */ +if (!function_exists('inlineSVG')) { + + 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('//i', '', $content); // doc type + $content = preg_replace('/>\s+<', $content); // newlines between tags + $content = trim($content); + if (substr($content, 0, 5) !== ' $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(); + } + +} + +/** + * copied from core (available since Binky) + */ +if (!function_exists('tpl_classes')) { + + function tpl_classes() + { + global $ACT, $conf, $ID, $INFO; + + $classes = array( + 'dokuwiki', + 'mode_' . $ACT, + 'tpl_' . $conf['template'], + !empty($_SERVER['REMOTE_USER']) ? 'loggedIn' : '', + $INFO['exists'] ? '' : 'notFound', + ($ID == $conf['start']) ? 'home' : '', + ); + + return join(' ', $classes); + } + +} + +/** + * copied from core (available since Detritus) + */ +if (!function_exists('plugin_getRequestAdminPlugin')) { + + 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/lib/tpl/bootstrap3/compat/lib/images/menu/00-default_checkbox-blank-circle-outline.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/00-default_checkbox-blank-circle-outline.svg new file mode 100644 index 0000000..e8f8c07 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/00-default_checkbox-blank-circle-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/01-edit_pencil.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/01-edit_pencil.svg new file mode 100644 index 0000000..e3a4faa --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/01-edit_pencil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/02-create_pencil.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/02-create_pencil.svg new file mode 100644 index 0000000..4c30b49 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/02-create_pencil.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/03-draft_android-studio.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/03-draft_android-studio.svg new file mode 100644 index 0000000..589658d --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/03-draft_android-studio.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/04-show_file-document.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/04-show_file-document.svg new file mode 100644 index 0000000..0eed274 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/04-show_file-document.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/05-source_file-xml.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/05-source_file-xml.svg new file mode 100644 index 0000000..7e00342 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/05-source_file-xml.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/06-revert_replay.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/06-revert_replay.svg new file mode 100644 index 0000000..0911e5b --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/06-revert_replay.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/07-revisions_history.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/07-revisions_history.svg new file mode 100644 index 0000000..cedbc1b --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/07-revisions_history.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/08-backlink_link-variant.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/08-backlink_link-variant.svg new file mode 100644 index 0000000..4d639a5 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/08-backlink_link-variant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/09-subscribe_email-outline.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/09-subscribe_email-outline.svg new file mode 100644 index 0000000..3b23dac --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/09-subscribe_email-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/10-top_arrow-up.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/10-top_arrow-up.svg new file mode 100644 index 0000000..61003a8 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/10-top_arrow-up.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/11-mediamanager_folder-image.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/11-mediamanager_folder-image.svg new file mode 100644 index 0000000..4376fdf --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/11-mediamanager_folder-image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/12-back_arrow-left.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/12-back_arrow-left.svg new file mode 100644 index 0000000..d8011b1 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/12-back_arrow-left.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/account-card-details.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/account-card-details.svg new file mode 100644 index 0000000..ba74256 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/account-card-details.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/account-plus.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/account-plus.svg new file mode 100644 index 0000000..a978bf1 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/account-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/calendar-clock.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/calendar-clock.svg new file mode 100644 index 0000000..b19735d --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/calendar-clock.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/file-tree.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/file-tree.svg new file mode 100644 index 0000000..0f26188 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/file-tree.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/folder-multiple-image.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/folder-multiple-image.svg new file mode 100644 index 0000000..f66aaad --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/folder-multiple-image.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/lock-reset.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/lock-reset.svg new file mode 100644 index 0000000..49693c6 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/lock-reset.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/login.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/login.svg new file mode 100644 index 0000000..07a9896 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/login.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/logout.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/logout.svg new file mode 100644 index 0000000..97d3158 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/logout.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/compat/lib/images/menu/settings.svg b/lib/tpl/bootstrap3/compat/lib/images/menu/settings.svg new file mode 100644 index 0000000..ced9871 --- /dev/null +++ b/lib/tpl/bootstrap3/compat/lib/images/menu/settings.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/conf/default.php b/lib/tpl/bootstrap3/conf/default.php new file mode 100644 index 0000000..abe97ed --- /dev/null +++ b/lib/tpl/bootstrap3/conf/default.php @@ -0,0 +1,88 @@ + + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +$conf['bootstrapTheme'] = 'default'; +$conf['bootswatchTheme'] = 'yeti'; +$conf['browserTitle'] = '@TITLE@ [@WIKI@]'; +$conf['browserTitleCharSepNS'] = '-'; +$conf['browserTitleOrderNS'] = 'normal'; +$conf['browserTitleShowNS'] = 0; +$conf['collapsibleSections'] = 0; +$conf['cookieLawBannerPage'] = 'cookie:banner'; +$conf['cookieLawPolicyPage'] = 'cookie:policy'; +$conf['customTheme'] = ''; +$conf['discussionPage'] = 'discussion:@ID@'; +$conf['domParserMaxPageSize'] = 600000; +$conf['fixedTopNavbar'] = 1; +$conf['fluidContainer'] = 1; +$conf['googleAnalyticsAnonymizeIP'] = 0; +$conf['googleAnalyticsNoTrackAdmin'] = 1; +$conf['googleAnalyticsNoTrackPages'] = ''; +$conf['googleAnalyticsNoTrackUsers'] = 0; +$conf['googleAnalyticsTrackActions'] = 0; +$conf['googleAnalyticsTrackID'] = ''; +$conf['gravatarURL'] = 'https://secure.gravatar.com/avatar'; +$conf['hideInThemeSwitcher'] = ''; +$conf['hideLoginLink'] = 0; +$conf['homePageURL'] = ''; +$conf['individualTools'] = 0; +$conf['inverseNavbar'] = 0; +$conf['landingPages'] = '(intro)'; +$conf['leftSidebarGrid'] = 'col-sm-3 col-md-2'; +$conf['libravatarURL'] = 'https://seccdn.libravatar.org/avatar'; +$conf['navbarLabels'] = 'login,register'; +$conf['office365URL'] = 'https://outlook.office365.com'; +$conf['pageIcons'] = 'social-share,feed,send-mail,permalink,print,help'; +$conf['pageInfo'] = 'filename,extension,date,editor,locked'; +$conf['pageInfoDateFormat'] = 'dformat'; +$conf['pageOnPanel'] = 1; +$conf['rightSidebar'] = 'rightsidebar'; +$conf['rightSidebarGrid'] = 'col-sm-3 col-md-2'; +$conf['schemaOrgType'] = 'Article'; +$conf['showAddNewPage'] = 'never'; +$conf['showAdminMenu'] = 0; +$conf['showBadges'] = 1; +$conf['showCookieLawBanner'] = 0; +$conf['showDiscussion'] = 0; +$conf['showEditBtn'] = 'never'; +$conf['showHomePageLink'] = 0; +$conf['showIndividualTool'] = 'site,page'; +$conf['showLandingPage'] = 0; +$conf['showLoginOnFooter'] = 0; +$conf['showNavbar'] = 'always'; +$conf['showPageIcons'] = 1; +$conf['showPageId'] = 1; +$conf['showPageInfo'] = 1; +$conf['showPageTools'] = 'always'; +$conf['showSearchForm'] = 'always'; +$conf['showSemanticPopup'] = 0; +$conf['showThemeSwitcher'] = 0; +$conf['showTools'] = 'always'; +$conf['showTranslation'] = 0; +$conf['showUserHomeLink'] = 1; +$conf['showWikiInfo'] = 1; +$conf['sidebarOnNavbar'] = 0; +$conf['sidebarPosition'] = 'left'; +$conf['sidebarShowPageTitle'] = 1; +$conf['socialShareProviders'] = 'facebook,google-plus,linkedin,pinterest,whatsapp,twitter,telegram,yammer,reddit,microsoft-teams'; +$conf['tableFullWidth'] = 1; +$conf['tableStyle'] = 'striped,condensed,responsive'; +$conf['tagsOnTop'] = 1; +$conf['themeByNamespace'] = 0; +$conf['tocAffix'] = 1; +$conf['tocCollapseOnScroll'] = 1; +$conf['tocCollapseSubSections'] = 1; +$conf['tocCollapsed'] = 0; +$conf['tocLayout'] = 'default'; +$conf['useACL'] = 0; +$conf['useAlternativeToolbarIcons'] = 1; +$conf['useAnchorJS'] = 1; +$conf['useAvatar'] = 'off'; +$conf['useGoogleAnalytics'] = 0; +$conf['notifyExtensionsUpdate'] = 0; +$conf['disableSearchSuggest'] = 0; diff --git a/lib/tpl/bootstrap3/conf/metadata.php b/lib/tpl/bootstrap3/conf/metadata.php new file mode 100644 index 0000000..5ff5f34 --- /dev/null +++ b/lib/tpl/bootstrap3/conf/metadata.php @@ -0,0 +1,112 @@ + + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + + +// Theme +$meta['bootstrapTheme'] = array('multichoice', '_choices' => array('default', 'optional', 'custom', 'bootswatch')); +$meta['bootswatchTheme'] = array('multichoice', '_choices' => array('cerulean', 'cosmo', 'cyborg', 'darkly', 'flatly', 'journal', 'lumen', 'paper', 'readable', 'sandstone', 'simplex', 'solar', 'slate', 'spacelab', 'superhero', 'united', 'yeti')); +$meta['customTheme'] = array('string'); +$meta['showThemeSwitcher'] = array('onoff'); +$meta['hideInThemeSwitcher'] = array('multicheckbox', '_choices' => $meta['bootswatchTheme']['_choices']); +$meta['themeByNamespace'] = array('onoff'); + +// Sidebar +$meta['sidebarPosition'] = array('multichoice', '_choices' => array('left', 'right')); +$meta['rightSidebar'] = array('string'); +$meta['leftSidebarGrid'] = array('string'); +$meta['rightSidebarGrid'] = array('string'); +$meta['sidebarOnNavbar'] = array('onoff'); +$meta['sidebarShowPageTitle'] = array('onoff'); + +// Navbar +$meta['inverseNavbar'] = array('onoff'); +$meta['fixedTopNavbar'] = array('onoff'); +$meta['showTranslation'] = array('onoff'); +$meta['showTools'] = array('multichoice', '_choices' => array('never', 'logged', 'always')); +$meta['showHomePageLink'] = array('onoff'); +$meta['homePageURL'] = array('string', '_caution' => 'warning'); +$meta['showUserHomeLink'] = array('onoff'); +$meta['hideLoginLink'] = array('onoff'); +$meta['showEditBtn'] = array('multichoice', '_choices' => array('never', 'logged', 'always')); +$meta['individualTools'] = array('onoff'); +$meta['showIndividualTool'] = array('multicheckbox', '_choices' => array('user', 'site', 'page')); +$meta['showSearchForm'] = array('multichoice', '_choices' => array('never', 'logged', 'always')); +$meta['showAdminMenu'] = array('onoff'); +$meta['showNavbar'] = array('multichoice', '_choices' => array('logged', 'always')); +$meta['navbarLabels'] = array('multicheckbox', '_choices' => array('login', 'register', 'admin', 'tools', 'user', 'site', 'page', 'themes', 'expand', 'profile')); +$meta['showAddNewPage'] = array('multichoice', '_choices' => array('never', 'logged', 'always')); +$meta['notifyExtensionsUpdate'] = array('onoff'); +$meta['disableSearchSuggest'] = array('onoff'); + +// Semantic +$meta['schemaOrgType'] = array('multichoice', '_choices' => array('Article', 'NewsArticle', 'TechArticle', 'BlogPosting', 'Recipe')); +$meta['showSemanticPopup'] = array('onoff'); + +// Layout +$meta['fluidContainer'] = array('onoff'); +$meta['pageOnPanel'] = array('onoff'); +$meta['tableFullWidth'] = array('onoff'); +$meta['tableStyle'] = array('multicheckbox', '_choices' => array('striped', 'bordered', 'hover', 'condensed', 'responsive')); +$meta['showLandingPage'] = array('onoff'); +$meta['landingPages'] = array('regex'); +$meta['showPageTools'] = array('multichoice', '_choices' => array('never', 'logged', 'always')); +$meta['showPageId'] = array('onoff'); +$meta['showBadges'] = array('onoff'); +$meta['showLoginOnFooter'] = array('onoff'); +$meta['showWikiInfo'] = array('onoff'); + +// TOC +$meta['tocAffix'] = array('onoff'); +$meta['tocCollapseSubSections'] = array('onoff'); +$meta['tocCollapseOnScroll'] = array('onoff'); +$meta['tocCollapsed'] = array('onoff'); +$meta['tocLayout'] = array('multichoice', '_choices' => array('default', 'navbar')); + +// Discussion +$meta['showDiscussion'] = array('onoff'); +$meta['discussionPage'] = array('string'); + +// Avatar +$meta['useAvatar'] = array('multichoice', '_choices' => array('off', 'gravatar', 'libravatar', 'office365', 'activedirectory', 'local')); +$meta['gravatarURL'] = array('string'); +$meta['libravatarURL'] = array('string'); +$meta['office365URL'] = array('string'); + +// Cookie Law +$meta['showCookieLawBanner'] = array('onoff'); +$meta['cookieLawBannerPage'] = array('string'); +$meta['cookieLawPolicyPage'] = array('string'); + +// Google Analytics +$meta['useGoogleAnalytics'] = array('onoff'); +$meta['googleAnalyticsTrackID'] = array('string'); +$meta['googleAnalyticsAnonymizeIP'] = array('onoff'); +$meta['googleAnalyticsNoTrackAdmin'] = array('onoff'); +$meta['googleAnalyticsNoTrackUsers'] = array('onoff'); +$meta['googleAnalyticsNoTrackPages'] = array('regex'); +$meta['googleAnalyticsTrackActions'] = array('onoff'); + +// Browser Title +$meta['browserTitle'] = array('string'); +$meta['browserTitleShowNS'] = array('onoff'); +$meta['browserTitleCharSepNS'] = array('multichoice', '_choices' => array('-', '|', ',', '/', '>')); +$meta['browserTitleOrderNS'] = array('multichoice', '_choices' => array('normal', 'reverse')); + +// Page +$meta['showPageInfo'] = array('onoff'); +$meta['useACL'] = array('onoff', '_caution' => 'warning'); +$meta['pageInfo'] = array('multicheckbox', '_choices' => array('filename', 'extension', 'date', 'editor', 'locked')); +$meta['pageInfoDateFormat'] = array('multichoice', '_choices' => array('dformat', 'human')); +$meta['showPageIcons'] = array('onoff'); +$meta['pageIcons'] = array('multicheckbox', '_choices' => array('social-share', 'feed', 'send-mail', 'permalink', 'print', 'help')); +$meta['socialShareProviders'] = array('multicheckbox', '_choices' => array('facebook', 'linkedin', 'microsoft-teams', 'pinterest', 'whatsapp', 'reddit', 'twitter', 'telegram', 'yammer')); +$meta['useAlternativeToolbarIcons'] = array('onoff'); +$meta['tagsOnTop'] = array('onoff'); +$meta['useAnchorJS'] = array('onoff'); +$meta['collapsibleSections'] = array('onoff'); +$meta['domParserMaxPageSize'] = array('numeric', '_min' => 0); diff --git a/lib/tpl/bootstrap3/css.php b/lib/tpl/bootstrap3/css.php new file mode 100644 index 0000000..fe2a782 --- /dev/null +++ b/lib/tpl/bootstrap3/css.php @@ -0,0 +1,183 @@ + + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +# NOTE Some Linux distributon change the location of DokuWiki core libraries (DOKU_INC) +# +# Bitnami (Docker) /opt/bitnami/dokuwiki +# LinuxServer.io (Docker) /app/dokuwiki +# Arch Linux /usr/share/webapps/dokuwiki +# Debian/Ubuntu /usr/share/dokuwiki +# +# NOTE If DokuWiki core libraries (DOKU_INC) is in another location you can +# create a PHP file in bootstrap3 root directory called "doku_inc.php" with +# this content: +# +# str('id', null)); + +$bootstrap_theme = tpl_getConf('bootstrapTheme'); +$bootswatch_theme = tpl_getConf('bootswatchTheme'); +$custom_theme = tpl_getConf('customTheme'); +$theme_by_namespace = tpl_getConf('themeByNamespace'); +$tpl_basedir = tpl_basedir(); +$tpl_incdir = tpl_incdir(); +$themes_filename = DOKU_CONF . 'bootstrap3.themes.conf'; +$stylesheets = array(); +$bootswatch_themes = array('cerulean', 'cosmo', 'cyborg', 'darkly', 'flatly', 'journal', 'lumen', 'paper', 'readable', 'sandstone', 'simplex', 'solar', 'slate', 'spacelab', 'superhero', 'united', 'yeti'); + +# Check Theme Switcher +if (tpl_getConf('showThemeSwitcher')) { + if (get_doku_pref('bootswatchTheme', null) !== null && get_doku_pref('bootswatchTheme', null) !== '') { + $bootswatch_theme = get_doku_pref('bootswatchTheme', null); + } + + if (!in_array($bootswatch_theme, $bootswatch_themes)) { + $bootswatch_theme = 'default'; + } +} + +# Check Theme by Namespace +if ($theme_by_namespace && file_exists($themes_filename)) { + $config = confToHash($themes_filename); + krsort($config); + $theme_found = false; + + foreach ($config as $page => $theme) { + if (preg_match("/^$page/", "$ID")) { + list($bootstrap_theme, $bootswatch_theme) = explode('/', $theme); + + if ($bootstrap_theme && in_array($bootstrap_theme, array('default', 'optional', 'custom'))) { + $theme_found = true; + break; + } + + if ($bootstrap_theme == 'bootswatch' && in_array($bootswatch_theme, $bootswatch_themes)) { + $theme_found = true; + break; + } + } + } +} + +# Check $ID and unload the template +if ($theme_by_namespace && file_exists($themes_filename) && !$ID) { + $bootstrap_theme = 'none'; +} + +switch ($bootstrap_theme) { + case 'optional': + $stylesheets[] = 'assets/bootstrap/default/bootstrap.min.css'; + $stylesheets[] = 'assets/bootstrap/default/bootstrap-theme.min.css'; + break; + + case 'custom': + $stylesheets[] = $custom_theme; + break; + + case 'bootswatch': + + $bootswatch_url = 'assets/bootstrap'; + + if (file_exists($tpl_incdir . "assets/fonts/$bootswatch_theme.fonts.css")) { + $stylesheets[] = "assets/fonts/$bootswatch_theme.fonts.css"; + } + + $stylesheets[] = "$bootswatch_url/$bootswatch_theme/bootstrap.min.css"; + break; + + case 'none': + break; + + case 'default': + default: + $stylesheets[] = 'assets/bootstrap/default/bootstrap.min.css'; + break; +} + +$content = ''; + +foreach ($stylesheets as $style) { + $content .= "@import url($style);" . NL; +} + +print $content; diff --git a/lib/tpl/bootstrap3/css/bs4-utilities.less b/lib/tpl/bootstrap3/css/bs4-utilities.less new file mode 100644 index 0000000..d3c7775 --- /dev/null +++ b/lib/tpl/bootstrap3/css/bs4-utilities.less @@ -0,0 +1,2707 @@ +/*! + * Bootstrap v4 utilities backport for Bootstrap v3 + * + * Copyright 2019 Giuseppe Di Terlizzi + * Copyright 2011-2019 The Bootstrap Authors + * Copyright 2011-2019 Twitter, Inc. + * Licensed under MIT (https://github.com/twbs/bootstrap/blob/master/LICENSE) + */ +.align-baseline { + vertical-align: baseline !important; } + +.align-top { + vertical-align: top !important; } + +.align-middle { + vertical-align: middle !important; } + +.align-bottom { + vertical-align: bottom !important; } + +.align-text-bottom { + vertical-align: text-bottom !important; } + +.align-text-top { + vertical-align: text-top !important; } + +.border { + border: 1px solid #dee2e6 !important; } + +.border-top { + border-top: 1px solid #dee2e6 !important; } + +.border-right { + border-right: 1px solid #dee2e6 !important; } + +.border-bottom { + border-bottom: 1px solid #dee2e6 !important; } + +.border-left { + border-left: 1px solid #dee2e6 !important; } + +.border-0 { + border: 0 !important; } + +.border-top-0 { + border-top: 0 !important; } + +.border-right-0 { + border-right: 0 !important; } + +.border-bottom-0 { + border-bottom: 0 !important; } + +.border-left-0 { + border-left: 0 !important; } + +.border-primary { + border-color: #007bff !important; } + +.border-secondary { + border-color: #6c757d !important; } + +.border-success { + border-color: #28a745 !important; } + +.border-info { + border-color: #17a2b8 !important; } + +.border-warning { + border-color: #ffc107 !important; } + +.border-danger { + border-color: #dc3545 !important; } + +.border-light { + border-color: #f8f9fa !important; } + +.border-dark { + border-color: #343a40 !important; } + +.border-white { + border-color: #fff !important; } + +.rounded-sm { + border-radius: 0.2rem !important; } + +.rounded { + border-radius: 0.25rem !important; } + +.rounded-top { + border-top-left-radius: 0.25rem !important; + border-top-right-radius: 0.25rem !important; } + +.rounded-right { + border-top-right-radius: 0.25rem !important; + border-bottom-right-radius: 0.25rem !important; } + +.rounded-bottom { + border-bottom-right-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; } + +.rounded-left { + border-top-left-radius: 0.25rem !important; + border-bottom-left-radius: 0.25rem !important; } + +.rounded-lg { + border-radius: 0.3rem !important; } + +.rounded-circle { + border-radius: 50% !important; } + +.rounded-pill { + border-radius: 50rem !important; } + +.rounded-0 { + border-radius: 0 !important; } + +.clearfix::after { + display: block; + clear: both; + content: ""; } + +.d-none { + display: none !important; } + +.d-inline { + display: inline !important; } + +.d-inline-block { + display: inline-block !important; } + +.d-block { + display: block !important; } + +.d-table { + display: table !important; } + +.d-table-row { + display: table-row !important; } + +.d-table-cell { + display: table-cell !important; } + +.d-flex { + display: flex !important; } + +.d-inline-flex { + display: inline-flex !important; } + +@media (min-width: 576px) { + .d-sm-none { + display: none !important; } + + .d-sm-inline { + display: inline !important; } + + .d-sm-inline-block { + display: inline-block !important; } + + .d-sm-block { + display: block !important; } + + .d-sm-table { + display: table !important; } + + .d-sm-table-row { + display: table-row !important; } + + .d-sm-table-cell { + display: table-cell !important; } + + .d-sm-flex { + display: flex !important; } + + .d-sm-inline-flex { + display: inline-flex !important; } } +@media (min-width: 768px) { + .d-md-none { + display: none !important; } + + .d-md-inline { + display: inline !important; } + + .d-md-inline-block { + display: inline-block !important; } + + .d-md-block { + display: block !important; } + + .d-md-table { + display: table !important; } + + .d-md-table-row { + display: table-row !important; } + + .d-md-table-cell { + display: table-cell !important; } + + .d-md-flex { + display: flex !important; } + + .d-md-inline-flex { + display: inline-flex !important; } } +@media (min-width: 992px) { + .d-lg-none { + display: none !important; } + + .d-lg-inline { + display: inline !important; } + + .d-lg-inline-block { + display: inline-block !important; } + + .d-lg-block { + display: block !important; } + + .d-lg-table { + display: table !important; } + + .d-lg-table-row { + display: table-row !important; } + + .d-lg-table-cell { + display: table-cell !important; } + + .d-lg-flex { + display: flex !important; } + + .d-lg-inline-flex { + display: inline-flex !important; } } +@media (min-width: 1200px) { + .d-xl-none { + display: none !important; } + + .d-xl-inline { + display: inline !important; } + + .d-xl-inline-block { + display: inline-block !important; } + + .d-xl-block { + display: block !important; } + + .d-xl-table { + display: table !important; } + + .d-xl-table-row { + display: table-row !important; } + + .d-xl-table-cell { + display: table-cell !important; } + + .d-xl-flex { + display: flex !important; } + + .d-xl-inline-flex { + display: inline-flex !important; } } +@media print { + .d-print-none { + display: none !important; } + + .d-print-inline { + display: inline !important; } + + .d-print-inline-block { + display: inline-block !important; } + + .d-print-block { + display: block !important; } + + .d-print-table { + display: table !important; } + + .d-print-table-row { + display: table-row !important; } + + .d-print-table-cell { + display: table-cell !important; } + + .d-print-flex { + display: flex !important; } + + .d-print-inline-flex { + display: inline-flex !important; } } +.embed-responsive { + position: relative; + display: block; + width: 100%; + padding: 0; + overflow: hidden; } + .embed-responsive::before { + display: block; + content: ""; } + .embed-responsive .embed-responsive-item, + .embed-responsive iframe, + .embed-responsive embed, + .embed-responsive object, + .embed-responsive video { + position: absolute; + top: 0; + bottom: 0; + left: 0; + width: 100%; + height: 100%; + border: 0; } + +.embed-responsive-21by9::before { + padding-top: 42.8571428571%; } + +.embed-responsive-16by9::before { + padding-top: 56.25%; } + +.embed-responsive-4by3::before { + padding-top: 75%; } + +.embed-responsive-1by1::before { + padding-top: 100%; } + +.flex-row { + flex-direction: row !important; } + +.flex-column { + flex-direction: column !important; } + +.flex-row-reverse { + flex-direction: row-reverse !important; } + +.flex-column-reverse { + flex-direction: column-reverse !important; } + +.flex-wrap { + flex-wrap: wrap !important; } + +.flex-nowrap { + flex-wrap: nowrap !important; } + +.flex-wrap-reverse { + flex-wrap: wrap-reverse !important; } + +.flex-fill { + flex: 1 1 auto !important; } + +.flex-grow-0 { + flex-grow: 0 !important; } + +.flex-grow-1 { + flex-grow: 1 !important; } + +.flex-shrink-0 { + flex-shrink: 0 !important; } + +.flex-shrink-1 { + flex-shrink: 1 !important; } + +.justify-content-start { + justify-content: flex-start !important; } + +.justify-content-end { + justify-content: flex-end !important; } + +.justify-content-center { + justify-content: center !important; } + +.justify-content-between { + justify-content: space-between !important; } + +.justify-content-around { + justify-content: space-around !important; } + +.align-items-start { + align-items: flex-start !important; } + +.align-items-end { + align-items: flex-end !important; } + +.align-items-center { + align-items: center !important; } + +.align-items-baseline { + align-items: baseline !important; } + +.align-items-stretch { + align-items: stretch !important; } + +.align-content-start { + align-content: flex-start !important; } + +.align-content-end { + align-content: flex-end !important; } + +.align-content-center { + align-content: center !important; } + +.align-content-between { + align-content: space-between !important; } + +.align-content-around { + align-content: space-around !important; } + +.align-content-stretch { + align-content: stretch !important; } + +.align-self-auto { + align-self: auto !important; } + +.align-self-start { + align-self: flex-start !important; } + +.align-self-end { + align-self: flex-end !important; } + +.align-self-center { + align-self: center !important; } + +.align-self-baseline { + align-self: baseline !important; } + +.align-self-stretch { + align-self: stretch !important; } + +@media (min-width: 576px) { + .flex-sm-row { + flex-direction: row !important; } + + .flex-sm-column { + flex-direction: column !important; } + + .flex-sm-row-reverse { + flex-direction: row-reverse !important; } + + .flex-sm-column-reverse { + flex-direction: column-reverse !important; } + + .flex-sm-wrap { + flex-wrap: wrap !important; } + + .flex-sm-nowrap { + flex-wrap: nowrap !important; } + + .flex-sm-wrap-reverse { + flex-wrap: wrap-reverse !important; } + + .flex-sm-fill { + flex: 1 1 auto !important; } + + .flex-sm-grow-0 { + flex-grow: 0 !important; } + + .flex-sm-grow-1 { + flex-grow: 1 !important; } + + .flex-sm-shrink-0 { + flex-shrink: 0 !important; } + + .flex-sm-shrink-1 { + flex-shrink: 1 !important; } + + .justify-content-sm-start { + justify-content: flex-start !important; } + + .justify-content-sm-end { + justify-content: flex-end !important; } + + .justify-content-sm-center { + justify-content: center !important; } + + .justify-content-sm-between { + justify-content: space-between !important; } + + .justify-content-sm-around { + justify-content: space-around !important; } + + .align-items-sm-start { + align-items: flex-start !important; } + + .align-items-sm-end { + align-items: flex-end !important; } + + .align-items-sm-center { + align-items: center !important; } + + .align-items-sm-baseline { + align-items: baseline !important; } + + .align-items-sm-stretch { + align-items: stretch !important; } + + .align-content-sm-start { + align-content: flex-start !important; } + + .align-content-sm-end { + align-content: flex-end !important; } + + .align-content-sm-center { + align-content: center !important; } + + .align-content-sm-between { + align-content: space-between !important; } + + .align-content-sm-around { + align-content: space-around !important; } + + .align-content-sm-stretch { + align-content: stretch !important; } + + .align-self-sm-auto { + align-self: auto !important; } + + .align-self-sm-start { + align-self: flex-start !important; } + + .align-self-sm-end { + align-self: flex-end !important; } + + .align-self-sm-center { + align-self: center !important; } + + .align-self-sm-baseline { + align-self: baseline !important; } + + .align-self-sm-stretch { + align-self: stretch !important; } } +@media (min-width: 768px) { + .flex-md-row { + flex-direction: row !important; } + + .flex-md-column { + flex-direction: column !important; } + + .flex-md-row-reverse { + flex-direction: row-reverse !important; } + + .flex-md-column-reverse { + flex-direction: column-reverse !important; } + + .flex-md-wrap { + flex-wrap: wrap !important; } + + .flex-md-nowrap { + flex-wrap: nowrap !important; } + + .flex-md-wrap-reverse { + flex-wrap: wrap-reverse !important; } + + .flex-md-fill { + flex: 1 1 auto !important; } + + .flex-md-grow-0 { + flex-grow: 0 !important; } + + .flex-md-grow-1 { + flex-grow: 1 !important; } + + .flex-md-shrink-0 { + flex-shrink: 0 !important; } + + .flex-md-shrink-1 { + flex-shrink: 1 !important; } + + .justify-content-md-start { + justify-content: flex-start !important; } + + .justify-content-md-end { + justify-content: flex-end !important; } + + .justify-content-md-center { + justify-content: center !important; } + + .justify-content-md-between { + justify-content: space-between !important; } + + .justify-content-md-around { + justify-content: space-around !important; } + + .align-items-md-start { + align-items: flex-start !important; } + + .align-items-md-end { + align-items: flex-end !important; } + + .align-items-md-center { + align-items: center !important; } + + .align-items-md-baseline { + align-items: baseline !important; } + + .align-items-md-stretch { + align-items: stretch !important; } + + .align-content-md-start { + align-content: flex-start !important; } + + .align-content-md-end { + align-content: flex-end !important; } + + .align-content-md-center { + align-content: center !important; } + + .align-content-md-between { + align-content: space-between !important; } + + .align-content-md-around { + align-content: space-around !important; } + + .align-content-md-stretch { + align-content: stretch !important; } + + .align-self-md-auto { + align-self: auto !important; } + + .align-self-md-start { + align-self: flex-start !important; } + + .align-self-md-end { + align-self: flex-end !important; } + + .align-self-md-center { + align-self: center !important; } + + .align-self-md-baseline { + align-self: baseline !important; } + + .align-self-md-stretch { + align-self: stretch !important; } } +@media (min-width: 992px) { + .flex-lg-row { + flex-direction: row !important; } + + .flex-lg-column { + flex-direction: column !important; } + + .flex-lg-row-reverse { + flex-direction: row-reverse !important; } + + .flex-lg-column-reverse { + flex-direction: column-reverse !important; } + + .flex-lg-wrap { + flex-wrap: wrap !important; } + + .flex-lg-nowrap { + flex-wrap: nowrap !important; } + + .flex-lg-wrap-reverse { + flex-wrap: wrap-reverse !important; } + + .flex-lg-fill { + flex: 1 1 auto !important; } + + .flex-lg-grow-0 { + flex-grow: 0 !important; } + + .flex-lg-grow-1 { + flex-grow: 1 !important; } + + .flex-lg-shrink-0 { + flex-shrink: 0 !important; } + + .flex-lg-shrink-1 { + flex-shrink: 1 !important; } + + .justify-content-lg-start { + justify-content: flex-start !important; } + + .justify-content-lg-end { + justify-content: flex-end !important; } + + .justify-content-lg-center { + justify-content: center !important; } + + .justify-content-lg-between { + justify-content: space-between !important; } + + .justify-content-lg-around { + justify-content: space-around !important; } + + .align-items-lg-start { + align-items: flex-start !important; } + + .align-items-lg-end { + align-items: flex-end !important; } + + .align-items-lg-center { + align-items: center !important; } + + .align-items-lg-baseline { + align-items: baseline !important; } + + .align-items-lg-stretch { + align-items: stretch !important; } + + .align-content-lg-start { + align-content: flex-start !important; } + + .align-content-lg-end { + align-content: flex-end !important; } + + .align-content-lg-center { + align-content: center !important; } + + .align-content-lg-between { + align-content: space-between !important; } + + .align-content-lg-around { + align-content: space-around !important; } + + .align-content-lg-stretch { + align-content: stretch !important; } + + .align-self-lg-auto { + align-self: auto !important; } + + .align-self-lg-start { + align-self: flex-start !important; } + + .align-self-lg-end { + align-self: flex-end !important; } + + .align-self-lg-center { + align-self: center !important; } + + .align-self-lg-baseline { + align-self: baseline !important; } + + .align-self-lg-stretch { + align-self: stretch !important; } } +@media (min-width: 1200px) { + .flex-xl-row { + flex-direction: row !important; } + + .flex-xl-column { + flex-direction: column !important; } + + .flex-xl-row-reverse { + flex-direction: row-reverse !important; } + + .flex-xl-column-reverse { + flex-direction: column-reverse !important; } + + .flex-xl-wrap { + flex-wrap: wrap !important; } + + .flex-xl-nowrap { + flex-wrap: nowrap !important; } + + .flex-xl-wrap-reverse { + flex-wrap: wrap-reverse !important; } + + .flex-xl-fill { + flex: 1 1 auto !important; } + + .flex-xl-grow-0 { + flex-grow: 0 !important; } + + .flex-xl-grow-1 { + flex-grow: 1 !important; } + + .flex-xl-shrink-0 { + flex-shrink: 0 !important; } + + .flex-xl-shrink-1 { + flex-shrink: 1 !important; } + + .justify-content-xl-start { + justify-content: flex-start !important; } + + .justify-content-xl-end { + justify-content: flex-end !important; } + + .justify-content-xl-center { + justify-content: center !important; } + + .justify-content-xl-between { + justify-content: space-between !important; } + + .justify-content-xl-around { + justify-content: space-around !important; } + + .align-items-xl-start { + align-items: flex-start !important; } + + .align-items-xl-end { + align-items: flex-end !important; } + + .align-items-xl-center { + align-items: center !important; } + + .align-items-xl-baseline { + align-items: baseline !important; } + + .align-items-xl-stretch { + align-items: stretch !important; } + + .align-content-xl-start { + align-content: flex-start !important; } + + .align-content-xl-end { + align-content: flex-end !important; } + + .align-content-xl-center { + align-content: center !important; } + + .align-content-xl-between { + align-content: space-between !important; } + + .align-content-xl-around { + align-content: space-around !important; } + + .align-content-xl-stretch { + align-content: stretch !important; } + + .align-self-xl-auto { + align-self: auto !important; } + + .align-self-xl-start { + align-self: flex-start !important; } + + .align-self-xl-end { + align-self: flex-end !important; } + + .align-self-xl-center { + align-self: center !important; } + + .align-self-xl-baseline { + align-self: baseline !important; } + + .align-self-xl-stretch { + align-self: stretch !important; } } +.float-left { + float: left !important; } + +.float-right { + float: right !important; } + +.float-none { + float: none !important; } + +@media (min-width: 576px) { + .float-sm-left { + float: left !important; } + + .float-sm-right { + float: right !important; } + + .float-sm-none { + float: none !important; } } +@media (min-width: 768px) { + .float-md-left { + float: left !important; } + + .float-md-right { + float: right !important; } + + .float-md-none { + float: none !important; } } +@media (min-width: 992px) { + .float-lg-left { + float: left !important; } + + .float-lg-right { + float: right !important; } + + .float-lg-none { + float: none !important; } } +@media (min-width: 1200px) { + .float-xl-left { + float: left !important; } + + .float-xl-right { + float: right !important; } + + .float-xl-none { + float: none !important; } } +.overflow-auto { + overflow: auto !important; } + +.overflow-hidden { + overflow: hidden !important; } + +.position-static { + position: static !important; } + +.position-relative { + position: relative !important; } + +.position-absolute { + position: absolute !important; } + +.position-fixed { + position: fixed !important; } + +.position-sticky { + position: sticky !important; } + +.fixed-top { + position: fixed; + top: 0; + right: 0; + left: 0; + z-index: 1030; } + +.fixed-bottom { + position: fixed; + right: 0; + bottom: 0; + left: 0; + z-index: 1030; } + +@supports (position: sticky) { + .sticky-top { + position: sticky; + top: 0; + z-index: 1020; } } + +.sr-only { + position: absolute; + width: 1px; + height: 1px; + padding: 0; + overflow: hidden; + clip: rect(0, 0, 0, 0); + white-space: nowrap; + border: 0; } + +.sr-only-focusable:active, .sr-only-focusable:focus { + position: static; + width: auto; + height: auto; + overflow: visible; + clip: auto; + white-space: normal; } + +.shadow-sm { + box-shadow: 0 0.125rem 0.25rem rgba(0, 0, 0, 0.075) !important; } + +.shadow { + box-shadow: 0 0.5rem 1rem rgba(0, 0, 0, 0.15) !important; } + +.shadow-lg { + box-shadow: 0 1rem 3rem rgba(0, 0, 0, 0.175) !important; } + +.shadow-none { + box-shadow: none !important; } + +.w-25 { + width: 25% !important; } + +.w-50 { + width: 50% !important; } + +.w-75 { + width: 75% !important; } + +.w-100 { + width: 100% !important; } + +.w-auto { + width: auto !important; } + +.h-25 { + height: 25% !important; } + +.h-50 { + height: 50% !important; } + +.h-75 { + height: 75% !important; } + +.h-100 { + height: 100% !important; } + +.h-auto { + height: auto !important; } + +.mw-100 { + max-width: 100% !important; } + +.mh-100 { + max-height: 100% !important; } + +.min-vw-100 { + min-width: 100vw !important; } + +.min-vh-100 { + min-height: 100vh !important; } + +.vw-100 { + width: 100vw !important; } + +.vh-100 { + height: 100vh !important; } + +.m-0 { + margin: 0 !important; } + +.mt-0, +.my-0 { + margin-top: 0 !important; } + +.mr-0, +.mx-0 { + margin-right: 0 !important; } + +.mb-0, +.my-0 { + margin-bottom: 0 !important; } + +.ml-0, +.mx-0 { + margin-left: 0 !important; } + +.m-1 { + margin: 0.25rem !important; } + +.mt-1, +.my-1 { + margin-top: 0.25rem !important; } + +.mr-1, +.mx-1 { + margin-right: 0.25rem !important; } + +.mb-1, +.my-1 { + margin-bottom: 0.25rem !important; } + +.ml-1, +.mx-1 { + margin-left: 0.25rem !important; } + +.m-2 { + margin: 0.5rem !important; } + +.mt-2, +.my-2 { + margin-top: 0.5rem !important; } + +.mr-2, +.mx-2 { + margin-right: 0.5rem !important; } + +.mb-2, +.my-2 { + margin-bottom: 0.5rem !important; } + +.ml-2, +.mx-2 { + margin-left: 0.5rem !important; } + +.m-3 { + margin: 1rem !important; } + +.mt-3, +.my-3 { + margin-top: 1rem !important; } + +.mr-3, +.mx-3 { + margin-right: 1rem !important; } + +.mb-3, +.my-3 { + margin-bottom: 1rem !important; } + +.ml-3, +.mx-3 { + margin-left: 1rem !important; } + +.m-4 { + margin: 1.5rem !important; } + +.mt-4, +.my-4 { + margin-top: 1.5rem !important; } + +.mr-4, +.mx-4 { + margin-right: 1.5rem !important; } + +.mb-4, +.my-4 { + margin-bottom: 1.5rem !important; } + +.ml-4, +.mx-4 { + margin-left: 1.5rem !important; } + +.m-5 { + margin: 3rem !important; } + +.mt-5, +.my-5 { + margin-top: 3rem !important; } + +.mr-5, +.mx-5 { + margin-right: 3rem !important; } + +.mb-5, +.my-5 { + margin-bottom: 3rem !important; } + +.ml-5, +.mx-5 { + margin-left: 3rem !important; } + +.p-0 { + padding: 0 !important; } + +.pt-0, +.py-0 { + padding-top: 0 !important; } + +.pr-0, +.px-0 { + padding-right: 0 !important; } + +.pb-0, +.py-0 { + padding-bottom: 0 !important; } + +.pl-0, +.px-0 { + padding-left: 0 !important; } + +.p-1 { + padding: 0.25rem !important; } + +.pt-1, +.py-1 { + padding-top: 0.25rem !important; } + +.pr-1, +.px-1 { + padding-right: 0.25rem !important; } + +.pb-1, +.py-1 { + padding-bottom: 0.25rem !important; } + +.pl-1, +.px-1 { + padding-left: 0.25rem !important; } + +.p-2 { + padding: 0.5rem !important; } + +.pt-2, +.py-2 { + padding-top: 0.5rem !important; } + +.pr-2, +.px-2 { + padding-right: 0.5rem !important; } + +.pb-2, +.py-2 { + padding-bottom: 0.5rem !important; } + +.pl-2, +.px-2 { + padding-left: 0.5rem !important; } + +.p-3 { + padding: 1rem !important; } + +.pt-3, +.py-3 { + padding-top: 1rem !important; } + +.pr-3, +.px-3 { + padding-right: 1rem !important; } + +.pb-3, +.py-3 { + padding-bottom: 1rem !important; } + +.pl-3, +.px-3 { + padding-left: 1rem !important; } + +.p-4 { + padding: 1.5rem !important; } + +.pt-4, +.py-4 { + padding-top: 1.5rem !important; } + +.pr-4, +.px-4 { + padding-right: 1.5rem !important; } + +.pb-4, +.py-4 { + padding-bottom: 1.5rem !important; } + +.pl-4, +.px-4 { + padding-left: 1.5rem !important; } + +.p-5 { + padding: 3rem !important; } + +.pt-5, +.py-5 { + padding-top: 3rem !important; } + +.pr-5, +.px-5 { + padding-right: 3rem !important; } + +.pb-5, +.py-5 { + padding-bottom: 3rem !important; } + +.pl-5, +.px-5 { + padding-left: 3rem !important; } + +.m-n1 { + margin: -0.25rem !important; } + +.mt-n1, +.my-n1 { + margin-top: -0.25rem !important; } + +.mr-n1, +.mx-n1 { + margin-right: -0.25rem !important; } + +.mb-n1, +.my-n1 { + margin-bottom: -0.25rem !important; } + +.ml-n1, +.mx-n1 { + margin-left: -0.25rem !important; } + +.m-n2 { + margin: -0.5rem !important; } + +.mt-n2, +.my-n2 { + margin-top: -0.5rem !important; } + +.mr-n2, +.mx-n2 { + margin-right: -0.5rem !important; } + +.mb-n2, +.my-n2 { + margin-bottom: -0.5rem !important; } + +.ml-n2, +.mx-n2 { + margin-left: -0.5rem !important; } + +.m-n3 { + margin: -1rem !important; } + +.mt-n3, +.my-n3 { + margin-top: -1rem !important; } + +.mr-n3, +.mx-n3 { + margin-right: -1rem !important; } + +.mb-n3, +.my-n3 { + margin-bottom: -1rem !important; } + +.ml-n3, +.mx-n3 { + margin-left: -1rem !important; } + +.m-n4 { + margin: -1.5rem !important; } + +.mt-n4, +.my-n4 { + margin-top: -1.5rem !important; } + +.mr-n4, +.mx-n4 { + margin-right: -1.5rem !important; } + +.mb-n4, +.my-n4 { + margin-bottom: -1.5rem !important; } + +.ml-n4, +.mx-n4 { + margin-left: -1.5rem !important; } + +.m-n5 { + margin: -3rem !important; } + +.mt-n5, +.my-n5 { + margin-top: -3rem !important; } + +.mr-n5, +.mx-n5 { + margin-right: -3rem !important; } + +.mb-n5, +.my-n5 { + margin-bottom: -3rem !important; } + +.ml-n5, +.mx-n5 { + margin-left: -3rem !important; } + +.m-auto { + margin: auto !important; } + +.mt-auto, +.my-auto { + margin-top: auto !important; } + +.mr-auto, +.mx-auto { + margin-right: auto !important; } + +.mb-auto, +.my-auto { + margin-bottom: auto !important; } + +.ml-auto, +.mx-auto { + margin-left: auto !important; } + +@media (min-width: 576px) { + .m-sm-0 { + margin: 0 !important; } + + .mt-sm-0, + .my-sm-0 { + margin-top: 0 !important; } + + .mr-sm-0, + .mx-sm-0 { + margin-right: 0 !important; } + + .mb-sm-0, + .my-sm-0 { + margin-bottom: 0 !important; } + + .ml-sm-0, + .mx-sm-0 { + margin-left: 0 !important; } + + .m-sm-1 { + margin: 0.25rem !important; } + + .mt-sm-1, + .my-sm-1 { + margin-top: 0.25rem !important; } + + .mr-sm-1, + .mx-sm-1 { + margin-right: 0.25rem !important; } + + .mb-sm-1, + .my-sm-1 { + margin-bottom: 0.25rem !important; } + + .ml-sm-1, + .mx-sm-1 { + margin-left: 0.25rem !important; } + + .m-sm-2 { + margin: 0.5rem !important; } + + .mt-sm-2, + .my-sm-2 { + margin-top: 0.5rem !important; } + + .mr-sm-2, + .mx-sm-2 { + margin-right: 0.5rem !important; } + + .mb-sm-2, + .my-sm-2 { + margin-bottom: 0.5rem !important; } + + .ml-sm-2, + .mx-sm-2 { + margin-left: 0.5rem !important; } + + .m-sm-3 { + margin: 1rem !important; } + + .mt-sm-3, + .my-sm-3 { + margin-top: 1rem !important; } + + .mr-sm-3, + .mx-sm-3 { + margin-right: 1rem !important; } + + .mb-sm-3, + .my-sm-3 { + margin-bottom: 1rem !important; } + + .ml-sm-3, + .mx-sm-3 { + margin-left: 1rem !important; } + + .m-sm-4 { + margin: 1.5rem !important; } + + .mt-sm-4, + .my-sm-4 { + margin-top: 1.5rem !important; } + + .mr-sm-4, + .mx-sm-4 { + margin-right: 1.5rem !important; } + + .mb-sm-4, + .my-sm-4 { + margin-bottom: 1.5rem !important; } + + .ml-sm-4, + .mx-sm-4 { + margin-left: 1.5rem !important; } + + .m-sm-5 { + margin: 3rem !important; } + + .mt-sm-5, + .my-sm-5 { + margin-top: 3rem !important; } + + .mr-sm-5, + .mx-sm-5 { + margin-right: 3rem !important; } + + .mb-sm-5, + .my-sm-5 { + margin-bottom: 3rem !important; } + + .ml-sm-5, + .mx-sm-5 { + margin-left: 3rem !important; } + + .p-sm-0 { + padding: 0 !important; } + + .pt-sm-0, + .py-sm-0 { + padding-top: 0 !important; } + + .pr-sm-0, + .px-sm-0 { + padding-right: 0 !important; } + + .pb-sm-0, + .py-sm-0 { + padding-bottom: 0 !important; } + + .pl-sm-0, + .px-sm-0 { + padding-left: 0 !important; } + + .p-sm-1 { + padding: 0.25rem !important; } + + .pt-sm-1, + .py-sm-1 { + padding-top: 0.25rem !important; } + + .pr-sm-1, + .px-sm-1 { + padding-right: 0.25rem !important; } + + .pb-sm-1, + .py-sm-1 { + padding-bottom: 0.25rem !important; } + + .pl-sm-1, + .px-sm-1 { + padding-left: 0.25rem !important; } + + .p-sm-2 { + padding: 0.5rem !important; } + + .pt-sm-2, + .py-sm-2 { + padding-top: 0.5rem !important; } + + .pr-sm-2, + .px-sm-2 { + padding-right: 0.5rem !important; } + + .pb-sm-2, + .py-sm-2 { + padding-bottom: 0.5rem !important; } + + .pl-sm-2, + .px-sm-2 { + padding-left: 0.5rem !important; } + + .p-sm-3 { + padding: 1rem !important; } + + .pt-sm-3, + .py-sm-3 { + padding-top: 1rem !important; } + + .pr-sm-3, + .px-sm-3 { + padding-right: 1rem !important; } + + .pb-sm-3, + .py-sm-3 { + padding-bottom: 1rem !important; } + + .pl-sm-3, + .px-sm-3 { + padding-left: 1rem !important; } + + .p-sm-4 { + padding: 1.5rem !important; } + + .pt-sm-4, + .py-sm-4 { + padding-top: 1.5rem !important; } + + .pr-sm-4, + .px-sm-4 { + padding-right: 1.5rem !important; } + + .pb-sm-4, + .py-sm-4 { + padding-bottom: 1.5rem !important; } + + .pl-sm-4, + .px-sm-4 { + padding-left: 1.5rem !important; } + + .p-sm-5 { + padding: 3rem !important; } + + .pt-sm-5, + .py-sm-5 { + padding-top: 3rem !important; } + + .pr-sm-5, + .px-sm-5 { + padding-right: 3rem !important; } + + .pb-sm-5, + .py-sm-5 { + padding-bottom: 3rem !important; } + + .pl-sm-5, + .px-sm-5 { + padding-left: 3rem !important; } + + .m-sm-n1 { + margin: -0.25rem !important; } + + .mt-sm-n1, + .my-sm-n1 { + margin-top: -0.25rem !important; } + + .mr-sm-n1, + .mx-sm-n1 { + margin-right: -0.25rem !important; } + + .mb-sm-n1, + .my-sm-n1 { + margin-bottom: -0.25rem !important; } + + .ml-sm-n1, + .mx-sm-n1 { + margin-left: -0.25rem !important; } + + .m-sm-n2 { + margin: -0.5rem !important; } + + .mt-sm-n2, + .my-sm-n2 { + margin-top: -0.5rem !important; } + + .mr-sm-n2, + .mx-sm-n2 { + margin-right: -0.5rem !important; } + + .mb-sm-n2, + .my-sm-n2 { + margin-bottom: -0.5rem !important; } + + .ml-sm-n2, + .mx-sm-n2 { + margin-left: -0.5rem !important; } + + .m-sm-n3 { + margin: -1rem !important; } + + .mt-sm-n3, + .my-sm-n3 { + margin-top: -1rem !important; } + + .mr-sm-n3, + .mx-sm-n3 { + margin-right: -1rem !important; } + + .mb-sm-n3, + .my-sm-n3 { + margin-bottom: -1rem !important; } + + .ml-sm-n3, + .mx-sm-n3 { + margin-left: -1rem !important; } + + .m-sm-n4 { + margin: -1.5rem !important; } + + .mt-sm-n4, + .my-sm-n4 { + margin-top: -1.5rem !important; } + + .mr-sm-n4, + .mx-sm-n4 { + margin-right: -1.5rem !important; } + + .mb-sm-n4, + .my-sm-n4 { + margin-bottom: -1.5rem !important; } + + .ml-sm-n4, + .mx-sm-n4 { + margin-left: -1.5rem !important; } + + .m-sm-n5 { + margin: -3rem !important; } + + .mt-sm-n5, + .my-sm-n5 { + margin-top: -3rem !important; } + + .mr-sm-n5, + .mx-sm-n5 { + margin-right: -3rem !important; } + + .mb-sm-n5, + .my-sm-n5 { + margin-bottom: -3rem !important; } + + .ml-sm-n5, + .mx-sm-n5 { + margin-left: -3rem !important; } + + .m-sm-auto { + margin: auto !important; } + + .mt-sm-auto, + .my-sm-auto { + margin-top: auto !important; } + + .mr-sm-auto, + .mx-sm-auto { + margin-right: auto !important; } + + .mb-sm-auto, + .my-sm-auto { + margin-bottom: auto !important; } + + .ml-sm-auto, + .mx-sm-auto { + margin-left: auto !important; } } +@media (min-width: 768px) { + .m-md-0 { + margin: 0 !important; } + + .mt-md-0, + .my-md-0 { + margin-top: 0 !important; } + + .mr-md-0, + .mx-md-0 { + margin-right: 0 !important; } + + .mb-md-0, + .my-md-0 { + margin-bottom: 0 !important; } + + .ml-md-0, + .mx-md-0 { + margin-left: 0 !important; } + + .m-md-1 { + margin: 0.25rem !important; } + + .mt-md-1, + .my-md-1 { + margin-top: 0.25rem !important; } + + .mr-md-1, + .mx-md-1 { + margin-right: 0.25rem !important; } + + .mb-md-1, + .my-md-1 { + margin-bottom: 0.25rem !important; } + + .ml-md-1, + .mx-md-1 { + margin-left: 0.25rem !important; } + + .m-md-2 { + margin: 0.5rem !important; } + + .mt-md-2, + .my-md-2 { + margin-top: 0.5rem !important; } + + .mr-md-2, + .mx-md-2 { + margin-right: 0.5rem !important; } + + .mb-md-2, + .my-md-2 { + margin-bottom: 0.5rem !important; } + + .ml-md-2, + .mx-md-2 { + margin-left: 0.5rem !important; } + + .m-md-3 { + margin: 1rem !important; } + + .mt-md-3, + .my-md-3 { + margin-top: 1rem !important; } + + .mr-md-3, + .mx-md-3 { + margin-right: 1rem !important; } + + .mb-md-3, + .my-md-3 { + margin-bottom: 1rem !important; } + + .ml-md-3, + .mx-md-3 { + margin-left: 1rem !important; } + + .m-md-4 { + margin: 1.5rem !important; } + + .mt-md-4, + .my-md-4 { + margin-top: 1.5rem !important; } + + .mr-md-4, + .mx-md-4 { + margin-right: 1.5rem !important; } + + .mb-md-4, + .my-md-4 { + margin-bottom: 1.5rem !important; } + + .ml-md-4, + .mx-md-4 { + margin-left: 1.5rem !important; } + + .m-md-5 { + margin: 3rem !important; } + + .mt-md-5, + .my-md-5 { + margin-top: 3rem !important; } + + .mr-md-5, + .mx-md-5 { + margin-right: 3rem !important; } + + .mb-md-5, + .my-md-5 { + margin-bottom: 3rem !important; } + + .ml-md-5, + .mx-md-5 { + margin-left: 3rem !important; } + + .p-md-0 { + padding: 0 !important; } + + .pt-md-0, + .py-md-0 { + padding-top: 0 !important; } + + .pr-md-0, + .px-md-0 { + padding-right: 0 !important; } + + .pb-md-0, + .py-md-0 { + padding-bottom: 0 !important; } + + .pl-md-0, + .px-md-0 { + padding-left: 0 !important; } + + .p-md-1 { + padding: 0.25rem !important; } + + .pt-md-1, + .py-md-1 { + padding-top: 0.25rem !important; } + + .pr-md-1, + .px-md-1 { + padding-right: 0.25rem !important; } + + .pb-md-1, + .py-md-1 { + padding-bottom: 0.25rem !important; } + + .pl-md-1, + .px-md-1 { + padding-left: 0.25rem !important; } + + .p-md-2 { + padding: 0.5rem !important; } + + .pt-md-2, + .py-md-2 { + padding-top: 0.5rem !important; } + + .pr-md-2, + .px-md-2 { + padding-right: 0.5rem !important; } + + .pb-md-2, + .py-md-2 { + padding-bottom: 0.5rem !important; } + + .pl-md-2, + .px-md-2 { + padding-left: 0.5rem !important; } + + .p-md-3 { + padding: 1rem !important; } + + .pt-md-3, + .py-md-3 { + padding-top: 1rem !important; } + + .pr-md-3, + .px-md-3 { + padding-right: 1rem !important; } + + .pb-md-3, + .py-md-3 { + padding-bottom: 1rem !important; } + + .pl-md-3, + .px-md-3 { + padding-left: 1rem !important; } + + .p-md-4 { + padding: 1.5rem !important; } + + .pt-md-4, + .py-md-4 { + padding-top: 1.5rem !important; } + + .pr-md-4, + .px-md-4 { + padding-right: 1.5rem !important; } + + .pb-md-4, + .py-md-4 { + padding-bottom: 1.5rem !important; } + + .pl-md-4, + .px-md-4 { + padding-left: 1.5rem !important; } + + .p-md-5 { + padding: 3rem !important; } + + .pt-md-5, + .py-md-5 { + padding-top: 3rem !important; } + + .pr-md-5, + .px-md-5 { + padding-right: 3rem !important; } + + .pb-md-5, + .py-md-5 { + padding-bottom: 3rem !important; } + + .pl-md-5, + .px-md-5 { + padding-left: 3rem !important; } + + .m-md-n1 { + margin: -0.25rem !important; } + + .mt-md-n1, + .my-md-n1 { + margin-top: -0.25rem !important; } + + .mr-md-n1, + .mx-md-n1 { + margin-right: -0.25rem !important; } + + .mb-md-n1, + .my-md-n1 { + margin-bottom: -0.25rem !important; } + + .ml-md-n1, + .mx-md-n1 { + margin-left: -0.25rem !important; } + + .m-md-n2 { + margin: -0.5rem !important; } + + .mt-md-n2, + .my-md-n2 { + margin-top: -0.5rem !important; } + + .mr-md-n2, + .mx-md-n2 { + margin-right: -0.5rem !important; } + + .mb-md-n2, + .my-md-n2 { + margin-bottom: -0.5rem !important; } + + .ml-md-n2, + .mx-md-n2 { + margin-left: -0.5rem !important; } + + .m-md-n3 { + margin: -1rem !important; } + + .mt-md-n3, + .my-md-n3 { + margin-top: -1rem !important; } + + .mr-md-n3, + .mx-md-n3 { + margin-right: -1rem !important; } + + .mb-md-n3, + .my-md-n3 { + margin-bottom: -1rem !important; } + + .ml-md-n3, + .mx-md-n3 { + margin-left: -1rem !important; } + + .m-md-n4 { + margin: -1.5rem !important; } + + .mt-md-n4, + .my-md-n4 { + margin-top: -1.5rem !important; } + + .mr-md-n4, + .mx-md-n4 { + margin-right: -1.5rem !important; } + + .mb-md-n4, + .my-md-n4 { + margin-bottom: -1.5rem !important; } + + .ml-md-n4, + .mx-md-n4 { + margin-left: -1.5rem !important; } + + .m-md-n5 { + margin: -3rem !important; } + + .mt-md-n5, + .my-md-n5 { + margin-top: -3rem !important; } + + .mr-md-n5, + .mx-md-n5 { + margin-right: -3rem !important; } + + .mb-md-n5, + .my-md-n5 { + margin-bottom: -3rem !important; } + + .ml-md-n5, + .mx-md-n5 { + margin-left: -3rem !important; } + + .m-md-auto { + margin: auto !important; } + + .mt-md-auto, + .my-md-auto { + margin-top: auto !important; } + + .mr-md-auto, + .mx-md-auto { + margin-right: auto !important; } + + .mb-md-auto, + .my-md-auto { + margin-bottom: auto !important; } + + .ml-md-auto, + .mx-md-auto { + margin-left: auto !important; } } +@media (min-width: 992px) { + .m-lg-0 { + margin: 0 !important; } + + .mt-lg-0, + .my-lg-0 { + margin-top: 0 !important; } + + .mr-lg-0, + .mx-lg-0 { + margin-right: 0 !important; } + + .mb-lg-0, + .my-lg-0 { + margin-bottom: 0 !important; } + + .ml-lg-0, + .mx-lg-0 { + margin-left: 0 !important; } + + .m-lg-1 { + margin: 0.25rem !important; } + + .mt-lg-1, + .my-lg-1 { + margin-top: 0.25rem !important; } + + .mr-lg-1, + .mx-lg-1 { + margin-right: 0.25rem !important; } + + .mb-lg-1, + .my-lg-1 { + margin-bottom: 0.25rem !important; } + + .ml-lg-1, + .mx-lg-1 { + margin-left: 0.25rem !important; } + + .m-lg-2 { + margin: 0.5rem !important; } + + .mt-lg-2, + .my-lg-2 { + margin-top: 0.5rem !important; } + + .mr-lg-2, + .mx-lg-2 { + margin-right: 0.5rem !important; } + + .mb-lg-2, + .my-lg-2 { + margin-bottom: 0.5rem !important; } + + .ml-lg-2, + .mx-lg-2 { + margin-left: 0.5rem !important; } + + .m-lg-3 { + margin: 1rem !important; } + + .mt-lg-3, + .my-lg-3 { + margin-top: 1rem !important; } + + .mr-lg-3, + .mx-lg-3 { + margin-right: 1rem !important; } + + .mb-lg-3, + .my-lg-3 { + margin-bottom: 1rem !important; } + + .ml-lg-3, + .mx-lg-3 { + margin-left: 1rem !important; } + + .m-lg-4 { + margin: 1.5rem !important; } + + .mt-lg-4, + .my-lg-4 { + margin-top: 1.5rem !important; } + + .mr-lg-4, + .mx-lg-4 { + margin-right: 1.5rem !important; } + + .mb-lg-4, + .my-lg-4 { + margin-bottom: 1.5rem !important; } + + .ml-lg-4, + .mx-lg-4 { + margin-left: 1.5rem !important; } + + .m-lg-5 { + margin: 3rem !important; } + + .mt-lg-5, + .my-lg-5 { + margin-top: 3rem !important; } + + .mr-lg-5, + .mx-lg-5 { + margin-right: 3rem !important; } + + .mb-lg-5, + .my-lg-5 { + margin-bottom: 3rem !important; } + + .ml-lg-5, + .mx-lg-5 { + margin-left: 3rem !important; } + + .p-lg-0 { + padding: 0 !important; } + + .pt-lg-0, + .py-lg-0 { + padding-top: 0 !important; } + + .pr-lg-0, + .px-lg-0 { + padding-right: 0 !important; } + + .pb-lg-0, + .py-lg-0 { + padding-bottom: 0 !important; } + + .pl-lg-0, + .px-lg-0 { + padding-left: 0 !important; } + + .p-lg-1 { + padding: 0.25rem !important; } + + .pt-lg-1, + .py-lg-1 { + padding-top: 0.25rem !important; } + + .pr-lg-1, + .px-lg-1 { + padding-right: 0.25rem !important; } + + .pb-lg-1, + .py-lg-1 { + padding-bottom: 0.25rem !important; } + + .pl-lg-1, + .px-lg-1 { + padding-left: 0.25rem !important; } + + .p-lg-2 { + padding: 0.5rem !important; } + + .pt-lg-2, + .py-lg-2 { + padding-top: 0.5rem !important; } + + .pr-lg-2, + .px-lg-2 { + padding-right: 0.5rem !important; } + + .pb-lg-2, + .py-lg-2 { + padding-bottom: 0.5rem !important; } + + .pl-lg-2, + .px-lg-2 { + padding-left: 0.5rem !important; } + + .p-lg-3 { + padding: 1rem !important; } + + .pt-lg-3, + .py-lg-3 { + padding-top: 1rem !important; } + + .pr-lg-3, + .px-lg-3 { + padding-right: 1rem !important; } + + .pb-lg-3, + .py-lg-3 { + padding-bottom: 1rem !important; } + + .pl-lg-3, + .px-lg-3 { + padding-left: 1rem !important; } + + .p-lg-4 { + padding: 1.5rem !important; } + + .pt-lg-4, + .py-lg-4 { + padding-top: 1.5rem !important; } + + .pr-lg-4, + .px-lg-4 { + padding-right: 1.5rem !important; } + + .pb-lg-4, + .py-lg-4 { + padding-bottom: 1.5rem !important; } + + .pl-lg-4, + .px-lg-4 { + padding-left: 1.5rem !important; } + + .p-lg-5 { + padding: 3rem !important; } + + .pt-lg-5, + .py-lg-5 { + padding-top: 3rem !important; } + + .pr-lg-5, + .px-lg-5 { + padding-right: 3rem !important; } + + .pb-lg-5, + .py-lg-5 { + padding-bottom: 3rem !important; } + + .pl-lg-5, + .px-lg-5 { + padding-left: 3rem !important; } + + .m-lg-n1 { + margin: -0.25rem !important; } + + .mt-lg-n1, + .my-lg-n1 { + margin-top: -0.25rem !important; } + + .mr-lg-n1, + .mx-lg-n1 { + margin-right: -0.25rem !important; } + + .mb-lg-n1, + .my-lg-n1 { + margin-bottom: -0.25rem !important; } + + .ml-lg-n1, + .mx-lg-n1 { + margin-left: -0.25rem !important; } + + .m-lg-n2 { + margin: -0.5rem !important; } + + .mt-lg-n2, + .my-lg-n2 { + margin-top: -0.5rem !important; } + + .mr-lg-n2, + .mx-lg-n2 { + margin-right: -0.5rem !important; } + + .mb-lg-n2, + .my-lg-n2 { + margin-bottom: -0.5rem !important; } + + .ml-lg-n2, + .mx-lg-n2 { + margin-left: -0.5rem !important; } + + .m-lg-n3 { + margin: -1rem !important; } + + .mt-lg-n3, + .my-lg-n3 { + margin-top: -1rem !important; } + + .mr-lg-n3, + .mx-lg-n3 { + margin-right: -1rem !important; } + + .mb-lg-n3, + .my-lg-n3 { + margin-bottom: -1rem !important; } + + .ml-lg-n3, + .mx-lg-n3 { + margin-left: -1rem !important; } + + .m-lg-n4 { + margin: -1.5rem !important; } + + .mt-lg-n4, + .my-lg-n4 { + margin-top: -1.5rem !important; } + + .mr-lg-n4, + .mx-lg-n4 { + margin-right: -1.5rem !important; } + + .mb-lg-n4, + .my-lg-n4 { + margin-bottom: -1.5rem !important; } + + .ml-lg-n4, + .mx-lg-n4 { + margin-left: -1.5rem !important; } + + .m-lg-n5 { + margin: -3rem !important; } + + .mt-lg-n5, + .my-lg-n5 { + margin-top: -3rem !important; } + + .mr-lg-n5, + .mx-lg-n5 { + margin-right: -3rem !important; } + + .mb-lg-n5, + .my-lg-n5 { + margin-bottom: -3rem !important; } + + .ml-lg-n5, + .mx-lg-n5 { + margin-left: -3rem !important; } + + .m-lg-auto { + margin: auto !important; } + + .mt-lg-auto, + .my-lg-auto { + margin-top: auto !important; } + + .mr-lg-auto, + .mx-lg-auto { + margin-right: auto !important; } + + .mb-lg-auto, + .my-lg-auto { + margin-bottom: auto !important; } + + .ml-lg-auto, + .mx-lg-auto { + margin-left: auto !important; } } +@media (min-width: 1200px) { + .m-xl-0 { + margin: 0 !important; } + + .mt-xl-0, + .my-xl-0 { + margin-top: 0 !important; } + + .mr-xl-0, + .mx-xl-0 { + margin-right: 0 !important; } + + .mb-xl-0, + .my-xl-0 { + margin-bottom: 0 !important; } + + .ml-xl-0, + .mx-xl-0 { + margin-left: 0 !important; } + + .m-xl-1 { + margin: 0.25rem !important; } + + .mt-xl-1, + .my-xl-1 { + margin-top: 0.25rem !important; } + + .mr-xl-1, + .mx-xl-1 { + margin-right: 0.25rem !important; } + + .mb-xl-1, + .my-xl-1 { + margin-bottom: 0.25rem !important; } + + .ml-xl-1, + .mx-xl-1 { + margin-left: 0.25rem !important; } + + .m-xl-2 { + margin: 0.5rem !important; } + + .mt-xl-2, + .my-xl-2 { + margin-top: 0.5rem !important; } + + .mr-xl-2, + .mx-xl-2 { + margin-right: 0.5rem !important; } + + .mb-xl-2, + .my-xl-2 { + margin-bottom: 0.5rem !important; } + + .ml-xl-2, + .mx-xl-2 { + margin-left: 0.5rem !important; } + + .m-xl-3 { + margin: 1rem !important; } + + .mt-xl-3, + .my-xl-3 { + margin-top: 1rem !important; } + + .mr-xl-3, + .mx-xl-3 { + margin-right: 1rem !important; } + + .mb-xl-3, + .my-xl-3 { + margin-bottom: 1rem !important; } + + .ml-xl-3, + .mx-xl-3 { + margin-left: 1rem !important; } + + .m-xl-4 { + margin: 1.5rem !important; } + + .mt-xl-4, + .my-xl-4 { + margin-top: 1.5rem !important; } + + .mr-xl-4, + .mx-xl-4 { + margin-right: 1.5rem !important; } + + .mb-xl-4, + .my-xl-4 { + margin-bottom: 1.5rem !important; } + + .ml-xl-4, + .mx-xl-4 { + margin-left: 1.5rem !important; } + + .m-xl-5 { + margin: 3rem !important; } + + .mt-xl-5, + .my-xl-5 { + margin-top: 3rem !important; } + + .mr-xl-5, + .mx-xl-5 { + margin-right: 3rem !important; } + + .mb-xl-5, + .my-xl-5 { + margin-bottom: 3rem !important; } + + .ml-xl-5, + .mx-xl-5 { + margin-left: 3rem !important; } + + .p-xl-0 { + padding: 0 !important; } + + .pt-xl-0, + .py-xl-0 { + padding-top: 0 !important; } + + .pr-xl-0, + .px-xl-0 { + padding-right: 0 !important; } + + .pb-xl-0, + .py-xl-0 { + padding-bottom: 0 !important; } + + .pl-xl-0, + .px-xl-0 { + padding-left: 0 !important; } + + .p-xl-1 { + padding: 0.25rem !important; } + + .pt-xl-1, + .py-xl-1 { + padding-top: 0.25rem !important; } + + .pr-xl-1, + .px-xl-1 { + padding-right: 0.25rem !important; } + + .pb-xl-1, + .py-xl-1 { + padding-bottom: 0.25rem !important; } + + .pl-xl-1, + .px-xl-1 { + padding-left: 0.25rem !important; } + + .p-xl-2 { + padding: 0.5rem !important; } + + .pt-xl-2, + .py-xl-2 { + padding-top: 0.5rem !important; } + + .pr-xl-2, + .px-xl-2 { + padding-right: 0.5rem !important; } + + .pb-xl-2, + .py-xl-2 { + padding-bottom: 0.5rem !important; } + + .pl-xl-2, + .px-xl-2 { + padding-left: 0.5rem !important; } + + .p-xl-3 { + padding: 1rem !important; } + + .pt-xl-3, + .py-xl-3 { + padding-top: 1rem !important; } + + .pr-xl-3, + .px-xl-3 { + padding-right: 1rem !important; } + + .pb-xl-3, + .py-xl-3 { + padding-bottom: 1rem !important; } + + .pl-xl-3, + .px-xl-3 { + padding-left: 1rem !important; } + + .p-xl-4 { + padding: 1.5rem !important; } + + .pt-xl-4, + .py-xl-4 { + padding-top: 1.5rem !important; } + + .pr-xl-4, + .px-xl-4 { + padding-right: 1.5rem !important; } + + .pb-xl-4, + .py-xl-4 { + padding-bottom: 1.5rem !important; } + + .pl-xl-4, + .px-xl-4 { + padding-left: 1.5rem !important; } + + .p-xl-5 { + padding: 3rem !important; } + + .pt-xl-5, + .py-xl-5 { + padding-top: 3rem !important; } + + .pr-xl-5, + .px-xl-5 { + padding-right: 3rem !important; } + + .pb-xl-5, + .py-xl-5 { + padding-bottom: 3rem !important; } + + .pl-xl-5, + .px-xl-5 { + padding-left: 3rem !important; } + + .m-xl-n1 { + margin: -0.25rem !important; } + + .mt-xl-n1, + .my-xl-n1 { + margin-top: -0.25rem !important; } + + .mr-xl-n1, + .mx-xl-n1 { + margin-right: -0.25rem !important; } + + .mb-xl-n1, + .my-xl-n1 { + margin-bottom: -0.25rem !important; } + + .ml-xl-n1, + .mx-xl-n1 { + margin-left: -0.25rem !important; } + + .m-xl-n2 { + margin: -0.5rem !important; } + + .mt-xl-n2, + .my-xl-n2 { + margin-top: -0.5rem !important; } + + .mr-xl-n2, + .mx-xl-n2 { + margin-right: -0.5rem !important; } + + .mb-xl-n2, + .my-xl-n2 { + margin-bottom: -0.5rem !important; } + + .ml-xl-n2, + .mx-xl-n2 { + margin-left: -0.5rem !important; } + + .m-xl-n3 { + margin: -1rem !important; } + + .mt-xl-n3, + .my-xl-n3 { + margin-top: -1rem !important; } + + .mr-xl-n3, + .mx-xl-n3 { + margin-right: -1rem !important; } + + .mb-xl-n3, + .my-xl-n3 { + margin-bottom: -1rem !important; } + + .ml-xl-n3, + .mx-xl-n3 { + margin-left: -1rem !important; } + + .m-xl-n4 { + margin: -1.5rem !important; } + + .mt-xl-n4, + .my-xl-n4 { + margin-top: -1.5rem !important; } + + .mr-xl-n4, + .mx-xl-n4 { + margin-right: -1.5rem !important; } + + .mb-xl-n4, + .my-xl-n4 { + margin-bottom: -1.5rem !important; } + + .ml-xl-n4, + .mx-xl-n4 { + margin-left: -1.5rem !important; } + + .m-xl-n5 { + margin: -3rem !important; } + + .mt-xl-n5, + .my-xl-n5 { + margin-top: -3rem !important; } + + .mr-xl-n5, + .mx-xl-n5 { + margin-right: -3rem !important; } + + .mb-xl-n5, + .my-xl-n5 { + margin-bottom: -3rem !important; } + + .ml-xl-n5, + .mx-xl-n5 { + margin-left: -3rem !important; } + + .m-xl-auto { + margin: auto !important; } + + .mt-xl-auto, + .my-xl-auto { + margin-top: auto !important; } + + .mr-xl-auto, + .mx-xl-auto { + margin-right: auto !important; } + + .mb-xl-auto, + .my-xl-auto { + margin-bottom: auto !important; } + + .ml-xl-auto, + .mx-xl-auto { + margin-left: auto !important; } } +.visible { + visibility: visible !important; } + +.invisible { + visibility: hidden !important; } diff --git a/lib/tpl/bootstrap3/css/callouts.less b/lib/tpl/bootstrap3/css/callouts.less new file mode 100644 index 0000000..033ce92 --- /dev/null +++ b/lib/tpl/bootstrap3/css/callouts.less @@ -0,0 +1,147 @@ + +/* + * Callouts (from Twitter Bootstrap Documentation) + * + * Not quite alerts, but custom and helpful notes for folks reading the docs. + * Requires a base and modifier class. + */ + +/* Common styles for all types */ +.bs-callout { + padding: 20px; + margin: 20px 0; + border: 1px solid #eee; + border-left-width: 5px; + border-radius: 3px; +} +.bs-callout h4 { + margin-top: 0; + margin-bottom: 5px; +} +.bs-callout p:last-child { + margin-bottom: 0; +} +.bs-callout code { + border-radius: 3px; +} +.bs-callout+.bs-callout { + margin-top: -5px; +} +.bs-callout-default { + border-left-color: #777; +} +.bs-callout-default h4 { + color: #777; +} +.bs-callout-primary { + border-left-color: #428bca; +} +.bs-callout-primary h4 { + color: #428bca; +} +.bs-callout-success { + border-left-color: #5cb85c; +} +.bs-callout-success h4 { + color: #5cb85c; +} +.bs-callout-danger { + border-left-color: #d9534f; +} +.bs-callout-danger h4 { + color: #d9534f; +} +.bs-callout-warning { + border-left-color: #f0ad4e; +} +.bs-callout-warning h4 { + color: #f0ad4e; +} +.bs-callout-info { + border-left-color: #5bc0de; +} +.bs-callout-info h4 { + color: #5bc0de; +} + + +.bootswatch-callout(@theme, @primary, @success, @info, @warning, @danger) { + + .@{theme} .bs-callout-primary { + + border-left-color: @primary; + + h4, .bs-callout-icon { + color: @primary; + } + + } + + .@{theme} .bs-callout-success { + + border-left-color: @success; + + h4, .bs-callout-icon { + color: @success; + } + + } + + .@{theme} .bs-callout-info { + + border-left-color: @info; + + h4, .bs-callout-icon { + color: @info; + } + + } + + .@{theme} .bs-callout-warning { + + border-left-color: @warning; + + h4, .bs-callout-icon { + color: @warning; + } + + } + + .@{theme} .bs-callout-danger { + + border-left-color: @danger; + + h4, .bs-callout-icon { + color: @danger; + } + + } + +} + +/** + * Callauts for Bootswatch themes + */ +.bootswatch-callout(cerulean, #2FA4E7, #73A839, #033C73, #DD5600, #C71C22); +.bootswatch-callout(cosmo, #2780E3, #3FB618, #9954BB, #FF7518, #FF0039); +.bootswatch-callout(cyborg, #2A9FD6, #77B300, #9933CC, #FF8800, #CC0000); +.bootswatch-callout(darkly, #375A7F, #00BC8C, #3498DB, #F39C12, #E74C3C); +.bootswatch-callout(flatly, #2C3E50, #18BC9C, #3498DB, #F39C12, #E74C3C); +.bootswatch-callout(journal, #EB6864, #22B24C, #336699, #F5E625, #F57A00); +.bootswatch-callout(lumen, #158CBA, #28B62C, #75CAEB, #FF851B, #FF4136); +.bootswatch-callout(paper, #2196F3, #4CAF50, #9C27B0, #FF9800, #E51C23); +.bootswatch-callout(readable, #4582EC, #3FAD46, #5BC0DE, #F0AD4E, #D9534F); +.bootswatch-callout(sandstone, #325D88, #93C54B, #29ABE0, #F47C3C, #D9534F); +.bootswatch-callout(simplex, #D9230F, #469408, #029ACF, #9B479F, #D9831F); +.bootswatch-callout(slate, #7A8288, #62C462, #5BC0DE, #F89406, #EE5F5B); +.bootswatch-callout(solar, #425358, #2AA198, #268BD2, #CB4B16, #D33682); +.bootswatch-callout(spacelab, #446E9B, #3CB521, #3399F3, #D47500, #CD0200); +.bootswatch-callout(superhero, #DF691A, #5CB85C, #5BC0DE, #F0AD4E, #D9534F); +.bootswatch-callout(united, #E95420, #38B44A, #772953, #EFB73E, #DF382C); +.bootswatch-callout(yeti, #008CBA, #43AC6A, #5BC0DE, #E99002, #F04124); + +/** + * Fix for SVG icon + */ +i.bs-callout-icon { font-size: 2em; } +svg.bs-callout-icon { height: 32px; width: 32px; } diff --git a/lib/tpl/bootstrap3/css/core/_admin.less b/lib/tpl/bootstrap3/css/core/_admin.less new file mode 100644 index 0000000..38ca4bc --- /dev/null +++ b/lib/tpl/bootstrap3/css/core/_admin.less @@ -0,0 +1,64 @@ +.dokuwiki div.ui-admin { + + /* main task grouped in two columns */ + ul.admin_tasks { + float: left; + width: 40%; + list-style-type: none; + font-size: 1.125em; + } + [dir=rtl] & ul.admin_tasks { + float: right; + } + + /* general menu item styling */ + ul { + padding: 0; + li { + margin: 0 0 1em 0; + font-weight: bold; + list-style-type: none; + white-space: nowrap; + + a { + display: flex; + span { + display: inline-block; + + &.icon { + width: 1.5em; + min-height: 1.5em; + margin: 0 0.5em; + vertical-align: top; + + svg { + width: 1.5em; + height: 1.5em; + fill: @ini_link; + display: inline-block; + path { + fill: @ini_link; + } + } + } + + &.prompt { + white-space: normal; + } + } + } + } + } + + /* DokuWiki version */ + #admin__version { + clear: left; + float: right; + color: @ini_text_neu; + background-color: inherit; + } + [dir=rtl] & #admin__version { + clear: right; + float: left; + } +} diff --git a/lib/tpl/bootstrap3/css/core/_edit.css b/lib/tpl/bootstrap3/css/core/_edit.css new file mode 100644 index 0000000..30926be --- /dev/null +++ b/lib/tpl/bootstrap3/css/core/_edit.css @@ -0,0 +1,141 @@ +/** + * This file provides styles for the edit view (?do=edit), preview + * and section edit buttons. + */ + +/* edit view +********************************************************************/ + +.dokuwiki div.editBox { +} + +/*____________ toolbar ____________*/ + +.dokuwiki div.toolbar { + display: inline-block; + margin-bottom: .5em; +} +#draft__status { + float: right; + color: @ini_text_alt; + background-color: inherit; +} +[dir=rtl] #draft__status { + float: left; +} +#tool__bar { + float: left; +} +[dir=rtl] #tool__bar { + float: right; +} + +/* buttons inside of toolbar */ +.dokuwiki div.toolbar button.toolbutton { +} +/* picker popups (outside of .dokuwiki) */ +div.picker { + width: 300px; + border: 1px solid @ini_border; + background-color: @ini_background_alt; + color: inherit; +} +/* picker for headlines */ +div.picker.pk_hl { + width: auto; +} + +/* buttons inside of picker */ +div.picker button.pickerbutton, +div.picker button.toolbutton { + padding: .1em .35em; + border-width: 0; +} + +/*____________ edit textarea ____________*/ + +.dokuwiki textarea.edit { + width: 100%; + margin-bottom: .5em; +} + +/*____________ below the textarea ____________*/ + +.dokuwiki div.editBar { + overflow: hidden; + margin-bottom: .5em; +} + +/* size and wrap controls */ +#size__ctl { + float: right; +} +[dir=rtl] #size__ctl { + float: left; +} +#size__ctl img { + cursor: pointer; +} + +/* edit buttons */ +.dokuwiki .editBar .editButtons { + display: inline; + margin-right: 1em; +} +[dir=rtl] .dokuwiki .editBar .editButtons { + margin-right: 0; + margin-left: 1em; +} +.dokuwiki .editBar .editButtons button { +} + +/* summary input and minor changes checkbox */ +.dokuwiki .editBar .summary { + display: inline; +} +.dokuwiki .editBar .summary label { + vertical-align: middle; + white-space: nowrap; +} +.dokuwiki .editBar .summary label span { + vertical-align: middle; +} +.dokuwiki .editBar .summary input { +} +/* change background colour if summary is missing */ +.dokuwiki .editBar .summary input.missing { + color: @ini_text; + background-color: #ffcccc; +} + +/* preview +********************************************************************/ + +.dokuwiki div.preview { + border: dotted @ini_border; + border-width: .2em 0; + padding: 1.4em 0; + margin-bottom: 1.4em; +} + +/* section edit buttons +********************************************************************/ + +.dokuwiki .secedit { + float: right; + margin-top: -1.4em; +} +[dir=rtl] .dokuwiki .secedit { + float: left; +} +.dokuwiki .secedit button { + font-size: 75%; +} + +/* style for section highlighting */ +.dokuwiki div.section_highlight { + margin: 0 -1em; /* negative side margin = side padding + side border */ + padding: 0 .5em; + border: solid @ini_background_alt; + border-width: 0 .5em; +} diff --git a/lib/tpl/bootstrap3/css/core/_fileuploader.css b/lib/tpl/bootstrap3/css/core/_fileuploader.css new file mode 100644 index 0000000..f300396 --- /dev/null +++ b/lib/tpl/bootstrap3/css/core/_fileuploader.css @@ -0,0 +1,107 @@ +/** + * This file provides the styles for the file uploader + * used in the media manager (both fullscreen and popup). + */ + +.qq-uploader { + position: relative; + width: 100%; +} + +.qq-uploader .error { + color: #f00; + background-color: #fff; +} + +/* select file button */ + +.qq-upload-button { + display: inline-block; + text-decoration: none; + font-size: 100%; + cursor: pointer; + margin: 1px 1px 5px; +} + +.qq-upload-button-focus { + outline: 1px dotted; +} + +/* drop area */ + +.qq-upload-drop-area { + position: absolute; + top: 0; + left: 0; + width: 100%; + height: 100%; + min-height: 70px; + z-index: 2; + background: @ini_background_neu; + color: @ini_text; + text-align: center; +} + +.qq-upload-drop-area span { + display: block; + position: absolute; + top: 50%; + width: 100%; + margin-top: -8px; + font-size: 120%; +} + +.qq-upload-drop-area-active { + background: @ini_background_alt; +} + +/* list of files to upload */ + +div.qq-uploader ul { + margin: 0; + padding: 0; + list-style: none; +} + +.qq-uploader li { + margin: 0 0 5px; + color: @ini_text; +} + +.qq-uploader li span, +.qq-uploader li input, +.qq-uploader li a { + margin-right: 5px; +} + +.qq-upload-file { + display: block; + font-weight: bold; +} + +.qq-upload-spinner { + display: inline-block; + background: url("../../images/throbber.gif"); + width: 15px; + height: 15px; + vertical-align: text-bottom; +} + +.qq-upload-size, +.qq-upload-cancel { + font-size: 85%; +} + +.qq-upload-failed-text { + display: none; +} +.qq-upload-fail .qq-upload-failed-text { + display: inline; +} + +.qq-action-container * { + vertical-align: middle; +} +.qq-overwrite-check input { + margin-left: 10px; +} diff --git a/lib/tpl/bootstrap3/css/core/_forms.css b/lib/tpl/bootstrap3/css/core/_forms.css new file mode 100644 index 0000000..bf70fa2 --- /dev/null +++ b/lib/tpl/bootstrap3/css/core/_forms.css @@ -0,0 +1,106 @@ +/* TODO: this file is not up to the best standards and will be fixed after an overhaul of the form code */ + +/** + * This file provides styles for forms in general and specifically + * for ?do= + * - login + * - resendpwd + * - register + * - profile + * - subscribe + */ + +/* ---------------- forms ------------------------ */ + +.dokuwiki form { + border: none; + display: inline; +} + +.dokuwiki label.block { + display: block; + text-align: right; + font-weight: bold; +} +[dir=rtl] .dokuwiki label.block { + text-align: left; +} + +.dokuwiki label.simple { + display: block; + text-align: left; + font-weight: normal; +} +[dir=rtl] .dokuwiki label.simple { + text-align: right; +} + +.dokuwiki label.block select, +.dokuwiki label.block input.edit { + width: 50%; +} + +.dokuwiki label span { + vertical-align: middle; +} + +.dokuwiki fieldset { + width: 400px; + text-align: center; + border: 1px solid @ini_border; + padding: 0.5em; + margin: auto; +} + + +.dokuwiki input.edit, +.dokuwiki select.edit { + vertical-align: middle; +} +.dokuwiki select.edit { + padding: 0.1em 0; +} + + +.dokuwiki button { + vertical-align: middle; +} +/** + * Styles for auth forms + */ +#dw__login label[for="remember__me"] { + margin-left: 50%; + margin-bottom: 1.4em; +} +#dw__login fieldset, +#dw__resendpwd fieldset, +#dw__register fieldset { + padding-bottom: 0.7em; +} +#dw__profiledelete { + display: block; + margin-top: 2.8em; +} + +/** + * Styles for the subscription page + */ + +#subscribe__form { + display: block; + width: 400px; + text-align: center; +} + +#subscribe__form fieldset { + text-align: left; + margin: 0.5em 0; +} +[dir=rtl] #subscribe__form fieldset { + text-align: right; +} + +#subscribe__form label { + display: block; + margin: 0 0.5em 0.5em; +} diff --git a/lib/tpl/bootstrap3/css/core/_links.css b/lib/tpl/bootstrap3/css/core/_links.css new file mode 100644 index 0000000..695f4b8 --- /dev/null +++ b/lib/tpl/bootstrap3/css/core/_links.css @@ -0,0 +1,69 @@ +/** + * This file provides styles for all types of links. + */ + +/*____________ links to wiki pages ____________*/ + +/* existing wikipage */ +.dokuwiki a.wikilink1 { +} +/* not existing wikipage */ +.dokuwiki a.wikilink2 { + text-decoration: none; +} +.dokuwiki a.wikilink2:link, +.dokuwiki a.wikilink2:visited { + border-bottom: 1px dashed; +} +.dokuwiki a.wikilink2:hover, +.dokuwiki a.wikilink2:active, +.dokuwiki a.wikilink2:focus { + border-bottom-width: 0; +} + +/* any link to current page */ +.dokuwiki span.curid a { + font-weight: bold; +} + +/*____________ other link types ____________*/ + +.dokuwiki a.urlextern, +.dokuwiki a.windows, +.dokuwiki a.mail, +.dokuwiki a.mediafile, +.dokuwiki a.interwiki { + background-repeat: no-repeat; + background-position: 0 center; + padding: 0 0 0 18px; +} +/* external link */ +.dokuwiki a.urlextern { + background-image: url(../../images/external-link.png); +} +/* windows share */ +.dokuwiki a.windows { + background-image: url(../../images/unc.png); +} +/* email link */ +.dokuwiki a.mail { + background-image: url(../../images/email.png); +} + +/* icons of the following are set by dokuwiki in lib/exe/css.php */ +/* link to some embedded media */ +.dokuwiki a.mediafile { +} +/* interwiki link */ +.dokuwiki a.interwiki { +} + +/* RTL corrections; if link icons don't work as expected, remove the following lines */ +[dir=rtl] .dokuwiki a.urlextern, +[dir=rtl] .dokuwiki a.windows, +[dir=rtl] .dokuwiki a.mail, +[dir=rtl] .dokuwiki a.interwiki, +[dir=rtl] .dokuwiki a.mediafile { + background-position: right center; + padding: 0 18px 0 0; +} diff --git a/lib/tpl/bootstrap3/css/core/_media_fullscreen.css b/lib/tpl/bootstrap3/css/core/_media_fullscreen.css new file mode 100644 index 0000000..9a00d4d --- /dev/null +++ b/lib/tpl/bootstrap3/css/core/_media_fullscreen.css @@ -0,0 +1,541 @@ +/** + * This file provides the styles for the fullscreen media manager + * (?do=media). + * + * What most templates would probably need to change (depending on + * their site width) are the 4 min-width's (search for @change). + */ + + +/*____________ structure ____________*/ + +#mediamanager__page h1 { + margin-bottom: .5em; +} + +#mediamanager__page { + /* min-width must be summary of all 3 panels' min-widths */ + min-width: 50em; /* @change */ + width: 100%; + text-align: left; +} +[dir=rtl] #mediamanager__page { + text-align: right; +} +#mediamanager__page .panel { + float: left; +} +[dir=rtl] #mediamanager__page .panel { + float: right; +} + +#mediamanager__page .namespaces { + width: 20%; + min-width: 10em; /* @change */ + left:0 !important; /* overrules jQuery UI resizable in rtl */ +} +#mediamanager__page .filelist { + width: 50%; + min-width: 25em; /* @change */ + left:0 !important; /* overrules jQuery UI resizable in rtl */ +} +#mediamanager__page .file { + width: 30%; + min-width: 15em; /* @change */ +} + +#mediamanager__page .tabs li { + white-space: nowrap; +} + +#mediamanager__page .panelHeader { + background-color: @ini_background_alt; + margin: 0 10px 10px 0; + padding: 10px 10px 8px; + text-align: left; + min-height: 20px; + overflow: hidden; +} +[dir=rtl] #mediamanager__page .panelHeader { + text-align: right; + margin: 0 0 10px 10px; +} +#mediamanager__page .panelContent { + overflow-y: auto; + overflow-x: hidden; + padding: 0; + margin: 0 10px 10px 0; + position: relative; +} +[dir=rtl] #mediamanager__page .panelContent { + text-align: right; + margin: 0 0 10px 10px; +} + +#mediamanager__page .file .panelHeader, +#mediamanager__page .file .panelContent { + margin-right: 0; +} +[dir=rtl] #mediamanager__page .file .panelHeader, +[dir=rtl] #mediamanager__page .file .panelContent { + margin-left: 0; +} + +#mediamanager__page .ui-resizable-e { + width: 6px; + right: 2px; + background: transparent url(../../images/resizecol.png) center center no-repeat; +} +#mediamanager__page .ui-resizable-e:hover { + background-color: @ini_background_alt; +} +[dir=rtl] #mediamanager__page .ui-resizable-w { + width: 6px; + left: 2px; + background: transparent url(../../images/resizecol.png) center center no-repeat; +} +[dir=rtl] #mediamanager__page .ui-resizable-w:hover { + background-color: @ini_background_alt; +} + + +#mediamanager__page dd { + margin: 0; +} + +#mediamanager__page .panelHeader h3 { + float: left; + font-weight: normal; + font-size: 1em; + padding: 0; + margin: 0 0 3px; +} +[dir=rtl] #mediamanager__page .panelHeader h3 { + float : right +} + + +/*____________ namespaces panel ____________*/ + +[dir=rtl] #mediamanager__page .namespaces { + text-align: right; +} + +/* make it look like a tab (as in _tabs.css) */ +#mediamanager__page .namespaces h2 { + font-size: 1em; + display: inline-block; + padding: .3em .8em; + margin: 0 0 0 .3em; + border-radius: .5em .5em 0 0; + font-weight: normal; + background-color: @ini_background_alt; + color: @ini_text; + border: 1px solid @ini_border; + border-bottom-color: @ini_background_alt; + line-height: 1.4em; + position: relative; + bottom: -1px; + z-index: 2; +} +[dir=rtl] #mediamanager__page .namespaces h2 { + margin: 0 .3em 0 0; + position: relative; + right: 10px; +} +#mediamanager__page .namespaces .panelHeader { + border-top: 1px solid @ini_border; + z-index: 1; +} + +#mediamanager__page .namespaces ul { + margin-left: .2em; + margin-bottom: 0; + padding: 0; + list-style: none; +} +[dir=rtl] #mediamanager__page .namespaces ul { + margin-left: 0; + margin-right: .2em; +} +#mediamanager__page .namespaces ul ul { + margin-left: 1em; +} +[dir=rtl] #mediamanager__page .namespaces ul ul { + margin-left: 0; + margin-right: 1em; +} +#mediamanager__page .namespaces ul ul li { + margin: 0; +} + +#mediamanager__page .namespaces ul .selected { + background-color: __highlight__; + font-weight: bold; +} + + +/*____________ file list panel ____________*/ + +/* file list header */ + +#mediamanager__page .panelHeader form.options { + float: right; + margin-top: -3px; +} +[dir=rtl] #mediamanager__page .panelHeader form.options { + float : left +} +#mediamanager__page .panelHeader ul { + list-style: none; + margin: 0; + padding: 0; +} +#mediamanager__page .panelHeader ul li { + color: @ini_text; + float: left; + line-height: 1; + padding-left: 3px; +} +[dir=rtl] #mediamanager__page .panelHeader ul li { + padding-right: 3px; + padding-left: 0; + float: right; +} + +#mediamanager__page .panelHeader ul li.ui-controlgroup-horizontal { + padding-left: 30px; + margin: 0 0 0 5px; +} +#mediamanager__page .panelHeader ul li.listType { + background: url('../../images/icon-list.png') 3px 1px no-repeat; +} +#mediamanager__page .panelHeader ul li.sortBy { + background: url('../../images/icon-sort.png') 3px 1px no-repeat; +} +[dir=rtl] #mediamanager__page .panelHeader ul li.ui-controlgroup-horizontal { + padding-left: 0; + padding-right: 30px; + margin: 0 5px 0 0; + background-position: right 1px; +} + +#mediamanager__page .panelHeader form.options .ui-controlgroup-horizontal label{ + font-size: 90%; + margin-right: -0.4em; + padding: .3em .5em; + line-height: 1; +} + +/* file list content */ + +#mediamanager__page .filelist ul { + padding: 0; + margin: 0 10px 0 0; +} +[dir=rtl] #mediamanager__page .filelist ul { + margin: 0 0 0 10px; +} +#mediamanager__page .filelist ul.rows { + margin: 0; +} +#mediamanager__page .filelist .panelContent ul li:hover { + background-color: @ini_background_alt; +} + +#mediamanager__page .filelist li dt a { + vertical-align: middle; + display: table-cell; + overflow: hidden; +} + +/* file list as thumbs */ + +#mediamanager__page .filelist .thumbs li { + width: 100px; + min-height: 130px; + display: inline-block; + /* the right margin should visually be 10px, but because of its inline-block nature the whitespace inbetween is about 4px more */ + margin: 0 6px 10px 0; + background-color: @ini_background_neu; + color: @ini_text; + padding: 5px; + vertical-align: top; + text-align: center; + position: relative; + line-height: 1.2; +} +[dir=rtl] #mediamanager__page .filelist .thumbs li { + margin-right: 0; + margin-left: 6px; +} + +#mediamanager__page .filelist .thumbs li dt a { + width: 100px; + height: 90px; +} + +#mediamanager__page .filelist .thumbs li dt a img { + max-width: 90px; + max-height: 90px; +} + +#mediamanager__page .filelist .thumbs li .name, +#mediamanager__page .filelist .thumbs li .size, +#mediamanager__page .filelist .thumbs li .filesize, +#mediamanager__page .filelist .thumbs li .date { + display: block; + overflow: hidden; + text-overflow: ellipsis; + width: 90px; + white-space: nowrap; +} +#mediamanager__page .filelist .thumbs li .name { + padding: 5px 0; + font-weight: bold; +} +#mediamanager__page .filelist .thumbs li .date { + font-style: italic; + white-space: normal; +} + +/* file list as rows */ + +#mediamanager__page .filelist .rows li { + list-style: none; + display: block; + position: relative; + max-height: 50px; + margin: 0 0 3px 0; + background-color: @ini_background; + color: @ini_text; + overflow: hidden; +} + +#mediamanager__page .filelist .rows li:nth-child(2n+1) { + background-color: @ini_background_neu; +} + +#mediamanager__page .filelist .rows li dt { + float: left; + width: 10%; + height: 40px; + text-align: center; +} +[dir=rtl] #mediamanager__page .filelist .rows li dt { + float: right; +} +#mediamanager__page .filelist .rows li dt a { + width: 100px; + height: 40px; +} + +#mediamanager__page .filelist .rows li dt a img { + max-width: 40px; + max-height: 40px; +} + +#mediamanager__page .filelist .rows li .name, +#mediamanager__page .filelist .rows li .size, +#mediamanager__page .filelist .rows li .filesize, +#mediamanager__page .filelist .rows li .date { + overflow: hidden; + text-overflow: ellipsis; + float: left; + margin-left: 1%; + white-space: nowrap; +} +[dir=rtl] #mediamanager__page .filelist .rows li .name, +[dir=rtl] #mediamanager__page .filelist .rows li .size, +[dir=rtl] #mediamanager__page .filelist .rows li .filesize, +[dir=rtl] #mediamanager__page .filelist .rows li .date { + float: right; + margin-left: 0; + margin-right: 1%; +} + +#mediamanager__page .filelist .rows li .name { + width: 30%; + font-weight: bold; +} +#mediamanager__page .filelist .rows li .size, +#mediamanager__page .filelist .rows li .filesize { + width: 15%; +} +#mediamanager__page .filelist .rows li .date { + width: 20%; + font-style: italic; + white-space: normal; +} + +/* upload form */ + +#mediamanager__page div.upload { + padding-bottom: 0.5em; +} + +/*____________ file panel ____________*/ + +#mediamanager__page .file ul.actions { + text-align: center; + margin: 0 0 5px; + padding: 0; + list-style: none; +} +#mediamanager__page .file ul.actions li { + display: inline; + margin: 0; +} + +#mediamanager__page .file div.image { + margin-bottom: 5px; + text-align: center; +} + +#mediamanager__page .file div.image img { + width: 100%; +} + +#mediamanager__page .file dl { + margin-bottom: 0; +} +#mediamanager__page .file dl dt { + font-weight: bold; + display: block; + background-color: @ini_background_alt; +} +#mediamanager__page .file dl dd { + display: block; + background-color: @ini_background_neu; +} + + +/* file meta data edit form */ + +#mediamanager__page form.meta div.row { + margin-bottom: 5px; +} + +#mediamanager__page form.meta label span { + display: block; +} + +#mediamanager__page form.meta input { + width: 50%; +} + +#mediamanager__page form.meta button { + width: auto; +} + +#mediamanager__page form.meta textarea.edit { + height: 6em; + width: 95%; + min-width: 95%; + max-width: 95%; +} + +/* file revisions form */ + +#mediamanager__page form.changes ul { + margin-left: 10px; + padding: 0; + list-style-type: none; +} +[dir=rtl] #mediamanager__page form.changes ul { + margin-left: 0; + margin-right: 10px; +} + +#mediamanager__page form.changes ul li div.li div { + font-size: 90%; + color: @ini_text_neu; + padding-left: 18px; +} +[dir=rtl] #mediamanager__page form.changes ul li div.li div { + padding-left: 0; + padding-right: 18px; +} +#mediamanager__page form.changes ul li div.li input { + position: relative; + top: 1px; +} + +/* file diff view */ + +#mediamanager__diff table { + table-layout: fixed; + border-width: 0; +} + +#mediamanager__diff td, +#mediamanager__diff th { + width: 48%; + margin: 0 5px 10px 0; + padding: 0; + vertical-align: top; + text-align: left; + border-color: @ini_background; +} +[dir=rtl] #mediamanager__diff td, +[dir=rtl] #mediamanager__diff th { + margin: 0 0 10px 5px; + text-align: right; +} + +#mediamanager__diff th { + font-weight: normal; + background-color: @ini_background; + line-height: 1.2; +} +#mediamanager__diff th a { + font-weight: bold; +} +#mediamanager__diff th span { + font-size: 90%; +} + +#mediamanager__diff dl dd strong{ + background-color: __highlight__; + color: @ini_text; + font-weight: normal; +} + +/* image diff views */ + +#mediamanager__page .file form.diffView { + margin-bottom: 10px; + display: block; +} + +#mediamanager__diff div.slider { + margin: 10px; + width: 95%; +} + +#mediamanager__diff .imageDiff { + position: relative; +} +#mediamanager__diff .imageDiff .image2 { + position: absolute; + top: 0; + left: 0; +} + +#mediamanager__diff .imageDiff.opacity .image2 { + opacity: 0.5; +} + +#mediamanager__diff .imageDiff.portions .image2 { + border-right: 1px solid red; + overflow: hidden; +} + +#mediamanager__diff .imageDiff.portions img { + float: left; +} + +#mediamanager__diff .imageDiff img { + width: 100%; + max-width: none; +} diff --git a/lib/tpl/bootstrap3/css/core/_media_popup.css b/lib/tpl/bootstrap3/css/core/_media_popup.css new file mode 100644 index 0000000..0be5c49 --- /dev/null +++ b/lib/tpl/bootstrap3/css/core/_media_popup.css @@ -0,0 +1,208 @@ +/** + * This file provides styles for the media manager popup + * (mediamanager.php). + */ + +/*____________ structure ____________*/ + +html.popup { + overflow: auto; +} + +#media__manager { + height: 100%; + overflow: hidden; +} + +#mediamgr__aside { + width: 30%; + height: 100%; + overflow: auto; + position: absolute; + left: 0; + border-right: 1px solid @ini_border; +} +[dir=rtl] #mediamgr__aside { + left: auto; + right: 0; + border-right-width: 0; + border-left: 1px solid @ini_border; +} +#mediamgr__aside .pad { + padding: .5em; +} + +#mediamgr__content { + width: 69.7%; + height: 100%; + overflow: auto; + position: absolute; + right: 0; +} +[dir=rtl] #mediamgr__content { + right: auto; + left: 0; +} +#mediamgr__content .pad { + padding: .5em; +} + +#media__manager h1, +#media__manager h2 { + font-size: 1.5em; + margin-bottom: .5em; + padding-bottom: .2em; + border-bottom: 1px solid @ini_border; +} + +/* left side +********************************************************************/ + +/*____________ options ____________*/ + +#media__opts { + margin-bottom: .5em; +} + +#media__opts input { + margin-right: .3em; +} +[dir=rtl] #media__opts input { + margin-right: 0; + margin-left: .3em; +} +#media__opts label { +} + +/*____________ tree ____________*/ + +#media__tree ul { + padding-left: .2em; +} +[dir=rtl] #media__tree ul { + padding-left: 0; + padding-right: .2em; +} +#media__tree ul li { + clear: left; + list-style-type: none; + list-style-image: none; + margin-left: 0; +} +[dir=rtl] #media__tree ul li { + clear: right; + margin-right: 0; +} +#media__tree ul li img { + float: left; + padding: .5em .3em 0 0; +} +[dir=rtl] #media__tree ul li img { + float: right; + padding: .5em 0 0 .3em; +} +#media__tree ul li div.li { + display: inline; +} +#media__tree ul li li { + margin-left: 1.5em; +} +[dir=rtl] #media__tree ul li li { + margin-left: 0; + margin-right: 1.5em; +} + +/* right side +********************************************************************/ + +/*____________ upload form ____________*/ + +/* upload info */ +#media__content div.upload { + font-size: .9em; + margin-bottom: .5em; +} + +#mediamanager__uploader { + margin-bottom: 1em; +} +#mediamanager__uploader p { + margin-bottom: .5em; +} + +/*____________ file list ____________*/ + +#media__content img.load { + margin: 1em auto; +} + +#media__content .odd, +#media__content .even { + padding: .5em; +} +#media__content .odd { + background-color: @ini_background_alt; +} +#media__content .even { +} +/* highlight newly uploaded or edited file */ +#media__content #scroll__here { + border: 1px dashed @ini_border; +} + +/* link which inserts media file */ +#media__content a.mediafile { + margin-right: 1.5em; + font-weight: bold; + cursor: pointer; +} +[dir=rtl] #media__content a.mediafile { + margin-right: 0; + margin-left: 1.5em; +} +#media__content span.info { +} +#media__content img.btn { + vertical-align: text-bottom; +} + +/* info how to insert media, if JS disabled */ +#media__content div.example { + color: @ini_text_neu; + margin-left: 1em; +} + +#media__content div.detail { + padding: .2em 0; +} +#media__content div.detail div.thumb { + float: left; + margin: 0 .5em 0 18px; +} +[dir=rtl] #media__content div.detail div.thumb { + float: right; + margin: 0 18px 0 .5em; +} +#media__content div.detail div.thumb a { + display: block; + cursor: pointer; +} +#media__content div.detail p { + margin-bottom: 0; +} + + +/*____________ media search ____________*/ + +#dw__mediasearch { +} +#dw__mediasearch p { +} +#dw__mediasearch label { +} +#dw__mediasearch label span { +} +#dw__mediasearch input.edit { +} +#dw__mediasearch button { +} diff --git a/lib/tpl/bootstrap3/css/core/_modal.css b/lib/tpl/bootstrap3/css/core/_modal.css new file mode 100644 index 0000000..37f6483 --- /dev/null +++ b/lib/tpl/bootstrap3/css/core/_modal.css @@ -0,0 +1,94 @@ +/** + * This file provides styles for modal dialogues. + */ + +.dokuwiki .ui-widget { + font-size: 100%; +} + + +/* link wizard (opens from the link button in the edit toolbar) +********************************************************************/ + +#link__wiz { +} + +[dir=rtl] #link__wiz_close { + float: left; +} + +#link__wiz_result { + background-color: @ini_background; + width: 293px; + height: 193px; + overflow: auto; + border: 1px solid @ini_border; + margin: 3px auto; + text-align: left; + line-height: 1; +} +[dir=rtl] #link__wiz_result { + text-align: right; +} + +#link__wiz_result div { + padding: 3px 3px 3px 0; +} + +#link__wiz_result div a { + display: block; + padding-left: 22px; + min-height: 16px; + background: transparent 3px center no-repeat; +} +[dir=rtl] #link__wiz_result div a { + padding: 3px 22px 3px 3px; + background-position: 257px 3px; +} + +#link__wiz_result div.type_u a { + background-image: url(../../images/up.png); +} +#link__wiz_result div.type_f a { + background-image: url(../../images/page.png); +} +#link__wiz_result div.type_d a { + background-image: url(../../images/ns.png); +} + +#link__wiz_result div.even { + background-color: @ini_background_neu; +} + +#link__wiz_result div.selected { + background-color: @ini_background_alt; +} + +#link__wiz_result span { + display: block; + color: @ini_text_neu; + margin-left: 22px; +} + + +/* media option wizard (opens when inserting media in the media popup) +********************************************************************/ + +#media__popup { + /* for backwards compatibility (not needed since Rincewind) */ + display: none; +} + +#media__popup_content p { + margin: 0 0 .5em; +} + +#media__popup_content label { + margin-right: .5em; + cursor: default; +} + +#media__popup_content button { + margin-right: 1px; + cursor: pointer; +} diff --git a/lib/tpl/bootstrap3/css/core/_search.less b/lib/tpl/bootstrap3/css/core/_search.less new file mode 100644 index 0000000..59400f9 --- /dev/null +++ b/lib/tpl/bootstrap3/css/core/_search.less @@ -0,0 +1,204 @@ +/** + * This file provides styles for the search results page (?do=search) + * and the AJAX search popup. + */ + +/* general +********************************************************************/ + +/* search hit in normal text */ +.dokuwiki .search_hit { + color: @ini_text; + background-color: __highlight__; +} + +/* "nothing found" at search + media */ +.dokuwiki div.nothing { + margin-bottom: 1.4em; +} + +/* search results page +********************************************************************/ + +/*____________ advanced search form ____________*/ +.dokuwiki .search-results-form fieldset.search-form { + width: 100%; + margin: 1em 0; + + input[name="q"] { + width: 50%; + } + + button.toggleAssistant { + float: right; + } + + .advancedOptions { + padding: 1em 0; + + > div { + display: inline-block; + position: relative; + margin: 0 0.5em; + } + + div.toggle { + // default closed toggle state + div.current { + cursor: pointer; + max-width: 10em; + white-space: nowrap; + overflow: hidden; + text-overflow: ellipsis; + + &::after { + content: '▼'; + font-size: smaller; + color: @ini_text_alt; + } + } + div.changed { + font-weight: bold; + } + ul { + display: none; + position: absolute; + border: 1px solid @ini_border; + background-color: @ini_background; + padding: 0.25em 0.5em; + text-align: left; + min-width: 10em; + max-width: 15em; + max-height: 50vh; + overflow: auto; + z-index: 100; + li { + margin: 0.25em 0; + list-style: none; + + a { + display: block; + } + } + } + + // open toggle state + &.open { + div.current::after { + content: '▲'; + } + + ul { + display: block; + } + } + } + } +} + +[dir=rtl] .search-results-form fieldset.search-form .advancedOptions { + div.toggle ul { + text-align: right; + } +} + + +/*____________ matching pagenames ____________*/ + +.dokuwiki div.search_quickresult { + margin-bottom: 1.4em; + + ul { + padding: 0; + + li { + float: left; + width: 12em; + margin: 0 1.5em; + } + } +} + +[dir=rtl] .dokuwiki div.search_quickresult ul li { + float: right; +} + +/*____________ search results ____________*/ + +.dokuwiki dl.search_results { + margin-bottom: 1.2em; + + /* search heading */ + dt { + font-weight: normal; + margin-bottom: .2em; + } + + /* last modified line */ + dd.meta { + margin: 0 0 .2em 0; + } + + /* search snippet */ + dd.snippet { + color: @ini_text_alt; + background-color: inherit; + margin: 0 0 1.2em 0; + + /* search hit in search results */ + strong.search_hit { + font-weight: normal; + /* color is set in general */ + } + + /* ellipsis separating snippets */ + .search_sep { + color: @ini_text; + background-color: inherit; + } + } +} + +/* AJAX quicksearch popup +********************************************************************/ + +.dokuwiki form.search { + div.no { + position: relative; + } + + /* .JSpopup */ + div.ajax_qsearch { + position: absolute; + top: 0; + left: -13.5em; /* -( width of #qsearch__in + padding of .ajax_qsearch + a bit more ) */ + width: 12em; + padding: 0.5em; + font-size: .9em; + z-index: 20; + text-align: left; + display: none; + + strong { + display: block; + margin-bottom: .3em; + } + + ul { + margin: 0 !important; + padding: 0 !important; + + li { + margin: 0; + padding: 0; + display: block !important; + } + } + } +} + +[dir=rtl] .dokuwiki form.search div.ajax_qsearch { + left: auto; + right: -13.5em; + text-align: right; +} diff --git a/lib/tpl/bootstrap3/css/diff.less b/lib/tpl/bootstrap3/css/diff.less new file mode 100644 index 0000000..330a49a --- /dev/null +++ b/lib/tpl/bootstrap3/css/diff.less @@ -0,0 +1,93 @@ +/*! + * DokuWiki Bootstrap3 Template: Difference + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +.dokuwiki { + + div.pagenav { + text-align: center; + margin: 1.5em 0; + } + + div.pagenav-prev, + div.pagenav-next { + display: inline; + margin: 0 0.5em; + } + + .diffoptions, + .diffnav { + padding: 0.5em 0 !important; + } + + .diff-blockheader { + padding: 0.5em 0 !important; + } + + .diff_inline td, th { + vertical-align: middle; + } + + .dokuwiki .diffoptions.group p { + float: right; + } + + .diffnav { + span { + display: none; + } + + a { + display: inline-block; + } + } + + table.diff { + + width: 100%; + border-width: 0; + overflow: hidden; + + form, label { + display: inline; + } + + select { + font-size: small; + width: 60%; + + option[selected] { + font-weight: bold; + } + } + + th, td { + vertical-align: top; + padding: 0; + border-width: 0; + } + + td { + font-family: monospace; + font-size: small; + + &.diff-context { + background-color: #fafafa; + } + } + + .diff_sidebyside th { + width: 50%; + } + + .diff-lineheader { + width: 0; + } + + } + +} diff --git a/lib/tpl/bootstrap3/css/mobile.less b/lib/tpl/bootstrap3/css/mobile.less new file mode 100644 index 0000000..09bbad1 --- /dev/null +++ b/lib/tpl/bootstrap3/css/mobile.less @@ -0,0 +1,73 @@ +/*! + * DokuWiki Bootstrap3 Template: Mobile and other devices styles + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +@media screen and (max-width: 767px) { + + .dokuwiki { + + fieldset, + label.block select, + label.block input.edit { + width: 100%; + text-align: left; + } + + label.block { + text-align: initial; + } + + label[for="remember__me"] { + margin-left: 0 !important; + } + + .centeralign form { + text-align: left; + } + + .dw-container.mx-5 { + margin-left: 0 !important; + margin-right: 0 !important; + } + + #config__manager { + td { + display: block; + margin: 5px; + } + td.value { + border-top: 0px solid transparent + } + } + + #insitu__fn { + max-width: initial !important; + position: fixed !important; + bottom: 0 !important; + left: 0 !important; + top: initial !important; + width: 90% !important; + margin: 10px; + z-index: 9999; + + &::before { + content: 'x'; + right: 5px; + position: absolute; + top: 5px; + cursor: pointer; + border-radius: 50%; + width: 16px; + height: 16px; + background: #ddd; + text-align: center; + } + } + + } + +} diff --git a/lib/tpl/bootstrap3/css/plugins/addnewpage.less b/lib/tpl/bootstrap3/css/plugins/addnewpage.less new file mode 100644 index 0000000..cf634e8 --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/addnewpage.less @@ -0,0 +1,24 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Add New Page Plugin */ +.nav .addnewpage { + + padding: 10px; + + select, + input { + margin-bottom: 5px; + } + + select, + input[type=text] { + width: 100% !important; + } + +} diff --git a/lib/tpl/bootstrap3/css/plugins/bureaucracy.less b/lib/tpl/bootstrap3/css/plugins/bureaucracy.less new file mode 100644 index 0000000..361e31a --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/bureaucracy.less @@ -0,0 +1,36 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Bureaucracy Plugin */ + +/* Styles for XS devices */ +@media screen and (max-width: 767px) { + + .dokuwiki { + + form.bureaucracy__plugin { + + label { + + text-align: left; + + input.edit, + select { + width: 100%; + } + + } + + } + + } +} + +.dokuwiki form.bureaucracy__plugin div.field { + margin-bottom: 5px; +} diff --git a/lib/tpl/bootstrap3/css/plugins/data.less b/lib/tpl/bootstrap3/css/plugins/data.less new file mode 100644 index 0000000..89101ad --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/data.less @@ -0,0 +1,12 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Data Plugin (Table) */ +table.dataplugin_table { + width: auto; +} diff --git a/lib/tpl/bootstrap3/css/plugins/database2.less b/lib/tpl/bootstrap3/css/plugins/database2.less new file mode 100644 index 0000000..3a7776b --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/database2.less @@ -0,0 +1,17 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Database2 */ +table.database2-single-editor { + .database2-label { + font-weight: bold; + text-align: right; + padding-right: 3px 1em 0px 1em; + vertical-align: top; + } +} diff --git a/lib/tpl/bootstrap3/css/plugins/datatables.less b/lib/tpl/bootstrap3/css/plugins/datatables.less new file mode 100644 index 0000000..35515c1 --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/datatables.less @@ -0,0 +1,21 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* DataTables Plugin */ +.dt-wrapper { + + .form-control { + width: auto; + display: initial; + } + + .dataTables_paginate a:hover { + cursor: pointer; + } + +} diff --git a/lib/tpl/bootstrap3/css/plugins/dir.less b/lib/tpl/bootstrap3/css/plugins/dir.less new file mode 100644 index 0000000..9c80e12 --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/dir.less @@ -0,0 +1,12 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Dir Plugin */ +table.pagelist tbody tr.row::before { + display: none; +} diff --git a/lib/tpl/bootstrap3/css/plugins/discussion.less b/lib/tpl/bootstrap3/css/plugins/discussion.less new file mode 100644 index 0000000..eab5d89 --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/discussion.less @@ -0,0 +1,41 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Discussion Plugin */ +div.dokuwiki { + + div.comment_wrapper { + + margin: 50px 0 0 0; + padding: 0; + background-color: inherit; + + div.panel-heading { + margin-top: 0; + padding: 5px; + clear: none; + } + + div.comment_body { + border: 0 hidden; + } + + div.comment_buttons { + float: none; + margin-top: initial; + padding: 5px; + } + + } + + #discussion__section { + color: inherit; + text-decoration: none; + } + +} diff --git a/lib/tpl/bootstrap3/css/plugins/inlinetoc.less b/lib/tpl/bootstrap3/css/plugins/inlinetoc.less new file mode 100644 index 0000000..12073de --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/inlinetoc.less @@ -0,0 +1,12 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* InlineTOC Plugin */ +.inlinetoc2 > li { + margin-left: -10px; +} diff --git a/lib/tpl/bootstrap3/css/plugins/linkback.less b/lib/tpl/bootstrap3/css/plugins/linkback.less new file mode 100644 index 0000000..3d4bbbb --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/linkback.less @@ -0,0 +1,14 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Linkback Plugin */ +div.linkback_wrapper { + background-color: inherit !important; + padding: 1em 0 !important; + margin: 0 !important; +} diff --git a/lib/tpl/bootstrap3/css/plugins/move.less b/lib/tpl/bootstrap3/css/plugins/move.less new file mode 100644 index 0000000..a5d6f0b --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/move.less @@ -0,0 +1,18 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Move Plugin */ + +#plugin_move__progress li { + min-height: 0 !important; + margin-top: 10px; +} + +#plugin_move__progress li.media { + overflow: initial !important; +} diff --git a/lib/tpl/bootstrap3/css/plugins/overlay.less b/lib/tpl/bootstrap3/css/plugins/overlay.less new file mode 100644 index 0000000..02f5c61 --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/overlay.less @@ -0,0 +1,30 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Overlay */ +#overlay { + + padding: 0; + font-size: small; + z-index: 9999; + + a { + text-decoration: none; + span { display: none; } + } + + .list-inline { + margin: 0; + padding: 0; + } + +} + +@media print { + #overlay { display: none; } +} diff --git a/lib/tpl/bootstrap3/css/plugins/publish.less b/lib/tpl/bootstrap3/css/plugins/publish.less new file mode 100644 index 0000000..5334eea --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/publish.less @@ -0,0 +1,18 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Publish Plugin */ +span.approval_action { + display:block; +} + +span.approval_action a, +span.approval_approved a { + color:inherit; + text-decoration:underline; +} diff --git a/lib/tpl/bootstrap3/css/plugins/simplenavi.less b/lib/tpl/bootstrap3/css/plugins/simplenavi.less new file mode 100644 index 0000000..0fafacf --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/simplenavi.less @@ -0,0 +1,18 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Simplenavi Plugin */ +.plugin__simplenavi>ul { + + padding-left: 0 !important; + + & ul { + padding-left: 10px !important; + } + +} diff --git a/lib/tpl/bootstrap3/css/plugins/struct.less b/lib/tpl/bootstrap3/css/plugins/struct.less new file mode 100644 index 0000000..965c931 --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/struct.less @@ -0,0 +1,38 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Struct */ +.dokuwiki .struct_entry_form { + + div.field { + margin-bottom: 5px; + line-height: 2em; + + label { + vertical-align: top; + width: 20em; + } + } + + span.input { + width: 100%; + } + span.label { + width: 100%; + white-space: normal; + text-align: right !important; + padding-right: 25px; + } + +} + +@media (max-width: 480px) { + .dokuwiki .struct_entry_form span.label { + text-align: left !important; + } +} diff --git a/lib/tpl/bootstrap3/css/plugins/tag.less b/lib/tpl/bootstrap3/css/plugins/tag.less new file mode 100644 index 0000000..14f004d --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/tag.less @@ -0,0 +1,20 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Tag Plugin */ +a.tag { + text-decoration: none !important; +} + +div.tags { + display: none; +} + +a.tag.label { + display: inline-block; +} diff --git a/lib/tpl/bootstrap3/css/plugins/tagging.less b/lib/tpl/bootstrap3/css/plugins/tagging.less new file mode 100644 index 0000000..aee30a2 --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/tagging.less @@ -0,0 +1,12 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Tagging Plugin */ +ul.tagging_cloud li { + display: inline-block; +} diff --git a/lib/tpl/bootstrap3/css/plugins/translation.less b/lib/tpl/bootstrap3/css/plugins/translation.less new file mode 100644 index 0000000..bc78c04 --- /dev/null +++ b/lib/tpl/bootstrap3/css/plugins/translation.less @@ -0,0 +1,12 @@ +/* + * DokuWiki Bootstrap3 Template: DokuWiki Plugins + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* Translation Plugin */ +#dw__translation .flag img { + padding-right: 5px; +} diff --git a/lib/tpl/bootstrap3/css/print.less b/lib/tpl/bootstrap3/css/print.less new file mode 100644 index 0000000..628cbb5 --- /dev/null +++ b/lib/tpl/bootstrap3/css/print.less @@ -0,0 +1,36 @@ +/*! + * DokuWiki Bootstrap3 Template: Print styles + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +html, body { + display:block; +} + +#dokuwiki__content { + width: 100%; +} + +a[href]:after { + content: "" !important; +} + +/* display href after link */ +a.urlextern:after, +a.interwiki:after, +a.mail:after { + content: " (" attr(href) ")" !important; +} + +abbr[href]:after { + content: "" !important; +} + +/** +abbr[data-original-title]:after { + content: " (" attr(data-original-title) ")"; +} +*/ diff --git a/lib/tpl/bootstrap3/css/recent.less b/lib/tpl/bootstrap3/css/recent.less new file mode 100644 index 0000000..0415824 --- /dev/null +++ b/lib/tpl/bootstrap3/css/recent.less @@ -0,0 +1,31 @@ +/*! + * DokuWiki Bootstrap3 Template: Recent + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +.dokuwiki form.changes ul { + padding-top: 1.5em; + + li { + list-style: none; + margin-left: 0; + + /*&.minor { + opacity: .7; + }*/ + + span.sum { + font-weight: bold; + } + + input { + vertical-align: top; + } + + } + +} + diff --git a/lib/tpl/bootstrap3/css/replacements.less b/lib/tpl/bootstrap3/css/replacements.less new file mode 100644 index 0000000..fdc80e5 --- /dev/null +++ b/lib/tpl/bootstrap3/css/replacements.less @@ -0,0 +1,99 @@ +/*! + * DokuWiki Bootstrap3 Template: style.ini / Styling Plugin support + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + * + * + * For more information about style.ini and replacements see: + * + * - https://www.dokuwiki.org/devel:style.ini + * - https://www.dokuwiki.org/plugin:styling +*/ + + +/* main text and background colors */ +.text(@arg) when (iscolor(@arg)) { + color: @arg !important; +} +.background(@arg) when (iscolor(@arg)) {} + +/* alternative text and background colors */ +.textAlt(@arg) when (iscolor(@arg)) { + color: @arg !important; +} +.backgroundAlt(@arg) when (iscolor(@arg)) {} + +/* neutral text and background colors */ +.textNeu(@arg) when (iscolor(@arg)) { + color: @arg !important; +} +.backgroundNeu(@arg) when (iscolor(@arg)) {} + +/* border color */ +.border(@arg) when (iscolor(@arg)) { + border-color: @arg !important; +} + +/* highlighted text (e.g. search snippets) */ +.highlight(@arg) when (iscolor(@arg)) { + color: @arg !important; +} + +.backgroundSite(@arg) when (iscolor(@arg)) { + background-color: @arg !important; +} + +/* these are used for links */ +.link(@arg) when (iscolor(@arg)) { + color: @arg !important; +} +.existing(@arg) when (iscolor(@arg)) { + color: @arg !important; +} +.missing(@arg) when (iscolor(@arg)) { + color: @arg !important; +} + +/** + +body { + .backgroundSite(@ini_background_site); + .text(@ini_text); +} + +table, th, td, blockquote, pre, hr { + .border(@ini_border); +} + +th { + .backgroundAlt(@ini_background_alt); +} + +mark { + .highlight(@ini_highlight); +} + +pre, code, samp, kbd { + .backgroundSite(@ini_background_site); + .text(@ini_text); +} + +fieldset { + .textAlt(@ini_text_alt); +} + +a:link, a:visited { + .link(@ini_link); +} + +.dokuwiki a.wikilink1 { + .existing(@ini_existing); +} + +.dokuwiki a.wikilink2 { + .missing(@ini_missing); +} + +*/ diff --git a/lib/tpl/bootstrap3/css/template.less b/lib/tpl/bootstrap3/css/template.less new file mode 100644 index 0000000..2e745de --- /dev/null +++ b/lib/tpl/bootstrap3/css/template.less @@ -0,0 +1,901 @@ +/*! + * DokuWiki Bootstrap3 Template: Template + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +@import url("css.php?f=bootstrap.css"); + + +html { + -ms-overflow-style: scrollbar; +} + +body { + + &.default.dw-page-on-panel, + &.optional.dw-page-on-panel, { + background: #FEFEFE; + } + +} + +/** + * Links and Interwiki icons + */ +a.urlextern { + background-image: url('iconify.php?icon=mdi-earth-arrow-right.svg&color=%23666666') !important; +} + +a.mail { + background-image: url('iconify.php?icon=mdi-email.svg&color=%23666666') !important; +} + +a.iw_user { + background-image: url('iconify.php?icon=mdi-account.svg'); +} + +a.iw_wp, a.iw_wpde, a.iw_wpes, a.iw_wpfr, a.iw_wpjp, a.iw_wpru, a.iw_wpmeta, a.iw_wppl { + background-image: url('iconify.php?icon=mdi-wikipedia.svg'); +} + +a.iw_go { + background-image: url('iconify.php?icon=mdi-google.svg&color=%234285f4'); +} + +a.iw_skype { + background-image: url('iconify.php?icon=mdi-skype.svg&color=%2300aff0'); +} + +a.iw_phpfn { + background-image: url('iconify.php?icon=mdi-elephant.svg&color=%23858eb8'); +} + +a.iw_callto, a.iw_tel { + background-image: url('iconify.php?icon=mdi-phone.svg'); +} + +a.iw_amazon, a.iw_amazon_de, a.iw_amazon_uk { + background-image: url('iconify.php?icon=mdi-amazon.svg'); +} + +a.iw_man { + background-image: url('iconify.php?icon=mdi-book.svg'); +} + +a.iw_paypal { + background-image: url('iconify.php?icon=mdi-paypal.svg&color=%2324397c'); +} + + +aside, +.dw__dropdown_page { + + word-wrap: break-word; + + h1, h2, h3, h4 h5 { + margin: 10px 0 5px 0; + } + + h1 { font-size: 1.8em; } + h2 { font-size: 1.6em; } + h3 { font-size: 1.4em; } + h4 { font-size: 1.2em; } + h5 { font-size: 1em; } + + .page-header { + margin: 10px 0; + } + + .panel-heading { + cursor: pointer; + } + + .nav { + + ul { + padding-left: 10px; + } + + li { + + a { + padding: 5px 10px !important; + } + + a.urlextern, + a.mail, + a.mediafile { + padding-left: 28px !important; + background-position: 8px center; + } + + } + + } + +} + +pre.code { + white-space: pre-wrap; +} + +input, +textarea, +select { + font-weight: 400; +} + +body, +main { + position: relative; +} + +/* Ordered list style */ +ol { list-style: decimal outside; } /* Decimal: 1. 2. 3. ... */ +ol ol { list-style-type: lower-alpha; } /* Alpha (lowercase): a. b. c. ... */ +ol ol ol { list-style-type: upper-roman; } /* Roman (uppercase): I. II. III. ... */ +ol ol ol ol { list-style-type: upper-alpha; } /* Alpha (uppercase): A. B. C. ... */ +ol ol ol ol ol { list-style-type: lower-roman; } /* Roman (lowercase): i. ii. iii. ... */ + +/* Header */ +header { + + nav { + + .navbar-brand { + padding-top: 10px; + padding-bottom: 10px; + } + + #dw__tagline { + font-size: 0.6em; + line-height: 0.6em; + white-space: nowrap; + } + + #dw__search { + + /* Typeahead plugin */ + .typeahead { + max-height: 250px; + overflow-y: auto; + + li.dropdown-header { + font-size: 80%; + text-overflow: ellipsis; + overflow: hidden; + padding-top: 0; + } + + a.dropdown-item { + font-size: 85%; + text-overflow: ellipsis; + overflow: hidden; + } + } + + } + + &.navbar-fixed-top .dw__actions { + margin: 0 15px 0 5px; + } + + .dw__actions .btn { + margin-left: 5px; + } + + } + +} + +article .page-header:first-child { + margin-top: 10px; +} + +/* Characters picker */ +div#picker2 { + z-index:1000; +} + + +/* Message area (alerts, warnings, errors, etc.) */ +#dw__msgarea { + + .alert { + padding: 5px; + margin-bottom: 10px; + } + + .bs-callout { + margin-bottom: 10px; + padding: 10px; + } + +} + + +/* NavBar Logo */ +#dw__logo.dw-logo-tagline { + margin-top: -5px; +} + + +/* Badges */ +#dw__badges li { + padding-right: 0; +} + + + +/* Configuration Manager */ +#config__manager { + + label { + color: initial; + white-space: initial; + font-size: 1.2em; + font-weight: initial; + } + + td { + padding: 5px; + } + + legend { + font-size: 1.8em; + } + + fieldset { + background: initial !important; + padding: 0 !important; + text-align: left; + } + + .label { + display: block; + font-weight: normal; + color: initial; + } + + .value { + vertical-align: middle; + } + + .outkey { + margin: 0 !important; + padding: 0 !important; + font-size: 1.2em !important; + background: transparent !important; + } + + #tpl____bootstrap3____template_settings_name legend { + padding-top: 25px; + } + + span[title*="$meta"] { + font-family: monospace; + } + +} + + +/* Breadcrumbs */ +#dw__breadcrumbs { + + hr { + margin: 5px 0; + padding: 0; + } + + .breadcrumb { + background: transparent; + border: 0 none; + padding-left: 0; + display: inline; + } + +} + + +/* Footnotes */ +#insitu__fn { + max-width: 20em; +} + +.footnotes { + div.fn > div.content { + display:inline; + } +} + + +/* User Menu */ +#dw__user_menu { + + .nav > li > a { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden !important; + } + +} + + +/* Page tools */ +#dw__pagetools { + + position: absolute; + right: 30px; + padding-top: 50px; + z-index: 999; + text-align: center; + + ul li a { + padding: 2px 4px; + } + + ul li:not(.active) a:hover { + background: transparent; + } + + .tools { + position: fixed; + } + +} + + +/* Footer Page */ +#dw__footer { + + z-index: 995; + + &.container-fluid { + margin: 0; + margin-bottom: -50px; + padding: 0; + } + +} + +/* Extension Manager */ +#extension__manager { + + ul.tabs li.active a, + .panelHeader { + background-color: initial; + } + + ul.tabs li.active a { + /* FIXME */ + border-bottom-color: white; + } + +} + + +/* User Manager */ +#user__manager .import_users { + clear: both; +} + + +/* Media Manager */ +#media__tree { + + height: 300px; + overflow: auto; + + li.media { + margin-top: 0; + } + +} + + +#mediamgr__content { + position: fixed; +} + + +#media__content { + + height: auto; + + input, label { + margin: 0; + } + + label { + display: inline !important; + } + + [type=submit] { + vertical-align: bottom; + } + +} + + +#mediamgr__aside { + height: auto; + top: 0; + position: fixed; +} + + +#media__opts label { + display: inline !important; +} + + +#mediamanager__page .ui-buttonset label { + margin-right: 0 !important; +} + + +#dokuwiki__pageheader p a.label { + white-space: initial; +} + +/* Page ID */ +[data-img-id] .pageId { + + &::after { + content: " }}"; + } + + &::before { + content: "{{ "; + } + +} + +[data-page-id] .pageId { + + &::after { + content: " ]]"; + } + + &::before { + content: "[[ "; + } + +} + + +.mode_search { + li { + list-style-type: none; + word-wrap: break-word; + } +} + +.dokuwiki div.search_quickresult ul li { + width: 20em; +} + +.mode_index { + + ul.idx { + + a { + color: inherit; + text-decoration: none; + } + + i { + padding-right: 5px; + } + + strong { + font-weight: normal; + } + + li { + list-style-type: none; + list-style-image: none !important; + } + + } + +} + + +.mode_admin { + + input[name="installfile"] { + height: auto; + } + + h1#dokuwiki_settings, + h1#plugin_settings, + h1#template_settings { + font-size: 1.80em; + } + + #config__manager legend { + cursor: pointer; + } + +} + +.dokuwiki div.ui-admin { + + ul li { + font-weight: normal; + } + + #admin__version { + clear: both; + float: none; + } + + .admin_tasks { + width: 50% !important; + padding: 0 10px !important; + } + + ul.admin_plugins { + padding: 5px; + margin-bottom: 0px; + } + +} + +/* Back to top button */ +.back-to-top { + position: fixed; + bottom: 10px; + right: 10px; + opacity: .8; + display: none; + z-index: 1024; +} + + +/* Fix for media list overlap */ +.fix-media-list-overlap { + overflow: hidden; +} + + +/* External URL (navbar) */ +.navbar-nav a.urlextern, +.navbar-nav a.mail { + padding: 15px 0 15px 18px; +} + + +/* Page Info */ +.docInfo .list-inline li { + padding-left : 0; +} + + +/* User profile image */ +.profile-image { + position: relative; + top: -5px; + float: left; + left: -5px; +} + + +/* Page icons (email, print, social share, etc.) */ +.dw-page-icons { + + a { + color: inherit; + } + + span { + display: none; + } + + svg { + width: 1.2em !important; + height: 1.2em !important; + } + + .share-google-plus svg { color: #DC4E41; } + .share-twitter svg { color: #55ACEE; } + .share-linkedin svg { color: #0077B5; } + .share-facebook svg { color: #3B5998; } + .share-whatsapp svg { color: #43D854; } + .share-pinterest svg { color: #BD081C; } + .share-telegram svg { color: #0088CC; } + .share-yammer svg { color: #5AA8BF; } + .share-reddit svg { color: #FF4500; } + .share-microsoft-teams svg { color: #464EB8; } + +} + +/* Override Bootstrap3 style */ + +/* Set ".img-responsive" to "inline" */ +.img-responsive { + display: inline; +} + +ul.btn-group { + padding: 0; +} + +.table thead tr th[rowspan] { + vertical-align: top !important; +} + + +/* Commond DokuWiki styles */ +.dokuwiki { + + fieldset { + border: none; + } + + img.media { + margin: .2em 0; + } + + img.medialeft { + float: left; + margin: .2em 1em .2em 0; + } + + img.mediaright { + float: right; + margin: .2em 0 .2em 1em; + } + + img.mediacenter { + display: block; + margin: .2em auto; + } + + textarea.edit { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace + } + + ul.idx { + padding-left: 18px; + } + + article .wikilink2 { + color: #d9534f; + } + + article .page { + min-height: 400px; + } + + .diffnav select { + height: auto; + } + + .curid { + font-weight: bold; + } + + .diff.diff_sidebyside { + + margin-top: 25px; + margin-bottom: 25px; + + td.diff-context { + width: 50%; + } + + } + + table.diff { + select { + font-size: 1em !important; + } + td { + font-size: 1em !important; + } + } + +} + +/* Custom DropDown menu with multiple columns */ +.dropdown-row { + + > ul { + position: static; + border: 0px; + box-shadow: none; + } + + > li a { + text-overflow: ellipsis; + white-space: nowrap; + overflow: hidden !important; + } + +} + + +/* Custom DropDown Menu Large (see http://bootsnipp.com/snippets/featured/large-dropdown-menu) */ + +#dw__admin .dropdown-menu-large { + width: 600px; +} + +@media (max-width: 768px) { + .dropdown-menu-large { + margin-left: 0 ; + margin-right: 0 ; + } +} + + +/* Dropdown menu page */ +.dw__dropdown_page { + + .dropdown-menu-large { + background: #FFF; + } + + .nav li a { + padding: 5px 10px; + } + +} + + +/* AnchorJS */ +a.anchorjs-link:hover { + text-decoration: none; +} + + +/* Override Bootswatch Style */ +body.cosmo #tool__bar .btn { + border: 1px solid #CCC; + background-color: #EEE; +} + +body { + + &.cyborg, + &.darkly, + &.slate, + &.superhero, + &.solar { + #config__manager .outkey { + color: #fff !important; + } + #extension__list { + ul.extensionList li { + color: inherit; + } + .legend { + color: inherit; + } + p { + color: inherit; + } + } + } + +} + +.dw-table-width { + + article table.inline { + width: auto; + } + + .mode_admin table.inline { + width: 100%; + } + +} + + +body.yeti #dw__user_menu dl { + color: white; +} + +/* SVG icon for DokuWiki */ + +svg.icon { + fill: currentColor; + width: 1em; + height: 1em; + vertical-align: middle; + display: inline-block; +} + +.menuitem svg { + fill: currentColor; + display: inline-block; + vertical-align: middle; + width: 1.3em; + height: 1.3em; +} + +#dw__pagetools .menuitem svg { + fill: initial !important; +} + +.dropdown-menu .menuitem svg { + padding-right: 4px; +} + +#dw__pagetools .active .menuitem svg { + fill: #fff !important; +} + +#dw__pagetools .menuitem span { + display: none; +} + +/* Fixes for Bootswatch theme and DokuWiki actions */ + +body { + + &.cyborg, + &.darkly, + &.slate, + &.superhero, + &.solar { + #dw__pagetools .menuitem svg { + fill: #fff !important; + } + .iw_user { + background-image: url('iconify.php?icon=mdi-account.svg&color=%23ffffff'); + } + a.urlextern { + background-image: url('iconify.php?icon=mdi-earth-arrow-right.svg&color=%23ffffff') !important; + } + + a.mail { + background-image: url('iconify.php?icon=mdi-email.svg&color=%23ffffff') !important; + } + a.iw_callto, a.iw_tel { + background-image: url('iconify.php?icon=mdi-phone.svg&color=%23ffffff'); + } + + a.iw_amazon, a.iw_amazon_de, a.iw_amazon_uk { + background-image: url('iconify.php?icon=mdi-amazon.svg&color=%23ffffff'); + } + + a.iw_man { + background-image: url('iconify.php?icon=mdi-book.svg&color=%23ffffff'); + } + a.iw_wp, a.iw_wpde, a.iw_wpes, a.iw_wpfr, a.iw_wpjp, a.iw_wpru, a.iw_wpmeta, a.iw_wppl { + background-image: url('iconify.php?icon=mdi-wikipedia.svg&color=%23ffffff'); + } + } + + &.yeti .dropdown-menu .menuitem svg { + fill: #fff; + } + + &.solar .dropdown-menu .menuitem svg { + fill: #839496; + } + + &.sandstone .menuitem svg { + fill: #98978b; + } + + &.lumen .menuitem svg { + fill: #555555; + } + + &.flatly .menuitem svg { + fill: #7b8a8b; + } + +} + +.alert { + overflow: hidden; +} diff --git a/lib/tpl/bootstrap3/css/toc.less b/lib/tpl/bootstrap3/css/toc.less new file mode 100644 index 0000000..7020147 --- /dev/null +++ b/lib/tpl/bootstrap3/css/toc.less @@ -0,0 +1,93 @@ +/*! + * DokuWiki Bootstrap3 Template: TOC + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ +#dw__toc { + + &.affix { z-index: 999; } + .toc-title { cursor: pointer; margin-top: 0; } + .toc-body > ul { overflow-y: auto !important; padding-left: 10px; } + + .nav > li > a { /*color: #666;*/ padding: 4px 20px; font-weight: 500; display: block; word-break: keep-all; } + .nav > li > a:hover { background-color: transparent; color: initial; } + .nav > li > a:hover { border-left: 1px solid #428bca; } + + .nav .nav { padding-bottom: 10px; } + .nav .nav .nav > li > a { padding-top: 1px; padding-bottom: 1px } + .nav .nav .nav > .active > a { font-weight: 500; } + + /* .nav .nav .nav { display: none; } */ + .nav > .active > ul { display: block !important; } + + .nav > li > a { padding-left: 20px; } + .nav .nav > li > a { padding-left: 30px; } + .nav .nav .nav > li > a { padding-left: 40px; } + .nav .nav .nav .nav > li > a { padding-left: 50px; } + + + .nav > li > a:hover { padding-left: 19px; } + .nav .nav > li > a:hover { padding-left: 29px; } + .nav .nav .nav > li > a:hover { padding-left: 39px; } + .nav .nav .nav .nav > li > a:hover { padding-left: 49px; } + + .nav > .active > a, + .nav > .active > a:hover { padding-left: 18px; } + + .nav .nav > .active > a, + .nav .nav > .active > a:hover { padding-left: 28px; } + + .nav .nav .nav > .active > a, + .nav .nav .nav > .active > a:hover { padding-left: 38px; } + + .nav .nav .nav .nav > .active > a, + .nav .nav .nav .nav > .active > a:hover { padding-left: 48px; } + + .nav > .active > a, + .nav > .active > a:hover, + .nav > .active > a:focus { + font-weight: bold; + background-color: transparent; + border-left: 2px solid #428bca; + } + +} + +.dw-toc { + width: 16em; + float: right; + height: auto; + margin: 0 0 1.5em 1.5em; +} + +.dw-toc-closed { + .toc-title span, + .toc-body { display: none; } + .dw-toc { + position: absolute; + width: 50px; + right: 30px; + } +} + +.toc-panel .panel-body { + padding: 0; +} + +.toc-panel .panel-heading { + margin-bottom: 0; + padding: 5px; +} + +.toc-panel { + &.dw-toc-left { + float: left; + margin: 0 1.5em 1.5em 0; + + .dw-toc-closed { + right: auto; + } + } +} diff --git a/lib/tpl/bootstrap3/detail.php b/lib/tpl/bootstrap3/detail.php new file mode 100644 index 0000000..fbc2d04 --- /dev/null +++ b/lib/tpl/bootstrap3/detail.php @@ -0,0 +1,553 @@ + + * @author Anika Henke + * @author Giuseppe Di Terlizzi + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +if (!defined('DOKU_INC')) die(); // must be run from within DokuWiki + +require_once('tpl/global.php'); +require_once('tpl/functions.php'); + +global $ACT; +global $conf; +global $ERROR; +global $IMG; +global $INPUT; +global $lang; +global $TPL; +global $REV; + +header('X-UA-Compatible: IE=edge,chrome=1'); + + +$metadata = array( + + 'exif' => array( + 'Exif.ImageDescription', + 'Exif.Make', + 'Exif.Model', + 'Exif.Orientation', + 'Exif.XResolution', + 'Exif.YResolution', + 'Exif.ResolutionUnit', + 'Exif.Software', + 'Exif.DateTime', + 'Exif.Artist', + 'Exif.WhitePoint', + 'Exif.PrimaryChromaticities', + 'Exif.YCbCrCoefficients', + 'Exif.YCbCrSubSampling', + 'Exif.YCbCrPositioning', + 'Exif.ReferenceBlackWhite', + 'Exif.Copyright', + 'Exif.ExifIFDOffset', + 'Exif.GPSIFDOffset', + 'Exif.TIFFNewSubfileType', + 'Exif.TIFFSubfileType', + 'Exif.TIFFImageWidth', + 'Exif.TIFFImageHeight', + 'Exif.TIFFBitsPerSample', + 'Exif.TIFFCompression', + 'Exif.TIFFPhotometricInterpretation', + 'Exif.TIFFThreshholding', + 'Exif.TIFFCellWidth', + 'Exif.TIFFCellLength', + 'Exif.TIFFFillOrder', + 'Exif.TIFFImageDescription', + 'Exif.TIFFMake', + 'Exif.TIFFModel', + 'Exif.TIFFStripOffsets', + 'Exif.TIFFOrientation', + 'Exif.TIFFSamplesPerPixel', + 'Exif.TIFFRowsPerStrip', + 'Exif.TIFFStripByteCounts', + 'Exif.TIFFMinSampleValue', + 'Exif.TIFFMaxSampleValue', + 'Exif.TIFFXResolution', + 'Exif.TIFFYResolution', + 'Exif.TIFFPlanarConfiguration', + 'Exif.TIFFGrayResponseUnit', + 'Exif.TIFFGrayResponseCurve', + 'Exif.TIFFResolutionUnit', + 'Exif.TIFFSoftware', + 'Exif.TIFFDateTime', + 'Exif.TIFFArtist', + 'Exif.TIFFHostComputer', + 'Exif.TIFFColorMap', + 'Exif.TIFFExtraSamples', + 'Exif.TIFFJFIFOffset', + 'Exif.TIFFJFIFLength', + 'Exif.TIFFYCbCrCoefficients', + 'Exif.TIFFYCbCrSubSampling', + 'Exif.YCbCrPositioning', + 'Exif.ReferenceBlackWhite', + 'Exif.Copyright', + 'Exif.ExifIFDOffset', + 'Exif.GPSIFDOffset', + 'Exif.TIFFNewSubfileType', + 'Exif.TIFFSubfileType', + 'Exif.TIFFImageWidth', + 'Exif.TIFFImageHeight', + 'Exif.TIFFBitsPerSample', + 'Exif.TIFFCompression', + 'Exif.TIFFPhotometricInterpretation', + 'Exif.TIFFThreshholding', + 'Exif.TIFFCellWidth', + 'Exif.TIFFCellLength', + 'Exif.TIFFFillOrder', + 'Exif.TIFFImageDescription', + 'Exif.TIFFMake', + 'Exif.TIFFModel', + 'Exif.TIFFStripOffsets', + 'Exif.TIFFOrientation', + 'Exif.TIFFSamplesPerPixel', + 'Exif.TIFFRowsPerStrip', + 'Exif.TIFFStripByteCounts', + 'Exif.TIFFMinSampleValue', + 'Exif.TIFFMaxSampleValue', + 'Exif.TIFFXResolution', + 'Exif.TIFFYResolution', + 'Exif.TIFFPlanarConfiguration', + 'Exif.TIFFGrayResponseUnit', + 'Exif.TIFFGrayResponseCurve', + 'Exif.TIFFResolutionUnit', + 'Exif.TIFFSoftware', + 'Exif.TIFFDateTime', + 'Exif.TIFFArtist', + 'Exif.TIFFHostComputer', + 'Exif.TIFFColorMap', + 'Exif.TIFFExtraSamples', + 'Exif.TIFFJFIFOffset', + 'Exif.TIFFJFIFLength', + 'Exif.TIFFYCbCrCoefficients', + 'Exif.TIFFYCbCrSubSampling', + 'Exif.TIFFYCbCrPositioning', + 'Exif.TIFFReferenceBlackWhite', + 'Exif.TIFFCopyright', + 'Exif.TIFFUserComment', + 'Exif.ExposureTime', + 'Exif.FNumber', + 'Exif.ExposureProgram', + 'Exif.SpectralSensitivity', + 'Exif.ISOSpeedRatings', + 'Exif.OECF', + 'Exif.EXIFVersion', + 'Exif.DatetimeOriginal', + 'Exif.DatetimeDigitized', + 'Exif.ComponentsConfiguration', + 'Exif.CompressedBitsPerPixel', + 'Exif.ShutterSpeedValue', + 'Exif.ApertureValue', + 'Exif.BrightnessValue', + 'Exif.ExposureBiasValue', + 'Exif.MaxApertureValue', + 'Exif.SubjectDistance', + 'Exif.MeteringMode', + 'Exif.LightSource', + 'Exif.Flash', + 'Exif.FocalLength', + //'Exif.MakerNote', + 'Exif.UserComment', + 'Exif.SubSecTime', + 'Exif.SubSecTimeOriginal', + 'Exif.SubSecTimeDigitized', + 'Exif.FlashPixVersion', + 'Exif.ColorSpace', + 'Exif.PixelXDimension', + 'Exif.PixelYDimension', + 'Exif.RelatedSoundFile', + 'Exif.InteropIFDOffset', + 'Exif.FlashEnergy', + 'Exif.SpatialFrequencyResponse', + 'Exif.FocalPlaneXResolution', + 'Exif.FocalPlaneYResolution', + 'Exif.FocalPlaneResolutionUnit', + 'Exif.SubjectLocation', + 'Exif.ExposureIndex', + 'Exif.SensingMethod', + 'Exif.FileSource', + 'Exif.SceneType', + 'Exif.CFAPattern', + 'Exif.InteroperabilityIndex', + 'Exif.InteroperabilityVersion', + 'Exif.RelatedImageFileFormat', + 'Exif.RelatedImageWidth', + 'Exif.RelatedImageLength', + 'Exif.GPSVersionID', + 'Exif.GPSLatitudeRef', + 'Exif.GPSLatitude', + 'Exif.GPSLongitudeRef', + 'Exif.GPSLongitude', + 'Exif.GPSAltitudeRef', + 'Exif.GPSAltitude', + 'Exif.GPSTimeStamp', + 'Exif.GPSSatellites', + 'Exif.GPSStatus', + 'Exif.GPSMeasureMode', + 'Exif.GPSDOP', + 'Exif.GPSSpeedRef', + 'Exif.GPSSpeed', + 'Exif.GPSTrackRef', + 'Exif.GPSTrack', + 'Exif.GPSImgDirectionRef', + 'Exif.GPSImgDirection', + 'Exif.GPSMapDatum', + 'Exif.GPSDestLatitudeRef', + 'Exif.GPSDestLatitude', + 'Exif.GPSDestLongitudeRef', + 'Exif.GPSDestLongitude', + 'Exif.GPSDestBearingRef', + 'Exif.GPSDestBearing', + 'Exif.GPSDestDistanceRef', + 'Exif.GPSDestDistance', + ), + + 'iptc' => array( + 'Iptc.SuplementalCategories', + 'Iptc.Keywords', + 'Iptc.Caption', + 'Iptc.CaptionWriter', + 'Iptc.Headline', + 'Iptc.SpecialInstructions', + 'Iptc.Category', + 'Iptc.Byline', + 'Iptc.BylineTitle', + 'Iptc.Credit', + 'Iptc.Source', + 'Iptc.CopyrightNotice', + 'Iptc.ObjectName', + 'Iptc.City', + 'Iptc.Province State', + 'Iptc.CountryName', + 'Iptc.OriginalTransmissionReference', + 'Iptc.DateCreated', + 'Iptc.CopyrightFlag', + ), +); + + +$maxwidth = 800; +$maxheight = 600; + +$originalwidth = $w = (int) tpl_img_getTag('File.Width'); +$originalheight = $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); +} + +$other_sizes = array(); + +foreach (array(0.1, 0.25, 0.5, 0.75, 1) as $ratio) { + $other_sizes[] = array( + 'w' => floor($ratio * $originalwidth), + 'h' => floor($ratio * $originalheight), + 'ratio' => $ratio, + ); +} + +$show_metadata = false; + +?> + + + + <?php echo hsc(tpl_img_getTag('IPTC.Headline',$IMG))?> [<?php echo strip_tags($conf['title'])?>] + + + getConf('themeByNamespace')) { + echo ''; + } + + echo tpl_favicon(array('favicon', 'mobile')); + tpl_includeFile('meta.html'); + tpl_metaheaders(); + + ?> + + + +
    + +
    + includePage('topheader'); + + require_once('tpl/navbar.php'); + + tpl_includeFile('header.html'); + + // Header DokuWiki page + if ($ACT == 'show') echo $TPL->includePage('header'); + + ?> +
    + + + +
    + +
    + + + + + +

    + getConf('showPageId')): ?> + + +

    + +
    + getMessageArea() ?> +
    + +
    + +
    + +
    + + + +
    + +
    +

    + 'text-muted')) ?> +

    +
    + +
    + + + + ' . iconify('mdi:alert', array('class' => 'mr-2', 'style' => 'color:orange')) . $ERROR . ''; ?> + + + +
    +
    + +

    + +

    + +

    + : × pixels. + : × pixels   +

    + +

    + ( × pixels ) +

    +
    +
    + +
    + +

    + 'text-primary')) ?> Information +

    + +
    + + + '; + } + ?> + +
    '.$label.''; + if ($tag['type'] == 'date') { + echo dformat($tag['value']); + } else { + echo hsc($tag['value']); + } + echo '
    +
    + + + +
    + +
    + +

    + +

    + 0) { + echo '
      '; + foreach($media_usage as $path){ + echo '
    • '.html_wikilink($path).'
    • '; + } + echo '
    '; + } else { + echo '

    '.$lang['nothingfound'].'

    '; + } + ?> + + +
    + +
    + + +
    + + + +
    +
    + + + +
    +
    + +
    + + getConf('showPageInfo')): ?> + + getPageInfo() /* 'Last modified' etc */ ?> + + + + getConf('showLoginOnFooter')): ?> + + getToolMenuItem('user', 'login')) { + echo 'getLinkAttributes()) .'>'. inlineSVG($login_item->getSvg()) . ' ' . hsc($login_item->getLabel()) .''; + } + ?> + + + +
    + +
    +
    + +
    + +
    + +
    + + + + + +
    + + + + +
    + +
    + + + diff --git a/lib/tpl/bootstrap3/extra/hooks/navbar.html b/lib/tpl/bootstrap3/extra/hooks/navbar.html new file mode 100644 index 0000000..8f47ed9 --- /dev/null +++ b/lib/tpl/bootstrap3/extra/hooks/navbar.html @@ -0,0 +1,15 @@ + + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * + * Copy this file in /conf directory + */ +?> + +> +
    Home') ?> +
  • diff --git a/lib/tpl/bootstrap3/extra/hooks/social.html b/lib/tpl/bootstrap3/extra/hooks/social.html new file mode 100644 index 0000000..0550897 --- /dev/null +++ b/lib/tpl/bootstrap3/extra/hooks/social.html @@ -0,0 +1,34 @@ + + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + * + * Copy this file in /conf directory + */ +?> + + + + +

     

    + + diff --git a/lib/tpl/bootstrap3/iconify.php b/lib/tpl/bootstrap3/iconify.php new file mode 100644 index 0000000..6c31e1c --- /dev/null +++ b/lib/tpl/bootstrap3/iconify.php @@ -0,0 +1,198 @@ + + * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +# NOTE Some Linux distributon change the location of DokuWiki core libraries (DOKU_INC) +# +# Bitnami (Docker) /opt/bitnami/dokuwiki +# LinuxServer.io (Docker) /app/dokuwiki +# Arch Linux /usr/share/webapps/dokuwiki +# Debian/Ubuntu /usr/share/dokuwiki +# +# NOTE If DokuWiki core libraries (DOKU_INC) is in another location you can +# create a PHP file in bootstrap3 root directory called "doku_inc.php" with +# this content: +# +# hsc($INPUT->str('prefix')), + 'icons' => hsc($INPUT->str('icons')), + 'callback' => hsc($INPUT->str('callback')), + 'width' => hsc($INPUT->str('width')), + 'height' => hsc($INPUT->str('height')), + 'icon' => hsc($INPUT->str('icon')), + 'color' => hsc($INPUT->str('color')), +); + +$iconify_dir = dirname(__FILE__) . '/assets/iconify/json'; +$cache_key = md5(serialize($params) . $conf['template'] . filemtime(__FILE__)); +$cache_files = $params; +$cache_files[] = __FILE__; +$content_type = 'application/javascript; charset=utf-8'; + +$cache = new dokuwiki\Cache\Cache($cache_key, '.js'); +$cache->setEvent('ICONIFY_CACHE'); +$cache_ok = $cache->useCache(array('files' => $cache_files)); + + +if ($params['icon']) { + $content_type = 'image/svg+xml; charset=utf-8'; + list($params['prefix'], $params['icons']) = explode('-', str_replace('.svg', '', $params['icon']), 2); +} + +header("Content-Type: $content_type"); + +http_cached($cache->cache, $cache_ok); + +$collection_file = "$iconify_dir/" . $params['prefix'] . ".json"; + +if (!file_exists($collection_file)) { + header('Content-Type: text/plain; charset=utf-8', true); + http_status(404); + print "Not Found"; + exit; +} + +$collection_data = json_decode(io_readFile($collection_file), true); + +$iconify_data = array( + 'prefix' => $params['prefix'], + 'icons' => array(), + 'aliases' => array(), +); + +foreach (explode(',', $params['icons']) as $icon) { + + if (isset($collection_data['aliases'][$icon])) { + $iconify_data['aliases'][$icon] = $collection_data['aliases'][$icon]; + $icon = $collection_data['aliases'][$icon]['parent']; + } + + if (!$icon_data = $collection_data['icons'][$icon]) { + continue; + } + + $iconify_data['icons'][$icon] = $icon_data; + + if ($params['width']) { + $iconify_data['icons'][$icon]['width'] = $params['width']; + } + if ($params['height']) { + $iconify_data['icons'][$icon]['height'] = $params['height']; + } + +} + +foreach (array('width', 'height', 'top', 'left', 'inlineHeight', 'inlineTop', 'verticalAlign') as $property) { + if (isset($collection_data[$property])) { + $iconify_data[$property] = $collection_data[$property]; + } +} + +if ($params['callback']) { + + $content = $params['callback'] . "(" . json_encode($iconify_data) . ");"; + +} elseif ($params['icon']) { + + $icon = $params['icons']; + $width = '1em'; + $height = '1em'; + $fill = ''; + + if (isset($iconify_data['aliases'][$icon])) { + $icon = $iconify_data['aliases'][$icon]['parent']; + } + + if (!isset($iconify_data['icons'][$icon])) { + header('Content-Type: text/plain; charset=utf-8', true); + http_status(404); + print "Not Found"; + exit; + } + + if ($params['width']) { + $width = $params['width']; + $height = $params['width']; + } + + if ($params['height']) { + $width = $params['height']; + $height = $params['height']; + } + + if ($params['color']) { + $fill = $params['color']; + } + + # TODO add "rotate" support + + $body = $iconify_data['icons'][$icon]['body']; + + if ($fill) { + $body = str_replace('currentColor', $fill, $body); + } + + $svg = '%s'; + $content = sprintf($svg, $width, $height, $body); + +} else { + + $content = "SimpleSVG._loaderCallback(" . json_encode($iconify_data) . ");"; + +} + +http_cached_finish($cache->cache, $content); +#print $content; diff --git a/lib/tpl/bootstrap3/images/apple-touch-icon.png b/lib/tpl/bootstrap3/images/apple-touch-icon.png new file mode 100644 index 0000000000000000000000000000000000000000..45fa4e7b081d35277b8d6f86a3e2a3f16aa3295e GIT binary patch literal 17728 zcmV*CKyAN?P)Px#24YJ`L;(K){{a7>y{D4^000SaNLh0L01ejw01ejxLMWSf00007bV*G`2ipf2 z6Amp_oQeJb03ZNKL_t(|+U&h|oLyDD_y1mdpWgeKnIw~*kVZ%dByyjp>v+wE*O zn~dXypjFkhV6mY1G)=QuEM_&}cdNmGUvF&<$Ya~WmX;R3B@plt4*3cAz4-keve_JG zFS~AABodoG!Lb8jAT$7w#bO#~w^`ebCS#kXs;xyu@hghvlqE@Wx$H_P=u=z5ez~wsLw1&cdIpFsa40s5KO8{BSrWzU$HRK@b-h~ikvN?)H)idM+O48T72I=Mn0W%h} zL2Do5pnZ&^_7o#vyyd17nRE8aU!-%{cY!VcUk6gIp_p*_74UhS;|(U`cmXY%rUmo) zqF>iFlg(yT{63c&4Eh+;8j#ys1GZ2oUhU04+6C6Si1PW9@d!IFrHHrfOPiQBiz~qB>+rlHG1cAsqB-;jmwB3Hwar#)ho{ zzgr5FK^XwZVm3B{(S&*`;2brGHP;(-51Y**8BNAd^!LXGfRr7w^ylez0%-&8 zzU4dD5)OLs``rY5F2Z3i4!d<&_Eh_wIE@2a{?|yZjW!xCYdBA5!10+VHoQ(7(MhIg4U>jNYmAk-&gR_IIkt_-D=xt5bg=TK&q?>*zg_zM zU$$rfj_F<|eeDFqAZ1o7s+I0s|Ec5bHjANcR9dUSAouq5$HxZzt|ktm!wu%K2JxR~ zULo(K5t9lzt|HVZzZ)Rb|B=gy{e{#=Aq z-yZNdc=o&3iwnMbkKPipv2cEf;Q8$Y&KpPmV1~@@1g5a9s(D%sn2oY)C?Ji%B$G*= zIkv5Jkt`eLTCJ9#-DY)-X$@PtdwRpYk@(STrbh(g@S15luaV5Er1LtHTg-JJzOyCG zs~Zy}vMRZP&i6hx7LQ%7C^f5grukrd5`e{Xy~NT=-C!irDgwc*@eb@(1DTx4J6qzV zwv0ln-&}c?AKvn7o`2wRzT0NTAvXb0k{EZ&0{qja3`r?%0WW{M@mg`|C-2kWcxr{1 zGSP*Q1eUROEMx8U^3@_^G{{Z^aC$iCpXYQsPBzHWWQW7ya=RRknbW6OXU~}Cn>u;C zVe*7_EEaR+$9Mnnuk`fB{yFAFO`D=YDytFCXr!_lIYmd71Y`ULLM~(7WVrj;2nYI$ z0Q~!vt%Tf$%5}CK%+ehzRxZDKSDMAgyDQHaO(_Fo%=oaGuU$G0mrdpmFLkl6Cr3Q1 zfPlFZ9n78RWM6Nt3S>?N1gfg>)f<0E$187gQ>z(s6DN&qFf#G%Q*e!GJ1pCqHKC0= zKXaux_llMJyU$)CT5G7V_HesQ=t6fI{66pF|M~Op`zB8uPir_hf&c;deO`9#K6q3h z<_bFd`&1HHjbv6Qkx`l4Vq#XinTOs^vVL!#bWR)cNv5`$`S=-LypEE5nm5_Tf&S9q zuG^hq={$Gkp0ywXe7HTuxyQRJ&(ohQ0qJuXF-Q{ap%R68?FRM%sf=3p{4QJ7EJ$P& z@`VD|ed_Dvwru9cuo=0DZfdkznR51NSOdNh%doRgIF4_`mWnf0JgL9^%*7%Uur_ME z76ZDbI}D+Kcl+s!7Azc5bgTSzI27RR_v0h75ntJuV^5DtGN+NqmMH5#uJO~G(75~g zc-`ey9cHzg(KLNn5COIy%=4emM)>mb04|$>d6TR>{XrZZSid)022!AD&=V^GWiki~ ziq66Q0tfqxwE0YEx*(P*0UdN32LV=+Jc+DQ*GH#SMgTg{9Z7QWMK{tGIm9&q6V1G( zR=11EXPt`K;W%Q2K-hT5CZzuB@ zWU)_*#bU2*-nLV3aIiG7kp?WmaKKM*Uu;A+;s7W@z?Uv?@$JjK*ewzcn^ZY#YO9IM z7CM+S-cquyYJjwwCBhy9KBobjNn%3C%=OFsSWQwHkW7hsg<#&Ksv@v%cc#Qv`>T`a zgo!rBhf1=3)%FxRI{m4tViWe5>TE=hy{Zc)Gg_UEsAl?j>9^lwg*nT49%FO!qJ0cg z&s>CTGL8zwXvb!D{`K$V`}(Vjkj226UJLVFX4WP0F*NNHnVh;niuA`nShKz(+6b6v zjxFHxdWh6$t;3lYjD`N)&0TGxP^o>tOb}e&aSC z{P}nIoKNF)cXLW>nLe2b3mT32ksO+$u>ZxE+5h}YXho%={lV^3;hS6g4n!60jDpHv z2V8Vp*R1PEHv_EdudIK`1{ob4UDpq5Bf4!>>Plv{I)%qsX0NHNUS}gZYkm_?t4$TB z_CR$2yP_qkbK4C}ZYh1gr>8(XqtaETNWas7NfykX>|`M9w`xa<{$$nL81k3~O+rJB zy;wT$jW<{E(JOA?D?yp#9i}FNN6xN>*oaPx zR6_}BQ$yeHtPXO??kly;pX4ZW0G$ncGIW(S))r4m{@E-Nb0(Bn@Y-ETdSWGtl_i1C zVH`9GYgwzp6HmRuzkK!^d?jdLlC6nO^ULt)lf&uriHexMBCbC+cq3`v1&0Hn`UnQ$jhbFyYvicDT( z-LBFc_PdNoQhh(1HUmNkbY181M;_<(2miv?!{(;m8l&07)RRuY;q#1&l^%NMefqa- zYswYhkLUGUcSU1qMf;=*PdB@U1fVL)+MT=iHFpBnIfJXBDjW*X(-S?cq3^QPu-2Sj zKTu_*CR5NUs#P$IvcO^zRq&g*-10@e>Ug%wm2>P?nQ3E6O4H6mxr)Zx>Z^KRjvMQ! z$iITB*J!Nu4h~5YI4lwyUV4x>ANX&+(PF~e1VoG7#*98U6@L&p&vw(4Jr zj5dgMNi~#Lukg6aAg8h_n%?L)-PN71{C0fMTo*^2KgrpseALK4NrIE6)SnY_n;JrI znx^yaqrWG={xxnIW5M3U<>v6Xn6YRcCY$xhwbGq?*!K9d_Jym_P_H1`(AqstypYm-_5uH{Eq7ct$bxMtMup(6F9;>!} zusz*yf4fEEl7&7NPIETZmKV?UFg9SuV>b};n41KH;bUjEHau%@B+4Zhf1cxWah70_;!E1GL#uIa?Em5Jqu!Qqml20riGcZf?a`8LgY)zPF=4u|KOmnNs!70{J5j_E%K+Lh;=#+jlRUKX=wJhKHyFGSU|t zQ5?}(mW8>3PEpk{mX!vxQLZ?$V`cd{aJ@5UJ2`u{3rT7oJrT{K{iDcm8~D6&(+;ls z$QQZ7p)<$c2%^C#GkxY{oJXjc7Sb7Zzq^WTf2=7h-JU7({T=G+L#bULLoRw-Cof|f@^W6_o zoA^qLy3T*~6nNh=mS6n(7a|l0%;PAJS|Gdj?CZ=lGS#6`4f?(GMdKVU*VI)b3;*y^ zl%GG|!yB8@W%*fZ%N8_t^%Uq&Dh=M8e@3n;2=2XaB{$vp1HK$G(qeA(YI!|QX3m_1 z@d(U|LN>?NH$R|f$DWc!Kj`Qys@%N4!1!es@#NEwasGMdlF4Nka+D>Gbx)W`rs9Xa zUQM&#@1>_VMlj%IxLi|*t$vW4RtbYFArKrt-b%n}#ATClT4mgJ19pqdsM8cjkX{0U z+its?NA7!wFNaJ`b8A|HUM5UzMLGiWBHGo%zV(|?i%Qc`+>|Qt%R_l?zvCxdcIm|k zAut#WOr0`WUA21c@xZ!c0%TE9cJ=i3ofr!Go8mcGWo`)v>FJF!YsRD@K?H%%Vc@Hm z1aaA992OZ_5|wM6IK{z<49@~bmuuRbYIPmH`qdw@`h{1yA!x+h1gQ2gLB_TQMoc8S zuCagfE_!x%A_iCDl#i#Q1)hqlT=|KsOCZ*?U9fDat7BuwvTUKS?pUx^;<5PaTX*a% zKa6Oi^wb{#pTF#Hg~o*8>dPPt#sy5cZH77!N0MuLEI}+36h3|J*Vz2ht6b+dHh61< zfT`nK7!w|OUQHpFXUn_m=-%Dg+yS8J+}T}ZU;8v}{^7R}(!e8C@4aO4*+!?wec7>+ zk@WUO-!BE3564?e0x%p3mNNzZ&m;^ts}&K55rLRaXSwv!FOXiho{#&C4GB^PS!UM6 zHUeJf$iq&ND4X6{O)8#f+TNX4x%ohzQ?I^?m5=|Kabw$v_D37~e!}sy$>;JjDW#zv zJ&?er)oV7Unt?_WM{FSAqq{r$Pbg&@eNkyM5F>pt&O7f@gbsDG!eeOQEoP(4>`5)S z93#|Bb)C+gd)c<81Eq;p3a}(wCyS_q^JVL=yF_4;W{)5$TKbZ|Ha22sXBSJCT*C?3C}%gx$F^IH96zB2 zn`LCgP{z{SS^7B1Tr*rwS z0+K{38PzncsR^R*??QR(S&H}kH|jed(!QsY?w?J z^_;U#m#k*<#m7Wz1yBk~$KHJhPOUtIs-bP#g8Key^sXL|%G4@JIFjjd#`#ecl@6tu zj@m{n{r&h8FY%49-^xeb5)-YBAckF5rnGoRWM1g#9N2q^LkGIi(VJ?e`*R9+^(y?! zzg^E)zVi8|<6$xx$>$3VeG|a+X;V=(Z5*YQNYY15kv%<;*E+UrSB0XWzV$wZpZ^Bs z;U~~L4}hwoE2U7rJbMPtPkn@FEKwInY^X;Z4T$3CKor2g{I8ptArvMw0kPd{XKL6p zqUc4jps;1rE)MMPLf7@C=e(CF@T-2E-`@Y9LxMQ)?r_-2=5tK~OoG!-TciPJ9utbp zrPFKTFTR?}uioI+pG%!jnj(*|B>+N7~8B zz2W&UykMF8^*7(SI2w&UdsIMnO`kq7t7%`^)3ME>&zM#MQPmJ*S}>e-D)I@lp^~6g z&J+j*=|Qn@7e<4@Nj}Fan}ED@`aG z{}oXc90 zf=%m96m>WyWWzE7%`}n9v8}TQWe8s>z#EAIFXRk7@aXTEf5L1SLBDG`N-*H3w>L5b z=y2}hv*kbk_um!+4<50yqifo?DxY<|`!~hH!#ihAM=~1gd??MLAVI&6uI|2LVj~t` zcn5XwA%xC|Komo)5VB^?TINo(u4lhcNIJUFXkzMLGiG zc;l_7h5)g#Z-d1`Fz7FtAkETf1e|}~5@#q7xb%p%*3L z+_W{<$tiFQY(#B;H--BiC;RKaP<-_Rw7&STAPz;*>o#s@_GB|R-wiYLquZ=bmVIx(B0s*?Zn>Yn(R=60cjc7b` z0lK21M`9FT`GDMAe~S!)tXJrn`sA0LXsrRW&?lxzK5Ue?_z5_TQ%ULX*PC7C@4cO8T4{o;gO<+ zC!YNqmtS^alL>U>8hIe#r@ucs#5k41S{E#{%Cda!k;zC+t3*3Yg+j%^ip7(Oq2nLb zs6#kZib)=|jadGTJY{^z>7Xc}C?!A@1ud4K@Q-)M{^DMWufC67EH?G=u3fuLDdjN6;V{s(pmB^y-nthdr{tBUz1Kzy2q+jt5M%euypd~-_dEvWpgtH3#*`Z$j~b}w$HV?_NJsaX{a z`swfQ9}+}>Q%+e(E|))|^bcwLzI{=nu3xW19GI%=`d{}=nR3VSf^ulf`i+OZl;7tg zKHx+?2605;aiS{F$HTTL}vY0RqX~H<<3F8rMEeO+~0#6}ORIQShe>66tp39f0QAp@QfK;mc z5RwF%07;+=t>U=Xc6E}u<4;&FK9~I=KQsIm^mLY@s`Kcrds*?F$vDDhbWI~))X3#@ zPB}TmV+-4O^u=EO@aH`^GAeGfk+?U&i?95V3FF7rbCeOh9X~(I$zQQcT(quX_UhO;}(|G{ic(-&LNrIps zd0ZQ!wFN2Y=Zt`#{%v~+O`Cu)$VV4~Dzj4|G;~QqXr+PFB?*KyprVzYLue(i6_wmG zuhDzXLSEQ#h_xOYHis3hAMXCzPAq047E7txN|t3@PAdo*Ff;Gu`E+dAi{fC{j`L`LplZ)pM9q3p5OoRvhMDlpN|B{VHxL@^XKlo z`(JOEq;B1Tx@{+JuS-HK$lf!T41=1+Y0^qUCTgLQoj zheP!BMJr#uao|l7`2@RSy9n5WjB}1fmSv8gGh2D%&9_em-aaZIRaMz~;K0E}W5=|C z5J+R&kjA!EXRD^6_eOZ*=f7sM$IR(7r=a)6(c($;bQV38MNenTw%-x`9e@k~03ZNK zL_t(Cg@Lcj*$Vo=XGub68rZE^K6x3&Me{1pQz#Y@l0Z;e`X!sqkga&%>5aa&Y0I`xjU79t`DjZLA{?SPbqed1D2uOHGPE+F>gc(A$(+a+ zk!+RS-(A;;tX|4kFq}Fc>&I6h25s}8C<+o)7Az>qQdQMRrZOZ` zS*%tIcDoI$)m#DmXw8fJH#}GYQP*{ZkhpaEa?YE0ZaEH7&#p_3^WMt$Q#@0!7|o;$ zX*yE}i05Ot&0ZFtbC&$mpa1f*R4VnoqXIG(i+#9i_4@v0OV05RM^WKWkPp}F8eXH5 z1;TEtlU0HyjspSK8?Ht#C@8Bp)m={>8^&_&6&PkrZjfWT4ysbpW(Uj$QD(uCs1~{A z@_7oy0`Y{5!)C)~vz4iIbRcf)-^IF~4VCNxgJj_P`JZ9-fNX3ca{~cC`}S7X@)MGv z#n#H^Txm&`SU!o{;$_B+<4_c3Jf(HyGe?x_G3eN~YTbr(Q*ZfzJt#^Z{gQX*$Z|~^ zG`fK{Ny7Stk0H5TB~3Hz$NIUeaNPR!rXYeSMJ*%=Nk}DXlq4icAPKpw6A6SQkR%Bq zWY8g<%@OJACzZ~Q+D3e{^X-}x5W!V5t{4_Xpqv)jS2sx_xju?&fudT#WT+}>r=5C= z3Y>ma6ba;`{jp^ITB(gkOE^StZ~sxp5$oFQR!mo2fG`*^Et&_iG^|}$EGkHpz$#It zRGDZ9QC@mQAcRy_gr#zuL?)ZXY&O+txg)g^xAtwXw6(j&a{9PM!-6Ofgu|h7OcFF* z<+)uius6O3fxs-A30i|S_T&YgH{N=CMJyJ3;b?#)nM(C3iqfPasirC`;HSH%Z^R%D zRxA?vG_N0cpY^?)$rkgBakX;otjn>Ub@E}Wp$FboMXgXAH5@@mQq{Fc2~bf1SSq_5 z1<6zzug6`IX~Wovwf#^vjbtHJk>4k_&TA?Y88mghUJpG=4^QuUn$=yaNfpx-E;heq zJ_e~e)@Pr6rZ7m-a^TBH1*D>AtGDggb>^%YLvFT)*W)3cNRA4`eaS=o=$+rtm#bDP zboB4w>f=^mGuTE1V#$x7AW3qa6J8P}TXX;%SqMO?Q0V}O0)eLLq|;d(PWy=Si8NgU zT~zXXycSQ>=M@OD#VlL;x6={X%&PsXiA?L}r9Jz)q!-ep=gJdIYKLS13_&p;)AlFJd0SZgc`L8BACVX0l4j zyvh`_C3B>hr6(JqE7isB_&)Z=_p&Ft4-Ku-6;&@%&c*fB{&R-RSJFY&^ms#`d;#C zp)Bau%K&Busk;|L)U z&BahOg+HzPZyxA)m{c)cy@#j``&EO0S_T%6JC_BmCom4!hBIL?EiF zhK^p=P({V-Bh?Iu5E4k#ZRAqXu0_dwiRNR(3Q3ZENit-J6%s^qG5WJnqPZB+T#Q5^ zSy>fR2ti)SlP{JgV>+M4Wp`Jt)0*-`gKT7)cM2zj=Q6Kl9+&*^YR>-F*#tcP#?c(q z=d;f`6IIie9F>d&^h6>R7l(1ph6XYPhSE&SZx3yIjt90p+3@=nlh5T-Gp|IJq+xxX zqJgcKmKrO~{#p>L3Xi7i#0pVj`8d&RjCdhQG#jTs7b9Mb)1QrzC?rrdt#T{fpo6R* z)(a)di(=~tRCKb19Bzw?v9318Ima^2IhJX`sZ91v!6X}NygPpSqWuJd{$W7`@cDgs zJsxv38XX68juuF=xy+$dDl^aFun&o4I259%r*ByE;=!%Y@b|5a>*Ad^;Y_ZZebtb% zbtuQTs%yk^38MKV`;rIf&%}u5;-rchqPY?^#qx0y#bjl$OFx&I6T7GhjB5f-Xdvkg zAWA~QV{sF*1qs;w?2GNEH{FLxG7z){xOMUOu^MedMt}wa%soB5OrJJwSP%!^F1%ow z`R?ETZi%X@e;PHAxoqK`j;&iSJbA(VA!lYV5TK{GZ%7ay-u7Hm5PeoJ*UkAz<(e5a zODvZlSxA#CWJnZ}BnxTcxg?2VlKxzrST05^mn2@O$wtvY%QWOO)jUECOBF*9S~-2u zX0+k6dI?y)ggs$`wg7&cm!LgJ$QHzB@gPga%7lw#`uNf7w~;O8Nfk2uz2gx+J@=Et zu5=O#1t?BYuk)uf>bc<{@Ye;I(-PSiE@cUi=n6R->h26B`Z2nmtd3aJkw1d}QY3{CVBq z(9wBo@4L(i&Edqhc?`7yjo;^^uk1J%L(Z(~=QB<_jchi1>e0wZfDP|`xGMJf&wSF} z>|O#vC>Wr-HZ8LJz#nw4=MS46s@kPll}vY*ba$RYPnKOhIkG)D()|Uj7MY@~(;F=y z1&r)^`4Hny3(W&HSdeZz*0GbwNWIT|2)_wL)D8LkX1912#`BED+bi{cL`16UAtr zbgYQoE|?HDb5gsRS(7bHKG(;dg9`UN-OGWTLVT$UPO_sJ1cijk?$?s+y?q1D7Atd> zPG$DODFp37f_5JPs~^9`OVH*gVD;fKdr(!4L^4&@Dy1e4f|6NKd6%fsVrxK@s$eRL zhAe3nhr>|22z`3qHT?LEpVOP_rJxr1^?SeJ-_N{>kR#YY(SbmKO&wc@k&B|iX1{pF zMfPpmwlB@+^P>imcp?=au00eC($(Et_YnC)k;Iw=zF-=8g@L4QmyEW;gLaXJ=;kczUh8D@-}dn7tFPevYtN;vE!@D$Wm(2- zGFMXnhXirp?+W!*+v=zlfesWE6_ZJ>nlnwjS5A|Q8y9_vAHVT468SjELV{ns^Gm*V z+E)qK0`)P;fR9LTPVv>H9_X$_JfDIXc`F-0=LIS zGMTRTf2tba{@Ry0uudWiT;ey;Ub6*XHmC8cM|Kl4qZP6;;*h6a#ztIzrS&JO&)*gWfBERROMT8+g~t{TT|xN^OTd z#FtLK0gGH(QMo7G%k6LcjILBy9a|2ELPM@6&za<+|EoLDJ*vozs=8Ei}rKfUEgKm38!=Of84>rgFR(;p^U|9DY@!usY_I4q7b6d=h}>F z2l9l3j;bl;(glW1Fq`C?#Me*%H|$0`=z>VPkDt8uQ})I7Ro4^n`%3w(gRb+`mM3{( z`}1g;+F&0UjYj6oo~;54Mh#>%8vWqI)oY_o4X?6l9}JY-bOW0P1qN}X|va?{@;vB9rXTh2fsY9lKJN^XUP>;^X&7l zU@{so8jNKME5FLFyINK%MAa`_`CNIgf+zr?OB5A_k!(^r(L0H6oc=YOrqa4S@qB{Y zUjGSe53ZxKCVX#i!*vcO5Axu~2l&;yza*#R8z#+)70cZ=o9+Bj0||7jTC+aIFuU}$ zghO<7N2*bKO-GU>>~;rNU3D4%xw5)`_fP&3A#;5z46{>>EK7JCPR9Aegj`-MhM}pn zcu|>3Pub6B?)nbnk6*-(e{mOwx_YWqCsk!;9re{JJOkMU@uGJK&Pv(o{nipSs6;0FXaqj|*l}qIo5OEX+Ugp^ch30^Q~Z_fQ78ZB%$h~9Seyh{M++p0RI0z^k8EC{)!NcRZ*N~k8PGJnoMItiFj#mgQ zbJ5w=S*O@c^iHZexzTxK)5B!T;W1I3)Tf-XNCi$CHIRjZvT@h$Jwvt!0s*?a`)UHO zYE?4?F2C#o-rAtE_fQd&Q9waQD=6e*8FHyCnyQZYSqzdy*zRUdpq**nHasSK^IViN zl_tLAr0)k#?utClX_sEYg&+F_&p-bPnp)Q1L|GOJQAdSUSt%+YmZO`fnqIdq?Qp?p zqio`ah5y3EGgg##_d!Pr3x2)!PImY2s=7MuLCi)=X_DxW$i{hV&l`2R?23z)dpsUb z-6~n~kpP*?MKZDr}XrCgz8I$K?0az9|SHSa)zO{n@G?wma3sk||3o9K+}Hia*`^ z=U^t2xpPz$nayU`zW?FsJ}NA!Uet$!fvVeSK#oY&98*b1Ty)`iY}h3*nwrKn*e1GW=aN$BxRa8ymp$!jm`|CfUC)G=< zvwjce?o<~$`*&7uF@F36BuNSY-ceB`5VKh=H(c|vk9e9b?2s=Mc=)j=xaR6hN-{N> zDzh%BJbOVh$OQc%o_*yFGPA4@Ff?_cDyl*{n?==B%myO{Np4P&B7NnBTB*<62s(0;#@uEy=7qBSmg*MHq^txX zL=7uHJctAGvn3G5+Zo_1r~NA)ONqFOYLU)(XG1l0M|Zt@^}-9!cL#&P%Q$Q(VTfb; z)G5!u{rdCgSuK{PVVB7>=CNb*%K&ul?<%n=c|h~4hHRdB;Z<(?_1&b$=%g;QLW^mZk&e+dT3$Xk2g zBwK8rP%a6HUtjWD>?Rush(!9BGiUC>{%CZ}Xeg3gF8}_PE!!DtkqEQdR9*qGBqOCJ zAR+|IFIdd$Pd&)@F20`NomuREPC{&WiqnC3HpPy<1ME-qQBaj5rci-ktkuWj;0!Kp zozF~18z#wc7+LC|?^YLg_CCad3zl-$ii>&b>F3Isd*X;FaqYo1^d@_Wq}{Uogk zUfcC5FYS0?NDwL8pW7o_E7uJM0=Qf*D==m>GLm>AVOVhD30IylcaE{yApQN}m7Krq zEZi;!=}fjPKd8^ADI4LEBr|jR6t4Z)mDpkiHs1L@Bvh0M1~7?XDKx7Th-4EKH3gf| zjB%t|ZjDT}%0|Xnz07uw#ci~bQu1WALURf=OK8*0IQ9_qLGnALK8<%+v@@6lGTUcFh@^>w4! zYog`aYd*gEzkYp3YqLSV>Jy*ln_vAbC!RQ)R60vE8n3V)QPB`YefX%XNMy1(?*7An zbN@pt$u71~SYoRJDu&Lf6+#fQxoCF;uo=w5vQ`dQfYZ z^=x+kl#21y4EC1`95-<)-@M@~EMI;>HI=f7bGqgBMKF8smY@$wMAnIes<06wfE@TPrxn?hI>@@zev(RV*ojoqMzXm7p<>ut;M3P!!~gpH7ib^X zJ|u_(6gqb7M0W4m-jKZAn1<1~j$bOBV&bGJeerlaAdLpdSR$5a{vj7a>a();AD!fNC7j=kxI6o4?Hq5B`<&BXe+lH;VWm!w}2jRAs2Hb1)s{ z-Jb1ii5(=T78&hfm(474PvVBLXK_VnJ`=3|;WfiqR^nfA(DxHJcSas$-qJHT{lcX@ z@#Isesy1XDrp<0Am(3nAhzM{v9E=+`P5{Trqv@o_?LPk_mtQ)gv_)Zk_cm|cMkLb1 z>8G6p2uwyJxqO}h7j4NoKqcr~t&plQyrq&nb2%MceEw3-JM9d%J+g`TQwPZhbqE=o zQe>@Clu)vCru)ciDsH0{lVoUacMkmBM5c-|g$7LyPH>E4wqpzuf=D5S+RSqVV3N?L zo5){aW51)H=N^2HUwrQu^!D{JeezV?ZciOpe|zBXoPXZZhVPq$*a-H4g9oJd-g|$? zsDLyWO>L*1dh)Uf6WSZ1Ao~v-V9VAmoVVo6%6%o-K%r15m9kN9JXhRX0|P0E`X~ev zfqto_+RN+o)J;cX#)@t5>g$H`$z!a4^WBLp^nct2T=nlfhV{ zy^0DOt#v|6VsK1Qu8UACIB_m7u6&T+e)UI;|FeYiHwoxEJp0tp*_G;NQb#7-e5JzW>3hB;amH!U~0m^wn&$RDO3j?8Fku`eKy|E2W{zxteBC z<9II1*u`g`!MkTa&7+S$!w-J;bJElEq%O78Q)n}{l&-No)y=MSFH;?1=D5bJ)2$>DCZQHOD*2-MpFDLA+d@g{s42QT(rDG3Hc0|B1FLGi^AQXN z=* zrmNS|%oa1IY>uL$)>T7Q5}s;2BlU~cHpw{^0$IphdHD)1S#bgP|LtLZdh2hG+2%bP`AO#a_?-GduOvQv!4h5^>MUK3C>yMgM?8^u zG@H%70IZM488t_I2;aQu|ySQsZ!ilPmNN&%d5H{ zrBvTp0Vb1)&t3ZouKU#0++QE?qrtE@oyk0rN~N9!-iycMP2E|e22#`1&3pHCo;qRt_=Yx{)k-dx$6~S62Um>- z%;wTMY?UOa+A{IVR&GOpSi8e|O=&rRK}dY}n_uHgU-%r~|H)5z;MJW3BZ7gt2I4TN#^X@nK#W%-eGZs;D8bXrL%WAtM%XnQnTefUv?b>y0 z?%2#b@4UmOKl9o6KmPGDnx;h*MR__Fi#-Lr#bH+S7`4;9VuE;FpZwk3cip>U`32Ho zt@(__=X3v`?x4MWOoN-Ms3;^7$x7tCmUUJP=Ng}^R1^3VHCgNf+2FOH%d&*cQpy9` zf8ZcD{ooc}csjSMunZhLGgalA{(YMys9s9*gk(U+&Wl2D4gJ6g8jEZ%8B(w*s#L(b3=` zjTXpQEV257Rjd0O({}`|En#{pS=57;yEYmyn@rW}-CFIn)}9nnY4Ibe-d9_f;Z`Fv z1p-Z@oZ$vz$ByAIzxyq3tbCHiTaUx@y%=oBj;L=%P2B8-D;&i*1HaU!Mfe*LGg~#p2?RMkwc(B`S{Nt5Z`M2+W zn}|0_;v;5gGaWwZOjCI~zLO7=dsyU}#2N0XxD1VE%bS0FkFS2J1)-~`N|9gb25K$V zHHykaO(ozppy_&$V|W}5kff67NWM_0*-mJ{mJD*^*T2IXZ+<{Lo*))aRNes$1_K_q z8=u#Uvkb@p2yT~?7hZUc>pyoL6DN(w#d9|Q)o0b^xH zfNGRv$>MX^aLzkCyz((_`qB4EO)HSP+yZ{XhyZ;(ww?D9yE)B0g|pn#aF&y%lf@is z{<>Pf@8Q{kVv^k&JTeIEap<7y?C;7^Eb99I7$6m;@ZpxN+s>YQ{G2*zc)`*ow1&dC zJ#IYi(#!2}R1)O+V1=g!L}?)DqQ=P}KrJfB zLavk>h(Temk6dv%mtA@>zrXiBZoTEFWEL99UUGOF6d-Xq98`Duo#{F_y5u;hx;wcqLl96PYMP=L7rt5r8 zD{!_!LdY_=-qRURq_l5yj1R+6{(j$qWLkE)opo%t$|gl+F`{ZL_t(o_C=J|bzQw? z9RaQcQTzXR`PIUcPd%O5y?c+a+AQz)_V%q*RrMtx&)@og%F5`4d^+gjREIcR*EE+b zb|1*m>N6wB2Id=$+*~N~QN4i2U_dq++1su0&YDC@Rno+8J@7bHr<}#^#zL*4kdn}RoP*?S>vcd4pRqNI+U3})5b!N!`2}-px zPlAShxXKv^x`3jpu&rY|ufFz%`sCBk#y4!(Xs}o;8)EVJ%6vZm0*fJG;znhhmxs`{(V6E z9|vSMmp>3sB<8zat_on0zP>V8TeIudZ-{N%z9XMXCX>ljI?HVeU?y`8-I*4z5?FTND} z;QdtwgVDG<9*sVl%4D8{|EIaLiH)j?;`r~r_d1`>w4DM&O&g4nl?Fo>D+}z~m-g9zJ?)kXqGF#F0|5Ac?9o>5a-P_5rJD-x&USRL0Hny(! zC09E&uG}y@RqIs!mH^VPcdPs}vQw94U@SM%d+Ii$cQC`kWKMSWj7(^7(1Vd^WKIS9U2s?bRYgh z&S%~fHP^;-UCvDxIC6Zxd~3nJvusokdL9$}Yvs}Zq>(_WLCr$iN!yODMxy~IAPGP; z7P)qH?%FFmdbVRbHrd&q`C)R(IhRh`#bT)z4h5%7%lx{#`?(A64!wUDAZ&;4Gpa7c zdH}_WS&|r}K2HS!rB%C!YbD}f3VRB&Lt=oh&*w!cQ4$?X9Ws$f+&@Pwwj^K+ z<#JiHx3|l3v|OLdL04B7IdT9D?;duVG_mV4dk8*5k^-(gX{Ox+iE|{34(_y)00000 LNkvXXu0mjf;IP?j literal 0 HcmV?d00001 diff --git a/lib/tpl/bootstrap3/images/avatar.png b/lib/tpl/bootstrap3/images/avatar.png new file mode 100644 index 0000000000000000000000000000000000000000..84dd6ee52877e0258f72d0d4f3437c9982a3fb0c GIT binary patch literal 2077 zcma)7dpOezA9pIpbUBA8`Ju#;TP|~AW1M8R9mH>q$RTUOj=5iE5|ypPTq0Dq z(NCf2;H^w94{2}HZ6a?|nqF2$-#Vm zP{(Ap|GOyekZEJ5!vivdpnBt}K?zaRON-oZ`uWhgq3puYiE`HugC zi29EhWIGGGw`kwK3~qg!W8{(EIfR}CDlxqmeyC1oY`s=>;)Z1`{E6jF0&LK@(Eh90e zNE)Lr1?(fCI5n1J>#_aH1<`V7Bvdi{OP_=2hbE@fIqa|xkOx4>U0Lcvq-%TqPPae+`Pz(ZlEn*Dool3QJdem7CON^8quq z|HbU4oSvpyi6juqoilSJ42la@ar2` z5Y4E_;U`si5z*bUURyK0AN20X1=wR6{gkdtcRU~C8Qy*9DRAD1J?b%O;ty}fXSF!= z@7YBIXaL$MP?_}ZU4R{13_Yskops2w?G+Z2b$S)Y$#}dPPMX;b?fRlBv zW;Zdj^RyK~$`#DIhAAmn064+iU;1d7!wyz{q(aoKpz@!kTl(FEM^cqA|OqUTPLb zcIlFg-EUjCNmwyq(?m;U&2}T1$i#n#+}}i6oZj=; zP{S(y#~imD6wvDl$k$mM(-_KU;_X6DWRPz#SiLVg!5a*nBjXG5Uf#U509Ig7oLABe z+Y2J{15|&4rWW(0FC&Eq3QXDl<44k60u2PPS1&qqte^`eC8#R~zduK&^rB6wM#?uy z8w{Ogf`)Z=hBoR@d@7tPc1ns6+jam33R!?evQfG)rmn8O!QaV3+lKd~TWvaWZ{d;N z9UoqO_%SQ3`{VTRZ{x{Ne3%ZEUa4J(rK7V=&pNbE$XlDSEyZz2m*MKZ+R*0sxVYFE zQxn{u=$TnlLpJL#+=t80=$Ol3SO~wJz170I9s*!~tr|(aN1smFULX;_p&N)cEse;m z1}x8lDck7Iaa*I6X^8rzLA0#ho#o;Umita$CPrnQFp(FjB0Cochd3{Q)?052kBcIg?Trq=OS3>Rq0UM+gXw^2xG;z zVQMi^jpQN*~Fy^STL!CjseT1`t z9&lGni?l+&@`q6N@663%7Yro@GY6)SpSnN?4vcAd-iBc|a1tEvKJ?~1N#WW7-vtbD cTY0}+R_|u5YJQ`e?BC1zdSg+|o)Ovq0p*3%8vpLCOxh)7IGNifKgl^(zotYjqOVoC)argf;_ug~Q`OQ6N&RoHa zvQvwa6r@5l(h-uLL(jjDMLaKZPB%uA!k=D^y}rXPT&Y1n%Q7j46zI=rC0)GQ)HI$Rp&DWa%egY7O V+6;P4s-XY?002ovPDHLkV1nn(RlWcK literal 0 HcmV?d00001 diff --git a/lib/tpl/bootstrap3/images/button-bootstrap3.png b/lib/tpl/bootstrap3/images/button-bootstrap3.png new file mode 100644 index 0000000000000000000000000000000000000000..5f2e18a340632d81e8a52efa12f9498ac99d79a6 GIT binary patch literal 302 zcmV+}0nz@6P)CS1}HSAPg-(-pp$_m)XUE#EHa##hKk}csGas5F^+& zG0MQ3@TJgKUV&&35n4hA05QheGCqQ}wxiL|d(DJxpTp|jl=LE|aRGo|Z5dyqxq`bQ zyX`X##8#(10f2L>6Ui|7tP8_`D%ULH*5RS|L+?}N48rQd>QcUGTttR6owZUxVlDxi zEO|^3WryKpvIstb21zAj&Ry5=F*yW>m2#h7-J&^piaf7IiQurN=F7h3c8LZmj~}h` zaB~eJ#uyuUhpn~EJxk3M{6E8A-pO@gTKii%02PIwHhHo)X8-^I07*qoM6N<$f(Z?O A9smFU literal 0 HcmV?d00001 diff --git a/lib/tpl/bootstrap3/images/css3.png b/lib/tpl/bootstrap3/images/css3.png new file mode 100644 index 0000000000000000000000000000000000000000..0c5b35328b159109e20afebaad5e3deb7f3e948d GIT binary patch literal 2187 zcmV;62z2*}P)0^A`od3frto=p^YLXLZwYgU1$=r z8}Hh?_TFdaJr0^oO;%u4}Y^_KAorF;7xN zLdOA6)u`)32U|8&^@NC=yLBuge*>z(&wv8!Q zOLti|T7^R4Q>uEleLSkFFPf$~=IvA{6n+PMQB~cxoW7CGW}k^OQ7=gYR2|1TpsJSu zL}U|iVt9Di@^&f~i!X@CS5;L-#1N71nx=Vhxs$}!H1K81vOeQE{!XD#_?2mzzrJ-s zL|UHT+xq+aj{|#5(>x4(3_w*8kvcFaB1zyEnM`J~XW7FG5g7v(Zn^8aqd-DL#-pxL z)ep9RexOUglwlYT0lguus#kztMl`<$*s2=U4p3>2^LJpNOTYgthtIos7hNE055M?% zg~Z(^vRtUTwIrfP1=ihdGRud&ZlL7vHjP*iat1=~Zu5u(QSwQJ{Icr7m>4vN7+k&T zj>oYZEy~wCrMhS?36g79hCN09suV+OGj}{rtyJ+HE0Qx5y{9$pww%Bj%^UNPzIWjS zNUKQBFtG3GNINatcdY8>lPZ#vE|T85F3rYlD)wZ_7PV^5w+4Kg$oKYKj?&!UgCH_|F%V>?B|n5oZ*&wXRUHLbPMRJCkO{p7%$w(H$66e_K#rgsFzhM%-+FCL3hEL)`7qoDrE#rAj%gS51InYVEd%6SskzUz_ zfB@Mr(t&j6*g<)?i;-4wRy5M-q>xH>?#Klr9h8SF#$xtJsFO$HZ|iL`Q~dDYgQ0B$ zt5z{G5?*^G1d<^|L#I4E7OrS(&RNVJj@_3xl0?=YQK&Q>He?3~+e_~o=qEGW7iYLm zd3Yi%P@A2um7y(O_<`ITd{@Xp*a5(#BDJEsGQk}AyZaBV@ ztwSE3NH1Ki7&+;(Y4e3$@8LrmMttXPl$(6?`xj%A4z=(u#sYp#8(}BI5SAsf>16Du zAR&+$SlYsa@<@bfTE)nzMu$3V1v8K|7!J{AH>@5=kO*Caud;L z(h+M#D;>|O!%9+EBGQ6Wn4T)!I$Y57-1+`uYKLtT@!~$pM2>!ZGiTnI;ibtEuji}2 z46rbX!27ZTJa*q8A6_567g7v3tKSW!#Lqrg?;y>YJ+|!lW08or0#OUx?PEi19~>EaSw2_nLp zp+3g9T8wYCNT<`J)9J3)_{R4ZORnNNKBf9RB={J2*-Eg{XvyCZRF!E@q+KVlbr6WO zkF*l~Dr2hB;;;WMQE3L(ZFh!B%jN9#YM}1$>stbASid|}a#4x5)^d5~*cDPqgB=eH zv3pB~-J3IPu~Hbu^0T$0%4Dg@#ElvgH>zAL)M@yo(AB~_NUM^M{Gg|ey6tjqvdp>3 zGSBfg>ofiA+BCxMEg5!h93eBJ!MB}c%e^FJOX258SM0BKG$ITlOe^q`b(D}lGM!8C@RHa_3 zVAmHtLBTf4CExnhM>^rm&Coa0r2B^?Jt5kvHL1^3sFf--X6u2x?CU)@efd@2roWH$ z%^$p4UGt?!^D_UrPtT&Qs<^gGy*wYuda2qWf$-~45qX<4M|_80jXQH1NF{7I3MbzA>D_r3AR*D1>)?Zea0_gRBuJ4DzoBKuV25kcb>)bpq- zGNI@x$JJ9atH&>KL_&(%aNJSEhM)b7mFgdO!WG#k@FdDu*j-R?1>QvUw2Eadq01+$M)DBzh=G}I|w9@Ql&%`@eqny(TJc{ zf>tDyQmI6tg$f$7Dh(k41(v)Pv=MAVC?U$SA_+~>gfwL#n~2Qb5{T5UDnO#rUNd&A*+ECIX~ zTN{T=q=qd92x1glb*EpSJb4oKTzeUO;XC_5x+Do#-1~8O*H!O>jhl4v{`kkRbI+GR z`0_kr%j2mbRooPW`$;g&~UhW|Qo0)BMh5dgXe?)mPO z@YLgvz`ajD0JlDP0M5JoKCtHh0pGfL7yQGOSHc%}{}Qgh?nb!fw%bl~=YqQPTN*PEm{uSe3Ypq-RT|Y}^DeWdn)b5QHpla8)^;u}sS>WU@k0$SGyyN|t5D zGI*ncH_SMtl&O$qL=*uuHDkrA)p*=6b46{x0I)v+a4Ampe>JvWZa2i>HvAj3A4hDT ztzml;wp06T5(nF~-g6KB>~XmL#s7wXKXMTM`T3*pcQ<|>K6mZ)(Ak%QBd@*&ho3(V z-+y>7960<8+VArne;M|Wt0iV46!|;a}e*j9ioCn78F8KDrU%;JD z?t@hB2)y##tFU+PUO4xv0epDxJK@2DPs05_{x|sO)w^M_^Xu@1e>n(OKX5fX{piaO zPhSLobH(T2-S=Gx3GHV1>5&ugw%^|i*+0p`9fyv<;lqc(J^$x$$xp6=L%%!%kDYi0 zzVqOZ;Pc=36@2J3Pj5%!Y=1Tazq1j*O^E89%m$^Is%e(yY)m(XS$lOA4V#P#L!eMH z&8D+4oT}YiH)2J9Ch0(@RPD@l96Hsh${StY3Qqx=9Xm9+A;+1r%prH=H@cQ}N`Y>+ zL%Ox4XY>tiI^_-D_ZxmUmzA2O4AU`h%AGBMt&Om%s>TS}{>Ye4?Go)YhsZC1)`odT zW`;+MJ>pe$Q{Iq~XJRW5trTxYZW*J|$WYa3wM}Wi)oR5f4ADA}Re2t_XeL@sIw(a` ztyTp}7#&m4wuV!Dl^Btzyg_wcpp90%)sS(<8RU1eS>&tJP0iWJ%;yBzeU0>K6ZJrI ztcBC;RGm(fokjSTpF-t~FL#h{wvjIsjRqA2 z=yW=zMx)Vc_4^1hS-?#Knt%r54i%8yN#mg3pv7dR!OZI>k(Z0baYle_$E2D}HmMK@#dKPu8X&tYQ>_>Tf#B`%7E*RF7)T5tq|M0u z(ge!Y#Y9l|mH{nhYhG=T-J*d|*90~@r?%MO>Io#&5d?#p=Xrwx+6cooGf%l?Sz_#n z1StZzgP|U#HMRsX`fYm_6B8l>1Po9vmumwlDMaEKj$=SMgX*t#N6TH zkjEWcY!;f$unHtUL_G{t;ah-(b6T;e=%`I+r;Xp4ng?4wv!4Oz+OFNvfV?f$6`3cH3b0zCf%CH*1uko3!2Gs zoNe100_zyAAfZeKxpJ2+kZsa+eGVnL+0-HR~vYR^u)TI+z)kDrwpra`;(z==o!C=rF4b{uTcElD~k@+Al%o5%{Scv-@EHEa4z^$__HgXfeZiYGPwMQAA<|- z{|G#F@EBbDPw#<;4!j8OJNO*@!6k=*FN~n~Jp#&&0I!`m0(alG6L$aP=g|K2O>ptU z{|N2#&H-6H1iNp#4xW7RC_MbkPhsEBegStMdkx?N0O#C!3?4iB6g>XxS77HgUxn{K zdlb*GFT&Ta{ag6TU!D&yzkD1%``IfX*!2+H`M_Q9t`A-W>DnGR`1oVnkvQ9*jll10 z1hzM^?cNW0KS*wmu&;#e9640y$+48Bztwk^KEvPQzij7@VTy* zGYsBt`%(}rlZ1NS7|{*2CBkN`4x7JefbRxl+T{Yt9{UE?AHHu45U!S5Em70}@u!CX zXGtZ2;&B&!@t7}CdyU3gM+B={-E2!N8f%hyI+jR}z08(L&nsvQ9c#5vJ?d`_Hit%N zOOh?IG6{+EsUHvob4l655aKjrB_sxKsr7oJHV)W~mp0Z{NVZLlesakzWtj!M(THus zODax!(3a?UrP`11K1U6%hwunpSJ`V3wU=Ubh7Jn|GJ+i=amR8T;rTe?(Ho|_uBtH< zKyOq;586JfKCmDuXB$~+2P?d%7;#Q!*{ma;!DCqj55j1MZ21`Fa<)jL(tsv;8aGBs zyS9d-ft70fG@vLR!9a@HUN778R?8sp>Czxct&Q3v{q;z-NoCB4qM-U>Hb=`@THqpg z#u6>$sIP5Ca0YIVEBILg103%v3MIv2-=}4f`m2=j9F@joFxX@U5N%XEFG4TlOubhu z(~3_OjC-V>@^K;wBpkGBH7wiOWl`J^an&u8$u1#;ie*9zERgXP-s8J;ED$1Qv(i{d zjCx`bgMrmnQR?+Zq*q4Gl0*rWR;wBx7UD~;OM)zFA}+y|!EvHgL@^Y~X2qU2W;v5q z?xXM2Xu1iPh>fD_cHIQlESSD!oG9Iqm_>8NY;i=_(WJhl;PP=33D+%(9w7;r3pn=c zqD?9m2~|dzu2E%`Ey`nBj07bFb3>=POvw@}PL7MCsV=%NqW?LwDBA01X6~64V~XF3 zknjj(>4_b^UL2>v@aSY&BqY}@_SWjnyp_o;5UNk7Q>&A~Qai(sgP@1OM7&Elk+_C3 z>PFG@^n89==^MmlM5id*>EvpfR;$&<7_3Nw#0}hvqP3~(HininTnEcs*JavuqO>=) z{34wW30(>F5${J&j8&Nh-EJZ0P7;ZU+w63vBXlE7=R28vI^FI?0tA;AT|FuVE5Gy< z3Govq(R7KMaA;V|a%OailjVq~1oXBg$vHG^dwj~dcy zEz=#Lm9a9C!_Z8ImFw=Lc1j@K9#MiTKDSy7H1NrE8a5ezErMc1LIDg_#$rC%bR4YR zXM0JvON=IJMv=%TG~p1gmR_J;{9&AOIVHZ%7Uc_xMAtz5{r<`Z^9rZXZ=*{r<&lZe zsdorpnV4~gpU?Vp+d+yZ;*e20jalEs#IsbaHa6Vl`9wV4H_(~6(@Z(RY!;wIV&XW2 zpg=}P2|cq|q*vj`y`)=7Fnn|F1SvE% z$DTV5dX<_>+&sndj25=Apx?@)3HCVJQlgSzcq!%BwlhmPPAY{zX#+dA7rDeFrfZ-4 z0^)_7RZ#Pjtj7cFWzw>Ctwiq+kw;!?3CSf=F()I!hdHbxf?41e3r(V zP}Qi%Nq!rbPcvE%4$Cr<)9gF=rkn@TTp33erc-S=tm1QkG_I~tYoSO0W$-4Z-NDtm zSXhM+V}$w{8HOOBI}8%#H!`vQ!>5RZwN5?{R>#_0?TAas_VIPiD3?236y0+YjvH>I z7wPJjwYhqIMK;)ADjP)6B2CMjY90* zIF9Z0$9~M*!^4i(GqW?}U9V#jsefs;bMM@H?tjmmd(OFM7TWPQ5vhqt6?mWDchv8z z0Y3&FUT?>JfZqWFf%Y2kNMMcQfqOpzG9t3(x6j6K3c*R}%K|3QXZd{qHXwm^9BltP z3m_t>>d$=QPl?D=zKrNtD}mFdq=Og)3c#L7e_d7I@vrX@kvxE^&H#1bT2zpT98%Ti zf#(8*w}dp(mWZ55xOWyP`qwW3Py5%O2gd#DftYze5)rFgl5NC#70?M(^@^%C)(NZX zR4?+Iii-G<|V9q)Jd(!`&3EX=dFsk|+;=M{~^Pll9-bD*?d1UxoR(eRjrC?MWj*Yya zaNqx%OsBBmvSpgi{(!O|N}xk;1M@IOLv6*BEL3jkji@HlM#`2Y=9boUl(eXnoVrrB z1h#V6ur08*Fi$naRHNo$yJaU^=bD#Qlf=v(c^3Q8FL%9mKA$I_@9%nE?bTmV|I^Pm zNQN}6#%-8u&N3|ZtE?duVx?49kwV;YFCCK4Bl&#S^Qf+bnn6t~)SMgcqBVSCqK1U> z;P9lS8{IG515D+5xE;{6z|x0KU0L%@A|;eB&EE`eiO{7m>7aQiO;2Y*Gs+|isqCz# zHK1u#ZJwWeGy|c3+*kJOm`?M zwnxKI-my5AyIO;dh-i@HN@mS^;;%eI|u)2$Duh>D7;~7Cnw9RvbpP&ikM=jNQ#ws_D3JHh_Fp?`krprV>S3t74w(h8=L&=h=29??( zT{mV9p>5B$=EWVmM7qwa8vG&!JZ)G3U=<#@|9G{sp*@>BAm6 zi1WawarS=(>jT4x9q$IC@>Gd$thi^}0f= z;H8E3^Urp{xR~HZPYEp0{+c;i)5{CgzxP$F2R?;$;4s#{gUuSBbpIAXRng@Iyo;xC z$H#EbpMtf@2Ipw96e&lCNDER*HGugtX6$9m*vnu$NO2$5fk&_&Jd6zPP26Mv>bZE+ z=kU(Ifjd5i_s)4RZv5D`vtf#+RZY3$TD0e)ljraz&*A;y7qI(Ito?_YPhtNjq5s2} z`5D{`r*OyL!29>5xVsz(PYSKb*)he_JlM#d}5-8>P*K`qzjU2lt$H1UG!L)^H`nt zs4bgx!m6t1%zdv-hbo|Le+OEe{Lg{AhCX`OV4eW$h``6SgMTHqFS!254Q^dAjgIHJ zz&}7oEtS!GuU>jHI%HF4G4+Mw`yI!5OqxI7F-7+vTZkx$Bvn;p7C336f3B+g>ix&3 zQV%3uEv{d~o@spK6Gp8k6pjdTn63T6rKYN<1sQeKj1J}|{waPTrW5p}v8ktvcRD8X zIe{aHJdWyM+*6RI=bb|Ni%~OLaOJOepO{$M>bl$Zn7A+3}CKZ^gz)%6F=h5Bxh$OFMNihj;X2%TJLi@B@?Mmwx<`-iw zGcHph6CpaBh2)LvZ}vclxujf5E;mO~iZSSoc8jd)e41GBCV9;&R}!AU_aAY&M&*>2z9OCzDAnQulv8*K#_YSf1y# zT(4J?{^g=?S0AGunK-%Sa(O!*kGHNs8)%CYY2q84PYEMW)s~xS02{VHg|0-ib%r7B*Lp)D-Xbn zQ&tgM5J>ps4~7x~c3ehMX2#<>I2nybz0AfAhXdmSq`jq$fJ7JNy}iBlR{4LSARiz^ zp9)Ox6R3LvwyG!7G_AwgE})Rtm0&!Nfzm*!W1^ZnSgKqFF}k%IzuEd1Lw_JmqmQmV zvnsZik>EO@Y9YIjd48vBGbNJa)2jCR`0N8Mt4>VH??c4*KJx|*0cn$f!pGdl)Gw4EVpo1nZ zm<>g6@Oe#4lHLbBRA4Jkfr-)rG!H!-Gyz;~0i*9uK$`_f=~3<6J|Z-_OokQ@eJ29g zko|Bx33w9lB;ZMa6gZ^(F3{-$0!}}efb$FT4b|pi*JyCJ+x?f!yuQAYp3Ab#*&ZQ) z<8~bZxhx+50Ul#;+tAfD0Vfnl%(+OnQF%J;v?GH7tscYm|H6tCg%+!!umCA=(D3NM z=xeG>au9G;Il`9x^@jlbkZS(3MgeA!O;JYN1`D(`o;KqEK zLRvt}=$A4^ydRB)Bw)Q>8y}6;F$nW;ZXcQeoHQ|g$&3;S^H9AJl7O}YSVpKXR@Mfg z;V!F!ZvqHKQw7C&;uOJ4iHvUoY)WKQm@^MWQoaZv7Ec-%Q>Setm`(>D1Q2Tlm1S~m z*$H9;8Pvp4E})Jzm{{%W;iA0Hpu+eEf&RY6Xw5O=XengYcYzDs3|NPrpo zs`R+8IY3~>0#}Ta-xa`lzRQ}Tzkt6XR*8FijV99N3$pMT1r}YZzVIyCAdYxbd2(^| zz=8-YCq^kEsyE>PA=sT!IYT%<>>>VrW#;|;-L!AW@P38JG!sUAgCvktB6bOis4Z3q zBu8fXK7cF4>}%d1%!DQO28oH2>^S1RQv4ocvB&80J>o*NId$Aimp>KP5mS`p n+=Z?ev0Z->*Q>7%{t;jRQAGY;1T5np00000NkvXXu0mjf$~p|6 literal 0 HcmV?d00001 diff --git a/lib/tpl/bootstrap3/images/license/cc.png b/lib/tpl/bootstrap3/images/license/cc.png new file mode 100644 index 0000000000000000000000000000000000000000..56a4e3cddf2df52641784ed11b31746475848c89 GIT binary patch literal 1182 zcmV;P1Y!G$P)hkAVxrNV_W`e&_7WPVO#3u>YU53WkM9;ZEVE z#&wMpTopbPp6j21pTUA4R+uWhDJ(rve@X`1ts!@Or%l=kvM3 z=ksaveTW=C6h4QLdRTj7kwgxMLz!h+*%z<}_OkR1@g&46X_rZol=u6+^bOb(d*dAf zCft28K}7t1zb|jMTRAj<5kigd!UUFhNW_P#+d`h_5^d zZhil4q~F#8f&s@i1G2uh5AU0%X{9l`@QGqcS~Gy@uwgu>(@02Gnt~I)plCBdyXbT} ziC%(r!ZNjDswtd;i8==MiA-QRu}4)SY)uO!Nsnc-;;Vw}G6BC!nb>W-a6mkdl)uW6 zotz(3-nEAZVjDFEqjl;o#pCfvekaV2st+<3^t57R(gh-``)G z0VXYb83v36Z$8!Ya=DO_)7iUeFU$p9e1{8o4TDqyh0ulY)((}XY?A6fHgO#hL{b!S zVbFUbq>InpYzzeA9n{C^5+Pm9fOS;e!X-k3rouo|p5Nr~R6&Jju@3uCOs6z~s9ADj zF(l~)FdY}REN-O6w69p?%65Xm$t2~lZn)xF4oi9##J+nk4H2lA^y4Xe1rwwV5txRg z7NFAhc3*JtmYCFIb1gCW7O7xtT4LX_DauTV(*JGo?>rb`q+giM_*yq7<_c7sjT(@? z^l+5af~A;(pu^0bFHUXx`3pNBQT#t5BZTcMAChVyah>svZS#WkId^TAWZZabO2-HR z2o6dXt_LN>=Y$b+$2JM!TymWA!tD;v7%^TT^=VFwH?_kMi~!*lX9otmGmuFe70n#5 z&tYmj3stuqom<)b%7GDx4!^B#S4Gj+wHY8<;oZ?!`?^eXW#;qK`o1Kt^ZXiPp0Ew3 zxhhB5`+n@9O2{3l9|_YwVa^9cHon0lX2Hy^(neHM#iOd9f|=hT4(pOL^DOPd5URc! w$zkq-f7j=^lMk4RV#0c@f4&U)aeoCE0QOPuU{vHw_5c6?07*qoM6N<$f=z%h)c^nh literal 0 HcmV?d00001 diff --git a/lib/tpl/bootstrap3/images/license/gnufdl.png b/lib/tpl/bootstrap3/images/license/gnufdl.png new file mode 100644 index 0000000000000000000000000000000000000000..bbf6b83f91293e0ddf797b3d686e9595b46ea974 GIT binary patch literal 3457 zcmV-{4Sw>8P)3?dYXVWHl|=b+Ee3zJS6q@w2GFHcv0k0 zu%%Vu0P-4~S@(|_wtMf{GYrFk_nYj@tlwJuw|?K>UTf{Oers(VQx6>w2Rs5i1jGXm z0%1Uqv&<0C3v>Z(Kof8o_z@7(V58qL6Zkja2+#@GaS)lvWq00t#HnlMv@-A!tAV4y z023!X-ZkLVz1p7!>-?l+6Yv_aeB8o19l^oDgocI^6y)duLqkLK_VzM3IEWBlwfKv` ze*=GGl3ir74p;?z=={~x6(1i@dU`r3DJd*nx|BtW77-pEj=^A1l(X4v^z`)5+}un< zLj&J_`z_Vg)wH#>xvN_M{{a5r{GC>W03QQ)(P*x5adD!!xL7naGzh!hE_{XEZWj#= z4WhWXSj5G}x$7EtowkHb7x~9-G6x{wDt?HTmf1Xi-&FHSNUJsH&;pzyU5@x+E{sfnzb&?amQu97X2E z$jC_1-rg?GojWHME?nqw&K?^ZD=uHYEIpO>_I8&tr%#_&Jh_&Z7DawdO^uXy{``4G z-mzoHT%P>gxpSrbtgI~2-rg=EBO}%I9@QeM*O2`d$R11RbUI2)OSyLK8tc}r7QiX+u7>!1nnwk^}Q&Zi( zQoX{9FTNVu|aR0}^orH2{c+h#))L;iTKQZ!7MMiHT99 zH*eldLPCP#dg>{c!B#?4R1{fRSpYOPHd0elGciU!AUivoIdkU7MXPXdmK=~J`%g|z zjufu4+wBTv>PSvkR~N0Vt%~c$jT;^fdg-N?r2ij%^wGrF_<+E`Kyq?&OR1glm_ zy@7;;1jSvKFJD%qj~+crM@I+w`QEQNbUGb7cI*J)?%lf_Jb2J;S))-oRT&)}RiuRw z3fYVqGc@(2q@)lL5g`{X2g3EhZvg48w6ruurAbLigocJn>Ep+bD<(t{5fQ}3#u5@T zv5?%e&pu0JWTd3i9cIs-tw{g$(@%=@(9jS)Jw0yAkHKItNN*q~jKFX7sN!fTDJhB@ zO(qkYHf>TEuxr<@Nsrz^K|yTYx)pGJs&dSmH&5YQi^Za-ySlnsaeq=$l3QJBZos1e zrN|}>5gb-rm#*K>nojZ4m>gsB7Z=QwCYw)UThBArf0U|^uv<^2hR!9Z|uuuu1@IO>hS2+o5FV^37e z5hqWcWY3;GUR9Etn@d4Kft236cQ2oP_L-uLUau!8D2Q3JW-)*Md>(u3F*a=2Ky-Ap zTfHy5@B-g`_nnm9w{IV7)~xZ$Cb-vXWf(T%IGGU!FgQ4f)oLXmAi(A3Teog;@#00V zDoRUBQ>44Px@c@{9QQtx$;7s8+j#4(x1_a*9IdUb3O!?iP;X(iTGbJ&UOn*3SZZWs z#4mGwUtzUc`S8OJS-W;E{r&xZ*WcaUt!@Fo8i95k(_sKwT3TF|yjqBkj+PcQYN*53 zY9uEo^YFtDGcq#5wQJY7a^;F5|NQy$)fV1oE?lU{J8yqcSveKPXN zC!bWL`}_O-7A(1X^{RRdxCV5LMTAbvbIQxh$5m*z+Zh=d(Y$E)$%aH*fl+ zOO3L!GPUS5+zW}7BkKl-4G?&WC zO4hAg=T>QAVj|Bx^NeO*czC!^hW7UMGBh-#kcEYX`J_vZs;Vk=w{8W#fqM?H1AhhH z9xL(gyYG^jnd$aDykyA|-hA`TNgF4}H{X1tc;ZH*kp&ADOiHH^g1vk9s>O$Ja8_)L z90Kl)B`PZ`sjI7-ROJ(a-EQao_up5@Qc_YTz2K^=tD~Z#LN2<4gDaqPz-{2q@{%vV z{IcI(L!K}^Jj{+AJ6twNwrtrlDZMtEjaOcIMJ+yvgDc>=J-!#mxu9@>3l}bM@ZdqV zZ+E+)>Ju(ryvQe?d?HPSzx?t`Iy*ZRWtJ{o%Ja{AKJsU=SornVUp4a{fBbQ3Yis%b z`|suA9=td`_MgZ?O(7v6;_B6_;?qw*RfM3_yRe>6P*C7?JP{Cc=FAaSu3T}^lb)XL zwT_)TcZ!gZ5ViadYO-1Mj6|!^c~I?{J37>g(&r-S6`SI-L%a$;7;Q^H{!oIayg*Y}&NRWjDwd zsK%~AAP)yOr41f*RLJytJplm$Jn+B+iW6g= z(B0jQ)#~Z@Ag!C!nK zJ_aN3ceT>|{Cr`xTJJY!30A9BCcjpMU=OesdRHU0v?p z4riUV`vt*hw1lXrC~@-S$@@nB)TvV zj1VT1N#x|@2#dwymv4tgM@NOlVi7qxIl^QzxtsabJ8ha)%m7{i{^`aj5g8dN^78UT zX=$lwYHIT8&0)1#MN?CgC@n1&d3kwSho0rvKb;-g3EYPzJZ#%{!mZ4HiYw z;QfB*?5_}eyAL7tK&Tr@B5@p7r_-sjg|aN0wQ5Fke1mh7h^US(P1EXny;iOPYhrC8 zBd#u)5K`=Yv)NRa%cU9`zzAr>SWM8WJtX2n)wz)8IYk?+nV=*-ilW9wrvhjL_CW9n zfeG;k9q~ihx(N_WA~(tIz6J3NCZyCnAP}dpg)|&QQ4^mRi-nbQX=6QNKdvpbc>)l5 z1CR=@udm+w`@8BEEcTynol_qd!!WdxJfZ|MrZ@NE88|%(XnaDcBYvgYjH$zG3Aagg zSF07-F=`mBJV52D1jhsphXYIEeV8N(D@1Cd0$=)VvO`rx05V^`{$P$v;=ynez}^(=MqkhO#v5!sHJlxgYV#m0%d!XO z3NypM!{oU3&(MO5obqzDg2FHmNF~DNkfkuiOE>W`CdNct#ymg3c`Ei3D$`zYAL`hu zq6?%--X$o^pos=4CGjxH;$+evqh|0G6avh8lb^oCr>)G`mCO*2qpW_WoLC!`1HtK5D^P|&h`GI;1;Vu1JL{mZyU4-case^FjWSk~YaEPX1v~OKs{CMO_RcSf*_V)IBqT%yXSBi4mhmT`#x7)GG zWxnsb*MO-TqR1zxbppjY^8cWy+FUxrNXl>o@2eSr78L_#od~(`6RJcAQQ#)+GZ#hE z(pEwJvcK;C`1nu{6(kASlcQXY2*7ENPT$iCo)o59O~w<1}D`r5QtFKBL2pEyF^i#g=ZOl zA|f|NxJ68t9U)F$(lrlF9rMC!jhT3FmxWZ5%8*6~F}pcx;=NtA$2bnzv^hFRdtB3= zVx_rbw8xdRL8fJGJY$>0z#%#qnkp$Nb)cFHw3!bABVe1}Zbsjjm-MVH5LRxmde)Iq1BV|I9CSt5b> z(sWRgJR$C)dt=h>8e>$J%mhec3~hkai4n!=#5nm|0q!8xK%;g}iSIJuz#XKr8LVti zddwVxW%IrPBT^Ak=wDmZVYBe+K$e)W3;*&qpXosTf`*+a2bGK8x8BlwB67{kGJ p(KnLQfwSmV72q*wnXzyRPXu7+jChK~RM002ovPDHLkV1kBzcn|;p literal 0 HcmV?d00001 diff --git a/lib/tpl/bootstrap3/images/license/nc-jp.png b/lib/tpl/bootstrap3/images/license/nc-jp.png new file mode 100644 index 0000000000000000000000000000000000000000..45da7db6993d60bd56404a56702e0d384a5aa290 GIT binary patch literal 1319 zcmV+?1=#wDP)(RCwCtTj6o)Fbp=m_dj%kumSA^ zbOYD`Hh>KR6VNvSFah@_fKCvY0GJ?jg1mfO(#rw1q}UGOsyqEl99fn=OP`&Vs!zg9 zJDGkkp5118%=Dz5Sh|@;nQk&oEp(HQ(|v|X2f48a%Sr3>kdGfWZQ?L!;c3!3T{OWF z#fqm7)J1Mb?b7oY>QYTI?N^yZtK#J6nNGy0*zKxzyRAMx^c%r$w^PUCQSJBpDt0Y% zyS{yfJR8-6AV`P9VY*(g(Hy)4EFbpNp5c|T0ARnAGB3tQnu~?)o1klM0au z@D7JV+GN4v5Wu*gP+z;>>-Km~fl{Rsq{hT|b-M$xMTX+lM}C=#6W4VDo~OpdcTIJI zGztQ$+Jh5xdp;EfSP@ASP(==Mof0AyZlYkwZ8$L5>vRA%Q14+?ID$Tc8jFKPL}W&6 znihu%~KNr9A6A#Mr>B)V{g3K^No`!|IlTo4tefjfi zyHy!Zs4T~wjQRQb>GgQ)Pkv_aOj@m$Qv=`M-)|xUPIegqNA-*4<=G6z+2M3LRp;~h zcRB!oIh)PY>+9ov=R(m5t)`H=}(C) zJPFqF6NUX$FJSBjU5ljO2mff>ci?>!LE0+u0fQToFe_%3%cTfVs6BcznHX<>;F|!q zvH<8{$Jf`FYfRmejF2=9d;=cx+#x>^k({734eCJr3O7bbPEgAVOLv319N+*a4(xLQ zNfgxWfHF}dcMoDN?%L!f4+ zCgum-Sd#@^BJ4Drx=vjuHW&(>2#sK zn&C%nDAJscB?$rCHT z(=8~6!NdWgmY2@Z_QKp=H!vnj%M>}CPUoWB#tS)bqSfE=-e7D2NE3f+~+$?mE9R&;D5gWoVg^ak1j4>;!FatUUf^C;B@KsR84qH_Fl6 zV6_<+q3>OKU|)=`dW?h45ocCy>5Dko!GA;8L9PYN4-`O20Gm!w#m?&5fx626uTYmi zRQA+^WULs!(|FQE-MR1g2q}J`OlqEZpc*DYjt{Y?iO2c)jhpyA3G?(=TSP{Zzdu%< d{ssImzyMLkE4k3UwSWKs002ovPDHLkV1oGmYaIXp literal 0 HcmV?d00001 diff --git a/lib/tpl/bootstrap3/images/license/nc.png b/lib/tpl/bootstrap3/images/license/nc.png new file mode 100644 index 0000000000000000000000000000000000000000..5870e9d5888ed16cf269fd8d4b18ea2f66ee797c GIT binary patch literal 1376 zcmV-m1)utfP)-L`Otps*hAfa;AEye7*-?NFt&M(Tr&BNHe--)Mdk`L{o=G^E9R3)hWZX1`KDN zidG$g_};f*IO{|hhsM3(eG8&53V_CyFbspIr>EfY@!t}++s$;T??mVH?^oTMd%F83 zx*Kc6 zW3gBiYbu7s#YeV?=)zLNm&;{-xmcY6yxHiE1pISEUap?4gH_uJQ#_a&RnCLm4_ zU9w`~0m}g}o@pHcolY8GbppWz;UzK$40$XMjPCjQxwFQXf<59vaU`x6Q1=WEF_CCK zpBG?bBcQn0AQVrl%Kxv|Yw-5=R$K!on>za8;h~`10#Jk#{;>XIC?gjDzx8@;L}x*i zbgDel?*ax(V#5l=#H;ZN1SzX>el8ICXk#I+VOSMI zaC+)>KQ`~8pCH&vkuS%*_%4q!Hlopxu!`rh+=aRl!QP8(u;kVEtcHX_2`bg5MUaA% zJK970%ogJK!@ogHR;yJ(RLJoau`Q`!Z4jZRM9_zfxd5n=dvT3IJubw8BuTt?lCVz^ z5L)Nm5+_U@ffz;1`)aO8QnI@^)ofgH`GkvZa$Op6K%E8J0474qWv{Vu2e`zEI%oJ& z4yfaVX?T?H987VdbqBPK6PzzN-ki4IQ4(x5RBYLKv4;e?C`F^3$m zP#fZ^0f5-+>nKU4Ni#4;m}7n zhSv`)3!o~-;Hb({Bkpricd!~FTp+CX1Z<7B(K;qM;1iirQ&cw{N?K4x3S98OClaN$ zxJh45fVxJhO_lX&)*X@ZixHFZ6eq`~2(lT#z&#Sc%(PyO*`!1hmRB-68!>q`7KkQ4 zT@WKU1M5KRrvsse&~ecWk)+d1HW8M)427m9L=@i!eR}%!`GAvXIt1NSbcMSrc*TxA z3dU|RE3}nOh+ve2X(blM*ekxMtHz&BC*eGm%81NOG#!R7z!!DN35v$A=n4NI-#8b) z(i>JHCt%XUbhNGhvchy7MdLA#_seAcwTz^+(Ko2FP6Y;-iUuW}Oo+G9J5Xes&gO-s zPB0y1@z`c}Ix(*NTLEm&ha+&@HOk;D@bn9_wGNNRF|}!~g4BQ#Yt|H6G2b(A!jhLA zMB}wUY9KvcjpMV9`XE@P9*@UjB2|Lyyh+fXO{Cso(9TcgMDaduntz0}snE9ZJDW7; zLZYCZ-w*ETN$iXab*4=%pLnMXXHA_h0=K^-PU)Hh*PHD%fD^%OO5aV0000Ge~4#Hk-}v;t;d&s7#p5 zsEnA%kWjf%iP(3@KVlJ}^qxvgC9g?hHs-j?iZ7{zH7YG5W7#FeeJW`KioZ(QHW6M! zGhQZP8%qPsXB|-fS+-RaaWsGLQaMmrDc|6_WHy_T$z)P|jz*(Gc(`7#g(OKrq9`il ze!uHHA9jufmAi>qcXd4ba=FZdAjsbZ#=uyVNF66RHnHAgRmIaZ&Fe;%W%+iyRV5;; zlLS{~z5BjzL~$MwAh{_LO3fZKay%aMrV)mriZ#4Vf>e3W^YS>3^R@tM7>~y)KEbV` z{9ZON{umF?HWZgcsH^#FjKKB06e_%a6Dba*-> zlZ|Vyqy39bpu9j349JJ$ zkAP1n;H&NdQQJG6PR1S>;d$K-y4F)*NjBzfsgj$3E~4?U1QO9q_5~7Mt{{LLT%$DI z7vO*%qZB=a`OXnNFv&q(}j7 z6?i_M=e9$V9{*7v`1qvgx5!3zyPdUbAL%nmlhvg)~@%xaz~U4FQ#cs zV@X3vI$R{39zOqw7GV_ACZ;f^s2~dEnxiH&?#C1q$h3+Ad9Ow>9#+6Or4_Xb0``5Z zfpJPBDmRT~0~pWJ+J%vhU7oDHnk>nIGvsAycT*JN#` zAg)CUfyMl6HYPy61d8 z7at!V)W6X;Sfx2XDW&apo7dx#xdc@6F`qER?jK2*ZMls?O|zz#JZRMqI7yGK0H}D+d<8W8!3zs8Ct>{{9xPudmM6uU0FuSS(n-MJrB$aZgTeY%Vea!pmNd z{@&Nu*N?x!Hs9XflxsZt2&y-T>mdZwUh)6W&rebSLRIrawOz9=*eL~cji~!jCP3YX zs{Qe|9A+9SO~A$Lnn0;MG=r>%tjFhSMAhil zb>le8B-Pmj%HieFie8mWL*>CVqJgWE-R*X{{YVzMsz94Oz^0E!0kw%s$_`#sd_n`x zR4xEjDZ*N_l+i?$rCORz)iJ*Jn3*=yu7@yM(?Urni(c9T{%;C&d}-t zn8zMDTB_mY+?6IkhO(vtg%X(JIzOENdMXV_?aowk!u}pBH}5;dt4m0;#q}{dfNdBizv#r|a?zqcQDp)Hc0s<8bt8 z#^Z*=Q^xbf%CkXOxXDq0acC-FWtrk1KO$o^g=aq`m11oYLKDn^c~JN-3#Onx=7>+WJ%6hp=Z;lY~B&yH`m>qMPTFi<~t68Ky2EoR+RM0Og2xrisrm9g}uxw?@QX4M2WP|6XuH2hC1FKJj#1Fr&()CoC!^MHk=3Fmpm zOU~1ZDY|lga89ew;NR?p2tuDYXPgU9oK<7aVitVEIq@ho1;!>O!55tK4g{Au?;D6o zM=NgPq>rru#HU`FA>{;3^;ha#tW2)gCKyKA(%ODM=C=ZD42QNm?Rd{R>adP;K{o4}=R`%db89ZCz zVHj~TQ1%1&_|ysun_%1u3kpG#!NUYjr&B4Mt-}ORefkcVgW+@_11N2911E$c2=3sm zX?+PFM=G|MA&PWceW;a*D0O#b013d`XobNZD7E0Cd%(tM`2;}Z)oRtqXd1Rcrt0-cynfjSf?#!`Qw8pI(f85IDa z)&Lm1s$ST|JB$hd`1egU3D3#lb{$ev-eFV#)WMC5Es<9nV*p6i)=(8>q69!ro2j${ z*QjU^&&toK>_gN5h`|fALQZR`@&j_N(K`V0G1vtFR5DeJ1XX!IT(7r;3;=Zu4yzs< zWu>-n=jG$$gK@23eD5=E1Ip{4pPzr7E?naaQ{IDnbq)_9%WYUSB>k*2r)kgtWxwBB zfsA;hzL#&0f2nK!8P|@-qcLWI$4UW^+B^i;7y(jK;%dvdnwFnY^M8MTXK!zB<+xZq z8xs2pTtanXF|TA5$YpO*DR1$7uFKr=S&siriBK`yOQpbM8$kFRo4OLDyn$+P&5Y=2qxTi^hR9hUyD!d9cEsnM>kH5^0lk|r%O zL7Jo@=oE8qrZ%?8b?qdz=oL(w25}ctuoJ4|%hp-45I%3(C~4gxZt5QjL6$v9-Si9B zTcQhXz^YqjlD&6~TeZu>5{K{?U~g>m5Wa;MLAbcKytO$k>MXHi9WoQ+d=m{C0DI;ngov!kX)D_C?^(!-9Utg|sLvC%)0=+ULyUa1YG_ehv9Sa8GH-A5kcsq;lyyJ#7Qyce8_@t4abT?+mx{#lHg0jX$OLT<+N`_ zOgpkT#c>}?1Dd}NK=>-}T?82kuMZ9XH2lK8Aq<1nY85ONi~RR&Hp{t=uGeeMm&+wM zpU*izpHIpBkU2JnpFXS}N+SDqyUn5~%Gwgfz*t6+k{~(vvECD|;Axs>+H}9)v;BV0 zRm5FW2_a{_FPBR%g4ZbmO72Ptq}#(Hr_(9xn&LR-ctdL?ScRWXr&*FDSziQin9t{& zm=L-Mf3yvZ2V(+#6LU$#QsLL%LHH^$l(1I`dP5XmpafPtIN1W8tMJGW$Kx?uuh+Hf z7XQO{NOi7pg%K0TrLeSV&}CwX)<}_3Xo~>rl3kz#B0E?MsK(+3mXS_mx7)SG_)r9t zC{;R9MarxXxAKslL@YG`5f5s;AZofnVgVn*S7El&Qb_8se(Q&V5XgL%y%JBrwcL!b zYr0T^?-8`RsQtMfNqE7LguIB}5<JYA=$cA&&L2 zJgA9tV+eOCpr2qFXKIDL63|1feF=hOnWF@>9<0KuD}@!0&B)PVvtFey454*7L2FLaL-*KIZ%QAtW&kESVy(2#AQ zygTch{v@CWULdU{hyccpQ;@|nM*SC>$j?Q12BsHb0&fbSl;A2nH@FT$0ZmG1D?CR5 z++f{w|5&ScKABANpk$Qru_J`PEdgjSq~ZZpPXLC{>K0QTfD|`~CE$Z7e4!Bo8kYbz zDf=d^IoQS-7iVw=sQ?bp;Q%&^EZ1>yAjuhJm56XO8Z|O!l6Ca@`fB~Y47e0wyWOUM zv+$;W@#JjgIsvQoZ?{`(>l4PjSj%Ba&tEH8mBfMA+)P82!=XkAOI2=?egJ3tn_I3E znPh5hiJ^|>lBMMQqy$@$CD{9CdlaW7rqUGUbaAS6JQM~YO2#G%r>7_}jHD^5(iZ1< zfyPb|cPUBQ;?|8339NP52jsG(xFW2dinhii{Xt(lL(CQ6sv0@Us4}V6`P#3{l;;T!k{f^>kl(?``Aw}XV1&ox@qriK-`}Nk`(^lt zuUBTiLgpd8G<7d}8l6%|VTF!3lDNDtZ|LLw!MJ$#U}z}`k}WMhD8cJao$dntm#23= zTz%9*oLB{aU!R{8pRGk>@cH%mv(KphM}PqUf>O<$Hz#$b00000NkvXXu0mjf@Xyj(0=>S?n-`O)l$Z} z$GIhawj5)QC2ytA6Z?;-&3VQ-=X_1XhjPyLJqteIyh$juiSzQe?uK4V4P9&I!>xhH zYSOrmMbz#ZBhKeL5MJg`ubXl;5r~+5p{v!G<#?yg{f0%v)TAqLo^6h;oI$Y;iI=ASOeDJ z5fhpr!Y^FHV*#-NZZsNQ7mG#IJRUBw3CZp%6&@s;aI7VHfH0x>{kaO^5hUTeV!S*r z{vJynAb7=tm1%-3%Yuc+IH7UOqXLjBkUC;Q?h?LhLominp2f#A>2&+O&p zg$;+pUm)l}5x^Xe$0!g`ckp;%`gcpV0vQ0Kg!B2Fya)gw3+2){00GDV?dj?1$M_J! zno)=uXsiN|l~vU5HV;RVYWgajPA8`es364x09UYBZAa_~0)W2JVW!id1-Q)k^Yha= z27sV+_V8=HnmGU#D;UZEXzP1k;23LnDgZuyEn5nNhtT*NdIHPkGRO-0eWPys0)S>| z62G4?4<^&c#|H^8#01$5OhMB{78zQl>zmWw7(%iW)8gVgPr)hHW628!4U_g^{;30B z${0f37EQshVcPp+BY!Lbz};?_Bzdv{@CUJiILMm$iQwZ^a+X%6+YwB;LI_!uSwwiP ze^A?7C}!k_sE?nc9#Crn8}oELxC%AR*)T#w-2UXG!xiyEDbxaNvNTdG4108J(5pKz z3i^{`65nhQJ}+B}@J;RpKXQ0eOt?7!SiBmEVU~4hUjTsLcU7jSKEb}^odl_gNi0)? zplHeY9L}gj4ubbeUteGKxB$#ejh-+oQ+@z{hX1O`OI3s_&*Tc~8eO|bZZc0Qp~p`# zXB?-2L)-_y721!K4^3bJ7gI-vnhpA9fVQ4MNZ#R_q3R4BFBof6IDVrZSJD=gREKD&bYOlT9i+ zTmr))WT8V_bFf^C_NTgjz|NEtAibp=kLfgT6F7B05=q?q`@2p1AEt(g(c$0T-hz@N zAD@;ru0BuAE@AqP^NgvjBeWC2!Q|i6ri3gI1l4I*xES97ir9 z6~Yokydj?If)j;sNK(gDS#J=ai8`!71V~o%jdAaH z1rUj=xIc_|<9pxL+91VMY>%tg4b%X4E|4o?eUM#s7$U6~9+pR(wswWxZzamIWVIyiX{!i}&@lZc6a71;K4r@uxt* zzc+s%xXmJ3ca4`D5ZvThh#+^&<2w~ED;|+g=yb$zI28SUUw%G5K1#NR|DPYphr>Z^ zw_C}V%Y}1)+xp%vIkev41iA5ed|jUCXk(rl!;B zB-bVaaY_jSN%-gI=PZKTfPh7`1wyAO#X%z}Or1-c&4ywPQ6Mz>e6QEL?)UraUlFVU z_dtjVoe%&PO~T^_VhAn+zlJtrh~N^Nkm@e0@Swq9@ZXxTL;zvNsqjv@gx6h0UpLkY zh#-*S!OFEjQ4~?aD}Q}?dC3BRX;qH0*-HZ-g0TTlUn>^?P!JU5k;B_SIh&jJ_xB)k zSArqnwE=)ikqudar+t`JNQBqRV)LfV-^d0Ev=jvu+>Bxc_Zk3G7c%qtoSj3_)Y!f& zI-k$h>pVR@$;Qcc4u@V}Uu7faps5K!;p*@z?a3SB5;{7cz~=v;^?EHo(E-~2=TNuX z71OCxr+t+X6aXV1k|CrEtXf3r920WzH5Gt;ieBDHdEve(ngU{T|MhN}7%k)q+;{VUj&sN-_C<lF(K&JgFSS_n0Puq>aCW7(gcX-a?P{Dx%~L^20Jfn7i5GaT+y`EE1XLRMns@+M1cee4t6mEN0~Aj^{lOQO8aTP!pLD^R#`Zx{2)^ z-Q25G$Z|E9zb7+o0l-C>LJ9!%n+u5vwsQag#&eiaaPP@8(MDuEs#19A>e0F7rzwE> z+w@(tVly)dECT0XVhmsAfQpo@Ce0RF>%G7_Rh_R3i0`JrX6iBp=BC~z?R(6BsRM9y zfq=q>Gl+mjl^@&caf(1N^%MgYkNHEOZ?hYm`-GwrGzhmT%aWX~^uT8xA3B$W<$AO~ zx3$ANS4Ken&2a_Xv@&H=a~bkLe$D?K>4E5^s^gHahg^ zs)AG1pX;%^+7!v%laOkQj10sg^Cqd38zNF~l2SBl0-=qap^5eiZbDeO|41p z794``dl9%%QpJPD9pbhbTy8>qAa0c{L?n?wfF|0o2Dlw@IGc3GIQd-x^zJ$K4?}R` zF7a&d3;=`$b%YHq;Zashw!pbqgE9&a_4&I1AZEUb(MA|zpg;km^mSEwC}GvU0P}Gh zkx;}#ruPs`r0=`gQmhMp~i1Y@Lywm z@$ZY3Dc>XB*J~E3Z}zT*IDwGguRpuOu`A7JSQfge0MsyBP7u$S(X%~#fpW? zr60?XOE(r3_FOJpcJX(}i8TmNdch^&5?YcVK4-7aihEpqi%P4=@am-afXkr-#nW=A znh3Wfi)V>n#nJ%t=Nc%Vl(~r_EzRQ{E=w*?VlI z?RL9JuGg#1{bA=AbGa5_bw?+%d!83=Hk&Xna1NY{6R8szbF ze-o3~LWl{OOJQJgQ$?h*t>0%UnMJb)MvKE0rwAYdw^Y`I*rrUCa1ZJ=S5Xq(}1Ngol0%mzwHP&0>;t>^Zd-33J{?1f~RB<6xR2AJxgnMU0g1gsLodf z!7r_0#jyazE8zv>@tD273S%COKD#A8!eBuyawtKNkh5#aWHKT56BOrhm1!?E-OVBZ z5xt09feJ-l;I-p`AasAY&`*G3xpW`mCpJcF%(#!v$u&9udc8JEmT;}Nw>RNWAfQt= z0XVnG?t&(%2?2`Cv@2Z#wxWL>pwOk;Hu%#|B7n8oFUOsLI{|kB?gWsElO{u@3kcZ% zVgioH1TV6z%Oo4b#nM?`)nqD4>xh7zs2<3w$7MjO`ttHpD-VD%W!y-YfTVb6B(eyQ z{)+Z8wYsY-;K_<9lO2}8HTHtOsQg4riNdgg<>)46vsonsC_35*Os88>5j%MKeI2pEw1}` zTmHh)M_*uSs9T58Z{(EoD|a@rp_FbD`PU$(yX9w zx|?iR#*}E@Nsc@~P$npUV1|Q|w|I~_B#rTwvcb3IQbuLTB)}47cmu3X45-#8#!2Jy zh{Q$A4@(Q)~ryrGKs2mSck zwZT9qNanP7eY>!+J5HGWm!~I1xO%IEI5A}ZU!U(V$w*GJ@4>#lKEEq6s{a#U0LD4B Ur|O`!wg3PC07*qoM6N<$g11j77XSbN literal 0 HcmV?d00001 diff --git a/lib/tpl/bootstrap3/images/license/zero.png b/lib/tpl/bootstrap3/images/license/zero.png new file mode 100644 index 0000000000000000000000000000000000000000..a63a692be88edab74b9c49072e53013d6d5c49f2 GIT binary patch literal 1230 zcmV;<1Tp)GP)02|Ow02>4*2pa$s1SZJymnL^@aBRtOob*R`y7t<{iR4c|mXw}omIBFB z$>W?yIqT>w`7ZgG{|>&1FGQi_jpU2u)Dg$|nn9NZpXV={Hq3GUtj^HP@orQ3(zYT1 z$EXFt%N*rq=arU{lMV>~kykc?^qAKVByS}z$TtiIVmh5>JRXn5Xf(=LMfdw%oX_Ws zkH=%ikH>@aeux}@BtM$i^#RAp&FAxUzu%{IDURc8EvZP3ZwOlv9xu6CtE&`sn!-gXG$KrbZD_Grh_|;l z-6da8?w-RnNk`Tr&8Ch;o#zTmVT4 zhjzPN?GzVlaM5On4s$E74_NvZ-c|`fjv-Uz?LO?DLkNwG)HS7KnA~t{@CQm1?5b|y z+9Dw~vl(kTG=)gz`72Xghw%Hfs}KrIMGJQ$V78j|f^s>_$wMi5`ew7S@)uZ}Yl_tR z!QK_@xWaQ$!wtil4f&KEI`O_Z6q#bXEoutp9=r_il${YKRTprzy<9HY;miQjC&n|l zr13Gce%`ovA_;$Xu8$mFM<|Px>E-3c=`*O$&1qa||J=j}#DzcA_RGvAO*Dx5Rjn$G z)+!5{I#Lxv*X#9jtvv`b^woJ5LzZE`fC1%&UBdrxIEd5f^mN_p>#Old%rygzEaSe# zO-@K<``CFX%BId>sQ}S$qosshzTIxhzxyWd3V{8pc3+0K#!=S^1#Gw5r*03rM=FQ- z?G%9BhXPbeac%dVQ~;n~-hC8UQP6CQ`YtmrQ|MAvZB>Y90(m-$T^u?nCqZhh!BkMO zDa=-#2!VjB3j}a&7>=)M_sczly3f+ca)$zx|3%}2OQsaI>*P1rf@+rX~v4H=&n7sSEC1l*6fxu!>MF zGu_)%Nz7|eR8`!h2+u8w8cO3EQdyi^82zec@t@WhiNAeo%ut}6|29W$+T&bP_=@du z?SKRp=FSNC9*}^!3X55xA3GxRJ0xXe3I!6l=FrrvpaJ%z*&udQ5G_uLe$4X;W)%y| zLCL}&80Ul$bA1m@8nQgU^TLJm@_`0K1_I>UnHVop)+Q7I!5JxbW8Vx!oH&jXUY%iT z+>14sc?8Smdlrg7bYM00Q2{DGnE@kwmct!FWBHRAU1_YU?;`oHk8=7%bnBz3B+p&E z(!i7}c;Zc+Fz13o(a!gSJJGREX(zg(ibJS(PH>fJEFGg_pC4nLL%rug8B_5-hJ&9& sQ8AM9v5YU?Kc7G6zn_|X!T$mb0JyV(D9P?QtO zHd2~CGiPEld_qyZK1JyO1xP(2fO=eOI3CXf3+Mm^bZR$KPCYnFXl!OmJx3-}O)%mB z1aNF}VO?c9Rd6&~fOm9zOH4b2e}XwuWK>jRGAkC{;~2OG#BVF(N%UDwB?q zC>=H|Cqp|sQX?N8D<>UFYLg@=HA**1Bp@O)Nn}1|i~s-tq`9h)&}5>$uH$VQH#5iy{cTnmW6GoPt;CEh^lScjAzfOl<2x!| zO?Y`X+{04tS5P2J2b9R7+gC31$hN%ERnvJ`*X-6ltzfo(a>CffuBV1UI3=f&H;;Za z?6;VwoPO|oaJjOOY{G{ub|Lbkm1Qp&*28LZ!;FPQCf?PqWvF%SIyP=-SrEKB^VnYs zurcf&9~^@o8h0GkTrlr)Y6plJ;PBn*(R0edoNjnu@sNbXUOLQbMDJl)WWR%w(xAan zFUCYANx5$I+sLLuB(+N`jWiec?A>o+McUZD+jT|N>CMi{uCLyd*JL+Pa5k#Cx&W9S zx!t?0r z%#~x?CjR5Iv?GAOXc3Ypqhxu!MynJ=GkmMN0yaFec&)OXIx#sS1W>gL~p(QKBJg1kZ_>+b09 z<-7pCHPX_+?(gEiysgsK&Ghc#^XT01@#^E|;qmkDzQw$GnXvip#rN>moHZKl;nU{n z`19BN^Uv_)*4f_G;N#u@{rCCy>HYZZ z-Qe2x@YDbQ{`~s$^60cjQz&iM4+_V3X3?acJ+$oci+LuDM_0000mbW%=J>2>

    f)5u$ib55*jhdAw)J$%a{j9R#)6mpW{IgVSqvNzLIwc@|=LKXrfAt3}v0tqA}-1nStLZ?n=?lW;2hv)ab=li}B zrv&^T@yGl5df~j6u2{Kz(Wf(U@GoAoX0Kd|3xNDRfcNu*64F{U`_q3amK`{BG4Vuw zweFC2Kmcx9UQp0i>sBDZ-!FxYsnP@G;H_%-(%*q9yB<$z-EwM$q5w zqmy-*pnebZi;jP_x~S+$&`e+K5thG`jX3gd1k30|A1jZ+BaB%TH;SU8fBWuc&@V+r ztAl1^z{(RN?~p(rC7jFKW$>}tDP?7LnuMyOWI+Gg%l+A3-wb+E^z6dNQ((8fJUmy; zyf_MVY-t$;+SS!|JC{bWOOhy6(lkmEqspFfBbsyR<^EUu_wQPNVf6(7Jl*EHS2lDK z4vivxn4tdFNIgwbCAlT5E>9b+mNK~Z{CtY7D&MB7NDD#wFJ2+pziwR+0=Sj+#|!)8 zQ+C51+)7KUmoO@-)3T&e218;`W0aLiv#RXU3Y(6WPbo}tl}B?fzj*Zm1zsJ`TeHt~ ziYK?fv$Io3IsgEdAsMa8uO6*n+#2QPGpMvI8dX}JR>r8(>A2F`vYT>F!Q~f7fOvT+ zI+}BI#S{-Z0`&8jArnY%$t2QhSyC2P)+@=Xs%BKs@~fmY22D3c&6hx*v;D=(mniV< zHBK~Vns>kyTxL81G$>%(>!n;7S6bg&l|_@uxLFmwY57UzRB45jIyP3zaFuheZ+{6v zi0vFsblg-gxQV_lLIj{HMn*@fr4kuT0gFp|dudroItin^!d5QLr;HUQy2=Z#Kl=>{ z2$u^uoa4)Vk#_+Vx7P|d z1=E)LJKn}s&HbJI0Mx_5mnZdBOKH7aSXj!Cz~!re$EQ}%(Ehb&ze0f6e!YMbHx*uH z2jJNt?Cv>X-_QQ(MLEc zkGuQ?0>b6Ey1HW5W{r#QB!FK6dnjy7Iiz#G^MC61^({mDKR!Wnsjg0*m!j&_(7h)C zI0m7xGd5*63Sf1tZ^%T()fbr!=6}4(Lfp2V_ho1zd?}`j7J@VZ$9aeYthYJbN{~7v_OL28K@<{4& zt2%{m)VO;&0lyg^MsDpCP!%={3OMVKzKG&$KSRK{CYQtbYOB?%CXqB6{!$G1XvUlm zV+BHCv%+q11j>EGjy`2i+?F4H_yL6La`{nJE%X84r)Z3<e`p#m3?L(3sR(fUQmC(@bdyeMayy+T}!H36()g66< zK*cf|H4A+m0Q~a%;7Dm$*f-xCJXjieBpXtCa^sbgp`jZ~NfK&PZM=1Id24!ltzlfn z3QsUsdSd`wW|p8o_Um2QMHk-+lE@WkAxCZmzvyn~z$ zx7i7JG8+X3{%&<&M~B588*AyvzH)FYw3^zG3^eg32H@r7<}|?x5STnNQMAP033$*O z1&s~t!r_jNK1f1s$JSUY257a~0Uin%6UaF{qtU2O;ir>{W*09ffO9tr8oA400EqQp zhog|OJFI;J7|0n;TOC03?0@+DLz3 zhzEVcctQy|ofuV85*(ZyZq^U3bOQJ#LV=)DVd;Z@M@~#kvel6Rv^}70`~Lg%WMWQK zZp_ZZxlzeG_?ad%WF8&^;5(&Jz*1299Q_=%T0IUC3_z2ZvpM(J;j4#Ba>+T##H(bU zQKP34^w2lCdpQBm26zTlnYFMfHzwvw(t%}(2??+y8JbtG9?RXFlbqhfYcv=&$;Z+) zMop8-i~tQwoq%^G?4s&c;jQ4*RM$P5&Ycgu9ej*TCU4FmCV#IT7#bXGhdykhC@MEx zqv5HP0O(s5IRP&?1|uO+9kJ=`-hF|stv%g$&fR8H4ZOi2G^l_8n(z`bPcKr5^k%(Y zKi3Zf{N^?`8Z-H7`nmtCz1{le&6`tay6>G&Rq%(p1~H&Z1c1@Jqa;dXR`JXUEqYTW z4g>t%SdB&!X?!4J-`=xtAb0QHy^oGTV79jpLLYz@ky5EN>vxopTi7gd$+2)#+X@E& z@oY92=_%t{iR=1%4&cG_2SC6W8T5g!b_fa>;nBl$a}~{|sGUTU(#;FGY78bKNoiyZ(6rZ0CA(+^)wH_^Q@z}LlSXjV08wL_Vk?sa#!o^ni3^Z4Pz zng=~SJ@?MS7$P%l0`!$;{%0j{Lx^yjF#tbLq#RT=A$M1mdj4MbnNt(Mo4HnT|8G&lemYDb9f?lTW201%$Oe*6H4o;!gV4N8-V#Wq32 zdXvNh13c&&rK*fKG=vC)T}(yl9fYWv0A4?R`tLnrXlPfs7;4_v=?-w@kuQfey~E?Vl`1N;(^zLKvIum&B0nn~nwgTsezKzaf(9=npMqWD_xOQT(Qm-W4KHm*Q&D*CC1o-dX)7wsO znEJ_lUw^bV33xJ1{1lT$BkF>qXp_)Mm6>dnimk|)AYT6gfdMu=KDBKF`rq1L0B^d9 znZYMPOQ8x0QL!^C>5{e~mdMN^q~3wMh!QZsw$|2dd*=uE`~Ma2ayRi(Nc;w-cBqT) zE^dKW2O?G~^`>Ta>b+JV9zR6}XnnBZA3pB`@SOtRa!B;zu7-&AE(joE=$m;BAyWg- z0C9KczSA|W+df|m{Ye0eo7tpSvY2%Dg-bqhYeQdOv02G#$eg=s@dBR(i_V^bTeR== zwr!`;0p15z(JNi%t@>pC0$)G>#dI;8LOZi^;gZD*ki+s1z|Wrr#O)1mh>ii?18^QV zUp#sxe0&zDL~WHWOW?44pbWv|{R4b}2weO5$BTXZ-vh9qKMjDN+dP=t4-bF!fiB)3 iJ`Q5mVi?HThx`vlu)8`+smEvl0000 literal 0 HcmV?d00001 diff --git a/lib/tpl/bootstrap3/images/menu/comment-text-multiple.svg b/lib/tpl/bootstrap3/images/menu/comment-text-multiple.svg new file mode 100644 index 0000000..fa62712 --- /dev/null +++ b/lib/tpl/bootstrap3/images/menu/comment-text-multiple.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/images/menu/email-plus.svg b/lib/tpl/bootstrap3/images/menu/email-plus.svg new file mode 100644 index 0000000..ac06331 --- /dev/null +++ b/lib/tpl/bootstrap3/images/menu/email-plus.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/images/menu/file-document-box-outline.svg b/lib/tpl/bootstrap3/images/menu/file-document-box-outline.svg new file mode 100644 index 0000000..89bc361 --- /dev/null +++ b/lib/tpl/bootstrap3/images/menu/file-document-box-outline.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/images/menu/help.svg b/lib/tpl/bootstrap3/images/menu/help.svg new file mode 100644 index 0000000..9f55bd1 --- /dev/null +++ b/lib/tpl/bootstrap3/images/menu/help.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/images/menu/image-size-select-large.svg b/lib/tpl/bootstrap3/images/menu/image-size-select-large.svg new file mode 100644 index 0000000..b0edcc1 --- /dev/null +++ b/lib/tpl/bootstrap3/images/menu/image-size-select-large.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/images/menu/link.svg b/lib/tpl/bootstrap3/images/menu/link.svg new file mode 100644 index 0000000..5cea569 --- /dev/null +++ b/lib/tpl/bootstrap3/images/menu/link.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/images/menu/printer.svg b/lib/tpl/bootstrap3/images/menu/printer.svg new file mode 100644 index 0000000..6d47ce5 --- /dev/null +++ b/lib/tpl/bootstrap3/images/menu/printer.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/images/menu/puzzle.svg b/lib/tpl/bootstrap3/images/menu/puzzle.svg new file mode 100644 index 0000000..1631370 --- /dev/null +++ b/lib/tpl/bootstrap3/images/menu/puzzle.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/images/menu/rss.svg b/lib/tpl/bootstrap3/images/menu/rss.svg new file mode 100644 index 0000000..0992c19 --- /dev/null +++ b/lib/tpl/bootstrap3/images/menu/rss.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/images/menu/share-variant.svg b/lib/tpl/bootstrap3/images/menu/share-variant.svg new file mode 100644 index 0000000..464015e --- /dev/null +++ b/lib/tpl/bootstrap3/images/menu/share-variant.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/lib/tpl/bootstrap3/images/php.png b/lib/tpl/bootstrap3/images/php.png new file mode 100644 index 0000000000000000000000000000000000000000..4eb79db8b773b58f51b8af757693a159607ab243 GIT binary patch literal 3350 zcmV+x4e9cUP)bU}4=Xm4@=00^0L&nzuYEhtD;aLH5%NiE9Btg6Zc08Oa} zjrY~=1pojHm`OxIRA}DqSzBxzR~i1#Tz2;2%X+oVJP6Mroj>sI*lh zQ9(h7O7O-rFG#!~1cfKwKwKU`Alj6Q7APeZRBDR?38W24b8+G{NgD@W*5385_kNq1 z!~dVTc=qP59lNwrNBXrhXJ*cP=f8dbf0jXe$89LTLkXd9&$x{89?BO{#!!BSBB2~Z z`L_Mck5C>#(NVsR@;=H-C<7>lXD)g#f$|he@`C^=?Vx4=8vg9Hf!7?k3cvLTbkQ@+ z8oTIuyP|D+kW3k9gnnc>oHl;K@8bcg-Fg!Smj_pmxkxKbN*% zzzNhW{vNe~(1+)2jWUn>y^iv%QNq+!*5U-2x?(QMkDtGX_(f(RDv938OpFl%D^NtB;+>)uvBCH{GGGFL2ALyUbq0Gr6&U0wc!^2)I*<^SGX49UvJBS!S90o%9t z6_k#UnnlnNRr&Y?cPOMTDn6f*UKbx+af|dvvH|-9E6L3>e z3AilHC<-%8;2%wulZ%+#T?xjdAuIB%q^NQXQ=;)<<2F!LhJot(AXDRg=77U<%z~9b zK#eP*kS~E3m}|Ii?X$1<`y7FCLD^_-*cc5#XGn#qxjba^6|2UUF>6RtgTpweNb#6V zN`a7;R<>^KSv+x4DdAv9S_d=hx+%a00t##%48iV^2#jv;g*%43ctDe3HeTT4*HZla zyGi-l@&=6nDR@l|aG@QS(02i+&A+}Hyel0nVW03kZi|IuN zq|wDXq!n_HCq8{U+&9|SmU+URK0da)4^Y_U>x=OHU!0-U3m+Gr&IS1--F+2|)YPrw zCK97LbPPC?0*YBp+-mb|rD|{rUWqSxIdTtJOm73n;7l-Sbzq&K!4HAoFTMWM0o-(hlfH*o=Ui98ix^u0bz0ixBApTF-iQYK?j3-!eFLz0a}KG4WmsesXjiDC^ODr_RM-DwgNp z{Mw!x;JHGTATuxB%d*7L$ERK3=r_}{j7BkdQ^nJufoKc_todZPYkL$9-ap89?&xK~ zpeDeU%Vk?D(()xb0l;TemAL`j)uHOP+se+vS+oqR@imU`C>+7hE@>QTUsWYuGIYkA zK(Mt-DUDbz+^xYVM*M*T8&T6;XeEVt0Xv|5KA$K(J?5=Zg(NjOySOkws)#7LraE;KIcjc>B+3Z`WOCuT)G%)KBShAR2_7TYHE}Ye4ImPV&Vnb5-qVTvN&e16?T> zI9<>n-V9M5zVF@v{?)JSCZB5R4(KKb&V-qnESx?QgLCKSAwFLeI>T5&!6J%VN-Pws zHdzZUfgW_Z&mP>u_iT@_ZNuFV3N-ElmMaDnOFC+t+lsO>x#m-H2ge4>E^xXa+Q*v_ zvGnNRaOP41E+aY3&gY?w-=>-!1l==tTLM$|TqAI# zeMcFkvMyG<+jlF^gP(FD(K|__>p#SFnf*g8bzlCQ#Ek zP-RH~rd>6+-*jRO=SJnuGy+%T8CkNzs8li_l`8T6{;)toT6gj{2?hy_?cW4<@7(~? z(^h7A=iEG`7E3}yRCBX7H-ZF}qjEKLKQB4eclV?iUo+sC$BFhuLrre-n`g(_-qASU zkHj-H)Ws;Ph&seHg%AOeMK*5^!cml>RFTl`X zhbUj~-rEn+Xou@QR*7pZ#_#t-AgHvcGI_(s6Iq$H@FB^QW|4fV=+5zGJ|4#wPS58m zDq~9#Pv>|~oKH>XU~=jzyz%#&qTm`E+bBv~P1A(t9XDzfn+&^^GE)A0vM5-T<}4x6 zP#R{=+WDY8TumL!JVoI>*wmZTYs2kzVUA@rR z84wKHs;Z~pe;1qKpFV#{)HA|T_)85%ebq>T=@J`=9oqb7J~doy08WG7eddhM;Wx>pxh>L*e)i{V{--g^Q+g9U8jU*$#?aJcTAD`{Jz>RQ18K^UgJyd zcLP^?h_jzc4efC`?^mBljcmb~7NW-P;DWILJg~c+|b$BjovL(8o zZ3)~<`|GiJOQpa&6A2;M#S1Hm#=~m)8*2fV?g_Xw(;B!cS+sA!`fS`HI4a;QB}vQf z=(}|aZRX30>FlSt0bR2Syoq_3^L5-Tr}}2O%_r_uF5I+Jp>SbSk>%FFF*69-|9|{9 z!95ir{XZh{rC>!&RVK5Amac-;R~+-Do-?@uGW$@#I)Nx*)XG@*NLcTXxLa?6eAIGp zZ>V)1r;N^*+OV>}ts7L*N~MPm59eFD3f+wK2H(d< z!KA{cQo;J$Fl%;Z+l9!zS({sX6ABh$zG4Zqd>;Jy0%)a@7?VWBWrG!si}h{lb%R0G z=!pcbu)5AfsS6zb#_`GfZyO3fkjs@npIj(BI3Le%NvDf}GG+s+B^+7a8cghokVYNT zJLYeuRjPSJ(WP_R^x@G+N1?ATbS)AIzTVZPz1-K|_3!puZu@xYPnU;q5sxDHBgtfO ze>_p>%VkR{?M6|~mpp$saSv&jP6qKT&WSex*03r=>M=VzwMt(!6hmvD>hAWxf|crP zM;;rQTisqki{phC$M3;~Jef)r9*M^byYROYn`PlhUTe5DPrX)gC>T&p)MmOb8oU_p z3H-IALwos4U$|?0Z8kaDI9`42dN`HLKa|Oo$Qp;^@%&IaUGj@P5xYbstzy7qYZoX+ zqrn>p_&AwA674+x=)+s`t1lnc@Obf$mqzmW$`i?C;qiDPzYoD1(P-$co}R#80zu!g gr=Gm?=30I0fBy+JO2EeH3;+NC07*qoM6N<$f_Lv?@c;k- literal 0 HcmV?d00001 diff --git a/lib/tpl/bootstrap3/inc/Menu/DetailMenu.php b/lib/tpl/bootstrap3/inc/Menu/DetailMenu.php new file mode 100644 index 0000000..9c78516 --- /dev/null +++ b/lib/tpl/bootstrap3/inc/Menu/DetailMenu.php @@ -0,0 +1,21 @@ +params['do']); + + $discuss_page = str_replace('@ID@', $this->id, tpl_getConf('discussionPage')); + $discuss_page_raw = str_replace('@ID@', '', tpl_getConf('discussionPage')); + $is_discuss_page = strpos($this->id, $discuss_page_raw) !== false; + $back_id = str_replace($discuss_page_raw, '', $this->id); + + if ($is_discuss_page) { + $this->label = tpl_getLang('back_to_article'); + $this->id = cleanID($back_id); + $this->svg = tpl_incdir() . 'images/menu/file-document-box-outline.svg'; + } else { + $this->label = tpl_getLang('discussion'); + $this->id = cleanID($discuss_page); + $this->svg = tpl_incdir() . 'images/menu/comment-text-multiple.svg'; + } + + } + +} diff --git a/lib/tpl/bootstrap3/inc/Menu/Item/Feed.php b/lib/tpl/bootstrap3/inc/Menu/Item/Feed.php new file mode 100644 index 0000000..ba9cfab --- /dev/null +++ b/lib/tpl/bootstrap3/inc/Menu/Item/Feed.php @@ -0,0 +1,35 @@ +params['do']); + + $this->label = $lang['btn_recent']; + $this->svg = tpl_incdir() . 'images/menu/rss.svg'; + } + + public function getLinkAttributes($classprefix = 'menuitem ') + { + $attr = parent::getLinkAttributes($classprefix); + $attr['href'] = DOKU_URL . 'feed.php?ns=' . getNS($this->id); + + return $attr; + } +} diff --git a/lib/tpl/bootstrap3/inc/Menu/Item/Help.php b/lib/tpl/bootstrap3/inc/Menu/Item/Help.php new file mode 100644 index 0000000..902e1a6 --- /dev/null +++ b/lib/tpl/bootstrap3/inc/Menu/Item/Help.php @@ -0,0 +1,46 @@ +params['do']); + + $help_id = page_findnearest('help', tpl_getConf('useACL')); + + if (!$help_id) { + throw new \RuntimeException("help page not found"); + } + + $this->label = hsc(p_get_first_heading($help_id)); + $this->svg = tpl_incdir() . 'images/menu/help.svg'; + $this->id = '#'; + $this->help_id = $help_id; + $this->help_link = wl($help_id, array('do' => 'export_xhtmlbody')); + } + + public function getLinkAttributes($classprefix = 'menuitem ') + { + $attr = parent::getLinkAttributes($classprefix); + + $attr['data-toggle'] = 'modal'; + $attr['data-help-id'] = $this->help_id; + $attr['data-target'] = '.modal.help'; + $attr['data-link'] = $this->help_link; + + return $attr; + } +} diff --git a/lib/tpl/bootstrap3/inc/Menu/Item/ImgOriginalSize.php b/lib/tpl/bootstrap3/inc/Menu/Item/ImgOriginalSize.php new file mode 100644 index 0000000..3f0550d --- /dev/null +++ b/lib/tpl/bootstrap3/inc/Menu/Item/ImgOriginalSize.php @@ -0,0 +1,46 @@ +params['do']); + + $this->label = $lang['js']['mediadirect']; + $this->svg = tpl_incdir() . 'images/menu/image-size-select-large.svg'; + $this->id = $IMG; + } + + public function getLink() + { + global $IMG; + global $REV; + global $INPUT; + + return ml($IMG, array('cache' => $INPUT->str('cache'), 'rev' => $REV), true, '&'); + } + + public function getLinkAttributes($classprefix = 'menuitem ') + { + $attr = parent::getLinkAttributes($classprefix); + $attr['target'] = '_blank'; + + return $attr; + } +} diff --git a/lib/tpl/bootstrap3/inc/Menu/Item/Permalink.php b/lib/tpl/bootstrap3/inc/Menu/Item/Permalink.php new file mode 100644 index 0000000..eccd0e1 --- /dev/null +++ b/lib/tpl/bootstrap3/inc/Menu/Item/Permalink.php @@ -0,0 +1,42 @@ +params['do']); + + $this->label = tpl_getLang('permalink'); + $this->svg = tpl_incdir() . 'images/menu/link.svg'; + $this->id = '#'; + } + + public function getLink() + { + global $ID; + global $INFO; + + return DOKU_URL . DOKU_SCRIPT . '?id=' . $ID . '&rev=' . $INFO['lastmod']; + } + + public function getLinkAttributes($classprefix = 'menuitem ') + { + $attr = parent::getLinkAttributes($classprefix); + $attr['target'] = '_blank'; + + return $attr; + } +} diff --git a/lib/tpl/bootstrap3/inc/Menu/Item/PrintPage.php b/lib/tpl/bootstrap3/inc/Menu/Item/PrintPage.php new file mode 100644 index 0000000..67e020a --- /dev/null +++ b/lib/tpl/bootstrap3/inc/Menu/Item/PrintPage.php @@ -0,0 +1,26 @@ +params['do']); + + $this->label = tpl_getLang('print'); + $this->svg = tpl_incdir() . 'images/menu/printer.svg'; + $this->id = '#'; + } +} diff --git a/lib/tpl/bootstrap3/inc/Menu/Item/SendMail.php b/lib/tpl/bootstrap3/inc/Menu/Item/SendMail.php new file mode 100644 index 0000000..3d8b44d --- /dev/null +++ b/lib/tpl/bootstrap3/inc/Menu/Item/SendMail.php @@ -0,0 +1,26 @@ +params['do']); + + $this->label = tpl_getLang('send_mail'); + $this->svg = tpl_incdir() . 'images/menu/email-plus.svg'; + $this->id = '#'; + } +} diff --git a/lib/tpl/bootstrap3/inc/Menu/Item/ShareOn.php b/lib/tpl/bootstrap3/inc/Menu/Item/ShareOn.php new file mode 100644 index 0000000..a988a4f --- /dev/null +++ b/lib/tpl/bootstrap3/inc/Menu/Item/ShareOn.php @@ -0,0 +1,77 @@ +params['do']); + + $this->label = tpl_getLang('share_on'); + $this->svg = tpl_incdir() . 'images/menu/share-variant.svg'; + $this->id = '#'; + } + + public function getLinkAttributes($classprefix = 'menuitem dropdown-toggle ') + { + global $ID; + + $attr = parent::getLinkAttributes($classprefix); + + $attr['data-toggle'] = 'dropdown'; + $attr['data-remote'] = wl($ID); + $attr['data-target'] = '#'; + $attr['aria-haspopup'] = 'true'; + $attr['aria-expanded'] = 'true'; + + return $attr; + } + + public function getDropDownMenu() + { + $enabled_providers = explode(',', tpl_getConf('socialShareProviders')); + + $share_providers = array( + 'twitter' => array('label' => 'Twitter'), + 'linkedin' => array('label' => 'LinkedIn'), + 'facebook' => array('label' => 'Facebook'), + 'pinterest' => array('label' => 'Pinterest'), + 'telegram' => array('label' => 'Telegram'), + 'whatsapp' => array('label' => 'WhatsApp'), + 'yammer' => array('label' => 'Yammer'), + 'reddit' => array('label' => 'Reddit'), + 'microsoft-teams' => array('label' => 'Teams'), + ); + + $html = ''; + + $html .= '

    '; + + return $html; + } +} diff --git a/lib/tpl/bootstrap3/inc/Menu/PageIconsMenu.php b/lib/tpl/bootstrap3/inc/Menu/PageIconsMenu.php new file mode 100644 index 0000000..da80773 --- /dev/null +++ b/lib/tpl/bootstrap3/inc/Menu/PageIconsMenu.php @@ -0,0 +1,22 @@ + $maxLen) { + $dom->clear(); + return false; + } + + return $dom->load($contents, $lowercase, $stripRN); +} + +function str_get_html( + $str, + $lowercase = true, + $forceTagsClosed = true, + $target_charset = DEFAULT_TARGET_CHARSET, + $stripRN = true, + $defaultBRText = DEFAULT_BR_TEXT, + $defaultSpanText = DEFAULT_SPAN_TEXT) +{ + $dom = new simple_html_dom( + null, + $lowercase, + $forceTagsClosed, + $target_charset, + $stripRN, + $defaultBRText, + $defaultSpanText + ); + + if (empty($str) || strlen($str) > MAX_FILE_SIZE) { + $dom->clear(); + return false; + } + + return $dom->load($str, $lowercase, $stripRN); +} + +function dump_html_tree($node, $show_attr = true, $deep = 0) +{ + $node->dump($node); +} + +class simple_html_dom_node +{ + public $nodetype = HDOM_TYPE_TEXT; + public $tag = 'text'; + public $attr = array(); + public $children = array(); + public $nodes = array(); + public $parent = null; + public $_ = array(); + public $tag_start = 0; + private $dom = null; + + function __construct($dom) + { + $this->dom = $dom; + $dom->nodes[] = $this; + } + + function __destruct() + { + $this->clear(); + } + + function __toString() + { + return $this->outertext(); + } + + function clear() + { + $this->dom = null; + $this->nodes = null; + $this->parent = null; + $this->children = null; + } + + function dump($show_attr = true, $depth = 0) + { + echo str_repeat("\t", $depth) . $this->tag; + + if ($show_attr && count($this->attr) > 0) { + echo '('; + foreach ($this->attr as $k => $v) { + echo "[$k]=>\"$v\", "; + } + echo ')'; + } + + echo "\n"; + + if ($this->nodes) { + foreach ($this->nodes as $node) { + $node->dump($show_attr, $depth + 1); + } + } + } + + function dump_node($echo = true) + { + $string = $this->tag; + + if (count($this->attr) > 0) { + $string .= '('; + foreach ($this->attr as $k => $v) { + $string .= "[$k]=>\"$v\", "; + } + $string .= ')'; + } + + if (count($this->_) > 0) { + $string .= ' $_ ('; + foreach ($this->_ as $k => $v) { + if (is_array($v)) { + $string .= "[$k]=>("; + foreach ($v as $k2 => $v2) { + $string .= "[$k2]=>\"$v2\", "; + } + $string .= ')'; + } else { + $string .= "[$k]=>\"$v\", "; + } + } + $string .= ')'; + } + + if (isset($this->text)) { + $string .= " text: ({$this->text})"; + } + + $string .= ' HDOM_INNER_INFO: '; + + if (isset($node->_[HDOM_INFO_INNER])) { + $string .= "'" . $node->_[HDOM_INFO_INNER] . "'"; + } else { + $string .= ' NULL '; + } + + $string .= ' children: ' . count($this->children); + $string .= ' nodes: ' . count($this->nodes); + $string .= ' tag_start: ' . $this->tag_start; + $string .= "\n"; + + if ($echo) { + echo $string; + return; + } else { + return $string; + } + } + + function parent($parent = null) + { + // I am SURE that this doesn't work properly. + // It fails to unset the current node from it's current parents nodes or + // children list first. + if ($parent !== null) { + $this->parent = $parent; + $this->parent->nodes[] = $this; + $this->parent->children[] = $this; + } + + return $this->parent; + } + + function has_child() + { + return !empty($this->children); + } + + function children($idx = -1) + { + if ($idx === -1) { + return $this->children; + } + + if (isset($this->children[$idx])) { + return $this->children[$idx]; + } + + return null; + } + + function first_child() + { + if (count($this->children) > 0) { + return $this->children[0]; + } + return null; + } + + function last_child() + { + if (count($this->children) > 0) { + return end($this->children); + } + return null; + } + + function next_sibling() + { + if ($this->parent === null) { + return null; + } + + $idx = array_search($this, $this->parent->children, true); + + if ($idx !== false && isset($this->parent->children[$idx + 1])) { + return $this->parent->children[$idx + 1]; + } + + return null; + } + + function prev_sibling() + { + if ($this->parent === null) { + return null; + } + + $idx = array_search($this, $this->parent->children, true); + + if ($idx !== false && $idx > 0) { + return $this->parent->children[$idx - 1]; + } + + return null; + } + + function find_ancestor_tag($tag) + { + global $debug_object; + if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } + + if ($this->parent === null) { + return null; + } + + $ancestor = $this->parent; + + while (!is_null($ancestor)) { + if (is_object($debug_object)) { + $debug_object->debug_log(2, 'Current tag is: ' . $ancestor->tag); + } + + if ($ancestor->tag === $tag) { + break; + } + + $ancestor = $ancestor->parent; + } + + return $ancestor; + } + + function innertext() + { + if (isset($this->_[HDOM_INFO_INNER])) { + return $this->_[HDOM_INFO_INNER]; + } + + if (isset($this->_[HDOM_INFO_TEXT])) { + return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); + } + + $ret = ''; + + foreach ($this->nodes as $n) { + $ret .= $n->outertext(); + } + + return $ret; + } + + function outertext() + { + global $debug_object; + + if (is_object($debug_object)) { + $text = ''; + + if ($this->tag === 'text') { + if (!empty($this->text)) { + $text = ' with text: ' . $this->text; + } + } + + $debug_object->debug_log(1, 'Innertext of tag: ' . $this->tag . $text); + } + + if ($this->tag === 'root') { + return $this->innertext(); + } + + // todo: What is the use of this callback? Remove? + if ($this->dom && $this->dom->callback !== null) { + call_user_func_array($this->dom->callback, array($this)); + } + + if (isset($this->_[HDOM_INFO_OUTER])) { + return $this->_[HDOM_INFO_OUTER]; + } + + if (isset($this->_[HDOM_INFO_TEXT])) { + return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); + } + + $ret = ''; + + if ($this->dom && $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]) { + $ret = $this->dom->nodes[$this->_[HDOM_INFO_BEGIN]]->makeup(); + } + + if (isset($this->_[HDOM_INFO_INNER])) { + // todo:
    should either never have HDOM_INFO_INNER or always + if ($this->tag !== 'br') { + $ret .= $this->_[HDOM_INFO_INNER]; + } + } elseif ($this->nodes) { + foreach ($this->nodes as $n) { + $ret .= $this->convert_text($n->outertext()); + } + } + + if (isset($this->_[HDOM_INFO_END]) && $this->_[HDOM_INFO_END] != 0) { + $ret .= 'tag . '>'; + } + + return $ret; + } + + function text() + { + if (isset($this->_[HDOM_INFO_INNER])) { + return $this->_[HDOM_INFO_INNER]; + } + + switch ($this->nodetype) { + case HDOM_TYPE_TEXT: return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); + case HDOM_TYPE_COMMENT: return ''; + case HDOM_TYPE_UNKNOWN: return ''; + } + + if (strcasecmp($this->tag, 'script') === 0) { return ''; } + if (strcasecmp($this->tag, 'style') === 0) { return ''; } + + $ret = ''; + + // In rare cases, (always node type 1 or HDOM_TYPE_ELEMENT - observed + // for some span tags, and some p tags) $this->nodes is set to NULL. + // NOTE: This indicates that there is a problem where it's set to NULL + // without a clear happening. + // WHY is this happening? + if (!is_null($this->nodes)) { + foreach ($this->nodes as $n) { + // Start paragraph after a blank line + if ($n->tag === 'p') { + $ret = trim($ret) . "\n\n"; + } + + $ret .= $this->convert_text($n->text()); + + // If this node is a span... add a space at the end of it so + // multiple spans don't run into each other. This is plaintext + // after all. + if ($n->tag === 'span') { + $ret .= $this->dom->default_span_text; + } + } + } + return $ret; + } + + function xmltext() + { + $ret = $this->innertext(); + $ret = str_ireplace('', '', $ret); + return $ret; + } + + function makeup() + { + // text, comment, unknown + if (isset($this->_[HDOM_INFO_TEXT])) { + return $this->dom->restore_noise($this->_[HDOM_INFO_TEXT]); + } + + $ret = '<' . $this->tag; + $i = -1; + + foreach ($this->attr as $key => $val) { + ++$i; + + // skip removed attribute + if ($val === null || $val === false) { continue; } + + $ret .= @$this->_[HDOM_INFO_SPACE][$i][0]; + + //no value attr: nowrap, checked selected... + if ($val === true) { + $ret .= $key; + } else { + switch (@$this->_[HDOM_INFO_QUOTE][$i]) + { + case HDOM_QUOTE_DOUBLE: $quote = '"'; break; + case HDOM_QUOTE_SINGLE: $quote = '\''; break; + default: $quote = ''; + } + + $ret .= $key + . @$this->_[HDOM_INFO_SPACE][$i][1] + . '=' + . @$this->_[HDOM_INFO_SPACE][$i][2] + . $quote + . $val + . $quote; + } + } + + $ret = $this->dom->restore_noise($ret); + return $ret . $this->_[HDOM_INFO_ENDSPACE] . '>'; + } + + function find($selector, $idx = null, $lowercase = false) + { + $selectors = $this->parse_selector($selector); + if (($count = count($selectors)) === 0) { return array(); } + $found_keys = array(); + + // find each selector + for ($c = 0; $c < $count; ++$c) { + // The change on the below line was documented on the sourceforge + // code tracker id 2788009 + // used to be: if (($levle=count($selectors[0]))===0) return array(); + if (($levle = count($selectors[$c])) === 0) { return array(); } + if (!isset($this->_[HDOM_INFO_BEGIN])) { return array(); } + + $head = array($this->_[HDOM_INFO_BEGIN] => 1); + $cmd = ' '; // Combinator + + // handle descendant selectors, no recursive! + for ($l = 0; $l < $levle; ++$l) { + $ret = array(); + + foreach ($head as $k => $v) { + $n = ($k === -1) ? $this->dom->root : $this->dom->nodes[$k]; + //PaperG - Pass this optional parameter on to the seek function. + $n->seek($selectors[$c][$l], $ret, $cmd, $lowercase); + } + + $head = $ret; + $cmd = $selectors[$c][$l][4]; // Next Combinator + } + + foreach ($head as $k => $v) { + if (!isset($found_keys[$k])) { + $found_keys[$k] = 1; + } + } + } + + // sort keys + ksort($found_keys); + + $found = array(); + foreach ($found_keys as $k => $v) { + $found[] = $this->dom->nodes[$k]; + } + + // return nth-element or array + if (is_null($idx)) { return $found; } + elseif ($idx < 0) { $idx = count($found) + $idx; } + return (isset($found[$idx])) ? $found[$idx] : null; + } + + protected function seek($selector, &$ret, $parent_cmd, $lowercase = false) + { + global $debug_object; + if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } + + list($tag, $id, $class, $attributes, $cmb) = $selector; + $nodes = array(); + + if ($parent_cmd === ' ') { // Descendant Combinator + // Find parent closing tag if the current element doesn't have a closing + // tag (i.e. void element) + $end = (!empty($this->_[HDOM_INFO_END])) ? $this->_[HDOM_INFO_END] : 0; + if ($end == 0) { + $parent = $this->parent; + while (!isset($parent->_[HDOM_INFO_END]) && $parent !== null) { + $end -= 1; + $parent = $parent->parent; + } + $end += $parent->_[HDOM_INFO_END]; + } + + // Get list of target nodes + $nodes_start = $this->_[HDOM_INFO_BEGIN] + 1; + $nodes_count = $end - $nodes_start; + $nodes = array_slice($this->dom->nodes, $nodes_start, $nodes_count, true); + } elseif ($parent_cmd === '>') { // Child Combinator + $nodes = $this->children; + } elseif ($parent_cmd === '+' + && $this->parent + && in_array($this, $this->parent->children)) { // Next-Sibling Combinator + $index = array_search($this, $this->parent->children, true) + 1; + if ($index < count($this->parent->children)) + $nodes[] = $this->parent->children[$index]; + } elseif ($parent_cmd === '~' + && $this->parent + && in_array($this, $this->parent->children)) { // Subsequent Sibling Combinator + $index = array_search($this, $this->parent->children, true); + $nodes = array_slice($this->parent->children, $index); + } + + // Go throgh each element starting at this element until the end tag + // Note: If this element is a void tag, any previous void element is + // skipped. + foreach($nodes as $node) { + $pass = true; + + // Skip root nodes + if(!$node->parent) { + $pass = false; + } + + // Skip if node isn't a child node (i.e. text nodes) + if($pass && !in_array($node, $node->parent->children, true)) { + $pass = false; + } + + // Skip if tag doesn't match + if ($pass && $tag !== '' && $tag !== $node->tag && $tag !== '*') { + $pass = false; + } + + // Skip if ID doesn't exist + if ($pass && $id !== '' && !isset($node->attr['id'])) { + $pass = false; + } + + // Check if ID matches + if ($pass && $id !== '' && isset($node->attr['id'])) { + // Note: Only consider the first ID (as browsers do) + $node_id = explode(' ', trim($node->attr['id']))[0]; + + if($id !== $node_id) { $pass = false; } + } + + // Check if all class(es) exist + if ($pass && $class !== '' && is_array($class) && !empty($class)) { + if (isset($node->attr['class'])) { + $node_classes = explode(' ', $node->attr['class']); + + if ($lowercase) { + $node_classes = array_map('strtolower', $node_classes); + } + + foreach($class as $c) { + if(!in_array($c, $node_classes)) { + $pass = false; + break; + } + } + } else { + $pass = false; + } + } + + // Check attributes + if ($pass + && $attributes !== '' + && is_array($attributes) + && !empty($attributes)) { + foreach($attributes as $a) { + list ( + $att_name, + $att_expr, + $att_val, + $att_inv, + $att_case_sensitivity + ) = $a; + + // Handle indexing attributes (i.e. "[2]") + /** + * Note: This is not supported by the CSS Standard but adds + * the ability to select items compatible to XPath (i.e. + * the 3rd element within it's parent). + * + * Note: This doesn't conflict with the CSS Standard which + * doesn't work on numeric attributes anyway. + */ + if (is_numeric($att_name) + && $att_expr === '' + && $att_val === '') { + $count = 0; + + // Find index of current element in parent + foreach ($node->parent->children as $c) { + if ($c->tag === $node->tag) ++$count; + if ($c === $node) break; + } + + // If this is the correct node, continue with next + // attribute + if ($count === (int)$att_name) continue; + } + + // Check attribute availability + if ($att_inv) { // Attribute should NOT be set + if (isset($node->attr[$att_name])) { + $pass = false; + break; + } + } else { // Attribute should be set + // todo: "plaintext" is not a valid CSS selector! + if ($att_name !== 'plaintext' + && !isset($node->attr[$att_name])) { + $pass = false; + break; + } + } + + // Continue with next attribute if expression isn't defined + if ($att_expr === '') continue; + + // If they have told us that this is a "plaintext" + // search then we want the plaintext of the node - right? + // todo "plaintext" is not a valid CSS selector! + if ($att_name === 'plaintext') { + $nodeKeyValue = $node->text(); + } else { + $nodeKeyValue = $node->attr[$att_name]; + } + + if (is_object($debug_object)) { + $debug_object->debug_log(2, + 'testing node: ' + . $node->tag + . ' for attribute: ' + . $att_name + . $att_expr + . $att_val + . ' where nodes value is: ' + . $nodeKeyValue + ); + } + + // If lowercase is set, do a case insensitive test of + // the value of the selector. + if ($lowercase) { + $check = $this->match( + $att_expr, + strtolower($att_val), + strtolower($nodeKeyValue), + $att_case_sensitivity + ); + } else { + $check = $this->match( + $att_expr, + $att_val, + $nodeKeyValue, + $att_case_sensitivity + ); + } + + if (is_object($debug_object)) { + $debug_object->debug_log(2, + 'after match: ' + . ($check ? 'true' : 'false') + ); + } + + if (!$check) { + $pass = false; + break; + } + } + } + + // Found a match. Add to list and clear node + if ($pass) $ret[$node->_[HDOM_INFO_BEGIN]] = 1; + unset($node); + } + // It's passed by reference so this is actually what this function returns. + if (is_object($debug_object)) { + $debug_object->debug_log(1, 'EXIT - ret: ', $ret); + } + } + + protected function match($exp, $pattern, $value, $case_sensitivity) + { + global $debug_object; + if (is_object($debug_object)) {$debug_object->debug_log_entry(1);} + + if ($case_sensitivity === 'i') { + $pattern = strtolower($pattern); + $value = strtolower($value); + } + + switch ($exp) { + case '=': + return ($value === $pattern); + case '!=': + return ($value !== $pattern); + case '^=': + return preg_match('/^' . preg_quote($pattern, '/') . '/', $value); + case '$=': + return preg_match('/' . preg_quote($pattern, '/') . '$/', $value); + case '*=': + return preg_match('/' . preg_quote($pattern, '/') . '/', $value); + case '|=': + /** + * [att|=val] + * + * Represents an element with the att attribute, its value + * either being exactly "val" or beginning with "val" + * immediately followed by "-" (U+002D). + */ + return strpos($value, $pattern) === 0; + case '~=': + /** + * [att~=val] + * + * Represents an element with the att attribute whose value is a + * whitespace-separated list of words, one of which is exactly + * "val". If "val" contains whitespace, it will never represent + * anything (since the words are separated by spaces). Also if + * "val" is the empty string, it will never represent anything. + */ + return in_array($pattern, explode(' ', trim($value)), true); + } + return false; + } + + protected function parse_selector($selector_string) + { + global $debug_object; + if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } + + /** + * Pattern of CSS selectors, modified from mootools (https://mootools.net/) + * + * Paperg: Add the colon to the attribute, so that it properly finds + * like google does. + * + * Note: if you try to look at this attribute, you MUST use getAttribute + * since $dom->x:y will fail the php syntax check. + * + * Notice the \[ starting the attribute? and the @? following? This + * implies that an attribute can begin with an @ sign that is not + * captured. This implies that an html attribute specifier may start + * with an @ sign that is NOT captured by the expression. Farther study + * is required to determine of this should be documented or removed. + * + * Matches selectors in this order: + * + * [0] - full match + * + * [1] - tag name + * ([\w:\*-]*) + * Matches the tag name consisting of zero or more words, colons, + * asterisks and hyphens. + * + * [2] - id name + * (?:\#([\w-]+)) + * Optionally matches a id name, consisting of an "#" followed by + * the id name (one or more words and hyphens). + * + * [3] - class names (including dots) + * (?:\.([\w\.-]+))? + * Optionally matches a list of classs, consisting of an "." + * followed by the class name (one or more words and hyphens) + * where multiple classes can be chained (i.e. ".foo.bar.baz") + * + * [4] - attributes + * ((?:\[@?(?:!?[\w:-]+)(?:(?:[!*^$|~]?=)[\"']?(?:.*?)[\"']?)?(?:\s*?(?:[iIsS])?)?\])+)? + * Optionally matches the attributes list + * + * [5] - separator + * ([\/, >+~]+) + * Matches the selector list separator + */ + // phpcs:ignore Generic.Files.LineLength + $pattern = "/([\w:\*-]*)(?:\#([\w-]+))?(?:|\.([\w\.-]+))?((?:\[@?(?:!?[\w:-]+)(?:(?:[!*^$|~]?=)[\"']?(?:.*?)[\"']?)?(?:\s*?(?:[iIsS])?)?\])+)?([\/, >+~]+)/is"; + + preg_match_all( + $pattern, + trim($selector_string) . ' ', // Add final ' ' as pseudo separator + $matches, + PREG_SET_ORDER + ); + + if (is_object($debug_object)) { + $debug_object->debug_log(2, 'Matches Array: ', $matches); + } + + $selectors = array(); + $result = array(); + + foreach ($matches as $m) { + $m[0] = trim($m[0]); + + // Skip NoOps + if ($m[0] === '' || $m[0] === '/' || $m[0] === '//') { continue; } + + // Convert to lowercase + if ($this->dom->lowercase) { + $m[1] = strtolower($m[1]); + } + + // Extract classes + if ($m[3] !== '') { $m[3] = explode('.', $m[3]); } + + /* Extract attributes (pattern based on the pattern above!) + + * [0] - full match + * [1] - attribute name + * [2] - attribute expression + * [3] - attribute value + * [4] - case sensitivity + * + * Note: Attributes can be negated with a "!" prefix to their name + */ + if($m[4] !== '') { + preg_match_all( + "/\[@?(!?[\w:-]+)(?:([!*^$|~]?=)[\"']?(.*?)[\"']?)?(?:\s+?([iIsS])?)?\]/is", + trim($m[4]), + $attributes, + PREG_SET_ORDER + ); + + // Replace element by array + $m[4] = array(); + + foreach($attributes as $att) { + // Skip empty matches + if(trim($att[0]) === '') { continue; } + + $inverted = (isset($att[1][0]) && $att[1][0] === '!'); + $m[4][] = array( + $inverted ? substr($att[1], 1) : $att[1], // Name + (isset($att[2])) ? $att[2] : '', // Expression + (isset($att[3])) ? $att[3] : '', // Value + $inverted, // Inverted Flag + (isset($att[4])) ? strtolower($att[4]) : '', // Case-Sensitivity + ); + } + } + + // Sanitize Separator + if ($m[5] !== '' && trim($m[5]) === '') { // Descendant Separator + $m[5] = ' '; + } else { // Other Separator + $m[5] = trim($m[5]); + } + + // Clear Separator if it's a Selector List + if ($is_list = ($m[5] === ',')) { $m[5] = ''; } + + // Remove full match before adding to results + array_shift($m); + $result[] = $m; + + if ($is_list) { // Selector List + $selectors[] = $result; + $result = array(); + } + } + + if (count($result) > 0) { $selectors[] = $result; } + return $selectors; + } + + function __get($name) + { + if (isset($this->attr[$name])) { + return $this->convert_text($this->attr[$name]); + } + switch ($name) { + case 'outertext': return $this->outertext(); + case 'innertext': return $this->innertext(); + case 'plaintext': return $this->text(); + case 'xmltext': return $this->xmltext(); + default: return array_key_exists($name, $this->attr); + } + } + + function __set($name, $value) + { + global $debug_object; + if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } + + switch ($name) { + case 'outertext': return $this->_[HDOM_INFO_OUTER] = $value; + case 'innertext': + if (isset($this->_[HDOM_INFO_TEXT])) { + return $this->_[HDOM_INFO_TEXT] = $value; + } + return $this->_[HDOM_INFO_INNER] = $value; + } + + if (!isset($this->attr[$name])) { + $this->_[HDOM_INFO_SPACE][] = array(' ', '', ''); + $this->_[HDOM_INFO_QUOTE][] = HDOM_QUOTE_DOUBLE; + } + + $this->attr[$name] = $value; + } + + function __isset($name) + { + switch ($name) { + case 'outertext': return true; + case 'innertext': return true; + case 'plaintext': return true; + } + //no value attr: nowrap, checked selected... + return (array_key_exists($name, $this->attr)) ? true : isset($this->attr[$name]); + } + + function __unset($name) + { + if (isset($this->attr[$name])) { unset($this->attr[$name]); } + } + + function convert_text($text) + { + global $debug_object; + if (is_object($debug_object)) { $debug_object->debug_log_entry(1); } + + $converted_text = $text; + + $sourceCharset = ''; + $targetCharset = ''; + + if ($this->dom) { + $sourceCharset = strtoupper($this->dom->_charset); + $targetCharset = strtoupper($this->dom->_target_charset); + } + + if (is_object($debug_object)) { + $debug_object->debug_log(3, + 'source charset: ' + . $sourceCharset + . ' target charaset: ' + . $targetCharset + ); + } + + if (!empty($sourceCharset) + && !empty($targetCharset) + && (strcasecmp($sourceCharset, $targetCharset) != 0)) { + // Check if the reported encoding could have been incorrect and the text is actually already UTF-8 + if ((strcasecmp($targetCharset, 'UTF-8') == 0) + && ($this->is_utf8($text))) { + $converted_text = $text; + } else { + $converted_text = iconv($sourceCharset, $targetCharset, $text); + } + } + + // Lets make sure that we don't have that silly BOM issue with any of the utf-8 text we output. + if ($targetCharset === 'UTF-8') { + if (substr($converted_text, 0, 3) === "\xef\xbb\xbf") { + $converted_text = substr($converted_text, 3); + } + + if (substr($converted_text, -3) === "\xef\xbb\xbf") { + $converted_text = substr($converted_text, 0, -3); + } + } + + return $converted_text; + } + + static function is_utf8($str) + { + $c = 0; $b = 0; + $bits = 0; + $len = strlen($str); + for($i = 0; $i < $len; $i++) { + $c = ord($str[$i]); + if($c > 128) { + if(($c >= 254)) { return false; } + elseif($c >= 252) { $bits = 6; } + elseif($c >= 248) { $bits = 5; } + elseif($c >= 240) { $bits = 4; } + elseif($c >= 224) { $bits = 3; } + elseif($c >= 192) { $bits = 2; } + else { return false; } + if(($i + $bits) > $len) { return false; } + while($bits > 1) { + $i++; + $b = ord($str[$i]); + if($b < 128 || $b > 191) { return false; } + $bits--; + } + } + } + return true; + } + + function get_display_size() + { + global $debug_object; + + $width = -1; + $height = -1; + + if ($this->tag !== 'img') { + return false; + } + + // See if there is aheight or width attribute in the tag itself. + if (isset($this->attr['width'])) { + $width = $this->attr['width']; + } + + if (isset($this->attr['height'])) { + $height = $this->attr['height']; + } + + // Now look for an inline style. + if (isset($this->attr['style'])) { + // Thanks to user gnarf from stackoverflow for this regular expression. + $attributes = array(); + + preg_match_all( + '/([\w-]+)\s*:\s*([^;]+)\s*;?/', + $this->attr['style'], + $matches, + PREG_SET_ORDER + ); + + foreach ($matches as $match) { + $attributes[$match[1]] = $match[2]; + } + + // If there is a width in the style attributes: + if (isset($attributes['width']) && $width == -1) { + // check that the last two characters are px (pixels) + if (strtolower(substr($attributes['width'], -2)) === 'px') { + $proposed_width = substr($attributes['width'], 0, -2); + // Now make sure that it's an integer and not something stupid. + if (filter_var($proposed_width, FILTER_VALIDATE_INT)) { + $width = $proposed_width; + } + } + } + + // If there is a width in the style attributes: + if (isset($attributes['height']) && $height == -1) { + // check that the last two characters are px (pixels) + if (strtolower(substr($attributes['height'], -2)) == 'px') { + $proposed_height = substr($attributes['height'], 0, -2); + // Now make sure that it's an integer and not something stupid. + if (filter_var($proposed_height, FILTER_VALIDATE_INT)) { + $height = $proposed_height; + } + } + } + + } + + // Future enhancement: + // Look in the tag to see if there is a class or id specified that has + // a height or width attribute to it. + + // Far future enhancement + // Look at all the parent tags of this image to see if they specify a + // class or id that has an img selector that specifies a height or width + // Note that in this case, the class or id will have the img subselector + // for it to apply to the image. + + // ridiculously far future development + // If the class or id is specified in a SEPARATE css file thats not on + // the page, go get it and do what we were just doing for the ones on + // the page. + + $result = array( + 'height' => $height, + 'width' => $width + ); + + return $result; + } + + function save($filepath = '') + { + $ret = $this->outertext(); + + if ($filepath !== '') { + file_put_contents($filepath, $ret, LOCK_EX); + } + + return $ret; + } + + function addClass($class) + { + if (is_string($class)) { + $class = explode(' ', $class); + } + + if (is_array($class)) { + foreach($class as $c) { + if (isset($this->class)) { + if ($this->hasClass($c)) { + continue; + } else { + $this->class .= ' ' . $c; + } + } else { + $this->class = $c; + } + } + } else { + if (is_object($debug_object)) { + $debug_object->debug_log(2, 'Invalid type: ', gettype($class)); + } + } + } + + function hasClass($class) + { + if (is_string($class)) { + if (isset($this->class)) { + return in_array($class, explode(' ', $this->class), true); + } + } else { + if (is_object($debug_object)) { + $debug_object->debug_log(2, 'Invalid type: ', gettype($class)); + } + } + + return false; + } + + function removeClass($class = null) + { + if (!isset($this->class)) { + return; + } + + if (is_null($class)) { + $this->removeAttribute('class'); + return; + } + + if (is_string($class)) { + $class = explode(' ', $class); + } + + if (is_array($class)) { + $class = array_diff(explode(' ', $this->class), $class); + if (empty($class)) { + $this->removeAttribute('class'); + } else { + $this->class = implode(' ', $class); + } + } + } + + function getAllAttributes() + { + return $this->attr; + } + + function getAttribute($name) + { + return $this->__get($name); + } + + function setAttribute($name, $value) + { + $this->__set($name, $value); + } + + function hasAttribute($name) + { + return $this->__isset($name); + } + + function removeAttribute($name) + { + $this->__set($name, null); + } + + function remove() + { + if ($this->parent) { + $this->parent->removeChild($this); + } + } + + function removeChild($node) + { + $nidx = array_search($node, $this->nodes, true); + $cidx = array_search($node, $this->children, true); + $didx = array_search($node, $this->dom->nodes, true); + + if ($nidx !== false && $cidx !== false && $didx !== false) { + + foreach($node->children as $child) { + $node->removeChild($child); + } + + foreach($node->nodes as $entity) { + $enidx = array_search($entity, $node->nodes, true); + $edidx = array_search($entity, $node->dom->nodes, true); + + if ($enidx !== false && $edidx !== false) { + unset($node->nodes[$enidx]); + unset($node->dom->nodes[$edidx]); + } + } + + unset($this->nodes[$nidx]); + unset($this->children[$cidx]); + unset($this->dom->nodes[$didx]); + + $node->clear(); + + } + } + + function getElementById($id) + { + return $this->find("#$id", 0); + } + + function getElementsById($id, $idx = null) + { + return $this->find("#$id", $idx); + } + + function getElementByTagName($name) + { + return $this->find($name, 0); + } + + function getElementsByTagName($name, $idx = null) + { + return $this->find($name, $idx); + } + + function parentNode() + { + return $this->parent(); + } + + function childNodes($idx = -1) + { + return $this->children($idx); + } + + function firstChild() + { + return $this->first_child(); + } + + function lastChild() + { + return $this->last_child(); + } + + function nextSibling() + { + return $this->next_sibling(); + } + + function previousSibling() + { + return $this->prev_sibling(); + } + + function hasChildNodes() + { + return $this->has_child(); + } + + function nodeName() + { + return $this->tag; + } + + function appendChild($node) + { + $node->parent($this); + return $node; + } + +} + +class simple_html_dom +{ + public $root = null; + public $nodes = array(); + public $callback = null; + public $lowercase = false; + public $original_size; + public $size; + + protected $pos; + protected $doc; + protected $char; + + protected $cursor; + protected $parent; + protected $noise = array(); + protected $token_blank = " \t\r\n"; + protected $token_equal = ' =/>'; + protected $token_slash = " />\r\n\t"; + protected $token_attr = ' >'; + + public $_charset = ''; + public $_target_charset = ''; + + protected $default_br_text = ''; + + public $default_span_text = ''; + + protected $self_closing_tags = array( + 'area' => 1, + 'base' => 1, + 'br' => 1, + 'col' => 1, + 'embed' => 1, + 'hr' => 1, + 'img' => 1, + 'input' => 1, + 'link' => 1, + 'meta' => 1, + 'param' => 1, + 'source' => 1, + 'track' => 1, + 'wbr' => 1 + ); + protected $block_tags = array( + 'body' => 1, + 'div' => 1, + 'form' => 1, + 'root' => 1, + 'span' => 1, + 'table' => 1 + ); + protected $optional_closing_tags = array( + // Not optional, see + // https://www.w3.org/TR/html/textlevel-semantics.html#the-b-element + 'b' => array('b' => 1), + 'dd' => array('dd' => 1, 'dt' => 1), + // Not optional, see + // https://www.w3.org/TR/html/grouping-content.html#the-dl-element + 'dl' => array('dd' => 1, 'dt' => 1), + 'dt' => array('dd' => 1, 'dt' => 1), + 'li' => array('li' => 1), + 'optgroup' => array('optgroup' => 1, 'option' => 1), + 'option' => array('optgroup' => 1, 'option' => 1), + 'p' => array('p' => 1), + 'rp' => array('rp' => 1, 'rt' => 1), + 'rt' => array('rp' => 1, 'rt' => 1), + 'td' => array('td' => 1, 'th' => 1), + 'th' => array('td' => 1, 'th' => 1), + 'tr' => array('td' => 1, 'th' => 1, 'tr' => 1), + ); + + function __construct( + $str = null, + $lowercase = true, + $forceTagsClosed = true, + $target_charset = DEFAULT_TARGET_CHARSET, + $stripRN = true, + $defaultBRText = DEFAULT_BR_TEXT, + $defaultSpanText = DEFAULT_SPAN_TEXT, + $options = 0) + { + if ($str) { + if (preg_match('/^http:\/\//i', $str) || is_file($str)) { + $this->load_file($str); + } else { + $this->load( + $str, + $lowercase, + $stripRN, + $defaultBRText, + $defaultSpanText, + $options + ); + } + } + // Forcing tags to be closed implies that we don't trust the html, but + // it can lead to parsing errors if we SHOULD trust the html. + if (!$forceTagsClosed) { + $this->optional_closing_array = array(); + } + + $this->_target_charset = $target_charset; + } + + function __destruct() + { + $this->clear(); + } + + function load( + $str, + $lowercase = true, + $stripRN = true, + $defaultBRText = DEFAULT_BR_TEXT, + $defaultSpanText = DEFAULT_SPAN_TEXT, + $options = 0) + { + global $debug_object; + + // prepare + $this->prepare($str, $lowercase, $defaultBRText, $defaultSpanText); + + // Per sourceforge http://sourceforge.net/tracker/?func=detail&aid=2949097&group_id=218559&atid=1044037 + // Script tags removal now preceeds style tag removal. + // strip out + + getConf('themeByNamespace')) { + echo ''; + } + + echo tpl_favicon(array('favicon', 'mobile')); + tpl_includeFile('meta.html'); + tpl_metaheaders(); + + ?> + + + + + +
    + getMessageArea() ?> +
    +
    + +
    +

    + + +
    + +
    + +
    + +
    + +
    + + + diff --git a/lib/tpl/bootstrap3/script.js b/lib/tpl/bootstrap3/script.js new file mode 100644 index 0000000..a45445e --- /dev/null +++ b/lib/tpl/bootstrap3/script.js @@ -0,0 +1,1008 @@ +/*! + * DokuWiki Bootstrap3 Template: Hacks! + * + * Home http://dokuwiki.org/template:bootstrap3 + * Author Giuseppe Di Terlizzi + * License GPL 2 (http://www.gnu.org/licenses/gpl.html) + */ + +/* DOKUWIKI:include assets/bootstrap/js/bootstrap.min.js */ +/* DOKUWIKI:include assets/anchorjs/anchor.min.js */ +/* DOKUWIKI:include assets/typeahead/bootstrap3-typeahead.min.js */ +/* DOKUWIKI:include assets/iconify/iconify.min.js */ +/* DOKUWIKI:include assets/iconify/plugins/fa.js */ + +// Detect Icoonify support with Icon Plugin +if (!Iconify.getConfig('defaultAPI').match('lib/plugins/icons')) { + Iconify.setConfig('defaultAPI', DOKU_TPL + 'iconify.php?prefix={prefix}&icons={icons}'); +} + +if (typeof JSINFO.bootstrap3 === 'undefined') { + JSINFO.bootstrap3 = { + config: {} + }; +} + +if (typeof JSINFO.plugin === 'undefined') { + JSINFO.plugin = {}; +} + +function dw_mode(id) { + return ((JSINFO.bootstrap3.mode === id) ? true : false); +} + +function dw_admin(page) { + return ((JSINFO.bootstrap3.admin === page) ? true : false); +} + +function mediaSize(media) { + return jQuery(['#screen__mode .visible-', media, '-block'].join('')).is(':visible'); +} + +var dw_template = { + + init: function () { + + dw_template.common(); + dw_template.mobileLayout(); + dw_template.toc(); + dw_template.tabs(); + dw_template.tocMenu(); + dw_template.nav(); + dw_template.backToTop(); + dw_template.anchorJS(); + dw_template.pageTools(); + dw_template.pageIcons(); + dw_template.dropdownPage(); + dw_template.footnotes(); + dw_template.mediaManager(); + dw_template.collapseSections(); + dw_template.pageRestoreConfirm(); + dw_template.alerts(); + dw_template.detail(); + + dw_template.menuitem(); + dw_template.cookieLaw(); + dw_template.plugins(); + + // Enable Typeahead + if (! JSINFO.bootstrap3.config.disableSearchSuggest) { + dw_template.typeahead(); + } + + // Preload icons + Iconify.preloadImages(['mdi:folder-open', 'mdi:folder', 'mdi:file-document-outline', 'mdi:chevron-up', 'mdi:chevron-down']); + + // Mobile Layout + jQuery(window).resize(function () { + dw_template.mobileLayout(); + dw_template.collapseSections(); + dw_template.tocResize(); + }); + + // Re-initialize some components in media-manager + if (dw_mode('media') || jQuery('#media__manager').length) { + + jQuery(document).ajaxSuccess(function () { + dw_template.common(); + dw_template.buttons(); + dw_template.tabs(); + dw_template.mediaManager(); + dw_template.alerts(); + }); + } + + // Index Mode + if (dw_mode('index')) { + + jQuery(document).ajaxSuccess(function () { + dw_template.modeIndex(); + }); + + jQuery('#index__tree').click(function (e) { + dw_template.modeIndex(); + }); + + } + + // Hash change + if (JSINFO.bootstrap3.config.fixedTopNavbar) { + + var scrollOnHashChange = function () { + scrollBy(0, - (parseInt(jQuery('body').css('marginTop')) || 0)); + }; + + if (location.hash) { + setTimeout(function () { + scrollOnHashChange(); + }, 1); + } + + jQuery(window).on('hashchange', function () { + scrollOnHashChange(); + }); + } + + }, + + // Normalization & Basic Styling + common: function () { + + var $dw_content = jQuery('#dokuwiki__content, #media__manager'); // Page Content node + + // Abbr tooltips + jQuery('abbr').tooltip(); + + // Search Hit + jQuery('.search_hit').removeClass('search_hit').addClass('mark'); + + // Fix accesskey issue on dropdown menu + if (jQuery('#dw__pagetools').length) { + jQuery('ul.dropdown-menu li a[accesskey]') + .closest('.top, .revs, .show, .edit') + .removeAttr('accesskey'); + } + + // Form and controls + // TODO ported + $dw_content.find(':submit, :button, :reset').addClass('btn btn-default'); + jQuery('input, select, textarea') + .not('[type=submit], [type=reset], [type=button], [type=hidden], [type=image], [type=checkbox], [type=radio]') + .addClass('form-control'); + jQuery('input[type=checkbox]').addClass('checkbox-inline'); + jQuery('input[type=radio]').addClass('radio-inline'); + jQuery('label').addClass('control-label'); + jQuery('main form:not(.form-horizontal)').addClass('form-inline'); + + // Toolbar + jQuery('#tool__bar').addClass('btn-group'); + + // Add icons + jQuery('[data-dw-icon]').each(function () { + var $self = jQuery(this); + var $icon = jQuery('').attr('data-icon', $self.attr('data-dw-icon')); + + if ($self.attr('data-dw-icon-target')) { + $self.find($self.attr('data-dw-icon-target')).prepend($icon); + } else { + $self.prepend($icon); + } + + }); + + // Picker + // if (dw_mode('edit')) { + // jQuery('.picker').addClass('btn-group'); + // } + + // Footer links + jQuery('footer a').addClass('navbar-link'); + + // Personal Home-Page icon + if (NS == 'user' && dw_mode('show') && !jQuery('.notFound').length) { + jQuery('.mode_show #dokuwiki__content h1').prepend(' '); + } + + // Scrolling animation (on TOC and FootNotes) + jQuery('#dw__toc a, #dw__toc_menu a, a.fn_top, a.fn_bot').on('click', function (e) { + + var $link = jQuery(this); + + if ($link.attr('href').match(/^#/) && $link.attr('href').length > 1) { + + e.preventDefault(); + + if (mediaSize('xs') && $link.hasClass('fn_top')) { + return false; + } + + if (JSINFO.bootstrap3.config.tocCollapseOnScroll && JSINFO.bootstrap3.config.tocAffix) { + dw_template.tocClose(); + } + + var $target = jQuery('body ' + $link.attr('href')); + + if ($target.length) { + + var body_offset = (parseInt(jQuery('body').css('marginTop')) || 0), + target_position = Math.round($target.offset().top - body_offset); + + jQuery('html, body').animate({ + scrollTop: target_position + }, 600); + + document.location.hash = $link.attr('href'); + + } + + return false; + + } + + }); + + }, + + /** + * Customize jQuery UI with Bootstrap v3 classes + */ + jQueryUI: function () { + + if (typeof jQuery.ui === 'undefined') return false; + + // accordion + jQuery.ui.accordion.prototype.options.classes["ui-accordion"] = "panel panel-default"; + jQuery.ui.accordion.prototype.options.classes["ui-accordion-content"] = "panel-collapse collapse"; + jQuery.ui.accordion.prototype.options.classes["ui-accordion-content-active"] = "in"; + jQuery.ui.accordion.prototype.options.classes["ui-accordion-header"] = "panel-heading"; + + // button + jQuery.ui.button.prototype.options.classes["ui-button"] = "btn btn-default"; + jQuery.ui.button.prototype.options.classes["ui-button-icon"] = "glyphicon"; + + // dialog + jQuery.ui.dialog.prototype.options.classes["ui-dialog"] = "modal-content"; + jQuery.ui.dialog.prototype.options.classes["ui-dialog-titlebar"] = "modal-header"; + jQuery.ui.dialog.prototype.options.classes["ui-dialog-title"] = "modal-title"; + jQuery.ui.dialog.prototype.options.classes["ui-dialog-titlebar-close"] = "btn btn-default"; + jQuery.ui.dialog.prototype.options.classes["ui-dialog-content"] = "modal-body"; + jQuery.ui.dialog.prototype.options.classes["ui-dialog-buttonpane"] = "modal-footer"; + + // menu + jQuery.ui.menu.prototype.options.classes["ui-menu"] = "list-group"; + jQuery.ui.menu.prototype.options.classes["ui-menu-icons"] = ""; + jQuery.ui.menu.prototype.options.classes["ui-menu-icon"] = "glyphicon glyphicon-chevron-right"; + jQuery.ui.menu.prototype.options.classes["ui-menu-item"] = "list-group-item"; + jQuery.ui.menu.prototype.options.classes["ui-menu-divider"] = ""; + jQuery.ui.menu.prototype.options.classes["ui-menu-item-wrapper"] = ""; + + // progressbar + jQuery.ui.progressbar.prototype.options.classes["ui-progressbar"] = "progress"; + jQuery.ui.progressbar.prototype.options.classes["ui-progressbar-value"] = "progress-bar"; + + // selectmenu + jQuery.ui.selectmenu.prototype.options.classes["ui-selectmenu-button"] = "btn btn-default dropdown-toggle"; + jQuery.ui.selectmenu.prototype.options.classes["ui-selectmenu-open"] = "open"; + jQuery.ui.selectmenu.prototype.options.icons.button = "caret"; + jQuery.ui.selectmenu.prototype.options.width = "auto"; + + // tabs + jQuery.ui.tabs.prototype.options.classes["ui-tabs-nav"] = "nav nav-tabs"; + jQuery.ui.tabs.prototype.options.classes["ui-tabs-panel"] = "tab-pane"; + jQuery.ui.tabs.prototype.options.classes["ui-tabs-active"] = "active"; + + // tooltip + jQuery.ui.tooltip.prototype.options.classes["ui-tooltip"] = "tooltip top fade in"; + jQuery.ui.tooltip.prototype.options.classes["ui-tooltip-content"] = "tooltip-inner"; + + }, + + nav: function () { + // Unwrap unnecessary tags inside list items for Bootstrap nav component + jQuery('.nav div.li').contents().unwrap(); + + // Move the font-icons inside a link + jQuery('.nav li .dw-icons + a').each(function () { + var $link = jQuery(this), + $icon = $link.prev(); + $icon.prependTo($link); + $icon.after(' '); + }); + + }, + + tabs: function () { + jQuery('ul.tabs').addClass('nav nav-tabs'); + + jQuery('.nav-tabs strong').replaceWith(function () { + + jQuery(this).parent().addClass('active'); + return jQuery('').html(jQuery(this).contents()); + }); + }, + + buttons: function () { + // TODO ported + jQuery('.button').removeClass('button'); // Not ported + jQuery('.alert button').removeClass('btn btn-default'); + jQuery('#dw__login, #dw__register, #subscribe__form, #media__manager').find(':submit').addClass('btn-success'); + jQuery('#dw__profiledelete').find(':submit').addClass('btn-danger'); + jQuery('#edbtn__save').addClass('btn-success'); + + // Section Button edit + // TODO ported + jQuery('.btn_secedit .btn').addClass('btn-xs'); + }, + + backToTop: function () { + jQuery('.back-to-top').click(function (e) { + e.preventDefault(); + jQuery('html, body').animate({ scrollTop: 0 }, 600); + }); + + // Display back-to-top during scroll + jQuery(window).scroll(function () { + if (jQuery(this).scrollTop()) { + jQuery('.back-to-top').fadeIn(); + } else { + jQuery('.back-to-top').fadeOut(); + } + }); + }, + + footnotes: function () { + + var orig_insituPopup = dw_page.insituPopup; + + dw_page.insituPopup = function (target, popup_id) { + var $fndiv = orig_insituPopup(target, popup_id); + $fndiv.addClass('panel panel-body panel-default'); + return $fndiv; + } + + }, + + alerts: function () { + // Info + jQuery('div.info') + .removeClass('info') + .addClass('alert alert-info') + .prepend(''); + + // Error + jQuery('div.error') + .removeClass('error') + .addClass('alert alert-danger') + .prepend(''); + + // Success + jQuery('div.success') + .removeClass('success') + .addClass('alert alert-success') + .prepend(''); + + // Notify + jQuery('div.notify') + .removeClass('notify') + .addClass('alert alert-warning') + .prepend(''); + }, + + cookieLaw: function () { + jQuery('#cookieDismiss').on('click', function () { + jQuery('#cookieNotice').hide(); + DokuCookie.setValue('cookieNoticeAccepted', 1); + }); + + }, + + anchorJS: function () { + + if (!JSINFO.bootstrap3.config.useAnchorJS) return false; + + anchors.add('.mode_show article .dw-content h1, .mode_show article ' + + '.dw-content h2, .mode_show article .dw-content h3, ' + + '.mode_show article .dw-content h4, .mode_show article ' + + '.dw-content h5'); + + }, + + dropdownPage: function () { + jQuery('.dw__dropdown_page .dropdown').hover(function () { + if (!jQuery('#screen_mode').find('.visible-xs').is(':visible')) { + jQuery(this).addClass('open'); + } + }, + function () { + if (!jQuery('#screen_mode').find('.visible-xs').is(':visible')) { + jQuery(this).removeClass('open'); + } + }); + }, + + pageIcons: function () { + + var $dw_page_icons = jQuery('.dw-page-icons'); + + if (!$dw_page_icons.length) return false; + + var title = encodeURIComponent(document.title), + url = encodeURIComponent(location), + window_options = 'width=800,height=600,menubar=no,location=no,status=no'; + + var share_to = { + 'twitter': (function () { return ['https://twitter.com/intent/tweet?text=', title, '&url=', url].join(''); })(), + 'linkedin': (function () { return ['https://www.linkedin.com/shareArticle?mini=true&url=', url, '&title=', title].join(''); })(), + 'facebook': (function () { return ['https://www.facebook.com/sharer/sharer.php?u=', url, '&t=', title].join(''); })(), + 'pinterest': (function () { return ['https://pinterest.com/pin/create/button/?url=', url, '&description=', title].join(''); })(), + 'telegram': (function () { return ['https://telegram.me/share/url?url=', url].join(''); })(), + 'whatsapp': (function () { return ['https://wa.me/?text=', title, ': ', url].join(''); })(), + 'yammer': (function () { return ['https://www.yammer.com/messages/new?login=true&trk_event=yammer_share&status=', url, '#/Messages/bookmarklet'].join(''); })(), + 'sendmail': (function () { return ['mailto:?subject=', document.title, '&body=', document.URL].join(''); })(), + 'reddit': (function () { return ['https://www.reddit.com/submit?url=', url, '&title=', title].join(''); })(), + 'msteams': (function () { return ['https://teams.microsoft.com/share?href=', url, '&referrer=', location.host].join(''); })(), + }; + + $dw_page_icons.find('.share-twitter').on('click', function () { + window.open(share_to.twitter, 'Share to Twitter', window_options); + }); + + $dw_page_icons.find('.share-linkedin').on('click', function () { + window.open(share_to.linkedin, 'Share to Linkedin', window_options); + }); + + $dw_page_icons.find('.share-facebook').on('click', function () { + window.open(share_to.facebook, 'Share to Facebook', window_options); + }); + + $dw_page_icons.find('.share-pinterest').on('click', function () { + window.open(share_to.pinterest, 'Share to Pinterest', window_options); + }); + + $dw_page_icons.find('.share-telegram').on('click', function () { + window.open(share_to.telegram, 'Share to Telegram', window_options); + }); + + $dw_page_icons.find('.share-yammer').on('click', function () { + window.open(share_to.yammer, 'Share to Yammer', window_options); + }); + + $dw_page_icons.find('.share-reddit').on('click', function () { + window.open(share_to.reddit, 'Share to Reddit', window_options); + }); + + $dw_page_icons.find('.sendmail').on('click', function (e) { + e.preventDefault(); + window.location = share_to['sendmail']; + }); + + $dw_page_icons.find('.share-whatsapp').on('click', function () { + window.open(share_to.whatsapp, 'Share to WhatsApp', window_options); + }); + + $dw_page_icons.find('.share-microsoft-teams').on('click', function () { + window.open(share_to.msteams, 'Share to Microsoft Teams', window_options); + }); + + }, + + pageTools: function () { + + if (!jQuery('#dw__pagetools').length) return false; + + // Page Tools Affix + jQuery('#dw__pagetools .tools').affix({ + offset: { + top: (jQuery('main').position().top), + bottom: (jQuery(document).height() + - jQuery('#dokuwiki__content').height() + - jQuery('#dokuwiki__pageheader').height() + - jQuery('#dokuwiki__header').height()) + } + }); + + var $pagetools = jQuery('#dw__pagetools'); + + $pagetools.find('svg').hover( + + function () { + var $node = jQuery(this); + $node.closest('li.active').removeClass('active'); + $node.closest('li').addClass('active'); + }, + + function () { + var $node = jQuery(this); + $node.closest('li.active').removeClass('active'); + } + ); + + }, + + collapseSections: function () { + + if (!JSINFO.bootstrap3.config.collapsibleSections) return false; + + var $sections = jQuery('article div.level2'), + $headings = $sections.prev(); + + if (mediaSize('xs')) { + + $sections.addClass('hide'); + + if (!$headings.find('svg').length) { + + $headings + .css('cursor', 'pointer') + .prepend(Iconify.getSVG('mdi:chevron-down')); + + $headings.on('click', function () { + + var $heading = jQuery(this), + $icon = $heading.find('svg'), + $section = $heading.nextUntil('h2'); + + $section.toggleClass('hide'); + $heading.css('cursor', 'pointer'); + + $section.hasClass('hide') + ? $icon.replaceWith(Iconify.getSVG('mdi:chevron-down')) + : $icon.replaceWith(Iconify.getSVG('mdi:chevron-up')); + + }); + + if (mediaSize('xs')) { + $headings.trigger('click'); + } + + } + + } else { + if ($sections.hasClass('hide')) { + $sections.removeClass('hide'); + } + } + + }, + + mobileLayout: function () { + + var $dw_aside = jQuery('.dw__sidebar'); + if (!$dw_aside.length) return false; + + if (mediaSize('xs')) { + + if (JSINFO.bootstrap3.config.sidebarOnNavbar) { + + if (!jQuery('header aside').length) { + jQuery('