summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--_test/bootstrap.php7
-rw-r--r--_test/conf/acl.auth.php6
-rw-r--r--_test/core/DokuWikiTest.php20
-rw-r--r--_test/core/TestRequest.php75
-rw-r--r--_test/tests/conf/title.test.php19
-rw-r--r--_test/tests/inc/auth_aclcheck.test.php27
-rw-r--r--_test/tests/inc/cache_stalecheck.test.php27
-rw-r--r--_test/tests/inc/common_cleanText.test.php6
-rw-r--r--_test/tests/inc/events_nested.test.php36
-rw-r--r--_test/tests/inc/httpclient_http.test.php15
-rw-r--r--_test/tests/inc/input.test.php216
-rw-r--r--_test/tests/inc/pageutils_findnearest.test.php40
-rw-r--r--_test/tests/inc/template_sidebar.test.php40
-rw-r--r--_test/tests/lib/exe/js_js_compress.test.php6
-rw-r--r--_test/tests/test/basic.test.php83
-rw-r--r--conf/users.auth.php.dist2
-rw-r--r--doku.php53
-rw-r--r--feed.php349
-rw-r--r--inc/DifferenceEngine.php10
-rw-r--r--inc/HTTPClient.php466
-rw-r--r--inc/Input.class.php229
-rw-r--r--inc/JpegMeta.php2
-rw-r--r--inc/Mailer.class.php298
-rw-r--r--inc/PassHash.class.php277
-rw-r--r--inc/actions.php53
-rw-r--r--inc/auth.php658
-rw-r--r--inc/cache.php10
-rw-r--r--inc/common.php835
-rw-r--r--inc/config_cascade.php2
-rw-r--r--inc/farm.php148
-rw-r--r--inc/form.php5
-rw-r--r--inc/html.php110
-rw-r--r--inc/init.php8
-rw-r--r--inc/lang/bg/lang.php8
-rw-r--r--inc/lang/bg/mailtext.txt2
-rw-r--r--inc/lang/bg/mailwrap.html13
-rw-r--r--inc/lang/cs/subscr_digest.txt2
-rw-r--r--inc/lang/cs/subscr_list.txt2
-rw-r--r--inc/lang/cs/subscr_single.txt2
-rw-r--r--inc/lang/da/lang.php59
-rw-r--r--inc/lang/da/mailwrap.html13
-rw-r--r--inc/lang/da/resetpwd.txt3
-rw-r--r--inc/lang/da/subscr_digest.txt20
-rw-r--r--inc/lang/da/subscr_list.txt17
-rw-r--r--inc/lang/de-informal/lang.php21
-rw-r--r--inc/lang/de-informal/mailwrap.html13
-rw-r--r--inc/lang/de-informal/resetpwd.txt4
-rw-r--r--inc/lang/de/lang.php1
-rw-r--r--inc/lang/de/mailwrap.html13
-rw-r--r--inc/lang/en/lang.php1
-rw-r--r--inc/lang/fa/lang.php56
-rw-r--r--inc/lang/fa/mailwrap.html14
-rw-r--r--inc/lang/fa/resetpwd.txt3
-rw-r--r--inc/lang/it/lang.php48
-rw-r--r--inc/lang/it/mailwrap.html13
-rw-r--r--inc/lang/it/resetpwd.txt1
-rw-r--r--inc/lang/ko/admin.txt3
-rw-r--r--inc/lang/ko/backlinks.txt5
-rw-r--r--inc/lang/ko/conflict.txt5
-rw-r--r--inc/lang/ko/denied.txt3
-rw-r--r--inc/lang/ko/diff.txt6
-rw-r--r--inc/lang/ko/draft.txt7
-rw-r--r--inc/lang/ko/edit.txt3
-rw-r--r--inc/lang/ko/editrev.txt2
-rw-r--r--inc/lang/ko/index.txt5
-rw-r--r--inc/lang/ko/install.html24
-rw-r--r--inc/lang/ko/lang.php361
-rw-r--r--inc/lang/ko/locked.txt4
-rw-r--r--inc/lang/ko/login.txt3
-rw-r--r--inc/lang/ko/mailtext.txt23
-rw-r--r--inc/lang/ko/mailwrap.html2
-rw-r--r--inc/lang/ko/newpage.txt4
-rw-r--r--inc/lang/ko/norev.txt2
-rw-r--r--inc/lang/ko/password.txt11
-rw-r--r--inc/lang/ko/preview.txt5
-rw-r--r--inc/lang/ko/pwconfirm.txt14
-rw-r--r--inc/lang/ko/read.txt2
-rw-r--r--inc/lang/ko/recent.txt6
-rw-r--r--inc/lang/ko/register.txt3
-rw-r--r--inc/lang/ko/registermail.txt15
-rw-r--r--inc/lang/ko/resendpwd.txt5
-rw-r--r--inc/lang/ko/resetpwd.txt4
-rw-r--r--inc/lang/ko/revisions.txt3
-rw-r--r--inc/lang/ko/searchpage.txt4
-rw-r--r--inc/lang/ko/stopwords.txt18
-rw-r--r--inc/lang/ko/subscr_digest.txt14
-rw-r--r--inc/lang/ko/subscr_form.txt2
-rw-r--r--inc/lang/ko/subscr_list.txt9
-rw-r--r--inc/lang/ko/subscr_single.txt11
-rw-r--r--inc/lang/ko/updateprofile.txt4
-rw-r--r--inc/lang/ko/uploadmail.txt23
-rw-r--r--inc/lang/nl/edit.txt2
-rw-r--r--inc/lang/nl/lang.php17
-rw-r--r--inc/lang/nl/mailwrap.html13
-rw-r--r--inc/lang/pl/lang.php5
-rw-r--r--inc/lang/pl/mailwrap.html13
-rw-r--r--inc/lang/pl/resetpwd.txt3
-rw-r--r--inc/lang/ru/lang.php4
-rw-r--r--inc/lang/ru/resetpwd.txt3
-rw-r--r--inc/lang/vi/backlinks.txt4
-rw-r--r--inc/lang/vi/conflict.txt2
-rw-r--r--inc/lang/vi/denied.txt2
-rw-r--r--inc/lang/vi/edit.txt2
-rw-r--r--inc/lang/vi/editrev.txt2
-rw-r--r--inc/lang/vi/lang.php186
-rw-r--r--inc/lang/vi/login.txt2
-rw-r--r--inc/lang/vi/mailtext.txt2
-rw-r--r--inc/lang/vi/newpage.txt2
-rw-r--r--inc/lang/vi/norev.txt2
-rw-r--r--inc/lang/vi/password.txt2
-rw-r--r--inc/lang/vi/preview.txt2
-rw-r--r--inc/lang/vi/read.txt2
-rw-r--r--inc/lang/vi/revisions.txt2
-rw-r--r--inc/lang/vi/searchpage.txt2
-rw-r--r--inc/lang/zh/lang.php14
-rw-r--r--inc/lang/zh/mailwrap.html13
-rw-r--r--inc/lang/zh/resetpwd.txt3
-rw-r--r--inc/load.php1
-rw-r--r--inc/media.php73
-rw-r--r--inc/pageutils.php27
-rw-r--r--inc/parser/code.php3
-rw-r--r--inc/parser/xhtml.php22
-rw-r--r--inc/parserutils.php7
-rw-r--r--inc/preload.php.dist17
-rw-r--r--inc/template.php28
-rw-r--r--inc/utf8.php59
-rw-r--r--install.php117
-rw-r--r--lib/exe/css.php130
-rw-r--r--lib/exe/detail.php4
-rw-r--r--lib/exe/fetch.php8
-rw-r--r--lib/exe/indexer.php7
-rw-r--r--lib/exe/mediamanager.php36
-rw-r--r--lib/images/interwiki/amazon.de.gifbin110 -> 132 bytes
-rw-r--r--lib/images/interwiki/amazon.gifbin110 -> 132 bytes
-rw-r--r--lib/images/interwiki/amazon.uk.gifbin110 -> 132 bytes
-rw-r--r--lib/images/interwiki/callto.gifbin178 -> 177 bytes
-rw-r--r--lib/images/interwiki/paypal.gifbin171 -> 138 bytes
-rw-r--r--lib/images/interwiki/skype.gifbin0 -> 157 bytes
-rw-r--r--lib/images/interwiki/skype.pngbin675 -> 0 bytes
-rw-r--r--lib/plugins/acl/admin.php12
-rw-r--r--lib/plugins/acl/lang/bg/lang.php6
-rw-r--r--lib/plugins/acl/lang/da/lang.php1
-rw-r--r--lib/plugins/acl/lang/de-informal/lang.php4
-rw-r--r--lib/plugins/acl/lang/fa/lang.php1
-rw-r--r--lib/plugins/acl/lang/it/lang.php1
-rw-r--r--lib/plugins/acl/lang/ko/help.txt10
-rw-r--r--lib/plugins/acl/lang/ko/lang.php33
-rw-r--r--lib/plugins/acl/lang/pl/lang.php1
-rw-r--r--lib/plugins/acl/lang/vi/help.txt12
-rw-r--r--lib/plugins/acl/lang/vi/lang.php35
-rw-r--r--lib/plugins/config/admin.php1
-rw-r--r--lib/plugins/config/lang/bg/lang.php367
-rw-r--r--lib/plugins/config/lang/da/lang.php103
-rw-r--r--lib/plugins/config/lang/de-informal/intro.txt2
-rw-r--r--lib/plugins/config/lang/de-informal/lang.php11
-rw-r--r--lib/plugins/config/lang/de/intro.txt2
-rw-r--r--lib/plugins/config/lang/de/lang.php11
-rw-r--r--lib/plugins/config/lang/fa/lang.php108
-rw-r--r--lib/plugins/config/lang/it/lang.php104
-rw-r--r--lib/plugins/config/lang/ko/intro.txt8
-rw-r--r--lib/plugins/config/lang/ko/lang.php223
-rw-r--r--lib/plugins/config/lang/nl/lang.php111
-rw-r--r--lib/plugins/config/lang/no/lang.php4
-rw-r--r--lib/plugins/config/lang/pl/lang.php106
-rw-r--r--lib/plugins/config/lang/ru/lang.php100
-rw-r--r--lib/plugins/config/lang/vi/lang.php5
-rw-r--r--lib/plugins/config/lang/zh/lang.php106
-rw-r--r--lib/plugins/config/settings/config.class.php6
-rw-r--r--lib/plugins/plugin/lang/da/lang.php2
-rw-r--r--lib/plugins/plugin/lang/fa/lang.php1
-rw-r--r--lib/plugins/plugin/lang/it/lang.php2
-rw-r--r--lib/plugins/plugin/lang/ko/admin_plugin.txt2
-rw-r--r--lib/plugins/plugin/lang/ko/lang.php53
-rw-r--r--lib/plugins/plugin/lang/pl/lang.php1
-rw-r--r--lib/plugins/plugin/lang/vi/lang.php5
-rw-r--r--lib/plugins/popularity/lang/da/lang.php6
-rw-r--r--lib/plugins/popularity/lang/da/submitted.txt3
-rw-r--r--lib/plugins/popularity/lang/fa/lang.php1
-rw-r--r--lib/plugins/popularity/lang/it/lang.php1
-rw-r--r--lib/plugins/popularity/lang/ko/intro.txt6
-rw-r--r--lib/plugins/popularity/lang/ko/lang.php5
-rw-r--r--lib/plugins/popularity/lang/ko/submitted.txt2
-rw-r--r--lib/plugins/popularity/lang/pl/lang.php1
-rw-r--r--lib/plugins/popularity/lang/vi/lang.php5
-rw-r--r--lib/plugins/revert/admin.php2
-rw-r--r--lib/plugins/revert/lang/da/lang.php1
-rw-r--r--lib/plugins/revert/lang/fa/lang.php1
-rw-r--r--lib/plugins/revert/lang/it/lang.php1
-rw-r--r--lib/plugins/revert/lang/ko/intro.txt2
-rw-r--r--lib/plugins/revert/lang/ko/lang.php13
-rw-r--r--lib/plugins/revert/lang/pl/lang.php1
-rw-r--r--lib/plugins/revert/lang/vi/lang.php5
-rw-r--r--lib/plugins/usermanager/admin.php2
-rw-r--r--lib/plugins/usermanager/lang/da/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/de-informal/lang.php12
-rw-r--r--lib/plugins/usermanager/lang/de/lang.php6
-rw-r--r--lib/plugins/usermanager/lang/fa/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/it/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/ko/lang.php39
-rw-r--r--lib/plugins/usermanager/lang/pl/lang.php1
-rw-r--r--lib/plugins/usermanager/lang/vi/lang.php5
-rw-r--r--lib/scripts/page.js84
-rw-r--r--lib/tpl/default/_mediamanager.css6
-rw-r--r--lib/tpl/default/design.css56
-rw-r--r--lib/tpl/default/main.php4
-rw-r--r--lib/tpl/default/print.css4
-rw-r--r--lib/tpl/default/rtl.css18
-rw-r--r--lib/tpl/dokuwiki/css/_admin.css12
-rw-r--r--lib/tpl/dokuwiki/css/_edit.css40
-rw-r--r--lib/tpl/dokuwiki/css/_forms.css9
-rw-r--r--lib/tpl/dokuwiki/css/_imgdetail.css8
-rw-r--r--lib/tpl/dokuwiki/css/_links.css14
-rw-r--r--lib/tpl/dokuwiki/css/_media_popup.css64
-rw-r--r--lib/tpl/dokuwiki/css/_modal.css11
-rw-r--r--lib/tpl/dokuwiki/css/_recent.css44
-rw-r--r--lib/tpl/dokuwiki/css/_search.css28
-rw-r--r--lib/tpl/dokuwiki/css/_toc.css40
-rw-r--r--lib/tpl/dokuwiki/css/basic.css48
-rw-r--r--lib/tpl/dokuwiki/css/content.css16
-rw-r--r--lib/tpl/dokuwiki/css/design.css168
-rw-r--r--lib/tpl/dokuwiki/css/mobile.css108
-rw-r--r--lib/tpl/dokuwiki/css/pagetools.css121
-rw-r--r--lib/tpl/dokuwiki/css/print.css3
-rw-r--r--lib/tpl/dokuwiki/css/rtl.css593
-rw-r--r--lib/tpl/dokuwiki/css/structure.css27
-rw-r--r--lib/tpl/dokuwiki/detail.php12
-rw-r--r--lib/tpl/dokuwiki/images/apple-touch-icon.pngbin17728 -> 6399 bytes
-rw-r--r--lib/tpl/dokuwiki/images/bullet.pngbin199 -> 112 bytes
-rw-r--r--lib/tpl/dokuwiki/images/button-dw.pngbin404 -> 398 bytes
-rw-r--r--lib/tpl/dokuwiki/images/button-rss.pngbin191 -> 180 bytes
-rw-r--r--lib/tpl/dokuwiki/images/closed-rtl.pngbin170 -> 118 bytes
-rw-r--r--lib/tpl/dokuwiki/images/closed.pngbin165 -> 119 bytes
-rw-r--r--lib/tpl/dokuwiki/images/email.pngbin630 -> 659 bytes
-rw-r--r--lib/tpl/dokuwiki/images/external-link.pngbin947 -> 816 bytes
-rw-r--r--lib/tpl/dokuwiki/images/logo.pngbin12212 -> 3820 bytes
-rw-r--r--lib/tpl/dokuwiki/images/open.pngbin174 -> 118 bytes
-rw-r--r--lib/tpl/dokuwiki/images/page-gradient.pngbin0 -> 280 bytes
-rw-r--r--lib/tpl/dokuwiki/images/pagetools-sprite.pngbin8178 -> 5931 bytes
-rw-r--r--lib/tpl/dokuwiki/images/resizecol.pngbin225 -> 158 bytes
-rw-r--r--lib/tpl/dokuwiki/images/search.pngbin400 -> 316 bytes
-rw-r--r--lib/tpl/dokuwiki/images/sitetools.pngbin3186 -> 0 bytes
-rw-r--r--lib/tpl/dokuwiki/images/toc-arrows.pngbin322 -> 225 bytes
-rw-r--r--lib/tpl/dokuwiki/images/toc-bullet.pngbin211 -> 121 bytes
-rw-r--r--lib/tpl/dokuwiki/images/unc.pngbin553 -> 553 bytes
-rw-r--r--lib/tpl/dokuwiki/images/usertools.pngbin0 -> 1541 bytes
-rw-r--r--lib/tpl/dokuwiki/main.php26
-rw-r--r--lib/tpl/dokuwiki/mediamanager.php9
-rw-r--r--lib/tpl/dokuwiki/script.js75
-rw-r--r--lib/tpl/dokuwiki/style.ini7
-rw-r--r--lib/tpl/dokuwiki/tpl_header.php3
-rw-r--r--lib/tpl/index.php2
251 files changed, 5669 insertions, 3602 deletions
diff --git a/_test/bootstrap.php b/_test/bootstrap.php
index 6c3d6aaa8..58ad6a0d7 100644
--- a/_test/bootstrap.php
+++ b/_test/bootstrap.php
@@ -82,7 +82,12 @@ if (getenv('PRESERVE_TMP') != 'true') {
// populate default dirs
TestUtils::rcopy(TMP_DIR, DOKU_INC.'/conf');
TestUtils::rcopy(TMP_DIR, dirname(__FILE__).'/conf');
-TestUtils::rcopy(TMP_DIR, dirname(__FILE__).'/data');
+mkdir(DOKU_TMP_DATA);
+foreach(array(
+ 'attic', 'cache', 'index', 'locks', 'media',
+ 'media_attic', 'media_meta', 'meta', 'pages', 'tmp') as $dir){
+ mkdir(DOKU_TMP_DATA.'/'.$dir);
+}
// disable all non-default plugins by default
$dh = dir(DOKU_INC.'lib/plugins/');
diff --git a/_test/conf/acl.auth.php b/_test/conf/acl.auth.php
index 14344d778..8a1b01f23 100644
--- a/_test/conf/acl.auth.php
+++ b/_test/conf/acl.auth.php
@@ -19,3 +19,9 @@
# delete 16
* @ALL 8
+
+# for testing wildcards:
+users:* @ALL 1
+users:%USER%:* %USER% 16
+groups:* @ALL 1
+groups:%GROUP%:* %GROUP% 16
diff --git a/_test/core/DokuWikiTest.php b/_test/core/DokuWikiTest.php
index e47c06329..e51f1eeb1 100644
--- a/_test/core/DokuWikiTest.php
+++ b/_test/core/DokuWikiTest.php
@@ -19,6 +19,25 @@ abstract class DokuWikiTest extends PHPUnit_Framework_TestCase {
protected $pluginsDisabled = array();
/**
+ * Setup the data directory
+ *
+ * This is ran before each test class
+ */
+ public static function setUpBeforeClass() {
+ // just to be safe not to delete something undefined later
+ if(!defined('TMP_DIR')) die('no temporary directory');
+ if(!defined('DOKU_TMP_DATA')) die('no temporary data directory');
+
+ // remove any leftovers from the last run
+ if(is_dir(DOKU_TMP_DATA)){
+ TestUtils::rdelete(DOKU_TMP_DATA);
+ }
+
+ // populate default dirs
+ TestUtils::rcopy(TMP_DIR, dirname(__FILE__).'/../data/');
+ }
+
+ /**
* Reset the DokuWiki environment before each test run. Makes sure loaded config,
* language and plugins are correct.
*
@@ -26,6 +45,7 @@ abstract class DokuWikiTest extends PHPUnit_Framework_TestCase {
* @return void
*/
public function setUp() {
+
// reload config
global $conf, $config_cascade;
$conf = array();
diff --git a/_test/core/TestRequest.php b/_test/core/TestRequest.php
index fa3ddec90..172821576 100644
--- a/_test/core/TestRequest.php
+++ b/_test/core/TestRequest.php
@@ -36,9 +36,10 @@ class TestRequest {
/**
* Executes the request
*
+ * @param string $url end URL to simulate, needs to start with /doku.php currently
* @return TestResponse the resulting output of the request
*/
- public function execute() {
+ public function execute($uri='/doku.php') {
// save old environment
$server = $_SERVER;
$session = $_SESSION;
@@ -46,6 +47,14 @@ class TestRequest {
$post = $_POST;
$request = $_REQUEST;
+ // prepare the right URI
+ $this->setUri($uri);
+
+ // import all defined globals into the function scope
+ foreach(array_keys($GLOBALS) as $glb){
+ global $$glb;
+ }
+
// fake environment
global $default_server_vars;
$_SERVER = array_merge($default_server_vars, $this->server);
@@ -79,4 +88,68 @@ class TestRequest {
return $response;
}
+
+ /**
+ * Set the virtual URI the request works against
+ *
+ * This parses the given URI and sets any contained GET variables
+ * but will not overwrite any previously set ones (eg. set via setGet()).
+ *
+ * It initializes the $_SERVER['REQUEST_URI'] and $_SERVER['QUERY_STRING']
+ * with all set GET variables.
+ *
+ * @param string $url end URL to simulate, needs to start with /doku.php currently
+ * @todo make this work with other end points
+ */
+ protected function setUri($uri){
+ if(substr($uri,0,9) != '/doku.php'){
+ throw new Exception("only '/doku.php' is supported currently");
+ }
+
+ $params = array();
+ list($uri, $query) = explode('?',$uri,2);
+ if($query) parse_str($query, $params);
+
+ $this->get = array_merge($params, $this->get);
+ if(count($this->get)){
+ $query = '?'.http_build_query($this->get, '', '&');
+ $query = str_replace(
+ array('%3A', '%5B', '%5D'),
+ array(':', '[', ']'),
+ $query
+ );
+ $uri = $uri.$query;
+ }
+
+ $this->setServer('QUERY_STRING', $query);
+ $this->setServer('REQUEST_URI', $uri);
+ }
+
+ /**
+ * Simulate a POST request with the given variables
+ *
+ * @param array $post all the POST parameters to use
+ * @param string $url end URL to simulate, needs to start with /doku.php currently
+ * @param return TestResponse
+ */
+ public function post($post=array(), $uri='/doku.php') {
+ $this->post = array_merge($this->post, $post);
+ $this->setServer('REQUEST_METHOD', 'POST');
+ return $this->execute($uri);
+ }
+
+ /**
+ * Simulate a GET request with the given variables
+ *
+ * @param array $GET all the POST parameters to use
+ * @param string $url end URL to simulate, needs to start with /doku.php currently
+ * @param return TestResponse
+ */
+ public function get($get=array(), $uri='/doku.php') {
+ $this->get = array_merge($this->get, $get);
+ $this->setServer('REQUEST_METHOD', 'GET');
+ return $this->execute($uri);
+ }
+
+
}
diff --git a/_test/tests/conf/title.test.php b/_test/tests/conf/title.test.php
new file mode 100644
index 000000000..7cae040e7
--- /dev/null
+++ b/_test/tests/conf/title.test.php
@@ -0,0 +1,19 @@
+<?php
+
+class conf_title_test extends DokuWikiTest {
+
+ function testTitle() {
+ global $conf;
+
+ $request = new TestRequest();
+ $response = $request->get();
+ $content = $response->queryHTML('title');
+ $this->assertTrue(strpos($content,$conf['title']) > 0);
+
+ $conf['title'] = 'Foo';
+ $request = new TestRequest();
+ $response = $request->get();
+ $content = $response->queryHTML('title');
+ $this->assertTrue(strpos($content,'Foo') > 0);
+ }
+}
diff --git a/_test/tests/inc/auth_aclcheck.test.php b/_test/tests/inc/auth_aclcheck.test.php
index ea48ec6a5..991f82da7 100644
--- a/_test/tests/inc/auth_aclcheck.test.php
+++ b/_test/tests/inc/auth_aclcheck.test.php
@@ -235,6 +235,33 @@ class auth_acl_test extends DokuWikiTest {
$this->assertEquals(auth_aclcheck('namespace:*', 'jill',array('foo','roots')), AUTH_ADMIN);
}
+ function test_wildcards(){
+ global $conf;
+ global $AUTH_ACL;
+ global $USERINFO;
+ $conf['useacl'] = 1;
+
+ $_SERVER['REMOTE_USER'] = 'john';
+ $USERINFO['grps'] = array('test','töst','foo bar');
+ $AUTH_ACL = auth_loadACL(); // default test file
+
+ // default setting
+ $this->assertEquals(AUTH_UPLOAD, auth_aclcheck('page', $_SERVER['REMOTE_USER'], $USERINFO['grps']));
+
+ // user namespace
+ $this->assertEquals(AUTH_DELETE, auth_aclcheck('users:john:foo', $_SERVER['REMOTE_USER'], $USERINFO['grps']));
+ $this->assertEquals(AUTH_READ, auth_aclcheck('users:john:foo', 'schmock', array()));
+
+ // group namespace
+ $this->assertEquals(AUTH_DELETE, auth_aclcheck('groups:test:foo', $_SERVER['REMOTE_USER'], $USERINFO['grps']));
+ $this->assertEquals(AUTH_READ, auth_aclcheck('groups:test:foo', 'schmock', array()));
+ $this->assertEquals(AUTH_DELETE, auth_aclcheck('groups:toest:foo', $_SERVER['REMOTE_USER'], $USERINFO['grps']));
+ $this->assertEquals(AUTH_READ, auth_aclcheck('groups:toest:foo', 'schmock', array()));
+ $this->assertEquals(AUTH_DELETE, auth_aclcheck('groups:foo_bar:foo', $_SERVER['REMOTE_USER'], $USERINFO['grps']));
+ $this->assertEquals(AUTH_READ, auth_aclcheck('groups:foo_bar:foo', 'schmock', array()));
+
+ }
+
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/cache_stalecheck.test.php b/_test/tests/inc/cache_stalecheck.test.php
new file mode 100644
index 000000000..93f44a55c
--- /dev/null
+++ b/_test/tests/inc/cache_stalecheck.test.php
@@ -0,0 +1,27 @@
+<?php
+
+class cache_stalecheck_test extends DokuWikiTest {
+ function test_staleness() {
+ global $ID;
+
+ $ID = 'stale';
+ $file = wikiFN($ID);
+
+ # Prepare test page
+ saveWikiText($ID, 'Fresh', 'Created');
+
+ # Create stale cache
+ $cache = new cache_renderer($ID, $file, 'xhtml');
+ $cache->storeCache('Stale');
+ $stale = $cache->retrieveCache();
+
+ # Prepare stale cache for testing
+ $time = filemtime($file);
+ touch($cache->cache, $time);
+
+ # Make the test
+ $fresh = p_cached_output($file, 'xhtml', $ID);
+ $this->assertNotEquals($fresh, $stale, 'Stale cache failed to expire');
+ }
+}
+
diff --git a/_test/tests/inc/common_cleanText.test.php b/_test/tests/inc/common_cleanText.test.php
index 00e70d4c7..9d4494332 100644
--- a/_test/tests/inc/common_cleanText.test.php
+++ b/_test/tests/inc/common_cleanText.test.php
@@ -3,11 +3,7 @@
class common_cleanText_test extends DokuWikiTest {
function test_unix(){
- $unix = 'one
- two
-
- three';
-
+ $unix = "one\n two\n\n three";
$this->assertEquals($unix,cleanText($unix));
}
diff --git a/_test/tests/inc/events_nested.test.php b/_test/tests/inc/events_nested.test.php
new file mode 100644
index 000000000..fe5e395bb
--- /dev/null
+++ b/_test/tests/inc/events_nested.test.php
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * This tests if event handlers can trigger the same event again.
+ * This is used by plugins that modify cache handling and use metadata
+ * for checking cache validity which triggers another cache use event.
+ */
+class events_nested_test extends DokuWikiTest {
+ function test_nested_events() {
+ global $EVENT_HANDLER;
+ $firstcount = 0;
+ $secondcount = 0;
+
+ $EVENT_HANDLER->register_hook('NESTED_EVENT', 'BEFORE', null,
+ function() use (&$firstcount) {
+ $firstcount++;
+ if ($firstcount == 1) {
+ $param = array();
+ trigger_event('NESTED_EVENT', $param);
+ }
+ }
+ );
+
+ $EVENT_HANDLER->register_hook('NESTED_EVENT', 'BEFORE', null,
+ function() use (&$secondcount) {
+ $secondcount++;
+ }
+ );
+
+ $param = array();
+ trigger_event('NESTED_EVENT', $param);
+
+ $this->assertEquals(2, $firstcount);
+ $this->assertEquals(2, $secondcount);
+ }
+}
diff --git a/_test/tests/inc/httpclient_http.test.php b/_test/tests/inc/httpclient_http.test.php
index 9cae3736a..9959a1f06 100644
--- a/_test/tests/inc/httpclient_http.test.php
+++ b/_test/tests/inc/httpclient_http.test.php
@@ -124,6 +124,11 @@ class httpclient_http_test extends DokuWikiTest {
$http->max_bodysize = 250;
$data = $http->get($this->server.'/stream/30');
$this->assertTrue($data === false, 'HTTP response');
+ $http->max_bodysize_abort = false;
+ $data = $http->get($this->server.'/stream/30');
+ $this->assertFalse($data === false, 'HTTP response');
+ /* should read no more than max_bodysize+1 */
+ $this->assertLessThanOrEqual(251,strlen($data));
}
/**
@@ -176,5 +181,15 @@ class httpclient_http_test extends DokuWikiTest {
$this->assertArrayHasKey('foo',$http->resp_headers);
$this->assertEquals('bar',$http->resp_headers['foo']);
}
+
+ /**
+ * @group internet
+ */
+ function test_chunked(){
+ $http = new HTTPClient();
+ $data = $http->get('http://whoopdedo.org/cgi-bin/chunked/2550');
+ $this->assertFalse($data === false, 'HTTP response');
+ $this->assertEquals(2550,strlen($data));
+ }
}
//Setup VIM: ex: et ts=4 :
diff --git a/_test/tests/inc/input.test.php b/_test/tests/inc/input.test.php
new file mode 100644
index 000000000..761b7ddbc
--- /dev/null
+++ b/_test/tests/inc/input.test.php
@@ -0,0 +1,216 @@
+<?php
+
+/**
+ * Tests for the Input class
+ */
+class input_test extends DokuWikiTest {
+
+ private $data = array(
+ 'array' => array('foo', 'bar'),
+ 'string' => 'foo',
+ 'int' => '17',
+ 'zero' => '0',
+ 'one' => '1',
+ 'empty' => '',
+ 'emptya' => array()
+ );
+
+ public function test_str() {
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $_GET['get'] = 1;
+ $_POST['post'] = 1;
+ $INPUT = new Input();
+
+ $this->assertSame('foo', $INPUT->str('string'));
+ $this->assertSame('', $INPUT->str('none'));
+ $this->assertSame('', $INPUT->str('empty'));
+ $this->assertSame('foo', $INPUT->str('none', 'foo'));
+ $this->assertSame('', $INPUT->str('empty', 'foo'));
+ $this->assertSame('foo', $INPUT->str('empty', 'foo', true));
+
+ $this->assertSame(false, $INPUT->str('get', false));
+ $this->assertSame(false, $INPUT->str('post', false));
+
+ $this->assertSame('foo', $INPUT->post->str('string'));
+ $this->assertSame('', $INPUT->post->str('none'));
+ $this->assertSame('', $INPUT->post->str('empty'));
+ $this->assertSame('foo', $INPUT->post->str('none', 'foo'));
+ $this->assertSame('', $INPUT->post->str('empty', 'foo'));
+ $this->assertSame('foo', $INPUT->post->str('empty', 'foo', true));
+
+ $this->assertSame(false, $INPUT->post->str('get', false));
+ $this->assertSame('1', $INPUT->post->str('post', false));
+
+ $this->assertSame('foo', $INPUT->get->str('string'));
+ $this->assertSame('', $INPUT->get->str('none'));
+ $this->assertSame('', $INPUT->get->str('empty'));
+ $this->assertSame('foo', $INPUT->get->str('none', 'foo'));
+ $this->assertSame('', $INPUT->get->str('empty', 'foo'));
+ $this->assertSame('foo', $INPUT->get->str('empty', 'foo', true));
+
+ $this->assertSame(false, $INPUT->get->str('post', false));
+ $this->assertSame('1', $INPUT->get->str('get', false));
+
+ $this->assertSame('', $INPUT->str('array'));
+ }
+
+ public function test_int() {
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $_GET['get'] = 1;
+ $_POST['post'] = 1;
+ $INPUT = new Input();
+
+ $this->assertSame(17, $INPUT->int('int'));
+ $this->assertSame(0, $INPUT->int('none'));
+ $this->assertSame(0, $INPUT->int('empty'));
+ $this->assertSame(42, $INPUT->int('none', 42));
+ $this->assertSame(0, $INPUT->int('zero', 42));
+ $this->assertSame(42, $INPUT->int('zero', 42, true));
+
+ $this->assertSame(false, $INPUT->int('get', false));
+ $this->assertSame(false, $INPUT->int('post', false));
+
+ $this->assertSame(17, $INPUT->post->int('int'));
+ $this->assertSame(0, $INPUT->post->int('none'));
+ $this->assertSame(0, $INPUT->post->int('empty'));
+ $this->assertSame(42, $INPUT->post->int('none', 42));
+ $this->assertSame(0, $INPUT->post->int('zero', 42));
+ $this->assertSame(42, $INPUT->post->int('zero', 42, true));
+
+ $this->assertSame(false, $INPUT->post->int('get', false));
+ $this->assertSame(1, $INPUT->post->int('post', false));
+
+ $this->assertSame(17, $INPUT->post->int('int'));
+ $this->assertSame(0, $INPUT->post->int('none'));
+ $this->assertSame(0, $INPUT->post->int('empty'));
+ $this->assertSame(42, $INPUT->post->int('none', 42));
+ $this->assertSame(0, $INPUT->post->int('zero', 42));
+ $this->assertSame(42, $INPUT->post->int('zero', 42, true));
+
+ $this->assertSame(false, $INPUT->get->int('post', false));
+ $this->assertSame(1, $INPUT->get->int('get', false));
+
+ $this->assertSame(0, $INPUT->int('array'));
+
+ $this->assertSame(0, $INPUT->int('zero', -1));
+ $this->assertSame(-1, $INPUT->int('empty', -1));
+ $this->assertSame(-1, $INPUT->int('zero', -1, true));
+ $this->assertSame(-1, $INPUT->int('empty', -1, true));
+ }
+
+ public function test_arr() {
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $_GET['get'] = array(1, 2);
+ $_POST['post'] = array(1, 2);
+ $INPUT = new Input();
+
+ $this->assertSame(array('foo', 'bar'), $INPUT->arr('array'));
+ $this->assertSame(array(), $INPUT->arr('none'));
+ $this->assertSame(array(), $INPUT->arr('empty'));
+ $this->assertSame(array(1, 2), $INPUT->arr('none', array(1, 2)));
+ $this->assertSame(array(), $INPUT->arr('emptya', array(1, 2)));
+ $this->assertSame(array(1, 2), $INPUT->arr('emptya', array(1, 2), true));
+
+ $this->assertSame(false, $INPUT->arr('get', false));
+ $this->assertSame(false, $INPUT->arr('post', false));
+
+ $this->assertSame(array('foo', 'bar'), $INPUT->post->arr('array'));
+ $this->assertSame(array(), $INPUT->post->arr('none'));
+ $this->assertSame(array(), $INPUT->post->arr('empty'));
+ $this->assertSame(array(1, 2), $INPUT->post->arr('none', array(1, 2)));
+ $this->assertSame(array(), $INPUT->post->arr('emptya', array(1, 2)));
+ $this->assertSame(array(1, 2), $INPUT->post->arr('emptya', array(1, 2), true));
+
+ $this->assertSame(false, $INPUT->post->arr('get', false));
+ $this->assertSame(array(1, 2), $INPUT->post->arr('post', false));
+
+ $this->assertSame(array('foo', 'bar'), $INPUT->get->arr('array'));
+ $this->assertSame(array(), $INPUT->get->arr('none'));
+ $this->assertSame(array(), $INPUT->get->arr('empty'));
+ $this->assertSame(array(1, 2), $INPUT->get->arr('none', array(1, 2)));
+ $this->assertSame(array(), $INPUT->get->arr('emptya', array(1, 2)));
+ $this->assertSame(array(1, 2), $INPUT->get->arr('emptya', array(1, 2), true));
+
+ $this->assertSame(array(1, 2), $INPUT->get->arr('get', false));
+ $this->assertSame(false, $INPUT->get->arr('post', false));
+ }
+
+ public function test_bool() {
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $_GET['get'] = '1';
+ $_POST['post'] = '1';
+ $INPUT = new Input();
+
+ $this->assertSame(true, $INPUT->bool('one'));
+ $this->assertSame(false, $INPUT->bool('zero'));
+
+ $this->assertSame(false, $INPUT->bool('get'));
+ $this->assertSame(false, $INPUT->bool('post'));
+
+ $this->assertSame(true, $INPUT->post->bool('one'));
+ $this->assertSame(false, $INPUT->post->bool('zero'));
+
+ $this->assertSame(false, $INPUT->post->bool('get'));
+ $this->assertSame(true, $INPUT->post->bool('post'));
+
+ $this->assertSame(false, $INPUT->bool('zero', -1));
+ $this->assertSame(-1, $INPUT->bool('empty', -1));
+ $this->assertSame(-1, $INPUT->bool('zero', -1, true));
+ $this->assertSame(-1, $INPUT->bool('empty', -1, true));
+ }
+
+ public function test_remove() {
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $INPUT = new Input();
+
+ $INPUT->remove('string');
+ $this->assertNull($_REQUEST['string']);
+ $this->assertNull($_POST['string']);
+ $this->assertNull($_GET['string']);
+
+ $INPUT->post->remove('int');
+ $this->assertNull($_POST['int']);
+ $this->assertEquals(17, $_GET['int']);
+ $this->assertEquals(17, $_REQUEST['int']);
+ }
+
+ public function test_set(){
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $INPUT = new Input();
+
+ $INPUT->set('test','foo');
+ $this->assertEquals('foo',$_REQUEST['test']);
+ $this->assertNull($_POST['test']);
+ $this->assertNull($_GET['test']);
+
+ $INPUT->get->set('test2','foo');
+ $this->assertEquals('foo',$_GET['test2']);
+ $this->assertEquals('foo',$_REQUEST['test2']);
+ $this->assertNull($_POST['test']);
+ }
+
+ public function test_ref(){
+ $_REQUEST = $this->data;
+ $_POST = $this->data;
+ $_GET = $this->data;
+ $INPUT = new Input();
+
+ $test = &$INPUT->ref('string');
+ $this->assertEquals('foo',$test);
+ $_REQUEST['string'] = 'bla';
+ $this->assertEquals('bla',$test);
+ }
+
+}
diff --git a/_test/tests/inc/pageutils_findnearest.test.php b/_test/tests/inc/pageutils_findnearest.test.php
new file mode 100644
index 000000000..e129b5e58
--- /dev/null
+++ b/_test/tests/inc/pageutils_findnearest.test.php
@@ -0,0 +1,40 @@
+<?php
+
+class pageutils_findnearest_test extends DokuWikiTest {
+ function testNoSidebar() {
+ global $ID;
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals(false, $sidebar);
+ }
+
+ function testExistingSidebars() {
+ global $ID;
+
+ saveWikiText('sidebar', 'topsidebar-test', '');
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('sidebar', $sidebar);
+
+ $ID = 'foo';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('sidebar', $sidebar);
+
+ saveWikiText('foo:bar:sidebar', 'bottomsidebar-test', '');
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('foo:bar:sidebar', $sidebar);
+
+ $ID = 'foo:bar:test';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('foo:bar:sidebar', $sidebar);
+
+ $ID = 'foo';
+ $sidebar = page_findnearest('sidebar');
+ $this->assertEquals('sidebar', $sidebar);
+ }
+
+}
diff --git a/_test/tests/inc/template_sidebar.test.php b/_test/tests/inc/template_sidebar.test.php
new file mode 100644
index 000000000..56153894a
--- /dev/null
+++ b/_test/tests/inc/template_sidebar.test.php
@@ -0,0 +1,40 @@
+<?php
+
+class template_sidebar_test extends DokuWikiTest {
+ function testNoSidebar() {
+ global $ID;
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = tpl_sidebar(false);
+ $this->assertEquals('',$sidebar);
+ }
+
+ function testExistingSidebars() {
+ global $ID;
+
+ saveWikiText('sidebar', 'topsidebar-test', '');
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = tpl_sidebar(false);
+ $this->assertTrue(strpos($sidebar, 'topsidebar-test') > 0);
+
+ $ID = 'foo';
+ $sidebar = tpl_sidebar(false);
+ $this->assertTrue(strpos($sidebar, 'topsidebar-test') > 0);
+
+ saveWikiText('foo:bar:sidebar', 'bottomsidebar-test', '');
+
+ $ID = 'foo:bar:baz:test';
+ $sidebar = tpl_sidebar(false);
+ $this->assertTrue(strpos($sidebar, 'bottomsidebar-test') > 0);
+
+ $ID = 'foo:bar:test';
+ $sidebar = tpl_sidebar(false);
+ $this->assertTrue(strpos($sidebar, 'bottomsidebar-test') > 0);
+
+ $ID = 'foo';
+ $sidebar = tpl_sidebar(false);
+ $this->assertTrue(strpos($sidebar, 'topsidebar-test') > 0);
+ }
+
+}
diff --git a/_test/tests/lib/exe/js_js_compress.test.php b/_test/tests/lib/exe/js_js_compress.test.php
index aa8d82933..49f93cc54 100644
--- a/_test/tests/lib/exe/js_js_compress.test.php
+++ b/_test/tests/lib/exe/js_js_compress.test.php
@@ -111,12 +111,10 @@ class js_js_compress_test extends DokuWikiTest {
}
function test_multilinestring(){
- $text = 'var foo = "this is a \\
-multiline string";';
+ $text = 'var foo = "this is a \\'."\n".'multiline string";';
$this->assertEquals('var foo="this is a multiline string";',js_compress($text));
- $text = "var foo = 'this is a \\
-multiline string';";
+ $text = "var foo = 'this is a \\\nmultiline string';";
$this->assertEquals("var foo='this is a multiline string';",js_compress($text));
}
diff --git a/_test/tests/test/basic.test.php b/_test/tests/test/basic.test.php
index b4926d2ba..a0ea48a3a 100644
--- a/_test/tests/test/basic.test.php
+++ b/_test/tests/test/basic.test.php
@@ -19,4 +19,87 @@ class InttestsBasicTest extends DokuWikiTest {
'DokuWiki was not a word in the output'
);
}
+
+ function testPost() {
+ $request = new TestRequest();
+
+ $input = array(
+ 'string' => 'A string',
+ 'array' => array(1, 2, 3),
+ 'id' => 'wiki:dokuwiki'
+ );
+
+ $response = $request->post($input);
+
+ // server var check
+ $this->assertEquals('POST',$request->getServer('REQUEST_METHOD'));
+ $this->assertEquals('',$request->getServer('QUERY_STRING'));
+ $this->assertEquals('/doku.php',$request->getServer('REQUEST_URI'));
+
+ // variable setup check
+ $this->assertEquals('A string', $request->getPost('string'));
+ $this->assertEquals(array(1, 2, 3), $request->getPost('array'));
+ $this->assertEquals('wiki:dokuwiki', $request->getPost('id'));
+
+ // output check
+ $this->assertTrue(strpos($response->getContent(), 'Andreas Gohr') >= 0);
+ }
+
+ function testPostGet() {
+ $request = new TestRequest();
+
+ $input = array(
+ 'string' => 'A string',
+ 'array' => array(1, 2, 3),
+ );
+
+ $response = $request->post($input,'/doku.php?id=wiki:dokuwiki');
+
+ // server var check
+ $this->assertEquals('POST',$request->getServer('REQUEST_METHOD'));
+ $this->assertEquals('?id=wiki:dokuwiki',$request->getServer('QUERY_STRING'));
+ $this->assertEquals('/doku.php?id=wiki:dokuwiki',$request->getServer('REQUEST_URI'));
+
+ // variable setup check
+ $this->assertEquals('A string', $request->getPost('string'));
+ $this->assertEquals(array(1, 2, 3), $request->getPost('array'));
+ $this->assertEquals('wiki:dokuwiki', $request->getGet('id'));
+
+ // output check
+ $this->assertTrue(strpos($response->getContent(), 'Andreas Gohr') >= 0);
+ }
+
+ function testGet() {
+ $request = new TestRequest();
+
+ $input = array(
+ 'string' => 'A string',
+ 'array' => array(1, 2, 3),
+ 'test' => 'bar'
+ );
+
+ $response = $request->get($input,'/doku.php?id=wiki:dokuwiki&test=foo');
+
+ // server var check
+ $this->assertEquals('GET',$request->getServer('REQUEST_METHOD'));
+ $this->assertEquals(
+ '?id=wiki:dokuwiki&test=bar&string=A+string&array[0]=1&array[1]=2&array[2]=3',
+ $request->getServer('QUERY_STRING')
+ );
+ $this->assertEquals(
+ '/doku.php?id=wiki:dokuwiki&test=bar&string=A+string&array[0]=1&array[1]=2&array[2]=3',
+ $request->getServer('REQUEST_URI')
+ );
+
+ // variable setup check
+ $this->assertEquals('A string', $request->getGet('string'));
+ $this->assertEquals(array(1, 2, 3), $request->getGet('array'));
+ $this->assertEquals('wiki:dokuwiki', $request->getGet('id'));
+ $this->assertEquals('bar', $request->getGet('test'));
+
+ // output check
+ $this->assertTrue(strpos($response->getContent(), 'Andreas Gohr') >= 0);
+ }
+
+
}
diff --git a/conf/users.auth.php.dist b/conf/users.auth.php.dist
index 6576eeb5f..df3c78482 100644
--- a/conf/users.auth.php.dist
+++ b/conf/users.auth.php.dist
@@ -6,5 +6,5 @@
#
# Format:
#
-# user:MD5password:Real Name:email:groups,comma,seperated
+# login:passwordhash:Real Name:email:groups,comma,seperated
diff --git a/doku.php b/doku.php
index 97e594cb3..4499bc197 100644
--- a/doku.php
+++ b/doku.php
@@ -4,6 +4,8 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @global Input $INPUT
*/
// update message version
@@ -11,13 +13,13 @@ $updateVersion = 36.1;
// xdebug_start_profiling();
-if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
+if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/');
-if (isset($_SERVER['HTTP_X_DOKUWIKI_DO'])){
+if(isset($_SERVER['HTTP_X_DOKUWIKI_DO'])) {
$ACT = trim(strtolower($_SERVER['HTTP_X_DOKUWIKI_DO']));
-} elseif (!empty($_REQUEST['idx'])) {
+} elseif(!empty($_REQUEST['idx'])) {
$ACT = 'index';
-} elseif (isset($_REQUEST['do'])) {
+} elseif(isset($_REQUEST['do'])) {
$ACT = $_REQUEST['do'];
} else {
$ACT = 'show';
@@ -27,29 +29,26 @@ if (isset($_SERVER['HTTP_X_DOKUWIKI_DO'])){
require_once(DOKU_INC.'inc/init.php');
//import variables
-$_REQUEST['id'] = str_replace("\xC2\xAD",'',$_REQUEST['id']); //soft-hyphen
-$QUERY = trim($_REQUEST['id']);
-$ID = getID();
+$_REQUEST['id'] = str_replace("\xC2\xAD", '', $INPUT->str('id')); //soft-hyphen
+$QUERY = trim($INPUT->str('id'));
+$ID = getID();
// deprecated 2011-01-14
-$NS = getNS($ID);
+$NS = getNS($ID);
-$REV = $_REQUEST['rev'];
-$IDX = $_REQUEST['idx'];
-$DATE = $_REQUEST['date'];
-$RANGE = $_REQUEST['range'];
-$HIGH = $_REQUEST['s'];
+$REV = $INPUT->int('rev');
+$IDX = $INPUT->str('idx');
+$DATE = $INPUT->int('date');
+$RANGE = $INPUT->str('range');
+$HIGH = $INPUT->param('s');
if(empty($HIGH)) $HIGH = getGoogleQuery();
-if (isset($_POST['wikitext'])) {
- $TEXT = cleanText($_POST['wikitext']);
+if($INPUT->post->has('wikitext')) {
+ $TEXT = cleanText($INPUT->post->str('wikitext'));
}
-$PRE = cleanText(substr($_POST['prefix'], 0, -1));
-$SUF = cleanText($_POST['suffix']);
-$SUM = $_REQUEST['summary'];
-
-//sanitize revision
-$REV = preg_replace('/[^0-9]/','',$REV);
+$PRE = cleanText(substr($INPUT->post->str('prefix'), 0, -1));
+$SUF = cleanText($INPUT->post->str('suffix'));
+$SUM = $INPUT->post->str('summary');
//make infos about the selected page available
$INFO = pageinfo();
@@ -58,28 +57,28 @@ $INFO = pageinfo();
$JSINFO['id'] = $ID;
$JSINFO['namespace'] = (string) $INFO['namespace'];
-
// handle debugging
-if($conf['allowdebug'] && $ACT == 'debug'){
+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) && substr($ACT,0,7) == 'export_')) ){
+ ($conf['send404'] || preg_match('/^(robots\.txt|sitemap\.xml(\.gz)?|favicon\.ico|crossdomain\.xml)$/', $ID)) &&
+ ($ACT == 'show' || (!is_array($ACT) && substr($ACT, 0, 7) == 'export_'))
+) {
header('HTTP/1.0 404 Not Found');
}
//prepare breadcrumbs (initialize a static var)
-if ($conf['breadcrumbs']) breadcrumbs();
+if($conf['breadcrumbs']) breadcrumbs();
// check upstream
checkUpdateMessages();
$tmp = array(); // No event data
-trigger_event('DOKUWIKI_STARTED',$tmp);
+trigger_event('DOKUWIKI_STARTED', $tmp);
//close session
session_write_close();
diff --git a/feed.php b/feed.php
index 98d5ef2e8..6ad371f1e 100644
--- a/feed.php
+++ b/feed.php
@@ -4,9 +4,12 @@
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @global array $conf
+ * @global Input $INPUT
*/
-if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
+if(!defined('DOKU_INC')) define('DOKU_INC', dirname(__FILE__).'/');
require_once(DOKU_INC.'inc/init.php');
//close session
@@ -17,14 +20,14 @@ $opt = rss_parseOptions();
// the feed is dynamic - we need a cache for each combo
// (but most people just use the default feed so it's still effective)
-$cache = getCacheName(join('',array_values($opt)).$_SERVER['REMOTE_USER'],'.feed');
-$key = join('', array_values($opt)) . $_SERVER['REMOTE_USER'];
+$cache = getCacheName(join('', array_values($opt)).$_SERVER['REMOTE_USER'], '.feed');
+$key = join('', array_values($opt)).$_SERVER['REMOTE_USER'];
$cache = new cache($key, '.feed');
// prepare cache depends
$depends['files'] = getConfigFiles('main');
$depends['age'] = $conf['rss_update'];
-$depends['purge'] = isset($_REQUEST['purge']);
+$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
@@ -39,34 +42,36 @@ if($cache->useCache($depends)) {
exit;
} else {
http_conditionalRequest(time());
- }
+}
// create new feed
-$rss = new DokuWikiFeedCreator();
-$rss->title = $conf['title'].(($opt['namespace']) ? ' '.$opt['namespace'] : '');
-$rss->link = DOKU_URL;
+$rss = new DokuWikiFeedCreator();
+$rss->title = $conf['title'].(($opt['namespace']) ? ' '.$opt['namespace'] : '');
+$rss->link = DOKU_URL;
$rss->syndicationURL = DOKU_URL.'feed.php';
$rss->cssStyleSheet = DOKU_URL.'lib/exe/css.php?s=feed';
-$image = new FeedImage();
+$image = new FeedImage();
$image->title = $conf['title'];
-$image->url = tpl_getMediaFile('favicon.ico', true);
-$image->link = DOKU_URL;
-$rss->image = $image;
-
-$data = null;
-$modes = array('list' => 'rssListNamespace',
- 'search' => 'rssSearch',
- 'recent' => 'rssRecentChanges');
-if (isset($modes[$opt['feed_mode']])) {
+$image->url = tpl_getMediaFile(array(':wiki:favicon.ico', ':favicon.ico', 'images/favicon.ico'), true);
+$image->link = DOKU_URL;
+$rss->image = $image;
+
+$data = null;
+$modes = array(
+ 'list' => 'rssListNamespace',
+ 'search' => 'rssSearch',
+ 'recent' => 'rssRecentChanges'
+);
+if(isset($modes[$opt['feed_mode']])) {
$data = $modes[$opt['feed_mode']]($opt);
} else {
$eventData = array(
'opt' => &$opt,
'data' => &$data,
);
- $event = new Doku_Event('FEED_MODE_UNKNOWN', $eventData);
- if ($event->advise_before(true)) {
+ $event = new Doku_Event('FEED_MODE_UNKNOWN', $eventData);
+ if($event->advise_before(true)) {
echo sprintf('<error>Unknown feed mode %s</error>', hsc($opt['feed_mode']));
exit;
}
@@ -74,7 +79,7 @@ if (isset($modes[$opt['feed_mode']])) {
}
rss_buildItems($rss, $data, $opt);
-$feed = $rss->createFeed($opt['feed_type'],'utf-8');
+$feed = $rss->createFeed($opt['feed_type'], 'utf-8');
// save cachefile
$cache->storeCache($feed);
@@ -89,51 +94,55 @@ print $feed;
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rss_parseOptions(){
+function rss_parseOptions() {
global $conf;
+ global $INPUT;
$opt = array();
foreach(array(
- // Basic feed properties
- // Plugins may probably want to add new values to these
- // properties for implementing own feeds
-
- // One of: list, search, recent
- 'feed_mode' => array('mode', 'recent'),
- // One of: diff, page, rev, current
- 'link_to' => array('linkto', $conf['rss_linkto']),
- // One of: abstract, diff, htmldiff, html
- 'item_content' => array('content', $conf['rss_content']),
-
- // Special feed properties
- // These are only used by certain feed_modes
-
- // String, used for feed title, in list and rc mode
- 'namespace' => array('ns', null),
- // Positive integer, only used in rc mode
- 'items' => array('num', $conf['recent']),
- // Boolean, only used in rc mode
- 'show_minor' => array('minor', false),
- // String, only used in search mode
- 'search_query' => array('q', null),
- // One of: pages, media, both
- 'content_type' => array('view', $conf['rss_media'])
-
- ) as $name => $val) {
- $opt[$name] = (isset($_REQUEST[$val[0]]) && !empty($_REQUEST[$val[0]]))
- ? $_REQUEST[$val[0]] : $val[1];
+ // Basic feed properties
+ // Plugins may probably want to add new values to these
+ // properties for implementing own feeds
+
+ // One of: list, search, recent
+ 'feed_mode' => array('str', 'mode', 'recent'),
+ // One of: diff, page, rev, current
+ 'link_to' => array('str', 'linkto', $conf['rss_linkto']),
+ // One of: abstract, diff, htmldiff, html
+ 'item_content' => array('str', 'content', $conf['rss_content']),
+
+ // Special feed properties
+ // These are only used by certain feed_modes
+
+ // String, used for feed title, in list and rc mode
+ 'namespace' => array('str', 'ns', null),
+ // Positive integer, only used in rc mode
+ 'items' => array('int', 'num', $conf['recent']),
+ // Boolean, only used in rc mode
+ 'show_minor' => array('bool', 'minor', false),
+ // String, only used in search mode
+ 'search_query' => array('str', 'q', null),
+ // One of: pages, media, both
+ 'content_type' => array('str', 'view', $conf['rss_media'])
+
+ ) as $name => $val) {
+ $opt[$name] = $INPUT->$val[0]($val[1], $val[2], true);
}
- $opt['items'] = max(0, (int) $opt['items']);
- $opt['show_minor'] = (bool) $opt['show_minor'];
+ $opt['items'] = max(0, (int) $opt['items']);
+ $opt['show_minor'] = (bool) $opt['show_minor'];
- $opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
+ $opt['guardmail'] = ($conf['mailguard'] != '' && $conf['mailguard'] != 'none');
- $type = valid_input_set('type', array('rss','rss2','atom','atom1','rss1',
- 'default' => $conf['rss_type']),
- $_REQUEST);
- switch ($type){
+ $type = valid_input_set(
+ 'type', array(
+ 'rss', 'rss2', 'atom', 'atom1', 'rss1',
+ 'default' => $conf['rss_type']
+ ),
+ $_REQUEST
+ );
+ switch($type) {
case 'rss':
$opt['feed_type'] = 'RSS0.91';
$opt['mime_type'] = 'text/xml';
@@ -166,26 +175,27 @@ function rss_parseOptions(){
* Add recent changed pages to a feed object
*
* @author Andreas Gohr <andi@splitbrain.org>
- * @param object $rss - the FeedCreator Object
- * @param array $data - the items to add
- * @param array $opt - the feed options
+ * @param FeedCreator $rss the FeedCreator Object
+ * @param array $data the items to add
+ * @param array $opt the feed options
*/
-function rss_buildItems(&$rss,&$data,$opt){
+function rss_buildItems(&$rss, &$data, $opt) {
global $conf;
global $lang;
+ /* @var auth_basic $auth */
global $auth;
$eventData = array(
- 'rss' => &$rss,
+ 'rss' => &$rss,
'data' => &$data,
- 'opt' => &$opt,
+ 'opt' => &$opt,
);
- $event = new Doku_Event('FEED_DATA_PROCESS', $eventData);
- if ($event->advise_before(false)){
- foreach($data as $ditem){
- if(!is_array($ditem)){
+ $event = new Doku_Event('FEED_DATA_PROCESS', $eventData);
+ if($event->advise_before(false)) {
+ foreach($data as $ditem) {
+ if(!is_array($ditem)) {
// not an array? then only a list of IDs was given
- $ditem = array( 'id' => $ditem );
+ $ditem = array('id' => $ditem);
}
$item = new FeedItem();
@@ -195,88 +205,104 @@ function rss_buildItems(&$rss,&$data,$opt){
}
// add date
- if($ditem['date']){
+ if($ditem['date']) {
$date = $ditem['date'];
- }elseif($meta['date']['modified']){
+ } elseif($meta['date']['modified']) {
$date = $meta['date']['modified'];
- }else{
+ } else {
$date = @filemtime(wikiFN($id));
}
- if($date) $item->date = date('r',$date);
+ if($date) $item->date = date('r', $date);
// add title
- if($conf['useheading'] && $meta['title']){
+ if($conf['useheading'] && $meta['title']) {
$item->title = $meta['title'];
- }else{
+ } else {
$item->title = $ditem['id'];
}
- if($conf['rss_show_summary'] && !empty($ditem['sum'])){
+ if($conf['rss_show_summary'] && !empty($ditem['sum'])) {
$item->title .= ' - '.strip_tags($ditem['sum']);
}
// add item link
- switch ($opt['link_to']){
+ switch($opt['link_to']) {
case 'page':
- if ($ditem['media']) {
- $item->link = media_managerURL(array('image' => $id,
- 'ns' => getNS($id),
- 'rev' => $date), '&', true);
+ if($ditem['media']) {
+ $item->link = media_managerURL(
+ array(
+ 'image' => $id,
+ 'ns' => getNS($id),
+ 'rev' => $date
+ ), '&', true
+ );
} else {
- $item->link = wl($id,'rev='.$date,true,'&', true);
+ $item->link = wl($id, 'rev='.$date, true, '&', true);
}
break;
case 'rev':
- if ($ditem['media']) {
- $item->link = media_managerURL(array('image' => $id,
- 'ns' => getNS($id),
- 'rev' => $date,
- 'tab_details' => 'history'), '&', true);
+ if($ditem['media']) {
+ $item->link = media_managerURL(
+ array(
+ 'image' => $id,
+ 'ns' => getNS($id),
+ 'rev' => $date,
+ 'tab_details' => 'history'
+ ), '&', true
+ );
} else {
- $item->link = wl($id,'do=revisions&rev='.$date,true,'&');
+ $item->link = wl($id, 'do=revisions&rev='.$date, true, '&');
}
break;
case 'current':
- if ($ditem['media']) {
- $item->link = media_managerURL(array('image' => $id,
- 'ns' => getNS($id)), '&', true);
+ if($ditem['media']) {
+ $item->link = media_managerURL(
+ array(
+ 'image' => $id,
+ 'ns' => getNS($id)
+ ), '&', true
+ );
} else {
- $item->link = wl($id, '', true,'&');
+ $item->link = wl($id, '', true, '&');
}
break;
case 'diff':
default:
- if ($ditem['media']) {
- $item->link = media_managerURL(array('image' => $id,
- 'ns' => getNS($id),
- 'rev' => $date,
- 'tab_details' => 'history',
- 'mediado' => 'diff'), '&', true);
+ if($ditem['media']) {
+ $item->link = media_managerURL(
+ array(
+ 'image' => $id,
+ 'ns' => getNS($id),
+ 'rev' => $date,
+ 'tab_details' => 'history',
+ 'mediado' => 'diff'
+ ), '&', true
+ );
} else {
- $item->link = wl($id,'rev='.$date.'&do=diff',true,'&');
+ $item->link = wl($id, 'rev='.$date.'&do=diff', true, '&');
}
}
// add item content
- switch ($opt['item_content']){
+ switch($opt['item_content']) {
case 'diff':
case 'htmldiff':
- if ($ditem['media']) {
- $revs = getRevisions($id, 0, 1, 8192, true);
- $rev = $revs[0];
+ if($ditem['media']) {
+ $revs = getRevisions($id, 0, 1, 8192, true);
+ $rev = $revs[0];
$src_r = '';
$src_l = '';
- if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) {
- $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
+ if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)), 300)) {
+ $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
$src_r = ml($id, $more);
}
- if ($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)){
- $more = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1];
+ if($rev && $size = media_image_preview_size($id, $rev, new JpegMeta(mediaFN($id, $rev)), 300)) {
+ $more = 'rev='.$rev.'&w='.$size[0].'&h='.$size[1];
$src_l = ml($id, $more);
}
$content = '';
- if ($src_r) {
- $content = '<table>';
+ if($src_r) {
+ $content = '<table>';
$content .= '<tr><th width="50%">'.$rev.'</th>';
$content .= '<th width="50%">'.$lang['current'].'</th></tr>';
$content .= '<tr align="center"><td><img src="'.$src_l.'" alt="" /></td><td>';
@@ -287,57 +313,61 @@ function rss_buildItems(&$rss,&$data,$opt){
} else {
require_once(DOKU_INC.'inc/DifferenceEngine.php');
$revs = getRevisions($id, 0, 1);
- $rev = $revs[0];
-
- if($rev){
- $df = new Diff(explode("\n",htmlspecialchars(rawWiki($id,$rev))),
- explode("\n",htmlspecialchars(rawWiki($id,''))));
- }else{
- $df = new Diff(array(''),
- explode("\n",htmlspecialchars(rawWiki($id,''))));
+ $rev = $revs[0];
+
+ if($rev) {
+ $df = new Diff(explode("\n", htmlspecialchars(rawWiki($id, $rev))),
+ explode("\n", htmlspecialchars(rawWiki($id, ''))));
+ } else {
+ $df = new Diff(array(''),
+ explode("\n", htmlspecialchars(rawWiki($id, ''))));
}
- if($opt['item_content'] == 'htmldiff'){
- $tdf = new TableDiffFormatter();
- $content = '<table>';
+ if($opt['item_content'] == 'htmldiff') {
+ $tdf = new TableDiffFormatter();
+ $content = '<table>';
$content .= '<tr><th colspan="2" width="50%">'.$rev.'</th>';
$content .= '<th colspan="2" width="50%">'.$lang['current'].'</th></tr>';
$content .= $tdf->format($df);
$content .= '</table>';
- }else{
- $udf = new UnifiedDiffFormatter();
+ } else {
+ $udf = new UnifiedDiffFormatter();
$content = "<pre>\n".$udf->format($df)."\n</pre>";
}
}
break;
case 'html':
- if ($ditem['media']) {
- if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
- $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
- $src = ml($id, $more);
+ if($ditem['media']) {
+ if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
+ $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
+ $src = ml($id, $more);
$content = '<img src="'.$src.'" alt="'.$id.'" />';
} else {
$content = '';
}
} else {
- $content = p_wiki_xhtml($id,$date,false);
+ $content = p_wiki_xhtml($id, $date, false);
// no TOC in feeds
- $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s','',$content);
+ $content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s', '', $content);
+
+ // add alignment for images
+ $content = preg_replace('/(<img .*?class="medialeft")/s', '\\1 align="left"', $content);
+ $content = preg_replace('/(<img .*?class="mediaright")/s', '\\1 align="right"', $content);
// make URLs work when canonical is not set, regexp instead of rerendering!
- if(!$conf['canonical']){
- $base = preg_quote(DOKU_REL,'/');
- $content = preg_replace('/(<a href|<img src)="('.$base.')/s','$1="'.DOKU_URL,$content);
+ if(!$conf['canonical']) {
+ $base = preg_quote(DOKU_REL, '/');
+ $content = preg_replace('/(<a href|<img src)="('.$base.')/s', '$1="'.DOKU_URL, $content);
}
}
break;
case 'abstract':
default:
- if ($ditem['media']) {
- if ($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
- $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
- $src = ml($id, $more);
+ if($ditem['media']) {
+ if($size = media_image_preview_size($id, false, new JpegMeta(mediaFN($id)))) {
+ $more = 'w='.$size[0].'&h='.$size[1].'t='.@filemtime(mediaFN($id));
+ $src = ml($id, $more);
$content = '<img src="'.$src.'" alt="'.$id.'" />';
} else {
$content = '';
@@ -350,12 +380,12 @@ function rss_buildItems(&$rss,&$data,$opt){
// add user
# FIXME should the user be pulled from metadata as well?
- $user = @$ditem['user']; // the @ spares time repeating lookup
+ $user = @$ditem['user']; // the @ spares time repeating lookup
$item->author = '';
- if($user && $conf['useacl'] && $auth){
+ if($user && $conf['useacl'] && $auth) {
$userInfo = $auth->getUserData($user);
- if ($userInfo){
- switch ($conf['showuseras']){
+ if($userInfo) {
+ switch($conf['showuseras']) {
case 'username':
$item->author = $userInfo['name'];
break;
@@ -366,35 +396,37 @@ function rss_buildItems(&$rss,&$data,$opt){
} else {
$item->author = $user;
}
- if($userInfo && !$opt['guardmail']){
+ if($userInfo && !$opt['guardmail']) {
$item->authorEmail = $userInfo['mail'];
- }else{
+ } else {
//cannot obfuscate because some RSS readers may check validity
$item->authorEmail = $user.'@'.$ditem['ip'];
}
- }elseif($user){
+ } elseif($user) {
// this happens when no ACL but some Apache auth is used
$item->author = $user;
$item->authorEmail = $user.'@'.$ditem['ip'];
- }else{
+ } else {
$item->authorEmail = 'anonymous@'.$ditem['ip'];
}
// add category
if(isset($meta['subject'])) {
$item->category = $meta['subject'];
- }else{
+ } else {
$cat = getNS($id);
if($cat) $item->category = $cat;
}
// finally add the item to the feed object, after handing it to registered plugins
- $evdata = array('item' => &$item,
- 'opt' => &$opt,
- 'ditem' => &$ditem,
- 'rss' => &$rss);
- $evt = new Doku_Event('FEED_ITEM_ADD', $evdata);
- if ($evt->advise_before()){
+ $evdata = array(
+ 'item' => &$item,
+ 'opt' => &$opt,
+ 'ditem' => &$ditem,
+ 'rss' => &$rss
+ );
+ $evt = new Doku_Event('FEED_ITEM_ADD', $evdata);
+ if($evt->advise_before()) {
$rss->addItem($item);
}
$evt->advise_after(); // for completeness
@@ -403,20 +435,19 @@ function rss_buildItems(&$rss,&$data,$opt){
$event->advise_after();
}
-
/**
* Add recent changed pages to the feed object
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rssRecentChanges($opt){
+function rssRecentChanges($opt) {
global $conf;
$flags = RECENTS_SKIP_DELETED;
if(!$opt['show_minor']) $flags += RECENTS_SKIP_MINORS;
if($opt['content_type'] == 'media' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_CHANGES;
if($opt['content_type'] == 'both' && $conf['mediarevisions']) $flags += RECENTS_MEDIA_PAGES_MIXED;
- $recents = getRecents(0,$opt['items'],$opt['namespace'],$flags);
+ $recents = getRecents(0, $opt['items'], $opt['namespace'], $flags);
return $recents;
}
@@ -425,16 +456,16 @@ function rssRecentChanges($opt){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rssListNamespace($opt){
+function rssListNamespace($opt) {
require_once(DOKU_INC.'inc/search.php');
global $conf;
- $ns=':'.cleanID($opt['namespace']);
- $ns=str_replace(':','/',$ns);
+ $ns = ':'.cleanID($opt['namespace']);
+ $ns = str_replace(':', '/', $ns);
$data = array();
sort($data);
- search($data,$conf['datadir'],'search_list','',$ns);
+ search($data, $conf['datadir'], 'search_list', '', $ns);
return $data;
}
@@ -444,11 +475,11 @@ function rssListNamespace($opt){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rssSearch($opt){
- if(!$opt['search_query']) return;
+function rssSearch($opt) {
+ if(!$opt['search_query']) return array();
require_once(DOKU_INC.'inc/fulltext.php');
- $data = ft_pageSearch($opt['search_query'],$poswords);
+ $data = ft_pageSearch($opt['search_query'], $poswords);
$data = array_keys($data);
return $data;
diff --git a/inc/DifferenceEngine.php b/inc/DifferenceEngine.php
index 0a7ce8e7c..1b68cf6d3 100644
--- a/inc/DifferenceEngine.php
+++ b/inc/DifferenceEngine.php
@@ -1039,8 +1039,8 @@ class TableDiffFormatter extends DiffFormatter {
// 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(' ','&nbsp; ', $val);
- $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&nbsp;', $val);
+ $val = str_replace(' ','&#160; ', $val);
+ $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&#160;', $val);
return $val;
}
@@ -1078,7 +1078,7 @@ class TableDiffFormatter extends DiffFormatter {
}
function emptyLine() {
- return '<td colspan="2">&nbsp;</td>';
+ return '<td colspan="2">&#160;</td>';
}
function contextLine($line) {
@@ -1132,8 +1132,8 @@ class InlineDiffFormatter extends DiffFormatter {
// 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(' ','&nbsp; ', $val);
- $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&nbsp;', $val);
+ $val = str_replace(' ','&#160; ', $val);
+ $val = preg_replace('/ (?=<)|(?<=[ >]) /', '&#160;', $val);
return $val;
}
diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php
index 26bee52a7..a25846c31 100644
--- a/inc/HTTPClient.php
+++ b/inc/HTTPClient.php
@@ -61,6 +61,8 @@ class DokuHTTPClient extends HTTPClient {
}
+class HTTPClientException extends Exception { }
+
/**
* This class implements a basic HTTP client
*
@@ -227,7 +229,7 @@ class HTTPClient {
$path = $uri['path'];
if(empty($path)) $path = '/';
if(!empty($uri['query'])) $path .= '?'.$uri['query'];
- if(isset($uri['port']) && !empty($uri['port'])) $port = $uri['port'];
+ if(!empty($uri['port'])) $port = $uri['port'];
if(isset($uri['user'])) $this->user = $uri['user'];
if(isset($uri['pass'])) $this->pass = $uri['pass'];
@@ -249,7 +251,7 @@ class HTTPClient {
// prepare headers
$headers = $this->headers;
$headers['Host'] = $uri['host'];
- if($uri['port']) $headers['Host'].= ':'.$uri['port'];
+ if(!empty($uri['port'])) $headers['Host'].= ':'.$uri['port'];
$headers['User-Agent'] = $this->agent;
$headers['Referer'] = $this->referer;
if ($this->keep_alive) {
@@ -279,16 +281,13 @@ class HTTPClient {
$headers['Proxy-Authorization'] = 'Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass);
}
- // stop time
- $start = time();
-
// already connected?
$connectionId = $this->_uniqueConnectionId($server,$port);
- $this->_debug('connection pool', $this->connections);
+ $this->_debug('connection pool', self::$connections);
$socket = null;
- if (isset($this->connections[$connectionId])) {
+ if (isset(self::$connections[$connectionId])) {
$this->_debug('reusing connection', $connectionId);
- $socket = $this->connections[$connectionId];
+ $socket = self::$connections[$connectionId];
}
if (is_null($socket) || feof($socket)) {
$this->_debug('opening connection', $connectionId);
@@ -302,222 +301,161 @@ class HTTPClient {
// keep alive?
if ($this->keep_alive) {
- $this->connections[$connectionId] = $socket;
+ self::$connections[$connectionId] = $socket;
} else {
- unset($this->connections[$connectionId]);
- }
- }
-
- //set blocking
- stream_set_blocking($socket,1);
-
- // 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);
-
- // select parameters
- $sel_r = null;
- $sel_w = array($socket);
- $sel_e = null;
-
- // send request
- $towrite = strlen($request);
- $written = 0;
- while($written < $towrite){
- // check timeout
- if(time()-$start > $this->timeout){
- $this->status = -100;
- $this->error = sprintf('Timeout while sending request (%.3fs)',$this->_time() - $this->start);
- unset($this->connections[$connectionId]);
- return false;
- }
-
- // wait for stream ready or timeout (1sec)
- if(@stream_select($sel_r,$sel_w,$sel_e,1) === false){
- usleep(1000);
- continue;
- }
-
- // write to stream
- $ret = fwrite($socket, substr($request,$written,4096));
- if($ret === false){
- $this->status = -100;
- $this->error = 'Failed writing to socket';
- unset($this->connections[$connectionId]);
- return false;
+ unset(self::$connections[$connectionId]);
}
- $written += $ret;
}
- // continue non-blocking
- stream_set_blocking($socket,0);
-
- // read headers from socket
- $r_headers = '';
- do{
- if(time()-$start > $this->timeout){
- $this->status = -100;
- $this->error = sprintf('Timeout while reading headers (%.3fs)',$this->_time() - $this->start);
- unset($this->connections[$connectionId]);
- return false;
- }
- if(feof($socket)){
- $this->error = 'Premature End of File (socket)';
- unset($this->connections[$connectionId]);
- return false;
- }
- usleep(1000);
- $r_headers .= fgets($socket,1024);
- }while(!preg_match('/\r?\n\r?\n$/',$r_headers));
-
- $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){
- $this->error = 'Reported content length exceeds allowed response size';
- if ($this->max_bodysize_abort)
- unset($this->connections[$connectionId]);
- return false;
+ try {
+ //set non-blocking
+ stream_set_blocking($socket, false);
+
+ // build request
+ $request = "$method $request_url HTTP/".$this->http.HTTP_NL;
+ $request .= $this->_buildHeaders($headers);
+ $request .= $this->_getCookies();
+ $request .= HTTP_NL;
+ $request .= $data;
+
+ $this->_debug('request',$request);
+ $this->_sendData($socket, $request, 'request');
+
+ // read headers from socket
+ $r_headers = '';
+ do{
+ $r_line = $this->_readLine($socket, 'headers');
+ $r_headers .= $r_line;
+ }while($r_line != "\r\n" && $r_line != "\n");
+
+ $this->_debug('response headers',$r_headers);
+
+ // check if expected body size exceeds allowance
+ if($this->max_bodysize && preg_match('/\r?\nContent-Length:\s*(\d+)\r?\n/i',$r_headers,$match)){
+ if($match[1] > $this->max_bodysize){
+ if ($this->max_bodysize_abort)
+ throw new HTTPClientException('Reported content length exceeds allowed response size');
+ else
+ $this->error = 'Reported content length exceeds allowed response size';
+ }
}
- }
- // get Status
- if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m)) {
- $this->error = 'Server returned bad answer';
- unset($this->connections[$connectionId]);
- return false;
- }
- $this->status = $m[2];
-
- // handle headers and cookies
- $this->resp_headers = $this->_parseHeaders($r_headers);
- if(isset($this->resp_headers['set-cookie'])){
- foreach ((array) $this->resp_headers['set-cookie'] as $cookie){
- list($cookie) = explode(';',$cookie,2);
- list($key,$val) = explode('=',$cookie,2);
- $key = trim($key);
- if($val == 'deleted'){
- if(isset($this->cookies[$key])){
- unset($this->cookies[$key]);
+ // get Status
+ if (!preg_match('/^HTTP\/(\d\.\d)\s*(\d+).*?\n/', $r_headers, $m))
+ throw new HTTPClientException('Server returned bad answer');
+
+ $this->status = $m[2];
+
+ // handle headers and cookies
+ $this->resp_headers = $this->_parseHeaders($r_headers);
+ if(isset($this->resp_headers['set-cookie'])){
+ foreach ((array) $this->resp_headers['set-cookie'] as $cookie){
+ list($cookie) = explode(';',$cookie,2);
+ list($key,$val) = explode('=',$cookie,2);
+ $key = trim($key);
+ if($val == 'deleted'){
+ if(isset($this->cookies[$key])){
+ unset($this->cookies[$key]);
+ }
+ }elseif($key){
+ $this->cookies[$key] = $val;
}
- }elseif($key){
- $this->cookies[$key] = $val;
}
}
- }
-
- $this->_debug('Object headers',$this->resp_headers);
- // check server status code to follow redirect
- if($this->status == 301 || $this->status == 302 ){
- // close the connection because we don't handle content retrieval here
- // that's the easiest way to clean up the connection
- fclose($socket);
- unset($this->connections[$connectionId]);
+ $this->_debug('Object headers',$this->resp_headers);
- if (empty($this->resp_headers['location'])){
- $this->error = 'Redirect but no Location Header found';
- return false;
- }elseif($this->redirect_count == $this->max_redirect){
- $this->error = 'Maximum number of redirects exceeded';
- return false;
- }else{
- $this->redirect_count++;
- $this->referer = $url;
- // handle non-RFC-compliant relative redirects
- if (!preg_match('/^http/i', $this->resp_headers['location'])){
- if($this->resp_headers['location'][0] != '/'){
- $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
- dirname($uri['path']).'/'.$this->resp_headers['location'];
- }else{
- $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
- $this->resp_headers['location'];
+ // check server status code to follow redirect
+ if($this->status == 301 || $this->status == 302 ){
+ if (empty($this->resp_headers['location'])){
+ throw new HTTPClientException('Redirect but no Location Header found');
+ }elseif($this->redirect_count == $this->max_redirect){
+ throw new HTTPClientException('Maximum number of redirects exceeded');
+ }else{
+ // close the connection because we don't handle content retrieval here
+ // that's the easiest way to clean up the connection
+ fclose($socket);
+ unset(self::$connections[$connectionId]);
+
+ $this->redirect_count++;
+ $this->referer = $url;
+ // handle non-RFC-compliant relative redirects
+ if (!preg_match('/^http/i', $this->resp_headers['location'])){
+ if($this->resp_headers['location'][0] != '/'){
+ $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
+ dirname($uri['path']).'/'.$this->resp_headers['location'];
+ }else{
+ $this->resp_headers['location'] = $uri['scheme'].'://'.$uri['host'].':'.$uri['port'].
+ $this->resp_headers['location'];
+ }
}
+ // perform redirected request, always via GET (required by RFC)
+ return $this->sendRequest($this->resp_headers['location'],array(),'GET');
}
- // perform redirected request, always via GET (required by RFC)
- return $this->sendRequest($this->resp_headers['location'],array(),'GET');
}
- }
- // check if headers are as expected
- if($this->header_regexp && !preg_match($this->header_regexp,$r_headers)){
- $this->error = 'The received headers did not match the given regexp';
- unset($this->connections[$connectionId]);
- return false;
- }
+ // 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(preg_match('/transfer\-(en)?coding:\s*chunked\r\n/i',$r_headers)){
- do {
- unset($chunk_size);
+ //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 {
- if(feof($socket)){
- $this->error = 'Premature End of File (socket)';
- unset($this->connections[$connectionId]);
- return false;
+ $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');
}
- if(time()-$start > $this->timeout){
- $this->status = -100;
- $this->error = sprintf('Timeout while reading chunk (%.3fs)',$this->_time() - $this->start);
- unset($this->connections[$connectionId]);
- return false;
+ $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;
}
- $byte = fread($socket,1);
- $chunk_size .= $byte;
- } while (preg_match('/[a-zA-Z0-9]/',$byte)); // read chunksize including \r
-
- $byte = fread($socket,1); // readtrailing \n
- $chunk_size = hexdec($chunk_size);
- if ($chunk_size) {
- $this_chunk = fread($socket,$chunk_size);
- $r_body .= $this_chunk;
- $byte = fread($socket,2); // read trailing \r\n
- }
- if($this->max_bodysize && strlen($r_body) > $this->max_bodysize){
- $this->error = 'Allowed response size exceeded';
- if ($this->max_bodysize_abort){
- unset($this->connections[$connectionId]);
- return false;
- } else {
- break;
+ if ($chunk_size > 0) {
+ $r_body .= $this->_readData($socket, $chunk_size, 'chunk');
+ $byte = $this->_readData($socket, 2, 'chunk'); // read trailing \r\n
}
- }
- } while ($chunk_size);
- }else{
- // read entire socket
- while (!feof($socket)) {
- if(time()-$start > $this->timeout){
- $this->status = -100;
- $this->error = sprintf('Timeout while reading response (%.3fs)',$this->_time() - $this->start);
- unset($this->connections[$connectionId]);
- return false;
- }
- $r_body .= fread($socket,4096);
- $r_size = strlen($r_body);
- if($this->max_bodysize && $r_size > $this->max_bodysize){
- $this->error = 'Allowed response size exceeded';
+ } while ($chunk_size && !$abort);
+ }elseif($this->max_bodysize){
+ // read just over the max_bodysize
+ $r_body = $this->_readData($socket, $this->max_bodysize+1, 'response', true);
+ if(strlen($r_body) > $this->max_bodysize){
if ($this->max_bodysize_abort) {
- unset($this->connections[$connectionId]);
- return false;
+ throw new HTTPClientException('Allowed response size exceeded');
} else {
- break;
+ $this->error = 'Allowed response size exceeded';
}
}
- if(isset($this->resp_headers['content-length']) &&
- !isset($this->resp_headers['transfer-encoding']) &&
- $this->resp_headers['content-length'] == $r_size){
- // we read the content-length, finish here
- break;
+ }elseif(isset($this->resp_headers['content-length']) &&
+ !isset($this->resp_headers['transfer-encoding'])){
+ // read up to the content-length
+ $r_body = $this->_readData($socket, $this->resp_headers['content-length'], 'response', true);
+ }else{
+ // read entire socket
+ $r_size = 0;
+ while (!feof($socket)) {
+ $r_body .= $this->_readData($socket, 4096, 'response', true);
}
}
+
+ } 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 ||
@@ -525,7 +463,7 @@ class HTTPClient {
// close socket
$status = socket_get_status($socket);
fclose($socket);
- unset($this->connections[$connectionId]);
+ unset(self::$connections[$connectionId]);
}
// decode gzip if needed
@@ -547,6 +485,126 @@ class HTTPClient {
}
/**
+ * Safely write data to a socket
+ *
+ * @param handle $socket An open socket handle
+ * @param string $data The data to write
+ * @param string $message Description of what is being read
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ function _sendData($socket, $data, $message) {
+ // select parameters
+ $sel_r = null;
+ $sel_w = array($socket);
+ $sel_e = null;
+
+ // send request
+ $towrite = strlen($data);
+ $written = 0;
+ while($written < $towrite){
+ // check timeout
+ $time_used = $this->_time() - $this->start;
+ if($time_used > $this->timeout)
+ throw new HTTPClientException(sprintf('Timeout while sending %s (%.3fs)',$message, $time_used), -100);
+ if(feof($socket))
+ throw new HTTPClientException("Socket disconnected while writing $message");
+
+ // wait for stream ready or timeout
+ self::selecttimeout($this->timeout - $time_used, $sec, $usec);
+ if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
+ // 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 handle $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
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ function _readData($socket, $nbytes, $message, $ignore_eof = false) {
+ // select parameters
+ $sel_r = array($socket);
+ $sel_w = null;
+ $sel_e = null;
+
+ $r_data = '';
+ // Does not return immediately so timeout and eof can be checked
+ if ($nbytes < 0) $nbytes = 0;
+ $to_read = $nbytes;
+ do {
+ $time_used = $this->_time() - $this->start;
+ if ($time_used > $this->timeout)
+ throw new HTTPClientException(
+ sprintf('Timeout while reading %s (%.3fs)', $message, $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) {
+ // wait for stream ready or timeout
+ self::selecttimeout($this->timeout - $time_used, $sec, $usec);
+ if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
+ $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 handle $socket An open socket handle in non-blocking mode
+ * @param string $message Description of what is being read
+ * @author Tom N Harris <tnharris@whoopdedo.org>
+ */
+ function _readLine($socket, $message) {
+ // select parameters
+ $sel_r = array($socket);
+ $sel_w = null;
+ $sel_e = null;
+
+ $r_data = '';
+ do {
+ $time_used = $this->_time() - $this->start;
+ if ($time_used > $this->timeout)
+ throw new HTTPClientException(
+ sprintf('Timeout while reading %s (%.3fs)', $message, $time_used),
+ -100);
+ if(feof($socket))
+ throw new HTTPClientException("Premature End of File (socket) while reading $message");
+
+ // wait for stream ready or timeout
+ self::selecttimeout($this->timeout - $time_used, $sec, $usec);
+ if(@stream_select($sel_r, $sel_w, $sel_e, $sec, $usec) !== false){
+ $r_data = fgets($socket, 1024);
+ }
+ } while (!preg_match('/\n$/',$r_data));
+ return $r_data;
+ }
+
+ /**
* print debug info
*
* @author Andreas Gohr <andi@splitbrain.org>
@@ -566,12 +624,20 @@ class HTTPClient {
/**
* Return current timestamp in microsecond resolution
*/
- function _time(){
+ static function _time(){
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
/**
+ * Calculate seconds and microseconds
+ */
+ static function selecttimeout($time, &$sec, &$usec){
+ $sec = floor($time);
+ $usec = (int)(($time - $sec) * 1000000);
+ }
+
+ /**
* convert given header string to Header array
*
* All Keys are lowercased.
@@ -583,7 +649,7 @@ class HTTPClient {
$lines = explode("\n",$string);
array_shift($lines); //skip first line (status)
foreach($lines as $line){
- list($key, $val) = explode(':',$line,2);
+ @list($key, $val) = explode(':',$line,2);
$key = trim($key);
$val = trim($val);
$key = strtolower($key);
diff --git a/inc/Input.class.php b/inc/Input.class.php
new file mode 100644
index 000000000..f4174404a
--- /dev/null
+++ b/inc/Input.class.php
@@ -0,0 +1,229 @@
+<?php
+
+/**
+ * Encapsulates access to the $_REQUEST array, making sure used parameters are initialized and
+ * have the correct type.
+ *
+ * All function access the $_REQUEST array by default, if you want to access $_POST or $_GET
+ * explicitly use the $post and $get members.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+class Input {
+
+ /** @var PostInput Access $_POST parameters */
+ public $post;
+ /** @var GetInput Access $_GET parameters */
+ public $get;
+
+ protected $access;
+
+ /**
+ * Intilizes the Input class and it subcomponents
+ */
+ function __construct() {
+ $this->access = &$_REQUEST;
+ $this->post = new PostInput();
+ $this->get = new GetInput();
+ }
+
+ /**
+ * 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
+ * @return bool
+ */
+ 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;
+ if($nonempty && empty($this->access[$name])) return $default;
+ return $this->access[$name];
+ }
+
+ /**
+ * 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
+ */
+ 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 mixed $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;
+ if($this->access[$name] === '') return $default;
+ if($nonempty && empty($this->access[$name])) return $default;
+
+ return (int) $this->access[$name];
+ }
+
+ /**
+ * Access a request parameter as string
+ *
+ * @param string $name Parameter name
+ * @param mixed $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;
+ if($nonempty && empty($this->access[$name])) return $default;
+
+ return (string) $this->access[$name];
+ }
+
+ /**
+ * 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;
+ if($this->access[$name] === '') return $default;
+ if($nonempty && empty($this->access[$name])) return $default;
+
+ return (bool) $this->access[$name];
+ }
+
+ /**
+ * Access a request parameter as array
+ *
+ * @param string $name Parameter name
+ * @param mixed $default Default to return if parameter isn't set
+ * @param bool $nonempty Return $default if parameter is set but empty()
+ * @return array
+ */
+ public function arr($name, $default = array(), $nonempty = false) {
+ if(!isset($this->access[$name])) return $default;
+ if(!is_array($this->access[$name])) return $default;
+ if($nonempty && empty($this->access[$name])) return $default;
+
+ return (array) $this->access[$name];
+ }
+
+}
+
+/**
+ * Internal class used for $_POST access in Input class
+ */
+class PostInput extends Input {
+ protected $access;
+
+ /**
+ * Initialize the $access array, remove subclass members
+ */
+ function __construct() {
+ $this->access = &$_POST;
+ }
+
+ /**
+ * Sets a parameter in $_POST and $_REQUEST
+ *
+ * @param string $name Parameter name
+ * @param mixed $value Value to set
+ */
+ public function set($name, $value) {
+ parent::set($name, $value);
+ $_REQUEST[$name] = $value;
+ }
+}
+
+/**
+ * Internal class used for $_GET access in Input class
+
+ */
+class GetInput extends Input {
+ protected $access;
+
+ /**
+ * Initialize the $access array, remove subclass members
+ */
+ function __construct() {
+ $this->access = &$_GET;
+ }
+
+ /**
+ * Sets a parameter in $_GET and $_REQUEST
+ *
+ * @param string $name Parameter name
+ * @param mixed $value Value to set
+ */
+ public function set($name, $value) {
+ parent::set($name, $value);
+ $_REQUEST[$name] = $value;
+ }
+}
diff --git a/inc/JpegMeta.php b/inc/JpegMeta.php
index 5c043fb6b..ac29bca66 100644
--- a/inc/JpegMeta.php
+++ b/inc/JpegMeta.php
@@ -2972,7 +2972,7 @@ class JpegMeta {
elseif ($c == 62)
$ascii .= '&gt;';
elseif ($c == 32)
- $ascii .= '&nbsp;';
+ $ascii .= '&#160;';
elseif ($c > 32)
$ascii .= chr($c);
else
diff --git a/inc/Mailer.class.php b/inc/Mailer.class.php
index 507150d00..c85e61395 100644
--- a/inc/Mailer.class.php
+++ b/inc/Mailer.class.php
@@ -11,20 +11,24 @@
// end of line for mail lines - RFC822 says CRLF but postfix (and other MTAs?)
// think different
-if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL',"\n");
+if(!defined('MAILHEADER_EOL')) define('MAILHEADER_EOL', "\n");
#define('MAILHEADER_ASCIIONLY',1);
+/**
+ * Mail Handling
+ */
class Mailer {
- protected $headers = array();
- protected $attach = array();
- protected $html = '';
- protected $text = '';
+ protected $headers = array();
+ protected $attach = array();
+ protected $html = '';
+ protected $text = '';
- protected $boundary = '';
- protected $partid = '';
- protected $sendparam= null;
+ protected $boundary = '';
+ protected $partid = '';
+ protected $sendparam = null;
+ /** @var EmailAddressValidator */
protected $validator = null;
protected $allowhtml = true;
@@ -33,38 +37,38 @@ class Mailer {
*
* Initializes the boundary strings and part counters
*/
- public function __construct(){
+ public function __construct() {
global $conf;
- $server = parse_url(DOKU_URL,PHP_URL_HOST);
+ $server = parse_url(DOKU_URL, PHP_URL_HOST);
- $this->partid = md5(uniqid(rand(),true)).'@'.$server;
- $this->boundary = '----------'.md5(uniqid(rand(),true));
+ $this->partid = md5(uniqid(rand(), true)).'@'.$server;
+ $this->boundary = '----------'.md5(uniqid(rand(), true));
- $listid = join('.',array_reverse(explode('/',DOKU_BASE))).$server;
- $listid = strtolower(trim($listid,'.'));
+ $listid = join('.', array_reverse(explode('/', DOKU_BASE))).$server;
+ $listid = strtolower(trim($listid, '.'));
- $this->allowhtml = (bool) $conf['htmlmail'];
+ $this->allowhtml = (bool)$conf['htmlmail'];
// add some default headers for mailfiltering FS#2247
- $this->setHeader('X-Mailer','DokuWiki '.getVersion());
+ $this->setHeader('X-Mailer', 'DokuWiki '.getVersion());
$this->setHeader('X-DokuWiki-User', $_SERVER['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('List-Id', $conf['title'].' <'.$listid.'>');
}
/**
* Attach a file
*
- * @param $path Path to the file to attach
- * @param $mime Mimetype of the attached file
- * @param $name The filename to use
- * @param $embed Unique key to reference this file from the HTML part
+ * @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){
+ public function attachFile($path, $mime, $name = '', $embed = '') {
+ if(!$name) {
$name = basename($path);
}
@@ -79,14 +83,14 @@ class Mailer {
/**
* Attach a file
*
- * @param $path The file contents to attach
- * @param $mime Mimetype of the attached file
- * @param $name The filename to use
- * @param $embed Unique key to reference this file from the HTML part
+ * @param string $data The file contents to attach
+ * @param string $mime Mimetype of the attached file
+ * @param string $name The filename to use
+ * @param string $embed Unique key to reference this file from the HTML part
*/
- public function attachContent($data,$mime,$name='',$embed=''){
- if(!$name){
- list($junk,$ext) = split('/',$mime);
+ public function attachContent($data, $mime, $name = '', $embed = '') {
+ if(!$name) {
+ list(, $ext) = explode('/', $mime);
$name = count($this->attach).".$ext";
}
@@ -101,18 +105,18 @@ class Mailer {
/**
* Callback function to automatically embed images referenced in HTML templates
*/
- protected function autoembed_cb($matches){
+ protected function autoembed_cb($matches) {
static $embeds = 0;
$embeds++;
// get file and mime type
$media = cleanID($matches[1]);
- list($ext, $mime) = mimetype($media);
- $file = mediaFN($media);
+ list(, $mime) = mimetype($media);
+ $file = mediaFN($media);
if(!file_exists($file)) return $matches[0]; //bad reference, keep as is
// attach it and set placeholder
- $this->attachFile($file,$mime,'','autoembed'.$embeds);
+ $this->attachFile($file, $mime, '', 'autoembed'.$embeds);
return '%%autoembed'.$embeds.'%%';
}
@@ -125,18 +129,18 @@ class Mailer {
* @param 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('/[^\w \-\.\+\@]+/','',$header);
- $value = preg_replace('/[^\w \-\.\+\@<>]+/','',$value);
+ 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
$value = trim($value);
- if($value === ''){
+ if($value === '') {
if(isset($this->headers[$header])) unset($this->headers[$header]);
- }else{
+ } else {
$this->headers[$header] = $value;
}
}
@@ -147,7 +151,7 @@ class Mailer {
* 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
*/
- public function setParameters($param){
+ public function setParameters($param) {
$this->sendparam = $param;
}
@@ -166,38 +170,40 @@ class Mailer {
* @param array $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){
+ public function setBody($text, $textrep = null, $htmlrep = null, $html = null, $wrap = true) {
global $INFO;
global $conf;
- $htmlrep = (array) $htmlrep;
- $textrep = (array) $textrep;
+ $htmlrep = (array)$htmlrep;
+ $textrep = (array)$textrep;
// create HTML from text if not given
- if(is_null($html)){
+ if(is_null($html)) {
$html = $text;
$html = hsc($html);
- $html = preg_replace('/^-----*$/m','<hr >',$html);
+ $html = preg_replace('/^-----*$/m', '<hr >', $html);
$html = nl2br($html);
}
- if($wrap){
- $wrap = rawLocale('mailwrap','html');
- $html = preg_replace('/\n-- <br \/>.*$/s','',$html); //strip signature
- $html = str_replace('@HTMLBODY@',$html,$wrap);
+ if($wrap) {
+ $wrap = rawLocale('mailwrap', 'html');
+ $html = preg_replace('/\n-- <br \/>.*$/s', '', $html); //strip signature
+ $html = str_replace('@HTMLBODY@', $html, $wrap);
}
// copy over all replacements missing for HTML (autolink URLs)
- foreach($textrep as $key => $value){
+ foreach($textrep as $key => $value) {
if(isset($htmlrep[$key])) continue;
- if(preg_match('/^https?:\/\//i',$value)){
+ if(preg_match('/^https?:\/\//i', $value)) {
$htmlrep[$key] = '<a href="'.hsc($value).'">'.hsc($value).'</a>';
- }else{
+ } else {
$htmlrep[$key] = hsc($value);
}
}
// embed media from templates
- $html = preg_replace_callback('/@MEDIA\(([^\)]+)\)@/',
- array($this,'autoembed_cb'),$html);
+ $html = preg_replace_callback(
+ '/@MEDIA\(([^\)]+)\)@/',
+ array($this, 'autoembed_cb'), $html
+ );
// prepare default replacements
$ip = clientIP();
@@ -213,7 +219,7 @@ class Mailer {
'NAME' => $INFO['userinfo']['name'],
'MAIL' => $INFO['userinfo']['mail'],
);
- $trep = array_merge($trep,(array) $textrep);
+ $trep = array_merge($trep, (array)$textrep);
$hrep = array(
'DATE' => '<i>'.hsc(dformat()).'</i>',
'BROWSER' => hsc($_SERVER['HTTP_USER_AGENT']),
@@ -224,16 +230,16 @@ class Mailer {
'USER' => hsc($_SERVER['REMOTE_USER']),
'NAME' => hsc($INFO['userinfo']['name']),
'MAIL' => '<a href="mailto:"'.hsc($INFO['userinfo']['mail']).'">'.
- hsc($INFO['userinfo']['mail']).'</a>',
+ hsc($INFO['userinfo']['mail']).'</a>',
);
- $hrep = array_merge($hrep,(array) $htmlrep);
+ $hrep = array_merge($hrep, (array)$htmlrep);
// Apply replacements
- foreach ($trep as $key => $substitution) {
- $text = str_replace('@'.strtoupper($key).'@',$substitution, $text);
+ foreach($trep as $key => $substitution) {
+ $text = str_replace('@'.strtoupper($key).'@', $substitution, $text);
}
- foreach ($hrep as $key => $substitution) {
- $html = str_replace('@'.strtoupper($key).'@',$substitution, $html);
+ foreach($hrep as $key => $substitution) {
+ $html = str_replace('@'.strtoupper($key).'@', $substitution, $html);
}
$this->setHTML($html);
@@ -247,7 +253,7 @@ class Mailer {
*
* You probably want to use setBody() instead
*/
- public function setHTML($html){
+ public function setHTML($html) {
$this->html = $html;
}
@@ -256,7 +262,7 @@ class Mailer {
*
* You probably want to use setBody() instead
*/
- public function setText($text){
+ public function setText($text) {
$this->text = $text;
}
@@ -266,7 +272,7 @@ class Mailer {
* @see setAddress
* @param string $address Multiple adresses separated by commas
*/
- public function to($address){
+ public function to($address) {
$this->setHeader('To', $address, false);
}
@@ -276,7 +282,7 @@ class Mailer {
* @see setAddress
* @param string $address Multiple adresses separated by commas
*/
- public function cc($address){
+ public function cc($address) {
$this->setHeader('Cc', $address, false);
}
@@ -286,7 +292,7 @@ class Mailer {
* @see setAddress
* @param string $address Multiple adresses separated by commas
*/
- public function bcc($address){
+ public function bcc($address) {
$this->setHeader('Bcc', $address, false);
}
@@ -299,7 +305,7 @@ class Mailer {
* @see setAddress
* @param string $address from address
*/
- public function from($address){
+ public function from($address) {
$this->setHeader('From', $address, false);
}
@@ -308,7 +314,7 @@ class Mailer {
*
* @param string $subject the mail subject
*/
- public function subject($subject){
+ public function subject($subject) {
$this->headers['Subject'] = $subject;
}
@@ -322,65 +328,65 @@ class Mailer {
* setAddress("föö <foo@bar.com>, me@somewhere.com","TBcc");
*
* @param string $address Multiple adresses separated by commas
- * @param string returns the prepared header (can contain multiple lines)
+ * @return bool|string the prepared header (can contain multiple lines)
*/
- public function cleanAddress($address){
+ public function cleanAddress($address) {
// No named recipients for To: in Windows (see FS#652)
$names = (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN') ? false : true;
- $address = preg_replace('/[\r\n\0]+/',' ',$address); // remove attack vectors
+ $address = preg_replace('/[\r\n\0]+/', ' ', $address); // remove attack vectors
$headers = '';
- $parts = explode(',',$address);
- foreach ($parts as $part){
+ $parts = explode(',', $address);
+ foreach($parts as $part) {
$part = trim($part);
// parse address
- if(preg_match('#(.*?)<(.*?)>#',$part,$matches)){
+ if(preg_match('#(.*?)<(.*?)>#', $part, $matches)) {
$text = trim($matches[1]);
$addr = $matches[2];
- }else{
+ } else {
$addr = $part;
}
// skip empty ones
- if(empty($addr)){
+ if(empty($addr)) {
continue;
}
// FIXME: is there a way to encode the localpart of a emailaddress?
- if(!utf8_isASCII($addr)){
- msg(htmlspecialchars("E-Mail address <$addr> is not ASCII"),-1);
+ if(!utf8_isASCII($addr)) {
+ msg(htmlspecialchars("E-Mail address <$addr> is not ASCII"), -1);
continue;
}
- if(is_null($this->validator)){
- $this->validator = new EmailAddressValidator();
+ if(is_null($this->validator)) {
+ $this->validator = new EmailAddressValidator();
$this->validator->allowLocalAddresses = true;
}
- if(!$this->validator->check_email_address($addr)){
- msg(htmlspecialchars("E-Mail address <$addr> is not valid"),-1);
+ if(!$this->validator->check_email_address($addr)) {
+ msg(htmlspecialchars("E-Mail address <$addr> is not valid"), -1);
continue;
}
// text was given
- if(!empty($text) && $names){
+ if(!empty($text) && $names) {
// add address quotes
$addr = "<$addr>";
- if(defined('MAILHEADER_ASCIIONLY')){
+ if(defined('MAILHEADER_ASCIIONLY')) {
$text = utf8_deaccent($text);
$text = utf8_strip($text);
}
- if(!utf8_isASCII($text)){
+ if(!utf8_isASCII($text)) {
$text = '=?UTF-8?B?'.base64_encode($text).'?=';
}
- }else{
+ } else {
$text = '';
}
// add to header comma seperated
- if($headers != ''){
+ if($headers != '') {
$headers .= ', ';
}
$headers .= $text.' '.$addr;
@@ -397,30 +403,30 @@ class Mailer {
*
* Replaces placeholders in the HTML with the correct CIDs
*/
- protected function prepareAttachments(){
+ protected function prepareAttachments() {
$mime = '';
$part = 1;
// embedded attachments
- foreach($this->attach as $media){
+ foreach($this->attach as $media) {
// create content id
$cid = 'part'.$part.'.'.$this->partid;
// replace wildcards
- if($media['embed']){
- $this->html = str_replace('%%'.$media['embed'].'%%','cid:'.$cid,$this->html);
+ if($media['embed']) {
+ $this->html = str_replace('%%'.$media['embed'].'%%', 'cid:'.$cid, $this->html);
}
$mime .= '--'.$this->boundary.MAILHEADER_EOL;
$mime .= 'Content-Type: '.$media['mime'].';'.MAILHEADER_EOL;
$mime .= 'Content-Transfer-Encoding: base64'.MAILHEADER_EOL;
$mime .= "Content-ID: <$cid>".MAILHEADER_EOL;
- if($media['embed']){
+ if($media['embed']) {
$mime .= 'Content-Disposition: inline; filename="'.$media['name'].'"'.MAILHEADER_EOL;
- }else{
+ } else {
$mime .= 'Content-Disposition: attachment; filename="'.$media['name'].'"'.MAILHEADER_EOL;
}
$mime .= MAILHEADER_EOL; //end of headers
- $mime .= chunk_split(base64_encode($media['data']),74,MAILHEADER_EOL);
+ $mime .= chunk_split(base64_encode($media['data']), 74, MAILHEADER_EOL);
$part++;
}
@@ -434,16 +440,15 @@ class Mailer {
*
* @return string the prepared mail body, false on errors
*/
- protected function prepareBody(){
- global $conf;
+ protected function prepareBody() {
// no HTML mails allowed? remove HTML body
- if(!$this->allowhtml){
+ if(!$this->allowhtml) {
$this->html = '';
}
// check for body
- if(!$this->text && !$this->html){
+ if(!$this->text && !$this->html) {
return false;
}
@@ -452,28 +457,28 @@ class Mailer {
$body = '';
- if(!$this->html && !count($this->attach)){ // we can send a simple single part message
- $this->headers['Content-Type'] = 'text/plain; charset=UTF-8';
+ 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),74,MAILHEADER_EOL);
- }else{ // multi part it is
+ $body .= chunk_split(base64_encode($this->text), 74, 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){
+ if($this->text && $this->html) {
$this->headers['Content-Type'] = 'multipart/alternative;'.MAILHEADER_EOL.
- ' boundary="'.$this->boundary.'XX"';
+ ' 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),74,MAILHEADER_EOL);
+ $body .= chunk_split(base64_encode($this->text), 74, MAILHEADER_EOL);
$body .= '--'.$this->boundary.'XX'.MAILHEADER_EOL;
$body .= 'Content-Type: multipart/related;'.MAILHEADER_EOL.
- ' boundary="'.$this->boundary.'"'.MAILHEADER_EOL;
+ ' boundary="'.$this->boundary.'"'.MAILHEADER_EOL;
$body .= MAILHEADER_EOL;
}
@@ -481,13 +486,13 @@ class Mailer {
$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),74,MAILHEADER_EOL);
+ $body .= chunk_split(base64_encode($this->html), 74, MAILHEADER_EOL);
$body .= MAILHEADER_EOL;
$body .= $attachments;
$body .= '--'.$this->boundary.'--'.MAILHEADER_EOL;
// close open multipart/alternative boundary
- if($this->text && $this->html){
+ if($this->text && $this->html) {
$body .= '--'.$this->boundary.'XX--'.MAILHEADER_EOL;
}
}
@@ -498,47 +503,47 @@ class Mailer {
/**
* Cleanup and encode the headers array
*/
- protected function cleanHeaders(){
+ protected function cleanHeaders() {
global $conf;
// clean up addresses
if(empty($this->headers['From'])) $this->from($conf['mailfrom']);
- $addrs = array('To','From','Cc','Bcc');
- foreach($addrs as $addr){
- if(isset($this->headers[$addr])){
+ $addrs = array('To', 'From', 'Cc', 'Bcc');
+ foreach($addrs as $addr) {
+ if(isset($this->headers[$addr])) {
$this->headers[$addr] = $this->cleanAddress($this->headers[$addr]);
}
}
- if(isset($this->headers['Subject'])){
+ if(isset($this->headers['Subject'])) {
// add prefix to subject
- if(empty($conf['mailprefix'])){
+ if(empty($conf['mailprefix'])) {
if(utf8_strlen($conf['title']) < 20) {
$prefix = '['.$conf['title'].']';
- }else{
+ } else {
$prefix = '['.utf8_substr($conf['title'], 0, 20).'...]';
}
- }else{
+ } else {
$prefix = '['.$conf['mailprefix'].']';
}
$len = strlen($prefix);
- if(substr($this->headers['Subject'],0,$len) != $prefix){
+ if(substr($this->headers['Subject'], 0, $len) != $prefix) {
$this->headers['Subject'] = $prefix.' '.$this->headers['Subject'];
}
// encode subject
- if(defined('MAILHEADER_ASCIIONLY')){
+ if(defined('MAILHEADER_ASCIIONLY')) {
$this->headers['Subject'] = utf8_deaccent($this->headers['Subject']);
$this->headers['Subject'] = utf8_strip($this->headers['Subject']);
}
- if(!utf8_isASCII($this->headers['Subject'])){
+ if(!utf8_isASCII($this->headers['Subject'])) {
$this->headers['Subject'] = '=?UTF-8?B?'.base64_encode($this->headers['Subject']).'?=';
}
}
// wrap headers
- foreach($this->headers as $key => $val){
- $this->headers[$key] = wordwrap($val,78,MAILHEADER_EOL.' ');
+ foreach($this->headers as $key => $val) {
+ $this->headers[$key] = wordwrap($val, 78, MAILHEADER_EOL.' ');
}
}
@@ -547,9 +552,9 @@ class Mailer {
*
* @returns string the headers
*/
- protected function prepareHeaders(){
+ protected function prepareHeaders() {
$headers = '';
- foreach($this->headers as $key => $val){
+ foreach($this->headers as $key => $val) {
$headers .= "$key: $val".MAILHEADER_EOL;
}
return $headers;
@@ -563,10 +568,10 @@ class Mailer {
*
* @return string the mail, false on errors
*/
- public function dump(){
+ public function dump() {
$this->cleanHeaders();
- $body = $this->prepareBody();
- if($body === 'false') return false;
+ $body = $this->prepareBody();
+ if($body === false) return false;
$headers = $this->prepareHeaders();
return $headers.MAILHEADER_EOL.$body;
@@ -580,13 +585,13 @@ class Mailer {
* @triggers MAIL_MESSAGE_SEND
* @return bool true if the mail was successfully passed to the MTA
*/
- public function send(){
+ public function send() {
$success = false;
// prepare hook data
$data = array(
// pass the whole mail class to plugin
- 'mail' => $this,
+ 'mail' => $this,
// pass references for backward compatibility
'to' => &$this->headers['To'],
'cc' => &$this->headers['Cc'],
@@ -594,7 +599,7 @@ class Mailer {
'from' => &$this->headers['From'],
'subject' => &$this->headers['Subject'],
'body' => &$this->text,
- 'params' => &$this->sendparams,
+ 'params' => &$this->sendparam,
'headers' => '', // plugins shouldn't use this
// signal if we mailed successfully to AFTER event
'success' => &$success,
@@ -602,47 +607,48 @@ class Mailer {
// do our thing if BEFORE hook approves
$evt = new Doku_Event('MAIL_MESSAGE_SEND', $data);
- if ($evt->advise_before(true)) {
+ 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;
+ if(trim($this->headers['To']) === '' &&
+ trim($this->headers['Cc']) === '' &&
+ trim($this->headers['Bcc']) === ''
+ ) return false;
// The To: header is special
- if(isset($this->headers['To'])){
+ if(isset($this->headers['To'])) {
$to = $this->headers['To'];
unset($this->headers['To']);
- }else{
+ } else {
$to = '';
}
// so is the subject
- if(isset($this->headers['Subject'])){
+ if(isset($this->headers['Subject'])) {
$subject = $this->headers['Subject'];
unset($this->headers['Subject']);
- }else{
+ } else {
$subject = '';
}
// make the body
- $body = $this->prepareBody();
- if($body === 'false') return false;
+ $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'])){
+ if(trim($data['headers'])) {
$headers .= MAILHEADER_EOL.trim($data['headers']);
}
// send the thing
- if(is_null($this->sendparam)){
- $success = @mail($to,$subject,$body,$headers);
- }else{
- $success = @mail($to,$subject,$body,$headers,$this->sendparam);
+ if(is_null($this->sendparam)) {
+ $success = @mail($to, $subject, $body, $headers);
+ } else {
+ $success = @mail($to, $subject, $body, $headers, $this->sendparam);
}
}
// any AFTER actions?
diff --git a/inc/PassHash.class.php b/inc/PassHash.class.php
index d825057f0..13be479cc 100644
--- a/inc/PassHash.class.php
+++ b/inc/PassHash.class.php
@@ -16,65 +16,67 @@ class PassHash {
* match true is is returned else false
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param $clear string Clear-Text password
+ * @param $hash string Hash to compare against
* @return bool
*/
- function verify_hash($clear,$hash){
- $method='';
- $salt='';
- $magic='';
+ function verify_hash($clear, $hash) {
+ $method = '';
+ $salt = '';
+ $magic = '';
//determine the used method and salt
$len = strlen($hash);
- if(preg_match('/^\$1\$([^\$]{0,8})\$/',$hash,$m)){
+ if(preg_match('/^\$1\$([^\$]{0,8})\$/', $hash, $m)) {
$method = 'smd5';
$salt = $m[1];
$magic = '1';
- }elseif(preg_match('/^\$apr1\$([^\$]{0,8})\$/',$hash,$m)){
+ } elseif(preg_match('/^\$apr1\$([^\$]{0,8})\$/', $hash, $m)) {
$method = 'apr1';
$salt = $m[1];
$magic = 'apr1';
- }elseif(preg_match('/^\$P\$(.{31})$/',$hash,$m)){
+ } elseif(preg_match('/^\$P\$(.{31})$/', $hash, $m)) {
$method = 'pmd5';
$salt = $m[1];
$magic = 'P';
- }elseif(preg_match('/^\$H\$(.{31})$/',$hash,$m)){
+ } elseif(preg_match('/^\$H\$(.{31})$/', $hash, $m)) {
$method = 'pmd5';
$salt = $m[1];
$magic = 'H';
- }elseif(preg_match('/^sha1\$(.{5})\$/',$hash,$m)){
+ } elseif(preg_match('/^sha1\$(.{5})\$/', $hash, $m)) {
$method = 'djangosha1';
$salt = $m[1];
- }elseif(preg_match('/^md5\$(.{5})\$/',$hash,$m)){
+ } elseif(preg_match('/^md5\$(.{5})\$/', $hash, $m)) {
$method = 'djangomd5';
$salt = $m[1];
- }elseif(preg_match('/^\$2a\$(.{2})\$/',$hash,$m)){
+ } elseif(preg_match('/^\$2a\$(.{2})\$/', $hash, $m)) {
$method = 'bcrypt';
$salt = $hash;
- }elseif(substr($hash,0,6) == '{SSHA}'){
+ } elseif(substr($hash, 0, 6) == '{SSHA}') {
$method = 'ssha';
- $salt = substr(base64_decode(substr($hash, 6)),20);
- }elseif(substr($hash,0,6) == '{SMD5}'){
+ $salt = substr(base64_decode(substr($hash, 6)), 20);
+ } elseif(substr($hash, 0, 6) == '{SMD5}') {
$method = 'lsmd5';
- $salt = substr(base64_decode(substr($hash, 6)),16);
- }elseif($len == 32){
+ $salt = substr(base64_decode(substr($hash, 6)), 16);
+ } elseif($len == 32) {
$method = 'md5';
- }elseif($len == 40){
+ } elseif($len == 40) {
$method = 'sha1';
- }elseif($len == 16){
+ } elseif($len == 16) {
$method = 'mysql';
- }elseif($len == 41 && $hash[0] == '*'){
+ } elseif($len == 41 && $hash[0] == '*') {
$method = 'my411';
- }elseif($len == 34){
+ } elseif($len == 34) {
$method = 'kmd5';
$salt = $hash;
- }else{
+ } else {
$method = 'crypt';
- $salt = substr($hash,0,2);
+ $salt = substr($hash, 0, 2);
}
//crypt and compare
$call = 'hash_'.$method;
- if($this->$call($clear,$salt,$magic) === $hash){
+ if($this->$call($clear, $salt, $magic) === $hash) {
return true;
}
return false;
@@ -83,13 +85,14 @@ class PassHash {
/**
* Create a random salt
*
- * @param int $len - The length of the salt
+ * @param int $len The length of the salt
+ * @return string
*/
- public function gen_salt($len=32){
+ public function gen_salt($len = 32) {
$salt = '';
$chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789';
- for($i=0; $i<$len; $i++){
- $salt .= $chars[mt_rand(0,61)];
+ for($i = 0; $i < $len; $i++) {
+ $salt .= $chars[mt_rand(0, 61)];
}
return $salt;
}
@@ -100,12 +103,12 @@ class PassHash {
* If $salt is not null, the value is kept, but the lenght restriction is
* applied.
*
- * @param stringref $salt - The salt, pass null if you want one generated
- * @param int $len - The length of the salt
+ * @param string &$salt The salt, pass null if you want one generated
+ * @param int $len The length of the salt
*/
- public function init_salt(&$salt,$len=32){
+ public function init_salt(&$salt, $len = 32) {
if(is_null($salt)) $salt = $this->gen_salt($len);
- if(strlen($salt) > $len) $salt = substr($salt,0,$len);
+ if(strlen($salt) > $len) $salt = substr($salt, 0, $len);
}
// Password hashing methods follow below
@@ -122,36 +125,37 @@ class PassHash {
* @author Andreas Gohr <andi@splitbrain.org>
* @author <mikey_nich at hotmail dot com>
* @link http://de.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)
- * @returns string - hashed password
+ * @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);
+ public function hash_smd5($clear, $salt = null) {
+ $this->init_salt($salt, 8);
- if(defined('CRYPT_MD5') && CRYPT_MD5){
- return crypt($clear,'$1$'.$salt.'$');
- }else{
+ 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);
+ 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'
*
@@ -161,17 +165,17 @@ class PassHash {
*
* @author <mikey_nich at hotmail dot com>
* @link http://de.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)
- * @returns string - hashed password
+ * @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);
+ public function hash_apr1($clear, $salt = null, $magic = 'apr1') {
+ $this->init_salt($salt, 8);
- $len = strlen($clear);
+ $len = strlen($clear);
$text = $clear.'$'.$magic.'$'.$salt;
- $bin = pack("H32", md5($clear.$salt.$clear));
+ $bin = pack("H32", md5($clear.$salt.$clear));
for($i = $len; $i > 0; $i -= 16) {
$text .= substr($bin, 0, min(16, $i));
}
@@ -181,22 +185,24 @@ class PassHash {
$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;
+ 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++) {
+ for($i = 0; $i < 5; $i++) {
$k = $i + 6;
$j = $i + 12;
- if ($j == 16) $j = 5;
+ 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");
+ $tmp = strtr(
+ strrev(substr(base64_encode($tmp), 2)),
+ "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/",
+ "./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"
+ );
return '$'.$magic.'$'.$salt.'$'.$tmp;
}
@@ -205,10 +211,10 @@ class PassHash {
*
* Uses MD5 hashs.
*
- * @param string $clear - the clear text to hash
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @return string Hashed password
*/
- public function hash_md5($clear){
+ public function hash_md5($clear) {
return md5($clear);
}
@@ -217,10 +223,10 @@ class PassHash {
*
* Uses SHA1 hashs.
*
- * @param string $clear - the clear text to hash
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @return string Hashed password
*/
- public function hash_sha1($clear){
+ public function hash_sha1($clear) {
return sha1($clear);
}
@@ -229,12 +235,12 @@ class PassHash {
*
* 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
- * @returns string - hashed password
+ * @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);
+ public function hash_ssha($clear, $salt = null) {
+ $this->init_salt($salt, 4);
return '{SSHA}'.base64_encode(pack("H*", sha1($clear.$salt)).$salt);
}
@@ -243,13 +249,13 @@ class PassHash {
*
* 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
- * @returns string - hashed password
+ * @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);
+ public function hash_crypt($clear, $salt = null) {
+ $this->init_salt($salt, 2);
+ return crypt($clear, $salt);
}
/**
@@ -259,16 +265,16 @@ class PassHash {
*
* @link http://www.php.net/mysql
* @author <soren at byu dot edu>
- * @param string $clear - the clear text to hash
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @return string Hashed password
*/
- public function hash_mysql($clear){
- $nr=0x50305735;
- $nr2=0x12345671;
- $add=7;
+ 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;
+ foreach($charArr as $char) {
+ if(($char == '') || ($char == ' ') || ($char == '\t')) continue;
$charVal = ord($char);
$nr ^= ((($nr & 63) + $add) * $charVal) + ($nr << 8);
$nr2 += ($nr2 << 8) ^ $nr;
@@ -282,10 +288,10 @@ class PassHash {
*
* Uses SHA1 hashs. This method is used by MySQL 4.11 and above
*
- * @param string $clear - the clear text to hash
- * @returns string - hashed password
+ * @param string $clear The clear text to hash
+ * @return string Hashed password
*/
- public function hash_my411($clear){
+ public function hash_my411($clear) {
return '*'.sha1(pack("H*", sha1($clear)));
}
@@ -297,16 +303,16 @@ class PassHash {
* 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
- * @returns string - hashed password
+ * @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){
+ 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);
+ $key = substr($salt, 16, 2);
+ $hash1 = strtolower(md5($key.md5($clear)));
+ $hash2 = substr($hash1, 0, 16).$key.substr($hash1, 16);
return $hash2;
}
@@ -321,54 +327,55 @@ class PassHash {
* an exception.
*
* @link http://www.openwall.com/phpass/
- * @param string $clear - the clear text to hash
- * @param string $salt - the salt to use, null for random
- * @param string $magic - the hash identifier (P or H)
- * @param int $compute - the iteration count for new passwords
- * @returns string - hashed password
+ * @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){
+ public function hash_pmd5($clear, $salt = null, $magic = 'P', $compute = 8) {
$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
- if(is_null($salt)){
+ if(is_null($salt)) {
$this->init_salt($salt);
$salt = $itoa64[$compute].$salt; // prefix iteration count
}
$iterc = $salt[0]; // pos 0 of salt is iteration count
- $iter = strpos($itoa64,$iterc);
+ $iter = strpos($itoa64, $iterc);
- if($iter > 30){
+ if($iter > 30) {
throw new Exception("Too high iteration count ($iter) in ".
- __class__.'::'.__function__);
+ __CLASS__.'::'.__FUNCTION__);
}
$iter = 1 << $iter;
- $salt = substr($salt,1,8);
+ $salt = substr($salt, 1, 8);
// iterate
- $hash = md5($salt . $clear, true);
+ $hash = md5($salt.$clear, true);
do {
- $hash = md5($hash . $clear, true);
- } while (--$iter);
+ $hash = md5($hash.$clear, true);
+ } while(--$iter);
// encode
$output = '';
- $count = 16;
- $i = 0;
+ $count = 16;
+ $i = 0;
do {
$value = ord($hash[$i++]);
$output .= $itoa64[$value & 0x3f];
- if ($i < $count)
+ if($i < $count)
$value |= ord($hash[$i]) << 8;
$output .= $itoa64[($value >> 6) & 0x3f];
- if ($i++ >= $count)
+ if($i++ >= $count)
break;
- if ($i < $count)
+ if($i < $count)
$value |= ord($hash[$i]) << 16;
$output .= $itoa64[($value >> 12) & 0x3f];
- if ($i++ >= $count)
+ if($i++ >= $count)
break;
$output .= $itoa64[($value >> 18) & 0x3f];
- } while ($i < $count);
+ } while($i < $count);
return '$'.$magic.'$'.$iterc.$salt.$output;
}
@@ -376,7 +383,7 @@ class PassHash {
/**
* Alias for hash_pmd5
*/
- public function hash_hmd5($clear, $salt=null, $magic='H', $compute=8){
+ public function hash_hmd5($clear, $salt = null, $magic = 'H', $compute = 8) {
return $this->hash_pmd5($clear, $salt, $magic, $compute);
}
@@ -387,12 +394,12 @@ class PassHash {
* 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
- * @returns string - hashed password
+ * @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);
+ public function hash_djangosha1($clear, $salt = null) {
+ $this->init_salt($salt, 5);
return 'sha1$'.$salt.'$'.sha1($salt.$clear);
}
@@ -403,16 +410,15 @@ class PassHash {
* 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
- * @returns string - hashed password
+ * @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);
+ public function hash_djangomd5($clear, $salt = null) {
+ $this->init_salt($salt, 5);
return 'md5$'.$salt.'$'.md5($salt.$clear);
}
-
/**
* Passwordhashing method 'bcrypt'
*
@@ -424,20 +430,21 @@ class PassHash {
* 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)
- * @returns string - hashed password
+ * @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=8){
- if(!defined('CRYPT_BLOWFISH') || CRYPT_BLOWFISH != 1){
+ public function hash_bcrypt($clear, $salt = null, $compute = 8) {
+ if(!defined('CRYPT_BLOWFISH') || CRYPT_BLOWFISH != 1) {
throw new Exception('This PHP installation has no bcrypt support');
}
- if(is_null($salt)){
+ if(is_null($salt)) {
if($compute < 4 || $compute > 31) $compute = 8;
$salt = '$2a$'.str_pad($compute, 2, '0', STR_PAD_LEFT).'$'.
- $this->gen_salt(22);
+ $this->gen_salt(22);
}
return crypt($clear, $salt);
diff --git a/inc/actions.php b/inc/actions.php
index adc251bc4..d4bd5b20e 100644
--- a/inc/actions.php
+++ b/inc/actions.php
@@ -20,6 +20,7 @@ function act_dispatch(){
global $ID;
global $INFO;
global $QUERY;
+ global $INPUT;
global $lang;
global $conf;
@@ -30,7 +31,7 @@ function act_dispatch(){
if ($evt->advise_before()) {
//sanitize $ACT
- $ACT = act_clean($ACT);
+ $ACT = act_validate($ACT);
//check if searchword was given - else just show
$s = cleanID($QUERY);
@@ -131,14 +132,14 @@ function act_dispatch(){
//handle admin tasks
if($ACT == 'admin'){
// retrieve admin plugin name from $_REQUEST['page']
- if (!empty($_REQUEST['page'])) {
+ if (($page = $INPUT->str('page', '', true)) != '') {
$pluginlist = plugin_list('admin');
- if (in_array($_REQUEST['page'], $pluginlist)) {
+ if (in_array($page, $pluginlist)) {
// attempt to load the plugin
- if ($plugin =& plugin_load('admin',$_REQUEST['page']) !== null){
+ if ($plugin =& plugin_load('admin',$page) !== null){
if($plugin->forAdminOnly() && !$INFO['isadmin']){
// a manager tried to load a plugin that's for admins only
- unset($_REQUEST['page']);
+ $INPUT->remove('page');
msg('For admins only',-1);
}else{
$plugin->handle();
@@ -183,15 +184,9 @@ function act_sendheaders($headers) {
/**
* Sanitize the action command
*
- * Add all allowed commands here.
- *
* @author Andreas Gohr <andi@splitbrain.org>
*/
function act_clean($act){
- global $lang;
- global $conf;
- global $INFO;
-
// check if the action was given as array key
if(is_array($act)){
list($act) = array_keys($act);
@@ -205,6 +200,21 @@ function act_clean($act){
if($act == 'export_htmlbody') $act = 'export_xhtmlbody';
if($act === '') $act = 'show';
+ return $act;
+}
+
+/**
+ * Sanitize and validate action commands.
+ *
+ * Add all allowed commands here.
+ *
+ * @author Andreas Gohr <andi@splitbrain.org>
+ */
+function act_validate($act) {
+ global $conf;
+ global $INFO;
+
+ $act = act_clean($act);
// check if action is disabled
if(!actionOK($act)){
@@ -300,13 +310,14 @@ function act_draftdel($act){
function act_draftsave($act){
global $INFO;
global $ID;
+ global $INPUT;
global $conf;
- if($conf['usedraft'] && $_POST['wikitext']){
+ if($conf['usedraft'] && $INPUT->post->has('wikitext')) {
$draft = array('id' => $ID,
- 'prefix' => substr($_POST['prefix'], 0, -1),
- 'text' => $_POST['wikitext'],
- 'suffix' => $_POST['suffix'],
- 'date' => (int) $_POST['date'],
+ 'prefix' => substr($INPUT->post->str('prefix'), 0, -1),
+ 'text' => $INPUT->post->str('wikitext'),
+ 'suffix' => $INPUT->post->str('suffix'),
+ 'date' => $INPUT->post->int('date'),
'client' => $INFO['client'],
);
$cname = getCacheName($draft['client'].$ID,'.draft');
@@ -335,6 +346,7 @@ function act_save($act){
global $SUM;
global $lang;
global $INFO;
+ global $INPUT;
//spam check
if(checkwordblock()) {
@@ -346,7 +358,7 @@ function act_save($act){
return 'conflict';
//save it
- saveWikiText($ID,con($PRE,$TEXT,$SUF,1),$SUM,$_REQUEST['minor']); //use pretty mode for con
+ saveWikiText($ID,con($PRE,$TEXT,$SUF,1),$SUM,$INPUT->bool('minor')); //use pretty mode for con
//unlock it
unlock($ID);
@@ -498,7 +510,7 @@ function act_edit($act){
//set summary default
if(!$SUM){
if($REV){
- $SUM = $lang['restored'];
+ $SUM = sprintf($lang['restored'], dformat($REV));
}elseif(!$INFO['exists']){
$SUM = $lang['created'];
}
@@ -669,6 +681,7 @@ function act_subscription($act){
global $lang;
global $INFO;
global $ID;
+ global $INPUT;
// subcriptions work for logged in users only
if(!$_SERVER['REMOTE_USER']) return 'show';
@@ -676,8 +689,8 @@ function act_subscription($act){
// get and preprocess data.
$params = array();
foreach(array('target', 'style', 'action') as $param) {
- if (isset($_REQUEST["sub_$param"])) {
- $params[$param] = $_REQUEST["sub_$param"];
+ if ($INPUT->has("sub_$param")) {
+ $params[$param] = $INPUT->str("sub_$param");
}
}
diff --git a/inc/auth.php b/inc/auth.php
index ed0e2dcf7..cedfdee36 100644
--- a/inc/auth.php
+++ b/inc/auth.php
@@ -12,13 +12,13 @@
if(!defined('DOKU_INC')) die('meh.');
// some ACL level defines
-define('AUTH_NONE',0);
-define('AUTH_READ',1);
-define('AUTH_EDIT',2);
-define('AUTH_CREATE',4);
-define('AUTH_UPLOAD',8);
-define('AUTH_DELETE',16);
-define('AUTH_ADMIN',255);
+define('AUTH_NONE', 0);
+define('AUTH_READ', 1);
+define('AUTH_EDIT', 2);
+define('AUTH_CREATE', 4);
+define('AUTH_UPLOAD', 8);
+define('AUTH_DELETE', 16);
+define('AUTH_ADMIN', 255);
/**
* Initialize the auth system.
@@ -29,26 +29,30 @@ define('AUTH_ADMIN',255);
*
* @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(){
+function auth_setup() {
global $conf;
+ /* @var auth_basic $auth */
global $auth;
+ /* @var Input $INPUT */
+ global $INPUT;
global $AUTH_ACL;
global $lang;
- global $config_cascade;
$AUTH_ACL = array();
if(!$conf['useacl']) return false;
// load the the backend auth functions and instantiate the auth object XXX
- if (@file_exists(DOKU_INC.'inc/auth/'.$conf['authtype'].'.class.php')) {
+ if(@file_exists(DOKU_INC.'inc/auth/'.$conf['authtype'].'.class.php')) {
require_once(DOKU_INC.'inc/auth/basic.class.php');
require_once(DOKU_INC.'inc/auth/'.$conf['authtype'].'.class.php');
$auth_class = "auth_".$conf['authtype'];
- if (class_exists($auth_class)) {
+ if(class_exists($auth_class)) {
$auth = new $auth_class();
- if ($auth->success == false) {
+ if($auth->success == false) {
// degrade to unauthenticated user
unset($auth);
auth_logoff();
@@ -61,14 +65,11 @@ function auth_setup(){
nice_die($lang['authmodfailed']);
}
- if(!$auth) return;
+ if(!$auth) return false;
// do the login either by cookie or provided credentials XXX
- if (!isset($_REQUEST['u'])) $_REQUEST['u'] = '';
- if (!isset($_REQUEST['p'])) $_REQUEST['p'] = '';
- if (!isset($_REQUEST['r'])) $_REQUEST['r'] = '';
- $_REQUEST['http_credentials'] = false;
- if (!$conf['rememberme']) $_REQUEST['r'] = false;
+ $INPUT->set('http_credentials', false);
+ if(!$conf['rememberme']) $INPUT->set('r', false);
// handle renamed HTTP_AUTHORIZATION variable (can happen when a fix like
// the one presented at
@@ -77,73 +78,93 @@ function auth_setup(){
if(isset($_SERVER['REDIRECT_HTTP_AUTHORIZATION']))
$_SERVER['HTTP_AUTHORIZATION'] = $_SERVER['REDIRECT_HTTP_AUTHORIZATION'];
// streamline HTTP auth credentials (IIS/rewrite -> mod_php)
- if(isset($_SERVER['HTTP_AUTHORIZATION'])){
- list($_SERVER['PHP_AUTH_USER'],$_SERVER['PHP_AUTH_PW']) =
+ if(isset($_SERVER['HTTP_AUTHORIZATION'])) {
+ list($_SERVER['PHP_AUTH_USER'], $_SERVER['PHP_AUTH_PW']) =
explode(':', base64_decode(substr($_SERVER['HTTP_AUTHORIZATION'], 6)));
}
// if no credentials were given try to use HTTP auth (for SSO)
- if(empty($_REQUEST['u']) && empty($_COOKIE[DOKU_COOKIE]) && !empty($_SERVER['PHP_AUTH_USER'])){
- $_REQUEST['u'] = $_SERVER['PHP_AUTH_USER'];
- $_REQUEST['p'] = $_SERVER['PHP_AUTH_PW'];
- $_REQUEST['http_credentials'] = true;
+ if(!$INPUT->str('u') && empty($_COOKIE[DOKU_COOKIE]) && !empty($_SERVER['PHP_AUTH_USER'])) {
+ $INPUT->set('u', $_SERVER['PHP_AUTH_USER']);
+ $INPUT->set('p', $_SERVER['PHP_AUTH_PW']);
+ $INPUT->set('http_credentials', true);
}
// apply cleaning
- $_REQUEST['u'] = $auth->cleanUser($_REQUEST['u']);
+ $INPUT->set('u', $auth->cleanUser($INPUT->str('u')));
- if(isset($_REQUEST['authtok'])){
+ if($INPUT->str('authtok')) {
// when an authentication token is given, trust the session
- auth_validateToken($_REQUEST['authtok']);
- }elseif(!is_null($auth) && $auth->canDo('external')){
+ auth_validateToken($INPUT->str('authtok'));
+ } elseif(!is_null($auth) && $auth->canDo('external')) {
// external trust mechanism in place
- $auth->trustExternal($_REQUEST['u'],$_REQUEST['p'],$_REQUEST['r']);
- }else{
+ $auth->trustExternal($INPUT->str('u'), $INPUT->str('p'), $INPUT->bool('r'));
+ } else {
$evdata = array(
- 'user' => $_REQUEST['u'],
- 'password' => $_REQUEST['p'],
- 'sticky' => $_REQUEST['r'],
- 'silent' => $_REQUEST['http_credentials'],
- );
+ 'user' => $INPUT->str('u'),
+ 'password' => $INPUT->str('p'),
+ 'sticky' => $INPUT->bool('r'),
+ 'silent' => $INPUT->bool('http_credentials')
+ );
trigger_event('AUTH_LOGIN_CHECK', $evdata, 'auth_login_wrapper');
}
//load ACL into a global array XXX
$AUTH_ACL = auth_loadACL();
+
+ return true;
}
/**
* Loads the ACL setup and handle user wildcards
*
* @author Andreas Gohr <andi@splitbrain.org>
- * @returns array
+ * @return array
*/
-function auth_loadACL(){
+function auth_loadACL() {
global $config_cascade;
+ global $USERINFO;
if(!is_readable($config_cascade['acl']['default'])) return array();
$acl = file($config_cascade['acl']['default']);
//support user wildcard
- if(isset($_SERVER['REMOTE_USER'])){
- $len = count($acl);
- for($i=0; $i<$len; $i++){
- if($acl[$i]{0} == '#') continue;
- list($id,$rest) = preg_split('/\s+/',$acl[$i],2);
+ $out = array();
+ foreach($acl as $line) {
+ $line = trim($line);
+ if($line{0} == '#') continue;
+ list($id,$rest) = preg_split('/\s+/',$line,2);
+
+ if(strstr($line, '%GROUP%')){
+ 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 {
$id = str_replace('%USER%',cleanID($_SERVER['REMOTE_USER']),$id);
$rest = str_replace('%USER%',auth_nameencode($_SERVER['REMOTE_USER']),$rest);
- $acl[$i] = "$id\t$rest";
+ $out[] = "$id\t$rest";
}
}
- return $acl;
+
+ return $out;
}
+/**
+ * Event hook callback for AUTH_LOGIN_CHECK
+ *
+ * @param $evdata
+ * @return bool
+ */
function auth_login_wrapper($evdata) {
- return auth_login($evdata['user'],
- $evdata['password'],
- $evdata['sticky'],
- $evdata['silent']);
+ return auth_login(
+ $evdata['user'],
+ $evdata['password'],
+ $evdata['sticky'],
+ $evdata['silent']
+ );
}
/**
@@ -175,53 +196,56 @@ function auth_login_wrapper($evdata) {
* @param bool $silent Don't show error on bad auth
* @return bool true on successful auth
*/
-function auth_login($user,$pass,$sticky=false,$silent=false){
+function auth_login($user, $pass, $sticky = false, $silent = false) {
global $USERINFO;
global $conf;
global $lang;
+ /* @var auth_basic $auth */
global $auth;
+
$sticky ? $sticky = true : $sticky = false; //sanity check
- if (!$auth) return false;
+ if(!$auth) return false;
- if(!empty($user)){
+ if(!empty($user)) {
//usual login
- if ($auth->checkPass($user,$pass)){
+ if($auth->checkPass($user, $pass)) {
// make logininfo globally available
$_SERVER['REMOTE_USER'] = $user;
- $secret = auth_cookiesalt(!$sticky); //bind non-sticky to session
- auth_setCookie($user,PMA_blowfish_encrypt($pass,$secret),$sticky);
+ $secret = auth_cookiesalt(!$sticky); //bind non-sticky to session
+ auth_setCookie($user, PMA_blowfish_encrypt($pass, $secret), $sticky);
return true;
- }else{
+ } else {
//invalid credentials - log off
- if(!$silent) msg($lang['badlogin'],-1);
+ if(!$silent) msg($lang['badlogin'], -1);
auth_logoff();
return false;
}
- }else{
+ } else {
// read cookie information
- list($user,$sticky,$pass) = auth_getCookie();
- if($user && $pass){
+ list($user, $sticky, $pass) = auth_getCookie();
+ if($user && $pass) {
// we got a cookie - see if we can trust it
// get session info
$session = $_SESSION[DOKU_COOKIE]['auth'];
if(isset($session) &&
- $auth->useSessionCache($user) &&
- ($session['time'] >= time()-$conf['auth_security_timeout']) &&
- ($session['user'] == $user) &&
- ($session['pass'] == sha1($pass)) && //still crypted
- ($session['buid'] == auth_browseruid()) ){
+ $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
$_SERVER['REMOTE_USER'] = $user;
- $USERINFO = $session['info']; //FIXME move all references to session
+ $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); //bind non-sticky to session
- $pass = PMA_blowfish_decrypt($pass,$secret);
- return auth_login($user,$pass,$sticky,true);
+ $pass = PMA_blowfish_decrypt($pass, $secret);
+ return auth_login($user, $pass, $sticky, true);
}
}
//just to be sure
@@ -239,8 +263,8 @@ function auth_login($user,$pass,$sticky=false,$silent=false){
* @param string $token The authentication token
* @return boolean true (or will exit on failure)
*/
-function auth_validateToken($token){
- if(!$token || $token != $_SESSION[DOKU_COOKIE]['auth']['token']){
+function auth_validateToken($token) {
+ if(!$token || $token != $_SESSION[DOKU_COOKIE]['auth']['token']) {
// bad token
header("HTTP/1.0 401 Unauthorized");
print 'Invalid auth token - maybe the session timed out';
@@ -250,7 +274,7 @@ function auth_validateToken($token){
// still here? trust the session data
global $USERINFO;
$_SERVER['REMOTE_USER'] = $_SESSION[DOKU_COOKIE]['auth']['user'];
- $USERINFO = $_SESSION[DOKU_COOKIE]['auth']['info'];
+ $USERINFO = $_SESSION[DOKU_COOKIE]['auth']['info'];
return true;
}
@@ -262,7 +286,7 @@ function auth_validateToken($token){
* @author Andreas Gohr <andi@splitbrain.org>
* @return string The auth token
*/
-function auth_createToken(){
+function auth_createToken() {
$token = md5(mt_rand());
@session_start(); // reopen the session if needed
$_SESSION[DOKU_COOKIE]['auth']['token'] = $token;
@@ -281,14 +305,14 @@ function auth_createToken(){
*
* @return string a MD5 sum of various browser headers
*/
-function auth_browseruid(){
- $ip = clientIP(true);
- $uid = '';
+function auth_browseruid() {
+ $ip = clientIP(true);
+ $uid = '';
$uid .= $_SERVER['HTTP_USER_AGENT'];
$uid .= $_SERVER['HTTP_ACCEPT_ENCODING'];
$uid .= $_SERVER['HTTP_ACCEPT_LANGUAGE'];
$uid .= $_SERVER['HTTP_ACCEPT_CHARSET'];
- $uid .= substr($ip,0,strpos($ip,'.'));
+ $uid .= substr($ip, 0, strpos($ip, '.'));
return md5($uid);
}
@@ -304,15 +328,15 @@ function auth_browseruid(){
* @param bool $addsession if true, the sessionid is added to the salt
* @return string
*/
-function auth_cookiesalt($addsession=false){
+function auth_cookiesalt($addsession = false) {
global $conf;
$file = $conf['metadir'].'/_htcookiesalt';
$salt = io_readFile($file);
- if(empty($salt)){
- $salt = uniqid(rand(),true);
- io_saveFile($file,$salt);
+ if(empty($salt)) {
+ $salt = uniqid(rand(), true);
+ io_saveFile($file, $salt);
}
- if($addsession){
+ if($addsession) {
$salt .= session_id();
}
return $salt;
@@ -327,10 +351,10 @@ function auth_cookiesalt($addsession=false){
* @author Andreas Gohr <andi@splitbrain.org>
* @param bool $keepbc - when true, the breadcrumb data is not cleared
*/
-function auth_logoff($keepbc=false){
+function auth_logoff($keepbc = false) {
global $conf;
global $USERINFO;
- global $INFO, $ID;
+ /* @var auth_basic $auth */
global $auth;
// make sure the session is writable (it usually is)
@@ -346,13 +370,13 @@ function auth_logoff($keepbc=false){
unset($_SESSION[DOKU_COOKIE]['bc']);
if(isset($_SERVER['REMOTE_USER']))
unset($_SERVER['REMOTE_USER']);
- $USERINFO=null; //FIXME
+ $USERINFO = null; //FIXME
$cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
- if (version_compare(PHP_VERSION, '5.2.0', '>')) {
- setcookie(DOKU_COOKIE,'',time()-600000,$cookieDir,'',($conf['securecookie'] && is_ssl()),true);
- }else{
- setcookie(DOKU_COOKIE,'',time()-600000,$cookieDir,'',($conf['securecookie'] && is_ssl()));
+ if(version_compare(PHP_VERSION, '5.2.0', '>')) {
+ setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
+ } else {
+ setcookie(DOKU_COOKIE, '', time() - 600000, $cookieDir, '', ($conf['securecookie'] && is_ssl()));
}
if($auth) $auth->logOff();
@@ -368,32 +392,34 @@ function auth_logoff($keepbc=false){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @see auth_isadmin
- * @param string user - Username
- * @param array groups - List of groups the user is in
- * @param bool adminonly - when true checks if user is admin
+ * @param string $user Username
+ * @param array $groups List of groups the user is in
+ * @param bool $adminonly when true checks if user is admin
+ * @return bool
*/
-function auth_ismanager($user=null,$groups=null,$adminonly=false){
+function auth_ismanager($user = null, $groups = null, $adminonly = false) {
global $conf;
global $USERINFO;
+ /* @var auth_basic $auth */
global $auth;
- if (!$auth) return false;
+ if(!$auth) return false;
if(is_null($user)) {
- if (!isset($_SERVER['REMOTE_USER'])) {
+ if(!isset($_SERVER['REMOTE_USER'])) {
return false;
} else {
$user = $_SERVER['REMOTE_USER'];
}
}
- if(is_null($groups)){
+ if(is_null($groups)) {
$groups = (array) $USERINFO['grps'];
}
// check superuser match
- if(auth_isMember($conf['superuser'],$user, $groups)) return true;
+ if(auth_isMember($conf['superuser'], $user, $groups)) return true;
if($adminonly) return false;
// check managers
- if(auth_isMember($conf['manager'],$user, $groups)) return true;
+ if(auth_isMember($conf['manager'], $user, $groups)) return true;
return false;
}
@@ -406,13 +432,15 @@ function auth_ismanager($user=null,$groups=null,$adminonly=false){
* The info is available through $INFO['isadmin'], too
*
* @author Andreas Gohr <andi@splitbrain.org>
- * @see auth_ismanager
+ * @see auth_ismanager()
+ * @param string $user Username
+ * @param array $groups List of groups the user is in
+ * @return bool
*/
-function auth_isadmin($user=null,$groups=null){
- return auth_ismanager($user,$groups,true);
+function auth_isadmin($user = null, $groups = null) {
+ return auth_ismanager($user, $groups, true);
}
-
/**
* Match a user and his groups against a comma separated list of
* users and groups to determine membership status
@@ -424,31 +452,32 @@ function auth_isadmin($user=null,$groups=null){
* @param $groups array groups the user is member of
* @return bool true for membership acknowledged
*/
-function auth_isMember($memberlist,$user,array $groups){
+function auth_isMember($memberlist, $user, array $groups) {
+ /* @var auth_basic $auth */
global $auth;
- if (!$auth) return false;
+ if(!$auth) return false;
// clean user and groups
- if(!$auth->isCaseSensitive()){
- $user = utf8_strtolower($user);
- $groups = array_map('utf8_strtolower',$groups);
+ if(!$auth->isCaseSensitive()) {
+ $user = utf8_strtolower($user);
+ $groups = array_map('utf8_strtolower', $groups);
}
- $user = $auth->cleanUser($user);
- $groups = array_map(array($auth,'cleanGroup'),$groups);
+ $user = $auth->cleanUser($user);
+ $groups = array_map(array($auth, 'cleanGroup'), $groups);
// extract the memberlist
- $members = explode(',',$memberlist);
- $members = array_map('trim',$members);
+ $members = explode(',', $memberlist);
+ $members = array_map('trim', $members);
$members = array_unique($members);
$members = array_filter($members);
// compare cleaned values
- foreach($members as $member){
+ foreach($members as $member) {
if(!$auth->isCaseSensitive()) $member = utf8_strtolower($member);
- if($member[0] == '@'){
- $member = $auth->cleanGroup(substr($member,1));
+ if($member[0] == '@') {
+ $member = $auth->cleanGroup(substr($member, 1));
if(in_array($member, $groups)) return true;
- }else{
+ } else {
$member = $auth->cleanUser($member);
if($member == $user) return true;
}
@@ -468,12 +497,12 @@ function auth_isMember($memberlist,$user,array $groups){
* @param string $id page ID (needs to be resolved and cleaned)
* @return int permission level
*/
-function auth_quickaclcheck($id){
+function auth_quickaclcheck($id) {
global $conf;
global $USERINFO;
# if no ACL is used always return upload rights
if(!$conf['useacl']) return AUTH_UPLOAD;
- return auth_aclcheck($id,$_SERVER['REMOTE_USER'],$USERINFO['grps']);
+ return auth_aclcheck($id, $_SERVER['REMOTE_USER'], $USERINFO['grps']);
}
/**
@@ -482,111 +511,115 @@ function auth_quickaclcheck($id){
*
* @author Andreas Gohr <andi@splitbrain.org>
*
- * @param string $id page ID (needs to be resolved and cleaned)
- * @param string $user Username
- * @param array $groups Array of groups the user is in
+ * @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){
+function auth_aclcheck($id, $user, $groups) {
global $conf;
global $AUTH_ACL;
+ /* @var auth_basic $auth */
global $auth;
// if no ACL is used always return upload rights
if(!$conf['useacl']) return AUTH_UPLOAD;
- if (!$auth) return AUTH_NONE;
+ if(!$auth) return AUTH_NONE;
//make sure groups is an array
if(!is_array($groups)) $groups = array();
//if user is superuser or in superusergroup return 255 (acl_admin)
- if(auth_isadmin($user,$groups)) { return AUTH_ADMIN; }
+ if(auth_isadmin($user, $groups)) {
+ return AUTH_ADMIN;
+ }
$ci = '';
if(!$auth->isCaseSensitive()) $ci = 'ui';
- $user = $auth->cleanUser($user);
- $groups = array_map(array($auth,'cleanGroup'),(array)$groups);
- $user = auth_nameencode($user);
+ $user = $auth->cleanUser($user);
+ $groups = array_map(array($auth, 'cleanGroup'), (array) $groups);
+ $user = auth_nameencode($user);
//prepend groups with @ and nameencode
$cnt = count($groups);
- for($i=0; $i<$cnt; $i++){
+ for($i = 0; $i < $cnt; $i++) {
$groups[$i] = '@'.auth_nameencode($groups[$i]);
}
- $ns = getNS($id);
- $perm = -1;
+ $ns = getNS($id);
+ $perm = -1;
- if($user || count($groups)){
+ if($user || count($groups)) {
//add ALL group
$groups[] = '@ALL';
//add User
if($user) $groups[] = $user;
- }else{
+ } else {
$groups[] = '@ALL';
}
//check exact match first
- $matches = preg_grep('/^'.preg_quote($id,'/').'\s+(\S+)\s+/'.$ci,$AUTH_ACL);
- if(count($matches)){
- foreach($matches as $match){
- $match = preg_replace('/#.*$/','',$match); //ignore comments
- $acl = preg_split('/\s+/',$match);
- if (!in_array($acl[1], $groups)) {
+ $matches = preg_grep('/^'.preg_quote($id, '/').'\s+(\S+)\s+/'.$ci, $AUTH_ACL);
+ if(count($matches)) {
+ foreach($matches as $match) {
+ $match = preg_replace('/#.*$/', '', $match); //ignore comments
+ $acl = preg_split('/\s+/', $match);
+ 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){
+ if($acl[2] > $perm) {
$perm = $acl[2];
}
}
- if($perm > -1){
+ if($perm > -1) {
//we had a match - return it
return $perm;
}
}
//still here? do the namespace checks
- if($ns){
+ if($ns) {
$path = $ns.':*';
- }else{
+ } else {
$path = '*'; //root document
}
- do{
- $matches = preg_grep('/^'.preg_quote($path,'/').'\s+(\S+)\s+/'.$ci,$AUTH_ACL);
- if(count($matches)){
- foreach($matches as $match){
- $match = preg_replace('/#.*$/','',$match); //ignore comments
- $acl = preg_split('/\s+/',$match);
- if (!in_array($acl[1], $groups)) {
+ do {
+ $matches = preg_grep('/^'.preg_quote($path, '/').'\s+(\S+)\s+/'.$ci, $AUTH_ACL);
+ if(count($matches)) {
+ foreach($matches as $match) {
+ $match = preg_replace('/#.*$/', '', $match); //ignore comments
+ $acl = preg_split('/\s+/', $match);
+ 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){
+ if($acl[2] > $perm) {
$perm = $acl[2];
}
}
//we had a match - return it
- if ($perm != -1) {
+ if($perm != -1) {
return $perm;
}
}
//get next higher namespace
- $ns = getNS($ns);
+ $ns = getNS($ns);
- if($path != '*'){
+ if($path != '*') {
$path = $ns.':*';
if($path == ':*') $path = '*';
- }else{
+ } 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
+ } while(1); //this should never loop endless
+ return AUTH_NONE;
}
/**
@@ -602,21 +635,26 @@ function auth_aclcheck($id,$user,$groups){
* @author Andreas Gohr <gohr@cosmocode.de>
* @see rawurldecode()
*/
-function auth_nameencode($name,$skip_group=false){
+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('/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/e',
- "'%'.dechex(ord(substr('\\1',-1)))",substr($name,1));
- }else{
- $cache[$name][$skip_group] = preg_replace('/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/e',
- "'%'.dechex(ord(substr('\\1',-1)))",$name);
+ if(!isset($cache[$name][$skip_group])) {
+ if($skip_group && $name{0} == '@') {
+ $cache[$name][$skip_group] = '@'.preg_replace(
+ '/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/e',
+ "'%'.dechex(ord(substr('\\1',-1)))", substr($name, 1)
+ );
+ } else {
+ $cache[$name][$skip_group] = preg_replace(
+ '/([\x00-\x2f\x3a-\x40\x5b-\x60\x7b-\x7f])/e',
+ "'%'.dechex(ord(substr('\\1',-1)))", $name
+ );
}
}
@@ -631,20 +669,20 @@ function auth_nameencode($name,$skip_group=false){
*
* @return string pronouncable password
*/
-function auth_pwgen(){
+function auth_pwgen() {
$pw = '';
$c = 'bcdfghjklmnprstvwz'; //consonants except hard to speak ones
- $v = 'aeiou'; //vowels
- $a = $c.$v; //both
+ $v = 'aeiou'; //vowels
+ $a = $c.$v; //both
//use two syllables...
- for($i=0;$i < 2; $i++){
- $pw .= $c[rand(0, strlen($c)-1)];
- $pw .= $v[rand(0, strlen($v)-1)];
- $pw .= $a[rand(0, strlen($a)-1)];
+ for($i = 0; $i < 2; $i++) {
+ $pw .= $c[rand(0, strlen($c) - 1)];
+ $pw .= $v[rand(0, strlen($v) - 1)];
+ $pw .= $a[rand(0, strlen($a) - 1)];
}
//... and add a nice number
- $pw .= rand(10,99);
+ $pw .= rand(10, 99);
return $pw;
}
@@ -653,16 +691,16 @@ function auth_pwgen(){
* Sends a password to the given user
*
* @author Andreas Gohr <andi@splitbrain.org>
- *
+ * @param string $user Login name of the user
+ * @param string $password The new password in clear text
* @return bool true on success
*/
-function auth_sendPassword($user,$password){
- global $conf;
+function auth_sendPassword($user, $password) {
global $lang;
+ /* @var auth_basic $auth */
global $auth;
- if (!$auth) return false;
+ if(!$auth) return false;
- $hdrs = '';
$user = $auth->cleanUser($user);
$userinfo = $auth->getUserData($user);
@@ -670,15 +708,15 @@ function auth_sendPassword($user,$password){
$text = rawLocale('password');
$trep = array(
- 'FULLNAME' => $userinfo['name'],
- 'LOGIN' => $user,
- 'PASSWORD' => $password
- );
+ 'FULLNAME' => $userinfo['name'],
+ 'LOGIN' => $user,
+ 'PASSWORD' => $password
+ );
$mail = new Mailer();
$mail->to($userinfo['name'].' <'.$userinfo['mail'].'>');
$mail->subject($lang['regpwmail']);
- $mail->setBody($text,$trep);
+ $mail->setBody($text, $trep);
return $mail->send();
}
@@ -688,12 +726,12 @@ function auth_sendPassword($user,$password){
* This registers a new user - Data is read directly from $_POST
*
* @author Andreas Gohr <andi@splitbrain.org>
- *
* @return bool true on success, false on any error
*/
-function register(){
+function register() {
global $lang;
global $conf;
+ /* @var auth_basic $auth */
global $auth;
if(!$_POST['save']) return false;
@@ -703,61 +741,63 @@ function register(){
$_POST['login'] = trim($auth->cleanUser($_POST['login']));
//clean fullname and email
- $_POST['fullname'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/','',$_POST['fullname']));
- $_POST['email'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/','',$_POST['email']));
+ $_POST['fullname'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $_POST['fullname']));
+ $_POST['email'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $_POST['email']));
- if( empty($_POST['login']) ||
+ if(empty($_POST['login']) ||
empty($_POST['fullname']) ||
- empty($_POST['email']) ){
- msg($lang['regmissing'],-1);
+ empty($_POST['email'])
+ ) {
+ msg($lang['regmissing'], -1);
return false;
}
- if ($conf['autopasswd']) {
- $pass = auth_pwgen(); // automatically generate password
- } elseif (empty($_POST['pass']) ||
- empty($_POST['passchk'])) {
- msg($lang['regmissing'], -1); // complain about missing passwords
+ if($conf['autopasswd']) {
+ $pass = auth_pwgen(); // automatically generate password
+ } elseif(empty($_POST['pass']) ||
+ empty($_POST['passchk'])
+ ) {
+ msg($lang['regmissing'], -1); // complain about missing passwords
return false;
- } elseif ($_POST['pass'] != $_POST['passchk']) {
- msg($lang['regbadpass'], -1); // complain about misspelled passwords
+ } elseif($_POST['pass'] != $_POST['passchk']) {
+ msg($lang['regbadpass'], -1); // complain about misspelled passwords
return false;
} else {
- $pass = $_POST['pass']; // accept checked and valid password
+ $pass = $_POST['pass']; // accept checked and valid password
}
//check mail
- if(!mail_isvalid($_POST['email'])){
- msg($lang['regbadmail'],-1);
+ if(!mail_isvalid($_POST['email'])) {
+ msg($lang['regbadmail'], -1);
return false;
}
//okay try to create the user
- if(!$auth->triggerUserMod('create', array($_POST['login'],$pass,$_POST['fullname'],$_POST['email']))){
- msg($lang['reguexists'],-1);
+ if(!$auth->triggerUserMod('create', array($_POST['login'], $pass, $_POST['fullname'], $_POST['email']))) {
+ msg($lang['reguexists'], -1);
return false;
}
// create substitutions for use in notification email
$substitutions = array(
- 'NEWUSER' => $_POST['login'],
- 'NEWNAME' => $_POST['fullname'],
- 'NEWEMAIL' => $_POST['email'],
- );
+ 'NEWUSER' => $_POST['login'],
+ 'NEWNAME' => $_POST['fullname'],
+ 'NEWEMAIL' => $_POST['email'],
+ );
- if (!$conf['autopasswd']) {
- msg($lang['regsuccess2'],1);
+ if(!$conf['autopasswd']) {
+ msg($lang['regsuccess2'], 1);
notify('', 'register', '', $_POST['login'], false, $substitutions);
return true;
}
// autogenerated password? then send him the password
- if (auth_sendPassword($_POST['login'],$pass)){
- msg($lang['regsuccess'],1);
+ if(auth_sendPassword($_POST['login'], $pass)) {
+ msg($lang['regsuccess'], 1);
notify('', 'register', '', $_POST['login'], false, $substitutions);
return true;
- }else{
- msg($lang['regmailfail'],-1);
+ } else {
+ msg($lang['regmailfail'], -1);
return false;
}
}
@@ -769,63 +809,78 @@ function register(){
*/
function updateprofile() {
global $conf;
- global $INFO;
global $lang;
+ /* @var auth_basic $auth */
global $auth;
+ /* @var Input $INPUT */
+ global $INPUT;
- if(empty($_POST['save'])) return false;
+ if(!$INPUT->post->bool('save')) return false;
if(!checkSecurityToken()) return false;
if(!actionOK('profile')) {
- msg($lang['profna'],-1);
+ msg($lang['profna'], -1);
return false;
}
- if ($_POST['newpass'] != $_POST['passchk']) {
- msg($lang['regbadpass'], -1); // complain about misspelled passwords
+ $changes = array();
+ $changes['pass'] = $INPUT->post->str('newpass');
+ $changes['name'] = $INPUT->post->str('fullname');
+ $changes['mail'] = $INPUT->post->str('email');
+
+ // check misspelled passwords
+ if($changes['pass'] != $INPUT->post->str('passchk')) {
+ msg($lang['regbadpass'], -1);
return false;
}
- //clean fullname and email
- $_POST['fullname'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/','',$_POST['fullname']));
- $_POST['email'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/','',$_POST['email']));
+ // clean fullname and email
+ $changes['name'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $changes['name']));
+ $changes['mail'] = trim(preg_replace('/[\x00-\x1f:<>&%,;]+/', '', $changes['mail']));
- if ((empty($_POST['fullname']) && $auth->canDo('modName')) ||
- (empty($_POST['email']) && $auth->canDo('modMail'))) {
- msg($lang['profnoempty'],-1);
+ // 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($_POST['email']) && $auth->canDo('modMail')){
- msg($lang['regbadmail'],-1);
+ if(!mail_isvalid($changes['mail']) && $auth->canDo('modMail')) {
+ msg($lang['regbadmail'], -1);
return false;
}
- if ($_POST['fullname'] != $INFO['userinfo']['name'] && $auth->canDo('modName')) $changes['name'] = $_POST['fullname'];
- if ($_POST['email'] != $INFO['userinfo']['mail'] && $auth->canDo('modMail')) $changes['mail'] = $_POST['email'];
- if (!empty($_POST['newpass']) && $auth->canDo('modPass')) $changes['pass'] = $_POST['newpass'];
+ $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']);
- if (!count($changes)) {
+ // anything to do?
+ if(!count($changes)) {
msg($lang['profnochange'], -1);
return false;
}
- if ($conf['profileconfirm']) {
- if (!$auth->checkPass($_SERVER['REMOTE_USER'], $_POST['oldpass'])) {
- msg($lang['badlogin'],-1);
+ if($conf['profileconfirm']) {
+ if(!$auth->checkPass($_SERVER['REMOTE_USER'], $INPUT->post->str('oldpass'))) {
+ msg($lang['badlogin'], -1);
return false;
}
}
- if ($result = $auth->triggerUserMod('modify', array($_SERVER['REMOTE_USER'], $changes))) {
+ if($result = $auth->triggerUserMod('modify', array($_SERVER['REMOTE_USER'], $changes))) {
// update cookie and session with the changed data
- if ($changes['pass']){
- list($user,$sticky,$pass) = auth_getCookie();
- $pass = PMA_blowfish_encrypt($changes['pass'],auth_cookiesalt(!$sticky));
- auth_setCookie($_SERVER['REMOTE_USER'],$pass,(bool)$sticky);
+ if($changes['pass']) {
+ list( /*user*/, $sticky, /*pass*/) = auth_getCookie();
+ $pass = PMA_blowfish_encrypt($changes['pass'], auth_cookiesalt(!$sticky));
+ auth_setCookie($_SERVER['REMOTE_USER'], $pass, (bool) $sticky);
}
return true;
}
+
+ return false;
}
/**
@@ -842,68 +897,73 @@ function updateprofile() {
*
* @return bool true on success, false on any error
*/
-function act_resendpwd(){
+function act_resendpwd() {
global $lang;
global $conf;
+ /* @var auth_basic $auth */
global $auth;
+ /* @var Input $INPUT */
+ global $INPUT;
if(!actionOK('resendpwd')) {
- msg($lang['resendna'],-1);
+ msg($lang['resendna'], -1);
return false;
}
- $token = preg_replace('/[^a-f0-9]+/','',$_REQUEST['pwauth']);
+ $token = preg_replace('/[^a-f0-9]+/', '', $INPUT->str('pwauth'));
- if($token){
+ 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);
- unset($_REQUEST['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);
- unset($_REQUEST['pwauth']);
+ if((time() - filemtime($tfile)) > (3 * 60 * 60 * 24)) {
+ msg($lang['resendpwdbadauth'], -1);
+ $INPUT->remove('pwauth');
@unlink($tfile);
return false;
}
- $user = io_readfile($tfile);
+ $user = io_readfile($tfile);
$userinfo = $auth->getUserData($user);
if(!$userinfo['mail']) {
msg($lang['resendpwdnouser'], -1);
return false;
}
- if(!$conf['autopasswd']){ // we let the user choose a password
+ if(!$conf['autopasswd']) { // we let the user choose a password
+ $pass = $INPUT->str('pass');
+
// password given correctly?
- if(!isset($_REQUEST['pass']) || $_REQUEST['pass'] == '') return false;
- if($_REQUEST['pass'] != $_REQUEST['passchk']){
- msg($lang['regbadpass'],-1);
+ if(!$pass) return false;
+ if($pass != $INPUT->str('passchk')) {
+ msg($lang['regbadpass'], -1);
return false;
}
- $pass = $_REQUEST['pass'];
- if (!$auth->triggerUserMod('modify', array($user,array('pass' => $pass)))) {
- msg('error modifying user data',-1);
+ // change it
+ if(!$auth->triggerUserMod('modify', array($user, array('pass' => $pass)))) {
+ msg('error modifying user data', -1);
return false;
}
- }else{ // autogenerate the password and send by mail
+ } else { // autogenerate the password and send by mail
$pass = auth_pwgen();
- if (!$auth->triggerUserMod('modify', array($user,array('pass' => $pass)))) {
- msg('error modifying user data',-1);
+ if(!$auth->triggerUserMod('modify', array($user, array('pass' => $pass)))) {
+ msg('error modifying user data', -1);
return false;
}
- if (auth_sendPassword($user,$pass)) {
- msg($lang['resendpwdsuccess'],1);
+ if(auth_sendPassword($user, $pass)) {
+ msg($lang['resendpwdsuccess'], 1);
} else {
- msg($lang['regmailfail'],-1);
+ msg($lang['regmailfail'], -1);
}
}
@@ -913,13 +973,13 @@ function act_resendpwd(){
} else {
// we're in request phase
- if(!$_POST['save']) return false;
+ if(!$INPUT->post->bool('save')) return false;
- if (empty($_POST['login'])) {
+ if(!$INPUT->post->str('login')) {
msg($lang['resendpwdmissing'], -1);
return false;
} else {
- $user = trim($auth->cleanUser($_POST['login']));
+ $user = trim($auth->cleanUser($INPUT->post->str('login')));
}
$userinfo = $auth->getUserData($user);
@@ -931,30 +991,29 @@ function act_resendpwd(){
// generate auth token
$token = md5(auth_cookiesalt().$user); //secret but user based
$tfile = $conf['cachedir'].'/'.$token{0}.'/'.$token.'.pwauth';
- $url = wl('',array('do'=>'resendpwd','pwauth'=>$token),true,'&');
+ $url = wl('', array('do'=> 'resendpwd', 'pwauth'=> $token), true, '&');
- io_saveFile($tfile,$user);
+ io_saveFile($tfile, $user);
$text = rawLocale('pwconfirm');
$trep = array(
- 'FULLNAME' => $userinfo['name'],
- 'LOGIN' => $user,
- 'CONFIRM' => $url
- );
+ '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);
+ $mail->setBody($text, $trep);
+ if($mail->send()) {
+ msg($lang['resendpwdconfirm'], 1);
+ } else {
+ msg($lang['regmailfail'], -1);
}
return true;
}
-
- return false; // never reached
+ // never reached
}
/**
@@ -964,32 +1023,37 @@ function act_resendpwd(){
* is chosen.
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $clear The clear text password
+ * @param string $method The hashing method
+ * @param string $salt A salt, null for random
* @return string The crypted password
*/
-function auth_cryptPassword($clear,$method='',$salt=null){
+function auth_cryptPassword($clear, $method = '', $salt = null) {
global $conf;
if(empty($method)) $method = $conf['passcrypt'];
- $pass = new PassHash();
- $call = 'hash_'.$method;
+ $pass = new PassHash();
+ $call = 'hash_'.$method;
- if(!method_exists($pass,$call)){
- msg("Unsupported crypt method $method",-1);
+ if(!method_exists($pass, $call)) {
+ msg("Unsupported crypt method $method", -1);
return false;
}
- return $pass->$call($clear,$salt);
+ return $pass->$call($clear, $salt);
}
/**
* Verifies a cleartext password against a crypted hash
*
- * @author Andreas Gohr <andi@splitbrain.org>
- * @return bool
+ * @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $clear The clear text password
+ * @param string $crypt The hash to compare with
+ * @return bool true if both match
*/
-function auth_verifyPassword($clear,$crypt){
+function auth_verifyPassword($clear, $crypt) {
$pass = new PassHash();
- return $pass->verify_hash($clear,$crypt);
+ return $pass->verify_hash($clear, $crypt);
}
/**
@@ -998,23 +1062,25 @@ function auth_verifyPassword($clear,$crypt){
* @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) {
+function auth_setCookie($user, $pass, $sticky) {
global $conf;
+ /* @var auth_basic $auth */
global $auth;
global $USERINFO;
- if (!$auth) return false;
+ if(!$auth) return false;
$USERINFO = $auth->getUserData($user);
// set cookie
- $cookie = base64_encode($user).'|'.((int) $sticky).'|'.base64_encode($pass);
+ $cookie = base64_encode($user).'|'.((int) $sticky).'|'.base64_encode($pass);
$cookieDir = empty($conf['cookiedir']) ? DOKU_REL : $conf['cookiedir'];
- $time = $sticky ? (time()+60*60*24*365) : 0; //one year
- if (version_compare(PHP_VERSION, '5.2.0', '>')) {
- setcookie(DOKU_COOKIE,$cookie,$time,$cookieDir,'',($conf['securecookie'] && is_ssl()),true);
- }else{
- setcookie(DOKU_COOKIE,$cookie,$time,$cookieDir,'',($conf['securecookie'] && is_ssl()));
+ $time = $sticky ? (time() + 60 * 60 * 24 * 365) : 0; //one year
+ if(version_compare(PHP_VERSION, '5.2.0', '>')) {
+ setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()), true);
+ } else {
+ setcookie(DOKU_COOKIE, $cookie, $time, $cookieDir, '', ($conf['securecookie'] && is_ssl()));
}
// set session
$_SESSION[DOKU_COOKIE]['auth']['user'] = $user;
@@ -1022,6 +1088,8 @@ function auth_setCookie($user,$pass,$sticky) {
$_SESSION[DOKU_COOKIE]['auth']['buid'] = auth_browseruid();
$_SESSION[DOKU_COOKIE]['auth']['info'] = $USERINFO;
$_SESSION[DOKU_COOKIE]['auth']['time'] = time();
+
+ return true;
}
/**
@@ -1029,15 +1097,15 @@ function auth_setCookie($user,$pass,$sticky) {
*
* @returns array
*/
-function auth_getCookie(){
- if (!isset($_COOKIE[DOKU_COOKIE])) {
+function auth_getCookie() {
+ if(!isset($_COOKIE[DOKU_COOKIE])) {
return array(null, null, null);
}
- list($user,$sticky,$pass) = explode('|',$_COOKIE[DOKU_COOKIE],3);
+ list($user, $sticky, $pass) = explode('|', $_COOKIE[DOKU_COOKIE], 3);
$sticky = (bool) $sticky;
$pass = base64_decode($pass);
$user = base64_decode($user);
- return array($user,$sticky,$pass);
+ return array($user, $sticky, $pass);
}
//Setup VIM: ex: et ts=2 :
diff --git a/inc/cache.php b/inc/cache.php
index ff78e37ae..5eac94934 100644
--- a/inc/cache.php
+++ b/inc/cache.php
@@ -69,7 +69,7 @@ class cache {
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?
+ if ($this->_time <= @filemtime($file)) return false; // cache older than files it depends on?
}
}
@@ -84,7 +84,8 @@ class cache {
* it should only overwrite a dependency when the new value is more stringent than the old
*/
function _addDependencies() {
- if (isset($_REQUEST['purge'])) $this->depends['purge'] = true; // purge requested
+ global $INPUT;
+ if ($INPUT->has('purge')) $this->depends['purge'] = true; // purge requested
}
/**
@@ -206,6 +207,8 @@ class cache_renderer extends cache_parser {
return true;
}
+ if ($this->_time < @filemtime(metaFN($this->page,'.meta'))) return false; // meta cache older than file it depends on?
+
// check current link existence is consistent with cache version
// first check the purgefile
// - if the cache is more recent than the purgefile we know no links can have been updated
@@ -238,9 +241,6 @@ class cache_renderer extends cache_parser {
// page implies metadata and possibly some other dependencies
if (isset($this->page)) {
- $metafile = metaFN($this->page,'.meta');
- $files[] = $metafile; // ... the page's own metadata
-
$valid = p_get_metadata($this->page, 'date valid'); // for xhtml this will render the metadata if needed
if (!empty($valid['age'])) {
$this->depends['age'] = isset($this->depends['age']) ?
diff --git a/inc/common.php b/inc/common.php
index cd0780730..02ed2432b 100644
--- a/inc/common.php
+++ b/inc/common.php
@@ -11,11 +11,11 @@ if(!defined('DOKU_INC')) die('meh.');
/**
* These constants are used with the recents function
*/
-define('RECENTS_SKIP_DELETED',2);
-define('RECENTS_SKIP_MINORS',4);
-define('RECENTS_SKIP_SUBSPACES',8);
-define('RECENTS_MEDIA_CHANGES',16);
-define('RECENTS_MEDIA_PAGES_MIXED',32);
+define('RECENTS_SKIP_DELETED', 2);
+define('RECENTS_SKIP_MINORS', 4);
+define('RECENTS_SKIP_SUBSPACES', 8);
+define('RECENTS_MEDIA_CHANGES', 16);
+define('RECENTS_MEDIA_PAGES_MIXED', 32);
/**
* Wrapper around htmlspecialchars()
@@ -23,7 +23,7 @@ define('RECENTS_MEDIA_PAGES_MIXED',32);
* @author Andreas Gohr <andi@splitbrain.org>
* @see htmlspecialchars()
*/
-function hsc($string){
+function hsc($string) {
return htmlspecialchars($string, ENT_QUOTES, 'UTF-8');
}
@@ -34,7 +34,7 @@ function hsc($string){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function ptln($string,$indent=0){
+function ptln($string, $indent = 0) {
echo str_repeat(' ', $indent)."$string\n";
}
@@ -43,8 +43,8 @@ function ptln($string,$indent=0){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function stripctl($string){
- return preg_replace('/[\x00-\x1F]+/s','',$string);
+function stripctl($string) {
+ return preg_replace('/[\x00-\x1F]+/s', '', $string);
}
/**
@@ -55,19 +55,20 @@ function stripctl($string){
* @link http://christ1an.blogspot.com/2007/04/preventing-csrf-efficiently.html
* @return string
*/
-function getSecurityToken(){
+function getSecurityToken() {
return md5(auth_cookiesalt().session_id().$_SERVER['REMOTE_USER']);
}
/**
* Check the secret CSRF token
*/
-function checkSecurityToken($token=null){
+function checkSecurityToken($token = null) {
+ global $INPUT;
if(!$_SERVER['REMOTE_USER']) return true; // no logged in user, no need for a check
- if(is_null($token)) $token = $_REQUEST['sectok'];
- if(getSecurityToken() != $token){
- msg('Security Token did not match. Possible CSRF attack.',-1);
+ 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;
@@ -78,13 +79,10 @@ function checkSecurityToken($token=null){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function formSecurityToken($print=true){
+function formSecurityToken($print = true) {
$ret = '<div class="no"><input type="hidden" name="sectok" value="'.getSecurityToken().'" /></div>'."\n";
- if($print){
- echo $ret;
- }else{
- return $ret;
- }
+ if($print) echo $ret;
+ return $ret;
}
/**
@@ -93,7 +91,7 @@ function formSecurityToken($print=true){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function pageinfo(){
+function pageinfo() {
global $ID;
global $REV;
global $RANGE;
@@ -102,32 +100,32 @@ function pageinfo(){
// 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['id'] = $ID;
$info['rev'] = $REV;
// set info about manager/admin status.
$info['isadmin'] = false;
$info['ismanager'] = false;
- if(isset($_SERVER['REMOTE_USER'])){
- $info['userinfo'] = $USERINFO;
- $info['perm'] = auth_quickaclcheck($ID);
- $info['subscribed'] = get_info_subscribed();
- $info['client'] = $_SERVER['REMOTE_USER'];
+ if(isset($_SERVER['REMOTE_USER'])) {
+ $info['userinfo'] = $USERINFO;
+ $info['perm'] = auth_quickaclcheck($ID);
+ $info['subscribed'] = get_info_subscribed();
+ $info['client'] = $_SERVER['REMOTE_USER'];
- if($info['perm'] == AUTH_ADMIN){
+ if($info['perm'] == AUTH_ADMIN) {
$info['isadmin'] = true;
$info['ismanager'] = true;
- }elseif(auth_ismanager()){
+ } elseif(auth_ismanager()) {
$info['ismanager'] = true;
}
// if some outside auth were used only REMOTE_USER is set
- if(!$info['userinfo']['name']){
+ if(!$info['userinfo']['name']) {
$info['userinfo']['name'] = $_SERVER['REMOTE_USER'];
}
- }else{
- $info['perm'] = auth_aclcheck($ID,'',null);
+ } else {
+ $info['perm'] = auth_aclcheck($ID, '', null);
$info['subscribed'] = false;
$info['client'] = clientIP(true);
}
@@ -136,76 +134,76 @@ function pageinfo(){
$info['locked'] = checklock($ID);
$info['filepath'] = fullpath(wikiFN($ID));
$info['exists'] = @file_exists($info['filepath']);
- if($REV){
+ if($REV) {
//check if current revision was meant
- if($info['exists'] && (@filemtime($info['filepath'])==$REV)){
+ if($info['exists'] && (@filemtime($info['filepath']) == $REV)) {
$REV = '';
- }elseif($RANGE){
+ } elseif($RANGE) {
//section editing does not work with old revisions!
$REV = '';
$RANGE = '';
- msg($lang['nosecedit'],0);
- }else{
+ msg($lang['nosecedit'], 0);
+ } else {
//really use old revision
- $info['filepath'] = fullpath(wikiFN($ID,$REV));
+ $info['filepath'] = fullpath(wikiFN($ID, $REV));
$info['exists'] = @file_exists($info['filepath']);
}
}
$info['rev'] = $REV;
- if($info['exists']){
+ if($info['exists']) {
$info['writable'] = (is_writable($info['filepath']) &&
- ($info['perm'] >= AUTH_EDIT));
- }else{
+ ($info['perm'] >= AUTH_EDIT));
+ } else {
$info['writable'] = ($info['perm'] >= AUTH_CREATE);
}
- $info['editable'] = ($info['writable'] && empty($info['locked']));
- $info['lastmod'] = @filemtime($info['filepath']);
+ $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
- if($REV){
+ if($REV) {
$revinfo = getRevisionInfo($ID, $REV, 1024);
- }else{
- if (is_array($info['meta']['last_change'])) {
+ } else {
+ if(is_array($info['meta']['last_change'])) {
$revinfo = $info['meta']['last_change'];
} else {
$revinfo = getRevisionInfo($ID, $info['lastmod'], 1024);
// cache most recent changelog line in metadata if missing and still valid
- if ($revinfo!==false) {
+ if($revinfo !== false) {
$info['meta']['last_change'] = $revinfo;
p_set_metadata($ID, array('last_change' => $revinfo));
}
}
}
//and check for an external edit
- if($revinfo!==false && $revinfo['date']!=$info['lastmod']){
+ if($revinfo !== false && $revinfo['date'] != $info['lastmod']) {
// cached changelog line no longer valid
- $revinfo = false;
+ $revinfo = false;
$info['meta']['last_change'] = $revinfo;
p_set_metadata($ID, array('last_change' => $revinfo));
}
- $info['ip'] = $revinfo['ip'];
- $info['user'] = $revinfo['user'];
- $info['sum'] = $revinfo['sum'];
+ $info['ip'] = $revinfo['ip'];
+ $info['user'] = $revinfo['user'];
+ $info['sum'] = $revinfo['sum'];
// See also $INFO['meta']['last_change'] which is the most recent log line for page $ID.
// Use $INFO['meta']['last_change']['type']===DOKU_CHANGE_TYPE_MINOR_EDIT in place of $info['minor'].
- if($revinfo['user']){
+ if($revinfo['user']) {
$info['editor'] = $revinfo['user'];
- }else{
+ } else {
$info['editor'] = $revinfo['ip'];
}
// draft
- $draft = getCacheName($info['client'].$ID,'.draft');
- if(@file_exists($draft)){
- if(@filemtime($draft) < @filemtime(wikiFN($ID))){
+ $draft = getCacheName($info['client'].$ID, '.draft');
+ if(@file_exists($draft)) {
+ if(@filemtime($draft) < @filemtime(wikiFN($ID))) {
// remove stale draft
@unlink($draft);
- }else{
+ } else {
$info['draft'] = $draft;
}
}
@@ -221,14 +219,14 @@ function pageinfo(){
*
* @author Andreas Gohr
*/
-function buildURLparams($params, $sep='&amp;'){
+function buildURLparams($params, $sep = '&amp;') {
$url = '';
$amp = false;
- foreach($params as $key => $val){
+ foreach($params as $key => $val) {
if($amp) $url .= $sep;
$url .= rawurlencode($key).'=';
- $url .= rawurlencode((string)$val);
+ $url .= rawurlencode((string) $val);
$amp = true;
}
return $url;
@@ -241,29 +239,28 @@ function buildURLparams($params, $sep='&amp;'){
*
* @author Andreas Gohr
*/
-function buildAttributes($params,$skipempty=false){
- $url = '';
+function buildAttributes($params, $skipempty = false) {
+ $url = '';
$white = false;
- foreach($params as $key => $val){
+ foreach($params as $key => $val) {
if($key{0} == '_') continue;
if($val === '' && $skipempty) continue;
if($white) $url .= ' ';
$url .= $key.'="';
- $url .= htmlspecialchars ($val);
+ $url .= htmlspecialchars($val);
$url .= '"';
$white = true;
}
return $url;
}
-
/**
* This builds the breadcrumb trail and returns it as array
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function breadcrumbs(){
+function breadcrumbs() {
// we prepare the breadcrumbs early for quick session closing
static $crumbs = null;
if($crumbs != null) return $crumbs;
@@ -276,30 +273,30 @@ function breadcrumbs(){
$crumbs = isset($_SESSION[DOKU_COOKIE]['bc']) ? $_SESSION[DOKU_COOKIE]['bc'] : array();
//we only save on show and existing wiki documents
$file = wikiFN($ID);
- if($ACT != 'show' || !@file_exists($file)){
+ if($ACT != 'show' || !@file_exists($file)) {
$_SESSION[DOKU_COOKIE]['bc'] = $crumbs;
return $crumbs;
}
// page names
$name = noNSorNS($ID);
- if (useHeading('navigation')) {
+ if(useHeading('navigation')) {
// get page title
- $title = p_get_first_heading($ID,METADATA_RENDER_USING_SIMPLE_CACHE);
- if ($title) {
+ $title = p_get_first_heading($ID, METADATA_RENDER_USING_SIMPLE_CACHE);
+ if($title) {
$name = $title;
}
}
//remove ID from array
- if (isset($crumbs[$ID])) {
+ if(isset($crumbs[$ID])) {
unset($crumbs[$ID]);
}
//add to array
$crumbs[$ID] = $name;
//reduce size
- while(count($crumbs) > $conf['breadcrumbs']){
+ while(count($crumbs) > $conf['breadcrumbs']) {
array_shift($crumbs);
}
//save to session
@@ -318,18 +315,19 @@ function breadcrumbs(){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function idfilter($id,$ue=true){
+function idfilter($id, $ue = true) {
global $conf;
- if ($conf['useslash'] && $conf['userewrite']){
- $id = strtr($id,':','/');
- }elseif (strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' &&
- $conf['userewrite']) {
- $id = strtr($id,':',';');
- }
- if($ue){
+ if($conf['useslash'] && $conf['userewrite']) {
+ $id = strtr($id, ':', '/');
+ } elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' &&
+ $conf['userewrite']
+ ) {
+ $id = strtr($id, ':', ';');
+ }
+ if($ue) {
$id = rawurlencode($id);
- $id = str_replace('%3A',':',$id); //keep as colon
- $id = str_replace('%2F','/',$id); //keep as slash
+ $id = str_replace('%3A', ':', $id); //keep as colon
+ $id = str_replace('%2F', '/', $id); //keep as slash
}
return $id;
}
@@ -342,33 +340,33 @@ function idfilter($id,$ue=true){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function wl($id='',$urlParameters='',$absolute=false,$separator='&amp;'){
+function wl($id = '', $urlParameters = '', $absolute = false, $separator = '&amp;') {
global $conf;
- if(is_array($urlParameters)){
- $urlParameters = buildURLparams($urlParameters,$separator);
- }else{
- $urlParameters = str_replace(',',$separator,$urlParameters);
+ if(is_array($urlParameters)) {
+ $urlParameters = buildURLparams($urlParameters, $separator);
+ } else {
+ $urlParameters = str_replace(',', $separator, $urlParameters);
}
- if ($id === '') {
+ if($id === '') {
$id = $conf['start'];
}
$id = idfilter($id);
- if($absolute){
+ if($absolute) {
$xlink = DOKU_URL;
- }else{
+ } else {
$xlink = DOKU_BASE;
}
- if($conf['userewrite'] == 2){
+ if($conf['userewrite'] == 2) {
$xlink .= DOKU_SCRIPT.'/'.$id;
if($urlParameters) $xlink .= '?'.$urlParameters;
- }elseif($conf['userewrite']){
+ } elseif($conf['userewrite']) {
$xlink .= $id;
if($urlParameters) $xlink .= '?'.$urlParameters;
- }elseif($id){
+ } elseif($id) {
$xlink .= DOKU_SCRIPT.'?id='.$id;
if($urlParameters) $xlink .= $separator.$urlParameters;
- }else{
+ } else {
$xlink .= DOKU_SCRIPT;
if($urlParameters) $xlink .= '?'.$urlParameters;
}
@@ -383,29 +381,29 @@ function wl($id='',$urlParameters='',$absolute=false,$separator='&amp;'){
*
* @author Ben Coburn <btcoburn@silicodon.net>
*/
-function exportlink($id='',$format='raw',$more='',$abs=false,$sep='&amp;'){
+function exportlink($id = '', $format = 'raw', $more = '', $abs = false, $sep = '&amp;') {
global $conf;
- if(is_array($more)){
- $more = buildURLparams($more,$sep);
- }else{
- $more = str_replace(',',$sep,$more);
+ if(is_array($more)) {
+ $more = buildURLparams($more, $sep);
+ } else {
+ $more = str_replace(',', $sep, $more);
}
$format = rawurlencode($format);
- $id = idfilter($id);
- if($abs){
+ $id = idfilter($id);
+ if($abs) {
$xlink = DOKU_URL;
- }else{
+ } else {
$xlink = DOKU_BASE;
}
- if($conf['userewrite'] == 2){
+ if($conf['userewrite'] == 2) {
$xlink .= DOKU_SCRIPT.'/'.$id.'?do=export_'.$format;
if($more) $xlink .= $sep.$more;
- }elseif($conf['userewrite'] == 1){
+ } elseif($conf['userewrite'] == 1) {
$xlink .= '_export/'.$format.'/'.$id;
if($more) $xlink .= '?'.$more;
- }else{
+ } else {
$xlink .= DOKU_SCRIPT.'?do=export_'.$format.$sep.'id='.$id;
if($more) $xlink .= $sep.$more;
}
@@ -421,42 +419,43 @@ function exportlink($id='',$format='raw',$more='',$abs=false,$sep='&amp;'){
* 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 boolean $direct - link to detail page if false
- * @param string $sep - URL parameter separator
- * @param boolean $abs - Create an absolute URL
+ * @param string $id the media file id or URL
+ * @param mixed $more string or array with additional parameters
+ * @param bool $direct link to detail page if false
+ * @param string $sep URL parameter separator
+ * @param bool $abs Create an absolute URL
+ * @return string
*/
-function ml($id='',$more='',$direct=true,$sep='&amp;',$abs=false){
+function ml($id = '', $more = '', $direct = true, $sep = '&amp;', $abs = false) {
global $conf;
- if(is_array($more)){
+ if(is_array($more)) {
// strip defaults for shorter URLs
if(isset($more['cache']) && $more['cache'] == 'cache') unset($more['cache']);
if(!$more['w']) unset($more['w']);
if(!$more['h']) unset($more['h']);
if(isset($more['id']) && $direct) unset($more['id']);
- $more = buildURLparams($more,$sep);
- }else{
- $more = str_replace('cache=cache','',$more); //skip default
- $more = str_replace(',,',',',$more);
- $more = str_replace(',',$sep,$more);
+ $more = buildURLparams($more, $sep);
+ } else {
+ $more = str_replace('cache=cache', '', $more); //skip default
+ $more = str_replace(',,', ',', $more);
+ $more = str_replace(',', $sep, $more);
}
- if($abs){
+ if($abs) {
$xlink = DOKU_URL;
- }else{
+ } else {
$xlink = DOKU_BASE;
}
// external URLs are always direct without rewriting
- if(preg_match('#^(https?|ftp)://#i',$id)){
+ if(preg_match('#^(https?|ftp)://#i', $id)) {
$xlink .= 'lib/exe/fetch.php';
// add hash:
- $xlink .= '?hash='.substr(md5(auth_cookiesalt().$id),0,6);
- if($more){
+ $xlink .= '?hash='.substr(md5(auth_cookiesalt().$id), 0, 6);
+ if($more) {
$xlink .= $sep.$more;
$xlink .= $sep.'media='.rawurlencode($id);
- }else{
+ } else {
$xlink .= $sep.'media='.rawurlencode($id);
}
return $xlink;
@@ -465,29 +464,29 @@ function ml($id='',$more='',$direct=true,$sep='&amp;',$abs=false){
$id = idfilter($id);
// decide on scriptname
- if($direct){
- if($conf['userewrite'] == 1){
+ if($direct) {
+ if($conf['userewrite'] == 1) {
$script = '_media';
- }else{
+ } else {
$script = 'lib/exe/fetch.php';
}
- }else{
- if($conf['userewrite'] == 1){
+ } else {
+ if($conf['userewrite'] == 1) {
$script = '_detail';
- }else{
+ } else {
$script = 'lib/exe/detail.php';
}
}
// build URL based on rewrite mode
- if($conf['userewrite']){
+ if($conf['userewrite']) {
$xlink .= $script.'/'.$id;
if($more) $xlink .= '?'.$more;
- }else{
- if($more){
+ } else {
+ if($more) {
$xlink .= $script.'?'.$more;
$xlink .= $sep.'media='.$id;
- }else{
+ } else {
$xlink .= $script.'?media='.$id;
}
}
@@ -495,15 +494,13 @@ function ml($id='',$more='',$direct=true,$sep='&amp;',$abs=false){
return $xlink;
}
-
-
/**
* Just builds a link to a script
*
* @todo maybe obsolete
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function script($script='doku.php'){
+function script($script = 'doku.php') {
return DOKU_BASE.DOKU_SCRIPT;
}
@@ -531,7 +528,7 @@ function script($script='doku.php'){
* @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=''){
+function checkwordblock($text = '') {
global $TEXT;
global $PRE;
global $SUF;
@@ -543,32 +540,32 @@ function checkwordblock($text=''){
if(!$text) $text = "$PRE $TEXT $SUF";
// we prepare the text a tiny bit to prevent spammers circumventing URL checks
- $text = preg_replace('!(\b)(www\.[\w.:?\-;,]+?\.[\w.:?\-;,]+?[\w/\#~:.?+=&%@\!\-.:?\-;,]+?)([.:?\-;,]*[^\w/\#~:.?+=&%@\!\-.:?\-;,])!i','\1http://\2 \2\3',$text);
+ $text = preg_replace('!(\b)(www\.[\w.:?\-;,]+?\.[\w.:?\-;,]+?[\w/\#~:.?+=&%@\!\-.:?\-;,]+?)([.:?\-;,]*[^\w/\#~:.?+=&%@\!\-.:?\-;,])!i', '\1http://\2 \2\3', $text);
$wordblocks = getWordblocks();
// how many lines to read at once (to work around some PCRE limits)
- if(version_compare(phpversion(),'4.3.0','<')){
+ if(version_compare(phpversion(), '4.3.0', '<')) {
// old versions of PCRE define a maximum of parenthesises even if no
// backreferences are used - the maximum is 99
// this is very bad performancewise and may even be too high still
$chunksize = 40;
- }else{
+ } else {
// read file in chunks of 200 - this should work around the
// MAX_PATTERN_SIZE in modern PCRE
$chunksize = 200;
}
- while($blocks = array_splice($wordblocks,0,$chunksize)){
+ while($blocks = array_splice($wordblocks, 0, $chunksize)) {
$re = array();
// build regexp from blocks
- foreach($blocks as $block){
- $block = preg_replace('/#.*$/','',$block);
+ foreach($blocks as $block) {
+ $block = preg_replace('/#.*$/', '', $block);
$block = trim($block);
if(empty($block)) continue;
- $re[] = $block;
+ $re[] = $block;
}
- if(count($re) && preg_match('#('.join('|',$re).')#si',$text,$matches)) {
+ if(count($re) && preg_match('#('.join('|', $re).')#si', $text, $matches)) {
// prepare event data
- $data['matches'] = $matches;
+ $data['matches'] = $matches;
$data['userinfo']['ip'] = $_SERVER['REMOTE_ADDR'];
if($_SERVER['REMOTE_USER']) {
$data['userinfo']['user'] = $_SERVER['REMOTE_USER'];
@@ -592,42 +589,43 @@ function checkwordblock($text=''){
* a routable public address, prefering the ones suplied in the X
* headers
*
- * @param boolean $single If set only a single IP is returned
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param boolean $single If set only a single IP is returned
+ * @return string
*/
-function clientIP($single=false){
- $ip = array();
+function clientIP($single = false) {
+ $ip = array();
$ip[] = $_SERVER['REMOTE_ADDR'];
if(!empty($_SERVER['HTTP_X_FORWARDED_FOR']))
- $ip = array_merge($ip,explode(',',str_replace(' ','',$_SERVER['HTTP_X_FORWARDED_FOR'])));
+ $ip = array_merge($ip, explode(',', str_replace(' ', '', $_SERVER['HTTP_X_FORWARDED_FOR'])));
if(!empty($_SERVER['HTTP_X_REAL_IP']))
- $ip = array_merge($ip,explode(',',str_replace(' ','',$_SERVER['HTTP_X_REAL_IP'])));
+ $ip = array_merge($ip, explode(',', str_replace(' ', '', $_SERVER['HTTP_X_REAL_IP'])));
// some IPv4/v6 regexps borrowed from Feyd
// see: http://forums.devnetwork.net/viewtopic.php?f=38&t=53479
- $dec_octet = '(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[0-9])';
- $hex_digit = '[A-Fa-f0-9]';
- $h16 = "{$hex_digit}{1,4}";
+ $dec_octet = '(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[0-9])';
+ $hex_digit = '[A-Fa-f0-9]';
+ $h16 = "{$hex_digit}{1,4}";
$IPv4Address = "$dec_octet\\.$dec_octet\\.$dec_octet\\.$dec_octet";
- $ls32 = "(?:$h16:$h16|$IPv4Address)";
+ $ls32 = "(?:$h16:$h16|$IPv4Address)";
$IPv6Address =
"(?:(?:{$IPv4Address})|(?:".
- "(?:$h16:){6}$ls32" .
- "|::(?:$h16:){5}$ls32" .
- "|(?:$h16)?::(?:$h16:){4}$ls32" .
- "|(?:(?:$h16:){0,1}$h16)?::(?:$h16:){3}$ls32" .
- "|(?:(?:$h16:){0,2}$h16)?::(?:$h16:){2}$ls32" .
- "|(?:(?:$h16:){0,3}$h16)?::(?:$h16:){1}$ls32" .
- "|(?:(?:$h16:){0,4}$h16)?::$ls32" .
- "|(?:(?:$h16:){0,5}$h16)?::$h16" .
- "|(?:(?:$h16:){0,6}$h16)?::" .
- ")(?:\\/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))?)";
+ "(?:$h16:){6}$ls32".
+ "|::(?:$h16:){5}$ls32".
+ "|(?:$h16)?::(?:$h16:){4}$ls32".
+ "|(?:(?:$h16:){0,1}$h16)?::(?:$h16:){3}$ls32".
+ "|(?:(?:$h16:){0,2}$h16)?::(?:$h16:){2}$ls32".
+ "|(?:(?:$h16:){0,3}$h16)?::(?:$h16:){1}$ls32".
+ "|(?:(?:$h16:){0,4}$h16)?::$ls32".
+ "|(?:(?:$h16:){0,5}$h16)?::$h16".
+ "|(?:(?:$h16:){0,6}$h16)?::".
+ ")(?:\\/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))?)";
// remove any non-IP stuff
- $cnt = count($ip);
+ $cnt = count($ip);
$match = array();
- for($i=0; $i<$cnt; $i++){
- if(preg_match("/^$IPv4Address$/",$ip[$i],$match) || preg_match("/^$IPv6Address$/",$ip[$i],$match)) {
+ for($i = 0; $i < $cnt; $i++) {
+ if(preg_match("/^$IPv4Address$/", $ip[$i], $match) || preg_match("/^$IPv6Address$/", $ip[$i], $match)) {
$ip[$i] = $match[0];
} else {
$ip[$i] = '';
@@ -637,14 +635,14 @@ function clientIP($single=false){
$ip = array_values(array_unique($ip));
if(!$ip[0]) $ip[0] = '0.0.0.0'; // for some strange reason we don't have a IP
- if(!$single) return join(',',$ip);
+ if(!$single) return join(',', $ip);
// decide which IP to use, trying to avoid local addresses
$ip = array_reverse($ip);
- foreach($ip as $i){
- if(preg_match('/^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/',$i)){
+ foreach($ip as $i) {
+ if(preg_match('/^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/', $i)) {
continue;
- }else{
+ } else {
return $i;
}
}
@@ -659,42 +657,42 @@ function clientIP($single=false){
*
* @link http://www.brainhandles.com/2007/10/15/detecting-mobile-browsers/#code
*/
-function clientismobile(){
+function clientismobile() {
if(isset($_SERVER['HTTP_X_WAP_PROFILE'])) return true;
- if(preg_match('/wap\.|\.wap/i',$_SERVER['HTTP_ACCEPT'])) return true;
+ if(preg_match('/wap\.|\.wap/i', $_SERVER['HTTP_ACCEPT'])) return true;
if(!isset($_SERVER['HTTP_USER_AGENT'])) return false;
$uamatches = 'midp|j2me|avantg|docomo|novarra|palmos|palmsource|240x320|opwv|chtml|pda|windows ce|mmp\/|blackberry|mib\/|symbian|wireless|nokia|hand|mobi|phone|cdm|up\.b|audio|SIE\-|SEC\-|samsung|HTC|mot\-|mitsu|sagem|sony|alcatel|lg|erics|vx|NEC|philips|mmm|xx|panasonic|sharp|wap|sch|rover|pocket|benq|java|pt|pg|vox|amoi|bird|compal|kg|voda|sany|kdd|dbt|sendo|sgh|gradi|jb|\d\d\di|moto';
- if(preg_match("/$uamatches/i",$_SERVER['HTTP_USER_AGENT'])) return true;
+ if(preg_match("/$uamatches/i", $_SERVER['HTTP_USER_AGENT'])) return true;
return false;
}
-
/**
* Convert one or more comma separated IPs to hostnames
*
* If $conf['dnslookups'] is disabled it simply returns the input string
*
* @author Glen Harris <astfgl@iamnota.org>
- * @returns a comma separated list of hostnames
+ * @param string $ips comma separated list of IP addresses
+ * @return string a comma separated list of hostnames
*/
-function gethostsbyaddrs($ips){
+function gethostsbyaddrs($ips) {
global $conf;
if(!$conf['dnslookups']) return $ips;
$hosts = array();
- $ips = explode(',',$ips);
+ $ips = explode(',', $ips);
if(is_array($ips)) {
- foreach($ips as $ip){
+ foreach($ips as $ip) {
$hosts[] = gethostbyaddr(trim($ip));
}
- return join(',',$hosts);
+ return join(',', $hosts);
} else {
return gethostbyaddr(trim($ips));
}
@@ -707,7 +705,7 @@ function gethostsbyaddrs($ips){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function checklock($id){
+function checklock($id) {
global $conf;
$lock = wikiLockFN($id);
@@ -715,14 +713,14 @@ function checklock($id){
if(!@file_exists($lock)) return false;
//lockfile expired
- if((time() - filemtime($lock)) > $conf['locktime']){
+ if((time() - filemtime($lock)) > $conf['locktime']) {
@unlink($lock);
return false;
}
//my own lock
- list($ip,$session) = explode("\n",io_readFile($lock));
- if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()){
+ list($ip, $session) = explode("\n", io_readFile($lock));
+ if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()) {
return false;
}
@@ -734,18 +732,18 @@ function checklock($id){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function lock($id){
+function lock($id) {
global $conf;
- if($conf['locktime'] == 0){
+ if($conf['locktime'] == 0) {
return;
}
$lock = wikiLockFN($id);
- if($_SERVER['REMOTE_USER']){
- io_saveFile($lock,$_SERVER['REMOTE_USER']);
- }else{
- io_saveFile($lock,clientIP()."\n".session_id());
+ if($_SERVER['REMOTE_USER']) {
+ io_saveFile($lock, $_SERVER['REMOTE_USER']);
+ } else {
+ io_saveFile($lock, clientIP()."\n".session_id());
}
}
@@ -753,13 +751,14 @@ function lock($id){
* Unlock a page if it was locked by the user
*
* @author Andreas Gohr <andi@splitbrain.org>
+ * @param string $id page id to unlock
* @return bool true if a lock was removed
*/
-function unlock($id){
+function unlock($id) {
$lock = wikiLockFN($id);
- if(@file_exists($lock)){
- list($ip,$session) = explode("\n",io_readFile($lock));
- if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()){
+ if(@file_exists($lock)) {
+ list($ip, $session) = explode("\n", io_readFile($lock));
+ if($ip == $_SERVER['REMOTE_USER'] || $ip == clientIP() || $session == session_id()) {
@unlink($lock);
return true;
}
@@ -773,8 +772,8 @@ function unlock($id){
* @see formText() for 2crlf conversion
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function cleanText($text){
- $text = preg_replace("/(\015\012)|(\015)/","\012",$text);
+function cleanText($text) {
+ $text = preg_replace("/(\015\012)|(\015)/", "\012", $text);
return $text;
}
@@ -786,8 +785,8 @@ function cleanText($text){
* @see cleanText() for 2unix conversion
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function formText($text){
- $text = str_replace("\012","\015\012",$text);
+function formText($text) {
+ $text = str_replace("\012", "\015\012", $text);
return htmlspecialchars($text);
}
@@ -796,8 +795,8 @@ function formText($text){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rawLocale($id,$ext='txt'){
- return io_readFile(localeFN($id,$ext));
+function rawLocale($id, $ext = 'txt') {
+ return io_readFile(localeFN($id, $ext));
}
/**
@@ -805,7 +804,7 @@ function rawLocale($id,$ext='txt'){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rawWiki($id,$rev=''){
+function rawWiki($id, $rev = '') {
return io_readWikiPage(wikiFN($id, $rev), $id, $rev);
}
@@ -815,34 +814,33 @@ function rawWiki($id,$rev=''){
* @triggers COMMON_PAGETPL_LOAD
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function pageTemplate($id){
+function pageTemplate($id) {
global $conf;
- if (is_array($id)) $id = $id[0];
+ if(is_array($id)) $id = $id[0];
// prepare initial event data
$data = array(
- 'id' => $id, // the id of the page to be created
- 'tpl' => '', // the text used as template
- 'tplfile' => '', // the file above text was/should be loaded from
- 'doreplace' => true // should wildcard replacements be done on the text?
+ 'id' => $id, // the id of the page to be created
+ 'tpl' => '', // the text used as template
+ 'tplfile' => '', // the file above text was/should be loaded from
+ 'doreplace' => true // should wildcard replacements be done on the text?
);
- $evt = new Doku_Event('COMMON_PAGETPL_LOAD',$data);
- if($evt->advise_before(true)){
+ $evt = new Doku_Event('COMMON_PAGETPL_LOAD', $data);
+ if($evt->advise_before(true)) {
// the before event might have loaded the content already
- if(empty($data['tpl'])){
+ if(empty($data['tpl'])) {
// if the before event did not set a template file, try to find one
- if(empty($data['tplfile'])){
+ if(empty($data['tplfile'])) {
$path = dirname(wikiFN($id));
- $tpl = '';
- if(@file_exists($path.'/_template.txt')){
+ if(@file_exists($path.'/_template.txt')) {
$data['tplfile'] = $path.'/_template.txt';
- }else{
+ } else {
// search upper namespaces for templates
- $len = strlen(rtrim($conf['datadir'],'/'));
- while (strlen($path) >= $len){
- if(@file_exists($path.'/__template.txt')){
+ $len = strlen(rtrim($conf['datadir'], '/'));
+ while(strlen($path) >= $len) {
+ if(@file_exists($path.'/__template.txt')) {
$data['tplfile'] = $path.'/__template.txt';
break;
}
@@ -868,6 +866,12 @@ function pageTemplate($id){
* @author Andreas Gohr <andi@splitbrain.org>
*/
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;
@@ -877,39 +881,41 @@ function parsePageTemplate(&$data) {
$file = noNS($id);
$page = strtr($file, $conf['sepchar'], ' ');
- $tpl = str_replace(array(
- '@ID@',
- '@NS@',
- '@FILE@',
- '@!FILE@',
- '@!FILE!@',
- '@PAGE@',
- '@!PAGE@',
- '@!!PAGE@',
- '@!PAGE!@',
- '@USER@',
- '@NAME@',
- '@MAIL@',
- '@DATE@',
- ),
- array(
- $id,
- getNS($id),
- $file,
- utf8_ucfirst($file),
- utf8_strtoupper($file),
- $page,
- utf8_ucfirst($page),
- utf8_ucwords($page),
- utf8_strtoupper($page),
- $_SERVER['REMOTE_USER'],
- $USERINFO['name'],
- $USERINFO['mail'],
- $conf['dformat'],
- ), $tpl);
+ $tpl = str_replace(
+ array(
+ '@ID@',
+ '@NS@',
+ '@FILE@',
+ '@!FILE@',
+ '@!FILE!@',
+ '@PAGE@',
+ '@!PAGE@',
+ '@!!PAGE@',
+ '@!PAGE!@',
+ '@USER@',
+ '@NAME@',
+ '@MAIL@',
+ '@DATE@',
+ ),
+ array(
+ $id,
+ getNS($id),
+ $file,
+ utf8_ucfirst($file),
+ utf8_strtoupper($file),
+ $page,
+ utf8_ucfirst($page),
+ utf8_ucwords($page),
+ utf8_strtoupper($page),
+ $_SERVER['REMOTE_USER'],
+ $USERINFO['name'],
+ $USERINFO['mail'],
+ $conf['dformat'],
+ ), $tpl
+ );
// we need the callback to work around strftime's char limit
- $tpl = preg_replace_callback('/%./',create_function('$m','return strftime($m[0]);'),$tpl);
+ $tpl = preg_replace_callback('/%./', create_function('$m', 'return strftime($m[0]);'), $tpl);
$data['tpl'] = $tpl;
return $tpl;
}
@@ -924,17 +930,17 @@ function parsePageTemplate(&$data) {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function rawWikiSlices($range,$id,$rev=''){
+function rawWikiSlices($range, $id, $rev = '') {
$text = io_readWikiPage(wikiFN($id, $rev), $id, $rev);
// Parse range
- list($from,$to) = explode('-',$range,2);
+ list($from, $to) = explode('-', $range, 2);
// Make range zero-based, use defaults if marker is missing
$from = !$from ? 0 : ($from - 1);
$to = !$to ? strlen($text) : ($to - 1);
$slices[0] = substr($text, 0, $from);
- $slices[1] = substr($text, $from, $to-$from);
+ $slices[1] = substr($text, $from, $to - $from);
$slices[2] = substr($text, $to);
return $slices;
}
@@ -948,14 +954,16 @@ function rawWikiSlices($range,$id,$rev=''){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function con($pre,$text,$suf,$pretty=false){
- if($pretty){
- if ($pre !== '' && substr($pre, -1) !== "\n" &&
- substr($text, 0, 1) !== "\n") {
+function con($pre, $text, $suf, $pretty = false) {
+ if($pretty) {
+ if($pre !== '' && substr($pre, -1) !== "\n" &&
+ substr($text, 0, 1) !== "\n"
+ ) {
$pre .= "\n";
}
- if ($suf !== '' && substr($text, -1) !== "\n" &&
- substr($suf, 0, 1) !== "\n") {
+ if($suf !== '' && substr($text, -1) !== "\n" &&
+ substr($suf, 0, 1) !== "\n"
+ ) {
$text .= "\n";
}
}
@@ -970,7 +978,7 @@ function con($pre,$text,$suf,$pretty=false){
* @author Andreas Gohr <andi@splitbrain.org>
* @author Ben Coburn <btcoburn@silicodon.net>
*/
-function saveWikiText($id,$text,$summary,$minor=false){
+function saveWikiText($id, $text, $summary, $minor = false) {
/* Note to developers:
This code is subtle and delicate. Test the behavior of
the attic and changelog with dokuwiki and external edits
@@ -981,31 +989,31 @@ function saveWikiText($id,$text,$summary,$minor=false){
global $lang;
global $REV;
// ignore if no changes were made
- if($text == rawWiki($id,'')){
+ if($text == rawWiki($id, '')) {
return;
}
- $file = wikiFN($id);
- $old = @filemtime($file); // from page
- $wasRemoved = (trim($text) == ''); // check for empty or whitespace only
- $wasCreated = !@file_exists($file);
- $wasReverted = ($REV==true);
- $newRev = false;
- $oldRev = getRevisions($id, -1, 1, 1024); // from changelog
- $oldRev = (int)(empty($oldRev)?0:$oldRev[0]);
- if(!@file_exists(wikiFN($id, $old)) && @file_exists($file) && $old>=$oldRev) {
+ $file = wikiFN($id);
+ $old = @filemtime($file); // from page
+ $wasRemoved = (trim($text) == ''); // check for empty or whitespace only
+ $wasCreated = !@file_exists($file);
+ $wasReverted = ($REV == true);
+ $newRev = false;
+ $oldRev = getRevisions($id, -1, 1, 1024); // from changelog
+ $oldRev = (int) (empty($oldRev) ? 0 : $oldRev[0]);
+ if(!@file_exists(wikiFN($id, $old)) && @file_exists($file) && $old >= $oldRev) {
// add old revision to the attic if missing
saveOldRevision($id);
// add a changelog entry if this edit came from outside dokuwiki
- if ($old>$oldRev) {
- addLogEntry($old, $id, DOKU_CHANGE_TYPE_EDIT, $lang['external_edit'], '', array('ExternalEdit'=>true));
+ if($old > $oldRev) {
+ addLogEntry($old, $id, DOKU_CHANGE_TYPE_EDIT, $lang['external_edit'], '', array('ExternalEdit'=> true));
// remove soon to be stale instructions
$cache = new cache_instructions($id, $file);
$cache->removeCache();
}
}
- if ($wasRemoved){
+ if($wasRemoved) {
// Send "update" event with empty data, so plugins can react to page deletion
$data = array(array($file, '', false), getNS($id), noNS($id), false);
trigger_event('IO_WIKIPAGE_WRITE', $data);
@@ -1024,37 +1032,40 @@ function saveWikiText($id,$text,$summary,$minor=false){
// remove empty namespaces
io_sweepNS($id, 'datadir');
io_sweepNS($id, 'mediadir');
- }else{
+ } else {
// save file (namespace dir is created in io_writeWikiPage)
io_writeWikiPage($file, $text, $id);
// pre-save the revision, to keep the attic in sync
$newRev = saveOldRevision($id);
- $del = false;
+ $del = false;
}
// select changelog line type
$extra = '';
- $type = DOKU_CHANGE_TYPE_EDIT;
- if ($wasReverted) {
- $type = DOKU_CHANGE_TYPE_REVERT;
+ $type = DOKU_CHANGE_TYPE_EDIT;
+ if($wasReverted) {
+ $type = DOKU_CHANGE_TYPE_REVERT;
$extra = $REV;
- }
- else if ($wasCreated) { $type = DOKU_CHANGE_TYPE_CREATE; }
- else if ($wasRemoved) { $type = DOKU_CHANGE_TYPE_DELETE; }
- else if ($minor && $conf['useacl'] && $_SERVER['REMOTE_USER']) { $type = DOKU_CHANGE_TYPE_MINOR_EDIT; } //minor edits only for logged in users
+ } else if($wasCreated) {
+ $type = DOKU_CHANGE_TYPE_CREATE;
+ } else if($wasRemoved) {
+ $type = DOKU_CHANGE_TYPE_DELETE;
+ } else if($minor && $conf['useacl'] && $_SERVER['REMOTE_USER']) {
+ $type = DOKU_CHANGE_TYPE_MINOR_EDIT;
+ } //minor edits only for logged in users
addLogEntry($newRev, $id, $type, $summary, $extra);
// send notify mails
- notify($id,'admin',$old,$summary,$minor);
- notify($id,'subscribers',$old,$summary,$minor);
+ notify($id, 'admin', $old, $summary, $minor);
+ notify($id, 'subscribers', $old, $summary, $minor);
// update the purgefile (timestamp of the last time anything within the wiki was changed)
- io_saveFile($conf['cachedir'].'/purgefile',time());
+ io_saveFile($conf['cachedir'].'/purgefile', time());
// if useheading is enabled, purge the cache of all linking pages
- if(useHeading('content')){
+ if(useHeading('content')) {
$pages = ft_backlinks($id);
- foreach ($pages as $page) {
+ foreach($pages as $page) {
$cache = new cache_renderer($page, wikiFN($page), 'xhtml');
$cache->removeCache();
}
@@ -1067,12 +1078,12 @@ function saveWikiText($id,$text,$summary,$minor=false){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function saveOldRevision($id){
+function saveOldRevision($id) {
global $conf;
$oldf = wikiFN($id);
if(!@file_exists($oldf)) return '';
$date = filemtime($oldf);
- $newf = wikiFN($id,$date);
+ $newf = wikiFN($id, $date);
io_writeWikiPage($newf, rawWiki($id), $id, $date);
return $date;
}
@@ -1080,72 +1091,75 @@ function saveOldRevision($id){
/**
* 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 $rev Old page revision
- * @param string $summary What changed
- * @param boolean $minor Is this a minor edit?
- * @param array $replace Additional string substitutions, @KEY@ to be replaced by value
+ * @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 array $replace Additional string substitutions, @KEY@ to be replaced by value
*
+ * @return bool
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function notify($id,$who,$rev='',$summary='',$minor=false,$replace=array()){
+function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = array()) {
global $lang;
global $conf;
global $INFO;
global $DIFF_INLINESTYLES;
// decide if there is something to do, eg. whom to mail
- if($who == 'admin'){
- if(empty($conf['notify'])) return; //notify enabled?
+ if($who == 'admin') {
+ if(empty($conf['notify'])) return false; //notify enabled?
$text = rawLocale('mailtext');
$to = $conf['notify'];
$bcc = '';
- }elseif($who == 'subscribers'){
- if(!$conf['subscribers']) return; //subscribers enabled?
- if($conf['useacl'] && $_SERVER['REMOTE_USER'] && $minor) return; //skip minors
+ } elseif($who == 'subscribers') {
+ if(!$conf['subscribers']) return false; //subscribers enabled?
+ if($conf['useacl'] && $_SERVER['REMOTE_USER'] && $minor) return false; //skip minors
$data = array('id' => $id, 'addresslist' => '', 'self' => false);
- trigger_event('COMMON_NOTIFY_ADDRESSLIST', $data,
- 'subscription_addresslist');
+ trigger_event(
+ 'COMMON_NOTIFY_ADDRESSLIST', $data,
+ 'subscription_addresslist'
+ );
$bcc = $data['addresslist'];
- if(empty($bcc)) return;
+ if(empty($bcc)) return false;
$to = '';
$text = rawLocale('subscr_single');
- }elseif($who == 'register'){
- if(empty($conf['registernotify'])) return;
+ } elseif($who == 'register') {
+ if(empty($conf['registernotify'])) return false;
$text = rawLocale('registermail');
$to = $conf['registernotify'];
$bcc = '';
- }else{
- return; //just to be safe
+ } else {
+ return false; //just to be safe
}
// prepare replacements (keys not set in hrep will be taken from trep)
$trep = array(
- 'NEWPAGE' => wl($id,'',true,'&'),
+ 'NEWPAGE' => wl($id, '', true, '&'),
'PAGE' => $id,
'SUMMARY' => $summary
);
- $trep = array_merge($trep,$replace);
+ $trep = array_merge($trep, $replace);
$hrep = array();
// prepare content
- if($who == 'register'){
- $subject = $lang['mail_new_user'].' '.$summary;
- }elseif($rev){
+ if($who == 'register') {
+ $subject = $lang['mail_new_user'].' '.$summary;
+ } elseif($rev) {
$subject = $lang['mail_changed'].' '.$id;
- $trep['OLDPAGE'] = wl($id,"rev=$rev",true,'&');
- $df = new Diff(explode("\n",rawWiki($id,$rev)),
- explode("\n",rawWiki($id)));
+ $trep['OLDPAGE'] = wl($id, "rev=$rev", true, '&');
+ $df = new Diff(explode("\n", rawWiki($id, $rev)),
+ explode("\n", rawWiki($id)));
$dformat = new UnifiedDiffFormatter();
$tdiff = $dformat->format($df);
$DIFF_INLINESTYLES = true;
- $dformat = new InlineDiffFormatter();
- $hdiff = $dformat->format($df);
- $hdiff = '<table>'.$hdiff.'</table>';
+ $dformat = new InlineDiffFormatter();
+ $hdiff = $dformat->format($df);
+ $hdiff = '<table>'.$hdiff.'</table>';
$DIFF_INLINESTYLES = false;
- }else{
+ } else {
$subject = $lang['mail_newpage'].' '.$id;
$trep['OLDPAGE'] = '---';
$tdiff = rawWiki($id);
@@ -1159,11 +1173,11 @@ function notify($id,$who,$rev='',$summary='',$minor=false,$replace=array()){
$mail->to($to);
$mail->bcc($bcc);
$mail->subject($subject);
- $mail->setBody($text,$trep,$hrep);
- if($who == 'subscribers'){
+ $mail->setBody($text, $trep, $hrep);
+ if($who == 'subscribers') {
$mail->setHeader(
'List-Unsubscribe',
- '<'.wl($id,array('do'=>'subscribe'),true,'&').'>',
+ '<'.wl($id, array('do'=> 'subscribe'), true, '&').'>',
false
);
}
@@ -1176,8 +1190,8 @@ function notify($id,$who,$rev='',$summary='',$minor=false,$replace=array()){
* @author Andreas Gohr <andi@splitbrain.org>
* @author Todd Augsburger <todd@rollerorgans.com>
*/
-function getGoogleQuery(){
- if (!isset($_SERVER['HTTP_REFERER'])) {
+function getGoogleQuery() {
+ if(!isset($_SERVER['HTTP_REFERER'])) {
return '';
}
$url = parse_url($_SERVER['HTTP_REFERER']);
@@ -1187,21 +1201,21 @@ function getGoogleQuery(){
// temporary workaround against PHP bug #49733
// see http://bugs.php.net/bug.php?id=49733
if(UTF8_MBSTRING) $enc = mb_internal_encoding();
- parse_str($url['query'],$query);
+ parse_str($url['query'], $query);
if(UTF8_MBSTRING) mb_internal_encoding($enc);
$q = '';
if(isset($query['q']))
- $q = $query['q']; // google, live/msn, aol, ask, altavista, alltheweb, gigablast
+ $q = $query['q']; // google, live/msn, aol, ask, altavista, alltheweb, gigablast
elseif(isset($query['p']))
- $q = $query['p']; // yahoo
+ $q = $query['p']; // yahoo
elseif(isset($query['query']))
- $q = $query['query']; // lycos, netscape, clusty, hotbot
- elseif(preg_match("#a9\.com#i",$url['host'])) // a9
- $q = urldecode(ltrim($url['path'],'/'));
+ $q = $query['query']; // lycos, netscape, clusty, hotbot
+ elseif(preg_match("#a9\.com#i", $url['host'])) // a9
+ $q = urldecode(ltrim($url['path'], '/'));
if($q === '') return '';
- $q = preg_split('/[\s\'"\\\\`()\]\[?:!\.{};,#+*<>\\/]+/',$q,-1,PREG_SPLIT_NO_EMPTY);
+ $q = preg_split('/[\s\'"\\\\`()\]\[?:!\.{};,#+*<>\\/]+/', $q, -1, PREG_SPLIT_NO_EMPTY);
return $q;
}
@@ -1211,19 +1225,19 @@ function getGoogleQuery(){
* @deprecated No longer used
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function setCorrectLocale(){
+function setCorrectLocale() {
global $conf;
global $lang;
$enc = strtoupper($lang['encoding']);
- foreach ($lang['locales'] as $loc){
+ foreach($lang['locales'] as $loc) {
//try locale
- if(@setlocale(LC_ALL,$loc)) return;
+ if(@setlocale(LC_ALL, $loc)) return;
//try loceale with encoding
- if(@setlocale(LC_ALL,"$loc.$enc")) return;
+ if(@setlocale(LC_ALL, "$loc.$enc")) return;
}
//still here? try to set from environment
- @setlocale(LC_ALL,"");
+ @setlocale(LC_ALL, "");
}
/**
@@ -1235,17 +1249,17 @@ function setCorrectLocale(){
* @author Aidan Lister <aidan@php.net>
* @version 1.0.0
*/
-function filesize_h($size, $dec = 1){
+function filesize_h($size, $dec = 1) {
$sizes = array('B', 'KB', 'MB', 'GB');
$count = count($sizes);
- $i = 0;
+ $i = 0;
- while ($size >= 1024 && ($i < $count - 1)) {
+ while($size >= 1024 && ($i < $count - 1)) {
$size /= 1024;
$i++;
}
- return round($size, $dec) . ' ' . $sizes[$i];
+ return round($size, $dec).' '.$sizes[$i];
}
/**
@@ -1253,27 +1267,27 @@ function filesize_h($size, $dec = 1){
*
* @author Andreas Gohr <gohr@cosmocode.de>
*/
-function datetime_h($dt){
+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 * 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 * 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 * 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 > 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 * 60 * 2) {
+ return sprintf($lang['hours'], round($ago / (60 * 60)));
}
- if($ago > 60*2){
- return sprintf($lang['minutes'], round($ago/(60)));
+ if($ago > 60 * 2) {
+ return sprintf($lang['minutes'], round($ago / (60)));
}
return sprintf($lang['seconds'], $ago);
}
@@ -1287,15 +1301,15 @@ function datetime_h($dt){
* @see datetime_h
* @author Andreas Gohr <gohr@cosmocode.de>
*/
-function dformat($dt=null,$format=''){
+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);
+ $format = str_replace('%f', datetime_h($dt), $format);
+ return strftime($format, $dt);
}
/**
@@ -1304,11 +1318,12 @@ function dformat($dt=null,$format=''){
* @author <ungu at terong dot com>
* @link http://www.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);
+ $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);
+ $time_zone = substr($pre_timezone, 0, 3).":".substr($pre_timezone, 3, 2);
$date_mod .= $time_zone;
return $date_mod;
}
@@ -1322,16 +1337,16 @@ function date_iso8601($int_date) {
function obfuscate($email) {
global $conf;
- switch ($conf['mailguard']) {
+ switch($conf['mailguard']) {
case 'visible' :
$obfuscate = array('@' => ' [at] ', '.' => ' [dot] ', '-' => ' [dash] ');
return strtr($email, $obfuscate);
case 'hex' :
$encode = '';
- $len = strlen($email);
- for ($x=0; $x < $len; $x++){
- $encode .= '&#x' . bin2hex($email{$x}).';';
+ $len = strlen($email);
+ for($x = 0; $x < $len; $x++) {
+ $encode .= '&#x'.bin2hex($email{$x}).';';
}
return $encode;
@@ -1346,8 +1361,8 @@ function obfuscate($email) {
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function unslash($string,$char="'"){
- return str_replace('\\'.$char,$char,$string);
+function unslash($string, $char = "'") {
+ return str_replace('\\'.$char, $char, $string);
}
/**
@@ -1356,10 +1371,10 @@ function unslash($string,$char="'"){
* @author <gilthans dot NO dot SPAM at gmail dot com>
* @link http://de3.php.net/manual/en/ini.core.php#79564
*/
-function php_to_byte($v){
- $l = substr($v, -1);
+function php_to_byte($v) {
+ $l = substr($v, -1);
$ret = substr($v, 0, -1);
- switch(strtoupper($l)){
+ switch(strtoupper($l)) {
case 'P':
$ret *= 1024;
case 'T':
@@ -1370,10 +1385,10 @@ function php_to_byte($v){
$ret *= 1024;
case 'K':
$ret *= 1024;
- break;
+ break;
default;
$ret *= 10;
- break;
+ break;
}
return $ret;
}
@@ -1381,8 +1396,8 @@ function php_to_byte($v){
/**
* Wrapper around preg_quote adding the default delimiter
*/
-function preg_quote_cb($string){
- return preg_quote($string,'/');
+function preg_quote_cb($string) {
+ return preg_quote($string, '/');
}
/**
@@ -1398,14 +1413,15 @@ function preg_quote_cb($string){
* @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='…'){
+function shorten($keep, $short, $max, $min = 9, $char = '…') {
$max = $max - utf8_strlen($keep);
if($max < $min) return $keep;
$len = utf8_strlen($short);
if($len <= $max) return $keep.$short;
- $half = floor($max/2);
- return $keep.utf8_substr($short,0,$half-1).$char.utf8_substr($short,$len-$half);
+ $half = floor($max / 2);
+ return $keep.utf8_substr($short, 0, $half - 1).$char.utf8_substr($short, $len - $half);
}
/**
@@ -1414,11 +1430,11 @@ function shorten($keep,$short,$max,$min=9,$char='…'){
*
* @author Andy Webber <dokuwiki AT andywebber DOT com>
*/
-function editorinfo($username){
+function editorinfo($username) {
global $conf;
global $auth;
- switch($conf['showuseras']){
+ switch($conf['showuseras']) {
case 'username':
case 'email':
case 'email_link':
@@ -1429,13 +1445,13 @@ function editorinfo($username){
}
if(isset($info) && $info) {
- switch($conf['showuseras']){
+ switch($conf['showuseras']) {
case 'username':
return hsc($info['name']);
case 'email':
return obfuscate($info['mail']);
case 'email_link':
- $mail=obfuscate($info['mail']);
+ $mail = obfuscate($info['mail']);
return '<a href="mailto:'.$mail.'">'.$mail.'</a>';
default:
return hsc($username);
@@ -1451,20 +1467,21 @@ function editorinfo($username){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @param string $type - type of image 'badge' or 'button'
+ * @return string
*/
-function license_img($type){
+function license_img($type) {
global $license;
global $conf;
if(!$conf['license']) return '';
if(!is_array($license[$conf['license']])) return '';
- $lic = $license[$conf['license']];
- $try = array();
+ $lic = $license[$conf['license']];
+ $try = array();
$try[] = 'lib/images/license/'.$type.'/'.$conf['license'].'.png';
$try[] = 'lib/images/license/'.$type.'/'.$conf['license'].'.gif';
- if(substr($conf['license'],0,3) == 'cc-'){
+ if(substr($conf['license'], 0, 3) == 'cc-') {
$try[] = 'lib/images/license/'.$type.'/cc.png';
}
- foreach($try as $src){
+ foreach($try as $src) {
if(@file_exists(DOKU_INC.$src)) return $src;
}
return '';
@@ -1476,12 +1493,15 @@ function license_img($type){
* If the memory_get_usage() function is not available the
* function just assumes $bytes of already allocated memory
*
- * @param int $mem Size of memory you want to allocate in bytes
- * @param int $used already allocated memory (see above)
* @author Filip Oscadal <webmaster@illusionsoftworks.cz>
* @author Andreas Gohr <andi@splitbrain.org>
+ *
+ * @param int $mem Size of memory you want to allocate in bytes
+ * @param int $bytes
+ * @internal param int $used already allocated memory (see above)
+ * @return bool
*/
-function is_mem_available($mem,$bytes=1048576){
+function is_mem_available($mem, $bytes = 1048576) {
$limit = trim(ini_get('memory_limit'));
if(empty($limit)) return true; // no limit set!
@@ -1489,13 +1509,13 @@ function is_mem_available($mem,$bytes=1048576){
$limit = php_to_byte($limit);
// get used memory if possible
- if(function_exists('memory_get_usage')){
+ if(function_exists('memory_get_usage')) {
$used = memory_get_usage();
- }else{
+ } else {
$used = $bytes;
}
- if($used+$mem > $limit){
+ if($used + $mem > $limit) {
return false;
}
@@ -1510,10 +1530,10 @@ function is_mem_available($mem,$bytes=1048576){
* @link http://support.microsoft.com/kb/q176113/
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function send_redirect($url){
+function send_redirect($url) {
//are there any undisplayed messages? keep them in session for display
global $MSG;
- if (isset($MSG) && count($MSG) && !defined('NOSESSION')){
+ if(isset($MSG) && count($MSG) && !defined('NOSESSION')) {
//reopen session, store data and close session again
@session_start();
$_SESSION[DOKU_COOKIE]['msg'] = $MSG;
@@ -1524,22 +1544,23 @@ function send_redirect($url){
// work around IE bug
// http://www.ianhoar.com/2008/11/16/internet-explorer-6-and-redirected-anchor-links/
- list($url,$hash) = explode('#',$url);
- if($hash){
- if(strpos($url,'?')){
+ list($url, $hash) = explode('#', $url);
+ if($hash) {
+ if(strpos($url, '?')) {
$url = $url.'&#'.$hash;
- }else{
+ } else {
$url = $url.'?&#'.$hash;
}
}
// check if running on IIS < 6 with CGI-PHP
- if( isset($_SERVER['SERVER_SOFTWARE']) && isset($_SERVER['GATEWAY_INTERFACE']) &&
- (strpos($_SERVER['GATEWAY_INTERFACE'],'CGI') !== false) &&
+ if(isset($_SERVER['SERVER_SOFTWARE']) && isset($_SERVER['GATEWAY_INTERFACE']) &&
+ (strpos($_SERVER['GATEWAY_INTERFACE'], 'CGI') !== false) &&
(preg_match('|^Microsoft-IIS/(\d)\.\d$|', trim($_SERVER['SERVER_SOFTWARE']), $matches)) &&
- $matches[1] < 6 ){
+ $matches[1] < 6
+ ) {
header('Refresh: 0;url='.$url);
- }else{
+ } else {
header('Location: '.$url);
}
exit;
@@ -1559,12 +1580,14 @@ function send_redirect($url){
* or $_GET)
* @param string $exc The text of the raised exception
*
+ * @throws Exception
+ * @return mixed
* @author Adrian Lang <lang@cosmocode.de>
*/
function valid_input_set($param, $valid_values, $array, $exc = '') {
- if (isset($array[$param]) && in_array($array[$param], $valid_values)) {
+ if(isset($array[$param]) && in_array($array[$param], $valid_values)) {
return $array[$param];
- } elseif (isset($valid_values['default'])) {
+ } elseif(isset($valid_values['default'])) {
return $valid_values['default'];
} else {
throw new Exception($exc);
@@ -1575,12 +1598,12 @@ function valid_input_set($param, $valid_values, $array, $exc = '') {
* Read a preference from the DokuWiki cookie
*/
function get_doku_pref($pref, $default) {
- if (strpos($_COOKIE['DOKU_PREFS'], $pref) !== false) {
+ if(strpos($_COOKIE['DOKU_PREFS'], $pref) !== false) {
$parts = explode('#', $_COOKIE['DOKU_PREFS']);
$cnt = count($parts);
- for ($i = 0; $i < $cnt; $i+=2){
- if ($parts[$i] == $pref) {
- return $parts[$i+1];
+ for($i = 0; $i < $cnt; $i += 2) {
+ if($parts[$i] == $pref) {
+ return $parts[$i + 1];
}
}
}
diff --git a/inc/config_cascade.php b/inc/config_cascade.php
index e4a3df353..e1ab0eead 100644
--- a/inc/config_cascade.php
+++ b/inc/config_cascade.php
@@ -50,6 +50,8 @@ $config_cascade = array_merge(
),
'userstyle' => array(
'screen' => DOKU_CONF.'userstyle.css',
+ // @deprecated 2012-04-09: rtl will cease to be a mode of its own,
+ // please use "[dir=rtl]" in any css file in all, screen or print mode instead
'rtl' => DOKU_CONF.'userrtl.css',
'print' => DOKU_CONF.'userprint.css',
'feed' => DOKU_CONF.'userfeed.css',
diff --git a/inc/farm.php b/inc/farm.php
new file mode 100644
index 000000000..af1035707
--- /dev/null
+++ b/inc/farm.php
@@ -0,0 +1,148 @@
+<?php
+/**
+ * This overwrites DOKU_CONF. Each animal gets its own configuration and data directory.
+ * This can be used together with preload.php. See preload.php.dist for an example setup.
+ * For more information see http://www.dokuwiki.org/farms.
+ *
+ * The farm directory (constant DOKU_FARMDIR) can be any directory and needs to be set.
+ * Animals are direct subdirectories of the farm directory.
+ * There are two different approaches:
+ * * An .htaccess based setup can use any animal directory name:
+ * http://example.org/<path_to_farm>/subdir/ will need the subdirectory '$farm/subdir/'.
+ * * A virtual host based setup needs animal directory names which have to reflect
+ * the domain name: If an animal resides in http://www.example.org:8080/mysite/test/,
+ * directories that will match range from '$farm/8080.www.example.org.mysite.test/'
+ * to a simple '$farm/domain/'.
+ *
+ * @author Anika Henke <anika@selfthinker.org>
+ * @author Michael Klier <chi@chimeric.de>
+ * @author Christopher Smith <chris@jalakai.co.uk>
+ * @author virtual host part of farm_confpath() based on conf_path() from Drupal.org's /includes/bootstrap.inc
+ * (see http://cvs.drupal.org/viewvc/drupal/drupal/includes/bootstrap.inc?view=markup)
+ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
+*/
+
+// DOKU_FARMDIR needs to be set in preload.php, here the fallback is the same as DOKU_INC would be (if it was set already)
+if(!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', fullpath(dirname(__FILE__).'/../').'/');
+if(!defined('DOKU_CONF')) define('DOKU_CONF', farm_confpath(DOKU_FARMDIR));
+if(!defined('DOKU_FARM')) define('DOKU_FARM', false);
+
+
+/**
+ * Find the appropriate configuration directory.
+ *
+ * If the .htaccess based setup is used, the configuration directory can be
+ * any subdirectory of the farm directory.
+ *
+ * Otherwise try finding a matching configuration directory by stripping the
+ * website's hostname from left to right and pathname from right to left. The
+ * first configuration file found will be used; the remaining will ignored.
+ * If no configuration file is found, return the default confdir './conf'.
+ */
+function farm_confpath($farm) {
+
+ // htaccess based or cli
+ // cli usage example: animal=your_animal bin/indexer.php
+ if(isset($_REQUEST['animal']) || ('cli' == php_sapi_name() && isset($_SERVER['animal']))) {
+ $mode = isset($_REQUEST['animal']) ? 'htaccess' : 'cli';
+ $animal = $mode == 'htaccess' ? $_REQUEST['animal'] : $_SERVER['animal'];
+ // check that $animal is a string and just a directory name and not a path
+ if (!is_string($animal) || strpbrk($animal, '\\/') !== false)
+ nice_die('Sorry! Invalid animal name!');
+ if(!is_dir($farm.'/'.$animal))
+ nice_die("Sorry! This Wiki doesn't exist!");
+ if(!defined('DOKU_FARM')) define('DOKU_FARM', $mode);
+ return $farm.'/'.$animal.'/conf/';
+ }
+
+ // virtual host based
+ $uri = explode('/', $_SERVER['SCRIPT_NAME'] ? $_SERVER['SCRIPT_NAME'] : $_SERVER['SCRIPT_FILENAME']);
+ $server = explode('.', implode('.', array_reverse(explode(':', rtrim($_SERVER['HTTP_HOST'], '.')))));
+ for ($i = count($uri) - 1; $i > 0; $i--) {
+ for ($j = count($server); $j > 0; $j--) {
+ $dir = implode('.', array_slice($server, -$j)) . implode('.', array_slice($uri, 0, $i));
+ if(is_dir("$farm/$dir/conf/")) {
+ if(!defined('DOKU_FARM')) define('DOKU_FARM', 'virtual');
+ return "$farm/$dir/conf/";
+ }
+ }
+ }
+
+ // default conf directory in farm
+ if(is_dir("$farm/default/conf/")) {
+ if(!defined('DOKU_FARM')) define('DOKU_FARM', 'default');
+ return "$farm/default/conf/";
+ }
+ // farmer
+ return DOKU_INC.'conf/';
+}
+
+/* Use default config files and local animal config files */
+$config_cascade = array(
+ 'main' => array(
+ 'default' => array(DOKU_INC.'conf/dokuwiki.php'),
+ 'local' => array(DOKU_CONF.'local.php'),
+ 'protected' => array(DOKU_CONF.'local.protected.php'),
+ ),
+ 'acronyms' => array(
+ 'default' => array(DOKU_INC.'conf/acronyms.conf'),
+ 'local' => array(DOKU_CONF.'acronyms.local.conf'),
+ ),
+ 'entities' => array(
+ 'default' => array(DOKU_INC.'conf/entities.conf'),
+ 'local' => array(DOKU_CONF.'entities.local.conf'),
+ ),
+ 'interwiki' => array(
+ 'default' => array(DOKU_INC.'conf/interwiki.conf'),
+ 'local' => array(DOKU_CONF.'interwiki.local.conf'),
+ ),
+ 'license' => array(
+ 'default' => array(DOKU_INC.'conf/license.php'),
+ 'local' => array(DOKU_CONF.'license.local.php'),
+ ),
+ 'mediameta' => array(
+ 'default' => array(DOKU_INC.'conf/mediameta.php'),
+ 'local' => array(DOKU_CONF.'mediameta.local.php'),
+ ),
+ 'mime' => array(
+ 'default' => array(DOKU_INC.'conf/mime.conf'),
+ 'local' => array(DOKU_CONF.'mime.local.conf'),
+ ),
+ 'scheme' => array(
+ 'default' => array(DOKU_INC.'conf/scheme.conf'),
+ 'local' => array(DOKU_CONF.'scheme.local.conf'),
+ ),
+ 'smileys' => array(
+ 'default' => array(DOKU_INC.'conf/smileys.conf'),
+ 'local' => array(DOKU_CONF.'smileys.local.conf'),
+ ),
+ 'wordblock' => array(
+ 'default' => array(DOKU_INC.'conf/wordblock.conf'),
+ 'local' => array(DOKU_CONF.'wordblock.local.conf'),
+ ),
+ 'acl' => array(
+ 'default' => DOKU_CONF.'acl.auth.php',
+ ),
+ 'plainauth.users' => array(
+ 'default' => DOKU_CONF.'users.auth.php',
+ ),
+ 'plugins' => array( // needed since Angua
+ 'default' => array(DOKU_INC.'conf/plugins.php'),
+ 'local' => array(DOKU_CONF.'plugins.local.php'),
+ 'protected' => array(
+ DOKU_INC.'conf/plugins.required.php',
+ DOKU_CONF.'plugins.protected.php',
+ ),
+ ),
+ 'userstyle' => array(
+ 'default' => DOKU_CONF.'userstyle.css', // 'default' was renamed to 'screen' on 2011-02-26, so will be deprecated in the next version
+ 'screen' => DOKU_CONF.'userstyle.css',
+ 'rtl' => DOKU_CONF.'userrtl.css', // deprecated since version after 2012-04-09
+ 'print' => DOKU_CONF.'userprint.css',
+ 'feed' => DOKU_CONF.'userfeed.css',
+ 'all' => DOKU_CONF.'userall.css',
+ ),
+ 'userscript' => array(
+ 'default' => DOKU_CONF.'userscript.js'
+ ),
+);
diff --git a/inc/form.php b/inc/form.php
index e74c52c5d..bdf520a2e 100644
--- a/inc/form.php
+++ b/inc/form.php
@@ -295,8 +295,9 @@ class Doku_Form {
*/
function addRadioSet($name, $entries) {
- $value = (isset($_POST[$name]) && isset($entries[$_POST[$name]])) ?
- $_POST[$name] : key($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));
diff --git a/inc/html.php b/inc/html.php
index be5666353..0afdb1820 100644
--- a/inc/html.php
+++ b/inc/html.php
@@ -46,6 +46,7 @@ function html_login(){
global $lang;
global $conf;
global $ID;
+ global $INPUT;
print p_locale_xhtml('login');
print '<div class="centeralign">'.NL;
@@ -53,7 +54,7 @@ function html_login(){
$form->startFieldset($lang['btn_login']);
$form->addHidden('id', $ID);
$form->addHidden('do', 'login');
- $form->addElement(form_makeTextField('u', ((!$_REQUEST['http_credentials']) ? $_REQUEST['u'] : ''), $lang['user'], 'focus__this', 'block'));
+ $form->addElement(form_makeTextField('u', ((!$INPUT->bool('http_credentials')) ? $INPUT->str('u') : ''), $lang['user'], 'focus__this', 'block'));
$form->addElement(form_makePasswordField('p', $lang['pass'], '', 'block'));
if($conf['rememberme']) {
$form->addElement(form_makeCheckboxField('r', '1', $lang['remember'], 'remember__me', 'simple'));
@@ -229,12 +230,12 @@ function html_show($txt=null){
//PreviewHeader
echo '<br id="scroll__here" />';
echo p_locale_xhtml('preview');
- echo '<div class="preview">';
+ echo '<div class="preview"><div class="pad">';
$html = html_secedit(p_render('xhtml',p_get_instructions($txt),$info),$secedit);
if($INFO['prependTOC']) $html = tpl_toc(true).$html;
echo $html;
echo '<div class="clearer"></div>';
- echo '</div>';
+ echo '</div></div>';
}else{
if ($REV) print p_locale_xhtml('showrev');
@@ -326,11 +327,11 @@ function html_search(){
flush();
//show progressbar
- print '<div class="centeralign" id="dw__loading">'.NL;
- print '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'.NL;
+ print '<div id="dw__loading">'.NL;
+ print '<script type="text/javascript"><!--//--><![CDATA[//><!--'.NL;
print 'showLoadBar();'.NL;
print '//--><!]]></script>'.NL;
- print '<br /></div>'.NL;
+ print '</div>'.NL;
flush();
//do quick pagesearch
@@ -366,26 +367,30 @@ function html_search(){
//do fulltext search
$data = ft_pageSearch($QUERY,$regex);
if(count($data)){
+ print '<dl class="search_results">';
$num = 1;
foreach($data as $id => $cnt){
- print '<div class="search_result">';
+ print '<dt>';
print html_wikilink(':'.$id,useHeading('navigation')?null:$id,$regex);
if($cnt !== 0){
- print ': <span class="search_cnt">'.$cnt.' '.$lang['hits'].'</span><br />';
+ print ': '.$cnt.' '.$lang['hits'].'';
+ }
+ print '</dt>';
+ if($cnt !== 0){
if($num < FT_SNIPPET_NUMBER){ // create snippets for the first number of matches only
- print '<div class="search_snippet">'.ft_snippet($id,$regex).'</div>';
+ print '<dd>'.ft_snippet($id,$regex).'</dd>';
}
$num++;
}
- print '</div>';
flush();
}
+ print '</dl>';
}else{
print '<div class="nothing">'.$lang['nothingfound'].'</div>';
}
//hide progressbar
- print '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'.NL;
+ print '<script type="text/javascript"><!--//--><![CDATA[//><!--'.NL;
print 'hideLoadBar("dw__loading");'.NL;
print '//--><!]]></script>'.NL;
flush();
@@ -452,7 +457,7 @@ function html_revisions($first=0, $media_id = false){
if (!$media_id) print p_locale_xhtml('revisions');
- $params = array('id' => 'page__revisions');
+ $params = array('id' => 'page__revisions', 'class' => 'changes');
if ($media_id) $params['action'] = media_managerURL(array('image' => $media_id), '&');
$form = new Doku_Form($params);
@@ -490,7 +495,7 @@ function html_revisions($first=0, $media_id = false){
if (!$media_id) {
$form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
- $form->addElement(' &ndash; ');
+ $form->addElement(' – ');
$form->addElement(htmlspecialchars($INFO['sum']));
$form->addElement(form_makeCloseTag('span'));
}
@@ -569,7 +574,7 @@ function html_revisions($first=0, $media_id = false){
if ($info['sum']) {
$form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
- if (!$media_id) $form->addElement(' &ndash; ');
+ if (!$media_id) $form->addElement(' – ');
$form->addElement(htmlspecialchars($info['sum']));
$form->addElement(form_makeCloseTag('span'));
}
@@ -667,12 +672,13 @@ function html_recent($first=0, $show_changes='both'){
if (getNS($ID) != '')
print '<div class="level1"><p>' . sprintf($lang['recent_global'], getNS($ID), wl('', 'do=recent')) . '</p></div>';
- $form = new Doku_Form(array('id' => 'dw__recent', 'method' => 'GET'));
+ $form = new Doku_Form(array('id' => 'dw__recent', 'method' => 'GET', 'class' => 'changes'));
$form->addHidden('sectok', null);
$form->addHidden('do', 'recent');
$form->addHidden('id', $ID);
if ($conf['mediarevisions']) {
+ $form->addElement('<div class="changeType">');
$form->addElement(form_makeListboxField(
'show_changes',
array(
@@ -685,6 +691,7 @@ function html_recent($first=0, $show_changes='both'){
array('class'=>'quickselect')));
$form->addElement(form_makeButton('submit', 'recent', $lang['btn_apply']));
+ $form->addElement('</div>');
}
$form->addElement(form_makeOpenTag('ul'));
@@ -759,7 +766,7 @@ function html_recent($first=0, $show_changes='both'){
$form->addElement(html_wikilink(':'.$recent['id'],useHeading('navigation')?null:$recent['id']));
}
$form->addElement(form_makeOpenTag('span', array('class' => 'sum')));
- $form->addElement(' &ndash; '.htmlspecialchars($recent['sum']));
+ $form->addElement(' – '.htmlspecialchars($recent['sum']));
$form->addElement(form_makeCloseTag('span'));
$form->addElement(form_makeOpenTag('span', array('class' => 'user')));
@@ -1070,8 +1077,9 @@ function html_diff($text='',$intro=true,$type=null){
global $REV;
global $lang;
global $conf;
+ global $INPUT;
- if(!$type) $type = $_REQUEST['difftype'];
+ if(!$type) $type = $INPUT->str('difftype');
if($type != 'inline') $type = 'sidebyside';
// we're trying to be clever here, revisions to compare can be either
@@ -1079,16 +1087,17 @@ function html_diff($text='',$intro=true,$type=null){
// array in rev2.
$rev1 = $REV;
- if(is_array($_REQUEST['rev2'])){
- $rev1 = (int) $_REQUEST['rev2'][0];
- $rev2 = (int) $_REQUEST['rev2'][1];
+ $rev2 = $INPUT->ref('rev2');
+ if(is_array($rev2)){
+ $rev1 = (int) $rev2[0];
+ $rev2 = (int) $rev2[1];
if(!$rev1){
$rev1 = $rev2;
unset($rev2);
}
}else{
- $rev2 = (int) $_REQUEST['rev2'];
+ $rev2 = $INPUT->int('rev2');
}
$r_minor = '';
@@ -1246,6 +1255,7 @@ function html_register(){
global $lang;
global $conf;
global $ID;
+ global $INPUT;
print p_locale_xhtml('register');
print '<div class="centeralign">'.NL;
@@ -1253,13 +1263,13 @@ function html_register(){
$form->startFieldset($lang['btn_register']);
$form->addHidden('do', 'register');
$form->addHidden('save', '1');
- $form->addElement(form_makeTextField('login', $_POST['login'], $lang['user'], '', 'block', array('size'=>'50')));
+ $form->addElement(form_makeTextField('login', $INPUT->post->str('login'), $lang['user'], '', 'block', array('size'=>'50')));
if (!$conf['autopasswd']) {
$form->addElement(form_makePasswordField('pass', $lang['pass'], '', 'block', array('size'=>'50')));
$form->addElement(form_makePasswordField('passchk', $lang['passchk'], '', 'block', array('size'=>'50')));
}
- $form->addElement(form_makeTextField('fullname', $_POST['fullname'], $lang['fullname'], '', 'block', array('size'=>'50')));
- $form->addElement(form_makeTextField('email', $_POST['email'], $lang['email'], '', 'block', array('size'=>'50')));
+ $form->addElement(form_makeTextField('fullname', $INPUT->post->str('fullname'), $lang['fullname'], '', 'block', array('size'=>'50')));
+ $form->addElement(form_makeTextField('email', $INPUT->post->str('email'), $lang['email'], '', 'block', array('size'=>'50')));
$form->addElement(form_makeButton('submit', '', $lang['btn_register']));
$form->endFieldset();
html_form('register', $form);
@@ -1276,26 +1286,27 @@ function html_register(){
function html_updateprofile(){
global $lang;
global $conf;
+ global $INPUT;
global $ID;
global $INFO;
global $auth;
print p_locale_xhtml('updateprofile');
- if (empty($_POST['fullname'])) $_POST['fullname'] = $INFO['userinfo']['name'];
- if (empty($_POST['email'])) $_POST['email'] = $INFO['userinfo']['mail'];
+ $fullname = $INPUT->post->str('fullname', $INFO['userinfo']['name'], true);
+ $email = $INPUT->post->str('email', $INFO['userinfo']['mail'], true);
print '<div class="centeralign">'.NL;
$form = new Doku_Form(array('id' => 'dw__register'));
$form->startFieldset($lang['profile']);
$form->addHidden('do', 'profile');
$form->addHidden('save', '1');
- $form->addElement(form_makeTextField('fullname', $_SERVER['REMOTE_USER'], $lang['user'], '', 'block', array('size'=>'50', 'disabled'=>'disabled')));
+ $form->addElement(form_makeTextField('login', $_SERVER['REMOTE_USER'], $lang['user'], '', 'block', array('size'=>'50', 'disabled'=>'disabled')));
$attr = array('size'=>'50');
if (!$auth->canDo('modName')) $attr['disabled'] = 'disabled';
- $form->addElement(form_makeTextField('fullname', $_POST['fullname'], $lang['fullname'], '', 'block', $attr));
+ $form->addElement(form_makeTextField('fullname', $fullname, $lang['fullname'], '', 'block', $attr));
$attr = array('size'=>'50');
if (!$auth->canDo('modMail')) $attr['disabled'] = 'disabled';
- $form->addElement(form_makeTextField('email', $_POST['email'], $lang['email'], '', 'block', $attr));
+ $form->addElement(form_makeTextField('email', $email, $lang['email'], '', 'block', $attr));
$form->addElement(form_makeTag('br'));
if ($auth->canDo('modPass')) {
$form->addElement(form_makePasswordField('newpass', $lang['newpass'], '', 'block', array('size'=>'50')));
@@ -1320,6 +1331,7 @@ function html_updateprofile(){
* @triggers HTML_EDITFORM_OUTPUT
*/
function html_edit(){
+ global $INPUT;
global $ID;
global $REV;
global $DATE;
@@ -1332,8 +1344,8 @@ function html_edit(){
global $TEXT;
global $RANGE;
- if (isset($_REQUEST['changecheck'])) {
- $check = $_REQUEST['changecheck'];
+ if ($INPUT->has('changecheck')) {
+ $check = $INPUT->str('changecheck');
} elseif(!$INFO['exists']){
// $TEXT has been loaded from page template
$check = md5('');
@@ -1368,8 +1380,8 @@ function html_edit(){
$data = array('form' => $form,
'wr' => $wr,
'media_manager' => true,
- 'target' => (isset($_REQUEST['target']) && $wr &&
- $RANGE !== '') ? $_REQUEST['target'] : 'section',
+ 'target' => ($INPUT->has('target') && $wr &&
+ $RANGE !== '') ? $INPUT->str('target') : 'section',
'intro_locale' => $include);
if ($data['target'] !== 'section') {
@@ -1384,7 +1396,7 @@ function html_edit(){
}
$form->addHidden('target', $data['target']);
- $form->addElement(form_makeOpenTag('div', array('id'=>'wiki__editbar')));
+ $form->addElement(form_makeOpenTag('div', array('id'=>'wiki__editbar', 'class'=>'editBar')));
$form->addElement(form_makeOpenTag('div', array('id'=>'size__ctl')));
$form->addElement(form_makeCloseTag('div'));
if ($wr) {
@@ -1412,17 +1424,16 @@ function html_edit(){
if ($wr) {
// sets changed to true when previewed
- echo '<script type="text/javascript" charset="utf-8"><!--//--><![CDATA[//><!--'. NL;
+ echo '<script type="text/javascript"><!--//--><![CDATA[//><!--'. NL;
echo 'textChanged = ' . ($mod ? 'true' : 'false');
echo '//--><!]]></script>' . NL;
} ?>
- <div style="width:99%;">
+ <div class="editBox">
<div class="toolbar">
- <div id="draft__status"><?php if(!empty($INFO['draft'])) echo $lang['draftdate'].' '.dformat();?></div>
- <div id="tool__bar"><?php if ($wr && $data['media_manager']){?><a href="<?php echo DOKU_BASE?>lib/exe/mediamanager.php?ns=<?php echo $INFO['namespace']?>"
- target="_blank"><?php echo $lang['mediaselect'] ?></a><?php }?></div>
-
+ <div id="draft__status"><?php if(!empty($INFO['draft'])) echo $lang['draftdate'].' '.dformat();?></div>
+ <div id="tool__bar"><?php if ($wr && $data['media_manager']){?><a href="<?php echo DOKU_BASE?>lib/exe/mediamanager.php?ns=<?php echo $INFO['namespace']?>"
+ target="_blank"><?php echo $lang['mediaselect'] ?></a><?php }?></div>
</div>
<?php
@@ -1456,6 +1467,7 @@ function html_edit_form($param) {
function html_minoredit(){
global $conf;
global $lang;
+ global $INPUT;
// minor edits are for logged in users only
if(!$conf['useacl'] || !$_SERVER['REMOTE_USER']){
return false;
@@ -1463,7 +1475,7 @@ function html_minoredit(){
$p = array();
$p['tabindex'] = 3;
- if(!empty($_REQUEST['minor'])) $p['checked']='checked';
+ if($INPUT->bool('minor')) $p['checked']='checked';
return form_makeCheckboxField('minor', '1', $lang['minoredit'], 'minoredit', 'nowrap', $p);
}
@@ -1669,8 +1681,9 @@ function html_resendpwd() {
global $lang;
global $conf;
global $ID;
+ global $INPUT;
- $token = preg_replace('/[^a-f0-9]+/','',$_REQUEST['pwauth']);
+ $token = preg_replace('/[^a-f0-9]+/','',$INPUT->str('pwauth'));
if(!$conf['autopasswd'] && $token){
print p_locale_xhtml('resetpwd');
@@ -1695,7 +1708,7 @@ function html_resendpwd() {
$form->addHidden('do', 'resendpwd');
$form->addHidden('save', '1');
$form->addElement(form_makeTag('br'));
- $form->addElement(form_makeTextField('login', $_POST['login'], $lang['user'], '', 'block'));
+ $form->addElement(form_makeTextField('login', $INPUT->post->str('login'), $lang['user'], '', 'block'));
$form->addElement(form_makeTag('br'));
$form->addElement(form_makeTag('br'));
$form->addElement(form_makeButton('submit', '', $lang['btn_resendpwd']));
@@ -1714,11 +1727,11 @@ function html_TOC($toc){
if(!count($toc)) return '';
global $lang;
$out = '<!-- TOC START -->'.DOKU_LF;
- $out .= '<div class="toc">'.DOKU_LF;
- $out .= '<div class="tocheader toctoggle" id="toc__header">';
+ $out .= '<div id="dw__toc">'.DOKU_LF;
+ $out .= '<h3 class="toggle">';
$out .= $lang['toc'];
- $out .= '</div>'.DOKU_LF;
- $out .= '<div id="toc__inside">'.DOKU_LF;
+ $out .= '</h3>'.DOKU_LF;
+ $out .= '<div>'.DOKU_LF;
$out .= html_buildlist($toc,'toc','html_list_toc','html_li_default',true);
$out .= '</div>'.DOKU_LF.'</div>'.DOKU_LF;
$out .= '<!-- TOC END -->'.DOKU_LF;
@@ -1735,8 +1748,7 @@ function html_list_toc($item){
$link = $item['link'];
}
- return '<span class="li"><a href="'.$link.'" class="toc">'.
- hsc($item['title']).'</a></span>';
+ return '<a href="'.$link.'">'.hsc($item['title']).'</a>';
}
/**
diff --git a/inc/init.php b/inc/init.php
index 403fbe4ab..a28050736 100644
--- a/inc/init.php
+++ b/inc/init.php
@@ -3,7 +3,9 @@
* Initialize some defaults needed for DokuWiki
*/
-// start timing Dokuwiki execution
+/**
+ * timing Dokuwiki execution
+ */
function delta_time($start=0) {
return microtime(true)-((float)$start);
}
@@ -197,6 +199,10 @@ if (empty($plugin_controller_class)) $plugin_controller_class = 'Doku_Plugin_Con
// load libraries
require_once(DOKU_INC.'inc/load.php');
+// input handle class
+global $INPUT;
+$INPUT = new Input();
+
// initialize plugin controller
$plugin_controller = new $plugin_controller_class();
diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php
index 7a246024d..562dc78b3 100644
--- a/inc/lang/bg/lang.php
+++ b/inc/lang/bg/lang.php
@@ -9,8 +9,8 @@
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
-$lang['doublequoteopening'] = '“'; //&ldquo;
-$lang['doublequoteclosing'] = '”'; //&rdquo;
+$lang['doublequoteopening'] = '"'; //&ldquo;
+$lang['doublequoteclosing'] = '"'; //&rdquo;
$lang['singlequoteopening'] = '‘'; //&lsquo;
$lang['singlequoteclosing'] = '’'; //&rsquo;
$lang['apostrophe'] = '’'; //&rsquo;
@@ -98,6 +98,7 @@ $lang['searchmedia_in'] = 'Търсене в %s';
$lang['txt_upload'] = 'Изберете файл за качване';
$lang['txt_filename'] = 'Качи като (незадължително)';
$lang['txt_overwrt'] = 'Презапиши съществуващите файлове';
+$lang['maxuploadsize'] = 'Макс. размер за отделните файлове е %s.';
$lang['lockedby'] = 'В момента е заключена от';
$lang['lockexpire'] = 'Ще бъде отключена на';
@@ -161,7 +162,7 @@ $lang['deletefail'] = '"%s" не може да бъде изтрит
$lang['mediainuse'] = 'Файлът "%s" не бе изтрит - все още се ползва.';
$lang['namespaces'] = 'Именни пространства';
$lang['mediafiles'] = 'Налични файлове в';
-$lang['accessdenied'] = 'Нямате разрешение да преглеждате страницата.';
+$lang['accessdenied'] = 'Нямате необходимите права за преглеждане на страницата.';
$lang['mediausage'] = 'Ползвайте следния синтаксис, за да упоменете файла:';
$lang['mediaview'] = 'Преглед на оригиналния файл';
$lang['mediaroot'] = 'root';
@@ -290,7 +291,6 @@ $lang['i_superuser'] = 'Супер потребител';
$lang['i_problems'] = 'Открити са проблеми, които възпрепятстват инсталирането. Ще можете да продължите след като отстраните долуизброените проблеми.';
$lang['i_modified'] = 'Поради мерки за сигурност инсталаторът работи само с нови и непроменени инсталационни файлове.
Трябва да разархивирате отново файловете от сваления архив или да се посъветвате с <a href="http://dokuwiki.org/install">Инструкциите за инсталиране на Dokuwiki</a>.';
-
$lang['i_funcna'] = 'PHP функцията <code>%s</code> не е достъпна. Може би е забранена от доставчика на хостинг.';
$lang['i_phpver'] = 'Инсталираната версия <code>%s</code> на PHP е по-стара от необходимата <code>%s</code>. Актуализирайте PHP инсталацията.';
$lang['i_permfail'] = '<code>%s</code> не е достъпна за писане от DokuWiki. Трябва да промените правата за достъп до директорията!';
diff --git a/inc/lang/bg/mailtext.txt b/inc/lang/bg/mailtext.txt
index ad0024a8d..a5f0cbd92 100644
--- a/inc/lang/bg/mailtext.txt
+++ b/inc/lang/bg/mailtext.txt
@@ -1,4 +1,4 @@
-Страница във DokuWiki е добавена или променена. Ето детайлите:
+Страница в DokuWiki е добавена или променена. Ето детайлите:
Дата : @DATE@
Браузър : @BROWSER@
diff --git a/inc/lang/bg/mailwrap.html b/inc/lang/bg/mailwrap.html
new file mode 100644
index 000000000..26b0a1e6a
--- /dev/null
+++ b/inc/lang/bg/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@.</small>
+</body>
+</html>
diff --git a/inc/lang/cs/subscr_digest.txt b/inc/lang/cs/subscr_digest.txt
index 57b7240c5..1b1770965 100644
--- a/inc/lang/cs/subscr_digest.txt
+++ b/inc/lang/cs/subscr_digest.txt
@@ -12,7 +12,7 @@ Nová revize: @NEWPAGE@
Pro odhlášení z odebírání změn na této webové stránce
se prosím příhlašte do wiki na adrese
-@DOKUWIKIURL@,pak navštivte
+@DOKUWIKIURL@, pak navštivte
@SUBSCRIBE@
a odhlaště se z odebírání změn na stránce či
ve jmenném prostoru.
diff --git a/inc/lang/cs/subscr_list.txt b/inc/lang/cs/subscr_list.txt
index 82683c57f..f85be8a9f 100644
--- a/inc/lang/cs/subscr_list.txt
+++ b/inc/lang/cs/subscr_list.txt
@@ -9,7 +9,7 @@ Zde jsou:
Pro odhlášení z odebírání změn
se prosím příhlašte do wiki na adrese
-@DOKUWIKIURL@,pak navštivte
+@DOKUWIKIURL@, pak navštivte
@SUBSCRIBE@
a odhlaště 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
index c0089c1b7..1ee33da09 100644
--- a/inc/lang/cs/subscr_single.txt
+++ b/inc/lang/cs/subscr_single.txt
@@ -15,7 +15,7 @@ Nová revize: @NEWPAGE@
Pro odhlášení z odebírání změn na této webové stránce
se prosím příhlašte do wiki na adrese
-@DOKUWIKIURL@,pak navštivte
+@DOKUWIKIURL@, pak navštivte
@SUBSCRIBE@
a odhlaště se z odebírání změn na stránce či
ve jmenném prostoru.
diff --git a/inc/lang/da/lang.php b/inc/lang/da/lang.php
index 641ea6552..97f2138b4 100644
--- a/inc/lang/da/lang.php
+++ b/inc/lang/da/lang.php
@@ -13,6 +13,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -48,11 +49,14 @@ $lang['btn_backtomedia'] = 'Tilbage til valg af mediefil';
$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'] = 'Reetablér';
$lang['btn_register'] = 'Registrér';
+$lang['btn_apply'] = 'Anvend';
+$lang['btn_media'] = 'Media Manager';
$lang['loggedinas'] = 'Logget ind som';
$lang['user'] = 'Brugernavn';
$lang['pass'] = 'Adgangskode';
@@ -82,6 +86,7 @@ $lang['profnoempty'] = 'Tomt navn eller e-mail adresse er ikke tilladt
$lang['profchanged'] = 'Brugerprofil opdateret korrekt.';
$lang['pwdforget'] = 'Har du glemt dit adgangskode? Få et nyt';
$lang['resendna'] = 'Denne wiki understøtter ikke udsendelse af nyt adgangskode.';
+$lang['resendpwd'] = 'Vælg 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.';
@@ -94,9 +99,10 @@ $lang['searchmedia_in'] = 'Søg i %s';
$lang['txt_upload'] = 'Vælg den fil der skal overføres';
$lang['txt_filename'] = 'Indtast wikinavn (valgfrit)';
$lang['txt_overwrt'] = 'Overskriv eksisterende fil';
+$lang['maxuploadsize'] = 'Upload max. %s pr. fil.';
$lang['lockedby'] = 'Midlertidig låst af';
$lang['lockexpire'] = 'Lås udløber kl.';
-$lang['js']['willexpire'] = 'Din lås på dette dokument udløber om et minut.\nTryk på Forhåndsvisning-knappen for at undgå konflikter.';
+$lang['js']['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';
@@ -128,6 +134,16 @@ Du kan stadig kopiere og indsætte linket.';
$lang['js']['linkwiz'] = 'guiden til henvisninger';
$lang['js']['linkto'] = 'Henvise til:';
$lang['js']['del_confirm'] = 'Slet valgte post(er)?';
+$lang['js']['restore_confirm'] = 'Vil du virkeligt 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_select'] = 'Vælg filer...';
+$lang['js']['media_upload_btn'] = 'Upload';
+$lang['js']['media_done_btn'] = 'Færdig';
+$lang['js']['media_drop'] = 'Drop filer her for at uploade';
+$lang['js']['media_cancel'] = 'fjern';
+$lang['js']['media_overwrt'] = 'Overskriv eksisterende filer';
$lang['rssfailed'] = 'Der opstod en fejl ved indhentning af: ';
$lang['nothingfound'] = 'Søgningen gav intet resultat.';
$lang['mediaselect'] = 'Vælg mediefil';
@@ -162,6 +178,9 @@ $lang['yours'] = 'Din version';
$lang['diff'] = 'Vis forskelle i forhold til den nuværende udgave';
$lang['diff2'] = 'Vis forskelle i forhold til de valgte revisioner';
$lang['difflink'] = 'Link til denne sammenlinings vising';
+$lang['diff_type'] = 'Vis forskelle:';
+$lang['diff_inline'] = 'Indeni';
+$lang['diff_side'] = 'Side ved Side';
$lang['line'] = 'Linje';
$lang['breadcrumb'] = 'Sti';
$lang['youarehere'] = 'Du er her';
@@ -174,11 +193,20 @@ $lang['external_edit'] = 'ekstern redigering';
$lang['summary'] = 'Redigerings resumé';
$lang['noflash'] = 'Den <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> er nødvendig til at vise denne indehold.';
$lang['download'] = 'Hente 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['mail_newpage'] = 'dokument tilføjet:';
$lang['mail_changed'] = 'dokument ændret:';
$lang['mail_subscribe_list'] = 'sider ændret i navnerum';
$lang['mail_new_user'] = 'Ny bruger';
$lang['mail_upload'] = 'fil overføret:';
+$lang['changes_type'] = 'Vis ændringer af';
+$lang['pages_changes'] = 'Sider';
+$lang['media_changes'] = 'Media filer';
+$lang['both_changes'] = 'Både sider og media filer';
$lang['qb_bold'] = 'Fed';
$lang['qb_italic'] = 'Kursiv';
$lang['qb_underl'] = 'Understregning';
@@ -219,6 +247,9 @@ $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['img_manager'] = 'Vis i Media Manager';
$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';
@@ -233,9 +264,11 @@ $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['authmodfailed'] = 'Fejl i brugervalideringens konfiguration. Kontakt venligst wikiens administrator.';
$lang['authtempfail'] = 'Brugervalidering er midlertidigt ude af drift. Hvis dette er vedvarende, kontakt venligst wikiens administrator.';
+$lang['authpwdexpire'] = 'Din adgangskode vil udløbe om %d dage, du bør ændre det snart.';
$lang['i_chooselang'] = 'Vælg dit sprog';
$lang['i_installer'] = 'DokuWiki Installer';
$lang['i_wikiname'] = 'Wiki Navn';
@@ -269,3 +302,27 @@ $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['plugin_install_err'] = 'Plugin installeret forkert. Omdøb plugin folder \'%s\' til \'%s\'.';
diff --git a/inc/lang/da/mailwrap.html b/inc/lang/da/mailwrap.html
new file mode 100644
index 000000000..0eb2e0bce
--- /dev/null
+++ b/inc/lang/da/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Denne mail blev sendt af DokuWiki på @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/da/resetpwd.txt b/inc/lang/da/resetpwd.txt
new file mode 100644
index 000000000..e0823db17
--- /dev/null
+++ b/inc/lang/da/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Vælg ny adgangskode ======
+
+Indtast venligst en ny adgangskode for din konto på denne wiki. \ No newline at end of file
diff --git a/inc/lang/da/subscr_digest.txt b/inc/lang/da/subscr_digest.txt
new file mode 100644
index 000000000..0aa19ac07
--- /dev/null
+++ b/inc/lang/da/subscr_digest.txt
@@ -0,0 +1,20 @@
+Hej,
+
+Siden @PAGE@ i @TITLE@ wikien er blevet ændret.
+Her er ændringerne:
+
+--------------------------------------------------------
+@DIFF@
+--------------------------------------------------------
+
+Gammel Revision: @OLDPAGE@
+Ny Revision: @NEWPAGE@
+
+For at stoppe notifikationer om sideændringer, login på wikien på
+@DOKUWIKIURL@ og besøg så
+@SUBSCRIBE@
+for at afmelde side og/eller navneområde ændringer.
+
+--
+Denne mail blev sendt af DokuWiki på
+@DOKUWIKIURL@ \ 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 000000000..02a34d255
--- /dev/null
+++ b/inc/lang/da/subscr_list.txt
@@ -0,0 +1,17 @@
+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.
+
+--
+Denne mail blev sendt af DokuWiki på
+@DOKUWIKIURL@ \ No newline at end of file
diff --git a/inc/lang/de-informal/lang.php b/inc/lang/de-informal/lang.php
index 61e5ef3d8..37469522f 100644
--- a/inc/lang/de-informal/lang.php
+++ b/inc/lang/de-informal/lang.php
@@ -16,7 +16,7 @@
* @author Alexander Fischer <tbanus@os-forge.net>
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
- * @author Matthias Schulte <mailinglist@lupo49.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
* @author Christian Wichmann <nospam@zone0.de>
* @author Pierre Corell <info@joomla-praxis.de>
*/
@@ -104,6 +104,7 @@ $lang['searchmedia_in'] = 'Suche in %s';
$lang['txt_upload'] = 'Datei zum Hochladen auswählen';
$lang['txt_filename'] = 'Hochladen als (optional)';
$lang['txt_overwrt'] = 'Bestehende Datei überschreiben';
+$lang['maxuploadsize'] = 'Max. %s pro Datei-Upload.';
$lang['lockedby'] = 'Momentan gesperrt von';
$lang['lockexpire'] = 'Sperre läuft ab am';
$lang['js']['willexpire'] = 'Die Sperre zur Bearbeitung dieser Seite läuft in einer Minute ab.\nUm Bearbeitungskonflikte zu vermeiden, solltest du sie durch einen Klick auf den Vorschau-Knopf verlängern.';
@@ -196,6 +197,11 @@ $lang['external_edit'] = 'Externe Bearbeitung';
$lang['summary'] = 'Zusammenfassung';
$lang['noflash'] = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Inhalt anzuzeigen.';
$lang['download'] = 'Download-Teil';
+$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['mail_newpage'] = 'Neue Seite:';
$lang['mail_changed'] = 'Seite geändert:';
$lang['mail_subscribe_list'] = 'Seite hat sich im Namespace geändert:';
@@ -248,13 +254,13 @@ $lang['img_keywords'] = 'Schlagwörter';
$lang['img_width'] = 'Breite';
$lang['img_height'] = 'Höhe';
$lang['img_manager'] = 'Im Medien-Manager anzeigen';
-$lang['subscr_subscribe_success'] = 'Die Seite %s wurde zur Abonnementenliste von %s hinzugefügt';
-$lang['subscr_subscribe_error'] = 'Fehler beim Hinzufügen von %s zur Abonnementenliste von %s';
+$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 Abonnementenliste von %s entfernt';
-$lang['subscr_unsubscribe_error'] = 'Fehler beim Entfernen von %s von der Abonnementenliste von %s';
-$lang['subscr_already_subscribed'] = '%s ist bereits auf der Abonnementenliste von %s';
-$lang['subscr_not_subscribed'] = '%s ist nicht auf der Abonnementenliste von %s';
+$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';
@@ -266,6 +272,7 @@ $lang['subscr_style_digest'] = 'E-Mail mit zusammengefasster Übersicht der Se
$lang['subscr_style_list'] = 'Auflistung aller geänderten Seiten seit der letzten E-Mail (alle %.2f Tage)';
$lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wende dich an den Admin.';
$lang['authtempfail'] = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wende dich an den Admin.';
+$lang['authpwdexpire'] = 'Dein Passwort läuft in %d Tag(en) ab, du solltest es es bald ändern.';
$lang['i_chooselang'] = 'Wähle deine Sprache';
$lang['i_installer'] = 'DokuWiki-Installation';
$lang['i_wikiname'] = 'Wiki-Name';
diff --git a/inc/lang/de-informal/mailwrap.html b/inc/lang/de-informal/mailwrap.html
new file mode 100644
index 000000000..420fdf83e
--- /dev/null
+++ b/inc/lang/de-informal/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Diese Mail kommt vom DokuWiki auf @DOKUWIKIURL@.</small>
+</body>
+</html>
diff --git a/inc/lang/de-informal/resetpwd.txt b/inc/lang/de-informal/resetpwd.txt
new file mode 100644
index 000000000..8423bd801
--- /dev/null
+++ b/inc/lang/de-informal/resetpwd.txt
@@ -0,0 +1,4 @@
+====== Neues Passwort setzen ======
+
+Bitte gib ein neues Passwort für deinen Wiki-Zugang ein.
+
diff --git a/inc/lang/de/lang.php b/inc/lang/de/lang.php
index cfbe04396..4ea75157b 100644
--- a/inc/lang/de/lang.php
+++ b/inc/lang/de/lang.php
@@ -106,6 +106,7 @@ $lang['searchmedia_in'] = 'Suche in %s';
$lang['txt_upload'] = 'Datei zum Hochladen auswählen';
$lang['txt_filename'] = 'Hochladen als (optional)';
$lang['txt_overwrt'] = 'Bestehende Datei überschreiben';
+$lang['maxuploadsize'] = 'Max. %s pro Datei-Upload.';
$lang['lockedby'] = 'Momentan gesperrt von';
$lang['lockexpire'] = 'Sperre läuft ab am';
$lang['js']['willexpire'] = 'Die Sperre zur Bearbeitung dieser Seite läuft in einer Minute ab.\nUm Bearbeitungskonflikte zu vermeiden, sollten Sie sie durch einen Klick auf den Vorschau-Knopf verlängern.';
diff --git a/inc/lang/de/mailwrap.html b/inc/lang/de/mailwrap.html
new file mode 100644
index 000000000..420fdf83e
--- /dev/null
+++ b/inc/lang/de/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Diese Mail kommt vom DokuWiki auf @DOKUWIKIURL@.</small>
+</body>
+</html>
diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php
index 7f0bf05e9..3c51ba224 100644
--- a/inc/lang/en/lang.php
+++ b/inc/lang/en/lang.php
@@ -201,6 +201,7 @@ $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:';
diff --git a/inc/lang/fa/lang.php b/inc/lang/fa/lang.php
index c55c3efdd..1b8586d5a 100644
--- a/inc/lang/fa/lang.php
+++ b/inc/lang/fa/lang.php
@@ -12,6 +12,7 @@
* @author Mohsen Firoozmandan <info@mambolearn.com>
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'rtl';
@@ -47,11 +48,14 @@ $lang['btn_backtomedia'] = 'بازگشت به انتخاب فایل';
$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'] = 'گذرواژه‌ی شما';
@@ -81,6 +85,7 @@ $lang['profnoempty'] = 'نام و آدرس ایمیل باید پر ش
$lang['profchanged'] = 'پروفایل کاربر با موفقیت به روز شد';
$lang['pwdforget'] = 'گذرواژه‌ی خود را فراموش کرده‌اید؟ جدید دریافت کنید';
$lang['resendna'] = 'این ویکی ارسال مجدد گذرواژه را پشتیبانی نمی‌کند';
+$lang['resendpwd'] = 'تعیین کلمه عبور جدید برای ';
$lang['resendpwdmissing'] = 'متاسفم، شما باید تمام قسمت‌ها را پر کنید';
$lang['resendpwdnouser'] = 'متاسفم، ما نتوانستیم این نام کاربری را در بانک خود پیدا کنیم';
$lang['resendpwdbadauth'] = 'متاسفم، کد شناسایی معتبر نیست. از صحت لینک تاییدیه اطمینان حاصل کنید.';
@@ -93,9 +98,10 @@ $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']['willexpire'] = 'حالت قفل شما مدتی است منقضی شده است \n برای جلوگیری از تداخل دکمه‌ی پیش‌نمایش را برای صفر شدن ساعت قفل بزنید.';
$lang['js']['notsavedyet'] = 'تغییرات ذخیره شده از بین خواهد رفت.
می‌خواهید ادامه دهید؟';
$lang['js']['searchmedia'] = 'جستجو برای فایل';
@@ -127,6 +133,17 @@ $lang['js']['nosmblinks'] = 'پیوند به Windows share فقط در ای
$lang['js']['linkwiz'] = 'ویزارد پیوند';
$lang['js']['linkto'] = 'پیوند به:';
$lang['js']['del_confirm'] = 'واقعن تصمیم به حذف این موارد دارید؟';
+$lang['js']['restore_confirm'] = 'آیا مطمئن هستید که می خواهید این نسخه را بازیابی کنید؟';
+$lang['js']['media_diff'] = 'تفاوت ها را ببینید : ';
+$lang['js']['media_diff_both'] = 'پهلو به پهلو';
+$lang['js']['media_diff_opacity'] = 'درخشش از';
+$lang['js']['media_diff_portions'] = 'کش رفتن';
+$lang['js']['media_select'] = 'انتخاب فایل -یا فایلها- ...';
+$lang['js']['media_upload_btn'] = 'آپلود';
+$lang['js']['media_done_btn'] = 'انجام شد';
+$lang['js']['media_drop'] = 'فایل ها را در اینجا قرار دهید تا آپلود شود';
+$lang['js']['media_cancel'] = 'حذف';
+$lang['js']['media_overwrt'] = 'جاینوشت فایل های موجود';
$lang['rssfailed'] = 'بروز خطا در هنگام واکشی';
$lang['nothingfound'] = 'چیزی پیدا نشد';
$lang['mediaselect'] = 'فایل‌ها';
@@ -176,11 +193,20 @@ $lang['external_edit'] = 'ویرایش خارجی';
$lang['summary'] = 'پیش‌نمایش';
$lang['noflash'] = 'برای نمایش محتویات <a href="http://www.adobe.com/products/flashplayer/">افزونه‌ی فلش</a> مورد نیاز است.';
$lang['download'] = 'دیافت فایل منقطع گردید';
+$lang['tools'] = 'ابزار';
+$lang['user_tools'] = 'ابزار کاربر';
+$lang['site_tools'] = 'ابزار سایت';
+$lang['page_tools'] = 'ابزار صفحه';
+$lang['skip_to_content'] = 'پرش به محتوا';
$lang['mail_newpage'] = 'صفحه اضافه شد:';
$lang['mail_changed'] = 'صفحه تغییر داده شد:';
$lang['mail_subscribe_list'] = 'صفحات تغییر داده شده در فضای‌نام';
$lang['mail_new_user'] = 'کاربر جدید:';
$lang['mail_upload'] = 'فایل ارسال شده:';
+$lang['changes_type'] = 'دیدن تغییرات';
+$lang['pages_changes'] = 'صفحات';
+$lang['media_changes'] = 'فایلهای چند رسانه ای';
+$lang['both_changes'] = 'صفحات و فایل های چند رسانه ای هر دو';
$lang['qb_bold'] = 'متن پُررنگ';
$lang['qb_italic'] = 'متن ایتالیک';
$lang['qb_underl'] = 'متن زیرخط‌دار';
@@ -221,6 +247,9 @@ $lang['img_copyr'] = 'دارنده‌ی حق تکثیر';
$lang['img_format'] = 'فرمت';
$lang['img_camera'] = 'دوربین';
$lang['img_keywords'] = 'واژه‌های کلیدی';
+$lang['img_width'] = 'عرض';
+$lang['img_height'] = 'ارتفاع';
+$lang['img_manager'] = 'دیدن در مدیریت محتوای چند رسانه ای';
$lang['subscr_subscribe_success'] = '%s به لیست آبونه %s افزوده شد';
$lang['subscr_subscribe_error'] = 'اشکال در افزودن %s به لیست آبونه %s';
$lang['subscr_subscribe_noaddress'] = 'هیچ آدرسی برای این عضویت اضافه نشده است، شما نمی‌توانید به لیست آبونه اضافه شوید';
@@ -239,6 +268,7 @@ $lang['subscr_style_digest'] = 'ارسال ایمیل‌های فشرده بر
$lang['subscr_style_list'] = 'لیست صفحات تغییر داده شده از آخرین رای‌نامه';
$lang['authmodfailed'] = 'اشکال در نوع معتبرسازی کاربران، مدیر ویکی را باخبر سازید.';
$lang['authtempfail'] = 'معتبرسازی کابران موقتن مسدود می‌باشد. اگر این حالت پایدار بود، مدیر ویکی را باخبر سازید.';
+$lang['authpwdexpire'] = 'کلمه عبور شما در %d روز منقضی خواهد شد ، شما باید آن را زود تغییر دهید';
$lang['i_chooselang'] = 'انتخاب زبان';
$lang['i_installer'] = 'نصب کننده‌ی Dokuwiki';
$lang['i_wikiname'] = 'نام ویکی';
@@ -270,3 +300,27 @@ $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['plugin_install_err'] = 'افزونه به صورت نادرست نصب شده است. دایرکتوری افزونه را از \'%s\' به \'%s\' تغییر دهید.';
diff --git a/inc/lang/fa/mailwrap.html b/inc/lang/fa/mailwrap.html
new file mode 100644
index 000000000..c313c0bf6
--- /dev/null
+++ b/inc/lang/fa/mailwrap.html
@@ -0,0 +1,14 @@
+ <html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>This mail was generated by DokuWiki at @DOKUWIKIURL@.</small>
+<small> این ایمیل توسط DokuWiki at @DOKUWIKIURL@ تولید شده است. </small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/fa/resetpwd.txt b/inc/lang/fa/resetpwd.txt
new file mode 100644
index 000000000..6a1355eba
--- /dev/null
+++ b/inc/lang/fa/resetpwd.txt
@@ -0,0 +1,3 @@
+====== تعیین کلمه عبور جدید ======
+
+لطفاً یک کلمه عبور جدید برای حساب کاربری خود در این ویکی ایجاد کنید. \ No newline at end of file
diff --git a/inc/lang/it/lang.php b/inc/lang/it/lang.php
index eda33898b..70082caae 100644
--- a/inc/lang/it/lang.php
+++ b/inc/lang/it/lang.php
@@ -13,6 +13,7 @@
* @author Matteo Carnevali <rekstorm@gmail.com>
* @author Osman Tekin <osman.tekin93@hotmail.it>
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -48,11 +49,14 @@ $lang['btn_backtomedia'] = 'Torna alla selezione file';
$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['loggedinas'] = 'Collegato come';
$lang['user'] = 'Nome utente';
$lang['pass'] = 'Password';
@@ -82,6 +86,7 @@ $lang['profnoempty'] = 'Nome o indirizzo email vuoti non sono consenti
$lang['profchanged'] = 'Aggiornamento del profilo utente riuscito.';
$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.';
@@ -94,9 +99,10 @@ $lang['searchmedia_in'] = 'Cerca in %s';
$lang['txt_upload'] = 'Seleziona un file da caricare';
$lang['txt_filename'] = 'Carica come (opzionale)';
$lang['txt_overwrt'] = 'Sovrascrivi file esistente';
+$lang['maxuploadsize'] = 'Upload max. %s per ogni file.';
$lang['lockedby'] = 'Attualmente bloccato da';
$lang['lockexpire'] = 'Il blocco scade alle';
-$lang['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']['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';
@@ -127,6 +133,15 @@ $lang['js']['nosmblinks'] = 'I collegamenti con le risorse condivise di Win
$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_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['rssfailed'] = 'Si è verificato un errore cercando questo feed: ';
$lang['nothingfound'] = 'Nessun risultato trovato.';
$lang['mediaselect'] = 'Selezione dei file';
@@ -161,6 +176,8 @@ $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_side'] = 'Fianco a Fianco';
$lang['line'] = 'Linea';
$lang['breadcrumb'] = 'Traccia';
$lang['youarehere'] = 'Ti trovi qui';
@@ -173,11 +190,19 @@ $lang['external_edit'] = 'modifica esterna';
$lang['summary'] = 'Oggetto della modifica';
$lang['noflash'] = 'E\' necessario <a href="http://www.adobe.com/products/flashplayer/">il plugin Adobe Flash</a> per visualizzare questo contenuto.';
$lang['download'] = 'Scarica lo "snippet"';
+$lang['tools'] = 'Strumenti';
+$lang['user_tools'] = 'Strumenti Utente';
+$lang['site_tools'] = 'Strumenti Sito';
+$lang['page_tools'] = 'Strumenti Pagina';
+$lang['skip_to_content'] = 'salta al contenuto';
$lang['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['both_changes'] = 'Sia pagine che media files';
$lang['qb_bold'] = 'Grassetto';
$lang['qb_italic'] = 'Corsivo';
$lang['qb_underl'] = 'Sottolineato';
@@ -218,6 +243,9 @@ $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['img_manager'] = 'Guarda nel gestore media';
$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';
@@ -236,6 +264,7 @@ $lang['subscr_style_digest'] = 'email riassuntiva delle modifiche di ogni pagi
$lang['subscr_style_list'] = 'elenco delle pagine modificate dall\'ultima email';
$lang['authmodfailed'] = 'La configurazione dell\'autenticazione non è corretta. Informa l\'amministratore di questo wiki.';
$lang['authtempfail'] = 'L\'autenticazione è temporaneamente non disponibile. Se questa situazione persiste, informa l\'amministratore di questo wiki.';
+$lang['authpwdexpire'] = 'La tua password scadrà in %d giorni, dovresti cambiarla quanto prima.';
$lang['i_chooselang'] = 'Scegli la lingua';
$lang['i_installer'] = 'Installazione di DokuWiki';
$lang['i_wikiname'] = 'Nome Wiki';
@@ -269,3 +298,20 @@ $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_searchtab'] = 'Cerca';
+$lang['media_viewtab'] = 'Guarda';
+$lang['media_edittab'] = 'Modifica';
+$lang['media_historytab'] = 'Storia';
+$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_search'] = 'Cerca in %s';
+$lang['media_edit'] = 'Modifica %s';
+$lang['media_history'] = 'Storia di %s';
+$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['plugin_install_err'] = 'Plugin installato non correttamente. Rinomino la cartella del plugin \'%s\' in \'%s\'.';
diff --git a/inc/lang/it/mailwrap.html b/inc/lang/it/mailwrap.html
new file mode 100644
index 000000000..24a2bc8a9
--- /dev/null
+++ b/inc/lang/it/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Questa email è stata generata da DokuWiki presso @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/it/resetpwd.txt b/inc/lang/it/resetpwd.txt
new file mode 100644
index 000000000..450dd8301
--- /dev/null
+++ b/inc/lang/it/resetpwd.txt
@@ -0,0 +1 @@
+Inserisci perfavore una nuova password per il tuo account su questo wiki. \ No newline at end of file
diff --git a/inc/lang/ko/admin.txt b/inc/lang/ko/admin.txt
index 7dd0f58b3..c61db1a42 100644
--- a/inc/lang/ko/admin.txt
+++ b/inc/lang/ko/admin.txt
@@ -1,4 +1,3 @@
====== 관리 작업 ======
-DokuWiki에서 사용가능한 관리 작업 목록을 아래에서 찾을 수 있습니다.
-
+DokuWiki에서 사용 가능한 관리 작업 목록을 아래에서 찾을 수 있습니다. \ No newline at end of file
diff --git a/inc/lang/ko/backlinks.txt b/inc/lang/ko/backlinks.txt
index 1711945e4..ce77ca5a7 100644
--- a/inc/lang/ko/backlinks.txt
+++ b/inc/lang/ko/backlinks.txt
@@ -1,4 +1,3 @@
-====== 백링크 ======
-
-현재 페이지로 백링크되는 페이지 목록입니다.
+====== 가리키는 링크 ======
+현재 문서를 가리키는 링크가 있는 문서 목록입니다.
diff --git a/inc/lang/ko/conflict.txt b/inc/lang/ko/conflict.txt
index 529296359..43988a62b 100644
--- a/inc/lang/ko/conflict.txt
+++ b/inc/lang/ko/conflict.txt
@@ -1,6 +1,5 @@
====== 새 버전 있음 ======
-편집하신 문서의 새 버전이 있습니다. 당신이 편집하고 있는 동안 다른 사람이 동일한 파일을 편집하였을 경우 이런 일이 생길 수 있습니다.
-
-아래의 차이점을 면밀히 검토하시고, 어떤 버전을 저장하실지 결정하십시오. **저장**을 선택하시면, 당신의 버전이 저장됩니다. **취소** 를 선택하시면 현재 버전이 유지됩니다.
+편집한 문서의 새 버전이 있습니다. 당신이 편집하고 있는 동안 다른 사람이 같은 파일을 편집하였을 경우 이런 일이 생길 수 있습니다.
+아래의 차이를 철저하게 검토하고 어떤 버전을 저장하실지 결정하십시오. **저장**을 선택하면, 당신의 버전이 저장됩니다. **취소**를 선택하면 현재 버전이 유지됩니다. \ No newline at end of file
diff --git a/inc/lang/ko/denied.txt b/inc/lang/ko/denied.txt
index 316a660c0..f384a0a8c 100644
--- a/inc/lang/ko/denied.txt
+++ b/inc/lang/ko/denied.txt
@@ -1,4 +1,3 @@
====== 권한 거절 ======
-계속할 수 있는 권한이 없습니다. 로그인하십시오.
-
+계속할 수 있는 권한이 없습니다. 로그인하십시오. \ No newline at end of file
diff --git a/inc/lang/ko/diff.txt b/inc/lang/ko/diff.txt
index 8cfb1da43..76b488d90 100644
--- a/inc/lang/ko/diff.txt
+++ b/inc/lang/ko/diff.txt
@@ -1,5 +1,3 @@
-====== 차이점 ======
-
-이 페이지의 선택한 이전 버전과 현재 버전 사이의 차이점을 보여줍니다.
-
+====== 차이 ======
+이 문서의 선택한 이전 버전과 현재 버전 사이의 차이를 보여줍니다. \ No newline at end of file
diff --git a/inc/lang/ko/draft.txt b/inc/lang/ko/draft.txt
index 3df8a5e86..861834e5d 100644
--- a/inc/lang/ko/draft.txt
+++ b/inc/lang/ko/draft.txt
@@ -1,6 +1,5 @@
-====== 문서 초안이 있습니다. ======
+====== 문서 초안 있음 ======
-이 페이지의 마지막 편집 세션은 정상적으로 끝나지 않았습니다. DokuWiki는 작업 도중 자동으로 저장된 문서 초안을 사용하여 편집을 계속 할 수 있습니다. 마지막 세션동안 저장된 문서 초안을 아래에서 볼 수 있습니다.
-
-확실하게 비정상적으로 종료된 세션을 //복구//할지 여부를 결정하고, 자동으로 저장되었던 초안을 //삭제//하거나 편집 과정을 취소하기 바랍니다.
+이 문서의 마지막 편집 세션은 정상적으로 끝나지 않았습니다. DokuWiki는 작업 도중 자동으로 저장된 문서 초안을 사용하여 편집을 계속 할 수 있습니다. 마지막 세션 동안 저장된 문서 초안을 아래에서 볼 수 있습니다.
+비정상적으로 끝난 편집 세션을 **복구**할지 여부를 결정하고, 자동으로 저장되었던 초안을 **삭제**하거나 편집 과정을 **취소**하기 바랍니다. \ No newline at end of file
diff --git a/inc/lang/ko/edit.txt b/inc/lang/ko/edit.txt
index 9b59524f7..f52326a33 100644
--- a/inc/lang/ko/edit.txt
+++ b/inc/lang/ko/edit.txt
@@ -1,2 +1 @@
-페이지를 편집하고 **저장**을 누르십시오. 위키 구문은 [[wiki:syntax]] 혹은 [[wiki:ko_syntax|(한글) 구문]]을 참고하십시오. 이 페이지를 **더 낫게 만들 자신이 있을** 때에만 편집하십시오. 실험을 하고 싶을 때에는, 먼저 [[playground:playground|연습장]] 에 가서 연습해 보십시오.
-
+문서를 편집하고 **저장**을 누르세요. 위키 구문은 [[wiki:syntax]] 또는 [[wiki:ko_syntax|(한국어) 구문]]을 참고하세요. 이 문서를 **더 좋게 만들 자신이 있을 때**에만 편집하세요. 연습을 하고 싶다면 먼저 [[playground:playground|연습장]]에 가서 연습하세요.
diff --git a/inc/lang/ko/editrev.txt b/inc/lang/ko/editrev.txt
index 2715448d3..136eef733 100644
--- a/inc/lang/ko/editrev.txt
+++ b/inc/lang/ko/editrev.txt
@@ -1,2 +1,2 @@
-**문서의 이전 버전을 선택하였습니다!** 저장할 경우 이 자료의 새 버전을 만듭니다.
+**문서의 이전 버전을 선택하였습니다!** 저장할 경우 이 데이터로 새 버전을 만듭니다.
---- \ No newline at end of file
diff --git a/inc/lang/ko/index.txt b/inc/lang/ko/index.txt
index 7ca9488e0..24eb9450c 100644
--- a/inc/lang/ko/index.txt
+++ b/inc/lang/ko/index.txt
@@ -1,4 +1,3 @@
-====== Index ======
-
-이 페이지는 [[doku>namespaces|네임스페이스]] 에서 정렬한 모든 페이지의 목록입니다.
+====== 사이트맵 ======
+이 페이지는 [[doku>namespaces|이름공간]]에서 정렬한 모든 문서의 목록입니다. \ No newline at end of file
diff --git a/inc/lang/ko/install.html b/inc/lang/ko/install.html
index 6b1bfaf75..f73b91294 100644
--- a/inc/lang/ko/install.html
+++ b/inc/lang/ko/install.html
@@ -1,17 +1,15 @@
<p>이 페이지는 <a href="http://dokuwiki.org">Dokuwiki</a> 설치와 환경 설정을 도와줍니다.
-. 설치 과정에 대한 더 자세한 정보는 <a href="http://dokuwiki.org/ko:install">한글 설치문서</a>와
-<a href="http://dokuwiki.org/install">영문 설치문서</a>를 참고하기 바랍니다.
-</p>
+설치 과정에 대한 더 자세한 정보는 <a href="http://dokuwiki.org/ko:install">(한국어) 설치 문서</a>와
+<a href="http://dokuwiki.org/install">(영어) 설치 문서</a>를 참고하기 바랍니다.</p>
-<p>DokuWiki는 위키 페이지와 페이지와 관련된 정보(그림,색인, 이전 버전 문서 등등)를 저장하기 위해 일반적인 텍스트 파일들을 사용합니다. 정상적으로 DokuWiki를 사용하려면 이 파일들을 담고 있는 디렉토리들에 대한 쓰기 권한을 가지고 있어야 합니다.
-현재 설치 과정 중에는 디렉토리 권한 설정이 불가능합니다. 보통 직접 쉘 명령어를 사용하거나, 호스팅을 사용한다면 FTP나 호스팅 제어판(예. CPanel)을 사용해서 설정해야 합니다.</p>
+<p>DokuWiki는 위키 문서와 문서와 관련된 정보(예를 들어 그림, 검색 색인, 이전 버전 문서)를 저장하기 위해 일반적인 텍스트 파일을 사용합니다. 정상적으로 DokuWiki를 사용하려면 이 파일을 담고 있는 디렉토리에 대한 쓰기 권한을 가지고 있어야 합니다.
+현재 설치 과정 중에는 디렉토리 권한 설정이 불가능합니다. 보통 직접 쉘 명령어를 사용하거나, 호스팅을 사용한다면 FTP나 호스팅 제어판(예를 들어 CPanel)을 사용해서 설정해야 합니다.</p>
-<p>현재 설치 과정중에 관리자로 로그인 후 DokuWiki의 관리 메뉴(플러그인 설치, 사용자 관리, 위키 페이지 접근 권한 관리, 옵션 설정)를 가능하게 <acronym title="접근 제어 목록">ACL</acronym>에 대한 환경 설정을 수행합니다.
-이 것은 DokuWiki가 동작하는데 필요한 사항은 아니지만, 어찌되었든 더 쉽게 관리자가 관리할 수 있도록 해줍니다.</p>
+<p>현재 설치 과정중에 관리자로 로그인 후 DokuWiki의 관리 메뉴(플러그인 설치, 사용자 관리, 위키 문서 접근 권한 관리, 옵션 설정)를 가능하게 <acronym title="접근 제어 목록">ACL</acronym>에 대한 환경 설정을 수행합니다.
+이 것은 DokuWiki가 동작하는데 필요한 사항은 아니지만, 어쨌든 더 쉽게 관리자가 관리할 수 있도록 해줍니다.</p>
-<p>숙련된 사용자들이나 특별한 설치 과정이 필요한 경우에 다음 링크들을 참조하기 바랍니다:
-<a href="http://dokuwiki.org/ko:install">설치 과정(한글)</a>
-과 <a href="http://dokuwiki.org/ko:config">환경 설정(한글),</a>
-<a href="http://dokuwiki.org/install">설치 과정(영문)</a>
-과 <a href="http://dokuwiki.org/config">환경 설정(영문)</a>
-</p>
+<p>숙련된 사용자나 특별한 설치 과정이 필요한 경우에 다음 링크를 참고하기 바랍니다:
+<a href="http://dokuwiki.org/ko:install">설치 과정 (한국어)</a>
+과 <a href="http://dokuwiki.org/ko:config">환경 설정 (한국어),</a>
+<a href="http://dokuwiki.org/install">설치 과정 (영어)</a>
+과 <a href="http://dokuwiki.org/config">환경 설정 (영어)</a></p>
diff --git a/inc/lang/ko/lang.php b/inc/lang/ko/lang.php
index 7b29715d9..7b4e30a49 100644
--- a/inc/lang/ko/lang.php
+++ b/inc/lang/ko/lang.php
@@ -9,6 +9,7 @@
* @author Song Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
* @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -17,21 +18,21 @@ $lang['doublequoteclosing'] = '”';
$lang['singlequoteopening'] = '‘';
$lang['singlequoteclosing'] = '’';
$lang['apostrophe'] = '’';
-$lang['btn_edit'] = '페이지 편집';
-$lang['btn_source'] = '소스 보기';
-$lang['btn_show'] = '페이지 보기';
-$lang['btn_create'] = '페이지 만들기';
+$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_preview'] = '미리 보기';
+$lang['btn_top'] = '맨 위로';
$lang['btn_newer'] = '<< 최근';
$lang['btn_older'] = '이전 >>';
-$lang['btn_revs'] = '이전 버전들';
-$lang['btn_recent'] = '최근 변경 목록';
-$lang['btn_upload'] = '업로드';
+$lang['btn_revs'] = '이전 버전';
+$lang['btn_recent'] = '최근 바뀜';
+$lang['btn_upload'] = '올리기';
$lang['btn_cancel'] = '취소';
-$lang['btn_index'] = '색인';
+$lang['btn_index'] = '사이트맵';
$lang['btn_secedit'] = '편집';
$lang['btn_login'] = '로그인';
$lang['btn_logout'] = '로그아웃';
@@ -39,70 +40,69 @@ $lang['btn_admin'] = '관리';
$lang['btn_update'] = '변경';
$lang['btn_delete'] = '삭제';
$lang['btn_back'] = '뒤로';
-$lang['btn_backlink'] = '이전 링크';
+$lang['btn_backlink'] = '가리키는 링크';
$lang['btn_backtomedia'] = '미디어 파일 선택으로 돌아가기';
-$lang['btn_subscribe'] = '구독 신청';
-$lang['btn_profile'] = '개인정보 변경';
+$lang['btn_subscribe'] = '구독 관리';
+$lang['btn_profile'] = '개인 정보 변경';
$lang['btn_reset'] = '초기화';
-$lang['btn_resendpwd'] = '새 암호 설정';
-$lang['btn_draft'] = '문서초안 편집';
-$lang['btn_recover'] = '문서초안 복구';
-$lang['btn_draftdel'] = '문서초안 삭제';
+$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['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['badlogin'] = '잘못된 사용자 이름이거나 비밀번호입니다.';
+$lang['minoredit'] = '사소한 바뀜';
+$lang['draftdate'] = '문서 초안 자동 저장 시간';
+$lang['nosecedit'] = '문서가 수정되어 세션 정보의 유효 시간이 지나 문서 전부를 다시 읽습니다.';
$lang['regmissing'] = '모든 항목을 입력해야 합니다.';
$lang['reguexists'] = '같은 이름을 사용하는 사용자가 있습니다.';
-$lang['regsuccess'] = '사용자를 만들었습니다. 패스워드는 이메일로 보냈습니다.';
+$lang['regsuccess'] = '사용자를 만들었으며 비밀번호는 이메일로 보냈습니다.';
$lang['regsuccess2'] = '사용자를 만들었습니다.';
-$lang['regmailfail'] = '패스워드를 이메일로 전송할 때 오류가 발생했습니다. 관리자에게 문의하기 바랍니다!';
-$lang['regbadmail'] = '이메일 주소가 틀렸습니다. - 오류라고 생각되면 관리자에게 문의하기 바랍니다.';
-$lang['regbadpass'] = '새로운 패스워드들이 일치하지 않습니다. 다시 입력하기 바랍니다.';
-$lang['regpwmail'] = 'DokuWiki 패스워드';
-$lang['reghere'] = '아직 등록하지 않았다면 등록하기 바랍니다.';
-$lang['profna'] = '이 위키는 개인 정보 수정을 허용하지 않습니다.';
-$lang['profnochange'] = '변경사항이 없습니다.';
+$lang['regmailfail'] = '비밀번호를 이메일로 전송할 때 오류가 발생했습니다. 관리자에게 문의하기 바랍니다!';
+$lang['regbadmail'] = '이메일 주소가 잘못됐습니다 - 오류라고 생각하면 관리자에게 문의하기 바랍니다.';
+$lang['regbadpass'] = '새 비밀번호가 일치하지 않습니다. 다시 입력하기 바랍니다.';
+$lang['regpwmail'] = 'DokuWiki 비밀번호';
+$lang['reghere'] = '계정이 없나요? 계정을 등록할 수 있습니다';
+$lang['profna'] = '이 위키는 개인 정보 수정을 허용하지 않습니다';
+$lang['profnochange'] = '바뀐 사항이 없습니다.';
$lang['profnoempty'] = '이름이나 이메일 주소가 비었습니다.';
-$lang['profchanged'] = '개인정보 변경이 성공했습니다.';
-$lang['pwdforget'] = '패스워드를 잊어버린 경우 새로 발급받을 수 있습니다.';
-$lang['resendna'] = '이 위키는 패스워드 재발급을 지원하지 않습니다.';
-$lang['resendpwd'] = '새 암호 다음으로 전송 : ';
-$lang['resendpwdmissing'] = '새로운 패스워드를 입력해야햡니다.';
-$lang['resendpwdnouser'] = '등록된 사용자가 아닙니다. 다시 확인 바랍니다.';
-$lang['resendpwdbadauth'] = '인증 코드가 틀립니다. 잘못된 링크인지 확인 바랍니다.';
+$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['maxuploadsize'] = '최대 업로드 용량. 파일당 %s';
-$lang['lockedby'] = '현재 잠금 사용자';
+$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']['willexpire'] = '잠시 후 편집 잠금이 해제됩니다.\n편집 충돌을 피하려면 미리 보기를 눌러 잠금 시간을 다시 설정하기 바랍니다.';
+$lang['js']['notsavedyet'] = '저장하지 않은 바뀜이 지워집니다.';
$lang['js']['searchmedia'] = '파일 찾기';
-$lang['js']['keepopen'] = '선택할 때 윈도우를 열어놓으시기 바랍니다.';
-$lang['js']['hidedetails'] = '자세한 정보 감추기';
+$lang['js']['keepopen'] = '선택할 때 창을 열어놓기';
+$lang['js']['hidedetails'] = '자세한 정보 숨기기';
$lang['js']['mediatitle'] = '링크 설정';
$lang['js']['mediadisplay'] = '링크 형태';
$lang['js']['mediaalign'] = '배치';
@@ -110,73 +110,72 @@ $lang['js']['mediasize'] = '그림 크기';
$lang['js']['mediatarget'] = '링크 목표';
$lang['js']['mediaclose'] = '닫기';
$lang['js']['mediainsert'] = '삽입';
-$lang['js']['mediadisplayimg'] = '그림보기';
+$lang['js']['mediadisplayimg'] = '그림을 보여줍니다.';
$lang['js']['mediadisplaylnk'] = '링크만 보여줍니다.';
$lang['js']['mediasmall'] = '작게';
$lang['js']['mediamedium'] = '중간';
$lang['js']['medialarge'] = '크게';
$lang['js']['mediaoriginal'] = '원본';
-$lang['js']['medialnk'] = '세부정보페이지로 링크';
+$lang['js']['medialnk'] = '자세한 정보 문서로 링크';
$lang['js']['mediadirect'] = '원본으로 직접 링크';
-$lang['js']['medianolnk'] = '링크 없슴';
+$lang['js']['medianolnk'] = '링크 없음';
$lang['js']['medianolink'] = '그림을 링크하지 않음';
$lang['js']['medialeft'] = '왼쪽 배치';
$lang['js']['mediaright'] = '오른쪽 배치';
-$lang['js']['mediacenter'] = '중앙 배치';
-$lang['js']['medianoalign'] = '배치 없슴';
-$lang['js']['nosmblinks'] = '윈도우 공유 파일과의 연결은 MS 인터넷 익스플로러에서만 동작합니다.
-그러나 링크를 복사하거나 붙여넣기를 할 수 있습니다.';
+$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']['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_select'] = '파일 선택…';
+$lang['js']['media_upload_btn'] = '올리기';
$lang['js']['media_done_btn'] = '완료';
-$lang['js']['media_drop'] = '업로드할 파일을 끌어넣으세요';
+$lang['js']['media_drop'] = '올릴 파일을 끌어넣으세요';
$lang['js']['media_cancel'] = '삭제';
-$lang['js']['media_overwrt'] = '이미있는 파일 덮어쓰기';
-$lang['rssfailed'] = 'feed 가져오기 실패: ';
+$lang['js']['media_overwrt'] = '이미 있는 파일 덮어쓰기';
+$lang['rssfailed'] = '이 피드를 가져오는 동안 오류 발생:';
$lang['nothingfound'] = '아무 것도 없습니다.';
$lang['mediaselect'] = '미디어 파일 선택';
-$lang['fileupload'] = '미디어 파일 업로드';
-$lang['uploadsucc'] = '업로드 성공';
-$lang['uploadfail'] = '업로드 실패. 잘못된 권한 때문일지도 모릅니다.';
-$lang['uploadwrong'] = '업로드 거부. 금지된 확장자입니다!';
-$lang['uploadexist'] = '이미 파일이 존재합니다.';
-$lang['uploadbadcontent'] = '업로드된 파일이 파일 확장자 %s와 일치하지 않습니다.';
-$lang['uploadspam'] = '스팸 차단기가 업로드를 취소하였습니다.';
-$lang['uploadxss'] = '악성 코드의 가능성이 있어 업로드를 취소하였습니다.';
-$lang['uploadsize'] = '업로드한 파일이 너무 큽니다. (최대 %s)';
+$lang['fileupload'] = '미디어 파일 올리기';
+$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['deletefail'] = '"%s" 파일을 삭제할 수 없습니다 - 삭제 권한이 있는지 확인하기 바랍니다.';
+$lang['mediainuse'] = '"%s" 파일을 삭제할 수 없습니다 - 아직 사용 중입니다.';
+$lang['namespaces'] = '이름공간';
$lang['mediafiles'] = '사용 가능한 파일 목록';
-$lang['accessdenied'] = '이 페이지를 볼 권한이 없습니다.';
-$lang['mediausage'] = '이 파일을 참조하려면 다음 문법을 사용하기 바랍니다:';
+$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['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['diff2'] = '선택한 버전 간 차이 보기';
$lang['difflink'] = '차이 보기로 연결';
-$lang['diff_type'] = '버전간 차이 표시:';
+$lang['diff_type'] = '버전간 차이 보기:';
$lang['diff_inline'] = '인라인 방식';
-$lang['diff_side'] = '다중창 방식';
+$lang['diff_side'] = '다중 창 방식';
$lang['line'] = '줄';
$lang['breadcrumb'] = '추적';
$lang['youarehere'] = '현재 위치';
@@ -184,54 +183,54 @@ $lang['lastmod'] = '마지막 수정';
$lang['by'] = '작성자';
$lang['deleted'] = '삭제';
$lang['created'] = '새로 만듦';
-$lang['restored'] = '옛 버전 복구';
+$lang['restored'] = '이전 버전 복구 (%s)';
$lang['external_edit'] = '외부 편집기';
$lang['summary'] = '편집 요약';
-$lang['noflash'] = '이 컨텐츠를 표시하기 위해서 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a>이 필요합니다.';
+$lang['noflash'] = '이 콘텐츠를 표시하기 위해서 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash 플러그인</a>이 필요합니다.';
$lang['download'] = '조각 다운로드';
$lang['tools'] = '도구';
$lang['user_tools'] = '사용자 도구';
$lang['site_tools'] = '사이트 도구';
-$lang['page_tools'] = '페이지 도구';
-$lang['skip_to_content'] = '컨텐츠 넘기기';
-$lang['mail_newpage'] = '페이지 추가:';
-$lang['mail_changed'] = '페이지 변경:';
-$lang['mail_subscribe_list'] = '네임스페이스에서 변경된 페이지:';
+$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['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['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_hr'] = '가로줄';
+$lang['qb_ol'] = '순서 있는 목록';
+$lang['qb_ul'] = '순서 없는 목록';
+$lang['qb_media'] = '그림과 기타 파일 추가';
+$lang['qb_sig'] = '서명 넣기';
$lang['qb_smileys'] = '이모티콘';
-$lang['qb_chars'] = '특수문자';
-$lang['upperns'] = '상위 네임스페이스로 이동';
-$lang['admin_register'] = '새로운 사용자 추가';
-$lang['metaedit'] = '메타 데이타를 편집합니다.';
-$lang['metasaveerr'] = '메타 데이타 쓰기가 실패했습니다.';
-$lang['metasaveok'] = '메타 데이타가 저장되었습니다.';
+$lang['qb_chars'] = '특수 문자';
+$lang['upperns'] = '상위 이름공간으로 이동';
+$lang['admin_register'] = '새 사용자 추가';
+$lang['metaedit'] = '메타 데이터 편집';
+$lang['metasaveerr'] = '메타 데이터 쓰기 실패';
+$lang['metasaveok'] = '메타 데이타 저장됨';
$lang['img_backto'] = '뒤로';
$lang['img_title'] = '이름';
$lang['img_caption'] = '설명';
@@ -246,80 +245,78 @@ $lang['img_keywords'] = '키워드';
$lang['img_width'] = '너비';
$lang['img_height'] = '높이';
$lang['img_manager'] = '미디어 관리자에서 보기';
-$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_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_not_subscribed'] = '현재의 문서나 이름공간에 구독 등록이 되어있지 않습니다.';
$lang['subscr_m_new_header'] = '구독 추가';
-$lang['subscr_m_current_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['subscr_style_every'] = '모든 바뀜을 이메일로 받기';
+$lang['subscr_style_digest'] = '각 문서의 바뀜을 요약 (매 %.2f일 마다)';
+$lang['subscr_style_list'] = '마지막 이메일 이후 바뀐 문서의 목록 (매 %.2f일 마다)';
$lang['authmodfailed'] = '잘못된 사용자 인증 설정입니다. 관리자에게 문의하기 바랍니다.';
$lang['authtempfail'] = '사용자 인증이 일시적으로 불가능합니다. 만일 계속해서 문제가 발생하면 관리자에게 문의하기 바랍니다.';
-$lang['authpwdexpire'] = '현재 암호를 설정하신지 %d 일이 지났습니다. 새로 설정해주시기 바랍니다.';
-$lang['i_chooselang'] = '사용하는 언어를 선택합니다.';
+$lang['authpwdexpire'] = '현재 비밀번호를 설정한지 %d일이 지났습니다. 새로 설정해주시기 바랍니다.';
+$lang['i_chooselang'] = '사용할 언어를 선택하세요';
$lang['i_installer'] = 'DokuWiki 설치';
$lang['i_wikiname'] = '위키 이름';
-$lang['i_enableacl'] = 'ACL기능 사용(권장 사항)';
+$lang['i_enableacl'] = 'ACL 기능 사용 (권장)';
$lang['i_superuser'] = '슈퍼 유저';
$lang['i_problems'] = '설치 중 아래와 같은 문제가 발생했습니다. 문제를 해결한 후 설치를 계속하기 바랍니다.';
-$lang['i_modified'] = '보안 상의 이유로 아래 스크립트는 수정되지 않은 새 Dokuwiki설치에서만 동작됩니다.
-다운로드된 압축 패키지를 다시 설치하거나 <a href="http://dokuwiki.org/install"> DokuWiki 설치 과정</a>을 참고해서 설치하기 바랍니다.';
-$lang['i_funcna'] = 'PHP함수 <code>%s</code> 사용이 불가능합니다. 호스트 제공자가 어떤 이유에서인지 막아 놓았을지 모릅니다.';
-$lang['i_phpver'] = 'PHP <code>%s</code>버전은 필요한 <code>%s</code>버전보다 오래되었습니다.PHP를 업그레이드할 필요가 있습니다.';
+$lang['i_modified'] = '보안 상의 이유로 이 스크립트는 수정되지 않은 새 Dokuwiki 설치에서만 동작됩니다.
+다운로드한 압축 패키지를 다시 설치하거나 <a href="http://dokuwiki.org/install">DokuWiki 설치 과정</a>을 참고해서 설치하기 바랍니다.';
+$lang['i_funcna'] = '<code>%s</code> PHP 함수의 사용이 불가능합니다. 호스트 제공자가 어떤 이유에서인지 막아 놓았을지 모릅니다.';
+$lang['i_phpver'] = 'PHP <code>%s</code> 버전은 필요한 <code>%s</code> 버전보다 오래되었습니다. PHP를 업그레이드할 필요가 있습니다.';
$lang['i_permfail'] = 'DokuWiki는 <code>%s</code>에 쓰기 가능 권한이 없습니다. 먼저 이 디렉토리에 쓰기 권한이 설정되어야 합니다!';
-$lang['i_confexists'] = '<code>%s</code>는 이미 존재합니다.';
-$lang['i_writeerr'] = '<code>%s</code>을 만들 수 없습니다. 먼저 디렉토리/파일 권한을 확인하고 파일을 수동으로 만들기 바랍니다.';
-$lang['i_badhash'] = 'dokuwiki.php를 인식할 수 없거나 원본 파일이 아닙니다. (hash=<code>%s</code>)';
+$lang['i_confexists'] = '<code>%s</code>(은)는 이미 존재합니다.';
+$lang['i_writeerr'] = '<code>%s</code>(을)를 만들 수 없습니다. 먼저 디렉토리/파일 권한을 확인하고 파일을 수동으로 만들기 바랍니다.';
+$lang['i_badhash'] = 'dokuwiki.php를 인식할 수 없거나 원본 파일이 아닙니다. (해시=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - 유효하지 않거나 빈 값입니다.';
-$lang['i_success'] = '환경 설정이 성공적으로 끝났습니다. install.php를 지워도 상관없습니다.
- <a href="doku.php">새로운 DokuWiki</a>.';
-$lang['i_failure'] = '환경 설정 파일에 쓰는 도중 에러가 발생했습니다.
-새로운 <a href="doku.php"> DokuWiki</a>를 사용하기 전에 수동으로 문제를 해결할 필요가 있습니다.';
+$lang['i_success'] = '환경 설정이 성공적으로 끝났습니다. 지금 install.php를 지워도 상관없습니다. <a href="doku.php">새 DokuWiki</a>로 들어갑니다.';
+$lang['i_failure'] = '환경 설정 파일에 쓰는 도중에 오류가 발생했습니다. <a href="doku.php">새 DokuWiki</a>를 사용하기 전에 수동으로 문제를 해결할 필요가 있습니다.';
$lang['i_policy'] = '초기 ACL 정책';
-$lang['i_pol0'] = '개방형 위키 (누구나 읽기/쓰기/업로드가 가능합니다.)';
-$lang['i_pol1'] = '공개형 위키 (누구나 읽을 수 있지만, 등록된 사용자만 쓰기/업로드가 가능합니다.)';
-$lang['i_pol2'] = '폐쇄형 위키 (등록된 사용자만 읽기/쓰기/업로드가 가능합니다.)';
+$lang['i_pol0'] = '열린 위키 (누구나 읽기, 쓰기, 올리기가 가능합니다.)';
+$lang['i_pol1'] = '공개 위키 (누구나 읽을 수 있지만, 등록된 사용자만 쓰기와 올리기가 가능합니다.)';
+$lang['i_pol2'] = '닫힌 위키 (등록된 사용자만 읽기, 쓰기, 업로드가 가능합니다.)';
$lang['i_retry'] = '다시 시도';
-$lang['i_license'] = '내용의 배포를 위한 라이센스를 선택하세요.';
-$lang['recent_global'] = '<b>%s</b> 네임스페이스를 구독중입니다. <a href="%s">전체위키 변경사항 </a>도 보실수 있습니다.';
-$lang['years'] = '%d 년 전';
-$lang['months'] = '%d 개월 전';
-$lang['weeks'] = '%d 주 전';
-$lang['days'] = '%d 일 전';
-$lang['hours'] = '%d 시간 전';
-$lang['minutes'] = '%d 분 전';
-$lang['seconds'] = '%d 초 전';
+$lang['i_license'] = '내용을 배포하기 위한 라이선스를 선택하세요:';
+$lang['recent_global'] = '<b>%s</b> 이름공간을 구독 중입니다. <a href="%s">전체 위키의 최근 바뀜도 볼 수</a> 있습니다.';
+$lang['years'] = '%d년 전';
+$lang['months'] = '%d개월 전';
+$lang['weeks'] = '%d주 전';
+$lang['days'] = '%d일 전';
+$lang['hours'] = '%d시간 전';
+$lang['minutes'] = '%d분 전';
+$lang['seconds'] = '%d초 전';
$lang['wordblock'] = '스팸 문구를 포함하고 있어서 저장되지 않았습니다.';
-$lang['media_uploadtab'] = '업로드';
-$lang['media_searchtab'] = '검색';
+$lang['media_uploadtab'] = '올리기';
+$lang['media_searchtab'] = '찾기';
$lang['media_file'] = '파일';
$lang['media_viewtab'] = '보기';
$lang['media_edittab'] = '수정';
-$lang['media_historytab'] = '변경사항';
-$lang['media_list_thumbs'] = '썸네일';
+$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_namespaces'] = '이름공간 선택';
+$lang['media_files'] = '%s의 파일';
+$lang['media_upload'] = '%s에 올리기';
+$lang['media_search'] = '%s 찾기';
$lang['media_view'] = '%s';
-$lang['media_viewold'] = '%s 의 %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_history'] = '%s 변경 내력';
+$lang['media_meta_edited'] = '메타데이터가 수정됨';
+$lang['media_perm_read'] = '이 파일을 읽을 권한이 없습니다.';
+$lang['media_perm_upload'] = '파일을 올릴 권한이 없습니다.';
$lang['media_update'] = '새 버전 올리기';
$lang['media_restore'] = '이 버전으로 되돌리기';
-$lang['plugin_install_err'] = '플러그인 설치가 비정상적으로 이뤄졌습니다. 플러그인 디렉토리 \'%s\'를 \'%s\'로 변경하십시오.';
+$lang['plugin_install_err'] = '플러그인 설치가 잘못되었습니다. 플러그인 디렉토리 \'%s\'(을)를 \'%s\'(으)로 바꾸십시오.';
diff --git a/inc/lang/ko/locked.txt b/inc/lang/ko/locked.txt
index 24525fc46..176a792d6 100644
--- a/inc/lang/ko/locked.txt
+++ b/inc/lang/ko/locked.txt
@@ -1,3 +1,3 @@
-====== 페이지 잠금 ======
+====== 문서 잠금 ======
-다른 사용자가 이 페이지 편집을 위해 잠금을 실행하였습니다. 해당 사용자가 편집을 끝내거나 잠금이 해제될 때까지 기다리십시오.
+다른 사용자가 이 문서를 편집하기 위해 잠금을 실행하였습니다. 해당 사용자가 편집을 끝내거나 잠금이 해제될 때까지 기다리십시오. \ No newline at end of file
diff --git a/inc/lang/ko/login.txt b/inc/lang/ko/login.txt
index 1aae449df..160b899d3 100644
--- a/inc/lang/ko/login.txt
+++ b/inc/lang/ko/login.txt
@@ -1,4 +1,3 @@
====== 로그인 ======
-로그인하지 않았습니다! 아래에서 로그인하십시오. 로그인하려면 쿠키를 받도록 설정하여야 합니다.
-
+로그인하지 않았습니다! 아래에서 로그인하세요. 로그인하려면 쿠키를 받도록 설정하여야 합니다. \ No newline at end of file
diff --git a/inc/lang/ko/mailtext.txt b/inc/lang/ko/mailtext.txt
index 5c496435e..219fe6e0b 100644
--- a/inc/lang/ko/mailtext.txt
+++ b/inc/lang/ko/mailtext.txt
@@ -1,17 +1,16 @@
-DokuWiki 페이지가 수정 혹은 추가되었습니다. 상세한 정보는 다음과 같습니다.
+DokuWiki 문서가 추가 또는 변경되었습니다. 자세한 정보는 다음과 같습니다:
-날짜 : @DATE@
-브라우저 : @BROWSER@
-IP 주소 : @IPADDRESS@
-호스트명 : @HOSTNAME@
-옛날버전 : @OLDPAGE@
-새버전 : @NEWPAGE@
-편집 요약 : @SUMMARY@
-사용자 : @USER@
+날짜 : @DATE@
+브라우저 : @BROWSER@
+IP 주소 : @IPADDRESS@
+호스트 이름 : @HOSTNAME@
+이전 버전 : @OLDPAGE@
+새 버전 : @NEWPAGE@
+편집 요약 : @SUMMARY@
+사용자 : @USER@
@DIFF@
---
-이 메일은 @DOKUWIKIURL@ 의 DokuWiki 가 생성한
-이메일입니다.
+--
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/mailwrap.html b/inc/lang/ko/mailwrap.html
index 093df1ef5..885730428 100644
--- a/inc/lang/ko/mailwrap.html
+++ b/inc/lang/ko/mailwrap.html
@@ -8,6 +8,6 @@
@HTMLBODY@
<br /><hr />
- <small>이 편지는 @DOKUWIKIURL@의 도쿠위키에서 생성되었습니다.</small>
+ <small>@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.</small>
</body>
</html> \ No newline at end of file
diff --git a/inc/lang/ko/newpage.txt b/inc/lang/ko/newpage.txt
index f8380bd84..87ac969d2 100644
--- a/inc/lang/ko/newpage.txt
+++ b/inc/lang/ko/newpage.txt
@@ -1,3 +1,3 @@
-====== 이 토픽은 아직 없습니다 ======
+====== 이 주제는 아직 없습니다 ======
-아직 없는 토픽 링크를 따라오셨습니다. **페이지 만들기** 버튼을 이용하여 새로 만들 수 있습니다.
+아직 없는 주제에 대한 링크를 따라왔습니다. **문서 만들기** 버튼을 이용하여 새로 만들 수 있습니다. \ No newline at end of file
diff --git a/inc/lang/ko/norev.txt b/inc/lang/ko/norev.txt
index e1b4093b4..6758ce4ec 100644
--- a/inc/lang/ko/norev.txt
+++ b/inc/lang/ko/norev.txt
@@ -1,3 +1,3 @@
====== 지정한 버전 없음 ======
-지정한 버전이 없습니다. **과거 버전** 버튼을 사용하여 이 문서의 버전 목록을 보십시오.
+지정한 버전이 존재하지 않습니다. **이전 버전** 버튼을 사용하여 이 문서의 이전 버전 목록을 보세요. \ No newline at end of file
diff --git a/inc/lang/ko/password.txt b/inc/lang/ko/password.txt
index e0a22c59a..02b23d17c 100644
--- a/inc/lang/ko/password.txt
+++ b/inc/lang/ko/password.txt
@@ -1,10 +1,9 @@
-안녕하세요, @FULLNAME@!
+@FULLNAME@ 안녕하세요!
-@DOKUWIKIURL@ 의 @TITLE@ 의 사용자 정보입니다.
+@DOKUWIKIURL@의 @TITLE@의 사용자 정보입니다.
-사용자명 : @LOGIN@
-패스워드 : @PASSWORD@
+사용자 이름 : @LOGIN@
+비밀번호 : @PASSWORD@
--
-이 이메일은 @DOKUWIKIURL@ 의 DokuWiki 가
-생성한 것입니다.
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/preview.txt b/inc/lang/ko/preview.txt
index 8bcc6a1eb..6563874ee 100644
--- a/inc/lang/ko/preview.txt
+++ b/inc/lang/ko/preview.txt
@@ -1,4 +1,3 @@
-====== 미리보기 ======
-
-이것은 입력하신 내용이 어떻게 보일지 미리보기하는 곳입니다. 아직은 **저장되지 않았다**는 점을 기억하십시오.
+====== 미리 보기 ======
+이것은 입력한 내용이 어떻게 보일지 미리 보여줍니다. 아직 **저장되지 않았다**는 점을 기억해두십시오! \ No newline at end of file
diff --git a/inc/lang/ko/pwconfirm.txt b/inc/lang/ko/pwconfirm.txt
index c022a52a9..1920f4a20 100644
--- a/inc/lang/ko/pwconfirm.txt
+++ b/inc/lang/ko/pwconfirm.txt
@@ -1,11 +1,13 @@
-안녕하세요. @FULLNAME@!
+@FULLNAME@ 안녕하세요!
-@DOKUWIKIURL@에 작성하신 @TITLE@을 보려면 새 패스워드가 필요하다는 요청을 누군가 받았다고 합니다.
+누군가가 @DOKUWIKIURL@에 @TITLE@에 대해
+새 비밀번호가 필요하다고 요청했습니다.
-새로운 패스워드를 요청한 적이 없다면 이 이메일을 무시해버리세요.
+새로운 비밀번호 요청한 적이 없다면 이 이메일을 무시해버리세요.
-@CONFIRM@에서 정말로 본인이 그런 요청을 했었는지 확인해 보기 바랍니다.
+정말로 당신이 그러한 요청을 했는지 다음 링크에서 확인하기 바랍니다.
---
+@CONFIRM@
-@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
+--
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/read.txt b/inc/lang/ko/read.txt
index 6b5d7b3db..9b2ec822f 100644
--- a/inc/lang/ko/read.txt
+++ b/inc/lang/ko/read.txt
@@ -1,2 +1,2 @@
-이 페이지는 읽기 전용입니다. 소스를 볼 수는 있지만, 수정할 수는 없습니다. 연습은 [[public:playground|연습장]]에서 하십시오. 문제가 있다고 생각하시면 관리자에게 문의하십시오.
+이 문서는 읽기 전용입니다. 내용을 볼 수는 있지만, 수정할 수는 없습니다. 문제가 있다고 생각하면 관리자에게 문의하십시오.
diff --git a/inc/lang/ko/recent.txt b/inc/lang/ko/recent.txt
index f693c4bf1..f2ffb8c6f 100644
--- a/inc/lang/ko/recent.txt
+++ b/inc/lang/ko/recent.txt
@@ -1,5 +1,3 @@
-====== 최근 변경 ======
-
-아래의 페이지는 최근에 변경된 것입니다.
-
+====== 최근 바뀜 ======
+아래의 문서는 최근에 바뀐 것입니다. \ No newline at end of file
diff --git a/inc/lang/ko/register.txt b/inc/lang/ko/register.txt
index 24105efeb..6509bed91 100644
--- a/inc/lang/ko/register.txt
+++ b/inc/lang/ko/register.txt
@@ -1,4 +1,3 @@
====== 새 사용자 등록 ======
-이 위키에 새 계정을 만들려면 아래의 모든 내용을 입력하세요. **제대로 된 이메일 주소**를 사용하세요. 암호를 입력하는 곳이 없다면 암호는 이 이메일로 보내집니다. 사용자명은 올바른 [[doku>pagename|pagename]] 이어야 합니다.
-
+이 위키에 새 계정을 만드려면 아래의 모든 내용을 입력하세요. **올바른 이메일 주소**를 사용하세요. 비밀번호를 입력하는 곳이 없다면 비밀번호는 이 이메일로 보내집니다. 사용자 이름은 올바른 [[doku>pagename|pagename]]이어야 합니다. \ No newline at end of file
diff --git a/inc/lang/ko/registermail.txt b/inc/lang/ko/registermail.txt
index 4b1aa20a5..d06f93047 100644
--- a/inc/lang/ko/registermail.txt
+++ b/inc/lang/ko/registermail.txt
@@ -1,14 +1,13 @@
-새로운 사용자가 등록되었습니다:
+새 사용자가 등록되었습니다:
-사용자 이름 : @NEWUSER@
+사용자 이름 : @NEWUSER@
사용자 실제 이름 : @NEWNAME@
-이메일 : @NEWEMAIL@
+이메일 : @NEWEMAIL@
-날짜 : @DATE@
-브라우저 : @BROWSER@
-IP주소 : @IPADDRESS@
-호스트 이름 : @HOSTNAME@
+날짜 : @DATE@
+브라우저 : @BROWSER@
+IP 주소 : @IPADDRESS@
+호스트 이름 : @HOSTNAME@
--
-
@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다.
diff --git a/inc/lang/ko/resendpwd.txt b/inc/lang/ko/resendpwd.txt
index b06163e92..0ad46eb1e 100644
--- a/inc/lang/ko/resendpwd.txt
+++ b/inc/lang/ko/resendpwd.txt
@@ -1,4 +1,3 @@
-====== 새로운 패스워드 전송 ======
-
-이 위키 계정에 대한 새 패스워드를 요구하기 위해 아래 폼에서 사용자 이름을 입력하세요. 확인 링크는 새로 등록된 이메일 주소로 발송됩니다.
+====== 새로운 비밀번호 전송 ======
+이 위키 계정에 대한 새 비밀번호를 요구하기 위해 아래 양식에서 사용자 이름을 입력하세요. 확인 링크는 새로 등록한 이메일 주소로 발송됩니다. \ No newline at end of file
diff --git a/inc/lang/ko/resetpwd.txt b/inc/lang/ko/resetpwd.txt
index b84674b82..ed909456f 100644
--- a/inc/lang/ko/resetpwd.txt
+++ b/inc/lang/ko/resetpwd.txt
@@ -1,3 +1,3 @@
-====== 새 암호 설정 ======
+====== 새 비밀번호 설정 ======
-이 위키의 계정의 새 암호를 입력해주세요. \ No newline at end of file
+이 위키 계정의 새 비밀번호를 입력하세요. \ No newline at end of file
diff --git a/inc/lang/ko/revisions.txt b/inc/lang/ko/revisions.txt
index 12d11894d..64733d86d 100644
--- a/inc/lang/ko/revisions.txt
+++ b/inc/lang/ko/revisions.txt
@@ -1,4 +1,3 @@
====== 이전 버전 ======
-이 문서의 옛날 버전은 다음과 같습니다. 이전 버전으로 돌아가려면, 아래에서 선택한 다음, **페이지 편집**을 클릭한 아후 저장하십시오.
-
+이 문서의 이전 버전은 다음과 같습니다. 이전 버전으로 돌아가려면, 아래에서 선택한 다음 **문서 편집**을 클릭하고 나서 저장하세요. \ No newline at end of file
diff --git a/inc/lang/ko/searchpage.txt b/inc/lang/ko/searchpage.txt
index 198d9a428..2e8502b13 100644
--- a/inc/lang/ko/searchpage.txt
+++ b/inc/lang/ko/searchpage.txt
@@ -1,5 +1,5 @@
====== 찾기 ======
-찾기 결과를 아래에서 볼 수 있습니다. 만일 원하는 것을 찾지 못하였다면, **페이지 편집** 버튼을 이용하여 질의 내용과 같은 이름의 페이지를 만들 수 있습니다.
+아래에서 찾기 결과를 볼 수 있습니다. 만일 원하는 것을 찾지 못하였다면, **문서 만들기**나 **문서 편집** 버튼을 사용하여 쿼리 내용과 같은 이름의 문서를 만들거나 편집할 수 있습니다.
-===== 결과 =====
+===== 결과 ===== \ No newline at end of file
diff --git a/inc/lang/ko/stopwords.txt b/inc/lang/ko/stopwords.txt
index bdb41deba..4b5551ce5 100644
--- a/inc/lang/ko/stopwords.txt
+++ b/inc/lang/ko/stopwords.txt
@@ -1,9 +1,11 @@
-# 색인이 만들어 지지 않는 단어 목록입니다.(한줄에 한단어)
-# 이 파일을 편집한다면 UNIX줄 종료문자를 사용해야합니다.(단일 개행문자)
-# 3문자이하 단어는 자동으로 무시되므로 3문자보다 짧은 단어는 포함시킬 필요가 없습니다.
+# 색인이 만들어지지 않는 단어 목록입니다. (한줄에 한 단어)
+# 이 파일을 편집한다면 UNIX 줄 종료 문자를 사용해야합니다.(단일 개행 문자)
+# 3문자 이하 단어는 자동으로 무시되므로 3문자보다 짧은 단어는 포함시킬 필요가 없습니다.
# http://www.ranks.nl/stopwords/을 기준으로 만들어진 목록입니다.
about
are
+as
+an
and
you
your
@@ -13,10 +15,18 @@ com
for
from
into
+if
+in
+is
+it
how
+of
+on
+or
that
the
this
+to
was
what
when
@@ -26,4 +36,4 @@ will
with
und
the
-www
+www \ No newline at end of file
diff --git a/inc/lang/ko/subscr_digest.txt b/inc/lang/ko/subscr_digest.txt
index 2e9c87848..13459428f 100644
--- a/inc/lang/ko/subscr_digest.txt
+++ b/inc/lang/ko/subscr_digest.txt
@@ -1,18 +1,18 @@
안녕하세요!
-@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다.
-
-변경사항은 다음과 같습니다:
+@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다.
+바뀐 점은 다음과 같습니다:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-옛날 것: @OLDPAGE@
-새 것: @NEWPAGE@
+이전 버전 : @OLDPAGE@
+새 버전 : @NEWPAGE@
+
-이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤
-@SUBSCRIBE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요.
+이 문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
+@SUBSCRIBE@ 문서를 방문하여 문서나 이름공간의 구독을 취소하세요.
--
@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/subscr_form.txt b/inc/lang/ko/subscr_form.txt
index 31470f372..ed380ccee 100644
--- a/inc/lang/ko/subscr_form.txt
+++ b/inc/lang/ko/subscr_form.txt
@@ -1,3 +1,3 @@
====== 구독 관리 ======
-이 페이지는 현재의 페이지와 네임스페이스의 구독을 관리할 수있도록 해줍니다. \ No newline at end of file
+이 페이지는 현재의 문서와 이름공간의 구독을 관리할 수 있도록 해줍니다. \ No newline at end of file
diff --git a/inc/lang/ko/subscr_list.txt b/inc/lang/ko/subscr_list.txt
index 2661a6a15..68adf0de9 100644
--- a/inc/lang/ko/subscr_list.txt
+++ b/inc/lang/ko/subscr_list.txt
@@ -1,15 +1,14 @@
안녕하세요!
-@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다.
-
-변경사항은 다음과 같습니다:
+@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다.
+바뀐 점은 다음과 같습니다:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
-이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤
-@SUBSCRIBE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요.
+이 문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
+@SUBSCRIBE@ 문서를 방문하여 문서나 이름공간의 구독을 취소하세요.
--
@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/subscr_single.txt b/inc/lang/ko/subscr_single.txt
index 1aa4d7efa..6bd1885e6 100644
--- a/inc/lang/ko/subscr_single.txt
+++ b/inc/lang/ko/subscr_single.txt
@@ -1,8 +1,7 @@
안녕하세요!
-@TITLE@ 라는 제목의 페이지 @PAGE@ 가 변경되었습니다.
-
-변경사항은 다음과 같습니다:
+@TITLE@ 위키의 @PAGE@ 문서가 바뀌었습니다.
+바뀐 점은 다음과 같습니다:
--------------------------------------------------------
@DIFF@
@@ -11,11 +10,11 @@
날짜 : @DATE@
사용자 : @USER@
편집 요약 : @SUMMARY@
-구 버전 : @OLDPAGE@
+이전 버전 : @OLDPAGE@
새 버전 : @NEWPAGE@
-이 페이지 변경알림의 설정을 바구려면, @DOKUWIKIURL@에 로그인한 뒤 t
-@NEWPAGE@ 를 방문하여 페이지나 이름공간의 구독을 취소하세요.
+이 문서의 알림을 취소하려면, @DOKUWIKIURL@에 로그인한 뒤
+@NEWPAGE@ 문서를 방문하여 문서나 이름공간의 구독을 취소하세요.
--
@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/ko/updateprofile.txt b/inc/lang/ko/updateprofile.txt
index 5ea331c05..ebf19d8ab 100644
--- a/inc/lang/ko/updateprofile.txt
+++ b/inc/lang/ko/updateprofile.txt
@@ -1,5 +1,3 @@
====== 개인 정보 수정 ======
-변경하고 싶은 항목을 입력하기 바랍니다. 사용자 이름은 바꾸고 싶지 않겠지요?
-
-
+바꾸고 싶은 항목을 입력하기 바랍니다. 사용자 이름은 바꿀 수 없습니다. \ No newline at end of file
diff --git a/inc/lang/ko/uploadmail.txt b/inc/lang/ko/uploadmail.txt
index 46c66a66b..675c0bd3f 100644
--- a/inc/lang/ko/uploadmail.txt
+++ b/inc/lang/ko/uploadmail.txt
@@ -1,15 +1,14 @@
-DokuWiki가 파일을 업로드하였습니다.
+DokuWiki가 파일을 올렸습니다. 자세한 정보는 다음과 같습니다:
-자세한 정보:
-
-파일 : @MEDIA@
-날짜 : @DATE@
-웹 브라우저 : @BROWSER@
-IP 주소 : @IPADDRESS@
-호스트명 : @HOSTNAME@
-크기 : @SIZE@
-파일 종류 : @MIME@
-사용자 : @USER@
+파일 : @MEDIA@
+이전 버전 : @OLD@
+날짜 : @DATE@
+브라우저 : @BROWSER@
+IP 주소 : @IPADDRESS@
+호스트 이름 : @HOSTNAME@
+크기 : @SIZE@
+MIME 종류 : @MIME@
+사용자 : @USER@
--
-이 메일은 @DOKUWIKIURL@의 DokuWiki가 생성한 메일입니다. \ No newline at end of file
+@DOKUWIKIURL@의 DokuWiki가 자동으로 만들어낸 메일입니다. \ No newline at end of file
diff --git a/inc/lang/nl/edit.txt b/inc/lang/nl/edit.txt
index e539050bc..9718d0900 100644
--- a/inc/lang/nl/edit.txt
+++ b/inc/lang/nl/edit.txt
@@ -1 +1 @@
-Pas de pagina aan en klik op ''Opslaan''. Zie [[wiki:syntax]] voor de Wiki syntax. Pas de pagina allen aan als hij **verbeterd** kan worden. Als je iets wilt uitproberen kun je spelen in de [[playground:playground|zandbak]].
+Pas de pagina aan en klik op ''Opslaan''. Zie [[wiki:syntax]] voor de Wiki-syntax. Pas de pagina allen aan als hij **verbeterd** kan worden. Als je iets wilt uitproberen kun je spelen in de [[playground:playground|zandbak]].
diff --git a/inc/lang/nl/lang.php b/inc/lang/nl/lang.php
index 4644f5e5d..911ffdc10 100644
--- a/inc/lang/nl/lang.php
+++ b/inc/lang/nl/lang.php
@@ -51,6 +51,7 @@ $lang['btn_backtomedia'] = 'Terug naar Bestandsselectie';
$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';
@@ -87,6 +88,7 @@ $lang['profnoempty'] = 'Een lege gebruikersnaam of e-mailadres is niet
$lang['profchanged'] = 'Gebruikersprofiel succesvol aangepast';
$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.';
@@ -99,6 +101,7 @@ $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['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.';
@@ -193,6 +196,11 @@ $lang['external_edit'] = 'Externe bewerking';
$lang['summary'] = 'Samenvatting wijziging';
$lang['noflash'] = 'De <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> is vereist om de pagina te kunnen weergeven.';
$lang['download'] = 'Download fragment';
+$lang['tools'] = 'Hulpmiddelen';
+$lang['user_tools'] = 'Gebruikershulpmiddelen';
+$lang['site_tools'] = 'Site-hulpmiddelen';
+$lang['page_tools'] = 'Paginahulpmiddelen';
+$lang['skip_to_content'] = 'spring naar tekst';
$lang['mail_newpage'] = 'pagina toegevoegd:';
$lang['mail_changed'] = 'pagina aangepast:';
$lang['mail_subscribe_list'] = 'Pagina\'s veranderd in namespace:';
@@ -200,8 +208,8 @@ $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'] = 'Media bestanden';
-$lang['both_changes'] = 'Zowel pagina\'s als media bestanden';
+$lang['media_changes'] = 'Mediabestanden';
+$lang['both_changes'] = 'Zowel pagina\'s als mediabestanden';
$lang['qb_bold'] = 'Vette tekst';
$lang['qb_italic'] = 'Cursieve tekst';
$lang['qb_underl'] = 'Onderstreepte tekst';
@@ -244,7 +252,7 @@ $lang['img_camera'] = 'Camera';
$lang['img_keywords'] = 'Trefwoorden';
$lang['img_width'] = 'Breedte';
$lang['img_height'] = 'Hoogte';
-$lang['img_manager'] = 'In media beheerder bekijken';
+$lang['img_manager'] = 'In mediabeheerder bekijken';
$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 emailadres geassocieerd met uw account, u kunt daardoor niet worden ingeschreven.';
@@ -263,6 +271,7 @@ $lang['subscr_style_digest'] = 'Samenvattings-email met wijzigingen per pagina
$lang['subscr_style_list'] = 'Lijst van veranderde pagina\'s sinds laatste email (elke %.2f dagen)';
$lang['authmodfailed'] = 'Ongeldige gebruikersauthenticatie-configuratie. Informeer de wikibeheerder.';
$lang['authtempfail'] = 'Gebruikersauthenticatie is tijdelijk niet beschikbaar. Als deze situatie zich blijft voordoen, informeer dan de wikibeheerder.';
+$lang['authpwdexpire'] = 'Je wachtwoord verloopt in %d dagen, je moet het binnenkort veranderen';
$lang['i_chooselang'] = 'Kies je taal';
$lang['i_installer'] = 'DokuWiki Installer';
$lang['i_wikiname'] = 'Wikinaam';
@@ -304,7 +313,7 @@ $lang['media_list_thumbs'] = 'Miniatuurweergaven';
$lang['media_list_rows'] = 'Regels';
$lang['media_sort_name'] = 'Naam';
$lang['media_sort_date'] = 'Datum';
-$lang['media_namespaces'] = 'Kies naamruimte';
+$lang['media_namespaces'] = 'Kies namespace';
$lang['media_files'] = 'Bestanden in %s';
$lang['media_upload'] = 'Upload naar %s';
$lang['media_search'] = 'Zoeken in %s';
diff --git a/inc/lang/nl/mailwrap.html b/inc/lang/nl/mailwrap.html
new file mode 100644
index 000000000..2ffe19a88
--- /dev/null
+++ b/inc/lang/nl/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+ <head>
+ <title>@TITLE@</title>
+ <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+ </head>
+ <body>
+
+ @HTMLBODY@
+
+ <br /><hr />
+ <small>Deze mail is gegenereerd door DokuWiki op @DOKUWIKIURL@.</small>
+ </body>
+ </html> \ No newline at end of file
diff --git a/inc/lang/pl/lang.php b/inc/lang/pl/lang.php
index 3bde240d9..79d18bbf5 100644
--- a/inc/lang/pl/lang.php
+++ b/inc/lang/pl/lang.php
@@ -13,6 +13,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@@ -48,6 +49,7 @@ $lang['btn_backtomedia'] = 'Powrót do wyboru pliku';
$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';
@@ -84,6 +86,7 @@ $lang['profnoempty'] = 'Pusta nazwa lub adres e-mail nie dozwolone.';
$lang['profchanged'] = 'Zaktualizowano profil użytkownika.';
$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.';
@@ -96,6 +99,7 @@ $lang['searchmedia_in'] = 'Szukaj w %s';
$lang['txt_upload'] = 'Wybierz plik do wysłania';
$lang['txt_filename'] = 'Nazwa pliku (opcjonalnie)';
$lang['txt_overwrt'] = 'Nadpisać istniejący plik?';
+$lang['maxuploadsize'] = 'Maksymalny rozmiar wysyłanych danych wynosi %s dla jednego pliku.';
$lang['lockedby'] = 'Aktualnie zablokowane przez';
$lang['lockexpire'] = 'Blokada wygasa';
$lang['js']['willexpire'] = 'Twoja blokada edycji tej strony wygaśnie w ciągu minuty. \nW celu uniknięcia konfliktów użyj przycisku podglądu aby odnowić blokadę.';
@@ -265,6 +269,7 @@ $lang['subscr_style_digest'] = 'email ze streszczeniem zmian dla każdej ze st
$lang['subscr_style_list'] = 'lista zmienionych stron od czasu ostatniego emaila';
$lang['authmodfailed'] = 'Błąd uwierzytelnienia. Powiadom administratora tego wiki.';
$lang['authtempfail'] = 'Uwierzytelnienie użytkownika jest w tej chwili niemożliwe. Jeśli ta sytuacja się powtórzy, powiadom administratora tego wiki.';
+$lang['authpwdexpire'] = 'Twoje hasło wygaśnie za %d dni. Należy je zmienić w krótkim czasie.';
$lang['i_chooselang'] = 'Wybierz język';
$lang['i_installer'] = 'Instalator DokuWiki';
$lang['i_wikiname'] = 'Nazwa Wiki';
diff --git a/inc/lang/pl/mailwrap.html b/inc/lang/pl/mailwrap.html
new file mode 100644
index 000000000..61772866e
--- /dev/null
+++ b/inc/lang/pl/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>Ta wiadomość została wygenerowana przez DokuWiki na @DOKUWIKIURL@.</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/pl/resetpwd.txt b/inc/lang/pl/resetpwd.txt
new file mode 100644
index 000000000..64d2d7d47
--- /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. \ No newline at end of file
diff --git a/inc/lang/ru/lang.php b/inc/lang/ru/lang.php
index 94af441b7..4c3d26b1d 100644
--- a/inc/lang/ru/lang.php
+++ b/inc/lang/ru/lang.php
@@ -55,6 +55,7 @@ $lang['btn_backtomedia'] = 'Вернуться к выбору медиа
$lang['btn_subscribe'] = 'Подписаться (все правки)';
$lang['btn_profile'] = 'Профиль';
$lang['btn_reset'] = 'Сброс';
+$lang['btn_resendpwd'] = 'Установить новый пароль';
$lang['btn_draft'] = 'Править черновик';
$lang['btn_recover'] = 'Восстановить черновик';
$lang['btn_draftdel'] = 'Удалить черновик';
@@ -91,6 +92,7 @@ $lang['profnoempty'] = 'Логин и адрес электронно
$lang['profchanged'] = 'Профиль пользователя успешно обновлён.';
$lang['pwdforget'] = 'Забыли пароль? Получите новый';
$lang['resendna'] = 'Данная вики не поддерживает повторную отправку пароля.';
+$lang['resendpwd'] = 'Установить новый пароль для';
$lang['resendpwdmissing'] = 'Вы должны заполнить все поля формы.';
$lang['resendpwdnouser'] = 'Пользователь с таким логином не обнаружен в нашей базе данных.';
$lang['resendpwdbadauth'] = 'Извините, неверный код авторизации. Убедитесь, что вы полностью скопировали ссылку. ';
@@ -103,6 +105,7 @@ $lang['searchmedia_in'] = 'Поиск в %s';
$lang['txt_upload'] = 'Выберите файл для загрузки';
$lang['txt_filename'] = 'Введите имя файла в вики (необязательно)';
$lang['txt_overwrt'] = 'Перезаписать существующий файл';
+$lang['maxuploadsize'] = 'Максимальный размер загружаемого файла %s';
$lang['lockedby'] = 'В данный момент заблокирован';
$lang['lockexpire'] = 'Блокировка истекает в';
$lang['js']['willexpire'] = 'Ваша блокировка этой страницы на редактирование истекает в течении минуты.\nЧтобы предотвратить конфликты используйте кнопку "Просмотр" для сброса таймера блокировки.';
@@ -270,6 +273,7 @@ $lang['subscr_style_digest'] = 'сводка изменений по кажд
$lang['subscr_style_list'] = 'перечислять изменившиеся страницы с прошлого уведомления';
$lang['authmodfailed'] = 'Неправильная конфигурация аутентификации пользователя. Пожалуйста, сообщите об этом своему администратору вики.';
$lang['authtempfail'] = 'Аутентификация пользователей временно недоступна. Если проблема продолжается какое-то время, пожалуйста, сообщите об этом своему администратору вики.';
+$lang['authpwdexpire'] = 'Действие вашего пароля истекает через %d дней. Вы должны изменить его как можно скорее';
$lang['i_chooselang'] = 'Выберите свой язык/Choose your language';
$lang['i_installer'] = 'Установка «ДокуВики»';
$lang['i_wikiname'] = 'Название вики';
diff --git a/inc/lang/ru/resetpwd.txt b/inc/lang/ru/resetpwd.txt
new file mode 100644
index 000000000..81a46a7d3
--- /dev/null
+++ b/inc/lang/ru/resetpwd.txt
@@ -0,0 +1,3 @@
+====== Установка нового пароля ======
+
+Пожалуйста введите новый пароль для вашей учетной записи для этой вики.
diff --git a/inc/lang/vi/backlinks.txt b/inc/lang/vi/backlinks.txt
index 231ab5d8c..eee624d96 100644
--- a/inc/lang/vi/backlinks.txt
+++ b/inc/lang/vi/backlinks.txt
@@ -1,3 +1,3 @@
-====== Nối về trước ======
+====== Liên kết đến trang vừa xem ======
-Đây là danh sách các trang hình như đã nối vào trang này.
+Đây là danh sách các trang có liên kết đến trang vừa xem.
diff --git a/inc/lang/vi/conflict.txt b/inc/lang/vi/conflict.txt
index 0df1ddbe4..646dcbc45 100644
--- a/inc/lang/vi/conflict.txt
+++ b/inc/lang/vi/conflict.txt
@@ -2,4 +2,4 @@
Trang bạn đang biên soạn có một phiên bản mới hơn. Việc này xảy ra khi một bạn đổi trang ấy khi bạn đang biên soạn trang này.
-Xem kỹ những thay đổi dưới đây, rồi quyết định giữ phiên bản nào. Nếu chọn ''bảo lưu'', phiên bản của bạn được giữ lại. Bấm ''huỷ'' để giữ phiên bản kia.
+Xem kỹ những thay đổi dưới đây, rồi quyết định giữ phiên bản nào. Nếu chọn ''Lưu'', phiên bản của bạn được giữ lại. Bấm ''huỷ'' để giữ phiên bản kia.
diff --git a/inc/lang/vi/denied.txt b/inc/lang/vi/denied.txt
index e70ed5d5f..35acaeb62 100644
--- a/inc/lang/vi/denied.txt
+++ b/inc/lang/vi/denied.txt
@@ -1,3 +1,3 @@
====== Không được phép vào ======
-Rất tiếc là bạn không được phép để tiếp tục. Bạn quen đăng nhập hay sao?
+Rất tiếc là bạn không được phép để tiếp tục. Bạn quên đăng nhập hay sao?
diff --git a/inc/lang/vi/edit.txt b/inc/lang/vi/edit.txt
index b00316a7c..1c16f903c 100644
--- a/inc/lang/vi/edit.txt
+++ b/inc/lang/vi/edit.txt
@@ -1 +1 @@
-Biên soạn trang này và bấm ''Bảo lưu''. Xem [[wiki:syntax]] về cú pháp của Wiki. Xin bạn biên soạn trang này nếu bạn có thể **cải tiến** nó. Nếu bạn muốn thí nghiệm, bạn có thể tập những bước đầu ở [[playground:playground]].
+Biên soạn trang này và bấm ''Lưu''. Xem [[wiki:syntax:vi|cú pháp của Wiki]] để biết cách soạn thảo. Xin bạn biên soạn trang này nếu bạn có thể **cải tiến** nó. Nếu bạn muốn thử nghiệm, bạn có thể thử ở [[playground:playground| chỗ thử]].
diff --git a/inc/lang/vi/editrev.txt b/inc/lang/vi/editrev.txt
index 076466c06..8a2031c4d 100644
--- a/inc/lang/vi/editrev.txt
+++ b/inc/lang/vi/editrev.txt
@@ -1,2 +1,2 @@
-**Bạn đã nạp một phiên bản cũ của văn kiện!** Nếu bảo lưu, bạn sẽ tạo phiên bản với dữ kiện này.
+**Bạn đã nạp một phiên bản cũ của văn bản!** Nếu lưu nó, bạn sẽ tạo phiên bản mới với dữ kiện này.
----
diff --git a/inc/lang/vi/lang.php b/inc/lang/vi/lang.php
index 361e51e84..c9179f6b3 100644
--- a/inc/lang/vi/lang.php
+++ b/inc/lang/vi/lang.php
@@ -5,8 +5,16 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author James Do <jdo@myrealbox.com>
*/
-$lang['encoding'] = 'utf-8';
-$lang['direction'] = 'ltr';
+
+
+
+$lang['encoding'] = 'utf-8';
+$lang['direction'] = 'ltr';
+$lang['doublequoteopening'] = '“'; //&ldquo;
+$lang['doublequoteclosing'] = '”'; //&rdquo;
+$lang['singlequoteopening'] = '‘'; //&lsquo;
+$lang['singlequoteclosing'] = '’'; //&rsquo;
+$lang['apostrophe'] = '’'; //&rsquo;
$lang['btn_edit'] = 'Biên soạn trang này';
$lang['btn_source'] = 'Xem mã nguồn';
@@ -16,6 +24,8 @@ $lang['btn_search'] = 'Tìm';
$lang['btn_save'] = 'Lưu';
$lang['btn_preview']= 'Duyệt trước';
$lang['btn_top'] = 'Trở lên trên';
+$lang['btn_newer'] = '<< mới hơn';
+$lang['btn_older'] = 'cũ hơn >>';
$lang['btn_revs'] = 'Các phiên bản cũ';
$lang['btn_recent'] = 'Thay đổi gần đây';
$lang['btn_upload'] = 'Tải lên';
@@ -27,41 +37,126 @@ $lang['btn_logout'] = 'Thoát';
$lang['btn_admin'] = 'Quản lý';
$lang['btn_update'] = 'Cập nhật';
$lang['btn_delete'] = 'Xoá';
+$lang['btn_back'] = 'Quay lại';
+$lang['btn_backlink'] = "Liên kết tới đây";
+$lang['btn_profile'] = 'Cập nhật hồ sơ';
+$lang['btn_reset'] = 'Làm lại';
+$lang['btn_resendpwd'] = 'Gửi mật khẩu mới';
+$lang['btn_draft'] = 'Sửa bản nháp';
+$lang['btn_recover'] = 'Phục hồi bản nháp';
+$lang['btn_draftdel'] = 'Xóa bản nháp';
+$lang['btn_revert'] = 'Phục hồi';
$lang['btn_register'] = 'Đăng ký';
+$lang['btn_apply'] = 'Chấp nhận';
+$lang['btn_media'] = 'Quản lý tệp tin';
$lang['loggedinas'] = 'Username đang dùng';
$lang['user'] = 'Username';
-$lang['pass'] = 'Password';
+$lang['pass'] = 'Mật khẩu';
+$lang['newpass'] = 'Mật khẩu mới';
+$lang['oldpass'] = 'Nhập lại mật khẩu hiện tại';
+$lang['passchk'] = 'lần nữa';
$lang['remember'] = 'Lưu username/password lại';
$lang['fullname'] = 'Họ và tên';
$lang['email'] = 'E-Mail';
+$lang['profile'] = 'Hồ sơ thành viên';
$lang['badlogin'] = 'Username hoặc password không đúng.';
+$lang['minoredit'] = 'Minor Changes';
+$lang['draftdate'] = 'Bản nháp được tự động lưu lúc'; // full dformat date will be added
+$lang['nosecedit'] = 'Các trang web đã được thay đổi trong khi chờ đợi, phần thông tin quá hạn đã được thay thế bằng trang đầy đủ.';
$lang['regmissing'] = 'Bạn cần điền vào tất cả các trường';
$lang['reguexists'] = 'Bạn khác đã dùng username này rồi.';
$lang['regsuccess'] = 'Đã tạo username, và đã gởi password.';
+$lang['regsuccess2'] = 'Thành viên vừa được tạo.';
$lang['regmailfail']= 'Không gởi password được. Xin bạn liên hệ với người quản lý.';
$lang['regbadmail'] = 'Email hình như không đúng. Xin bạn liên hệ với người quản lý.';
+$lang['regbadpass'] = 'Hai mật khẩu đưa ra là không giống nhau, xin vui lòng thử lại.';
$lang['regpwmail'] = 'Password DokuWiki của bạn là';
-$lang['reghere'] = 'Xin bạn đăng ký username nếu chưa có.';
+$lang['reghere'] = 'Xin bạn đăng ký username nếu chưa có';
+
+$lang['profna'] = 'Wiki này không hỗ trợ sửa đổi hồ sơ cá nhân';
+$lang['profnochange'] = 'Không có thay đổi, không có gì để làm.';
+$lang['profnoempty'] = 'Không được để trống tên hoặc địa chỉ email.';
+$lang['profchanged'] = 'Cập nhật hồ sơ thành viên thành công.';
+$lang['pwdforget'] = 'Bạn quên mật khẩu? Tạo lại mật khẩu mới';
+$lang['resendna'] = 'Wiki này không hỗ trợ gửi lại mật khẩu.';
+$lang['resendpwd'] = 'Gửi mật khẩu mới cho';
+$lang['resendpwdmissing'] = 'Xin lỗi, bạn phải điền vào tất cả các trường.';
+$lang['resendpwdnouser'] = 'Xin lỗi, chúng tôi không thể tìm thấy thành viên này trong cơ sở dữ liệu của chúng tôi.';
+$lang['resendpwdbadauth'] = 'Xin lỗi, mã này xác thực không hợp lệ. Hãy chắc chắn rằng bạn sử dụng liên kết xác nhận đầy đủ.';
+$lang['resendpwdconfirm'] = 'Một liên kết xác nhận đã được gửi bằng email.';
+$lang['resendpwdsuccess'] = 'Mật khẩu mới của bạn đã được gửi bằng email.';
+
+$lang['license'] = 'Trừ khi có ghi chú khác, nội dung trên wiki này được cấp phép theo giấy phép sau đây:';
+$lang['licenseok'] = 'Lưu ý: Bằng cách chỉnh sửa trang này, bạn đồng ý cấp giấy phép nội dung của bạn theo giấy phép sau:';
+
+$lang['searchmedia'] = 'Tìm tên file:';
+$lang['searchmedia_in'] = 'Tìm ở %s';
$lang['txt_upload'] = 'Chọn tệp để tải lên';
$lang['txt_filename'] = 'Điền wikiname (tuỳ ý)';
+$lang['txt_overwrt'] = 'Ghi đè file trùng';
$lang['lockedby'] = 'Đang khoá bởi';
-$lang['lockexpire'] = 'Khoá sẽ hết hạn vào lúc';
-$lang['js']['willexpire'] = 'Khoá của bạn để biên soạn trang này sẽ hết hạn trong vòng 1 phút.\nĐể tránh xung đột, bạn nên bấm nút xem trước để lập lại thời gian khoá';
+$lang['lockexpire'] = 'Sẽ được mở khóa vào lúc';
+$lang['js']['willexpire'] = 'Trong một phút nữa bài viết sẽ được mở khóa để cho phép người khác chỉnh sửa.\nĐể tránh xung đột, bạn nên bấm nút Duyệt trước để lập lại thời gian khoá bài';
$lang['js']['notsavedyet'] = "Hiện có những thay đổi chưa được bảo lưu, và sẽ mất.\nBạn thật sự muốn tiếp tục?";
-$lang['rssfailed'] = 'Rút nguồn này gặp phải lỗi';
+$lang['js']['searchmedia'] = 'Tìm kiếm tập tin';
+$lang['js']['keepopen'] = 'Giữ cửa sổ đang mở trên lựa chọn';
+$lang['js']['hidedetails'] = 'Ẩn thông tin chi tiết';
+$lang['js']['mediatitle'] = 'Thiết lập liên kết';
+$lang['js']['mediadisplay'] = 'Kiểu liên kết';
+$lang['js']['mediaalign'] = 'Sắp hàng';
+$lang['js']['mediasize'] = 'Cỡ ảnh';
+$lang['js']['mediatarget'] = 'Đích của liên kết';
+$lang['js']['mediaclose'] = 'Đóng';
+$lang['js']['mediainsert'] = 'Chèn';
+$lang['js']['mediadisplayimg'] = 'Hiển thị ảnh.';
+$lang['js']['mediadisplaylnk'] = 'Chỉ hiển thị liên kết.';
+$lang['js']['mediasmall'] = 'Nhỏ';
+$lang['js']['mediamedium'] = 'Vừa';
+$lang['js']['medialarge'] = 'To';
+$lang['js']['mediaoriginal'] = 'Kích cỡ gốc';
+$lang['js']['medialnk'] = 'Liên kết tới trang chi tiết';
+$lang['js']['mediadirect'] = 'Liên kết trực tiếp tới ảnh gốc';
+$lang['js']['medianolnk'] = 'Không liên kết';
+$lang['js']['medianolink'] = 'Không liên kết tới ảnh';
+$lang['js']['medialeft'] = 'Căn ảnh sang trái.';
+$lang['js']['mediaright'] = 'Căn ảnh sang phải.';
+$lang['js']['mediacenter'] = 'Cản ảnh ra giữa.';
+$lang['js']['medianoalign'] = 'Không căn.';
+$lang['js']['nosmblinks'] = "Nối với các Windows shares chỉ có hiệu lực với Microsoft Internet Explorer.\nBạn vẫn có thể sao và chép các mốc nối.";
+$lang['js']['linkwiz'] = 'Hộp thoại liên kết';
+$lang['js']['linkto'] = 'Liên kết tới:';
+$lang['js']['del_confirm']= 'Xoá mục này?';
+$lang['js']['restore_confirm'] = 'Sẵn sàng phục hồi phiên bản này?';
+$lang['js']['media_diff'] = 'So sánh:';
+$lang['js']['media_select'] = 'Chọn nhiều file…';
+$lang['js']['media_upload_btn'] = 'Tải lên';
+$lang['js']['media_done_btn'] = 'Xong';
+$lang['js']['media_drop'] = 'Kéo các file vào đây để tải lên';
+$lang['js']['media_overwrt'] = 'Ghi đè các file trùng';
+
+$lang['rssfailed'] = 'Nguồn này gặp phải lỗi';
$lang['nothingfound']= 'Không tìm được gì';
-$lang['mediaselect'] = 'Chọn tệp media';
+$lang['mediaselect'] = 'Xem';
$lang['fileupload'] = 'Tải lên tệp media';
$lang['uploadsucc'] = 'Tải lên thành công';
-$lang['uploadfail'] = 'Tải lên thất bại. Có thể vì không đủ phép?';
+$lang['uploadfail'] = 'Tải lên thất bại. Có thể vì không đủ quyền?';
$lang['uploadwrong'] = 'Tải lên bị từ chối. Cấm tải loại tệp này';
-$lang['namespaces'] = 'Đề tài';
+$lang['uploadexist'] = 'Tệp tin bị trùng. Chưa có gì xảy ra.';
+$lang['namespaces'] = 'Thư mục';
$lang['mediafiles'] = 'Tệp có sẵn ở';
+$lang['accessdenied'] = 'Bạn không được phép xem trang này.';
+$lang['mediausage'] = 'Sử dụng cú pháp sau đây để dẫn đến tập tin này:';
+$lang['mediaview'] = 'Xem tệp gốc';
+$lang['mediaroot'] = 'thư mục gốc';
+$lang['mediaupload'] = 'Tải một tập tin lên thư mục hiện tại ở đây. Để tạo thư mục con, thêm nó vào trước tên tập tin của bạn, phân cách bằng dấu hai chấm sau khi bạn chọn các tập tin. File còn có thể được lựa chọn bằng cách kéo và thả.';
+$lang['mediaextchange'] = 'Phần mở rộng thay đổi từ .%s thành .%s!';
+$lang['ref_inuse'] = 'Không thể xóa tập tin vì nó đang được sử dụng cho các trang sau:';
+$lang['ref_hidden'] = 'Một số tài liệu sử dụng cho trang này bạn không được cấp phép truy cập.';
$lang['hits'] = 'Trùng';
$lang['quickhits'] = 'Trang trùng hợp';
@@ -69,24 +164,36 @@ $lang['toc'] = 'Nội dung';
$lang['current'] = 'hiện tại';
$lang['yours'] = 'Phiên bản hiện tại';
$lang['diff'] = 'cho xem khác biệt với phiên bản hiện tại';
+$lang['diff2'] = 'Sự khác biệt giữa các bản được lựa chọn';
+$lang['difflink'] = 'Liên kết để xem bản so sánh này';
+$lang['diff_type'] = 'Xem sự khác biệt:';
+$lang['diff_inline'] = 'Nội tuyến';
+$lang['diff_side'] = 'Xếp cạnh nhau';
$lang['line'] = 'Dòng';
$lang['breadcrumb'] = 'Trang đã xem';
+$lang['youarehere'] = 'Bạn đang ở đây';
$lang['lastmod'] = 'Thời điểm thay đổi';
$lang['by'] = 'do';
$lang['deleted'] = 'bị xoá';
$lang['created'] = 'được tạo ra';
$lang['restored'] = 'phiên bản cũ đã được khôi phục';
+$lang['external_edit'] = 'external edit';
$lang['summary'] = 'Tóm tắt biên soạn';
+$lang['noflash'] = '<a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> cần được cài để có thể xem nội dung này.';
$lang['mail_newpage'] = 'Trang được thêm:';
$lang['mail_changed'] = 'Trang thay đổi:';
-$lang['js']['nosmblinks'] = "Nối với các Windows shares chỉ có hiệu lực với Microsoft Internet Explorer.\nBạn vẫn có thể sao và chép các mốc nối.";
+$lang['changes_type'] = 'Xem thay đổi của';
+$lang['pages_changes'] = 'Trang';
+$lang['media_changes'] = 'Tệp media';
+$lang['both_changes'] = 'Cả trang và các tập tin media';
$lang['qb_bold'] = 'Chữ đậm';
$lang['qb_italic'] = 'Chữ nghiêng';
$lang['qb_underl'] = 'Chữ gạch dưới';
$lang['qb_code'] = 'Chữ mã nguồn';
+$lang['qb_strike'] = 'Strike-through Text';
$lang['qb_h1'] = 'Đầu đề cấp 1';
$lang['qb_h2'] = 'Đầu đề cấp 2';
$lang['qb_h3'] = 'Đầu đề cấp 3';
@@ -100,7 +207,62 @@ $lang['qb_ul'] = 'Điểm trong danh sách không đánh số';
$lang['qb_media'] = 'Thêm ảnh và tệp khác';
$lang['qb_sig'] = 'Đặt chữ ký';
-$lang['js']['del_confirm']= 'Xoá mục này?';
+$lang['metaedit'] = 'Sửa Metadata';
+$lang['metasaveerr'] = 'Thất bại khi viết metadata';
+$lang['metasaveok'] = 'Metadata đã được lưu';
+$lang['img_backto'] = 'Quay lại';
+$lang['img_title'] = 'Tiêu đề';
+$lang['img_caption'] = 'Ghi chú';
+$lang['img_date'] = 'Ngày';
+$lang['img_fname'] = 'Tên file';
+$lang['img_fsize'] = 'Kích cỡ';
+$lang['img_artist'] = 'Người chụp';
+$lang['img_copyr'] = 'Bản quyền';
+$lang['img_format'] = 'Định dạng';
+$lang['img_camera'] = 'Camera';
+$lang['img_keywords'] = 'Từ khóa';
+$lang['img_width'] = 'Rộng';
+$lang['img_height'] = 'Cao';
+$lang['img_manager'] = 'Xem trong trình quản lý tệp media';
+
+/* installer strings */
+$lang['i_chooselang'] = 'Chọn ngôn ngữ';
+$lang['i_retry'] = 'Thử lại';
+
+$lang['years'] = 'cách đây %d năm';
+$lang['months'] = 'cách đây %d tháng';
+$lang['weeks'] = 'cách đây %d tuần';
+$lang['days'] = 'cách đây %d ngày';
+$lang['hours'] = 'cách đây %d giờ';
+$lang['minutes'] = 'cách đây %d phút';
+$lang['seconds'] = 'cách đây %d giây';
+
+$lang['wordblock'] = 'Thay đổi của bạn đã không được lưu lại bởi vì nó có chứa văn bản bị chặn (spam).';
+
+$lang['media_uploadtab'] = 'Tải lên';
+$lang['media_searchtab'] = 'Tìm';
+$lang['media_file'] = 'Tệp';
+$lang['media_viewtab'] = 'Xem';
+$lang['media_edittab'] = 'Sửa';
+$lang['media_historytab'] = 'Lịch sử';
+$lang['media_list_thumbs'] = 'Ảnh thu nhỏ';
+$lang['media_list_rows'] = 'Dòng';
+$lang['media_sort_name'] = 'Tên';
+$lang['media_sort_date'] = 'Ngày';
+$lang['media_namespaces'] = 'Chọn thư mục';
+$lang['media_files'] = 'Các tệp trong %s';
+$lang['media_upload'] = 'Tải lên %s';
+$lang['media_search'] = 'Tìm ở %s';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s ở %s';
+$lang['media_edit'] = 'Sửa %s';
+$lang['media_history'] = 'Lịch sử của %s';
+$lang['media_meta_edited'] = 'đã sửa metadata';
+$lang['media_perm_read'] = 'Sorry, bạn không đủ quyền truy cập.';
+$lang['media_perm_upload'] = 'Xin lỗi, bạn không đủ quyền để upload file lên.';
+$lang['media_update'] = 'Tải lên phiên bản mới';
+$lang['media_restore'] = 'Phục hồi phiên bản này';
+$lang['plugin_install_err'] = "Plugin không được cài đặt chính xác.Đổi tên thư mục plugin '%s' thành '%s'.";
//Setup VIM: ex: et ts=2 :
diff --git a/inc/lang/vi/login.txt b/inc/lang/vi/login.txt
index 4265a79df..71a8b1a01 100644
--- a/inc/lang/vi/login.txt
+++ b/inc/lang/vi/login.txt
@@ -1,3 +1,3 @@
====== Đăng nhập ======
-Hiện bạn chưa đăng nhập! Điền vào những chi tiết chứng minh ở phía dưới. Máy của bạn cần đặt chế độ nhận cookies để đăng nhập.
+Hiện bạn chưa đăng nhập! Hãy khai báo thông tin đăng nhập vào ô ở phía dưới. Máy của bạn cần đặt chế độ nhận cookies để đăng nhập.
diff --git a/inc/lang/vi/mailtext.txt b/inc/lang/vi/mailtext.txt
index 3fcdf5595..836e02d24 100644
--- a/inc/lang/vi/mailtext.txt
+++ b/inc/lang/vi/mailtext.txt
@@ -12,5 +12,5 @@ User : @USER@
@DIFF@
--
-This mail was generated by DokuWiki at
+Điện thư này tạo bởi DokuWiki ở
@DOKUWIKIURL@
diff --git a/inc/lang/vi/newpage.txt b/inc/lang/vi/newpage.txt
index b03bb5224..93f474b18 100644
--- a/inc/lang/vi/newpage.txt
+++ b/inc/lang/vi/newpage.txt
@@ -1,3 +1,3 @@
====== Chưa có đề tài này ======
-Bạn vừa nối vào một đề tài chưa có. Bạn có tạo đề tài này bằng cách bấm vào nút ''Tạo trang này''.
+Bạn kết nối vào một đề tài chưa có. Bạn có tạo đề tài này bằng cách bấm vào nút ''Tạo trang này'' ở góc trên, bên trái cửa sổ này. Nếu bạn không thấy nút này, thay vào đó là nút ''Xem mã nguồn'' chứng tỏ bạn không có quyền biên tập trang này, hãy đăng nhập thử xem bạn có quyền biên tập trang không. Nếu bạn nghĩ đây là một lỗi, hãy báo cho người quản trị.
diff --git a/inc/lang/vi/norev.txt b/inc/lang/vi/norev.txt
index 0fa27d898..224bd1db0 100644
--- a/inc/lang/vi/norev.txt
+++ b/inc/lang/vi/norev.txt
@@ -1,3 +1,3 @@
====== Phiên bản chưa có ======
-Chưa có phiên bản được chỉ định. Xin bấm nút ''Phiên bản cũ'' để xem danh sách các phiên bản của văn kiện này.
+Chưa có phiên bản được chỉ định. Xin bấm nút ''Phiên bản cũ'' để xem danh sách các phiên bản của văn bản này.
diff --git a/inc/lang/vi/password.txt b/inc/lang/vi/password.txt
index 589bbf067..798a20d33 100644
--- a/inc/lang/vi/password.txt
+++ b/inc/lang/vi/password.txt
@@ -6,4 +6,4 @@ Username: @LOGIN@
Password: @PASSWORD@
--
-Điện thư này xuất phát từ DokuWiki tại @DOKUWIKIURL@.
+Điện thư này xuất phát từ @DOKUWIKIURL@.
diff --git a/inc/lang/vi/preview.txt b/inc/lang/vi/preview.txt
index 81069a2c4..f02a25142 100644
--- a/inc/lang/vi/preview.txt
+++ b/inc/lang/vi/preview.txt
@@ -1,3 +1,3 @@
====== Xem trước ======
-Văn kiện của bạn sẽ thể hiện như sau. Nên nhớ: Văn kiện này **chưa được bảo lưu**!
+Văn bản của bạn sẽ thể hiện như sau. Nên nhớ: Văn bản này **chưa được lưu**!
diff --git a/inc/lang/vi/read.txt b/inc/lang/vi/read.txt
index ffeffc7bf..eec69966b 100644
--- a/inc/lang/vi/read.txt
+++ b/inc/lang/vi/read.txt
@@ -1 +1 @@
-Trang này chỉ được đọc thôi. Bạn có thể xem mã nguồn, nhưng không được thay đổi. Xin bạn hỏi người quản lý nếu không đúng.
+Trang này chỉ được đọc thôi. Bạn có thể xem mã nguồn, nhưng không được thay đổi. Hãy báo lại người quản lý nếu hệ thống hoạt động không đúng.
diff --git a/inc/lang/vi/revisions.txt b/inc/lang/vi/revisions.txt
index 943e3fff1..b9e9779ee 100644
--- a/inc/lang/vi/revisions.txt
+++ b/inc/lang/vi/revisions.txt
@@ -1,3 +1,3 @@
====== Phiên bản cũ ======
-Sau đây là các phiên bản cũ của văn kiện này. Để quây về một phiên bản cũ, chọn ở phía dưới, bấm vào ''Biên soạn trang này'' để bảo lưu.
+Sau đây là các phiên bản cũ của văn bản này. Để quay về một phiên bản cũ, bạn hãy chọn nó từ danh sách dưới đây, sau đó bấm vào nút ''Phục hồi'' hoặc nhấp nút ''Biên soạn trang này'' và lưu nó lại.
diff --git a/inc/lang/vi/searchpage.txt b/inc/lang/vi/searchpage.txt
index 821ca9f7b..7ded7a808 100644
--- a/inc/lang/vi/searchpage.txt
+++ b/inc/lang/vi/searchpage.txt
@@ -1,5 +1,5 @@
====== Tìm ======
-Sau đây là kết quả của câu hỏi của bạn. Nếu bạn không thấy được những gì bạn đang tìm, bạn có thể một trang mới, cùng tên câu hỏi của bạn, bằng cách bấm vào nút ''Biên soạn trang này''.
+Sau đây là kết quả mà bạn đã tìm. Nếu bạn không thấy được những gì bạn đang tìm, bạn có thể tạo một trang mới bằng cách bấm vào nút ''Biên soạn trang này'', khi đó bạn sẽ có 1 trang mới với tên trang chính là tuwfw khóa bạn đã tìm kiếm.
===== Kết quả =====
diff --git a/inc/lang/zh/lang.php b/inc/lang/zh/lang.php
index 9d125ce44..9ea0f5e7f 100644
--- a/inc/lang/zh/lang.php
+++ b/inc/lang/zh/lang.php
@@ -50,6 +50,7 @@ $lang['btn_backtomedia'] = '返回到媒体文件选择工具';
$lang['btn_subscribe'] = '订阅本页更改';
$lang['btn_profile'] = '更新个人信息';
$lang['btn_reset'] = '重设';
+$lang['btn_resendpwd'] = '设置新密码';
$lang['btn_draft'] = '编辑草稿';
$lang['btn_recover'] = '恢复草稿';
$lang['btn_draftdel'] = '删除草稿';
@@ -86,6 +87,7 @@ $lang['profnoempty'] = '不允许使用空的用户名或邮件地址
$lang['profchanged'] = '用户信息更新成功。';
$lang['pwdforget'] = '忘记密码?立即获取新密码';
$lang['resendna'] = '本维基不支持二次发送密码。';
+$lang['resendpwd'] = '设置新密码用于';
$lang['resendpwdmissing'] = '对不起,您必须填写所有的区域。';
$lang['resendpwdnouser'] = '对不起,在我们的用户数据中找不到该用户。';
$lang['resendpwdbadauth'] = '对不起,该认证码错误。请使用完整的确认链接。';
@@ -98,6 +100,7 @@ $lang['searchmedia_in'] = '在%s中查找';
$lang['txt_upload'] = '选择要上传的文件';
$lang['txt_filename'] = '上传并重命名为(可选)';
$lang['txt_overwrt'] = '覆盖已存在的同名文件';
+$lang['maxuploadsize'] = '上传限制。每个文件 %s';
$lang['lockedby'] = '目前已被下列人员锁定';
$lang['lockexpire'] = '预计锁定解除于';
$lang['js']['willexpire'] = '您对本页的独有编辑权将于一分钟之后解除。\n为了防止与其他人的编辑冲突,请使用预览按钮重设计时器。';
@@ -192,6 +195,11 @@ $lang['external_edit'] = '外部编辑';
$lang['summary'] = '编辑摘要';
$lang['noflash'] = '需要 <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash 插件</a> 来播放本内容。 ';
$lang['download'] = '下载片段';
+$lang['tools'] = '工具';
+$lang['user_tools'] = '用户工具';
+$lang['site_tools'] = '站点工具';
+$lang['page_tools'] = '页面工具';
+$lang['skip_to_content'] = '跳至内容';
$lang['mail_newpage'] = '添加页面:';
$lang['mail_changed'] = '更改页面:';
$lang['mail_subscribe_list'] = '命名空间中改变的页面:';
@@ -262,6 +270,7 @@ $lang['subscr_style_digest'] = '对每个页面发送更改的摘要邮件(
$lang['subscr_style_list'] = '自上封邮件以来更改的页面的列表(每 %.2f 天)';
$lang['authmodfailed'] = '错误的用户认证设置。请通知维基管理员。';
$lang['authtempfail'] = '用户认证暂时无法使用。如果该状态一直存在,请通知维基管理员。';
+$lang['authpwdexpire'] = '您的密码将在 %d 天内过期,请尽快更改';
$lang['i_chooselang'] = '选择您的语言';
$lang['i_installer'] = 'DokuWiki 安装工具';
$lang['i_wikiname'] = '维基名称';
@@ -288,7 +297,6 @@ $lang['i_pol1'] = '公共的维基(任何人都有读的权限
$lang['i_pol2'] = '关闭的维基(只有注册用户才有读、写、上传的权限)';
$lang['i_retry'] = '重试';
$lang['i_license'] = '请选择您希望的内容发布许可协议:';
-
$lang['recent_global'] = '您当前看到的是<b>%s</b> 名称空间的变动。你还可以在<a href="%s">查看整个维基的近期变动</a>。';
$lang['years'] = '%d年前';
$lang['months'] = '%d月前';
@@ -312,8 +320,8 @@ $lang['media_namespaces'] = '选择命名空间';
$lang['media_files'] = '在 %s 中的文件';
$lang['media_upload'] = '上传到 <strong>%s</strong> 命名空间。';
$lang['media_search'] = '在 <strong>%s</strong> 命名空间中搜索。';
-$lang['media_view'] = '%s 在 %s';
-$lang['media_viewold'] = '%s ';
+$lang['media_view'] = '%s';
+$lang['media_viewold'] = '%s 在 %s';
$lang['media_edit'] = '编辑 %s';
$lang['media_history'] = '%s 的历史纪录';
$lang['media_meta_edited'] = '元数据已编辑';
diff --git a/inc/lang/zh/mailwrap.html b/inc/lang/zh/mailwrap.html
new file mode 100644
index 000000000..0f00d95b1
--- /dev/null
+++ b/inc/lang/zh/mailwrap.html
@@ -0,0 +1,13 @@
+<html>
+<head>
+<title>@TITLE@</title>
+<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
+</head>
+<body>
+
+@HTMLBODY@
+
+<br /><hr />
+<small>本邮件由位于 @DOKUWIKIURL@ 的 Dokuwiki 自动创建。</small>
+</body>
+</html> \ No newline at end of file
diff --git a/inc/lang/zh/resetpwd.txt b/inc/lang/zh/resetpwd.txt
new file mode 100644
index 000000000..a9d59fdd3
--- /dev/null
+++ b/inc/lang/zh/resetpwd.txt
@@ -0,0 +1,3 @@
+====== 设置新密码 ======
+
+请为您在本维基上的账户设置一个新密码。 \ No newline at end of file
diff --git a/inc/load.php b/inc/load.php
index 7a410e452..b676518e7 100644
--- a/inc/load.php
+++ b/inc/load.php
@@ -62,6 +62,7 @@ function load_autoload($name){
'Doku_Event' => DOKU_INC.'inc/events.php',
'Doku_Event_Handler' => DOKU_INC.'inc/events.php',
'EmailAddressValidator' => DOKU_INC.'inc/EmailAddressValidator.php',
+ 'Input' => DOKU_INC.'inc/Input.class.php',
'JpegMeta' => DOKU_INC.'inc/JpegMeta.php',
'SimplePie' => DOKU_INC.'inc/SimplePie.php',
'FeedParser' => DOKU_INC.'inc/FeedParser.php',
diff --git a/inc/media.php b/inc/media.php
index 841a5218e..43bbd2560 100644
--- a/inc/media.php
+++ b/inc/media.php
@@ -226,8 +226,9 @@ function media_delete($id,$auth){
*/
function media_upload_xhr($ns,$auth){
if(!checkSecurityToken()) return false;
+ global $INPUT;
- $id = $_GET['qqfile'];
+ $id = $INPUT->get->str('qqfile');
list($ext,$mime,$dl) = mimetype($id);
$input = fopen("php://input", "r");
if (!($tmp = io_mktmpdir())) return false;
@@ -247,7 +248,7 @@ function media_upload_xhr($ns,$auth){
'mime' => $mime,
'ext' => $ext),
$ns.':'.$id,
- (($_REQUEST['ow'] == 'checked') ? true : false),
+ (($INPUT->get->str('ow') == 'checked') ? true : false),
$auth,
'copy'
);
@@ -270,9 +271,10 @@ function media_upload_xhr($ns,$auth){
function media_upload($ns,$auth,$file=false){
if(!checkSecurityToken()) return false;
global $lang;
+ global $INPUT;
// get file and id
- $id = $_POST['mediaid'];
+ $id = $INPUT->post->str('mediaid');
if (!$file) $file = $_FILES['upload'];
if(empty($id)) $id = $file['name'];
@@ -294,7 +296,7 @@ function media_upload($ns,$auth,$file=false){
$res = media_save(array('name' => $file['tmp_name'],
'mime' => $imime,
'ext' => $iext), $ns.':'.$id,
- $_REQUEST['ow'], $auth, 'move_uploaded_file');
+ $INPUT->post->bool('ow'), $auth, 'move_uploaded_file');
if (is_array($res)) {
msg($res[0], $res[1]);
return false;
@@ -420,7 +422,7 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'mov
media_notify($id,$fn,$imime,$old);
// add a log entry to the media changelog
if ($REV){
- addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_REVERT, $lang['restored'], $REV);
+ addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_REVERT, sprintf($lang['restored'], dformat($REV)), $REV);
} elseif ($overwrite) {
addMediaLogEntry($new, $id, DOKU_CHANGE_TYPE_EDIT);
} else {
@@ -641,7 +643,9 @@ function media_tabs_details($image, $selected_tab = ''){
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_tab_files_options(){
- global $lang, $NS;
+ global $lang;
+ global $NS;
+ global $INPUT;
$form = new Doku_Form(array('class' => 'options', 'method' => 'get',
'action' => wl($ID)));
$media_manager_params = media_managerURL(array(), '', false, true);
@@ -649,8 +653,8 @@ function media_tab_files_options(){
$form->addHidden($pKey, $pVal);
}
$form->addHidden('sectok', null);
- if (isset($_REQUEST['q'])) {
- $form->addHidden('q', $_REQUEST['q']);
+ if ($INPUT->has('q')) {
+ $form->addHidden('q', $INPUT->str('q'));
}
$form->addElement('<ul>'.NL);
foreach(array('list' => array('listType', array('thumbs', 'rows')),
@@ -694,9 +698,10 @@ function _media_get_list_type() {
}
function _media_get_display_param($param, $values) {
- if (isset($_REQUEST[$param]) && in_array($_REQUEST[$param], $values)) {
+ global $INPUT;
+ if (in_array($INPUT->str($param), $values)) {
// FIXME: Set cookie
- return $_REQUEST[$param];
+ return $INPUT->str($param);
} else {
$val = get_doku_pref($param, $values['default']);
if (!in_array($val, $values)) {
@@ -746,10 +751,10 @@ function media_tab_upload($ns,$auth=null,$jump='') {
*/
function media_tab_search($ns,$auth=null) {
global $lang;
+ global $INPUT;
- $do = $_REQUEST['mediado'];
- $query = $_REQUEST['q'];
- if (!$query) $query = '';
+ $do = $INPUT->str('mediado');
+ $query = $INPUT->str('q');
echo '<div class="search">'.NL;
media_searchform($ns, $query, true);
@@ -801,14 +806,16 @@ function media_tab_edit($image, $ns, $auth=null) {
*/
function media_tab_history($image, $ns, $auth=null) {
global $lang;
+ global $INPUT;
+
if(is_null($auth)) $auth = auth_quickaclcheck("$ns:*");
- $do = $_REQUEST['mediado'];
+ $do = $INPUT->str('mediado');
if ($auth >= AUTH_READ && $image) {
if ($do == 'diff'){
media_diff($image, $ns, $auth);
} else {
- $first = isset($_REQUEST['first']) ? intval($_REQUEST['first']) : 0;
+ $first = $INPUT->int('first');
html_revisions($first, $image);
}
} else {
@@ -1002,21 +1009,23 @@ function media_details($image, $auth, $rev=false, $meta=false) {
function media_diff($image, $ns, $auth, $fromajax = false) {
global $lang;
global $conf;
+ global $INPUT;
if ($auth < AUTH_READ || !$image || !$conf['mediarevisions']) return '';
- $rev1 = (int) $_REQUEST['rev'];
+ $rev1 = $INPUT->int('rev');
- if(is_array($_REQUEST['rev2'])){
- $rev1 = (int) $_REQUEST['rev2'][0];
- $rev2 = (int) $_REQUEST['rev2'][1];
+ $rev2 = $INPUT->ref('rev2');
+ if(is_array($rev2)){
+ $rev1 = (int) $rev2[0];
+ $rev2 = (int) $rev2[1];
if(!$rev1){
$rev1 = $rev2;
unset($rev2);
}
}else{
- $rev2 = (int) $_REQUEST['rev2'];
+ $rev2 = $INPUT->int('rev2');
}
if ($rev1 && !file_exists(mediaFN($image, $rev1))) $rev1 = false;
@@ -1071,7 +1080,9 @@ function _media_file_diff($data) {
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){
- global $lang, $config_cascade;
+ global $lang;
+ global $config_cascade;
+ global $INPUT;
$l_meta = new JpegMeta(mediaFN($image, $l_rev));
$r_meta = new JpegMeta(mediaFN($image, $r_rev));
@@ -1082,7 +1093,7 @@ function media_file_diff($image, $l_rev, $r_rev, $ns, $auth, $fromajax){
$r_size = media_image_preview_size($image, $r_rev, $r_meta);
$is_img = ($l_size && $r_size && ($l_size[0] >= 30 || $r_size[0] >= 30));
- $difftype = $_REQUEST['difftype'];
+ $difftype = $INPUT->str('difftype');
if (!$fromajax) {
$form = new Doku_Form(array(
@@ -1442,7 +1453,7 @@ function media_printfile_thumbs($item,$auth,$jump=false,$display_namespace=false
$size .= (int) $item['meta']->getField('File.Height');
echo '<dd class="size">'.$size.'</dd>'.NL;
} else {
- echo '<dd class="size">&nbsp;</dd>'.NL;
+ echo '<dd class="size">&#160;</dd>'.NL;
}
$date = dformat($item['mtime']);
echo '<dd class="date">'.$date.'</dd>'.NL;
@@ -1527,11 +1538,12 @@ function media_printimgdetail($item, $fullscreen=false){
function media_managerURL($params=false, $amp='&amp;', $abs=false, $params_array=false) {
global $conf;
global $ID;
+ global $INPUT;
$gets = array('do' => 'media');
$media_manager_params = array('tab_files', 'tab_details', 'image', 'ns', 'list', 'sort');
foreach ($media_manager_params as $x) {
- if (isset($_REQUEST[$x])) $gets[$x] = $_REQUEST[$x];
+ if ($INPUT->has($x)) $gets[$x] = $INPUT->str($x);
}
if ($params) {
@@ -1555,7 +1567,9 @@ function media_managerURL($params=false, $amp='&amp;', $abs=false, $params_array
* @author Kate Arzamastseva <pshns@ukr.net>
*/
function media_uploadform($ns, $auth, $fullscreen = false){
- global $lang, $conf;
+ global $lang;
+ global $conf;
+ global $INPUT;
if($auth < AUTH_UPLOAD) {
echo '<div class="nothing">'.$lang['media_perm_upload'].'</div>'.NL;
@@ -1565,9 +1579,9 @@ function media_uploadform($ns, $auth, $fullscreen = false){
$update = false;
$id = '';
- if ($auth >= $auth_ow && $fullscreen && $_REQUEST['mediado'] == 'update') {
+ if ($auth >= $auth_ow && $fullscreen && $INPUT->str('mediado') == 'update') {
$update = true;
- $id = cleanID($_REQUEST['image']);
+ $id = cleanID($INPUT->str('image'));
}
// The default HTML upload form
@@ -1697,12 +1711,13 @@ function media_nstree($ns){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function media_nstree_item($item){
+ global $INPUT;
$pos = strrpos($item['id'], ':');
$label = substr($item['id'], $pos > 0 ? $pos + 1 : 0);
if(!$item['label']) $item['label'] = $label;
$ret = '';
- if (!($_REQUEST['do'] == 'media'))
+ if (!($INPUT->str('do') == 'media'))
$ret .= '<a href="'.DOKU_BASE.'lib/exe/mediamanager.php?ns='.idfilter($item['id']).'" class="idx_dir">';
else $ret .= '<a href="'.media_managerURL(array('ns' => idfilter($item['id'], false), 'tab_files' => 'files'))
.'" class="idx_dir">';
@@ -1723,7 +1738,7 @@ function media_nstree_li($item){
if($item['open']){
$class .= ' open';
$img = DOKU_BASE.'lib/images/minus.gif';
- $alt = '&minus;';
+ $alt = '−';
}else{
$class .= ' closed';
$img = DOKU_BASE.'lib/images/plus.gif';
diff --git a/inc/pageutils.php b/inc/pageutils.php
index c94d14624..5e741c491 100644
--- a/inc/pageutils.php
+++ b/inc/pageutils.php
@@ -19,9 +19,10 @@
* @author Andreas Gohr <andi@splitbrain.org>
*/
function getID($param='id',$clean=true){
+ global $INPUT;
global $conf;
- $id = isset($_REQUEST[$param]) ? $_REQUEST[$param] : null;
+ $id = $INPUT->str($param);
//construct page id from request URI
if(empty($id) && $conf['userewrite'] == 2){
@@ -622,3 +623,27 @@ function utf8_decodeFN($file){
return urldecode($file);
}
+/**
+ * Find a page in the current namespace (determined from $ID) or any
+ * higher namespace
+ *
+ * Used for sidebars, but can be used other stuff as well
+ *
+ * @todo add event hook
+ * @param string $page the pagename you're looking for
+ * @return string|false the full page id of the found page, false if any
+ */
+function page_findnearest($page){
+ global $ID;
+
+ $ns = $ID;
+ do {
+ $ns = getNS($ns);
+ $pageid = ltrim("$ns:$page",':');
+ if(page_exists($pageid)){
+ return $pageid;
+ }
+ } while($ns);
+
+ return false;
+}
diff --git a/inc/parser/code.php b/inc/parser/code.php
index 4d94dcf4e..ff44a4e1e 100644
--- a/inc/parser/code.php
+++ b/inc/parser/code.php
@@ -16,11 +16,12 @@ class Doku_Renderer_code extends Doku_Renderer {
* When the correct block was found it exits the script.
*/
function code($text, $language = NULL, $filename='' ) {
+ global $INPUT;
if(!$language) $language = 'txt';
if(!$filename) $filename = 'snippet.'.$language;
$filename = basename($filename);
- if($this->_codeblock == $_REQUEST['codeblock']){
+ 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");
diff --git a/inc/parser/xhtml.php b/inc/parser/xhtml.php
index 4345b494f..2f09dbd4f 100644
--- a/inc/parser/xhtml.php
+++ b/inc/parser/xhtml.php
@@ -109,7 +109,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
// open the footnote and set the anchor and backlink
$this->doc .= '<div class="fn">';
- $this->doc .= '<sup><a href="#fnt__'.$id.'" id="fn__'.$id.'" name="fn__'.$id.'" class="fn_bot">';
+ $this->doc .= '<sup><a href="#fnt__'.$id.'" id="fn__'.$id.'" class="fn_bot">';
$this->doc .= $id.')</a></sup> '.DOKU_LF;
// get any other footnotes that use the same markup
@@ -118,7 +118,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
if (count($alt)) {
foreach ($alt as $ref) {
// set anchor and backlink for the other footnotes
- $this->doc .= ', <sup><a href="#fnt__'.($ref+1).'" id="fn__'.($ref+1).'" name="fn__'.($ref+1).'" class="fn_bot">';
+ $this->doc .= ', <sup><a href="#fnt__'.($ref+1).'" id="fn__'.($ref+1).'" class="fn_bot">';
$this->doc .= ($ref+1).')</a></sup> '.DOKU_LF;
}
}
@@ -181,9 +181,9 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
if ($level <= $conf['maxseclevel']) {
$this->doc .= ' class="' . $this->startSectionEdit($pos, 'section', $text) . '"';
}
- $this->doc .= '><a name="'.$hid.'" id="'.$hid.'">';
+ $this->doc .= ' id="'.$hid.'">';
$this->doc .= $this->_xmlEntities($text);
- $this->doc .= "</a></h$level>".DOKU_LF;
+ $this->doc .= "</h$level>".DOKU_LF;
}
function section_open($level) {
@@ -316,7 +316,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
}
// output the footnote reference and link
- $this->doc .= '<sup><a href="#fn__'.$id.'" name="fnt__'.$id.'" id="fnt__'.$id.'" class="fn_top">'.$id.')</a></sup>';
+ $this->doc .= '<sup><a href="#fn__'.$id.'" id="fnt__'.$id.'" class="fn_top">'.$id.')</a></sup>';
}
function listu_open() {
@@ -471,8 +471,8 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$title = $this->_xmlEntities($this->acronyms[$acronym]);
- $this->doc .= '<acronym title="'.$title
- .'">'.$this->_xmlEntities($acronym).'</acronym>';
+ $this->doc .= '<abbr title="'.$title
+ .'">'.$this->_xmlEntities($acronym).'</abbr>';
} else {
$this->doc .= $this->_xmlEntities($acronym);
@@ -483,7 +483,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
if ( array_key_exists($smiley, $this->smileys) ) {
$title = $this->_xmlEntities($this->smileys[$smiley]);
$this->doc .= '<img src="'.DOKU_BASE.'lib/images/smileys/'.$this->smileys[$smiley].
- '" class="middle" alt="'.
+ '" class="icon" alt="'.
$this->_xmlEntities($smiley).'" />';
} else {
$this->doc .= $this->_xmlEntities($smiley);
@@ -549,7 +549,7 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
global $ID;
$name = $this->_getLinkTitle($name, $hash, $isImage);
$hash = $this->_headerToLink($hash);
- $title = $ID.' &crarr;';
+ $title = $ID.' ↵';
$this->doc .= '<a href="#'.$hash.'" title="'.$title.'" class="wikilink1">';
$this->doc .= $name;
$this->doc .= '</a>';
@@ -1075,10 +1075,6 @@ class Doku_Renderer_xhtml extends Doku_Renderer {
$ret .= '<img src="'.ml($src,array('w'=>$width,'h'=>$height,'cache'=>$cache)).'"';
$ret .= ' class="media'.$align.'"';
- // make left/right alignment for no-CSS view work (feeds)
- if($align == 'right') $ret .= ' align="right"';
- if($align == 'left') $ret .= ' align="left"';
-
if ($title) {
$ret .= ' title="' . $title . '"';
$ret .= ' alt="' . $title .'"';
diff --git a/inc/parserutils.php b/inc/parserutils.php
index 9384929bf..55b451c76 100644
--- a/inc/parserutils.php
+++ b/inc/parserutils.php
@@ -318,8 +318,9 @@ function p_get_metadata($id, $key='', $render=METADATA_RENDER_USING_CACHE){
// only update the file when the metadata has been changed
if ($meta == $old_meta || p_save_metadata($id, $meta)) {
// store a timestamp in order to make sure that the cachefile is touched
+ // this timestamp is also stored when the meta data is still the same
$cachefile->storeCache(time());
- } elseif ($meta != $old_meta) {
+ } else {
msg('Unable to save metadata file. Hint: disk full; file permissions; safe_mode setting.',-1);
}
}
@@ -739,7 +740,7 @@ function p_get_first_heading($id, $render=METADATA_RENDER_USING_SIMPLE_CACHE){
* @author Andreas Gohr <andi@splitbrain.org>
*/
function p_xhtml_cached_geshi($code, $language, $wrapper='pre') {
- global $conf, $config_cascade;
+ global $conf, $config_cascade, $INPUT;
$language = strtolower($language);
// remove any leading or trailing blank lines
@@ -747,7 +748,7 @@ function p_xhtml_cached_geshi($code, $language, $wrapper='pre') {
$cache = getCacheName($language.$code,".code");
$ctime = @filemtime($cache);
- if($ctime && !$_REQUEST['purge'] &&
+ if($ctime && !$INPUT->bool('purge') &&
$ctime > filemtime(DOKU_INC.'inc/geshi.php') && // geshi changed
$ctime > @filemtime(DOKU_INC.'inc/geshi/'.$language.'.php') && // language syntax definition changed
$ctime > filemtime(reset($config_cascade['main']['default']))){ // dokuwiki changed
diff --git a/inc/preload.php.dist b/inc/preload.php.dist
new file mode 100644
index 000000000..7acda0e3d
--- /dev/null
+++ b/inc/preload.php.dist
@@ -0,0 +1,17 @@
+<?php
+/**
+ * This is an example for a farm setup. Simply copy this file to preload.php and
+ * uncomment what you need. See http://www.dokuwiki.org/farms for more information.
+ * You can also use preload.php for other things than farming, e.g. for moving
+ * local configuration files out of the main ./conf directory.
+ */
+
+// set this to your farm directory
+//if(!defined('DOKU_FARMDIR')) define('DOKU_FARMDIR', '/var/www/farm');
+
+// include this after DOKU_FARMDIR if you want to use farms
+//include(fullpath(dirname(__FILE__)).'/farm.php');
+
+// you can overwrite the $config_cascade to your liking
+//$config_cascade = array(
+//);
diff --git a/inc/template.php b/inc/template.php
index d007f47ef..76d4d4bbe 100644
--- a/inc/template.php
+++ b/inc/template.php
@@ -354,12 +354,8 @@ function tpl_metaheaders($alt=true){
}
// load stylesheets
- $head['link'][] = array('rel'=>'stylesheet', 'media'=>'screen', 'type'=>'text/css',
+ $head['link'][] = array('rel'=>'stylesheet', 'type'=>'text/css',
'href'=>DOKU_BASE.'lib/exe/css.php?t='.$conf['template'].'&tseed='.$tseed);
- $head['link'][] = array('rel'=>'stylesheet', 'media'=>'all', 'type'=>'text/css',
- 'href'=>DOKU_BASE.'lib/exe/css.php?s=all&t='.$conf['template'].'&tseed='.$tseed);
- $head['link'][] = array('rel'=>'stylesheet', 'media'=>'print', 'type'=>'text/css',
- 'href'=>DOKU_BASE.'lib/exe/css.php?s=print&t='.$conf['template'].'&tseed='.$tseed);
// make $INFO and other vars available to JavaScripts
$json = new JSON();
@@ -596,7 +592,7 @@ function tpl_get_action($type) {
$accesskey = 'x';
break;
case 'top':
- $accesskey = 'x';
+ $accesskey = 't';
$params = array();
$id = '#dokuwiki__top';
break;
@@ -718,7 +714,7 @@ function tpl_searchform($ajax=true,$autocomplete=true){
*
* @author Andreas Gohr <andi@splitbrain.org>
*/
-function tpl_breadcrumbs($sep='&bull;'){
+function tpl_breadcrumbs($sep='•'){
global $lang;
global $conf;
@@ -761,7 +757,7 @@ function tpl_breadcrumbs($sep='&bull;'){
* @author <fredrik@averpil.com>
* @todo May behave strangely in RTL languages
*/
-function tpl_youarehere($sep=' &raquo; '){
+function tpl_youarehere($sep=' » '){
global $conf;
global $ID;
global $lang;
@@ -847,7 +843,7 @@ function tpl_pageinfo($ret=false){
if($INFO['exists']){
$out = '';
$out .= $fn;
- $out .= ' &middot; ';
+ $out .= ' · ';
$out .= $lang['lastmod'];
$out .= ': ';
$out .= $date;
@@ -858,7 +854,7 @@ function tpl_pageinfo($ret=false){
$out .= ' ('.$lang['external_edit'].')';
}
if($INFO['locked']){
- $out .= ' &middot; ';
+ $out .= ' · ';
$out .= $lang['lockedby'];
$out .= ': ';
$out .= editorinfo($INFO['locked']);
@@ -1398,6 +1394,18 @@ function tpl_include_page($pageid,$print=true){
if(!$print) return $html;
echo $html;
+ return $html;
+}
+
+/**
+ * Include the sidebar, will check current namespaces first
+ */
+function tpl_sidebar($print=true){
+ global $conf;
+
+ $sidebar = page_findnearest($conf['sidebar']);
+ if($sidebar) return tpl_include_page($sidebar, $print);
+ return '';
}
/**
diff --git a/inc/utf8.php b/inc/utf8.php
index 54986e14e..7b7c19c6b 100644
--- a/inc/utf8.php
+++ b/inc/utf8.php
@@ -103,9 +103,9 @@ if(!function_exists('utf8_substr')){
*
* @author Harry Fuecks <hfuecks@gmail.com>
* @author Chris Smith <chris@jalakai.co.uk>
- * @param string
- * @param integer number of UTF-8 characters offset (from left)
- * @param integer (optional) length in UTF-8 characters from offset
+ * @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 mixed string or false if failure
*/
function utf8_substr($str, $offset, $length = null) {
@@ -221,6 +221,8 @@ if(!function_exists('utf8_ltrim')){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @see ltrim()
+ * @param string $str
+ * @param string $charlist
* @return string
*/
function utf8_ltrim($str,$charlist=''){
@@ -239,6 +241,8 @@ if(!function_exists('utf8_rtrim')){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @see rtrim()
+ * @param string $str
+ * @param string $charlist
* @return string
*/
function utf8_rtrim($str,$charlist=''){
@@ -257,6 +261,8 @@ if(!function_exists('utf8_trim')){
*
* @author Andreas Gohr <andi@splitbrain.org>
* @see trim()
+ * @param string $str
+ * @param string $charlist
* @return string
*/
function utf8_trim($str,$charlist='') {
@@ -348,7 +354,7 @@ if(!function_exists('utf8_ucwords')){
* You don't need to call this yourself
*
* @author Harry Fuecks
- * @param array of matches corresponding to a single word
+ * @param array $matches matches corresponding to a single word
* @return string with first char of the word in uppercase
* @see utf8_ucwords
* @see utf8_strtoupper
@@ -408,9 +414,9 @@ if(!function_exists('utf8_stripspecials')){
* @param string $string The UTF8 string to strip of special chars
* @param string $repl Replace special with this string
* @param string $additional Additional chars to strip (used in regexp char class)
+ * @return string
*/
function utf8_stripspecials($string,$repl='',$additional=''){
- global $UTF8_SPECIAL_CHARS;
global $UTF8_SPECIAL_CHARS2;
static $specials = null;
@@ -493,7 +499,7 @@ if(!function_exists('utf8_unhtml')){
* @author Tom N Harris <tnharris@whoopdedo.org>
* @param string $str UTF-8 encoded string
* @param boolean $entities Flag controlling decoding of named entities.
- * @return UTF-8 encoded string with numeric (and named) entities replaced.
+ * @return string UTF-8 encoded string with numeric (and named) entities replaced.
*/
function utf8_unhtml($str, $entities=null) {
static $decoder = null;
@@ -509,6 +515,12 @@ if(!function_exists('utf8_unhtml')){
}
if(!function_exists('utf8_decode_numeric')){
+ /**
+ * Decodes numeric HTML entities to their correct UTF-8 characters
+ *
+ * @param $ent string A numeric entity
+ * @return string
+ */
function utf8_decode_numeric($ent) {
switch ($ent[2]) {
case 'X':
@@ -524,16 +536,37 @@ if(!function_exists('utf8_decode_numeric')){
}
if(!class_exists('utf8_entity_decoder')){
+ /**
+ * Encapsulate HTML entity decoding tables
+ */
class utf8_entity_decoder {
var $table;
+
+ /**
+ * Initializes the decoding tables
+ */
function __construct() {
$table = get_html_translation_table(HTML_ENTITIES);
$table = array_flip($table);
$this->table = array_map(array(&$this,'makeutf8'), $table);
}
+
+ /**
+ * Wrapper aorund unicode_to_utf8()
+ *
+ * @param $c string
+ * @return mixed
+ */
function makeutf8($c) {
return unicode_to_utf8(array(ord($c)));
}
+
+ /**
+ * Decodes any HTML entity to it's correct UTF-8 char equivalent
+ *
+ * @param $ent string An entity
+ * @return string
+ */
function decode($ent) {
if ($ent[1] == '#') {
return utf8_decode_numeric($ent);
@@ -562,8 +595,8 @@ if(!function_exists('utf8_to_unicode')){
*
* @author <hsivonen@iki.fi>
* @author Harry Fuecks <hfuecks@gmail.com>
- * @param string UTF-8 encoded string
- * @param boolean Check for invalid sequences?
+ * @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
* @see unicode_to_utf8
* @link http://hsivonen.iki.fi/php-utf8/
@@ -735,8 +768,8 @@ if(!function_exists('unicode_to_utf8')){
* output buffering to concatenate the UTF-8 string (faster) as well as
* reference the array by it's keys
*
- * @param array of unicode code points representing a string
- * @param boolean Check for invalid sequences?
+ * @param array $arr of unicode code points representing a string
+ * @param boolean $strict Check for invalid sequences?
* @return mixed UTF-8 string or false if array contains invalid code points
* @author <hsivonen@iki.fi>
* @author Harry Fuecks <hfuecks@gmail.com>
@@ -855,8 +888,8 @@ if(!function_exists('utf8_bad_replace')){
*
* @author Harry Fuecks <hfuecks@gmail.com>
* @see http://www.w3.org/International/questions/qa-forms-utf-8
- * @param string to search
- * @param string to replace bad bytes with (defaults to '?') - use ASCII
+ * @param string $str to search
+ * @param string $replace to replace bad bytes with (defaults to '?') - use ASCII
* @return string
*/
function utf8_bad_replace($str, $replace = '') {
@@ -1000,7 +1033,7 @@ if(!UTF8_MBSTRING){
/**
* UTF-8 Case lookup table
*
- * This lookuptable defines the lower case letters to their correspponding
+ * This lookuptable defines the lower case letters to their corresponding
* upper case letter in UTF-8
*
* @author Andreas Gohr <andi@splitbrain.org>
diff --git a/install.php b/install.php
index bd43c6f99..0a2bf0a46 100644
--- a/install.php
+++ b/install.php
@@ -9,6 +9,8 @@ if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/');
if(!defined('DOKU_CONF')) define('DOKU_CONF',DOKU_INC.'conf/');
if(!defined('DOKU_LOCAL')) define('DOKU_LOCAL',DOKU_INC.'conf/');
+require_once(DOKU_INC.'inc/PassHash.class.php');
+
// check for error reporting override or set error reporting to sane values
if (!defined('DOKU_E_LEVEL')) { error_reporting(E_ALL ^ E_NOTICE); }
else { error_reporting(DOKU_E_LEVEL); }
@@ -27,8 +29,10 @@ if (get_magic_quotes_gpc() && !defined('MAGIC_QUOTES_STRIPPED')) {
// language strings
require_once(DOKU_INC.'inc/lang/en/lang.php');
-$LC = preg_replace('/[^a-z\-]+/','',$_REQUEST['l']);
-if(!$LC) $LC = 'en';
+if(isset($_REQUEST['l']) && !is_array($_REQUEST['l'])) {
+ $LC = preg_replace('/[^a-z\-]+/','',$_REQUEST['l']);
+}
+if(empty($LC)) $LC = 'en';
if($LC && $LC != 'en' ) {
require_once(DOKU_INC.'inc/lang/'.$LC.'/lang.php');
}
@@ -50,10 +54,10 @@ $dokuwiki_hash = array(
'2011-05-25' => '4241865472edb6fa14a1227721008072',
'2011-11-10' => 'b46ff19a7587966ac4df61cbab1b8b31',
'2012-01-25' => '72c083c73608fc43c586901fd5dabb74',
+ 'devel' => 'eb0b3fc90056fbc12bac6f49f7764df3'
);
-
// begin output
header('Content-Type: text/html; charset=utf-8');
?>
@@ -74,7 +78,7 @@ header('Content-Type: text/html; charset=utf-8');
select.text, input.text { width: 30em; margin: 0 0.5em; }
a {text-decoration: none}
</style>
- <script type="text/javascript" language="javascript">
+ <script type="text/javascript">
function acltoggle(){
var cb = document.getElementById('acl');
var fs = document.getElementById('acldep');
@@ -128,17 +132,16 @@ header('Content-Type: text/html; charset=utf-8');
}elseif(!check_configs()){
echo '<p>'.$lang['i_modified'].'</p>';
print_errors();
- }elseif($_REQUEST['submit']){
- if(!check_data($_REQUEST['d'])){
- print_errors();
- print_form($_REQUEST['d']);
- }elseif(!store_data($_REQUEST['d'])){
+ }elseif(check_data($_REQUEST['d'])){
+ // check_data has sanitized all input parameters
+ if(!store_data($_REQUEST['d'])){
echo '<p>'.$lang['i_failure'].'</p>';
print_errors();
}else{
echo '<p>'.$lang['i_success'].'</p>';
}
}else{
+ print_errors();
print_form($_REQUEST['d']);
}
?>
@@ -210,7 +213,7 @@ function print_form($d){
<p><?php echo $lang['i_license']?></p>
<?php
array_unshift($license,array('name' => 'None', 'url'=>''));
- if(!isset($d['license'])) $d['license'] = 'cc-by-sa';
+ if(empty($d['license'])) $d['license'] = 'cc-by-sa';
foreach($license as $key => $lic){
echo '<label for="lic_'.$key.'">';
echo '<input type="radio" name="d[license]" value="'.htmlspecialchars($key).'" id="lic_'.$key.'"'.
@@ -249,41 +252,65 @@ function print_retry() {
* @author Andreas Gohr
*/
function check_data(&$d){
+ static $form_default = array(
+ 'title' => '',
+ 'acl' => '1',
+ 'superuser' => '',
+ 'fullname' => '',
+ 'email' => '',
+ 'password' => '',
+ 'confirm' => '',
+ 'policy' => '0',
+ 'license' => 'cc-by-sa'
+ );
global $lang;
global $error;
+ if(!is_array($d)) $d = array();
+ foreach($d as $k => $v) {
+ if(is_array($v))
+ unset($d[$k]);
+ else
+ $d[$k] = (string)$v;
+ }
+
//autolowercase the username
- $d['superuser'] = strtolower($d['superuser']);
+ $d['superuser'] = isset($d['superuser']) ? strtolower($d['superuser']) : "";
- $ok = true;
+ $ok = false;
- // check input
- if(empty($d['title'])){
- $error[] = sprintf($lang['i_badval'],$lang['i_wikiname']);
- $ok = false;
- }
- if($d['acl']){
- if(!preg_match('/^[a-z0-9_]+$/',$d['superuser'])){
- $error[] = sprintf($lang['i_badval'],$lang['i_superuser']);
- $ok = false;
- }
- if(empty($d['password'])){
- $error[] = sprintf($lang['i_badval'],$lang['pass']);
- $ok = false;
- }
- if($d['confirm'] != $d['password']){
- $error[] = sprintf($lang['i_badval'],$lang['passchk']);
- $ok = false;
- }
- if(empty($d['fullname']) || strstr($d['fullname'],':')){
- $error[] = sprintf($lang['i_badval'],$lang['fullname']);
+ if(isset($_REQUEST['submit'])) {
+ $ok = true;
+
+ // check input
+ if(empty($d['title'])){
+ $error[] = sprintf($lang['i_badval'],$lang['i_wikiname']);
$ok = false;
}
- if(empty($d['email']) || strstr($d['email'],':') || !strstr($d['email'],'@')){
- $error[] = sprintf($lang['i_badval'],$lang['email']);
- $ok = false;
+ if(isset($d['acl'])){
+ if(!preg_match('/^[a-z0-9_]+$/',$d['superuser'])){
+ $error[] = sprintf($lang['i_badval'],$lang['i_superuser']);
+ $ok = false;
+ }
+ if(empty($d['password'])){
+ $error[] = sprintf($lang['i_badval'],$lang['pass']);
+ $ok = false;
+ }
+ elseif(!isset($d['confirm']) || $d['confirm'] != $d['password']){
+ $error[] = sprintf($lang['i_badval'],$lang['passchk']);
+ $ok = false;
+ }
+ if(empty($d['fullname']) || strstr($d['fullname'],':')){
+ $error[] = sprintf($lang['i_badval'],$lang['fullname']);
+ $ok = false;
+ }
+ if(empty($d['email']) || strstr($d['email'],':') || !strstr($d['email'],'@')){
+ $error[] = sprintf($lang['i_badval'],$lang['email']);
+ $ok = false;
+ }
}
}
+ $d = array_merge($form_default, $d);
return $ok;
}
@@ -318,9 +345,13 @@ EOT;
$ok = $ok && fileWrite(DOKU_LOCAL.'local.php',$output);
if ($d['acl']) {
+ // hash the password
+ $phash = new PassHash();
+ $pass = $phash->hash_smd5($d['password']);
+
// create users.auth.php
- // --- user:MD5password:Real Name:email:groups,comma,seperated
- $output = join(":",array($d['superuser'], md5($d['password']), $d['fullname'], $d['email'], 'admin,user'));
+ // --- user:SMD5password:Real Name:email:groups,comma,seperated
+ $output = join(":",array($d['superuser'], $pass, $d['fullname'], $d['email'], 'admin,user'));
$output = @file_get_contents(DOKU_CONF.'users.auth.php.dist')."\n$output\n";
$ok = $ok && fileWrite(DOKU_LOCAL.'users.auth.php', $output);
@@ -400,7 +431,7 @@ function check_configs(){
// configs shouldn't exist
foreach ($config_files as $file) {
- if (@file_exists($file)) {
+ if (@file_exists($file) && filesize($file)) {
$file = str_replace($_SERVER['DOCUMENT_ROOT'],'{DOCUMENT_ROOT}/', $file);
$error[] = sprintf($lang['i_confexists'],$file);
$ok = false;
@@ -524,11 +555,13 @@ function langsel(){
*/
function print_errors(){
global $error;
- echo '<ul>';
- foreach ($error as $err){
- echo "<li>$err</li>";
+ if(!empty($error)) {
+ echo '<ul>';
+ foreach ($error as $err){
+ echo "<li>$err</li>";
+ }
+ echo '</ul>';
}
- echo '</ul>';
}
/**
diff --git a/lib/exe/css.php b/lib/exe/css.php
index 69b512205..8de3db11b 100644
--- a/lib/exe/css.php
+++ b/lib/exe/css.php
@@ -9,6 +9,7 @@
if(!defined('DOKU_INC')) define('DOKU_INC',dirname(__FILE__).'/../../');
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)
@@ -29,14 +30,17 @@ function css_out(){
global $conf;
global $lang;
global $config_cascade;
-
- $mediatype = 'screen';
- if (isset($_REQUEST['s']) &&
- in_array($_REQUEST['s'], array('all', 'print', 'feed'))) {
- $mediatype = $_REQUEST['s'];
+ global $INPUT;
+
+ if ($INPUT->str('s') == 'feed') {
+ $mediatypes = array('feed');
+ $type = 'feed';
+ } else {
+ $mediatypes = array('screen', 'all', 'print');
+ $type = '';
}
- $tpl = trim(preg_replace('/[^\w-]+/','',$_REQUEST['t']));
+ $tpl = trim(preg_replace('/[^\w-]+/','',$INPUT->str('t')));
if($tpl){
$tplinc = DOKU_INC.'lib/tpl/'.$tpl.'/';
$tpldir = DOKU_BASE.'lib/tpl/'.$tpl.'/';
@@ -46,7 +50,7 @@ function css_out(){
}
// The generated script depends on some dynamic options
- $cache = new cache('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].DOKU_BASE.$tplinc.$mediatype,'.css');
+ $cache = new cache('styles'.$_SERVER['HTTP_HOST'].$_SERVER['SERVER_PORT'].DOKU_BASE.$tplinc.$type,'.css');
// load template styles
$tplstyles = array();
@@ -57,57 +61,79 @@ function css_out(){
}
}
- // Array of needed files and their web locations, the latter ones
- // are needed to fix relative paths in the stylesheets
- $files = array();
- // load core styles
- $files[DOKU_INC.'lib/styles/'.$mediatype.'.css'] = DOKU_BASE.'lib/styles/';
- // load jQuery-UI theme
- $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($tplstyles[$mediatype])) {
- $files = array_merge($files, $tplstyles[$mediatype]);
- }
- // 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'];
- }
- // load user styles
- if(isset($config_cascade['userstyle'][$mediatype])){
- $files[$config_cascade['userstyle'][$mediatype]] = DOKU_BASE;
- }
- // load rtl styles
- // @todo: this currently adds the rtl styles only to the 'screen' media type
- // but 'print' and 'all' should also be supported
- if ($mediatype=='screen') {
- if($lang['direction'] == 'rtl'){
- if (isset($tplstyles['rtl'])) $files = array_merge($files, $tplstyles['rtl']);
+ // start output buffering
+ ob_start();
+
+ foreach($mediatypes as $mediatype) {
+ // Array of needed files and their web locations, the latter ones
+ // are needed to fix relative paths in the stylesheets
+ $files = array();
+ // 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($tplstyles[$mediatype])) {
+ $files = array_merge($files, $tplstyles[$mediatype]);
+ }
+ // 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'];
+ }
+ // load user styles
+ if(isset($config_cascade['userstyle'][$mediatype])){
+ $files[$config_cascade['userstyle'][$mediatype]] = DOKU_BASE;
+ }
+ // load rtl styles
+ // note: this adds the rtl styles only to the 'screen' media type
+ // @deprecated 2012-04-09: rtl will cease to be a mode of its own,
+ // please use "[dir=rtl]" in any css file in all, screen or print mode instead
+ if ($mediatype=='screen') {
+ if($lang['direction'] == 'rtl'){
+ if (isset($tplstyles['rtl'])) $files = array_merge($files, $tplstyles['rtl']);
+ }
}
- }
- $cache_files = array_merge(array_keys($files), getConfigFiles('main'));
- $cache_files[] = $tplinc.'style.ini';
- $cache_files[] = __FILE__;
+ $cache_files = array_merge(array_keys($files), getConfigFiles('main'));
+ $cache_files[] = $tplinc.'style.ini';
+ $cache_files[] = __FILE__;
- // check cache age & handle conditional request
- // This may exit if a cache can be used
- http_cached($cache->cache,
- $cache->useCache(array('files' => $cache_files)));
+ // check cache age & handle conditional request
+ // This may exit if a cache can be used
+ http_cached($cache->cache,
+ $cache->useCache(array('files' => $cache_files)));
- // start output buffering and build the stylesheet
- ob_start();
+ // build the stylesheet
- // print the default classes for interwiki links and file downloads
- css_interwiki();
- css_filetypes();
+ // print the default classes for interwiki links and file downloads
+ if ($mediatype == 'screen') {
+ css_interwiki();
+ css_filetypes();
+ }
- // load files
- foreach($files as $file => $location){
- print css_loadfile($file, $location);
+ // load files
+ $css_content = '';
+ foreach($files as $file => $location){
+ $css_content .= css_loadfile($file, $location);
+ }
+ switch ($mediatype) {
+ case 'screen':
+ print NL.'@media screen { /* START screen styles */'.NL.$css_content.NL.'} /* /@media END screen styles */'.NL;
+ break;
+ case 'print':
+ print NL.'@media print { /* START print styles */'.NL.$css_content.NL.'} /* /@media END print styles */'.NL;
+ break;
+ case 'all':
+ case 'feed':
+ default:
+ print NL.'/* START rest styles */ '.NL.$css_content.NL.'/* END rest styles */'.NL;
+ break;
+ }
}
-
// end output buffering and get contents
$css = ob_get_contents();
ob_end_clean();
@@ -275,6 +301,8 @@ function css_pluginstyles($mediatype='screen'){
if ($mediatype=='screen') {
$list[DOKU_PLUGIN."$p/style.css"] = DOKU_BASE."lib/plugins/$p/";
}
+ // @deprecated 2012-04-09: rtl will cease to be a mode of its own,
+ // please use "[dir=rtl]" in any css file in all, screen or print mode instead
if($lang['direction'] == 'rtl'){
$list[DOKU_PLUGIN."$p/rtl.css"] = DOKU_BASE."lib/plugins/$p/";
}
diff --git a/lib/exe/detail.php b/lib/exe/detail.php
index 35186f5dd..ea46bc037 100644
--- a/lib/exe/detail.php
+++ b/lib/exe/detail.php
@@ -6,9 +6,9 @@ require_once(DOKU_INC.'inc/init.php');
session_write_close();
$IMG = getID('media');
-$ID = cleanID($_REQUEST['id']);
+$ID = cleanID($INPUT->str('id'));
-if($conf['allowdebug'] && $_REQUEST['debug']){
+if($conf['allowdebug'] && $INPUT->has('debug')){
print '<pre>';
foreach(explode(' ','basedir userewrite baseurl useslash') as $x){
print '$'."conf['$x'] = '".$conf[$x]."';\n";
diff --git a/lib/exe/fetch.php b/lib/exe/fetch.php
index 143d40f22..60843460e 100644
--- a/lib/exe/fetch.php
+++ b/lib/exe/fetch.php
@@ -17,10 +17,10 @@
//get input
$MEDIA = stripctl(getID('media',false)); // no cleaning except control chars - maybe external
- $CACHE = calc_cache($_REQUEST['cache']);
- $WIDTH = (int) $_REQUEST['w'];
- $HEIGHT = (int) $_REQUEST['h'];
- $REV = (int) @$_REQUEST['rev'];
+ $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);
diff --git a/lib/exe/indexer.php b/lib/exe/indexer.php
index 738a29503..e149770c0 100644
--- a/lib/exe/indexer.php
+++ b/lib/exe/indexer.php
@@ -20,10 +20,10 @@ if(!$defer){
sendGIF(); // send gif
}
-$ID = cleanID($_REQUEST['id']);
+$ID = cleanID($INPUT->str('id'));
// Catch any possible output (e.g. errors)
-$output = isset($_REQUEST['debug']) && $conf['allowdebug'];
+$output = $INPUT->has('debug') && $conf['allowdebug'];
if(!$output) ob_start();
// run one of the jobs
@@ -261,7 +261,8 @@ function sendDigest() {
* @author Harry Fuecks <fuecks@gmail.com>
*/
function sendGIF(){
- if(isset($_REQUEST['debug'])){
+ global $INPUT;
+ if($INPUT->has('debug')){
header('Content-Type: text/plain');
return;
}
diff --git a/lib/exe/mediamanager.php b/lib/exe/mediamanager.php
index 5f09fe1f8..04dd178cc 100644
--- a/lib/exe/mediamanager.php
+++ b/lib/exe/mediamanager.php
@@ -10,25 +10,25 @@
trigger_event('MEDIAMANAGER_STARTED',$tmp=array());
session_write_close(); //close session
+ global $INPUT;
// handle passed message
- if($_REQUEST['msg1']) msg(hsc($_REQUEST['msg1']),1);
- if($_REQUEST['err']) msg(hsc($_REQUEST['err']),-1);
+ if($INPUT->str('msg1')) msg(hsc($INPUT->str('msg1')),1);
+ if($INPUT->str('err')) msg(hsc($INPUT->str('err')),-1);
// get namespace to display (either direct or from deletion order)
- if($_REQUEST['delete']){
- $DEL = cleanID($_REQUEST['delete']);
+ if($INPUT->str('delete')){
+ $DEL = cleanID($INPUT->str('delete'));
$IMG = $DEL;
$NS = getNS($DEL);
- }elseif($_REQUEST['edit']){
- $IMG = cleanID($_REQUEST['edit']);
+ }elseif($INPUT->str('edit')){
+ $IMG = cleanID($INPUT->str('edit'));
$NS = getNS($IMG);
- }elseif($_REQUEST['img']){
- $IMG = cleanID($_REQUEST['img']);
+ }elseif($INPUT->str('img')){
+ $IMG = cleanID($INPUT->str('img'));
$NS = getNS($IMG);
}else{
- $NS = $_REQUEST['ns'];
- $NS = cleanID($NS);
+ $NS = cleanID($INPUT->str('ns'));
}
// check auth
@@ -76,18 +76,18 @@
}
// handle meta saving
- if($IMG && @array_key_exists('save', $_REQUEST['do'])){
- $JUMPTO = media_metasave($IMG,$AUTH,$_REQUEST['meta']);
+ if($IMG && @array_key_exists('save', $INPUT->arr('do'))){
+ $JUMPTO = media_metasave($IMG,$AUTH,$INPUT->arr('meta'));
}
- if($IMG && ($_REQUEST['mediado'] == 'save' || @array_key_exists('save', $_REQUEST['mediado']))) {
- $JUMPTO = media_metasave($IMG,$AUTH,$_REQUEST['meta']);
+ if($IMG && ($INPUT->str('mediado') == 'save' || @array_key_exists('save', $INPUT->arr('mediado')))) {
+ $JUMPTO = media_metasave($IMG,$AUTH,$INPUT->arr('meta'));
}
- if ($_REQUEST['rev'] && $conf['mediarevisions']) $REV = (int) $_REQUEST['rev'];
+ if ($INPUT->int('rev') && $conf['mediarevisions']) $REV = $INPUT->int('rev');
- if($_REQUEST['mediado'] == 'restore' && $conf['mediarevisions']){
- $JUMPTO = media_restore($_REQUEST['image'], $REV, $AUTH);
+ if($INPUT->str('mediado') == 'restore' && $conf['mediarevisions']){
+ $JUMPTO = media_restore($INPUT->str('image'), $REV, $AUTH);
}
// handle deletion
@@ -101,7 +101,7 @@
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='.$_REQUEST['edid']);
+ rawurlencode($msg).'&edid='.$INPUT->str('edid'));
}
msg($msg,1);
} elseif ($res & DOKU_MEDIA_INUSE) {
diff --git a/lib/images/interwiki/amazon.de.gif b/lib/images/interwiki/amazon.de.gif
index 6e36a051a..a0d2cd4cb 100644
--- a/lib/images/interwiki/amazon.de.gif
+++ b/lib/images/interwiki/amazon.de.gif
Binary files differ
diff --git a/lib/images/interwiki/amazon.gif b/lib/images/interwiki/amazon.gif
index 6e36a051a..a0d2cd4cb 100644
--- a/lib/images/interwiki/amazon.gif
+++ b/lib/images/interwiki/amazon.gif
Binary files differ
diff --git a/lib/images/interwiki/amazon.uk.gif b/lib/images/interwiki/amazon.uk.gif
index 6e36a051a..a0d2cd4cb 100644
--- a/lib/images/interwiki/amazon.uk.gif
+++ b/lib/images/interwiki/amazon.uk.gif
Binary files differ
diff --git a/lib/images/interwiki/callto.gif b/lib/images/interwiki/callto.gif
index f6d424554..60158c565 100644
--- a/lib/images/interwiki/callto.gif
+++ b/lib/images/interwiki/callto.gif
Binary files differ
diff --git a/lib/images/interwiki/paypal.gif b/lib/images/interwiki/paypal.gif
index 1d2834062..a2dc89431 100644
--- a/lib/images/interwiki/paypal.gif
+++ b/lib/images/interwiki/paypal.gif
Binary files differ
diff --git a/lib/images/interwiki/skype.gif b/lib/images/interwiki/skype.gif
new file mode 100644
index 000000000..2c900a8b2
--- /dev/null
+++ b/lib/images/interwiki/skype.gif
Binary files differ
diff --git a/lib/images/interwiki/skype.png b/lib/images/interwiki/skype.png
deleted file mode 100644
index c70216702..000000000
--- a/lib/images/interwiki/skype.png
+++ /dev/null
Binary files differ
diff --git a/lib/plugins/acl/admin.php b/lib/plugins/acl/admin.php
index c3461b78b..a0d2e430e 100644
--- a/lib/plugins/acl/admin.php
+++ b/lib/plugins/acl/admin.php
@@ -84,7 +84,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
$this->who = '@'.ltrim($auth->cleanGroup($who),'@');
}elseif($_REQUEST['acl_t'] == '__u__' && $who){
$this->who = ltrim($who,'@');
- if($this->who != '%USER%'){ #keep wildcard as is
+ if($this->who != '%USER%' && $this->who != '%GROUP%'){ #keep wildcard as is
$this->who = $auth->cleanUser($this->who);
}
}elseif($_REQUEST['acl_t'] &&
@@ -140,7 +140,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
if ($who!='@ALL') {
$who = '@'.ltrim($auth->cleanGroup($who),'@');
}
- } elseif ($who != '%USER%'){ #keep wildcard as is
+ } elseif ($who != '%USER%' && $who != '%GROUP%'){ #keep wildcard as is
$who = $auth->cleanUser($who);
}
$who = auth_nameencode($who,true);
@@ -507,7 +507,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
if($item['type']=='d'){
if($item['open']){
$img = DOKU_BASE.'lib/images/minus.gif';
- $alt = '&minus;';
+ $alt = '−';
}else{
$img = DOKU_BASE.'lib/images/plus.gif';
$alt = '+';
@@ -747,7 +747,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
//build code
$ret .= '<label for="pbox'.$label.'" title="'.$this->getLang('acl_perm'.$perm).'"'.$class.'>';
- $ret .= '<input '.buildAttributes($atts).' />&nbsp;';
+ $ret .= '<input '.buildAttributes($atts).' />&#160;';
$ret .= $this->getLang('acl_perm'.$perm);
$ret .= '</label>'.NL;
}
@@ -783,7 +783,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
echo ' <option value="__g__" class="aclgroup"'.$gsel.'>'.$this->getLang('acl_group').':</option>'.NL;
echo ' <option value="__u__" class="acluser"'.$usel.'>'.$this->getLang('acl_user').':</option>'.NL;
if (!empty($this->specials)) {
- echo ' <optgroup label="&nbsp;">'.NL;
+ echo ' <optgroup label="&#160;">'.NL;
foreach($this->specials as $ug){
if($ug == $this->who){
$sel = ' selected="selected"';
@@ -801,7 +801,7 @@ class admin_plugin_acl extends DokuWiki_Admin_Plugin {
echo ' </optgroup>'.NL;
}
if (!empty($this->usersgroups)) {
- echo ' <optgroup label="&nbsp;">'.NL;
+ echo ' <optgroup label="&#160;">'.NL;
foreach($this->usersgroups as $ug){
if($ug == $this->who){
$sel = ' selected="selected"';
diff --git a/lib/plugins/acl/lang/bg/lang.php b/lib/plugins/acl/lang/bg/lang.php
index e260be918..95201750e 100644
--- a/lib/plugins/acl/lang/bg/lang.php
+++ b/lib/plugins/acl/lang/bg/lang.php
@@ -20,9 +20,9 @@ $lang['p_group_id'] = 'Членовете на групата <b clas
$lang['p_group_ns'] = 'Членовете на групата <b class="aclgroup">%s</b> в момента имат следните права за именното пространство <b class="aclns">%s</b>: <i>%s</i>.';
$lang['p_choose_id'] = 'Моля, <b>въведете потребител или група</b> в полето отгоре, за да видите или промените правата за страницата <b class="aclpage">%s</b>.';
$lang['p_choose_ns'] = 'Моля, <b>въведете потребител или група</b> в полето отгоре, за да видите или промените правата за именното пространство <b class="aclns">%s</b>.';
-$lang['p_inherited'] = 'Бележка: Тези разрешения не са зададени директно, а са наследени от други групи или именни пространства.';
+$lang['p_inherited'] = 'Бележка: Тези права не са зададени директно, а са наследени от други групи или именни пространства.';
$lang['p_isadmin'] = 'Бележка: Избраната група или потребител има всички права, защото е определен за супер потребител.';
-$lang['p_include'] = 'Висши права включват по-нисшите такива. Правата за създаване, качване и изтриване са приложими само за именни пространства, но не за страници.';
+$lang['p_include'] = 'Висшите права включват по-нисши такива. Правата за създаване, качване и изтриване са приложими само за именни пространства, но не за страници.';
$lang['current'] = 'Текущи ACL права';
$lang['where'] = 'Страница/Именно пространство';
$lang['who'] = 'Потребител/Група';
@@ -34,4 +34,4 @@ $lang['acl_perm4'] = 'Създаване';
$lang['acl_perm8'] = 'Качване';
$lang['acl_perm16'] = 'Изтриване';
$lang['acl_new'] = 'Добавяне на право';
-$lang['acl_mod'] = 'Промяна на записа';
+$lang['acl_mod'] = 'Промяна на правата';
diff --git a/lib/plugins/acl/lang/da/lang.php b/lib/plugins/acl/lang/da/lang.php
index f82098dee..4a9d11448 100644
--- a/lib/plugins/acl/lang/da/lang.php
+++ b/lib/plugins/acl/lang/da/lang.php
@@ -13,6 +13,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['admin_acl'] = 'Rettighedsadministration';
$lang['acl_group'] = 'Gruppe';
diff --git a/lib/plugins/acl/lang/de-informal/lang.php b/lib/plugins/acl/lang/de-informal/lang.php
index 3f4b08c2a..05f7df037 100644
--- a/lib/plugins/acl/lang/de-informal/lang.php
+++ b/lib/plugins/acl/lang/de-informal/lang.php
@@ -5,11 +5,11 @@
* @author Alexander Fischer <tbanus@os-forge.net>
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
- * @author Matthias Schulte <post@lupo49.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
* @author Christian Wichmann <nospam@zone0.de>
* @author Pierre Corell <info@joomla-praxis.de>
*/
-$lang['admin_acl'] = 'Zugriffskontrollsystem Management';
+$lang['admin_acl'] = 'Zugangsverwaltung';
$lang['acl_group'] = 'Gruppe';
$lang['acl_user'] = 'Benutzer';
$lang['acl_perms'] = 'Rechte für';
diff --git a/lib/plugins/acl/lang/fa/lang.php b/lib/plugins/acl/lang/fa/lang.php
index ed576c271..8b7d72f51 100644
--- a/lib/plugins/acl/lang/fa/lang.php
+++ b/lib/plugins/acl/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['admin_acl'] = 'مدیریت کنترل دسترسی‌ها';
$lang['acl_group'] = 'گروه';
diff --git a/lib/plugins/acl/lang/it/lang.php b/lib/plugins/acl/lang/it/lang.php
index f789b979f..a55a2c0f3 100644
--- a/lib/plugins/acl/lang/it/lang.php
+++ b/lib/plugins/acl/lang/it/lang.php
@@ -13,6 +13,7 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
*/
$lang['admin_acl'] = 'Gestione Lista Controllo Accessi (ACL)';
$lang['acl_group'] = 'Gruppo';
diff --git a/lib/plugins/acl/lang/ko/help.txt b/lib/plugins/acl/lang/ko/help.txt
index 516198ee5..377636682 100644
--- a/lib/plugins/acl/lang/ko/help.txt
+++ b/lib/plugins/acl/lang/ko/help.txt
@@ -1,11 +1,11 @@
=== 도움말: ===
-현재 페이지에서 위키 네임스페이스와 페이지에 대한 접근 권한을 추가하거나 삭제할 수 있습니다.
+현재 문서에서 위키 이름공간과 문서에 대한 접근 권한을 추가하거나 삭제할 수 있습니다.
-왼쪽 영역을 선택가능한 네임스페이스들과 페이지 목록을 보여줍니다.
+왼쪽 영역에는 선택 가능한 이름공간과 문서 목록을 보여줍니다.
-위쪽 입력 양식에서 선택된 사용자와 그룹의 접근 권한을 보거나 변경할 수 있습니다.
+위쪽 입력 양식에서 선택된 사용자와 그룹의 접근 권한을 보거나 바꿀 수 있습니다.
-아래 테이블에서 현재 설정된 모든 접근 제어 규칙들을 볼 수 있으며, 즉시 여러 규칙들을 삭제하거나 변경할 수 있습니다.
+아래 테이블에서 현재 설정된 모든 접근 제어 규칙을 볼 수 있으며, 즉시 여러 규칙을 삭제하거나 바꿀 수 있습니다.
-DokuWiki에서 접근 제어가 어떻게 동작되는지 알려면 [[doku>acl|official documentation on ACL]] 읽기 바랍니다. \ No newline at end of file
+DokuWiki에서 접근 제어가 어떻게 동작되는지 알아보려면 [[doku>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
index 6b1e77cf8..c8e1ce5cc 100644
--- a/lib/plugins/acl/lang/ko/lang.php
+++ b/lib/plugins/acl/lang/ko/lang.php
@@ -12,32 +12,33 @@
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
* @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['admin_acl'] = '접근 제어 목록 관리';
$lang['acl_group'] = '그룹';
$lang['acl_user'] = '사용자';
$lang['acl_perms'] = '권한';
-$lang['page'] = '페이지';
-$lang['namespace'] = '네임스페이스';
+$lang['page'] = '문서';
+$lang['namespace'] = '이름공간';
$lang['btn_select'] = '선택';
-$lang['p_user_id'] = '사용자 <b class="acluser">%s</b>는 현재 <b class="aclpage">%s</b>: <i>%s</i> 페이지 접근이 가능합니다.';
-$lang['p_user_ns'] = '사용자 <b class="acluser">%s</b>는 현재 <b class="aclns">%s</b>: <i>%s</i> 네임스페이스 접근이 가능합니다.';
-$lang['p_group_id'] = '그룹 <b class="aclgroup">%s</b> 사용자는 현재 <b class="aclpage">%s</b>: <i>%s</i> 페이지 접근이 가능합니다.';
-$lang['p_group_ns'] = '그룹 <b class="aclgroup">%s</b> 사용자는 현재 <b class="aclns">%s</b>: <i>%s</i> 네임스페이스 접근이 가능합니다.';
-$lang['p_choose_id'] = '<b class="aclpage">%s</b> 페이지 접근 권한을 보거나 변경하려면 <b>사용자</b>나 <b>그룹</b>을 위 양식에 입력하기 바랍니다.';
-$lang['p_choose_ns'] = '<b class="aclns">%s</b> 네임스페이스 접근 권한을 보거나 변경하려면 <b>사용자</b>나 <b>그룹</b>을 위 양식에 입력하기 바랍니다.';
-$lang['p_inherited'] = '주의: 권한이 명시적으로 설정되지 않았으므로 다른 그룹들이나 상위 네임스페이스로 부터 가져왔습니다.';
-$lang['p_isadmin'] = '주의: 슈퍼유저로 설정되어 있으므로 선택된 그룹이나 사용자는 언제나 모든 접근 권한을 가집니다.';
-$lang['p_include'] = '더 높은 접근권한은 하위를 포함합니다. 페이지가 아닌 네임스페이스에는 생성, 업로드, 삭제 권한만 적용됩니다.';
-$lang['current'] = '현 ACL 규칙';
-$lang['where'] = '페이지/네임스페이스';
+$lang['p_user_id'] = '<b class="acluser">%s</b> 사용자는 현재 <b class="aclpage">%s</b>: <i>%s</i> 문서 접근이 가능합니다.';
+$lang['p_user_ns'] = '<b class="acluser">%s</b> 사용자는 현재 <b class="aclns">%s</b>: <i>%s</i> 이름공간 접근이 가능합니다.';
+$lang['p_group_id'] = '<b class="aclgroup">%s</b> 그룹 구성원은 현재 <b class="aclpage">%s</b>: <i>%s</i> 문서 접근이 가능합니다.';
+$lang['p_group_ns'] = '<b class="aclgroup">%s</b> 그룹 구성원은 현재 <b class="aclns">%s</b>: <i>%s</i> 이름공간 접근이 가능합니다.';
+$lang['p_choose_id'] = '<b class="aclpage">%s</b> 문서 접근 권한을 보거나 바꾸려면 <b>사용자</b>나 <b>그룹</b>을 위 양식에 입력하기 바랍니다.';
+$lang['p_choose_ns'] = '<b class="aclns">%s</b> 이름공간 접근 권한을 보거나 바꾸려면 <b>사용자</b>나 <b>그룹</b>을 위 양식에 입력하기 바랍니다.';
+$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_perm2'] = '편집';
+$lang['acl_perm4'] = '만들기';
+$lang['acl_perm8'] = '올리기';
$lang['acl_perm16'] = '삭제';
$lang['acl_new'] = '새 항목 추가';
$lang['acl_mod'] = '선택 항목 변경';
diff --git a/lib/plugins/acl/lang/pl/lang.php b/lib/plugins/acl/lang/pl/lang.php
index 1b10b5232..bef2d2615 100644
--- a/lib/plugins/acl/lang/pl/lang.php
+++ b/lib/plugins/acl/lang/pl/lang.php
@@ -13,6 +13,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['admin_acl'] = 'Zarządzanie uprawnieniami';
$lang['acl_group'] = 'Grupa';
diff --git a/lib/plugins/acl/lang/vi/help.txt b/lib/plugins/acl/lang/vi/help.txt
new file mode 100644
index 000000000..23e258678
--- /dev/null
+++ b/lib/plugins/acl/lang/vi/help.txt
@@ -0,0 +1,12 @@
+=== Trợ giúp nhanh: ===
+
+Trang này giúp bạn thêm hoặc xóa quyền được cấp cho 1 thư mục hoặc trang wiki của bạn.
+
+Của sổ bên trái hiển thị tất cả các thư mục và trang văn bản.
+
+Khung trên đây cho phép bạn xem và sửa quyền của một nhóm hoặc thành viên đã chọn.
+
+Bảng bên dưới hiển thị tất cả các quyền được cấp. Bạn có thể sửa hoặc hóa các quyền đó một cách nhanh chóng.
+
+Đọc [[doku>acl|tài liệu chính thức về ACL]] sẽ giúp bạn hiểu hơn về cách phân quyền ở DokuWiki.
+
diff --git a/lib/plugins/acl/lang/vi/lang.php b/lib/plugins/acl/lang/vi/lang.php
index 6237f79ba..ddf764dca 100644
--- a/lib/plugins/acl/lang/vi/lang.php
+++ b/lib/plugins/acl/lang/vi/lang.php
@@ -3,19 +3,42 @@
* vietnamese language file
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
- * @author James Do <jdo@myrealbox.com>
+ * @author NukeViet <admin@nukeviet.vn>
*/
-$lang['admin_acl'] = 'Quản lý phép truy nhật {Access Control List}';
+$lang['admin_acl'] = 'Quản lý danh sách quyền truy cập';
$lang['acl_group'] = 'Nhóm';
-$lang['acl_user'] = 'Người';
-$lang['acl_perms'] = 'Phép truy nhập cho';
+$lang['acl_user'] = 'Thành viên';
+$lang['acl_perms'] = 'Cấp phép cho';
$lang['page'] = 'Trang';
-$lang['namespace'] = 'Không gian tên';
+$lang['namespace'] = 'Thư mục';
+$lang['btn_select'] = 'Chọn';
+
+$lang['p_user_id'] = 'Thành viên <b class="acluser">%s</b> hiện tại được cấp phép cho trang <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_user_ns'] = 'Thành viên <b class="acluser">%s</b> hiện tại được cấp phép cho thư mục <b class="aclns">%s</b>: <i>%s</i>.';
+$lang['p_group_id'] = 'Thành viên trong nhóm <b class="aclgroup">%s</b> hiện tại được cấp phép cho trang <b class="aclpage">%s</b>: <i>%s</i>.';
+$lang['p_group_ns'] = 'Thành viên trong nhóm <b class="aclgroup">%s</b> hiện tại được cấp phép cho thư mục <b class="aclns">%s</b>: <i>%s</i>.';
+
+$lang['p_choose_id'] = 'Hãy <b>nhập tên thành viên hoặc nhóm</b> vào ô trên đây để xem hoặc sửa quyền đã thiết đặt cho trang <b class="aclpage">%s</b>.';
+$lang['p_choose_ns'] = 'Hãy <b>nhập tên thành viên hoặc nhóm</b> vào ô trên đây để xem hoặc sửa quyền đã thiết đặt cho thư mục <b class="aclns">%s</b>.';
+
+
+$lang['p_inherited'] = 'Ghi chú: Có những quyền không được thể hiện ở đây nhưng nó được cấp phép từ những nhóm hoặc thư mục cấp cao.';
+$lang['p_isadmin'] = 'Ghi chú: Nhóm hoặc thành viên này luôn được cấp đủ quyền vì họ là Quản trị tối cao';
+$lang['p_include'] = 'Một số quyền thấp được thể hiện ở mức cao hơn. Quyền tạo, tải lên và xóa chỉ dành cho thư mục, không dành cho trang.';
+
+$lang['current'] = 'Danh sách quyền truy cập hiện tại';
+$lang['where'] = 'Trang/Thư mục';
+$lang['who'] = 'Thành viên/Nhóm';
+$lang['perm'] = 'Quyền';
+
+$lang['acl_perm0'] = 'Không';
$lang['acl_perm1'] = 'Đọc';
-$lang['acl_perm2'] = 'Biên soạn';
+$lang['acl_perm2'] = 'Sửa';
$lang['acl_perm4'] = 'Tạo';
$lang['acl_perm8'] = 'Tải lên';
+$lang['acl_perm16'] = 'Xóa';
$lang['acl_new'] = 'Thêm mục mới';
+$lang['acl_mod'] = 'Sửa';
//Setup VIM: ex: et ts=2 :
diff --git a/lib/plugins/config/admin.php b/lib/plugins/config/admin.php
index 9a9bb5329..c5f7ee532 100644
--- a/lib/plugins/config/admin.php
+++ b/lib/plugins/config/admin.php
@@ -118,6 +118,7 @@ class admin_plugin_config extends DokuWiki_Admin_Plugin {
// config setting group
if ($in_fieldset) {
ptln(' </table>');
+ ptln(' </div>');
ptln(' </fieldset>');
} else {
$in_fieldset = true;
diff --git a/lib/plugins/config/lang/bg/lang.php b/lib/plugins/config/lang/bg/lang.php
index 0bc25a8e5..43c961bfc 100644
--- a/lib/plugins/config/lang/bg/lang.php
+++ b/lib/plugins/config/lang/bg/lang.php
@@ -10,41 +10,44 @@
// 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'] = 'Настройки';
+$lang['menu'] = 'Настройки';
-$lang['error'] = 'Обновяването на настройките не е възможно, поради невалидна стойност, моля, прегледайте промените си и пробвайте отново.
+$lang['error'] = 'Обновяването на настройките не е възможно, поради невалидна стойност, моля, прегледайте промените си и пробвайте отново.
<br />Неверните стойности ще бъдат обградени с червена рамка.';
-$lang['updated'] = 'Обновяването на настройките е успешно.';
-$lang['nochoice'] = '(няма друг възможен избор)';
-$lang['locked'] = 'Обновяването на файла с настройките не е възможно, ако това не е нарочно, проверете,<br />
+$lang['updated'] = 'Обновяването на настройките е успешно.';
+$lang['nochoice'] = '(няма друг възможен избор)';
+$lang['locked'] = 'Обновяването на файла с настройките не е възможно, ако това не е нарочно, проверете,<br />
дали името на локалния файл с настройки и правата са верни.';
-$lang['danger'] = 'Внимание: промяна на опцията може да направи Wiki-то и менюто за настройване недостъпни.';
-$lang['warning'] = 'Предупреждение: промяна на опцията може предизвика нежелани последици.';
-$lang['security'] = 'Предупреждение: промяна на опцията може да представлява риск за сигурността.';
+
+$lang['danger'] = 'Внимание: промяна на опцията може да направи Wiki-то и менюто за настройване недостъпни.';
+$lang['warning'] = 'Предупреждение: промяна на опцията може предизвика нежелани последици.';
+$lang['security'] = 'Предупреждение: промяна на опцията може да представлява риск за сигурността.';
/* --- Config Setting Headers --- */
$lang['_configuration_manager'] = 'Диспечер на настройките'; //same as heading in intro.txt
-$lang['_header_dokuwiki'] = 'Настройки на DokuWiki';
-$lang['_header_plugin'] = 'Настройки на приставки';
-$lang['_header_template'] = 'Настройки на шаблони';
+$lang['_header_dokuwiki'] = 'Настройки на DokuWiki';
+$lang['_header_plugin'] = 'Настройки на приставки';
+$lang['_header_template'] = 'Настройки на шаблона';
+$lang['_header_undefined'] = 'Неопределени настройки';
/* --- Config Setting Groups --- */
-$lang['_header_undefined'] = 'Неопределени настройки';
-$lang['_basic'] = 'Основни настройки';
-$lang['_display'] = 'Настройки за изобразяване';
-$lang['_authentication'] = 'Настройки за удостоверяване';
-$lang['_anti_spam'] = 'Настройки за борба със SPAM-ма';
-$lang['_editing'] = 'Настройки за редактиране';
-$lang['_links'] = 'Настройки на препратките';
-$lang['_media'] = 'Настройки на медията';
-$lang['_advanced'] = 'Допълнителни настройки';
-$lang['_network'] = 'Мрежови настройки';
+$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'] = 'Мрежови настройки';
// The settings group name for plugins and templates can be set with
// plugin_settings_name and template_settings_name respectively. If one
// of these lang properties is not set, the group name will be generated
// from the plugin or template name and the localized suffix.
-$lang['_plugin_sufix'] = ' - настройки на приставката';
-$lang['_template_sufix'] = ' - настройки на шаблона';
+$lang['_plugin_sufix'] = ' (приставка)';
+$lang['_template_sufix'] = ' (шаблон)';
/* --- Undefined Setting Messages --- */
$lang['_msg_setting_undefined'] = 'Няма метаданни за настройките.';
@@ -53,167 +56,183 @@ $lang['_msg_setting_no_default'] = 'Няма стандартна стойнос
/* -------------------- Config Options --------------------------- */
-$lang['fmode'] = 'Режим (права) за създаване на файлове';
-$lang['dmode'] = 'Режим (права) за създаване на директории';
-$lang['lang'] = 'Език';
-$lang['basedir'] = 'Главна директория (напр. <code>/dokuwiki/</code>). Оставете празно, за да бъде засечена автоматично.';
-$lang['baseurl'] = 'URL адрес (напр. <code>http://www.yourserver.com</code>). Оставете празно, за да бъде засечен автоматично.';
-$lang['savedir'] = 'Директория за записване на данните';
-$lang['cookiedir'] = 'Път за бисквитките. Оставите ли полето празно ще се ползва горния URL адрес.';
-$lang['start'] = 'Име на началната страница';
-$lang['title'] = 'Име на Wiki-то';
-$lang['template'] = 'Шаблон';
-$lang['tagline'] = 'Подзаглавие - изобразява се под името на Wiki страницата (ако се поддържа от шаблона)';
-$lang['sidebar'] = 'Име на страницата за страничната лента (ако се поддържа от шаблона). Ако оставите полето празно лентата ще бъде изключена';
-$lang['license'] = 'Под какъв лиценз да бъде публикувано съдържанието?';
-$lang['fullpath'] = 'Показване на пълния път до страниците в долния колонтитул.';
-$lang['recent'] = 'Скорошни промени';
-$lang['breadcrumbs'] = 'Брой на следите';
-$lang['youarehere'] = 'Йерархични следи';
-$lang['typography'] = 'Замяна на последователност от символи с типографски еквивалент';
-$lang['htmlok'] = 'Разрешаване вграждането на HTML код';
-$lang['phpok'] = 'Разрешаване вграждането на PHP код';
-$lang['dformat'] = 'Формат на датата (виж. <a href="http://www.php.net/strftime">strftime</a> функцията на PHP)';
-$lang['signature'] = 'Подпис';
-$lang['toptoclevel'] = 'Главно ниво (заглавие) за съдържанието';
-$lang['tocminheads'] = 'Минимален брой заглавия, определящ дали да бъде създадено съдържание';
-$lang['maxtoclevel'] = 'Максимален брой нива (заглавия) за включване в съдържанието';
-$lang['maxseclevel'] = 'Максимален брой нива предоставяни за самостоятелно редактиране';
-$lang['camelcase'] = 'Ползване на CamelCase за линкове';
-$lang['deaccent'] = 'Почистване имената на страниците (на файловете)';
-$lang['useheading'] = 'Ползване на първото заглавие за име на страница';
-$lang['refcheck'] = 'Проверка за препратка към медия, преди да бъде изтрита';
-$lang['refshow'] = 'Брой на показваните медийни препратки';
-$lang['allowdebug'] = 'Включване на режи debug - <b>изключете, ако не е нужен!</b>';
-$lang['mediarevisions'] = 'Да се пазят ли стари версии на качените файлове (Mediarevisions)?';
-
-$lang['usewordblock'] = 'Блокиране на SPAM въз основа на на списък от думи';
-$lang['indexdelay'] = 'Забавяне преди индексиране (сек)';
-$lang['relnofollow'] = 'Ползване на rel="nofollow" за външни препратки';
-$lang['mailguard'] = 'Промяна на адресите на ел. поща (във форма непозволяваща пращането на SPAM)';
-$lang['iexssprotect'] = 'Проверяване на качените файлове за вероятен зловреден JavaScript и HTML код';
-$lang['showuseras'] = 'Какво да се показва за потребителя, който последно е променил страницата';
-
-/* Authentication Options */
-$lang['useacl'] = 'Ползване на списъци за достъп';
-$lang['autopasswd'] = 'Автоматично генериране на пароли, на нови потребители и пращане по пощата';
-$lang['authtype'] = 'Метод за удостоверяване';
-$lang['passcrypt'] = 'Метод за криптиране на паролите';
-$lang['defaultgroup'] = 'Стандартна група';
-$lang['superuser'] = 'Супер потребител - група, потребител или списък със стойности разделени чрез запетая (user1,@group1,user2) с пълен достъп до всички страници и функции без значение от настройките на списъците за достъп (ACL)';
-$lang['manager'] = 'Управител - група, потребител или списък със стойности разделени чрез запетая (user1,@group1,user2) с достъп до определени управленски функции ';
-$lang['profileconfirm'] = 'Потвърждаване на промени в профила с парола';
-$lang['disableactions'] = 'Изключване функции на DokuWiki';
-$lang['disableactions_check'] = 'Проверка';
+/* Basic Settings */
+$lang['title'] = 'Заглавие за Wiki-то, тоест името';
+$lang['start'] = 'Име на началната страница';
+$lang['lang'] = 'Език на интерфейса';
+$lang['template'] = 'Шаблон (определя вида на страниците)';
+$lang['tagline'] = 'Подзаглавие - изобразява се под името на Wiki-то (ако се поддържа от шаблона)';
+$lang['sidebar'] = 'Име на страницата за страничната лента (ако се поддържа от шаблона). Оставите ли полето празно лентата ще бъде изключена';
+$lang['license'] = 'Под какъв лиценз да бъде публикувано съдържанието?';
+$lang['savedir'] = 'Директория за записване на данните';
+$lang['basedir'] = 'Главна директория (напр. <code>/dokuwiki/</code>). Оставете празно, за да бъде засечена автоматично.';
+$lang['baseurl'] = 'URL адрес (напр. <code>http://www.yourserver.com</code>). Оставете празно, за да бъде засечен автоматично.';
+$lang['cookiedir'] = 'Път за бисквитките. Оставите ли полето празно ще се ползва горния URL адрес.';
+$lang['dmode'] = 'Режим (права) за създаване на директории';
+$lang['fmode'] = 'Режим (права) за създаване на файлове';
+$lang['allowdebug'] = 'Включване на режи debug - <b>изключете, ако не е нужен!</b>';
+
+/* Display Settings */
+$lang['recent'] = 'Скорошни промени - брой еленти на страница';
+$lang['recent_days'] = 'Колко от скорошните промени да се пазят (дни)';
+$lang['breadcrumbs'] = 'Брой на следите. За изключване на функцията задайте 0.';
+$lang['youarehere'] = 'Йерархични следи (в този случай можете да изключите горната опция)';
+$lang['fullpath'] = 'Показване на пълния път до страниците в долния колонтитул.';
+$lang['typography'] = 'Замяна на последователност от символи с типографски еквивалент';
+$lang['dformat'] = 'Формат на датата (виж. <a href="http://www.php.net/strftime">strftime</a> функцията на 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)';
+
+/* Authentication Settings */
+$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['sneaky_index'] = 'Стандартно DokuWiki ще показва всички именни пространства в индекса. Опцията скрива тези, за които потребителят няма права за четене. Това може да доведе и до скриване на иначе достъпни подименни пространства. С определени настройки на списъците за контрол на достъпа (ACL) може да направи индекса неизползваем. ';
+$lang['disableactions_other'] = 'Други действия (разделени със запетая)';
$lang['auth_security_timeout'] = 'Автоматично проверяване на удостоверяването всеки (сек)';
-$lang['securecookie'] = 'Да се изпращат ли бисквитките зададени чрез HTTPS, само чрез HTTPS от браузъра? Изключете опцията, когато SSL се ползва само за вписване, а четенето е без SSL.';
-$lang['remote'] = 'Включване на системата за отдалечен API достъп. Това ще позволи на приложения да се свързват с DokuWiki чрез XML-RPC или друг механизъм.';
-$lang['remoteuser'] = 'Ограничаване на отдалечения API достъп - активиране само за следните групи и потребители (отделени със запетая). Ако оставите полето празно всеки ще има достъп достъп.';
+$lang['securecookie'] = 'Да се изпращат ли бисквитките зададени чрез HTTPS, само чрез HTTPS от браузъра? Изключете опцията, когато SSL се ползва само за вписване, а четенето е без SSL.';
+$lang['remote'] = 'Включване на системата за отдалечен API достъп. Това ще позволи на приложения да се свързват с DokuWiki чрез XML-RPC или друг механизъм.';
+$lang['remoteuser'] = 'Ограничаване на отдалечения API достъп - активиране само за следните групи и потребители (отделени със запетая). Ако оставите полето празно всеки ще има достъп достъп.';
+
+/* Anti-Spam Settings */
+$lang['usewordblock'] = 'Блокиране на SPAM въз основа на на списък от думи';
+$lang['relnofollow'] = 'Ползване на rel="nofollow" за външни препратки';
+$lang['indexdelay'] = 'Забавяне преди индексиране (сек)';
+$lang['mailguard'] = 'Промяна на адресите на ел. поща (във форма непозволяваща пращането на SPAM)';
+$lang['iexssprotect'] = 'Проверяване на качените файлове за вероятен зловреден JavaScript и HTML код';
+
+/* Editing Settings */
+$lang['usedraft'] = 'Автоматично запазване на чернова по време на редактиране';
+$lang['htmlok'] = 'Разрешаване вграждането на HTML код';
+$lang['phpok'] = 'Разрешаване вграждането на PHP код';
+$lang['locktime'] = 'Макс. период за съхраняване на заключените файлове (сек)';
+$lang['cachetime'] = 'Макс. период за съхраняване на кеша (сек)';
+
+/* Link settings */
+$lang['target____wiki'] = 'Прозорец за вътрешни препратки';
+$lang['target____interwiki'] = 'Прозорец за препратки към други Wiki сайтове';
+$lang['target____extern'] = 'Прозорец за външни препратки';
+$lang['target____media'] = 'Прозорец за медийни препратки';
+$lang['target____windows'] = 'Прозорец за препратки към Windows';
+
+/* Media Settings */
+$lang['mediarevisions'] = 'Да се пазят ли стари версии на качените файлове (Mediarevisions)?';
+$lang['refcheck'] = 'Проверка за препратка към медия, преди да бъде изтрита';
+$lang['refshow'] = 'Брой на показваните медийни препратки';
+$lang['gdlib'] = 'Версия на GD Lib';
+$lang['im_convert'] = 'Път до инструмента за трансформация на ImageMagick';
+$lang['jpg_quality'] = 'Качество на JPG компресията (0-100)';
+$lang['fetchsize'] = 'Максимален размер (байтове), който fetch.php може да сваля';
+
+/* Notification Settings */
+$lang['subscribers'] = 'Включване на поддръжката за абониране към страници';
+$lang['subscribe_time'] = 'Време след което абонаментните списъци и обобщения се изпращат (сек); Трябва да е по-малко от времето определено в recent_days.';
+$lang['notify'] = 'Пращане на съобщения за промени по страниците на следната eл. поща';
+$lang['registernotify'] = 'Пращане на информация за нови потребители на следната ел. поща';
+$lang['mailfrom'] = 'Ел. поща, която да се ползва за автоматично изпращане на ел. писма';
+$lang['mailprefix'] = 'Представка за темите (поле subject) на автоматично изпращаните ел. писма';
+$lang['htmlmail'] = 'Изпращане на по-добре изглеждащи, но по-големи по-размер HTML ел. писма. Изключете ако желаете писмата да се изпращат като чист текст.';
+
+/* Syndication Settings */
+$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 мисията?';
/* Advanced Options */
-$lang['updatecheck'] = 'Проверяване за за нови версии и предупреждения за сигурността? Необходимо е Dokiwiki да може да се свързва със update.dokuwiki.org за тази функционалност.';
-$lang['userewrite'] = 'Ползване на nice URL адреси';
-$lang['useslash'] = 'Ползване на наклонена черта за разделител на именните пространства в URL';
-$lang['usedraft'] = 'Автоматично запазване на чернова по време на редактиране';
-$lang['sepchar'] = 'Разделител между думите в имената на страници';
-$lang['canonical'] = 'Ползване на напълно уеднаквени URL адреси (абсолютни адреси - http://server/path)';
-$lang['fnencode'] = 'Метод за кодиране на не-ASCII именуваните файлове.';
-$lang['autoplural'] = 'Проверяване за множествено число в препратките';
-$lang['compression'] = 'Метод за компресия на attic файлове';
-$lang['cachetime'] = 'Макс. период за съхраняване на кеша (сек)';
-$lang['locktime'] = 'Макс. период за съхраняване на заключените файлове (сек)';
-$lang['fetchsize'] = 'Максимален размер (байтове), който fetch.php може да сваля';
-$lang['notify'] = 'Пращане на съобщения за промени по страниците на следната eл. поща';
-$lang['registernotify'] = 'Пращане на информация за нови потребители на следната ел. поща';
-$lang['mailfrom'] = 'Ел. поща, която да се ползва за автоматично изпращане на ел. писма';
-$lang['mailprefix'] = 'Представка за темите (поле subject) на автоматично изпращаните ел. писма';
-$lang['gzip_output'] = 'Кодиране на съдържанието с gzip за xhtml';
-$lang['gdlib'] = 'Версия на GD Lib';
-$lang['im_convert'] = 'Път до инструмента за трансформация на ImageMagick';
-$lang['jpg_quality'] = 'Качество на JPG компресията (0-100)';
-$lang['subscribers'] = 'Включване на поддръжката за абониране към страници';
-$lang['subscribe_time'] = 'Време след което абонаментните списъци и обобщения се изпращат (сек); Трябва да е по-малко от времето определено в recent_days.';
-$lang['compress'] = 'Компактен CSS и javascript изглед';
-$lang['cssdatauri'] = 'Максимален размер, в байтове, до който изображенията посочени в .CSS файл ще бъдат вграждани в стила (stylesheet), за да се намали броя на HTTP заявките. Техниката не работи за версиите на IE преди 8! Препоръчителни стойности: <code>400</code> до <code>600</code> байта. Въведете <code>0</code> за изключване.';
-$lang['hidepages'] = 'Скриване на съвпадащите страници (regular expressions)';
-$lang['send404'] = 'Пращане на "HTTP 404/Page Not Found" за несъществуващи страници';
-$lang['sitemap'] = 'Генериране на Google sitemap (дни)';
-$lang['broken_iua'] = 'Отметнете, ако ignore_user_abort функцията не работи. Може да попречи на търсенето в страниците. Знае се, че комбинацията IIS+PHP/CGI е лоша. Вижте <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Грешка 852</a> за повече информация.';
-$lang['xsendfile'] = 'Ползване на Х-Sendfile header, за да може уебсървъра да дава статични файлове? Вашият уебсървър трябва да го поддържа.';
-$lang['renderer_xhtml'] = 'Представяне на основните изходни данни (xhtml) от Wiki-то с';
-$lang['renderer__core'] = '%s (ядрото на DokuWiki)';
-$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['rss_media'] = 'Кой тип промени да се включват в XML мисията?';
-
-/* Target options */
-$lang['target____wiki'] = 'Прозорец за вътрешни препратки';
-$lang['target____interwiki'] = 'Прозорец за препратки към други Wiki сайтове';
-$lang['target____extern'] = 'Прозорец за външни препратки';
-$lang['target____media'] = 'Прозорец за медийни препратки';
-$lang['target____windows'] = 'Прозорец за препратки към Windows';
+$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! Препоръчителни стойности: <code>400</code> до <code>600</code> байта. Въведете <code>0</code> за изключване.';
+$lang['send404'] = 'Пращане на "HTTP 404/Page Not Found" за несъществуващи страници';
+$lang['broken_iua'] = 'Отметнете, ако ignore_user_abort функцията не работи. Може да попречи на търсенето в страниците. Знае се, че комбинацията IIS+PHP/CGI е лоша. Вижте <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Грешка 852</a> за повече информация.';
+$lang['xsendfile'] = 'Ползване на Х-Sendfile header, за да може уебсървъра да дава статични файлове? Вашият уебсървър трябва да го поддържа.';
+$lang['renderer_xhtml'] = 'Представяне на основните изходни данни (xhtml) от Wiki-то с';
+$lang['renderer__core'] = '%s (ядрото на DokuWiki)';
+$lang['renderer__plugin'] = '%s (приставка)';
+
+/* Network Options */
+$lang['dnslookups'] = 'DokuWiki ще търси имената на хостовете, на отдалечени IP адреси, от които потребители редактират страници. НЕ е желателно да ползвате опцията ако имате бавен или неработещ DNS сървър.';
/* Proxy Options */
-$lang['proxy____host'] = 'Име на прокси сървър';
-$lang['proxy____port'] = 'Порт за проксито';
-$lang['proxy____user'] = 'Потребител за проксито';
-$lang['proxy____pass'] = 'Парола за проксито';
-$lang['proxy____ssl'] = 'Ползване на SSL при свързване с проксито';
-$lang['proxy____except'] = 'Регулярен израз определящ за кои URL адреси да не се ползва прокси сървър.';
+$lang['proxy____host'] = 'Име на прокси сървър';
+$lang['proxy____port'] = 'Порт за проксито';
+$lang['proxy____user'] = 'Потребител за проксито';
+$lang['proxy____pass'] = 'Парола за проксито';
+$lang['proxy____ssl'] = 'Ползване на SSL при свързване с проксито';
+$lang['proxy____except'] = 'Регулярен израз определящ за кои URL адреси да не се ползва прокси сървър.';
/* Safemode Hack */
-$lang['safemodehack'] = 'Ползване на хака safemode';
-$lang['ftp____host'] = 'FTP сървър за хака safemode';
-$lang['ftp____port'] = 'FTP порт за хака safemode';
-$lang['ftp____user'] = 'FTP потребител за хака safemode';
-$lang['ftp____pass'] = 'FTP парола за хака safemode';
-$lang['ftp____root'] = 'FTP главна директория за хака safemode';
+$lang['safemodehack'] = 'Ползване на хака safemode';
+$lang['ftp____host'] = 'FTP сървър за хака safemode';
+$lang['ftp____port'] = 'FTP порт за хака safemode';
+$lang['ftp____user'] = 'FTP потребител за хака safemode';
+$lang['ftp____pass'] = 'FTP парола за хака safemode';
+$lang['ftp____root'] = 'FTP главна директория за хака safemode';
-$lang['license_o_'] = 'Нищо не е избрано';
+/* License Options */
+$lang['license_o_'] = 'Нищо не е избрано';
/* typography options */
-$lang['typography_o_0'] = 'без';
-$lang['typography_o_1'] = 'с изключение на единични кавички';
-$lang['typography_o_2'] = 'включително единични кавички (не винаги работи)';
+$lang['typography_o_0'] = 'без';
+$lang['typography_o_1'] = 'с изключение на единични кавички';
+$lang['typography_o_2'] = 'включително единични кавички (не винаги работи)';
/* userewrite options */
-$lang['userewrite_o_0'] = 'без';
-$lang['userewrite_o_1'] = 'файлът .htaccess';
-$lang['userewrite_o_2'] = 'вътрешно от DokuWiki ';
+$lang['userewrite_o_0'] = 'без';
+$lang['userewrite_o_1'] = 'файлът .htaccess';
+$lang['userewrite_o_2'] = 'вътрешно от DokuWiki ';
/* deaccent options */
-$lang['deaccent_o_0'] = 'изключено';
-$lang['deaccent_o_1'] = 'премахване на акценти';
-$lang['deaccent_o_2'] = 'транслитерация';
+$lang['deaccent_o_0'] = 'изключено';
+$lang['deaccent_o_1'] = 'премахване на акценти';
+$lang['deaccent_o_2'] = 'транслитерация';
/* gdlib options */
-$lang['gdlib_o_0'] = 'GD Lib не е достъпна';
-$lang['gdlib_o_1'] = 'Версия 1.x';
-$lang['gdlib_o_2'] = 'Автоматично разпознаване';
+$lang['gdlib_o_0'] = 'GD Lib не е достъпна';
+$lang['gdlib_o_1'] = 'Версия 1.x';
+$lang['gdlib_o_2'] = 'Автоматично разпознаване';
/* 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';
+$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'] = 'Извлечение';
-$lang['rss_content_o_diff'] = 'Обединени разлики';
+$lang['rss_content_o_diff'] = 'Обединени разлики';
$lang['rss_content_o_htmldiff'] = 'Таблица с разликите в HTML формат';
-$lang['rss_content_o_html'] = 'Цялото съдържание на HTML страницата';
+$lang['rss_content_o_html'] = 'Цялото съдържание на HTML страницата';
/* rss_linkto options */
$lang['rss_linkto_o_diff'] = 'изглед на разликите';
@@ -222,26 +241,26 @@ $lang['rss_linkto_o_rev'] = 'списък на версиите';
$lang['rss_linkto_o_current'] = 'текущата страница';
/* compression options */
-$lang['compression_o_0'] = 'без';
-$lang['compression_o_gz'] = 'gzip';
-$lang['compression_o_bz2'] = 'bz2';
+$lang['compression_o_0'] = 'без';
+$lang['compression_o_gz'] = 'gzip';
+$lang['compression_o_bz2'] = 'bz2';
/* xsendfile header */
-$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['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 за пренасочване';
/* Display user info */
-$lang['showuseras_o_loginname'] = 'Име за вписване';
-$lang['showuseras_o_username'] = 'Пълно потребителско име';
-$lang['showuseras_o_email'] = 'Ел, поща (променени според настройките на mailguard)';
+$lang['showuseras_o_loginname'] = 'Име за вписване';
+$lang['showuseras_o_username'] = 'Пълно потребителско име';
+$lang['showuseras_o_email'] = 'Ел, поща (променени според настройките на mailguard)';
$lang['showuseras_o_email_link'] = 'Ел. поща под формата на връзка тип mailto:';
/* useheading options */
-$lang['useheading_o_0'] = 'Никога';
+$lang['useheading_o_0'] = 'Никога';
$lang['useheading_o_navigation'] = 'Само за навигация';
-$lang['useheading_o_content'] = 'Само за съдържанието на Wiki-то';
-$lang['useheading_o_1'] = 'Винаги';
+$lang['useheading_o_content'] = 'Само за съдържанието на Wiki-то';
+$lang['useheading_o_1'] = 'Винаги';
-$lang['readdircache'] = 'Максимален период за съхраняване кеша на readdir (сек)';
+$lang['readdircache'] = 'Максимален период за съхраняване кеша на readdir (сек)';
diff --git a/lib/plugins/config/lang/da/lang.php b/lib/plugins/config/lang/da/lang.php
index 7e8fe95af..239a4986f 100644
--- a/lib/plugins/config/lang/da/lang.php
+++ b/lib/plugins/config/lang/da/lang.php
@@ -11,6 +11,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$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.
@@ -34,6 +35,7 @@ $lang['_anti_spam'] = 'Trafikkontrolsindstillinger';
$lang['_editing'] = 'Redigeringsindstillinger';
$lang['_links'] = 'Henvisningsindstillinger';
$lang['_media'] = 'Medieindstillinger';
+$lang['_notifications'] = 'Notificeringsindstillinger';
$lang['_advanced'] = 'Avancerede indstillinger';
$lang['_network'] = 'Netværksindstillinger';
$lang['_plugin_sufix'] = 'Udvidelsesindstillinger';
@@ -41,25 +43,29 @@ $lang['_template_sufix'] = 'Skabelonindstillinger';
$lang['_msg_setting_undefined'] = 'Ingen indstillingsmetadata.';
$lang['_msg_setting_no_class'] = 'Ingen indstillingsklasse.';
$lang['_msg_setting_no_default'] = 'Ingen standardværdi.';
-$lang['fmode'] = 'Filoprettelsestilstand';
-$lang['dmode'] = 'Katalogoprettelsestilstand';
-$lang['lang'] = 'Sprog';
-$lang['basedir'] = 'Grundkatalog';
-$lang['baseurl'] = 'Grundadresse';
-$lang['savedir'] = 'Katalog til opbevaring af data';
-$lang['start'] = 'Startsidens navn';
$lang['title'] = 'Wiki titel';
+$lang['start'] = 'Startsidens navn';
+$lang['lang'] = 'Sprog';
$lang['template'] = 'Skabelon';
+$lang['tagline'] = 'Tagline (hvis templaten understøtter det)';
+$lang['sidebar'] = 'Sidebar side navne (hvis templaten understøtter det).';
$lang['license'] = 'Under hvilken licens skal dit indhold frigives?';
-$lang['fullpath'] = 'Vis den fulde sti til siderne i bundlinjen';
+$lang['savedir'] = 'Katalog til opbevaring af data';
+$lang['basedir'] = 'Grundkatalog';
+$lang['baseurl'] = 'Grundadresse';
+$lang['cookiedir'] = 'Cookie sti. Hvis tom, bruges baseurl.';
+$lang['dmode'] = 'Katalogoprettelsestilstand';
+$lang['fmode'] = 'Filoprettelsestilstand';
+$lang['allowdebug'] = 'Tillad fejlretning <b>slå fra hvis unødvendig!</b>';
$lang['recent'] = 'Nylige ændringer';
+$lang['recent_days'] = 'Hvor mange nye ændringer der skal beholdes (dage)';
$lang['breadcrumbs'] = 'Stilængde';
$lang['youarehere'] = 'Hierarkisk sti';
+$lang['fullpath'] = 'Vis den fulde sti til siderne i bundlinjen';
$lang['typography'] = 'Typografiske erstatninger';
-$lang['htmlok'] = 'Tillad indlejret HTML';
-$lang['phpok'] = 'Tillad indlejret PHP';
$lang['dformat'] = 'Datoformat (se PHP\'s <a href="http://www.php.net/strftime">strftime</a>-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 Indholdsfortegnelsen';
$lang['maxtoclevel'] = 'Højeste niveau for indholdsfortegnelse';
@@ -67,15 +73,8 @@ $lang['maxseclevel'] = 'Højeste niveau for redigering af sektioner';
$lang['camelcase'] = 'Brug KamelKasse til henvisninger';
$lang['deaccent'] = 'Pæne sidenavne';
$lang['useheading'] = 'Brug første overskrift til sidenavne';
-$lang['refcheck'] = 'Mediehenvisningerkontrol';
-$lang['refshow'] = 'Antal viste mediehenvisninger';
-$lang['allowdebug'] = 'Tillad fejlretning <b>slå fra hvis unødvendig!</b>';
-$lang['usewordblock'] = 'Hindr uønsket brug med en ordliste';
-$lang['indexdelay'] = 'Tidsforsinkelse før katalogisering (sek.)';
-$lang['relnofollow'] = 'Brug rel="nofollow" til udadgående henvisninger';
-$lang['mailguard'] = 'Slør elektroniske adresser';
-$lang['iexssprotect'] = 'Gennemse oplagte filer for mulig skadelig JavaScript- eller HTML-kode.';
-$lang['showuseras'] = 'Hvad skal vises når den sidste bruger, der har ændret siden, fremstilles';
+$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';
$lang['autopasswd'] = 'Generer adgangskoder automatisk';
$lang['authtype'] = 'Bekræftelsesgrundlag';
@@ -84,56 +83,68 @@ $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 kodeord';
+$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_other'] = 'Andre muligheder (kommasepareret)';
-$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['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 APIet. 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'] = 'Hindr uønsket brug med en ordliste';
+$lang['relnofollow'] = 'Brug rel="nofollow" til udadgående henvisninger';
+$lang['indexdelay'] = 'Tidsforsinkelse før katalogisering (sek.)';
+$lang['mailguard'] = 'Slør elektroniske adresser';
+$lang['iexssprotect'] = 'Gennemse oplagte filer for mulig skadelig JavaScript- eller HTML-kode.';
+$lang['usedraft'] = 'Gem automatisk en kladde under redigering';
+$lang['htmlok'] = 'Tillad indlejret HTML';
+$lang['phpok'] = 'Tillad indlejret PHP';
+$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'] = 'Akvtivér media udgaver?';
+$lang['refcheck'] = 'Mediehenvisningerkontrol';
+$lang['refshow'] = 'Antal viste mediehenvisninger';
+$lang['gdlib'] = 'Udgave 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';
+$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-adresse til brug for automatiske meddelelser';
+$lang['mailprefix'] = 'Præfiks på email subject for automastiske mails. Efterlad blank for at bruge wiki titlen.';
+$lang['htmlmail'] = 'Send pænere, men større HTML multipart mails. Deaktivér for at sende rene tekst mails.';
+$lang['sitemap'] = 'Generer Google-"sitemap" (dage)';
+$lang['rss_type'] = 'Type af XML-liste';
+$lang['rss_linkto'] = 'XML-liste henviser til';
+$lang['rss_content'] = 'Hvad skal der vises i XML-listepunkteren?';
+$lang['rss_update'] = 'XML-listens opdateringsinterval (sek)';
+$lang['rss_show_summary'] = 'XML-liste vis referat i overskriften';
+$lang['rss_media'] = 'Hvilke ændringer skal vises i XML listen?';
$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['usedraft'] = 'Gem automatisk en kladde under redigering';
$lang['sepchar'] = 'Orddelingstegn til sidenavne';
$lang['canonical'] = 'Benyt fuldt kanoniske netadresser';
$lang['fnencode'] = 'Metode for indkodning af ikke ASCII filnavne';
$lang['autoplural'] = 'Tjek for flertalsendelser i henvisninger';
$lang['compression'] = 'Pakningsmetode for attic-filer';
-$lang['cachetime'] = 'Længste levetid for "cache" (sek)';
-$lang['locktime'] = 'Længste levetid for låsefiler (sek)';
-$lang['fetchsize'] = 'Største antal (bytes) fetch.php må hente udefra';
-$lang['notify'] = 'Send ændringsmeddelelser til denne e-adresse';
-$lang['registernotify'] = 'Send info om nyoprettede brugere til denne e-adresse';
-$lang['mailfrom'] = 'E-adresse til brug for automatiske meddelelser';
$lang['gzip_output'] = 'Benyt gzip-Content-Encoding (indholdskryptering) til XHTML';
-$lang['gdlib'] = 'Udgave af GD Lib';
-$lang['im_convert'] = 'Sti til ImageMagick\'s omdannerværktøj';
-$lang['jpg_quality'] = 'JPG komprimeringskvalitet (0-100)';
-$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['compress'] = 'Komprimer CSS- og JavaScript-filer';
-$lang['hidepages'] = 'Skjul lignende sider (almindelige udtryk)';
$lang['send404'] = 'Send "HTTP 404/Page Not Found" for ikke-eksisterende sider';
-$lang['sitemap'] = 'Generer Google-"sitemap" (dage)';
$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 <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Fejl 852</a> 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['rememberme'] = 'Tillad varige datafiler for brugernavne (husk mig)';
-$lang['rss_type'] = 'Type af XML-liste';
-$lang['rss_linkto'] = 'XML-liste henviser til';
-$lang['rss_content'] = 'Hvad skal der vises i XML-listepunkteren?';
-$lang['rss_update'] = 'XML-listens opdateringsinterval (sek)';
-$lang['recent_days'] = 'Hvor mange nye ændringer der skal beholdes (dage)';
-$lang['rss_show_summary'] = 'XML-liste vis referat i overskriften';
-$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['proxy____host'] = 'Proxy-servernavn';
$lang['proxy____port'] = 'Proxy-port';
$lang['proxy____user'] = 'Proxy-brugernavn';
diff --git a/lib/plugins/config/lang/de-informal/intro.txt b/lib/plugins/config/lang/de-informal/intro.txt
index 7ac1b47d9..df9845ebc 100644
--- a/lib/plugins/config/lang/de-informal/intro.txt
+++ b/lib/plugins/config/lang/de-informal/intro.txt
@@ -1,4 +1,4 @@
-===== Einstellungs-Manager =====
+===== 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]].
diff --git a/lib/plugins/config/lang/de-informal/lang.php b/lib/plugins/config/lang/de-informal/lang.php
index 52c705b4f..d86c2d809 100644
--- a/lib/plugins/config/lang/de-informal/lang.php
+++ b/lib/plugins/config/lang/de-informal/lang.php
@@ -5,7 +5,7 @@
* @author Alexander Fischer <tbanus@os-forge.net>
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
- * @author Matthias Schulte <post@lupo49.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
* @author Christian Wichmann <nospam@zone0.de>
* @author Pierre Corell <info@joomla-praxis.de>
*/
@@ -29,6 +29,8 @@ $lang['_anti_spam'] = 'Anti-Spam-Einstellungen';
$lang['_editing'] = 'Bearbeitungseinstellungen';
$lang['_links'] = 'Link-Einstellungen';
$lang['_media'] = 'Media-Einstellungen';
+$lang['_notifications'] = 'Benachrichtigungs-Konfiguration';
+$lang['_syndication'] = 'Syndication-Konfiguration (RSS)';
$lang['_advanced'] = 'erweiterte Einstellungen';
$lang['_network'] = 'Netzwerk-Einstellungen';
$lang['_plugin_sufix'] = 'Plugin-Einstellungen';
@@ -46,6 +48,8 @@ $lang['cookiedir'] = 'Cookie Pfad. Leer lassen, um die Standard-Url
$lang['start'] = 'Name der Startseite';
$lang['title'] = 'Wiki Titel';
$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['fullpath'] = 'Zeige vollen Pfad der Datei in Fußzeile an';
$lang['recent'] = 'letzte Änderungen';
@@ -89,6 +93,8 @@ $lang['disableactions_other'] = 'Weitere Aktionen (durch Komma getrennt)';
$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['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['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';
@@ -105,6 +111,7 @@ $lang['notify'] = 'Sende Änderungsbenachrichtigungen an diese E-
$lang['registernotify'] = 'Sende Information bei neu registrierten Benutzern an diese E-Mail-Adresse.';
$lang['mailfrom'] = 'Absenderadresse für automatisch erzeugte E-Mails';
$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['gzip_output'] = 'Seiten mit gzip komprimiert ausliefern';
$lang['gdlib'] = 'GD Lib Version';
$lang['im_convert'] = 'Pfad zu ImageMagicks-Konvertierwerkzeug';
@@ -128,11 +135,13 @@ $lang['rss_content'] = 'Was soll in XML-Feedinhalten angezeigt werden?
$lang['rss_update'] = 'Aktualisierungsintervall für XML-Feeds (Sekunden)';
$lang['recent_days'] = 'Wie viele Änderungen sollen vorgehalten werden? (Tage)';
$lang['rss_show_summary'] = 'Bearbeitungs-Zusammenfassung im XML-Feed anzeigen';
+$lang['rss_media'] = 'Welche Änderungen sollen im XML-Feed angezeigt werden?';
$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['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['proxy____host'] = 'Proxyadresse';
$lang['proxy____port'] = 'Proxyport';
$lang['proxy____user'] = 'Benutzername für den Proxy';
diff --git a/lib/plugins/config/lang/de/intro.txt b/lib/plugins/config/lang/de/intro.txt
index efb807738..b79b5f871 100644
--- a/lib/plugins/config/lang/de/intro.txt
+++ b/lib/plugins/config/lang/de/intro.txt
@@ -1,4 +1,4 @@
-====== Konfiguration ======
+====== 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.
diff --git a/lib/plugins/config/lang/de/lang.php b/lib/plugins/config/lang/de/lang.php
index 1cc4e0a8a..bcbc061a3 100644
--- a/lib/plugins/config/lang/de/lang.php
+++ b/lib/plugins/config/lang/de/lang.php
@@ -11,12 +11,12 @@
* @author Arne Pelka <mail@arnepelka.de>
* @author Dirk Einecke <dirk@dirkeinecke.de>
* @author Blitzi94@gmx.de
- * @author Robert Bogenschneider <robog@GMX.de>
* @author Robert Bogenschneider <robog@gmx.de>
* @author Niels Lange <niels@boldencursief.nl>
* @author Christian Wichmann <nospam@zone0.de>
* @author Paul Lachewsky <kaeptn.haddock@gmail.com>
* @author Pierre Corell <info@joomla-praxis.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
*/
$lang['menu'] = 'Konfiguration';
$lang['error'] = 'Die Einstellungen wurden wegen einer fehlerhaften Eingabe nicht gespeichert.
@@ -40,6 +40,8 @@ $lang['_anti_spam'] = 'Anti-Spam-Konfiguration';
$lang['_editing'] = 'Bearbeitungs-Konfiguration';
$lang['_links'] = 'Link-Konfiguration';
$lang['_media'] = 'Medien-Konfiguration';
+$lang['_notifications'] = 'Benachrichtigungs-Konfiguration';
+$lang['_syndication'] = 'Syndication-Konfiguration (RSS)';
$lang['_advanced'] = 'Erweiterte Konfiguration';
$lang['_network'] = 'Netzwerk-Konfiguration';
$lang['_plugin_sufix'] = 'Plugin-Konfiguration';
@@ -57,6 +59,8 @@ $lang['cookiedir'] = 'Cookiepfad. Frei lassen, um den gleichen Pfad
$lang['start'] = 'Startseitenname';
$lang['title'] = 'Titel des Wikis';
$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['fullpath'] = 'Den kompletten Dateipfad im Footer anzeigen';
$lang['recent'] = 'Anzahl der Einträge in der Änderungsliste';
@@ -100,6 +104,8 @@ $lang['disableactions_other'] = 'Andere Aktionen (durch Komma getrennt)';
$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['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['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['updatecheck'] = 'Automatisch auf Updates und Sicherheitswarnungen prüfen? DokuWiki muss sich dafür mit update.dokuwiki.org verbinden.';
$lang['userewrite'] = 'URL rewriting';
$lang['useslash'] = 'Schrägstrich (/) als Namensraumtrenner in URLs verwenden';
@@ -116,6 +122,7 @@ $lang['notify'] = 'Änderungsmitteilungen an diese E-Mail-Adresse
$lang['registernotify'] = 'Information über neu registrierte Nutzer an diese E-Mail-Adresse senden';
$lang['mailfrom'] = 'Absender-E-Mail-Adresse für automatische Mails';
$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['gzip_output'] = 'Seiten mit gzip komprimiert ausliefern';
$lang['gdlib'] = 'GD Lib Version';
$lang['im_convert'] = 'Pfad zu ImageMagicks-Konvertierwerkzeug';
@@ -139,11 +146,13 @@ $lang['rss_content'] = 'Welche Inhalte sollen im XML-Feed dargestellt
$lang['rss_update'] = 'XML-Feed Aktualisierungsintervall (Sekunden)';
$lang['recent_days'] = 'Wieviele letzte Änderungen sollen einsehbar bleiben? (Tage)';
$lang['rss_show_summary'] = 'Bearbeitungs-Zusammenfassung im XML-Feed anzeigen';
+$lang['rss_media'] = 'Welche Änderungen sollen im XML-Feed angezeigt werden?';
$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['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['proxy____host'] = 'Proxy-Server';
$lang['proxy____port'] = 'Proxy-Port';
$lang['proxy____user'] = 'Proxy Nutzername';
diff --git a/lib/plugins/config/lang/fa/lang.php b/lib/plugins/config/lang/fa/lang.php
index c1a112365..ba00d5a2d 100644
--- a/lib/plugins/config/lang/fa/lang.php
+++ b/lib/plugins/config/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['menu'] = 'تنظیمات پیکر‌بندی';
$lang['error'] = 'به دلیل ایراد در مقادیر وارد شده، تنظیمات اعمال نشد، خواهشمندیم تغییرات را مجددن کنترل نمایید و دوباره ارسال کنید.<br/> مقادیر مشکل‌دار با کادر قرمز مشخص شده‌اند.';
@@ -28,6 +29,8 @@ $lang['_anti_spam'] = 'تنظیمات ضد-اسپم';
$lang['_editing'] = 'تنظیمات ویرایش';
$lang['_links'] = 'تنظیمات پیوند';
$lang['_media'] = 'تنظیمات رسانه‌ها (فایل‌ها)';
+$lang['_notifications'] = 'تنظیمات آگاه سازی';
+$lang['_syndication'] = 'تنظیمات پیوند';
$lang['_advanced'] = 'تنظیمات پیشرفته';
$lang['_network'] = 'تنظیمات شبکه';
$lang['_plugin_sufix'] = 'تنظیمات افزونه';
@@ -35,25 +38,29 @@ $lang['_template_sufix'] = 'تنظیمات قالب';
$lang['_msg_setting_undefined'] = 'داده‌نمایی برای تنظیمات وجود ندارد';
$lang['_msg_setting_no_class'] = 'هیچ دسته‌ای برای تنظیمات وجود ندارد.';
$lang['_msg_setting_no_default'] = 'بدون مقدار پیش‌فرض';
-$lang['fmode'] = 'دسترسی پیش‌فرض فایل‌ها در زمان ایجاد';
-$lang['dmode'] = 'زبان';
-$lang['lang'] = 'زبان';
-$lang['basedir'] = 'شاخه‌ی اصلی';
-$lang['baseurl'] = 'آدرس اصلی';
-$lang['savedir'] = 'شاخه‌ی ذخیره‌سازی داده‌ها';
-$lang['start'] = 'نام صفحه‌ی آغازین';
$lang['title'] = 'عنوان ویکی';
+$lang['start'] = 'نام صفحه‌ی آغازین';
+$lang['lang'] = 'زبان';
$lang['template'] = 'قالب';
+$lang['tagline'] = 'خط تگ (اگر قالب از آن پشتیبانی می کند)';
+$lang['sidebar'] = 'نام نوار صفحه کناری (اگر قالب از آن پشتیبانی می کند) ، فیلد خالی نوار کناری غیر فعال خواهد کرد.';
$lang['license'] = 'لایسنس مطالب ویکی';
-$lang['fullpath'] = 'نمایش دادن مسیر کامل صفحات در پایین صفحه';
+$lang['savedir'] = 'شاخه‌ی ذخیره‌سازی داده‌ها';
+$lang['basedir'] = 'شاخه‌ی اصلی';
+$lang['baseurl'] = 'آدرس اصلی';
+$lang['cookiedir'] = 'مسیر کوکی ها. برای استفاده از آدرس پایه ، آن را خالی بگذارید.';
+$lang['dmode'] = 'زبان';
+$lang['fmode'] = 'دسترسی پیش‌فرض فایل‌ها در زمان ایجاد';
+$lang['allowdebug'] = 'امکان کرم‌زدایی (debug) <b>اگر نیازی ندارید، غیرفعال کنید</b>';
$lang['recent'] = 'تغییرات اخیر';
+$lang['recent_days'] = 'چند تغییر در خوراک نمایش داده شود به روز';
$lang['breadcrumbs'] = 'تعداد ردپاها';
$lang['youarehere'] = 'ردپای درختی';
+$lang['fullpath'] = 'نمایش دادن مسیر کامل صفحات در پایین صفحه';
$lang['typography'] = 'جای‌گزاری متن‌ها انجام شود';
-$lang['htmlok'] = 'امکان افزودن HTML باشد';
-$lang['phpok'] = 'امکان افزودن PHP باشد';
$lang['dformat'] = 'فرمت تاریخ (راهنمای تابع <a href="http://www.php.net/strftime">strftime</a> را مشاهده کنید)';
$lang['signature'] = 'امضا';
+$lang['showuseras'] = 'چگونه آخرین کاربر ویرایش کننده، یک صفحه نمایش داده شود';
$lang['toptoclevel'] = 'بیشترین عمق برای «فهرست مطالب»';
$lang['tocminheads'] = 'حداقل مقدار عنوان‌های یک صفحه، برای تشخیص این‌که «فهرست مطالب» (TOC) ایجاد شود';
$lang['maxtoclevel'] = 'حداکثر عمق «فهرست مطالب»';
@@ -61,15 +68,8 @@ $lang['maxseclevel'] = 'بیش‌ترین سطح ویرایش بخش
$lang['camelcase'] = 'از «حالت شتری» (CamelCase) برای پیوندها استفاده شود';
$lang['deaccent'] = 'تمیز کردن نام صفحات';
$lang['useheading'] = 'استفاده از اولین عنوان برای نام صفحه';
-$lang['refcheck'] = 'بررسی کردن مرجع رسانه‌ها';
-$lang['refshow'] = 'تعداد مراجعی که برای یک رسانه نمایش داده شود';
-$lang['allowdebug'] = 'امکان کرم‌زدایی (debug) <b>اگر نیازی ندارید، غیرفعال کنید</b>';
-$lang['usewordblock'] = 'اسپم‌ها را براساس لیست کلمات مسدود کن';
-$lang['indexdelay'] = 'مقدار تاخیر پیش از فهرست‌بندی (ثانیه)';
-$lang['relnofollow'] = 'از «rel=nofollow» در پیوندهای خروجی استفاده شود';
-$lang['mailguard'] = 'مبهم کردن آدرس‌های ایمیل';
-$lang['iexssprotect'] = 'بررسی کردن فایل‌های ارسال شده را برای کدهای HTML یا JavaScript مخرب';
-$lang['showuseras'] = 'چگونه آخرین کاربر ویرایش کننده، یک صفحه نمایش داده شود';
+$lang['sneaky_index'] = 'به طور پیش‌فرض، DokuWiki در فهرست تمامی فضای‌نام‌ها را نمایش می‌دهد. فعال کردن این گزینه، مواردی را که کاربر حق خواندنشان را ندارد مخفی می‌کند. این گزینه ممکن است باعث دیده نشدن زیرفضای‌نام‌هایی شود که دسترسی خواندن به آن‌ها وجود دارد. و ممکن است باعث شود که فهرست در حالاتی از دسترسی‌ها، غیرقابل استفاده شود.';
+$lang['hidepages'] = 'مخفی کردن صفحات با فرمت زیر (از عبارات منظم استفاده شود)';
$lang['useacl'] = 'استفاده از مدیریت دسترسی‌ها';
$lang['autopasswd'] = 'ایجاد خودکار گذرواژه‌ها';
$lang['authtype'] = 'روش معتبرسازی';
@@ -78,57 +78,71 @@ $lang['defaultgroup'] = 'گروه پیش‌فرض';
$lang['superuser'] = 'کاربر اصلی - گروه، کاربر یا لیستی که توسط ویرگول جدا شده از کاربرها و گروه‌ها (مثل 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_other'] = 'فعالیت‌های دیگر (با ویرگول انگلیسی «,» از هم جدا کنید)';
-$lang['sneaky_index'] = 'به طور پیش‌فرض، DokuWiki در فهرست تمامی فضای‌نام‌ها را نمایش می‌دهد. فعال کردن این گزینه، مواردی را که کاربر حق خواندنشان را ندارد مخفی می‌کند. این گزینه ممکن است باعث دیده نشدن زیرفضای‌نام‌هایی شود که دسترسی خواندن به آن‌ها وجود دارد. و ممکن است باعث شود که فهرست در حالاتی از دسترسی‌ها، غیرقابل استفاده شود.';
$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['htmlok'] = 'امکان افزودن HTML باشد';
+$lang['phpok'] = 'امکان افزودن PHP باشد';
+$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['refshow'] = 'تعداد مراجعی که برای یک رسانه نمایش داده شود';
+$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['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['updatecheck'] = 'هشدارهای به روز رسانی و امنیتی بررسی شود؟ برای این‌کار DokuWiki با سرور update.dokuwiki.org تماس خواهد گرفت.';
$lang['userewrite'] = 'از زیباکننده‌ی آدرس‌ها استفاده شود';
$lang['useslash'] = 'از اسلش «/» برای جداکننده‌ی آدرس فضای‌نام‌ها استفاده شود';
-$lang['usedraft'] = 'ایجاد خودکار چرک‌نویس در زمان نگارش';
$lang['sepchar'] = 'کلمه‌ی جداکننده‌ی نام صفحات';
$lang['canonical'] = 'استفاده از آدرس‌های استاندارد';
$lang['fnencode'] = 'روش تغییر نام فایل‌هایی با فرمتی غیر از اسکی';
$lang['autoplural'] = 'بررسی جمع بودن در پیوندها';
$lang['compression'] = 'روش فشرده‌سازی برای فایل‌های خُرد';
-$lang['cachetime'] = 'بیشینه‌ی زمان حافظه‌ی موقت (cache) به ثانیه';
-$lang['locktime'] = 'بیشینه‌ی زمان قفل شدن فایل‌ها به ثانیه';
-$lang['fetchsize'] = 'بیشینه‌ی حجمی که فایل fetch.php می‌تواند دریافت کند (به بایت)';
-$lang['notify'] = 'تغییرات به این ایمیل ارسال شود';
-$lang['registernotify'] = 'اطلاعات کاربران تازه وارد به این ایمیل ارسال شود';
-$lang['mailfrom'] = 'آدرس ایمیلی که برای ایمیل‌های خودکار استفاده می‌شود';
-$lang['mailprefix'] = 'پیشوند تیتر ایمیل (جهت ایمیل های خودکار)';
$lang['gzip_output'] = 'استفاده از gzip برای xhtmlها';
-$lang['gdlib'] = 'نگارش کتاب‌خانه‌ی GD';
-$lang['im_convert'] = 'مسیر ابزار convert از برنامه‌ی ImageMagick';
-$lang['jpg_quality'] = 'کیفیت فشرده سازی JPEG (از 0 تا 100)';
-$lang['subscribers'] = 'توانایی عضویت در صفحات باشد';
-$lang['subscribe_time'] = 'زمان مورد نیاز برای ارسال خبر نامه ها (ثانیه); این مقدار می بایست کمتر زمانی باشد که در recent_days تعریف شده است.';
$lang['compress'] = 'فشرده‌سازی کد‌های CSS و JavaScript';
-$lang['hidepages'] = 'مخفی کردن صفحات با فرمت زیر (از عبارات منظم استفاده شود)';
+$lang['cssdatauri'] = 'اندازه بایت هایی که تصاویر ارجاع شده به فایل های CSS باید به درستی درون stylesheet جایگذاری شود تا سربار سرایند درخواست HTTP را کاهش دهد. این روش در IE 7 و پایین تر کار نمی کند! مقادیر <code>400</code> تا <code>600</code> بایت مقدار خوبی است. برای غیر فعال کردن <code>0</code> قرار دهید.';
$lang['send404'] = 'ارسال «HTTP 404/Page Not Found» برای صفحاتی که وجود ندارند';
-$lang['sitemap'] = 'تولید کردن نقشه‌ی سایت توسط گوگل (روز)';
$lang['broken_iua'] = 'آیا تابع ignore_user_about در ویکی شما کار نمی‌کند؟ ممکن است فهرست جستجوی شما کار نکند. IIS به همراه PHP/CGI باعث خراب شدن این گزینه می‌شود. برای اطلاعات بیشتر <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">باگ ۸۵۲</a> را مشاهده کنید.';
$lang['xsendfile'] = 'استفاده از هدر X-Sendfile، تا به وب‌سرور توانایی ارسال فایل‌های ثابت را بدهد. وب‌سرور شما باید این مورد را پشتیبانی کند.';
$lang['renderer_xhtml'] = 'مفسری که برای خروجی اصلی ویکی استفاده شود';
$lang['renderer__core'] = '%s (هسته‌ی dokuwiki)';
$lang['renderer__plugin'] = '%s (افزونه)';
-$lang['rememberme'] = 'امکان ورود دایم، توسط کوکی، وجود داشته باشد (مرا به خاطر بسپار)';
-$lang['rss_type'] = 'نوع خوراک';
-$lang['rss_linkto'] = 'خوراک به کجا لینک شود';
-$lang['rss_content'] = 'چه چیزی در تکه‌های خوراک نمایش داده شود؟';
-$lang['rss_update'] = 'زمان به روز رسانی خوراک به ثانیه';
-$lang['recent_days'] = 'چند تغییر در خوراک نمایش داده شود به روز';
-$lang['rss_show_summary'] = 'خوراک مختصری از مطلب را در عنوان نمایش دهد';
-$lang['target____wiki'] = 'پنجره‌ی هدف در پیوند‌های داخلی';
-$lang['target____interwiki'] = 'پنجره‌ی هدف در پیوند‌های داخل ویکی';
-$lang['target____extern'] = 'پنجره‌ی هدف در پیوند‌های خارجی';
-$lang['target____media'] = 'پنجره‌ی هدف در پیوند‌های رسانه‌ها';
-$lang['target____windows'] = 'پنجره‌ی هدف در پیوند‌های پنجره‌ای';
+$lang['dnslookups'] = 'DokuWiki نام هاست ها را برای آدرسهای IP یِ صفحات ویرایشی کاربران ، جستجو می کند. اگر یک سرور DNS کند یا نا کارامد دارید یا این ویژگی را نمی خواهید ، این گزینه را غیر فعال کنید.';
$lang['proxy____host'] = 'آدرس سرور پروکسی';
$lang['proxy____port'] = 'پورت پروکسی';
$lang['proxy____user'] = 'نام کاربری پروکسی';
diff --git a/lib/plugins/config/lang/it/lang.php b/lib/plugins/config/lang/it/lang.php
index 9c348dcee..91c92bd85 100644
--- a/lib/plugins/config/lang/it/lang.php
+++ b/lib/plugins/config/lang/it/lang.php
@@ -13,6 +13,7 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
*/
$lang['menu'] = 'Configurazione Wiki';
$lang['error'] = 'Impostazioni non aggiornate a causa di un valore non corretto, controlla le modifiche apportate e salva di nuovo.
@@ -36,6 +37,7 @@ $lang['_anti_spam'] = 'Impostazioni Anti-Spam';
$lang['_editing'] = 'Impostazioni Modifica';
$lang['_links'] = 'Impostazioni Collegamenti';
$lang['_media'] = 'Impostazioni File';
+$lang['_notifications'] = 'Impostazioni di notifica';
$lang['_advanced'] = 'Impostazioni Avanzate';
$lang['_network'] = 'Impostazioni Rete';
$lang['_plugin_sufix'] = 'Impostazioni Plugin';
@@ -43,25 +45,28 @@ $lang['_template_sufix'] = 'Impostazioni Modello';
$lang['_msg_setting_undefined'] = 'Nessun metadato definito.';
$lang['_msg_setting_no_class'] = 'Nessuna classe definita.';
$lang['_msg_setting_no_default'] = 'Nessun valore predefinito.';
-$lang['fmode'] = 'Permessi per i nuovi file';
-$lang['dmode'] = 'Permessi per le nuove directory';
-$lang['lang'] = 'Lingua';
-$lang['basedir'] = 'Directory di base';
-$lang['baseurl'] = 'URL di base';
-$lang['savedir'] = 'Directory per il salvataggio dei dati';
-$lang['start'] = 'Nome della pagina iniziale';
$lang['title'] = 'Titolo del wiki';
+$lang['start'] = 'Nome della pagina iniziale';
+$lang['lang'] = 'Lingua';
$lang['template'] = 'Modello';
+$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['fullpath'] = 'Mostra il percorso completo delle pagine';
+$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 <b>(disabilitare se non serve!)</b>';
$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['htmlok'] = 'Consenti HTML incorporato';
-$lang['phpok'] = 'Consenti PHP incorporato';
$lang['dformat'] = 'Formato delle date (vedi la funzione <a href="http://www.php.net/strftime">strftime</a> 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';
@@ -69,15 +74,8 @@ $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['refcheck'] = 'Controlla i riferimenti ai file';
-$lang['refshow'] = 'Numero di riferimenti da visualizzare';
-$lang['allowdebug'] = 'Abilita il debug <b>(disabilitare se non serve!)</b>';
-$lang['usewordblock'] = 'Blocca lo spam in base alla blacklist';
-$lang['indexdelay'] = 'Intervallo di tempo prima dell\'indicizzazione';
-$lang['relnofollow'] = 'Usa rel="nofollow" nei collegamenti esterni';
-$lang['mailguard'] = 'Oscuramento indirizzi email';
-$lang['iexssprotect'] = 'Controlla i file caricati in cerca di possibile codice JavaScript o HTML maligno.';
-$lang['showuseras'] = 'Cosa visualizzare quando si mostra l\'ultimo utente che ha modificato una 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';
@@ -86,57 +84,69 @@ $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_other'] = 'Altre azioni (separate da virgola)';
-$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['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['htmlok'] = 'Consenti HTML incorporato';
+$lang['phpok'] = 'Consenti PHP incorporato';
+$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['refshow'] = 'Numero di riferimenti da visualizzare';
+$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'] = 'Abilita la sottoscrizione alle pagine';
+$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['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['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_media'] = 'Quale tipo di cambiamento dovrebbe essere elencato nel feed XML?';
$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['usedraft'] = 'Salva una bozza in automatico in fase di modifica';
$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['cachetime'] = 'Durata della cache (sec)';
-$lang['locktime'] = 'Durata dei file di lock (sec)';
-$lang['fetchsize'] = 'Dimensione massima (bytes) scaricabile da fetch.php da extern';
-$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['mailprefix'] = 'Prefisso da inserire nell\'oggetto delle mail automatiche';
$lang['gzip_output'] = 'Usa il Content-Encoding gzip per xhtml';
-$lang['gdlib'] = 'Versione GD Lib ';
-$lang['im_convert'] = 'Percorso per il convertitore di ImageMagick';
-$lang['jpg_quality'] = 'Qualità di compressione JPG (0-100)';
-$lang['subscribers'] = 'Abilita la sottoscrizione alle pagine';
-$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['compress'] = 'Comprimi i file CSS e javascript';
-$lang['hidepages'] = 'Nascondi le pagine che soddisfano la condizione (inserire un\'espressione regolare)';
$lang['send404'] = 'Invia "HTTP 404/Pagina non trovata" per le pagine inesistenti';
-$lang['sitemap'] = 'Genera una sitemap Google (giorni)';
$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 il<a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> 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['rememberme'] = 'Permetti i cookies di accesso permanenti (ricordami)';
-$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['recent_days'] = 'Quante modifiche recenti tenere (giorni)';
-$lang['rss_show_summary'] = 'I feed XML riportano un sommario nel titolo';
-$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['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['proxy____host'] = 'Nome server proxy';
$lang['proxy____port'] = 'Porta proxy';
$lang['proxy____user'] = 'Nome utente proxy';
diff --git a/lib/plugins/config/lang/ko/intro.txt b/lib/plugins/config/lang/ko/intro.txt
index 22dd96ef6..f6b76ecfc 100644
--- a/lib/plugins/config/lang/ko/intro.txt
+++ b/lib/plugins/config/lang/ko/intro.txt
@@ -1,9 +1,7 @@
====== 환경 설정 관리 ======
-DokuWiki 설치할 때 설정들을 변경하기 위해 사용하는 페이지입니다. 각 설정에 대한 자세한 도움말이 필요하다면 [[doku>ko:config|설정 문서(번역)]]와 [[doku>config|설정 문서(영문)]]를 참조합니다.
-
-플러그인에 대한 자세한 정보가 필요하다면 [[doku>plugin:config|플러그인 설정]]페이지를 참조합니다. 붉은 배경색으로 보이는 설정들은 이 플러인에서 변경하지 못하도록 되어있습니다. 파란 배경색으로 보이는 설정들은 기본 설정값을 가지고 있습니다. 흰색 배경색으로 보이는 설정들은 특별한 설치를 위해 설정되어 있습니다. 파란색과 흰색 배경 설정들이 수정 가능합니다.
-
-이페이지를 끝내기 전에 **저장**버튼을 누르지 않으면 설정값들은 적용되지 않습니다.
+DokuWiki 설치할 때 설정을 변경하기 위해 사용하는 페이지입니다. 각 설정에 대한 자세한 도움말이 필요하다면 [[doku>ko:config|설정 문서 (한국어)]]와 [[doku>config|설정 문서 (영어)]]를 참고하세요.
+플러그인에 대한 자세한 정보가 필요하다면 [[doku>plugin:config|플러그인 설정]] 문서를 참고하세요. 빨간 배경색으로 보이는 설정은 이 플러그인에서 변경하지 못하도록 되어있습니다. 파란 배경색으로 보이는 설정은 기본 설정값을 가지고 있습니다. 하얀 배경색으로 보이는 설정은 특별한 설치를 위해 설정되어 있습니다. 파란색과 하얀색 배경으로 된 설정은 수정이 가능합니다.
+이 페이지를 끝내기 전에 **저장** 버튼을 누르지 않으면 설정값은 적용되지 않습니다.
diff --git a/lib/plugins/config/lang/ko/lang.php b/lib/plugins/config/lang/ko/lang.php
index dc22a78df..5f90044e4 100644
--- a/lib/plugins/config/lang/ko/lang.php
+++ b/lib/plugins/config/lang/ko/lang.php
@@ -9,155 +9,156 @@
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
* @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['menu'] = '환경 설정';
-$lang['error'] = '잘못된 값때문에 설정들을 변경할 수 없습니다. 수정한 값들을 검사하고 확인을 누르기 바랍니다.
- <br />잘못된 값(들)은 붉은 선으로 둘러싸여 있습니다.';
+$lang['error'] = '잘못된 값 때문에 설정을 변경할 수 없습니다. 수정한 값을 검토하고 확인을 누르세요.
+<br />잘못된 값은 빨간 선으로 둘러싸여 있습니다.';
$lang['updated'] = '설정이 성공적으로 변경되었습니다.';
$lang['nochoice'] = '(다른 선택이 불가능합니다.)';
-$lang['locked'] = '환경 설정 파일을 수정할 수 없습니다. 의도된 행동이 아니라면,<br /> 파일이름과 권한이 맞는지 확인하기 바랍니다. ';
-$lang['danger'] = '위험 : 이 옵션을 잘못 수정하면 환경설정 메뉴를 사용할 수 없을 수도 있습니다.';
-$lang['warning'] = '경고 : 이 옵션을 잘못 수정하면 잘못 동작 할 수 있습니다.';
-$lang['security'] = '보안 경고 : 이 옵션은 보안에 위험이 있을 수 있습니다.';
+$lang['locked'] = '환경 설정 파일을 수정할 수 없습니다. 의도한 행동이 아니라면,<br />
+파일 이름과 권한이 맞는지 확인하기 바랍니다. ';
+$lang['danger'] = '위험: 이 옵션을 잘못 수정하면 환경설정 메뉴를 사용할 수 없을 수도 있습니다.';
+$lang['warning'] = '경고: 이 옵션을 잘못 수정하면 잘못 동작할 수 있습니다.';
+$lang['security'] = '보안 경고: 이 옵션은 보안에 위험이 있을 수 있습니다.';
$lang['_configuration_manager'] = '환경 설정 관리자';
$lang['_header_dokuwiki'] = 'DokuWiki 설정';
-$lang['_header_plugin'] = 'Plugin 설정';
-$lang['_header_template'] = 'Template 설정';
+$lang['_header_plugin'] = '플러그인 설정';
+$lang['_header_template'] = '템플릿 설정';
$lang['_header_undefined'] = '정의되지 않은 설정';
$lang['_basic'] = '기본 설정';
$lang['_display'] = '화면 표시 설정';
$lang['_authentication'] = '인증 설정';
-$lang['_anti_spam'] = '안티-스팸 설정';
+$lang['_anti_spam'] = '스팸 방지 설정';
$lang['_editing'] = '편집 설정';
$lang['_links'] = '링크 설정';
$lang['_media'] = '미디어 설정';
-$lang['_notifications'] = '공지 설정';
+$lang['_notifications'] = '알림 설정';
$lang['_syndication'] = '신디케이션 설정';
-$lang['_advanced'] = '진보된 설정';
+$lang['_advanced'] = '고급 설정';
$lang['_network'] = '네트워크 설정';
-$lang['_plugin_sufix'] = 'Plugin 설정';
-$lang['_template_sufix'] = 'Template 설정';
-$lang['_msg_setting_undefined'] = '설정되지 않은 메타데이타.';
+$lang['_plugin_sufix'] = '플러그인 설정';
+$lang['_template_sufix'] = '템플릿 설정';
+$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['title'] = '위키 제목 (위키 이름)';
+$lang['start'] = '각 이름공간에서 사용할 시작 문서 이름';
+$lang['lang'] = '인터페이스 언어';
+$lang['template'] = '템플릿 (위키 디자인)';
+$lang['tagline'] = '태그 라인 (템플릿이 지원할 때에 한함)';
+$lang['sidebar'] = '사이드바 문서 이름 (템플릿이 지원할 때에 한함). 비워두면 사이드바를 비활성화';
+$lang['license'] = '콘텐츠에 어떤 라이선스를 적용하겠습니까?';
$lang['savedir'] = '데이타 저장 디렉토리';
-$lang['basedir'] = '기본 디렉토리';
-$lang['baseurl'] = '기본 URL';
-$lang['cookiedir'] = '쿠키 위치. 비워두면 기본 url 위치로 지정됩니다.';
+$lang['basedir'] = '서버 경로 (예를 들어 <code>/dokuwiki/</code>). 자동 감지를 하려면 비우세요.';
+$lang['baseurl'] = '서버 URL (예를 들어 <code>http://www.yourserver.com</code>). 자동 감지를 하려면 비우세요.';
+$lang['cookiedir'] = '쿠키 위치. 비워두면 기본 URL 위치로 지정됩니다.';
$lang['dmode'] = '디렉토리 생성 모드';
$lang['fmode'] = '파일 생성 모드';
$lang['allowdebug'] = '디버그 허용 <b>필요하지 않으면 금지!</b>';
-$lang['recent'] = '최근에 바뀐 것';
-$lang['recent_days'] = '최근 바뀐 페이지 기준 시간(날짜)';
-$lang['breadcrumbs'] = '위치 추적 수';
-$lang['youarehere'] = '계층형 위치 추적';
-$lang['fullpath'] = '페이지 하단에 전체 경로 보여주기';
+$lang['recent'] = '최근 바뀐 문서당 항목 수';
+$lang['recent_days'] = '최근 바뀐 문서 기준 시간 (날짜)';
+$lang['breadcrumbs'] = '위치 "추적" 수. 0으로 설정하면 비활성화함.';
+$lang['youarehere'] = '계층형 위치 추적 (다음 위의 옵션을 비활성화하고 싶습니다)';
+$lang['fullpath'] = '문서 하단에 전체 경로 보여주기';
$lang['typography'] = '기호 대체';
-$lang['dformat'] = '날짜 포맷 (PHP <a href="http://www.php.net/strftime">strftime</a> 기능) 참조';
-$lang['signature'] = '서명';
-$lang['showuseras'] = '마지막으로 페이지를 수정한 사용자를 보여줄지 여부';
+$lang['dformat'] = '날짜 형식 (PHP <a href="http://www.php.net/strftime">strftime</a> 기능 참고)';
+$lang['signature'] = '편집기에서 서명 버튼을 누를 때 삽입할 내용';
+$lang['showuseras'] = '마지막에 문서를 수정한 사용자를 보여줄지 여부';
$lang['toptoclevel'] = '목차 최상위 항목';
-$lang['tocminheads'] = '목차 표시 여부를 결정할 최소한의 표제 항목의 수';
+$lang['tocminheads'] = '목차 표시 여부를 결정할 최소한의 문단 제목 항목의 수';
$lang['maxtoclevel'] = '목차 최대 단계';
-$lang['maxseclevel'] = '섹션 최대 편집 단계';
+$lang['maxseclevel'] = '문단 최대 편집 단계';
$lang['camelcase'] = '링크에 CamelCase 사용';
-$lang['deaccent'] = '악센트 없는 페이지 이름';
-$lang['useheading'] = '페이지 이름으로 첫 헤드라인 사용';
-$lang['sneaky_index'] = '기본적으로, DokuWiki는 색인 목록에 모든 네임스페이스들을 보여줍니다.
-이 옵션을 설정하면 사용자가 읽기 권한을 가지고 있지 않은 네임스페이스들은 보여주지 않습니다. 접근 가능한 하위 네임스페이스들 보이지않게 설정하면 자동으로 설정됩니다.
-특정 ACL 설정은 색인 사용이 불가능하게 할 수도 있습니다.';
-$lang['hidepages'] = '매칭된 페이지 숨기기(정규표현식)';
-$lang['useacl'] = '접근 제어 목록(ACL) 사용';
-$lang['autopasswd'] = '자동으로 만들어진 패스워드';
+$lang['deaccent'] = '문서 이름을 지우는 방법';
+$lang['useheading'] = '문서 이름으로 첫 문단 제목 사용';
+$lang['sneaky_index'] = '기본적으로 DokuWiki는 색인 목록에 모든 이름공간을 보여줍니다.
+이 옵션을 설정하면 사용자가 읽기 권한을 가지고 있지 않은 이름공간은 보여주지 않습니다. 접근 가능한 하위 이름공간을 보이지 않게 설정하면 자동으로 설정됩니다. 특정 ACL 설정은 색인 사용이 불가능하게 할 수도 있습니다.';
+$lang['hidepages'] = '사이트맵과 기타 자동 색인과 같은 찾기에서 정규 표현식과 일치하는 문서 숨기기';
+$lang['useacl'] = '접근 제어 목록 (ACL) 사용';
+$lang['autopasswd'] = '자동으로 만들어진 비밀번호';
$lang['authtype'] = '인증 백-엔드';
-$lang['passcrypt'] = '패스워드 암호화 방법';
-$lang['defaultgroup'] = '기본 그룹';
-$lang['superuser'] = '슈퍼 유저';
-$lang['manager'] = '관리자 - 관리 기능들을 사용할 수 있는 그룹이나 사용자';
-$lang['profileconfirm'] = '개인정보 변경시 암호 재확인';
-$lang['rememberme'] = '로그인 정보 저장 허용';
-$lang['disableactions'] = 'DokuWiki Action 금지';
+$lang['passcrypt'] = '비밀번호 암호화 방법';
+$lang['defaultgroup'] = '기본 그룹, 모든 새 사용자는 이 그룹에 속합니다';
+$lang['superuser'] = '슈퍼 유저 - ACL 설정과 상관없이 모든 문서와 기능에 대한 전체 접근 권한을 가진 그룹이나 사용자. 사용자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'] = '다른 Action(comma로 구분)';
-$lang['auth_security_timeout'] = '인증 보안 초과 시간(초)';
-$lang['securecookie'] = 'HTTPS로 보내진 쿠키는 HTTPS에만 적용 할까요? 위키의 로그인 페이지만 SSL로 암호화 하고 위키 페이지는 그렇지 않은경우 꺼야 합니다.';
+$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['remoteuser'] = '이 항목에 입력된 쉼표로 나눠진 그룹이나 사용자에게 원격 API 접근을 제한합니다. 빈칸으로 두면 모두에게 허용합니다.';
+$lang['usewordblock'] = '금지 단어를 사용해 스팸 막기';
$lang['relnofollow'] = '외부 링크에 rel="nofollow" 사용';
-$lang['indexdelay'] = '색인 연기 시간(초)';
-$lang['mailguard'] = '이메일 주소를 알아볼 수 없게';
-$lang['iexssprotect'] = '업로드 파일의 악성 Javascript, HTML 코드 가능성 여부를 검사';
+$lang['indexdelay'] = '색인 연기 시간 (초)';
+$lang['mailguard'] = '이메일 주소를 알아볼 수 없게 하기';
+$lang['iexssprotect'] = '올린 파일의 악성 자바스크립트, HTML 코드 가능성 여부를 검사';
$lang['usedraft'] = '편집하는 동안 자동으로 문서 초안 저장';
$lang['htmlok'] = 'HTML 내장 허용';
$lang['phpok'] = 'PHP 내장 허용';
-$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['refshow'] = '보여줄 미디어 참조 수';
+$lang['locktime'] = '최대 파일 잠금 시간(초)';
+$lang['cachetime'] = '최대 캐시 생존 시간 (초)';
+$lang['target____wiki'] = '내부 링크에 대한 타겟 창';
+$lang['target____interwiki'] = '인터위키 링크에 대한 타겟 창';
+$lang['target____extern'] = '외부 링크에 대한 타겟 창';
+$lang['target____media'] = '미디어 링크에 대한 타겟 창';
+$lang['target____windows'] = '창 링크에 대한 타겟 창';
+$lang['mediarevisions'] = '미디어 버전 관리를 사용하겠습니까?';
+$lang['refcheck'] = '미디어 파일을 삭제하기 전에 사용하고 있는지 검사';
+$lang['refshow'] = '위의 설정이 활성화되었을 때 보여줄 미디어 참고 수';
$lang['gdlib'] = 'GD 라이브러리 버전';
-$lang['im_convert'] = 'ImageMagick 위치';
+$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['fetchsize'] = 'fetch.php가 외부에서 다운로드할 수도 있는 최대 크기 (바이트)';
+$lang['subscribers'] = '사용자가 이메일로 문서 바뀜에 구독하도록 허용';
+$lang['subscribe_time'] = '구독 목록과 요약이 보내질 경과 시간 (초); 이 것은 recent_days에서 설정된 시간보다 작아야 합니다.';
+$lang['notify'] = '항상 이 이메일 주소로 바뀜 알림을 보냄';
+$lang['registernotify'] = '항상 새 사용자한테 이 이메일 주소로 정보를 보냄';
$lang['mailfrom'] = '자동으로 보내지는 메일 발신자';
-$lang['mailprefix'] = '자동으로 보내지는 메일의 제목 말머리 내용';
-$lang['htmlmail'] = '용량은 좀 더 크지만 보기 좋은 HTML 태그가 포함된 메일을 발송합니다. 텍스트만의 메일을 보내고자하면 체크를 꺼주세요.';
-$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['mailprefix'] = '자동으로 보내지는 메일의 제목 말머리 내용. 비웠을 경우 위키 제목 사용';
+$lang['htmlmail'] = '용량은 조금 더 크지만 보기 좋은 HTML 태그가 포함된 메일을 발송합니다. 텍스트만의 메일을 보내고자하면 비활성화하세요.';
+$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_media'] = '어떤 규격으로 XML 피드를 받아보시겠습니까?';
-$lang['updatecheck'] = '업데이트와 보안 문제를 검사(DokuWiki를 update.dokuwiki.org에 연결해야 합니다.)';
-$lang['userewrite'] = 'URL rewriting기능 사용';
-$lang['useslash'] = 'URL에서 네임스페이스 구분자로 슬래쉬 문자 사용';
-$lang['sepchar'] = '페이지 이름 단어 구분자';
+$lang['updatecheck'] = '업데이트와 보안 문제를 검사할까요? 이 기능을 사용하려면 DokuWiki를 update.dokuwiki.org에 연결해야 합니다.';
+$lang['userewrite'] = '멋진 URL 사용';
+$lang['useslash'] = 'URL에서 이름 구분자로 슬래시 문자 사용';
+$lang['sepchar'] = '문서 이름 단어 구분자';
$lang['canonical'] = '완전한 canonical URL 사용';
-$lang['fnencode'] = '아스키가 아닌 파일이름을 인코딩 하는 방법.';
-$lang['autoplural'] = '링크 연결시 plural폼 검사';
-$lang['compression'] = 'attic파일 압축 방법 선택';
-$lang['gzip_output'] = 'xhml 내용 gzip 압축 여부';
-$lang['compress'] = '최적화된 CSS, javascript 출력';
-$lang['cssdatauri'] = '이미지가 렌더링될 최대 용량 크기를 CSS에 규정해야 HTTP request 헤더 오버헤드 크기를 감소시킬 수 있습니다. 이 기술은 IE 7 이하에서는 작동하지 않습니다! <code>400</code> 에서 <code>600></code> 정도면 좋은 효율을 가져옵니다. <code>0</code>로 지정할 경우 비활성화 됩니다.';
+$lang['fnencode'] = '아스키가 아닌 파일 이름을 인코딩 하는 방법.';
+$lang['autoplural'] = '링크 연결시 복수 양식 검사';
+$lang['compression'] = '첨부 파일 압축 방법 선택';
+$lang['gzip_output'] = 'xhml 내용 gzip 압축 사용';
+$lang['compress'] = '최적화된 CSS, 자바스크립트 출력';
+$lang['cssdatauri'] = '그림이 렌더링될 최대 용량 크기를 CSS에 규정해야 HTTP 요청 헤더 오버헤드 크기를 감소시킬 수 있습니다. 이 기술은 IE 7 이하에서는 작동하지 않습니다! <code>400</code>에서 <code>600</code> 정도면 좋은 효율을 가져옵니다. <code>0</code>로 지정할 경우 비활성화 됩니다.';
$lang['send404'] = '존재하지 않는 페이지에 대해 "HTTP 404/Page Not Found" 응답';
$lang['broken_iua'] = '설치된 시스템에서 ignore_user_abort 기능에 문제가 있으면 색인이 정상적으로 동작하지 않습니다. 이 기능이 IIS+PHP/CGI에서 문제가 있는 것으로 알려졌습니다. 자세한 정보는 <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a>를 참고하기 바랍니다.';
$lang['xsendfile'] = '웹 서버 static 파일 전송 지원을 위해 X-Sendfile 헤더를 사용한다면 이 옵션을 사용합니다.
웹 서버가 이 기능을 지원해야 합니다.';
$lang['renderer_xhtml'] = '주 (xhtml) 위키 출력 처리기';
$lang['renderer__core'] = '%s (DokuWiki 내부 기능)';
-$lang['renderer__plugin'] = '%s (DokuWiki 플러그인)';
-$lang['dnslookups'] = '이 옵션을 체크하면 도쿠위키가 페이지를 수정하는 사용자의 호스트 네임과 원격 IP주소를 확인합니다. 서버가 느리거나, DNS를 운영하지 않거나 이 기능을 원치 않으면 비활성화 시켜주세요.';
+$lang['renderer__plugin'] = '%s (플러그인)';
+$lang['dnslookups'] = '이 옵션을 활성화하면 도쿠위키가 문서를 수정하는 사용자의 호스트 네임과 원격 IP 주소를 확인합니다. 서버가 느리거나, DNS를 운영하지 않거나 이 기능을 원치 않으면 비활성화 시켜주세요.';
$lang['proxy____host'] = '프록시 서버 이름';
$lang['proxy____port'] = '프록시 서버 포트';
$lang['proxy____user'] = '프록시 사용자 이름';
-$lang['proxy____pass'] = '프록시 패스워드';
-$lang['proxy____ssl'] = '프록시 연결시 ssl사용';
-$lang['proxy____except'] = '프록시설정이 무시될 URL주소들의 RegEx형식표현';
+$lang['proxy____pass'] = '프록시 비밀번호';
+$lang['proxy____ssl'] = '프록시 연결시 SSL 사용';
+$lang['proxy____except'] = '프록시 설정이 무시될 URL주소의 정규 표현식';
$lang['safemodehack'] = 'safemode hack기능 사용';
$lang['ftp____host'] = 'safemode hack의 FTP 서버';
-$lang['ftp____port'] = 'safemode hack의 FTP port';
+$lang['ftp____port'] = 'safemode hack의 FTP 포트';
$lang['ftp____user'] = 'safemode hack의 FTP 사용자 이름';
-$lang['ftp____pass'] = 'safemode hack의 FTP 패스워드';
+$lang['ftp____pass'] = 'safemode hack의 FTP 비밀번호';
$lang['ftp____root'] = 'safemode hack의 FTP 루트 디렉토리';
$lang['license_o_'] = '선택하지 않음';
$lang['typography_o_0'] = '사용 안함';
@@ -178,13 +179,13 @@ $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['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';
@@ -194,10 +195,10 @@ $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'] = 'mailto: link로 표현될 사용자 e-mail 주소';
-$lang['useheading_o_0'] = '아니요';
-$lang['useheading_o_navigation'] = '네비게이션에만';
+$lang['showuseras_o_email'] = '사용자 이메일 주소 (메일 주소 보호 설정에 따라 안보일 수 있음)';
+$lang['showuseras_o_email_link'] = 'mailto: link로 표현될 사용자 이메일 주소';
+$lang['useheading_o_0'] = '아니오';
+$lang['useheading_o_navigation'] = '둘러보기에만';
$lang['useheading_o_content'] = '위키 내용에만';
$lang['useheading_o_1'] = '항상';
-$lang['readdircache'] = 'readdir 캐쉬를 위한 최대 시간 (초)';
+$lang['readdircache'] = 'readdir 캐시를 위한 최대 시간 (초)';
diff --git a/lib/plugins/config/lang/nl/lang.php b/lib/plugins/config/lang/nl/lang.php
index 77b8d6a1a..e0c9d7d7c 100644
--- a/lib/plugins/config/lang/nl/lang.php
+++ b/lib/plugins/config/lang/nl/lang.php
@@ -36,6 +36,8 @@ $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['_plugin_sufix'] = 'Plugin-instellingen';
@@ -43,26 +45,29 @@ $lang['_template_sufix'] = 'Sjabloon-instellingen';
$lang['_msg_setting_undefined'] = 'Geen metadata voor deze instelling.';
$lang['_msg_setting_no_class'] = 'Geen class voor deze instelling.';
$lang['_msg_setting_no_default'] = 'Geen standaard waarde.';
-$lang['fmode'] = 'Bestandaanmaak-modus (file creation mode)';
-$lang['dmode'] = 'Directory-aanmaak-modus (directory creation mode)';
+$lang['title'] = 'Titel van de wiki';
+$lang['start'] = 'Naam startpagina';
$lang['lang'] = 'Taal';
+$lang['template'] = 'Sjabloon ofwel het design van de wiki.';
+$lang['tagline'] = 'Ondertitel (als het sjabloon dat ondersteunt)';
+$lang['sidebar'] = 'Zijbalk-paginanaam (als het sjabloon 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['savedir'] = 'Directory om data op te slaan';
$lang['cookiedir'] = 'Cookie pad. Laat leeg om de basis URL te gebruiken.';
-$lang['start'] = 'Naam startpagina';
-$lang['title'] = 'Titel van de wiki';
-$lang['template'] = 'Sjabloon';
-$lang['license'] = 'Onder welke licentie zou je tekst moeten worden gepubliceerd?';
-$lang['fullpath'] = 'Volledig pad van pagina\'s in de footer weergeven';
+$lang['dmode'] = 'Directory-aanmaak-modus (directory creation mode)';
+$lang['fmode'] = 'Bestandaanmaak-modus (file creation mode)';
+$lang['allowdebug'] = 'Debug toestaan <b>uitzetten indien niet noodzakelijk!</b>';
$lang['recent'] = 'Recente wijzigingen';
+$lang['recent_days'] = 'Hoeveel recente wijzigingen bewaren (dagen)';
$lang['breadcrumbs'] = 'Aantal broodkruimels';
$lang['youarehere'] = 'Hierarchische broodkruimels';
+$lang['fullpath'] = 'Volledig pad van pagina\'s in de footer weergeven';
$lang['typography'] = 'Breng typografische wijzigingen aan';
-$lang['htmlok'] = 'Embedded HTML toestaan';
-$lang['phpok'] = 'Embedded PHP toestaan';
$lang['dformat'] = 'Datum formaat (zie de PHP <a href="http://www.php.net/strftime">strftime</a> functie)';
$lang['signature'] = 'Ondertekening';
+$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';
@@ -70,16 +75,8 @@ $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['refcheck'] = 'Controleer verwijzingen naar media';
-$lang['refshow'] = 'Aantal te tonen mediaverwijzingen';
-$lang['allowdebug'] = 'Debug toestaan <b>uitzetten indien niet noodzakelijk!</b>';
-$lang['mediarevisions'] = 'Media revisies activeren?';
-$lang['usewordblock'] = 'Blokkeer spam op basis van woordenlijst';
-$lang['indexdelay'] = 'Uitstel voor indexeren (sec)';
-$lang['relnofollow'] = 'Gebruik rel="nofollow" voor externe links';
-$lang['mailguard'] = 'E-mailadressen onherkenbaar maken';
-$lang['iexssprotect'] = 'Controleer geüploade bestanden op mogelijk schadelijke JavaScript of HTML code';
-$lang['showuseras'] = 'Hoe de gebruiker die de pagina het laatst wijzigde weergeven';
+$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 (regular expressions)';
$lang['useacl'] = 'Gebruik access control lists';
$lang['autopasswd'] = 'Zelf wachtwoorden genereren';
$lang['authtype'] = 'Authenticatiemechanisme';
@@ -88,64 +85,76 @@ $lang['defaultgroup'] = 'Standaardgroep';
$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_other'] = 'Andere akties (gescheiden door komma\'s)';
-$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['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['htmlok'] = 'Embedded HTML toestaan';
+$lang['phpok'] = 'Embedded PHP toestaan';
+$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'] = 'Media revisies activeren?';
+$lang['refcheck'] = 'Controleer verwijzingen naar media';
+$lang['refshow'] = 'Aantal te tonen mediaverwijzingen';
+$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 buiten';
+$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 e-mailnotificaties naar dit adres';
+$lang['registernotify'] = 'Stuur informatie over nieuw aangemelde gebruikers naar dit e-mailadres';
+$lang['mailfrom'] = 'E-mailadres voor automatische e-mail';
+$lang['mailprefix'] = 'Te gebruiken voorvoegsel voor onderwerp automatische email';
+$lang['htmlmail'] = 'Zend multipart HTML e-mail. Dit ziet er beter uit, maar is groter. Uitschakelen betekent e-mail in platte tekst.';
+$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_media'] = 'Welk type verandering moet in de XML feed worden weergegeven?';
$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['usedraft'] = 'Sla automatisch een concept op tijdens het wijzigen';
$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['cachetime'] = 'Maximum leeftijd voor cache (sec)';
-$lang['locktime'] = 'Maximum leeftijd voor lockbestanden (sec)';
-$lang['fetchsize'] = 'Maximum grootte (bytes) die fetch.php mag downloaden van buiten';
-$lang['notify'] = 'Stuur e-mailnotificaties naar dit adres';
-$lang['registernotify'] = 'Stuur informatie over nieuw aangemelde gebruikers naar dit e-mailadres';
-$lang['mailfrom'] = 'E-mailadres voor automatische e-mail';
-$lang['mailprefix'] = 'Te gebruiken voorvoegsel voor onderwerp automatische email';
$lang['gzip_output'] = 'Gebruik gzip Content-Encoding voor xhtml';
-$lang['gdlib'] = 'Versie GD Lib ';
-$lang['im_convert'] = 'Path naar ImageMagick\'s convert tool';
-$lang['jpg_quality'] = 'JPG compressiekwaliteit (0-100)';
-$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['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. Deze techniek werkt niet in IE7 en ouder! <code>400</code> tot <code>600</code> is een geschikte omvang. Stel de omvang in op <code>0</code> om deze functionaliteit uit te schakelen.';
-$lang['hidepages'] = 'Verberg deze pagina\'s (regular expressions)';
$lang['send404'] = 'Stuur "HTTP 404/Page Not Found" voor niet-bestaande pagina\'s';
-$lang['sitemap'] = 'Genereer Google sitemap (dagen)';
$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 <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> 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['rememberme'] = 'Permanente login cookie toestaan (onthoud mij)';
-$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['recent_days'] = 'Hoeveel recente wijzigingen bewaren (dagen)';
-$lang['rss_show_summary'] = 'XML feed samenvatting in titel weergeven';
-$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['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['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 connectie te maken met de proxy';
-$lang['proxy____except'] = 'Reguliere expressie om URL\'s te bepalen waarvoor de proxy overgeslaan moet worden.';
+$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['safemodehack'] = 'Safemode hack aanzetten';
$lang['ftp____host'] = 'FTP server voor safemode hack';
$lang['ftp____port'] = 'FTP port voor safemode hack';
@@ -185,7 +194,7 @@ $lang['xsendfile_o_0'] = 'niet gebruiken';
$lang['xsendfile_o_1'] = 'Eigen lighttpd header (voor release 1.5)';
$lang['xsendfile_o_2'] = 'Standaard X-Sendfile header';
$lang['xsendfile_o_3'] = 'Propritary Nginx X-Accel-Redirect header';
-$lang['showuseras_o_loginname'] = 'loginnaam';
+$lang['showuseras_o_loginname'] = 'Loginnaam';
$lang['showuseras_o_username'] = 'Volledige naam';
$lang['showuseras_o_email'] = 'E-mailadres (onherkenbaar gemaakt volgens mailguard-instelling)';
$lang['showuseras_o_email_link'] = 'E-mailadres als mailto: link';
diff --git a/lib/plugins/config/lang/no/lang.php b/lib/plugins/config/lang/no/lang.php
index ec97fe966..b01637dd1 100644
--- a/lib/plugins/config/lang/no/lang.php
+++ b/lib/plugins/config/lang/no/lang.php
@@ -43,8 +43,8 @@ $lang['_links'] = 'Innstillinger for lenker';
$lang['_media'] = 'Innstillinger for mediafiler';
$lang['_advanced'] = 'Avanserte innstillinger';
$lang['_network'] = 'Nettverksinnstillinger';
-$lang['_plugin_sufix'] = '&ndash; innstillinger for tillegg';
-$lang['_template_sufix'] = '&ndash; innstillinger for mal';
+$lang['_plugin_sufix'] = '– innstillinger for tillegg';
+$lang['_template_sufix'] = '– innstillinger for mal';
$lang['_msg_setting_undefined'] = 'Ingen innstillingsmetadata';
$lang['_msg_setting_no_class'] = 'Ingen innstillingsklasse';
$lang['_msg_setting_no_default'] = 'Ingen standard verdi';
diff --git a/lib/plugins/config/lang/pl/lang.php b/lib/plugins/config/lang/pl/lang.php
index 7ebe5ba92..8441722cd 100644
--- a/lib/plugins/config/lang/pl/lang.php
+++ b/lib/plugins/config/lang/pl/lang.php
@@ -14,6 +14,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['menu'] = 'Ustawienia';
$lang['error'] = 'Ustawienia nie zostały zapisane z powodu błędnych wartości, przejrzyj je i ponów próbę zapisu. <br/> Niepoprawne wartości są wyróżnione kolorem czerwonym.';
@@ -35,6 +36,8 @@ $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['_plugin_sufix'] = 'Wtyczki';
@@ -42,28 +45,29 @@ $lang['_template_sufix'] = 'Motywy';
$lang['_msg_setting_undefined'] = 'Brak danych o ustawieniu.';
$lang['_msg_setting_no_class'] = 'Brak kategorii ustawień.';
$lang['_msg_setting_no_default'] = 'Brak wartości domyślnej.';
-$lang['fmode'] = 'Tryb tworzenia pliku';
-$lang['dmode'] = 'Tryb tworzenia katalogu';
-$lang['lang'] = 'Język';
-$lang['basedir'] = 'Katalog główny';
-$lang['baseurl'] = 'Główny URL';
-$lang['savedir'] = 'Katalog z danymi';
-$lang['cookiedir'] = 'Ścieżka plików ciasteczek. Zostaw puste by użyć baseurl.';
-$lang['start'] = 'Tytuł strony początkowej';
$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['fullpath'] = 'Wyświetlanie pełnych ścieżek';
+$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['htmlok'] = 'Wstawki HTML';
-$lang['phpok'] = 'Wstawki PHP';
$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';
@@ -71,16 +75,8 @@ $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['refcheck'] = 'Sprawdzanie odwołań przed usunięciem pliku';
-$lang['refshow'] = 'Ilość pokazywanych odwołań do pliku';
-$lang['allowdebug'] = 'Debugowanie (niebezpieczne!)';
-$lang['mediarevisions'] = 'Włączyć wersjonowanie multimediów?';
-$lang['usewordblock'] = 'Blokowanie spamu na podstawie słów';
-$lang['indexdelay'] = 'Okres indeksowania w sekundach';
-$lang['relnofollow'] = 'Nagłówek rel="nofollow" dla odnośników zewnętrznych';
-$lang['mailguard'] = 'Utrudnianie odczytu adresów e-mail';
-$lang['iexssprotect'] = 'Wykrywanie złośliwego kodu JavaScript i HTML w plikach';
-$lang['showuseras'] = 'Sposób wyświetlania nazwy użytkownika, który ostatnio edytował stronę';
+$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';
@@ -89,58 +85,70 @@ $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_other'] = 'Inne akcje (oddzielone przecinkiem)';
-$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['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['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['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['htmlok'] = 'Wstawki HTML';
+$lang['phpok'] = 'Wstawki PHP';
+$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['refshow'] = 'Ilość pokazywanych odwołań do 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['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['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_media'] = 'Rodzaj zmian wyświetlanych w RSS';
$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['usedraft'] = 'Automatyczne zapisywanie szkicu podczas edycji';
$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['cachetime'] = 'Maksymalny wiek cache w sekundach';
-$lang['locktime'] = 'Maksymalny wiek blokad w sekundach';
-$lang['fetchsize'] = 'Maksymalny rozmiar pliku (w bajtach) jaki można pobrać z zewnątrz';
-$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['mailprefix'] = 'Prefiks tematu e-mail do automatycznych wiadomości';
$lang['gzip_output'] = 'Używaj kodowania GZIP dla zawartości XHTML';
-$lang['gdlib'] = 'Wersja biblioteki GDLib';
-$lang['im_convert'] = 'Ścieżka do programu imagemagick';
-$lang['jpg_quality'] = 'Jakość kompresji JPG (0-100)';
-$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['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. Technika ta nie działa w IE 7 i poniżej! <code>400</code> do <code>600</code> bajtów jest dobrą wartością. Ustaw <code>0</code> aby wyłączyć.';
-$lang['hidepages'] = 'Ukrywanie stron pasujących do wzorca (wyrażenie regularne)';
$lang['send404'] = 'Nagłówek "HTTP 404/Page Not Found" dla nieistniejących stron';
-$lang['sitemap'] = 'Okres generowania Google Sitemap (w dniach)';
$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: <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a>.';
$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['rememberme'] = 'Pozwól na ciasteczka automatycznie logujące (pamiętaj mnie)';
-$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['recent_days'] = 'Ilość ostatnich zmian (w dniach)';
-$lang['rss_show_summary'] = 'Podsumowanie w tytule';
-$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['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['proxy____host'] = 'Proxy - serwer';
$lang['proxy____port'] = 'Proxy - port';
$lang['proxy____user'] = 'Proxy - nazwa użytkownika';
diff --git a/lib/plugins/config/lang/ru/lang.php b/lib/plugins/config/lang/ru/lang.php
index 098cff534..84dce4a67 100644
--- a/lib/plugins/config/lang/ru/lang.php
+++ b/lib/plugins/config/lang/ru/lang.php
@@ -38,6 +38,7 @@ $lang['_anti_spam'] = 'Параметры блокировки спа
$lang['_editing'] = 'Параметры правки';
$lang['_links'] = 'Параметры ссылок';
$lang['_media'] = 'Параметры медиафайлов';
+$lang['_notifications'] = 'Параметры уведомлений';
$lang['_advanced'] = 'Тонкая настройка';
$lang['_network'] = 'Параметры сети';
$lang['_plugin_sufix'] = 'Параметры плагина';
@@ -45,28 +46,29 @@ $lang['_template_sufix'] = 'Параметры шаблона';
$lang['_msg_setting_undefined'] = 'Не найдены метаданные настроек.';
$lang['_msg_setting_no_class'] = 'Не найден класс настроек.';
$lang['_msg_setting_no_default'] = 'Не задано значение по умолчанию.';
-$lang['fmode'] = 'Права для создаваемых файлов';
-$lang['dmode'] = 'Права для создаваемых директорий';
-$lang['lang'] = 'Язык';
-$lang['basedir'] = 'Корневая директория (например, <code>/dokuwiki/</code>). Оставьте пустым для автоопределения.';
-$lang['baseurl'] = 'Корневой адрес (URL) (например, <code>http://www.yourserver.ru</code>). Оставьте пустым для автоопределения.';
-$lang['savedir'] = 'Директория для данных';
-$lang['cookiedir'] = 'Cookie директория. Оставьте пустым для автоопределения.';
-$lang['start'] = 'Имя стартовой страницы';
$lang['title'] = 'Название вики';
+$lang['start'] = 'Имя стартовой страницы';
+$lang['lang'] = 'Язык';
$lang['template'] = 'Шаблон';
$lang['tagline'] = 'Слоган (если поддерживается шаблоном)';
$lang['sidebar'] = 'Боковая панель, пустое поле отключает боковую панель.';
$lang['license'] = 'На условиях какой лицензии будет предоставляться содержимое вики?';
-$lang['fullpath'] = 'Полный путь к документу';
+$lang['savedir'] = 'Директория для данных';
+$lang['basedir'] = 'Корневая директория (например, <code>/dokuwiki/</code>). Оставьте пустым для автоопределения.';
+$lang['baseurl'] = 'Корневой адрес (URL) (например, <code>http://www.yourserver.ru</code>). Оставьте пустым для автоопределения.';
+$lang['cookiedir'] = 'Cookie директория. Оставьте пустым для автоопределения.';
+$lang['dmode'] = 'Права для создаваемых директорий';
+$lang['fmode'] = 'Права для создаваемых файлов';
+$lang['allowdebug'] = 'Включить отладку (отключите!)';
$lang['recent'] = 'Недавние изменения (кол-во)';
+$lang['recent_days'] = 'На сколько дней назад сохранять недавние изменения';
$lang['breadcrumbs'] = 'Вы посетили (кол-во)';
$lang['youarehere'] = 'Показывать «Вы находитесь здесь»';
+$lang['fullpath'] = 'Полный путь к документу';
$lang['typography'] = 'Типографские символы';
-$lang['htmlok'] = 'Разрешить HTML';
-$lang['phpok'] = 'Разрешить PHP';
$lang['dformat'] = 'Формат даты и времени';
$lang['signature'] = 'Шаблон подписи';
+$lang['showuseras'] = 'Что отображать при показе пользователя, редактировавшего страницу последним';
$lang['toptoclevel'] = 'Мин. уровень в содержании';
$lang['tocminheads'] = 'Мин. количество заголовков, при котором будет составлено содержание';
$lang['maxtoclevel'] = 'Макс. уровень в содержании';
@@ -74,16 +76,8 @@ $lang['maxseclevel'] = 'Макс. уровень для правки';
$lang['camelcase'] = 'Использовать ВикиРегистр для ссылок';
$lang['deaccent'] = 'Транслитерация в именах страниц';
$lang['useheading'] = 'Первый заголовок вместо имени';
-$lang['refcheck'] = 'Проверять ссылки на медиафайлы';
-$lang['refshow'] = 'Показывать ссылок на медиафайлы';
-$lang['allowdebug'] = 'Включить отладку (отключите!)';
-$lang['mediarevisions'] = 'Включение версий медиафайлов';
-$lang['usewordblock'] = 'Блокировать спам по ключевым словам';
-$lang['indexdelay'] = 'Задержка перед индексированием';
-$lang['relnofollow'] = 'rel="nofollow" для внешних ссылок';
-$lang['mailguard'] = 'Кодировать адреса электронной почты';
-$lang['iexssprotect'] = 'Проверять закачанные файлы на наличие потенциально опасного кода JavaScript или HTML';
-$lang['showuseras'] = 'Что отображать при показе пользователя, редактировавшего страницу последним';
+$lang['sneaky_index'] = 'По умолчанию, «ДокуВики» показывает в индексе страниц все пространства имён. Включение этой опции скроет пространства имён, для которых пользователь не имеет прав чтения. Это может привести к скрытию доступных вложенных пространств имён и потере функциональности индекса страниц при некоторых конфигурациях прав доступа.';
+$lang['hidepages'] = 'Скрыть страницы (рег. выражение)';
$lang['useacl'] = 'Использовать списки прав доступа';
$lang['autopasswd'] = 'Автогенерация паролей';
$lang['authtype'] = 'Механизм аутентификации';
@@ -92,58 +86,66 @@ $lang['defaultgroup'] = 'Группа по умолчанию';
$lang['superuser'] = 'Суперпользователь — группа или пользователь с полным доступом ко всем страницам и функциям администрирования, независимо от установок ACL. Перечень разделяйте запятыми: 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_other'] = 'Другие операции (через запятую)';
-$lang['sneaky_index'] = 'По умолчанию, «ДокуВики» показывает в индексе страниц все пространства имён. Включение этой опции скроет пространства имён, для которых пользователь не имеет прав чтения. Это может привести к скрытию доступных вложенных пространств имён и потере функциональности индекса страниц при некоторых конфигурациях прав доступа.';
$lang['auth_security_timeout'] = 'Интервал для безопасности авторизации (сек.)';
$lang['securecookie'] = 'Должны ли куки (cookies), выставленные через HTTPS, отправляться браузером только через HTTPS. Отключите эту опцию в случае, когда только логин вашей вики передаётся через SSL, а обычный просмотр осуществляется в небезопасном режиме.';
+$lang['remote'] = 'Включить систему API для подключений. Это позволит другим приложениям получить доступ к вики через XML-RPC или другие механизмы.';
+$lang['usewordblock'] = 'Блокировать спам по ключевым словам';
+$lang['relnofollow'] = 'rel="nofollow" для внешних ссылок';
+$lang['indexdelay'] = 'Задержка перед индексированием';
+$lang['mailguard'] = 'Кодировать адреса электронной почты';
+$lang['iexssprotect'] = 'Проверять закачанные файлы на наличие потенциально опасного кода JavaScript или HTML';
+$lang['usedraft'] = 'Автоматически сохранять черновик во время правки';
+$lang['htmlok'] = 'Разрешить HTML';
+$lang['phpok'] = 'Разрешить PHP';
+$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['refshow'] = 'Показывать ссылок на медиафайлы';
+$lang['gdlib'] = 'Версия LibGD';
+$lang['im_convert'] = 'Путь к ImageMagick';
+$lang['jpg_quality'] = 'Качество сжатия JPG (0–100). Значение по умолчанию — 70.';
+$lang['fetchsize'] = 'Максимальный размер файла (в байтах), который fetch.php может скачивать с внешнего источника';
+$lang['subscribers'] = 'Разрешить подписку на изменения';
+$lang['subscribe_time'] = 'Интервал рассылки подписок и сводок (сек.). Должен быть меньше, чем значение, указанное в recent_days.';
+$lang['notify'] = 'Электронный адрес для извещений';
+$lang['registernotify'] = 'Посылать информацию о новых зарегистрированных пользователях на этот электронный адрес';
+$lang['mailfrom'] = 'Электронный адрес вики (От:)';
+$lang['mailprefix'] = 'Префикс используемый для автоматического письма станет темой сообщений';
+$lang['sitemap'] = 'Число дней, через которое нужно создавать (обновлять) карту сайта для поисковиков (Гугл, Яндекс и др.)';
+$lang['rss_type'] = 'Тип RSS';
+$lang['rss_linkto'] = 'Ссылки в RSS';
+$lang['rss_content'] = 'Что отображать в строках XML-ленты?';
+$lang['rss_update'] = 'Интервал обновления XML-ленты (сек.)';
+$lang['rss_show_summary'] = 'Показывать краткую выдержку в заголовках XML-ленты';
$lang['updatecheck'] = 'Проверять наличие обновлений и предупреждений о безопасности? Для этого «ДокуВики» потребуется связываться с сайтом <a href="http://www.splitbrain.org/">splitbrain.org</a>.';
$lang['userewrite'] = 'Удобочитаемые адреса (URL)';
$lang['useslash'] = 'Использовать слэш';
-$lang['usedraft'] = 'Автоматически сохранять черновик во время правки';
$lang['sepchar'] = 'Разделитель слов в имени страницы';
$lang['canonical'] = 'Полные канонические адреса (URL)';
$lang['fnencode'] = 'Метод кодирования имён файлов, записанных не ASCII-символами.';
$lang['autoplural'] = 'Автоматическое мн. число';
$lang['compression'] = 'Метод сжатия для архивных файлов';
-$lang['cachetime'] = 'Время жизни кэш-файла (сек.)';
-$lang['locktime'] = 'Время блокировки страницы (сек.)';
-$lang['fetchsize'] = 'Максимальный размер файла (в байтах), который fetch.php может скачивать с внешнего источника';
-$lang['notify'] = 'Электронный адрес для извещений';
-$lang['registernotify'] = 'Посылать информацию о новых зарегистрированных пользователях на этот электронный адрес';
-$lang['mailfrom'] = 'Электронный адрес вики (От:)';
-$lang['mailprefix'] = 'Префикс используемый для автоматического письма станет темой сообщений';
$lang['gzip_output'] = 'Использовать gzip-сжатие для xhtml';
-$lang['gdlib'] = 'Версия LibGD';
-$lang['im_convert'] = 'Путь к ImageMagick';
-$lang['jpg_quality'] = 'Качество сжатия JPG (0–100). Значение по умолчанию — 70.';
-$lang['subscribers'] = 'Разрешить подписку на изменения';
-$lang['subscribe_time'] = 'Интервал рассылки подписок и сводок (сек.). Должен быть меньше, чем значение, указанное в recent_days.';
$lang['compress'] = 'Сжимать файлы CSS и javascript';
$lang['cssdatauri'] = 'Размер в байтах до которого изображения, указанные в CSS-файлах, должны быть встроены прямо в таблицу стилей, для уменьшения избычтоных HTTP-запросов. Этот метод не будет работать в IE версии 7 и ниже! Установка от <code>400</code> до <code>600</code> байт является хорошим показателем. Установите <code>0</code>, чтобы отключить.';
-$lang['hidepages'] = 'Скрыть страницы (рег. выражение)';
$lang['send404'] = 'Посылать «HTTP404/Page Not Found»';
-$lang['sitemap'] = 'Число дней, через которое нужно создавать (обновлять) карту сайта для поисковиков (Гугл, Яндекс и др.)';
$lang['broken_iua'] = 'Возможно, функция ignore_user_abort не работает в вашей системе? Это может привести к потере функциональности индексирования поиска. Эта проблема присутствует, например, в IIS+PHP/CGI. Для дополнительной информации смотрите <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">баг 852</a>.';
$lang['xsendfile'] = 'Используете заголовок X-Sendfile для загрузки файлов на веб-сервер? Ваш веб-сервер должен поддерживать это.';
$lang['renderer_xhtml'] = 'Обработчик основного (xhtml) вывода вики';
$lang['renderer__core'] = '%s (ядро dokuwiki)';
$lang['renderer__plugin'] = '%s (плагин)';
-$lang['rememberme'] = 'Разрешить перманентные куки (cookies) для входа («запомнить меня»)';
-$lang['rss_type'] = 'Тип RSS';
-$lang['rss_linkto'] = 'Ссылки в RSS';
-$lang['rss_content'] = 'Что отображать в строках XML-ленты?';
-$lang['rss_update'] = 'Интервал обновления XML-ленты (сек.)';
-$lang['recent_days'] = 'На сколько дней назад сохранять недавние изменения';
-$lang['rss_show_summary'] = 'Показывать краткую выдержку в заголовках XML-ленты';
-$lang['target____wiki'] = 'target для внутренних ссылок';
-$lang['target____interwiki'] = 'target для ссылок между вики';
-$lang['target____extern'] = 'target для внешних ссылок';
-$lang['target____media'] = 'target для ссылок на медиафайлы';
-$lang['target____windows'] = 'target для ссылок на сетевые каталоги';
$lang['proxy____host'] = 'proxy-адрес';
$lang['proxy____port'] = 'proxy-порт';
$lang['proxy____user'] = 'proxy-имя пользователя';
diff --git a/lib/plugins/config/lang/vi/lang.php b/lib/plugins/config/lang/vi/lang.php
new file mode 100644
index 000000000..2933d8875
--- /dev/null
+++ b/lib/plugins/config/lang/vi/lang.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Vietnamese language file
+ *
+ */
diff --git a/lib/plugins/config/lang/zh/lang.php b/lib/plugins/config/lang/zh/lang.php
index 5b7229c62..832dfe749 100644
--- a/lib/plugins/config/lang/zh/lang.php
+++ b/lib/plugins/config/lang/zh/lang.php
@@ -38,6 +38,8 @@ $lang['_anti_spam'] = '反垃圾邮件/评论设置';
$lang['_editing'] = '编辑设置';
$lang['_links'] = '链接设置';
$lang['_media'] = '媒体设置';
+$lang['_notifications'] = '通知设置';
+$lang['_syndication'] = '聚合设置';
$lang['_advanced'] = '高级设置';
$lang['_network'] = '网络设置';
$lang['_plugin_sufix'] = '插件设置';
@@ -45,26 +47,29 @@ $lang['_template_sufix'] = '模板设置';
$lang['_msg_setting_undefined'] = '设置的元数据不存在。';
$lang['_msg_setting_no_class'] = '设置的分类不存在。';
$lang['_msg_setting_no_default'] = '设置的默认值不存在。';
-$lang['fmode'] = '文件的创建模式';
-$lang['dmode'] = '文件夹的创建模式';
+$lang['title'] = '维基站点的标题';
+$lang['start'] = '开始页面的名称';
$lang['lang'] = '语言';
+$lang['template'] = '模版';
+$lang['tagline'] = '副标题 (如果模板支持此功能)';
+$lang['sidebar'] = '侧边栏的页面名称 (如果模板支持此功能),留空以禁用侧边栏';
+$lang['license'] = '您愿意让你贡献的内容在何种许可方式下发布?';
+$lang['savedir'] = '保存数据的目录';
$lang['basedir'] = '根目录';
$lang['baseurl'] = '根路径(URL)';
-$lang['savedir'] = '保存数据的目录';
$lang['cookiedir'] = 'Cookie 路径。留空以使用 baseurl。';
-$lang['start'] = '开始页面的名称';
-$lang['title'] = '维基站点的标题';
-$lang['template'] = '模版';
-$lang['license'] = '您愿意让你贡献的内容在何种许可方式下发布?';
-$lang['fullpath'] = '在页面底部显示完整路径';
+$lang['dmode'] = '文件夹的创建模式';
+$lang['fmode'] = '文件的创建模式';
+$lang['allowdebug'] = '允许调试 <b>如果您不需要调试,请勿勾选!</b>';
$lang['recent'] = '最近更新';
+$lang['recent_days'] = '保留多少天的最近更改(天)';
$lang['breadcrumbs'] = '显示“足迹”的数量';
$lang['youarehere'] = '显示“您在这里”';
+$lang['fullpath'] = '在页面底部显示完整路径';
$lang['typography'] = '进行字符替换';
-$lang['htmlok'] = '允许嵌入式 HTML';
-$lang['phpok'] = '允许嵌入式 PHP';
$lang['dformat'] = '日期格式(参见 PHP 的 <a href="http://www.php.net/strftime">strftime</a> 功能)';
$lang['signature'] = '签名样式';
+$lang['showuseras'] = '显示用户为';
$lang['toptoclevel'] = '目录的最顶层';
$lang['tocminheads'] = '头条数目的最小数目,这将用于决定是否创建目录列表(TOC)';
$lang['maxtoclevel'] = '目录的最多层次';
@@ -72,15 +77,8 @@ $lang['maxseclevel'] = '段落编辑的最多层次';
$lang['camelcase'] = '对链接使用 CamelCase';
$lang['deaccent'] = '清理页面名称';
$lang['useheading'] = '使用“标题 H1”作为页面名称';
-$lang['refcheck'] = '检查媒体与页面的挂钩情况';
-$lang['refshow'] = '显示媒体与页面挂钩情况的数量';
-$lang['allowdebug'] = '允许调试 <b>如果您不需要调试,请勿勾选!</b>';
-$lang['usewordblock'] = '根据 wordlist 阻止垃圾评论';
-$lang['indexdelay'] = '构建索引前的时间延滞(秒)';
-$lang['relnofollow'] = '对外部链接使用 rel="nofollow" 标签';
-$lang['mailguard'] = '弄乱邮件地址(保护用户的邮件地址)';
-$lang['iexssprotect'] = '检验上传的文件以避免可能存在的恶意 JavaScript 或 HTML 代码';
-$lang['showuseras'] = '显示用户为';
+$lang['sneaky_index'] = '默认情况下,DokuWiki 在索引页会显示所有 namespace。启用该选项能隐藏那些用户没有权限阅读的页面。但也可能将用户能够阅读的子页面一并隐藏。这有可能导致在特定 ACL 设置下,索引功能不可用。';
+$lang['hidepages'] = '隐藏匹配的界面(正则表达式)';
$lang['useacl'] = '使用访问控制列表(ACL)';
$lang['autopasswd'] = '自动生成密码';
$lang['authtype'] = '认证后台管理方式';
@@ -89,59 +87,71 @@ $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_other'] = '其他功能(用英文逗号分隔)';
-$lang['sneaky_index'] = '默认情况下,DokuWiki 在索引页会显示所有 namespace。启用该选项能隐藏那些用户没有权限阅读的页面。但也可能将用户能够阅读的子页面一并隐藏。这有可能导致在特定 ACL 设置下,索引功能不可用。';
$lang['auth_security_timeout'] = '认证安全超时(秒)';
$lang['securecookie'] = '要让浏览器须以HTTPS方式传送在HTTPS会话中设置的cookies吗?请只在登录过程为SSL加密而浏览维基为明文的情况下打开此选项。';
+$lang['remote'] = '激活远程 API 系统。这允许其他程序通过 XML-RPC 或其他机制来访问维基。';
+$lang['remoteuser'] = '将远程 API 的访问权限限制在指定的组或用户中,以逗号分隔。留空则允许任何人访问。';
+$lang['usewordblock'] = '根据 wordlist 阻止垃圾评论';
+$lang['relnofollow'] = '对外部链接使用 rel="nofollow" 标签';
+$lang['indexdelay'] = '构建索引前的时间延滞(秒)';
+$lang['mailguard'] = '弄乱邮件地址(保护用户的邮件地址)';
+$lang['iexssprotect'] = '检验上传的文件以避免可能存在的恶意 JavaScript 或 HTML 代码';
+$lang['usedraft'] = '编辑时自动保存一份草稿';
+$lang['htmlok'] = '允许嵌入式 HTML';
+$lang['phpok'] = '允许嵌入式 PHP';
+$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['refshow'] = '显示媒体与页面挂钩情况的数量';
+$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['mailprefix'] = '自动发送邮件时使用的邮件地址前缀';
+$lang['htmlmail'] = '发送更加美观,但体积更大的 HTML 多部分邮件。禁用则发送纯文本邮件。';
+$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_media'] = '在 XML 源中应该列出何种类型的更改?';
$lang['updatecheck'] = '自动检查更新并接收安全警告吗?开启该功能后 DokuWiki 将自动访问 splitbrain.org。';
$lang['userewrite'] = '使用更整洁的 URL';
$lang['useslash'] = '在 URL 中使用斜杠作为命名空间的分隔符';
-$lang['usedraft'] = '编辑时自动保存一份草稿';
$lang['sepchar'] = '页面名称中的单词分隔符';
$lang['canonical'] = '使用完全标准的 URL';
$lang['fnencode'] = '非 ASCII 文件名的编码方法。';
$lang['autoplural'] = '在链接中检查多种格式';
$lang['compression'] = 'attic 文件的压缩方式';
-$lang['cachetime'] = '缓存的最长时间(秒)';
-$lang['locktime'] = '独有编辑权/文件锁定的最长时间(秒)';
-$lang['fetchsize'] = 'fetch.php 能从外部下载的最大文件大小(字节)';
-$lang['notify'] = '发送更改通知给这个邮件地址';
-$lang['registernotify'] = '发送新注册用户的信息给这个邮件地址';
-$lang['mailfrom'] = '自动发送邮件时使用的邮件地址';
-$lang['mailprefix'] = '自动发送邮件时使用的邮件地址前缀';
$lang['gzip_output'] = '对 xhtml 使用 gzip 内容编码';
-$lang['gdlib'] = 'GD 库版本';
-$lang['im_convert'] = 'ImageMagick 转换工具的路径';
-$lang['jpg_quality'] = 'JPG 压缩质量(0-100)';
-$lang['subscribers'] = '启用页面订阅支持';
-$lang['subscribe_time'] = '订阅列表和摘要发送的时间间隔(秒);这应当小于指定的最近更改保留时间(recent_days)。
-';
$lang['compress'] = '使 CSS 和 javascript 的输出更紧密';
$lang['cssdatauri'] = '字节数。CSS 文件引用的图片若小于该字节,则被直接嵌入样式表中来减少 HTTP 请求头的开销。这个技术在 IE 中不起作用。<code>400</code> 到 <code>600</code> 字节是不错的值。设置为 <code>0</code> 则禁用。';
-$lang['hidepages'] = '隐藏匹配的界面(正则表达式)';
$lang['send404'] = '发送 "HTTP 404/页面没有找到" 错误信息给不存在的页面';
-$lang['sitemap'] = '生成 Google sitemap(天)';
$lang['broken_iua'] = 'ignore_user_abort 功能失效了?这有可能导致搜索索引不可用。IIS+PHP/CGI 已损坏。请参阅 <a href="http://bugs.splitbrain.org/?do=details&amp;task_id=852">Bug 852</a> 获取更多信息。';
$lang['xsendfile'] = '使用 X-Sendfile 头让服务器发送状态文件?您的服务器需要支持该功能。';
$lang['renderer_xhtml'] = '主维基页面 (xhtml) 输出使用的渲染';
$lang['renderer__core'] = '%s(DokuWiki 内核)';
$lang['renderer__plugin'] = '%s(插件)';
-$lang['rememberme'] = '允许在本地机长期保留登录cookies信息(记住我)';
-$lang['rss_type'] = 'XML feed 类型';
-$lang['rss_linkto'] = 'XML feed 链接到';
-$lang['rss_content'] = 'XML feed 项目中显示什么呢?';
-$lang['rss_update'] = 'XML feed 升级间隔(秒)';
-$lang['recent_days'] = '保留多少天的最近更改(天)';
-$lang['rss_show_summary'] = 'XML feed 在标题中显示摘要';
-$lang['target____wiki'] = '内部链接的目标窗口';
-$lang['target____interwiki'] = 'Interwiki 链接的目标窗口';
-$lang['target____extern'] = '外部链接的目标窗口';
-$lang['target____media'] = '媒体文件链接的目标窗口';
-$lang['target____windows'] = 'Windows 链接的目标窗口';
+$lang['dnslookups'] = 'Dokuwiki 将会查询用户编辑页面的远程 IP 地址的主机名。如果您的 DNS 服务器比较缓慢或者不工作,或者您不想要这个功能,请禁用此选项。';
$lang['proxy____host'] = '代理服务器的名称';
$lang['proxy____port'] = '代理服务器的端口';
$lang['proxy____user'] = '代理服务器的用户名';
diff --git a/lib/plugins/config/settings/config.class.php b/lib/plugins/config/settings/config.class.php
index 1cdab607f..29d21f8a3 100644
--- a/lib/plugins/config/settings/config.class.php
+++ b/lib/plugins/config/settings/config.class.php
@@ -156,7 +156,7 @@ if (!class_exists('configuration')) {
}else{
$contents = '';
}
- $pattern = '/\$'.$this->_name.'\[[\'"]([^=]+)[\'"]\] ?= ?(.*?);(?=[^;]*(?:\$'.$this->_name.'|@include|$))/s';
+ $pattern = '/\$'.$this->_name.'\[[\'"]([^=]+)[\'"]\] ?= ?(.*?);(?=[^;]*(?:\$'.$this->_name.'|$))/s';
$matches=array();
preg_match_all($pattern,$contents,$matches,PREG_SET_ORDER);
@@ -452,8 +452,8 @@ if (!class_exists('setting')) {
function _out_key($pretty=false,$url=false) {
if($pretty){
- $out = str_replace(CM_KEYMARKER,"&raquo;",$this->_key);
- if ($url && !strstr($out,'&raquo;')) {//provide no urls for plugins, etc.
+ $out = str_replace(CM_KEYMARKER,"»",$this->_key);
+ if ($url && !strstr($out,'»')) {//provide no urls for plugins, etc.
if ($out == 'start') //one exception
return '<a href="http://www.dokuwiki.org/config:startpage">'.$out.'</a>';
else
diff --git a/lib/plugins/plugin/lang/da/lang.php b/lib/plugins/plugin/lang/da/lang.php
index 841d246df..d1deb6310 100644
--- a/lib/plugins/plugin/lang/da/lang.php
+++ b/lib/plugins/plugin/lang/da/lang.php
@@ -11,6 +11,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['menu'] = 'Håndter udvidelser';
$lang['download'] = 'Hent og tilføj ny udvidelse';
@@ -56,3 +57,4 @@ $lang['enabled'] = 'Udvidelsen %s blev aktiveret.';
$lang['notenabled'] = 'Udvidelsen %s kunne ikke aktiveres. Kontroller filtilladelser.';
$lang['disabled'] = 'Udvidelsen %s blev ikke aktiveret.';
$lang['notdisabled'] = 'Udvidelsen %s kunne ikke aktiveres. Kontroller filtilladelser.';
+$lang['packageinstalled'] = 'Plugin pakke (%d plugin(s): %s) installeret korrekt.';
diff --git a/lib/plugins/plugin/lang/fa/lang.php b/lib/plugins/plugin/lang/fa/lang.php
index 8f3fb8a41..dbfe9ef9a 100644
--- a/lib/plugins/plugin/lang/fa/lang.php
+++ b/lib/plugins/plugin/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['menu'] = 'مدیریت افزونه‌ها';
$lang['download'] = 'دریافت و نصب افزونه';
diff --git a/lib/plugins/plugin/lang/it/lang.php b/lib/plugins/plugin/lang/it/lang.php
index e675c5530..3994948a0 100644
--- a/lib/plugins/plugin/lang/it/lang.php
+++ b/lib/plugins/plugin/lang/it/lang.php
@@ -13,6 +13,7 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
*/
$lang['menu'] = 'Gestione Plugin';
$lang['download'] = 'Scarica e installa un nuovo plugin';
@@ -58,3 +59,4 @@ $lang['enabled'] = 'Plugin %s abilitato.';
$lang['notenabled'] = 'Impossibile abilitare il plugin %s, verifica i permessi dei file.';
$lang['disabled'] = 'Plugin %s disabilitato.';
$lang['notdisabled'] = 'Impossibile disabilitare il plugin %s, verifica i permessi dei file.';
+$lang['packageinstalled'] = 'Pacchetto plugin (%d plugin(s): %s) installato con successo.';
diff --git a/lib/plugins/plugin/lang/ko/admin_plugin.txt b/lib/plugins/plugin/lang/ko/admin_plugin.txt
index 22ce0e6e6..b553d622b 100644
--- a/lib/plugins/plugin/lang/ko/admin_plugin.txt
+++ b/lib/plugins/plugin/lang/ko/admin_plugin.txt
@@ -1,5 +1,5 @@
====== 플러그인 관리 ======
-이 페이지에서 Dokuwiki[[doku>plugins|plugins]]에 관련된 모든 관리 작업을 합니다. 플러그인을 다운로드하거나 설치하기 위해서 웹서버가 플러그인 디렉토리에 대해 쓰기 권한을 가지고 있어야 합니다.
+이 페이지에서 Dokuwiki [[doku>plugins|플러그인]]에 관련된 모든 관리 작업을 합니다. 플러그인을 다운로드하거나 설치하기 위해서는 웹 서버가 플러그인 디렉토리에 대해 쓰기 권한을 가지고 있어야 합니다.
diff --git a/lib/plugins/plugin/lang/ko/lang.php b/lib/plugins/plugin/lang/ko/lang.php
index b15b377a6..4fc6fd1d9 100644
--- a/lib/plugins/plugin/lang/ko/lang.php
+++ b/lib/plugins/plugin/lang/ko/lang.php
@@ -9,49 +9,50 @@
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
* @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['menu'] = '플러그인 관리자';
-$lang['download'] = '새로운 플러그인 다운로드 및 설치';
-$lang['manage'] = '이미 설치된 플러그인들';
+$lang['download'] = '새 플러그인 다운로드 및 설치';
+$lang['manage'] = '이미 설치한 플러그인';
$lang['btn_info'] = '정보';
-$lang['btn_update'] = '갱신';
+$lang['btn_update'] = '업데이트';
$lang['btn_delete'] = '삭제';
$lang['btn_settings'] = '설정';
$lang['btn_download'] = '다운로드';
$lang['btn_enable'] = '저장';
$lang['url'] = 'URL';
-$lang['installed'] = '설치된:';
-$lang['lastupdate'] = '가장 최근에 갱신된:';
-$lang['source'] = '소스:';
-$lang['unknown'] = '알 수 없는';
-$lang['updating'] = '갱신 중 ...';
-$lang['updated'] = '%s 플러그인이 성공적으로 갱신되었습니다.';
-$lang['updates'] = '다음 플러그인들이 성공적으로 갱신되었습니다:';
-$lang['update_none'] = '갱신 가능한 플러그인이 없습니다.';
+$lang['installed'] = '설치됨:';
+$lang['lastupdate'] = '가장 나중에 업데이트됨:';
+$lang['source'] = '내용:';
+$lang['unknown'] = '알 수 없음';
+$lang['updating'] = '업데이트 중 ...';
+$lang['updated'] = '%s 플러그인을 성공적으로 업데이트했습니다';
+$lang['updates'] = '다음 플러그인을 성공적으로 업데이트했습니다';
+$lang['update_none'] = '업데이트를 찾을 수 없습니다.';
$lang['deleting'] = '삭제 중 ...';
$lang['deleted'] = '%s 플러그인이 삭제되었습니다.';
$lang['downloading'] = '다운로드 중 ...';
$lang['downloaded'] = '%s 플러그인이 성공적으로 설치되었습니다.';
-$lang['downloads'] = '다음 플러그인들이 성공적으로 설치되었습니다:';
-$lang['download_none'] = '플러그인이 없거나 다운로드/설치 중에 알수 없는 문제가 발생했습니다.';
+$lang['downloads'] = '다음 플러그인이 성공적으로 설치되었습니다:';
+$lang['download_none'] = '플러그인이 없거나 다운로드 또는 설치 중에 알 수 없는 문제가 발생했습니다.';
$lang['plugin'] = '플러그인:';
-$lang['components'] = '콤퍼넌트들';
-$lang['noinfo'] = '이 플러그인은 어떤 정보도 없습니다. 유효한 플러그인이 아닐 지도 모릅니다.';
+$lang['components'] = '구성 요소';
+$lang['noinfo'] = '이 플러그인은 어떤 정보도 없습니다. 잘못된 플러그인일 수 있습니다.';
$lang['name'] = '이름:';
$lang['date'] = '날짜:';
-$lang['type'] = '타입:';
+$lang['type'] = '종류:';
$lang['desc'] = '설명:';
-$lang['author'] = '제작자:';
+$lang['author'] = '만든이:';
$lang['www'] = '웹:';
$lang['error'] = '알 수 없는 문제가 발생했습니다.';
$lang['error_download'] = '플러그인 파일을 다운로드 할 수 없습니다: %s';
-$lang['error_badurl'] = '잘못된 URL같습니다. - URL에서 파일 이름을 알 수 없습니다.';
+$lang['error_badurl'] = '잘못된 URL 같습니다 - URL에서 파일 이름을 알 수 없습니다.';
$lang['error_dircreate'] = '다운로드를 받기 위한 임시 디렉토리를 만들 수 없습니다.';
-$lang['error_decompress'] = '플러그인 매니저가 다운로드 받은 파일을 압축해제할 수 없습니다.잘못 다운로드 받았을 수도 있으니 다시 한번 시도해보기 바랍니다; 압축 포맷을 알 수 없는 경우에는 다운로드 후 수동으로 직접 설치하기 바랍니다.';
-$lang['error_copy'] = '플러그인 설치하는 동안 파일 복사 에러가 발생했습니다. <em>%s</em>: 디스크가 꽉 찼거나 파일 접근 권한이 잘못된 경우입니다. 플러그인 설치가 부분적으로만 이루어졌을 것입니다.설치가 불완전합니다.';
-$lang['error_delete'] = '<em>%s</em> 플러그인 삭제 도중 에러가 발생했습니다. 대부분의 경우, 불완전한 파일이거나 디렉토리 접근 권한이 잘못된 경우입니다.';
-$lang['enabled'] = '%s 플러그인을 켰습니다.';
-$lang['notenabled'] = '%s 플러그인을 킬 수 없습니다. 파일 권한을 확인하십시오.';
-$lang['disabled'] = '%s 플러그인을 껐습니다.';
-$lang['notdisabled'] = '%s 플러그인을 끌 수 없습니다. 파일 권한을 확인하십시오.';
-$lang['packageinstalled'] = '플러그인 패키지(%d 개의 플러그인: %s)가 성공적으로 설치되었습니다.';
+$lang['error_decompress'] = '플러그인 관리자가 다운로드 받은 파일을 압축을 풀 수 없습니다. 잘못 다운로드 받았을 수도 있으니 다시 한번 시도해보기 바랍니다. 또는 압축 포맷을 알 수 없는 경우에는 다운로드한 후 수동으로 직접 설치하기 바랍니다.';
+$lang['error_copy'] = '플러그인을 설치하는 동안 파일 복사하는 데 오류가 발생했습니다. <em>%s</em>: 디스크가 꽉 찼거나 파일 접근 권한이 잘못된 경우입니다. 플러그인 설치가 부분적으로만 이루어졌을 것입니다. 설치가 불완전합니다.';
+$lang['error_delete'] = '<em>%s</em> 플러그인을 삭제하는 동안 오류가 발생했습니다. 대부분의 경우 불완전한 파일이거나 디렉토리 접근 권한이 잘못된 경우입니다.';
+$lang['enabled'] = '%s 플러그인을 활성화했습니다.';
+$lang['notenabled'] = '%s 플러그인을 활성화할 수 없습니다. 파일 권한을 확인하십시오.';
+$lang['disabled'] = '%s 플러그인을 비활성화했습니다.';
+$lang['notdisabled'] = '%s 플러그인을 비활성화할 수 없습니다. 파일 권한을 확인하십시오.';
+$lang['packageinstalled'] = '플러그인 패키지(플러그인 %d개: %s)가 성공적으로 설치되었습니다.';
diff --git a/lib/plugins/plugin/lang/pl/lang.php b/lib/plugins/plugin/lang/pl/lang.php
index 02459f1de..1d3bbbc03 100644
--- a/lib/plugins/plugin/lang/pl/lang.php
+++ b/lib/plugins/plugin/lang/pl/lang.php
@@ -14,6 +14,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['menu'] = 'Menadżer wtyczek';
$lang['download'] = 'Ściągnij i zainstaluj nową wtyczkę';
diff --git a/lib/plugins/plugin/lang/vi/lang.php b/lib/plugins/plugin/lang/vi/lang.php
new file mode 100644
index 000000000..2933d8875
--- /dev/null
+++ b/lib/plugins/plugin/lang/vi/lang.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Vietnamese language file
+ *
+ */
diff --git a/lib/plugins/popularity/lang/da/lang.php b/lib/plugins/popularity/lang/da/lang.php
index 325fd6568..bbf2a1ab4 100644
--- a/lib/plugins/popularity/lang/da/lang.php
+++ b/lib/plugins/popularity/lang/da/lang.php
@@ -9,6 +9,12 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['name'] = 'Tilbagemelding om popularitet (vil måske tage en del tid at indlæse)';
$lang['submit'] = 'Send data';
+$lang['autosubmit'] = 'Automatisk sende data en gang om måneden';
+$lang['submissionFailed'] = 'Dataene kunne ikke sendes pga. følgende fejl:';
+$lang['submitDirectly'] = 'Du kan sende dataene manuelt ved at sende følgende formular.';
+$lang['autosubmitError'] = 'Den sidste automatiske fremsendelse fejlede pga. følgende fejl:';
+$lang['lastSent'] = 'Dataene er blevet sendt.';
diff --git a/lib/plugins/popularity/lang/da/submitted.txt b/lib/plugins/popularity/lang/da/submitted.txt
new file mode 100644
index 000000000..7d7d5429c
--- /dev/null
+++ b/lib/plugins/popularity/lang/da/submitted.txt
@@ -0,0 +1,3 @@
+====== Popularitetsfeeback ======
+
+Dataene er blevet sendt. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/fa/lang.php b/lib/plugins/popularity/lang/fa/lang.php
index 70c65f1b3..600e68077 100644
--- a/lib/plugins/popularity/lang/fa/lang.php
+++ b/lib/plugins/popularity/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['name'] = 'بازخورد محبوبیت (ممکن است اندکی زمان ببرد)';
$lang['submit'] = 'ارسال اطلاعات';
diff --git a/lib/plugins/popularity/lang/it/lang.php b/lib/plugins/popularity/lang/it/lang.php
index a7852f22c..9bf4ca8c6 100644
--- a/lib/plugins/popularity/lang/it/lang.php
+++ b/lib/plugins/popularity/lang/it/lang.php
@@ -9,6 +9,7 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
*/
$lang['name'] = 'Raccolta dati sul wiki (può impiegare del tempo per caricarsi)';
$lang['submit'] = 'Invia dati';
diff --git a/lib/plugins/popularity/lang/ko/intro.txt b/lib/plugins/popularity/lang/ko/intro.txt
index e979b71d5..0af7ee2cc 100644
--- a/lib/plugins/popularity/lang/ko/intro.txt
+++ b/lib/plugins/popularity/lang/ko/intro.txt
@@ -1,9 +1,9 @@
====== 인기도 조사 ======
-설치된 위키의 익명 정보를 DokuWiki 개발자들에게 보냅니다. 이 기능은 DokuWiki가 실제 사용자들에게 어떻게 사용되는지 DokuWiki 개발자들에게 알려줌으로써 이 후 개발 시 참고가 됩니다.
+설치된 위키의 익명 정보를 DokuWiki 개발자에게 보냅니다. 이 [[doku>popularity|기능]]은 DokuWiki가 실제 사용자에게 어떻게 사용되는지 DokuWiki 개발자에게 알려줌으로써 이 후 개발 시 참고가 됩니다.
설치된 위키가 커짐에 따라서 이 과정을 반복할 필요가 있습니다. 반복된 데이타는 익명 ID로 구별되어집니다.
-전송 데이타는 설치 DokuWiki 버전, 페이지와 파일 수, 크기, 설치 플러그인, 설치 PHP 정보등을 포함하고 있습니다.
+전송 데이타는 설치 DokuWiki 버전, 문서와 파일 수, 크기, 설치 플러그인, 설치 PHP 정보등을 포함하고 있습니다.
-실제 보내질 자료는 아래와 같습니다. 정보를 보내려면 "자료 보내기" 버튼을 클릭합니다.
+실제 보내질 자료는 아래와 같습니다. 정보를 보내려면 "자료 보내기" 버튼을 클릭합니다. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/ko/lang.php b/lib/plugins/popularity/lang/ko/lang.php
index 01bc51044..5e6966402 100644
--- a/lib/plugins/popularity/lang/ko/lang.php
+++ b/lib/plugins/popularity/lang/ko/lang.php
@@ -8,11 +8,12 @@
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
* @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['name'] = '인기도 조사 (불러오는데 시간이 걸릴 수 있습니다.)';
$lang['submit'] = '자료 보내기';
$lang['autosubmit'] = '자료를 자동으로 매달 한번씩 보내기';
-$lang['submissionFailed'] = '다음과 같은 이유로 자료 전송에 실패했습니다 :';
+$lang['submissionFailed'] = '다음과 같은 이유로 자료 전송에 실패했습니다:';
$lang['submitDirectly'] = '아래의 양식에 맞춰 수동으로 작성된 자료를 보낼 수 있습니다';
-$lang['autosubmitError'] = '다음과 같은 이유로 자동 자료 전송에 실패했습니다 :';
+$lang['autosubmitError'] = '다음과 같은 이유로 자동 자료 전송에 실패했습니다:';
$lang['lastSent'] = '자료가 전송되었습니다';
diff --git a/lib/plugins/popularity/lang/ko/submitted.txt b/lib/plugins/popularity/lang/ko/submitted.txt
index e8b434dc5..12f0efe45 100644
--- a/lib/plugins/popularity/lang/ko/submitted.txt
+++ b/lib/plugins/popularity/lang/ko/submitted.txt
@@ -1,3 +1,3 @@
====== 인기도 조사 ======
-자료 전송이 성공적으로 완료되었습니다 \ No newline at end of file
+자료 전송이 성공적으로 완료되었습니다. \ No newline at end of file
diff --git a/lib/plugins/popularity/lang/pl/lang.php b/lib/plugins/popularity/lang/pl/lang.php
index 64d772d54..76a9464bd 100644
--- a/lib/plugins/popularity/lang/pl/lang.php
+++ b/lib/plugins/popularity/lang/pl/lang.php
@@ -12,6 +12,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['name'] = 'Informacja o popularności (ładowanie może zająć dłuższą chwilę)';
$lang['submit'] = 'Wyślij dane';
diff --git a/lib/plugins/popularity/lang/vi/lang.php b/lib/plugins/popularity/lang/vi/lang.php
new file mode 100644
index 000000000..2933d8875
--- /dev/null
+++ b/lib/plugins/popularity/lang/vi/lang.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Vietnamese language file
+ *
+ */
diff --git a/lib/plugins/revert/admin.php b/lib/plugins/revert/admin.php
index 2aaf1395f..ff5fa69ba 100644
--- a/lib/plugins/revert/admin.php
+++ b/lib/plugins/revert/admin.php
@@ -159,7 +159,7 @@ class admin_plugin_revert extends DokuWiki_Admin_Plugin {
echo '</a> ';
echo html_wikilink(':'.$recent['id'],(useHeading('navigation'))?NULL:$recent['id']);
- echo ' &ndash; '.htmlspecialchars($recent['sum']);
+ echo ' – '.htmlspecialchars($recent['sum']);
echo ' <span class="user">';
echo $recent['user'].' '.$recent['ip'];
diff --git a/lib/plugins/revert/lang/da/lang.php b/lib/plugins/revert/lang/da/lang.php
index c94366638..a76541a78 100644
--- a/lib/plugins/revert/lang/da/lang.php
+++ b/lib/plugins/revert/lang/da/lang.php
@@ -9,6 +9,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['menu'] = 'Gendannelsesstyring';
$lang['filter'] = 'Søg efter uønskede sider';
diff --git a/lib/plugins/revert/lang/fa/lang.php b/lib/plugins/revert/lang/fa/lang.php
index 02d2aabd2..34a5c430e 100644
--- a/lib/plugins/revert/lang/fa/lang.php
+++ b/lib/plugins/revert/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['menu'] = 'مدیریت برگشت‌ها';
$lang['filter'] = 'جستجوی صفحات اسپم شده';
diff --git a/lib/plugins/revert/lang/it/lang.php b/lib/plugins/revert/lang/it/lang.php
index 79565655b..a0b676d77 100644
--- a/lib/plugins/revert/lang/it/lang.php
+++ b/lib/plugins/revert/lang/it/lang.php
@@ -10,6 +10,7 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
*/
$lang['menu'] = 'Gestore di ripristini';
$lang['filter'] = 'Cerca pagine con spam';
diff --git a/lib/plugins/revert/lang/ko/intro.txt b/lib/plugins/revert/lang/ko/intro.txt
index a0164dc4f..30813fe49 100644
--- a/lib/plugins/revert/lang/ko/intro.txt
+++ b/lib/plugins/revert/lang/ko/intro.txt
@@ -1,3 +1,3 @@
====== 복구 관리자 ======
-스팸 공격으로 부터 자동으로 복구하는데 이페이지는 도움이 될 수 있습니다. 스팸 공격받은 페이지 목록을 찾으려면 문자열을 입력하기 바랍니다(예. 스팸 URL), 그 후 검색된 페이지들이 스팸 공격받았는지 확인하고 복구합니다.
+스팸 공격으로 부터 자동으로 복구하는데 이 페이지가 도움이 될 수 있습니다. 스팸 공격받은 문서 목록을 찾으려면 문자열을 입력하기 바랍니다 (예를 들어 스팸 URL), 그 후 찾은 문서가 스팸 공격을 받았는지 확인하고 복구합니다.
diff --git a/lib/plugins/revert/lang/ko/lang.php b/lib/plugins/revert/lang/ko/lang.php
index da689c788..90cba9bce 100644
--- a/lib/plugins/revert/lang/ko/lang.php
+++ b/lib/plugins/revert/lang/ko/lang.php
@@ -8,13 +8,14 @@
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
* @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['menu'] = '복구 관리자';
-$lang['filter'] = '스팸 페이지 검색 ';
-$lang['revert'] = '선택 페이지들 복구';
-$lang['reverted'] = '%s를 이전 버전 %s 으로 복구';
+$lang['filter'] = '스팸 문서 찾기';
+$lang['revert'] = '선택한 문서 복구';
+$lang['reverted'] = '%s 버전을 %s 버전으로 복구';
$lang['removed'] = '%s 삭제';
-$lang['revstart'] = '복구 작업을 시작합니다. 오랜 시간이 걸릴 수 있습니다. 완료되기 전에 스크립트 time out이 발생한다면 더 작은 작업들로 나누어서 복구하기 바랍니다. ';
+$lang['revstart'] = '복구 작업을 시작합니다. 오랜 시간이 걸릴 수 있습니다. 완료되기 전에 스크립트 시간 초과가 발생한다면 더 작은 작업으로 나누어서 복구하기 바랍니다.';
$lang['revstop'] = '복구 작업이 성공적으로 끝났습니다.';
-$lang['note1'] = '주의: 대소문자 구별하여 검색합니다.';
-$lang['note2'] = '주의: 이 페이지는 스팸 단어 <i>%s</i>를 포함하지 않은 가장 최근 과거 문서 버전으로 복구됩니다. ';
+$lang['note1'] = '참고: 대소문자 구별하여 찾습니다.';
+$lang['note2'] = '참고: 이 문서는 <i>%s</i> 스팸 단어를 포함하지 않은 최근 이전 버전으로 복구됩니다. ';
diff --git a/lib/plugins/revert/lang/pl/lang.php b/lib/plugins/revert/lang/pl/lang.php
index 30ab60fda..462841292 100644
--- a/lib/plugins/revert/lang/pl/lang.php
+++ b/lib/plugins/revert/lang/pl/lang.php
@@ -11,6 +11,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['menu'] = 'Menadżer przywracania';
$lang['filter'] = 'Wyszukaj uszkodzone strony';
diff --git a/lib/plugins/revert/lang/vi/lang.php b/lib/plugins/revert/lang/vi/lang.php
new file mode 100644
index 000000000..2933d8875
--- /dev/null
+++ b/lib/plugins/revert/lang/vi/lang.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Vietnamese language file
+ *
+ */
diff --git a/lib/plugins/usermanager/admin.php b/lib/plugins/usermanager/admin.php
index 8b646b426..2bb0a863d 100644
--- a/lib/plugins/usermanager/admin.php
+++ b/lib/plugins/usermanager/admin.php
@@ -153,7 +153,7 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin {
ptln(" <table class=\"inline\">");
ptln(" <thead>");
ptln(" <tr>");
- ptln(" <th>&nbsp;</th><th>".$this->lang["user_id"]."</th><th>".$this->lang["user_name"]."</th><th>".$this->lang["user_mail"]."</th><th>".$this->lang["user_groups"]."</th>");
+ ptln(" <th>&#160;</th><th>".$this->lang["user_id"]."</th><th>".$this->lang["user_name"]."</th><th>".$this->lang["user_mail"]."</th><th>".$this->lang["user_groups"]."</th>");
ptln(" </tr>");
ptln(" <tr>");
diff --git a/lib/plugins/usermanager/lang/da/lang.php b/lib/plugins/usermanager/lang/da/lang.php
index ea3109374..845457f7e 100644
--- a/lib/plugins/usermanager/lang/da/lang.php
+++ b/lib/plugins/usermanager/lang/da/lang.php
@@ -10,6 +10,7 @@
* @author Erik Bjørn Pedersen <erik.pedersen@shaw.ca>
* @author rasmus@kinnerup.com
* @author Michael Pedersen subben@gmail.com
+ * @author Mikael Lyngvig <mikael@lyngvig.org>
*/
$lang['menu'] = 'Brugerstyring';
$lang['noauth'] = '(Brugervalidering er ikke tilgængelig)';
diff --git a/lib/plugins/usermanager/lang/de-informal/lang.php b/lib/plugins/usermanager/lang/de-informal/lang.php
index dbdce1fbf..e53781c77 100644
--- a/lib/plugins/usermanager/lang/de-informal/lang.php
+++ b/lib/plugins/usermanager/lang/de-informal/lang.php
@@ -5,11 +5,11 @@
* @author Alexander Fischer <tbanus@os-forge.net>
* @author Juergen Schwarzer <jschwarzer@freenet.de>
* @author Marcel Metz <marcel_metz@gmx.de>
- * @author Matthias Schulte <post@lupo49.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
* @author Christian Wichmann <nospam@zone0.de>
* @author Pierre Corell <info@joomla-praxis.de>
*/
-$lang['menu'] = 'Benutzerverwalter';
+$lang['menu'] = 'Benutzerverwaltung';
$lang['noauth'] = '(Benutzeranmeldung ist nicht verfügbar)';
$lang['nosupport'] = '(Benutzerverwaltung wird nicht unterstützt)';
$lang['badauth'] = 'Ungültige Authentifizierung';
@@ -22,7 +22,7 @@ $lang['field'] = 'Feld';
$lang['value'] = 'Wert';
$lang['add'] = 'Zufügen';
$lang['delete'] = 'Löschen';
-$lang['delete_selected'] = 'Lösche ausgewähltes';
+$lang['delete_selected'] = 'Lösche Ausgewähltes';
$lang['edit'] = 'Bearbeiten';
$lang['edit_prompt'] = 'Bearbeite diesen Benutzer';
$lang['modify'] = 'Änderungen speichern';
@@ -43,10 +43,10 @@ $lang['next'] = 'nächste';
$lang['last'] = 'letzte';
$lang['edit_usermissing'] = 'Der gewählte Benutzer wurde nicht gefunden. Der angegebene Benutzername könnte gelöscht oder an anderer Stelle geändert worden sein.';
$lang['user_notify'] = 'Benutzer benachrichtigen';
-$lang['note_notify'] = 'Benachrichtigungsemails werden nur versandt, wenn der Benutzer ein neues Kennwort erhält.';
+$lang['note_notify'] = 'Benachrichtigungsmails werden nur versandt, wenn der Benutzer ein neues Kennwort erhält.';
$lang['note_group'] = 'Neue Benutzer werden zur Standardgruppe (%s) hinzugefügt, wenn keine Gruppe angegeben wird.';
$lang['note_pass'] = 'Das Passwort wird automatisch erzeugt, wenn das Feld freigelassen wird und der Benutzer Benachrichtigungen aktiviert hat.';
$lang['add_ok'] = 'Benutzer erfolgreich hinzugefügt';
$lang['add_fail'] = 'Hinzufügen des Benutzers fehlgeschlagen';
-$lang['notify_ok'] = 'Benachrichtigungs-Mail wurde versendet';
-$lang['notify_fail'] = 'Benachrichtigungse-Mail konnte nicht gesendet werden';
+$lang['notify_ok'] = 'Benachrichtigungsmail wurde versendet';
+$lang['notify_fail'] = 'Benachrichtigungsemail konnte nicht gesendet werden';
diff --git a/lib/plugins/usermanager/lang/de/lang.php b/lib/plugins/usermanager/lang/de/lang.php
index 507fe1f7c..0dd90cc68 100644
--- a/lib/plugins/usermanager/lang/de/lang.php
+++ b/lib/plugins/usermanager/lang/de/lang.php
@@ -12,11 +12,11 @@
* @author Dirk Einecke <dirk@dirkeinecke.de>
* @author Blitzi94@gmx.de
* @author Robert Bogenschneider <robog@GMX.de>
- * @author Robert Bogenschneider <robog@gmx.de>
* @author Niels Lange <niels@boldencursief.nl>
* @author Christian Wichmann <nospam@zone0.de>
* @author Paul Lachewsky <kaeptn.haddock@gmail.com>
* @author Pierre Corell <info@joomla-praxis.de>
+ * @author Matthias Schulte <dokuwiki@lupo49.de>
*/
$lang['menu'] = 'Benutzerverwaltung';
$lang['noauth'] = '(Authentifizierungssystem nicht verfügbar)';
@@ -57,5 +57,5 @@ $lang['note_group'] = 'Neue Nutzer werden der Standard-Gruppe (%s) hi
$lang['note_pass'] = 'Das Passwort wird automatisch generiert, wenn das entsprechende Feld leergelassen wird und die Benachrichtigung des Nutzers aktiviert ist.';
$lang['add_ok'] = 'Nutzer erfolgreich angelegt';
$lang['add_fail'] = 'Nutzer konnte nicht angelegt werden';
-$lang['notify_ok'] = 'Benachrichtigungs-Mail wurde versandt';
-$lang['notify_fail'] = 'Benachrichtigungs-Mail konnte nicht versandt werden';
+$lang['notify_ok'] = 'Benachrichtigungsmail wurde versandt';
+$lang['notify_fail'] = 'Benachrichtigungsmail konnte nicht versandt werden';
diff --git a/lib/plugins/usermanager/lang/fa/lang.php b/lib/plugins/usermanager/lang/fa/lang.php
index f9e973b9c..674013474 100644
--- a/lib/plugins/usermanager/lang/fa/lang.php
+++ b/lib/plugins/usermanager/lang/fa/lang.php
@@ -7,6 +7,7 @@
* @author omidmr@gmail.com
* @author Omid Mottaghi <omidmr@gmail.com>
* @author Mohammad Reza Shoaei <shoaei@gmail.com>
+ * @author Milad DZand <M.DastanZand@gmail.com>
*/
$lang['menu'] = 'مدیریت کاربر';
$lang['noauth'] = '(معتبرسازی کاربر ممکن نیست)';
diff --git a/lib/plugins/usermanager/lang/it/lang.php b/lib/plugins/usermanager/lang/it/lang.php
index 34c510def..1e948baab 100644
--- a/lib/plugins/usermanager/lang/it/lang.php
+++ b/lib/plugins/usermanager/lang/it/lang.php
@@ -12,6 +12,7 @@
* @author robocap <robocap1@gmail.com>
* @author Osman Tekin osman.tekin93@hotmail.it
* @author Jacopo Corbetta <jacopo.corbetta@gmail.com>
+ * @author Matteo Pasotti <matteo@xquiet.eu>
*/
$lang['menu'] = 'Gestione Utenti';
$lang['noauth'] = '(autenticazione non disponibile)';
diff --git a/lib/plugins/usermanager/lang/ko/lang.php b/lib/plugins/usermanager/lang/ko/lang.php
index 111267e5f..3754fea90 100644
--- a/lib/plugins/usermanager/lang/ko/lang.php
+++ b/lib/plugins/usermanager/lang/ko/lang.php
@@ -8,44 +8,45 @@
* @author SONG Younghwan <purluno@gmail.com>
* @author Seung-Chul Yoo <dryoo@live.com>
* @author erial2@gmail.com
+ * @author Myeongjin <aranet100@gmail.com>
*/
$lang['menu'] = '사용자 관리자';
$lang['noauth'] = '(사용자 인증이 불가능합니다.)';
$lang['nosupport'] = '(사용자 관리가 지원되지 않습니다.)';
-$lang['badauth'] = '유효하지 않은 인증 메카니즘입니다.';
+$lang['badauth'] = '잘못된 인증 메카니즘';
$lang['user_id'] = '사용자';
-$lang['user_pass'] = '패스워드';
+$lang['user_pass'] = '비밀번호';
$lang['user_name'] = '실제 이름';
$lang['user_mail'] = '이메일 ';
-$lang['user_groups'] = '그룹들';
+$lang['user_groups'] = '그룹';
$lang['field'] = '항목';
$lang['value'] = '값';
$lang['add'] = '추가';
$lang['delete'] = '삭제';
-$lang['delete_selected'] = '삭제 선택';
+$lang['delete_selected'] = '선택 삭제';
$lang['edit'] = '수정';
$lang['edit_prompt'] = '이 사용자 수정';
-$lang['modify'] = '변경 저장';
-$lang['search'] = '검색';
-$lang['search_prompt'] = '검색 실행';
-$lang['clear'] = '검색 필터 초기화';
+$lang['modify'] = '바뀜 저장';
+$lang['search'] = '찾기';
+$lang['search_prompt'] = '찾기 실행';
+$lang['clear'] = '찾기 필터 초기화';
$lang['filter'] = '필터';
-$lang['summary'] = '검색된 사용자들 보기(%1$d-%2$d 중 %3$d). 전체 사용자 %4$d 명.';
-$lang['nonefound'] = '검색된 사용자가 없습니다. 전체 사용자 %d 명.';
-$lang['delete_ok'] = '%d 명의 사용자가 삭제되었습니다.';
-$lang['delete_fail'] = '%d 명의 사용자의 삭제가 실패했습니다.';
-$lang['update_ok'] = '사용자 갱신이 성공했습니다.';
-$lang['update_fail'] = '사용자 갱신이 실패했습니다.';
-$lang['update_exists'] = '사용자 이름 변경이 실패했습니다. 사용자 이름(%s)이 이미 존재합니다. (다른 항목들의 변경은 적용됩니다.)';
+$lang['summary'] = '찾은 사용자 %3$d 중 %1$d-%2$d 보기. 전체 사용자 %4$d명.';
+$lang['nonefound'] = '찾은 사용자가 없습니다. 전체 사용자 %d명.';
+$lang['delete_ok'] = '사용자 %d명이 삭제되었습니다';
+$lang['delete_fail'] = '사용자 %d명의 삭제가 실패했습니다.';
+$lang['update_ok'] = '사용자 변경을 성공했습니다.';
+$lang['update_fail'] = '사용자 변경을 실패했습니다.';
+$lang['update_exists'] = '사용자 이름 변경이 실패했습니다. 사용자 이름(%s)이 이미 존재합니다. (다른 항목의 바뀜은 적용됩니다.)';
$lang['start'] = '시작';
$lang['prev'] = '이전';
$lang['next'] = '다음';
$lang['last'] = '마지막';
-$lang['edit_usermissing'] = '선택된 사용자를 찾을 수 없습니다, 사용자 이름이 삭제되거나 변경됐을 수도 있습니다.';
+$lang['edit_usermissing'] = '선택된 사용자를 찾을 수 없습니다. 사용자 이름이 삭제되거나 변경됐을 수도 있습니다.';
$lang['user_notify'] = '사용자에게 알림';
-$lang['note_notify'] = '사용자에게 새로운 암호를 준 경우에만 알림 이메일이 보내집니다.';
-$lang['note_group'] = '새로운 사용자들은 어떤 그룹도 설정하지 않은 경우에 기본 그룹(%s)에 추가됩니다.';
-$lang['note_pass'] = '사용자 통지가 지정되어 있을때, 필드에 아무값도 입력하지 않으면 암호가 자동 생성 됩니다.';
+$lang['note_notify'] = '사용자에게 새로운 비밀번호를 준 경우에만 알림 이메일이 보내집니다.';
+$lang['note_group'] = '새로운 사용자는 어떤 그룹도 설정하지 않은 경우에 기본 그룹(%s)에 추가됩니다.';
+$lang['note_pass'] = '사용자 통지가 지정되어 있을 때 필드에 아무 값도 입력하지 않으면 비밀번호가 자동으로 만들어집니다.';
$lang['add_ok'] = '사용자가 성공적으로 추가되었습니다.';
$lang['add_fail'] = '사용자 추가가 실패했습니다.';
$lang['notify_ok'] = '알림 이메일이 성공적으로 발송되었습니다. ';
diff --git a/lib/plugins/usermanager/lang/pl/lang.php b/lib/plugins/usermanager/lang/pl/lang.php
index 5bbf84370..cfc0ba327 100644
--- a/lib/plugins/usermanager/lang/pl/lang.php
+++ b/lib/plugins/usermanager/lang/pl/lang.php
@@ -12,6 +12,7 @@
* @author Grzegorz Widła <dzesdzes@gmail.com>
* @author Łukasz Chmaj <teachmeter@gmail.com>
* @author Begina Felicysym <begina.felicysym@wp.eu>
+ * @author Aoi Karasu <aoikarasu@gmail.com>
*/
$lang['menu'] = 'Menadżer użytkowników';
$lang['noauth'] = '(uwierzytelnienie użytkownika niemożliwe)';
diff --git a/lib/plugins/usermanager/lang/vi/lang.php b/lib/plugins/usermanager/lang/vi/lang.php
new file mode 100644
index 000000000..2933d8875
--- /dev/null
+++ b/lib/plugins/usermanager/lang/vi/lang.php
@@ -0,0 +1,5 @@
+<?php
+/**
+ * Vietnamese language file
+ *
+ */
diff --git a/lib/scripts/page.js b/lib/scripts/page.js
index 5da4a9cc0..74aca9c06 100644
--- a/lib/scripts/page.js
+++ b/lib/scripts/page.js
@@ -10,7 +10,7 @@ dw_page = {
init: function(){
dw_page.sectionHighlight();
jQuery('a.fn_top').mouseover(dw_page.footnoteDisplay);
- dw_page.initTocToggle();
+ dw_page.makeToggle('#dw__toc h3','#dw__toc > div');
},
/**
@@ -93,48 +93,76 @@ dw_page = {
},
/**
- * Adds the toggle switch to the TOC
+ * Makes an element foldable by clicking its handle
+ *
+ * This is used for the TOC toggling, but can be used for other elements
+ * as well. A state indicator is inserted into the handle and can be styled
+ * by CSS.
+ *
+ * @param selector handle What should be clicked to toggle
+ * @param selector content This element will be toggled
*/
- initTocToggle: function() {
- var $header, $clicky, $toc, $tocul, setClicky;
- $header = jQuery('#toc__header');
- if(!$header.length) {
- return;
- }
- $toc = jQuery('#toc__inside');
- $tocul = $toc.children('ul.toc');
+ makeToggle: function(handle, content, state){
+ var $handle, $content, $clicky, $child, setClicky;
+ $handle = jQuery(handle);
+ if(!$handle.length) return;
+ $content = jQuery(content);
+ if(!$content.length) return;
+
+ // we animate the children
+ $child = $content.children();
+ // class/display toggling
setClicky = function(hiding){
if(hiding){
$clicky.html('<span>+</span>');
- $clicky[0].className = 'toc_open';
+ $handle.addClass('closed');
+ $handle.removeClass('open');
}else{
- $clicky.html('<span>&minus;</span>');
- $clicky[0].className = 'toc_close';
+ $clicky.html('<span>−</span>');
+ $handle.addClass('open');
+ $handle.removeClass('closed');
}
};
- $clicky = jQuery(document.createElement('span'))
- .attr('id','toc__toggle');
- $header.css('cursor','pointer')
- .click(function () {
- var hidden;
+ $handle[0].setState = function(state){
+ var hidden;
+ if(!state) state = 1;
+
+ // Assert that content instantly takes the whole space
+ $content.css('min-height', $content.height()).show();
- // Assert that $toc instantly takes the whole TOC space
- $toc.css('height', $toc.height()).show();
+ // stop any running animation
+ $child.stop(true, true);
- hidden = $tocul.stop(true, true).is(':hidden');
+ // was a state given or do we toggle?
+ if(state === -1) {
+ hidden = false;
+ } else if(state === 1) {
+ hidden = true;
+ } else {
+ hidden = $child.is(':hidden');
+ }
+
+ // update the state
+ setClicky(!hidden);
+
+ // Start animation and assure that $toc is hidden/visible
+ $child.dw_toggle(hidden, function () {
+ $content.toggle(hidden);
+ });
+ };
- setClicky(!hidden);
+ // the state indicator
+ $clicky = jQuery(document.createElement('strong'));
- // Start animation and assure that $toc is hidden/visible
- $tocul.dw_toggle(hidden, function () {
- $toc.toggle(hidden);
- });
- })
+ // click function
+ $handle.css('cursor','pointer')
+ .click($handle[0].setState)
.prepend($clicky);
- setClicky();
+ // initial state
+ $handle[0].setState(state);
}
};
diff --git a/lib/tpl/default/_mediamanager.css b/lib/tpl/default/_mediamanager.css
index 68fa2e97f..8c605f69a 100644
--- a/lib/tpl/default/_mediamanager.css
+++ b/lib/tpl/default/_mediamanager.css
@@ -343,18 +343,18 @@
/*____________ Revisions form ____________*/
-#mediamanager__page #page__revisions ul {
+#mediamanager__page form.changes ul {
margin-left: 10px;
list-style-type: none;
}
-#mediamanager__page #page__revisions ul li div.li div {
+#mediamanager__page form.changes ul li div.li div {
font-size: 90%;
color: __text_neu__;
padding-left: 18px;
}
-#mediamanager__page #page__revisions ul li div.li input {
+#mediamanager__page form.changes ul li div.li input {
position: relative;
top: 1px;
}
diff --git a/lib/tpl/default/design.css b/lib/tpl/default/design.css
index a94f814aa..3405ec258 100644
--- a/lib/tpl/default/design.css
+++ b/lib/tpl/default/design.css
@@ -265,11 +265,6 @@ div.dokuwiki a:active {
text-decoration: underline;
}
-div.dokuwiki h1 a,
-div.dokuwiki h2 a,
-div.dokuwiki h3 a,
-div.dokuwiki h4 a,
-div.dokuwiki h5 a,
div.dokuwiki a.nolink {
color: __text__ !important;
text-decoration: none !important;
@@ -383,11 +378,11 @@ div.dokuwiki img.mediacenter {
}
/* smileys */
-div.dokuwiki img.middle {
+div.dokuwiki img.icon {
vertical-align: middle;
}
-div.dokuwiki acronym {
+div.dokuwiki abbr {
cursor: help;
border-bottom: 1px dotted __text__;
}
@@ -552,7 +547,7 @@ div.dokuwiki table.inline td {
/* ---------- table of contents ------------------- */
-div.dokuwiki div.toc {
+div.dokuwiki #dw__toc {
margin: 1.2em 0 0 2em;
float: right;
width: 200px;
@@ -560,46 +555,45 @@ div.dokuwiki div.toc {
clear: both;
}
-div.dokuwiki div.tocheader {
+div.dokuwiki #dw__toc h3 {
border: 1px solid __border__;
background-color: __background_alt__;
text-align: left;
font-weight: bold;
padding: 3px;
- margin-bottom: 2px;
+ margin: 0 0 2px 0;
+ font-size: 1em;
}
-div.dokuwiki span.toc_open,
-div.dokuwiki span.toc_close {
+div.dokuwiki .toggle strong {
border: 0.4em solid __background_alt__;
float: right;
display: block;
margin: 0.4em 3px 0 0;
}
-div.dokuwiki span.toc_open span,
-div.dokuwiki span.toc_close span {
+div.dokuwiki .toggle span {
display: none;
}
-div.dokuwiki span.toc_open {
+div.dokuwiki .toggle.closed strong {
margin-top: 0.4em;
border-top: 0.4em solid __text__;
}
-div.dokuwiki span.toc_close {
+div.dokuwiki .toggle.open strong {
margin-top: 0;
border-bottom: 0.4em solid __text__;
}
-div.dokuwiki #toc__inside {
+div.dokuwiki #dw__toc > div {
border: 1px solid __border__;
background-color: __background__;
text-align: left;
padding: 0.5em 0 0.7em 0;
}
-div.dokuwiki ul.toc {
+div.dokuwiki #dw__toc ul {
list-style-type: none;
list-style-image: none;
line-height: 1.2em;
@@ -607,23 +601,23 @@ div.dokuwiki ul.toc {
margin: 0;
}
-div.dokuwiki ul.toc li {
+div.dokuwiki #dw__toc ul li {
background: transparent url(images/tocdot2.gif) 0 0.6em no-repeat;
padding-left: 0.4em;
}
-div.dokuwiki ul.toc li.clear {
+div.dokuwiki #dw__toc ul li.clear {
background-image: none;
padding-left: 0.4em;
}
-div.dokuwiki a.toc:link,
-div.dokuwiki a.toc:visited {
+div.dokuwiki #dw__toc a:link,
+div.dokuwiki #dw__toc a:visited {
color: __extern__;
}
-div.dokuwiki a.toc:hover,
-div.dokuwiki a.toc:active {
+div.dokuwiki #dw__toc a:hover,
+div.dokuwiki #dw__toc a:active {
color: __text__;
}
@@ -712,12 +706,20 @@ div.insitu-footnote {
}
/* --------------- search result formating --------------- */
-div.dokuwiki .search_result {
- margin-bottom: 6px;
+#dw__loading {
+ text-align: center;
+ margin-bottom: 1em;
+}
+
+div.dokuwiki .search_results {
padding: 0 10px 0 30px;
}
-div.dokuwiki .search_snippet {
+div.dokuwiki .search_results dt {
+ margin-bottom: 3px;
+}
+div.dokuwiki .search_results dd {
+ margin-bottom: 6px;
color: __text_other__;
font-size: 12px;
margin-left: 20px;
diff --git a/lib/tpl/default/main.php b/lib/tpl/default/main.php
index 3e85c58f2..9a14f29a2 100644
--- a/lib/tpl/default/main.php
+++ b/lib/tpl/default/main.php
@@ -61,7 +61,7 @@ if (!defined('DOKU_INC')) die();
<div class="bar-right" id="bar__topright">
<?php tpl_button('recent')?>
- <?php tpl_searchform()?>&nbsp;
+ <?php tpl_searchform()?>&#160;
</div>
<div class="clearer"></div>
@@ -121,7 +121,7 @@ if (!defined('DOKU_INC')) die();
<?php tpl_button('profile')?>
<?php tpl_button('login')?>
<?php tpl_button('index')?>
- <?php tpl_button('top')?>&nbsp;
+ <?php tpl_button('top')?>&#160;
</div>
<div class="clearer"></div>
</div>
diff --git a/lib/tpl/default/print.css b/lib/tpl/default/print.css
index 45b60aad2..f83e8c97c 100644
--- a/lib/tpl/default/print.css
+++ b/lib/tpl/default/print.css
@@ -200,7 +200,7 @@ a.fn_bot {
font-weight: bold;
}
-acronym {
+abbr {
border: 0;
}
@@ -224,5 +224,5 @@ table.inline td {
border: 1px solid #000000;
}
-.toc, .footerinc, .header, .bar, .user { display: none; }
+#dw__toc, .footerinc, .header, .bar, .user { display: none; }
diff --git a/lib/tpl/default/rtl.css b/lib/tpl/default/rtl.css
index 82c85839b..8b2837874 100644
--- a/lib/tpl/default/rtl.css
+++ b/lib/tpl/default/rtl.css
@@ -89,30 +89,36 @@ div.dokuwiki div.level4 { margin-left: 0px; margin-right: 63px; }
div.dokuwiki div.level5 { margin-left: 0px; margin-right: 83px; }
/* TOC control */
-div.dokuwiki div.toc {
+div.dokuwiki #dw__toc {
float: left;
+ margin: 1.2em 2em 0 0;
}
-div.dokuwiki div.tocheader {
+div.dokuwiki #dw__toc h3 {
text-align: right;
}
-div.dokuwiki #toc__inside {
+div.dokuwiki .toggle strong {
+ float: left;
+ margin: 0.4em 0 0 3px;
+}
+
+div.dokuwiki #dw__toc > div {
text-align: right;
}
-div.dokuwiki ul.toc {
+div.dokuwiki #dw__toc ul {
padding: 0;
padding-right: 1em;
}
-div.dokuwiki ul.toc li {
+div.dokuwiki #dw__toc ul li {
background-position: right 0.6em;
padding-right: 0.4em;
direction: rtl;
}
-div.dokuwiki ul.toc li.clear {
+div.dokuwiki #dw__toc ul li.clear {
padding-right: 0.4em;
}
diff --git a/lib/tpl/dokuwiki/css/_admin.css b/lib/tpl/dokuwiki/css/_admin.css
index e4664367c..c8f3694b5 100644
--- a/lib/tpl/dokuwiki/css/_admin.css
+++ b/lib/tpl/dokuwiki/css/_admin.css
@@ -9,6 +9,9 @@
list-style-type: none;
font-size: 1.125em;
}
+[dir=rtl] .dokuwiki ul.admin_tasks {
+ float: right;
+}
.dokuwiki ul.admin_tasks li {
padding-left: 35px;
@@ -18,6 +21,11 @@
background: transparent none no-repeat scroll 0 0;
color: inherit;
}
+[dir=rtl] .dokuwiki ul.admin_tasks li {
+ padding-left: 0;
+ padding-right: 35px;
+ background-position: right 0;
+}
.dokuwiki ul.admin_tasks li.admin_acl {
background-image: url(../../images/admin/acl.png);
@@ -45,3 +53,7 @@
color: __text_neu__;
background-color: inherit;
}
+[dir=rtl] .dokuwiki #admin__version {
+ clear: right;
+ float: left;
+}
diff --git a/lib/tpl/dokuwiki/css/_edit.css b/lib/tpl/dokuwiki/css/_edit.css
index 5a3952c90..374ddeb96 100644
--- a/lib/tpl/dokuwiki/css/_edit.css
+++ b/lib/tpl/dokuwiki/css/_edit.css
@@ -6,18 +6,24 @@
/* edit view
********************************************************************/
+.dokuwiki div.editBox {
+}
+
/*____________ toolbar ____________*/
.dokuwiki div.toolbar {
margin-bottom: .5em;
overflow: hidden;
}
-.dokuwiki div.toolbar #draft__status {
+#draft__status {
float: right;
color: __text_alt__;
background-color: inherit;
}
-.dokuwiki div.toolbar #tool__bar {
+[dir=rtl] #draft__status {
+ float: left;
+}
+#tool__bar {
float: left;
}
@@ -55,42 +61,49 @@ div.picker button.toolbutton {
/*____________ below the textarea ____________*/
-.dokuwiki #wiki__editbar {
+.dokuwiki div.editBar {
overflow: hidden;
margin-bottom: .5em;
}
/* size and wrap controls */
-.dokuwiki #wiki__editbar #size__ctl {
+#size__ctl {
float: right;
}
-.dokuwiki #wiki__editbar #size__ctl img {
+[dir=rtl] #size__ctl {
+ float: left;
+}
+#size__ctl img {
cursor: pointer;
}
/* edit buttons */
-.dokuwiki #wiki__editbar .editButtons {
+.dokuwiki .editBar .editButtons {
display: inline;
margin-right: 1em;
}
-.dokuwiki #wiki__editbar .editButtons input {
+[dir=rtl] .dokuwiki .editBar .editButtons {
+ margin-right: 0;
+ margin-left: 1em;
+}
+.dokuwiki .editBar .editButtons input {
}
/* summary input and minor changes checkbox */
-.dokuwiki #wiki__editbar .summary {
+.dokuwiki .editBar .summary {
display: inline;
}
-.dokuwiki #wiki__editbar .summary label {
+.dokuwiki .editBar .summary label {
vertical-align: middle;
white-space: nowrap;
}
-.dokuwiki #wiki__editbar .summary label span {
+.dokuwiki .editBar .summary label span {
vertical-align: middle;
}
-.dokuwiki #wiki__editbar .summary input {
+.dokuwiki .editBar .summary input {
}
/* change background colour if summary is missing */
-.dokuwiki #wiki__editbar .summary input.missing {
+.dokuwiki .editBar .summary input.missing {
color: __text__;
background-color: #ffcccc;
}
@@ -112,6 +125,9 @@ div.picker button.toolbutton {
float: right;
margin-top: -1.4em;
}
+[dir=rtl] .dokuwiki .secedit {
+ float: left;
+}
.dokuwiki .secedit input.button {
font-size: 75%;
}
diff --git a/lib/tpl/dokuwiki/css/_forms.css b/lib/tpl/dokuwiki/css/_forms.css
index 0c82f5f8c..fb07e989a 100644
--- a/lib/tpl/dokuwiki/css/_forms.css
+++ b/lib/tpl/dokuwiki/css/_forms.css
@@ -23,12 +23,18 @@
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 input.edit {
width: 50%;
@@ -75,6 +81,9 @@
text-align: left;
margin: 0.5em 0;
}
+[dir=rtl] #subscribe__form fieldset {
+ text-align: right;
+}
#subscribe__form label {
display: block;
diff --git a/lib/tpl/dokuwiki/css/_imgdetail.css b/lib/tpl/dokuwiki/css/_imgdetail.css
index a3e0f55f5..a07400028 100644
--- a/lib/tpl/dokuwiki/css/_imgdetail.css
+++ b/lib/tpl/dokuwiki/css/_imgdetail.css
@@ -12,9 +12,17 @@
float: left;
margin: 0 1.5em .5em 0;
}
+[dir=rtl] #dokuwiki__detail div.content img {
+ float: right;
+ margin-right: 0;
+ margin-left: 1.5em;
+}
#dokuwiki__detail div.img_detail {
float: left;
}
+[dir=rtl] #dokuwiki__detail div.content div.img_detail {
+ float: right
+}
#dokuwiki__detail div.img_detail h2 {
}
diff --git a/lib/tpl/dokuwiki/css/_links.css b/lib/tpl/dokuwiki/css/_links.css
index 58b611635..22502f6a9 100644
--- a/lib/tpl/dokuwiki/css/_links.css
+++ b/lib/tpl/dokuwiki/css/_links.css
@@ -39,12 +39,11 @@
.dokuwiki a.interwiki {
background-repeat: no-repeat;
background-position: 0 center;
- padding: 0 0 0 20px;
+ padding: 0 0 0 18px;
}
/* external link */
.dokuwiki a.urlextern {
background-image: url(images/external-link.png);
- padding: 0 0 0 17px;
}
/* windows share */
.dokuwiki a.windows {
@@ -61,5 +60,14 @@
}
/* interwiki link */
.dokuwiki a.interwiki {
- padding: 0 0 0 17px;
+}
+
+/* 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/dokuwiki/css/_media_popup.css b/lib/tpl/dokuwiki/css/_media_popup.css
index 0469c8e60..c776e6b8a 100644
--- a/lib/tpl/dokuwiki/css/_media_popup.css
+++ b/lib/tpl/dokuwiki/css/_media_popup.css
@@ -22,6 +22,12 @@ html.popup {
left: 0;
border-right: 1px solid __border__;
}
+[dir=rtl] #mediamgr__aside {
+ left: auto;
+ right: 0;
+ border-right-width: 0;
+ border-left: 1px solid __border__;
+}
#mediamgr__aside .pad {
padding: .5em;
}
@@ -33,6 +39,10 @@ html.popup {
position: absolute;
right: 0;
}
+[dir=rtl] #mediamgr__content {
+ right: auto;
+ left: 0;
+}
#mediamgr__content .pad {
padding: .5em;
}
@@ -57,6 +67,10 @@ html.popup {
#media__opts input {
margin-right: .3em;
}
+[dir=rtl] #media__opts input {
+ margin-right: 0;
+ margin-left: .3em;
+}
#media__opts label {
}
@@ -65,22 +79,38 @@ html.popup {
#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
********************************************************************/
@@ -125,6 +155,10 @@ html.popup {
margin-right: 1.5em;
font-weight: bold;
}
+[dir=rtl] #media__content a.mediafile {
+ margin-right: 0;
+ margin-left: 1.5em;
+}
#media__content span.info {
}
#media__content img.btn {
@@ -144,6 +178,10 @@ html.popup {
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;
@@ -155,17 +193,17 @@ html.popup {
/*____________ media search ____________*/
-form#dw__mediasearch {
+#dw__mediasearch {
}
-form#dw__mediasearch p {
+#dw__mediasearch p {
}
-form#dw__mediasearch label {
+#dw__mediasearch label {
}
-form#dw__mediasearch label span {
+#dw__mediasearch label span {
}
-form#dw__mediasearch input.edit {
+#dw__mediasearch input.edit {
}
-form#dw__mediasearch input.button {
+#dw__mediasearch input.button {
}
@@ -180,6 +218,9 @@ form#dw__mediasearch input.button {
margin-bottom: .5em;
overflow: hidden;
}
+[dir=rtl] #media__content form.meta div.metafield {
+ clear: right;
+}
#media__content form.meta label {
display: block;
@@ -188,11 +229,18 @@ form#dw__mediasearch input.button {
font-weight: bold;
clear: left;
}
+[dir=rtl] #media__content form.meta label {
+ float: right;
+ clear: right;
+}
#media__content form.meta .edit {
float: left;
width: 70%;
margin: 0;
}
+[dir=rtl] #media__content form.meta .edit {
+ float: right;
+}
#media__content form.meta textarea.edit {
/* needed because of IE8 hack in _edit.css for textarea.edit: */
max-width: 70%;
@@ -203,3 +251,7 @@ form#dw__mediasearch input.button {
clear: left;
margin: .2em 0 0 25%;
}
+[dir=rtl] #media__content form.meta div.buttons {
+ clear: right;
+ margin: .2em 25% 0 0;
+}
diff --git a/lib/tpl/dokuwiki/css/_modal.css b/lib/tpl/dokuwiki/css/_modal.css
index 125f702a8..a3d3be194 100644
--- a/lib/tpl/dokuwiki/css/_modal.css
+++ b/lib/tpl/dokuwiki/css/_modal.css
@@ -13,6 +13,10 @@
#link__wiz {
}
+[dir=rtl] #link__wiz_close {
+ float: left;
+}
+
#link__wiz_result {
background-color: __background__;
width: 293px;
@@ -23,6 +27,9 @@
text-align: left;
line-height: 1;
}
+[dir=rtl] #link__wiz_result {
+ text-align: right;
+}
#link__wiz_result div {
padding: 3px 3px 3px 0;
@@ -34,6 +41,10 @@
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);
diff --git a/lib/tpl/dokuwiki/css/_recent.css b/lib/tpl/dokuwiki/css/_recent.css
index 68f0e5826..d73bb9463 100644
--- a/lib/tpl/dokuwiki/css/_recent.css
+++ b/lib/tpl/dokuwiki/css/_recent.css
@@ -5,54 +5,44 @@
/*____________ list of revisions / recent changes ____________*/
-/* select type of revisions (media/pages), should have a class on it's own, but hasn't */
-.dokuwiki #dw__recent label {
+/* select type of revisions (media/pages) */
+.dokuwiki .changeType {
margin-bottom: .5em;
- display: block;
}
-.dokuwiki #dw__recent ul li,
-.dokuwiki #page__revisions ul li {
+.dokuwiki form.changes ul li {
list-style: none;
margin-left: 0;
}
-.dokuwiki #dw__recent ul li span,
-.dokuwiki #dw__recent ul li a,
-.dokuwiki #page__revisions ul li span,
-.dokuwiki #page__revisions ul li a {
+[dir=rtl] .dokuwiki form.changes ul li {
+ margin-right: 0;
+}
+.dokuwiki form.changes ul li span,
+.dokuwiki form.changes ul li a {
vertical-align: middle;
}
-.dokuwiki #dw__recent ul li span.user a,
-.dokuwiki #page__revisions ul li span.user a {
+.dokuwiki form.changes ul li span.user a {
vertical-align: bottom;
}
-.dokuwiki #dw__recent ul li.minor,
-.dokuwiki #page__revisions ul li.minor {
+.dokuwiki form.changes ul li.minor {
opacity: .7;
}
-.dokuwiki #dw__recent li span.date,
-.dokuwiki #page__revisions li span.date {
+.dokuwiki form.changes li span.date {
}
-.dokuwiki #dw__recent li a.diff_link,
-.dokuwiki #page__revisions li a.diff_link {
+.dokuwiki form.changes li a.diff_link {
vertical-align: baseline;
}
-.dokuwiki #dw__recent li a.revisions_link,
-.dokuwiki #page__revisions li a.revisions_link {
+.dokuwiki form.changes li a.revisions_link {
vertical-align: baseline;
}
-.dokuwiki #dw__recent li a.wikilink1,
-.dokuwiki #dw__recent li a.wikilink2,
-.dokuwiki #page__revisions li a.wikilink1,
-.dokuwiki #page__revisions li a.wikilink2 {
+.dokuwiki form.changes li a.wikilink1,
+.dokuwiki form.changes li a.wikilink2 {
}
-.dokuwiki #dw__recent li span.sum,
-.dokuwiki #page__revisions li span.sum {
+.dokuwiki form.changes li span.sum {
font-weight: bold;
}
-.dokuwiki #dw__recent li span.user,
-.dokuwiki #page__revisions li span.user {
+.dokuwiki form.changes li span.user {
}
diff --git a/lib/tpl/dokuwiki/css/_search.css b/lib/tpl/dokuwiki/css/_search.css
index c124c1e86..0090308c9 100644
--- a/lib/tpl/dokuwiki/css/_search.css
+++ b/lib/tpl/dokuwiki/css/_search.css
@@ -8,6 +8,8 @@
/* loading gif */
#dw__loading {
+ text-align: center;
+ margin-bottom: 1.4em;
}
/*____________ matching pagenames ____________*/
@@ -25,17 +27,26 @@
width: 12em;
margin: 0 1.5em;
}
+[dir=rtl] .dokuwiki div.search_quickresult ul li {
+ float: right;
+}
/*____________ search results ____________*/
-/* container for one search result */
-.dokuwiki div.search_result {
- margin-bottom: 1.4em;
+.dokuwiki dl.search_results {
+ margin-bottom: 1.2em;
+}
+
+/* search heading */
+.dokuwiki dl.search_results dt {
+ font-weight: normal;
+ margin-bottom: .2em;
}
/* search snippet */
-.dokuwiki div.search_result div.search_snippet {
+.dokuwiki dl.search_results dd {
color: __text_alt__;
background-color: inherit;
+ margin: 0 0 1.2em 0;
}
/* search hit in normal text */
@@ -44,11 +55,11 @@
background-color: __highlight__;
}
/* search hit in search results */
-.dokuwiki div.search_result strong.search_hit {
+.dokuwiki .search_results strong.search_hit {
font-weight: normal;
}
/* ellipsis separating snippets */
-.dokuwiki div.search_result .search_sep {
+.dokuwiki .search_results .search_sep {
color: __text__;
background-color: inherit;
}
@@ -78,6 +89,11 @@
text-align: left;
display: none;
}
+[dir=rtl] .dokuwiki form.search div.ajax_qsearch {
+ left: auto;
+ right: -13.5em;
+ text-align: right;
+}
.dokuwiki form.search div.ajax_qsearch strong {
display: block;
margin-bottom: .3em;
diff --git a/lib/tpl/dokuwiki/css/_toc.css b/lib/tpl/dokuwiki/css/_toc.css
index b78817523..0d1b976d1 100644
--- a/lib/tpl/dokuwiki/css/_toc.css
+++ b/lib/tpl/dokuwiki/css/_toc.css
@@ -7,56 +7,66 @@
********************************************************************/
/* toc container */
-.dokuwiki div.toc {
+#dw__toc {
float: right;
margin: 0 0 1.4em 1.4em;
width: 12em;
background-color: __background_alt__;
color: inherit;
}
+[dir=rtl] #dw__toc {
+ float: left;
+ margin: 0 1.4em 1.4em 0;
+}
/*____________ toc header ____________*/
-.dokuwiki div.tocheader {
+.dokuwiki h3.toggle {
padding: .2em .5em;
font-weight: bold;
}
-.dokuwiki .toc span.toc_open,
-.dokuwiki .toc span.toc_close {
+.dokuwiki .toggle strong {
float: right;
margin: 0 .2em;
}
+[dir=rtl] .dokuwiki .toggle strong {
+ float: left;
+}
/*____________ toc list ____________*/
-.dokuwiki #toc__inside {
+#dw__toc > div {
padding: .2em .5em;
}
-.dokuwiki #toc__inside ul {
+#dw__toc ul {
padding: 0;
margin: 0;
}
-.dokuwiki #toc__inside ul li {
+#dw__toc ul li {
list-style: none;
padding: 0;
margin: 0;
line-height: 1.1;
}
-.dokuwiki #toc__inside ul li div.li {
+#dw__toc ul li div.li {
padding: .15em 0;
}
-.dokuwiki #toc__inside ul ul {
+#dw__toc ul ul {
padding-left: 1em;
}
-.dokuwiki #toc__inside ul ul li {
+[dir=rtl] #dw__toc ul ul {
+ padding-left: 0;
+ padding-right: 1em;
+}
+#dw__toc ul ul li {
}
-.dokuwiki #toc__inside ul li a {
+#dw__toc ul li a {
}
/* in case of toc list jumping one level
(e.g. if heading level 3 follows directly after heading level 1) */
-.dokuwiki #toc__inside ul li.clear {
+#dw__toc ul li.clear {
}
@@ -66,6 +76,9 @@
.dokuwiki ul.idx {
padding-left: 0;
}
+[dir=rtl] .dokuwiki ul.idx {
+ padding-right: 0;
+}
.dokuwiki ul.idx li {
list-style-image: url(images/bullet.png);
}
@@ -75,3 +88,6 @@
.dokuwiki ul.idx li.closed {
list-style-image: url(images/closed.png);
}
+[dir=rtl] .dokuwiki ul.idx li.closed {
+ list-style-image: url(images/closed-rtl.png);
+}
diff --git a/lib/tpl/dokuwiki/css/basic.css b/lib/tpl/dokuwiki/css/basic.css
index 0c8b0c13f..d683603ae 100644
--- a/lib/tpl/dokuwiki/css/basic.css
+++ b/lib/tpl/dokuwiki/css/basic.css
@@ -15,21 +15,14 @@ html {
html,
body {
color: __text__;
- background-color: __background_site__;
- background-image: url(images/page-background.svg);
- /*background-image: -moz-linear-gradient( top, __background_neu__ 0%, __background_alt__ 1em, __background_site__ 4em); see FS#2447*/
- background-image: -webkit-linear-gradient(top, __background_neu__ 0%, __background_alt__ 1em, __background_site__ 4em);
- background-image: -o-linear-gradient( top, __background_neu__ 0%, __background_alt__ 1em, __background_site__ 4em);
- background-image: -ms-linear-gradient( top, __background_neu__ 0%, __background_alt__ 1em, __background_site__ 4em);
- background-image: linear-gradient( top, __background_neu__ 0%, __background_alt__ 1em, __background_site__ 4em);
- background-size: 1px 10em;
- background-repeat: repeat-x;
+ background: __background_site__ url(images/page-gradient.png) top left repeat-x;
margin: 0;
padding: 0;
}
body {
font: normal 87.5%/1.4 Arial, sans-serif;
/* default font size: 100% => 16px; 93.75% => 15px; 87.5% => 14px; 81.25% => 13px; 75% => 12px */
+ -webkit-text-size-adjust: 100%;
}
@@ -53,7 +46,7 @@ legend {
h1 {
font-size: 2em;
- margin: -.222em 0 0.444em;
+ margin: 0 0 0.444em;
}
h2 {
font-size: 1.5em;
@@ -383,3 +376,38 @@ button[readonly] {
cursor: auto;
}
+/*____________ rtl corrections ____________*/
+
+[dir=rtl] caption,
+[dir=rtl] td,
+[dir=rtl] th {
+ text-align: right;
+}
+
+[dir=rtl] ul,
+[dir=rtl] ol {
+ padding: 0 1.5em 0 0;
+}
+[dir=rtl] li,
+[dir=rtl] dd {
+ margin: 0 1.5em 0 0;
+}
+[dir=rtl] blockquote {
+ border-width: 0 .25em 0 0;
+}
+
+[dir=rtl] h1,
+[dir=rtl] h2,
+[dir=rtl] h3,
+[dir=rtl] h4,
+[dir=rtl] h5,
+[dir=rtl] h6,
+[dir=rtl] caption,
+[dir=rtl] legend {
+ clear: right;
+}
+
+[dir=rtl] .a11y {
+ left: auto;
+ right: -9000px;
+}
diff --git a/lib/tpl/dokuwiki/css/content.css b/lib/tpl/dokuwiki/css/content.css
index 7cb7c6edf..ebeb4e17e 100644
--- a/lib/tpl/dokuwiki/css/content.css
+++ b/lib/tpl/dokuwiki/css/content.css
@@ -19,6 +19,17 @@
.dokuwiki.page div.level3 {margin-left: 2em;}
.dokuwiki.page div.level4 {margin-left: 3em;}
.dokuwiki.page div.level5 {margin-left: 4em;}
+
+[dir=rtl] .dokuwiki .page h1 {margin-left: 0; margin-right: 0;}
+[dir=rtl] .dokuwiki .page h2 {margin-left: 0; margin-right: .666em;}
+[dir=rtl] .dokuwiki .page h3 {margin-left: 0; margin-right: 1.776em;}
+[dir=rtl] .dokuwiki .page h4 {margin-left: 0; margin-right: 3em;}
+[dir=rtl] .dokuwiki .page h5 {margin-left: 0; margin-right: 4.5712em;}
+[dir=rtl] .dokuwiki .page div.level1 {margin-left: 0; margin-right: 0;}
+[dir=rtl] .dokuwiki .page div.level2 {margin-left: 0; margin-right: 1em;}
+[dir=rtl] .dokuwiki .page div.level3 {margin-left: 0; margin-right: 2em;}
+[dir=rtl] .dokuwiki .page div.level4 {margin-left: 0; margin-right: 3em;}
+[dir=rtl] .dokuwiki .page div.level5 {margin-left: 0; margin-right: 4em;}
*/
/* hx margin-left = (1 / font-size) * .levelx-margin */
@@ -133,6 +144,11 @@
margin-bottom: -1px;
float: left;
}
+[dir=rtl] .dokuwiki dl.code dt,
+[dir=rtl] .dokuwiki dl.file dt {
+ margin-left: 0;
+ margin-right: 1em;
+}
.dokuwiki dl.code dt a,
.dokuwiki dl.file dt a {
background-color: transparent;
diff --git a/lib/tpl/dokuwiki/css/design.css b/lib/tpl/dokuwiki/css/design.css
index c64ccc710..d1a00ce0a 100644
--- a/lib/tpl/dokuwiki/css/design.css
+++ b/lib/tpl/dokuwiki/css/design.css
@@ -23,6 +23,11 @@
float: left;
margin-right: .5em;
}
+[dir=rtl] #dokuwiki__header h1 img {
+ float: right;
+ margin-left: .5em;
+ margin-right: 0;
+}
#dokuwiki__header h1 span {
display: block;
padding-top: 10px;
@@ -78,6 +83,10 @@
list-style: none;
display: inline;
}
+[dir=rtl] #dokuwiki__header .tools li {
+ margin-right: 1em;
+ margin-left: 0;
+}
#dokuwiki__header .tools form.search div.ajax_qsearch li {
font-size: 1em;
margin-left: 0;
@@ -86,13 +95,11 @@
text-overflow: ellipsis;
}
-#dokuwiki__usertools a.action,
-#dokuwiki__sitetools a.action {
+#dokuwiki__usertools a.action {
padding-left: 20px;
- background: transparent url(images/sitetools.png) no-repeat 0 0;
+ background: transparent url(images/usertools.png) no-repeat 0 0;
}
-[dir=rtl] #dokuwiki__usertools a.action,
-[dir=rtl] #dokuwiki__sitetools a.action {
+[dir=rtl] #dokuwiki__usertools a.action {
padding-left: 0;
padding-right: 20px;
}
@@ -110,6 +117,11 @@
text-align: right;
width: 100%;
}
+[dir=rtl] #dokuwiki__usertools {
+ text-align: left;
+ left: 40px;
+ right: auto;
+}
#dokuwiki__usertools ul {
margin: 0 auto;
padding: 0;
@@ -119,34 +131,34 @@
}
#dokuwiki__usertools a.action.admin {
- background-position: left -96px;
+ background-position: left 0;
}
[dir=rtl] #dokuwiki__usertools a.action.admin {
- background-position: right -96px;
+ background-position: right 0;
}
#dokuwiki__usertools a.action.profile {
- background-position: left -128px;
+ background-position: left -32px;
}
[dir=rtl] #dokuwiki__usertools a.action.profile {
- background-position: right -128px;
+ background-position: right -32px;
}
#dokuwiki__usertools a.action.register {
- background-position: left -160px;
+ background-position: left -64px;
}
[dir=rtl] #dokuwiki__usertools a.action.register {
- background-position: right -160px;
+ background-position: right -64px;
}
#dokuwiki__usertools a.action.login {
- background-position: left -192px;
+ background-position: left -96px;
}
[dir=rtl] #dokuwiki__usertools a.action.login {
- background-position: right -192px;
+ background-position: right -96px;
}
#dokuwiki__usertools a.action.logout {
- background-position: left -224px;
+ background-position: left -128px;
}
[dir=rtl] #dokuwiki__usertools a.action.logout {
- background-position: right -224px;
+ background-position: right -128px;
}
@@ -155,6 +167,9 @@
#dokuwiki__sitetools {
text-align: right;
}
+[dir=rtl] #dokuwiki__sitetools {
+ text-align: left;
+}
#dokuwiki__sitetools form.search {
display: block;
@@ -165,6 +180,9 @@
width: 18em;
padding: .35em 22px .35em .1em;
}
+[dir=rtl] #dokuwiki__sitetools form.search input.edit {
+ padding: .35em .1em .35em 22px;
+}
#dokuwiki__sitetools form.search input.button {
background: transparent url(images/search.png) no-repeat 0 0;
border-width: 0;
@@ -175,6 +193,11 @@
box-shadow: none;
padding: 0;
}
+[dir=rtl] #dokuwiki__sitetools form.search input.button {
+ background-position: 5px 0;
+ margin-left: 0;
+ margin-right: -20px;
+}
#dokuwiki__sitetools ul {
margin-top: 0.5em;
@@ -182,25 +205,6 @@
#dokuwiki__sitetools li {
}
-#dokuwiki__sitetools a.action.recent {
- background-position: left 0;
-}
-[dir=rtl] #dokuwiki__sitetools a.action.recent {
- background-position: right 0;
-}
-#dokuwiki__sitetools a.action.media {
- background-position: left -32px;
-}
-[dir=rtl] #dokuwiki__sitetools a.action.media {
- background-position: right -32px;
-}
-#dokuwiki__sitetools a.action.index {
- background-position: left -64px;
-}
-[dir=rtl] #dokuwiki__sitetools a.action.index {
- background-position: right -64px;
-}
-
/*____________ breadcrumbs ____________*/
.dokuwiki div.breadcrumbs {
@@ -284,6 +288,10 @@
#dokuwiki__aside ol {
padding-left: 0;
}
+[dir=rtl] #dokuwiki__aside ul,
+[dir=rtl] #dokuwiki__aside ol {
+ padding-right: 0;
+}
#dokuwiki__aside li ul,
#dokuwiki__aside li ol {
margin-bottom: 0;
@@ -309,6 +317,10 @@
overflow: hidden;
padding: 1em 1em 0;
}
+[dir=rtl] .dokuwiki .pageId {
+ right: auto;
+ left: -1em;
+}
.dokuwiki .pageId span {
font-size: 0.875em;
border: solid __background_alt__;
@@ -328,7 +340,7 @@
border: 1px solid #eee;
box-shadow: 0 0 .5em #999;
border-radius: 2px;
- padding: 2em;
+ padding: 1.556em 2em 2em;
margin-bottom: .5em;
overflow: hidden;
word-wrap: break-word;
@@ -338,6 +350,9 @@
font-size: 0.875em;
text-align: right;
}
+[dir=rtl] .dokuwiki .docInfo {
+ text-align: left;
+}
/*____________ misc ____________*/
@@ -375,16 +390,35 @@
border-bottom-left-radius: 4px;
border-left-width: 1px;
}
+[dir=rtl] .dokuwiki div.toolbar button.toolbutton:first-child {
+ border-top-left-radius: 0;
+ border-bottom-left-radius: 0;
+ border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px;
+ border-left-width: 0;
+ border-right-width: 1px;
+}
.dokuwiki div.toolbar button.toolbutton:last-child {
border-top-right-radius: 4px;
border-bottom-right-radius: 4px;
}
+[dir=rtl] .dokuwiki div.toolbar button.toolbutton:last-child {
+ border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px;
+ border-top-right-radius: 0;
+ border-bottom-right-radius: 0;
+ border-left-width: 1px;
+}
.dokuwiki div.section_highlight {
margin: -3em -2em -.01em -2em;
padding: 3em 1em .01em 1em;
border-width: 0 1em;
}
+[dir=rtl] .dokuwiki div.section_highlight {
+ margin-right: -2em;
+ border-right-width: 1em;
+}
.dokuwiki textarea.edit {
font-family: Consolas, "Andale Mono WT", "Andale Mono", "Bitstream Vera Sans Mono", "Liberation Mono", Monaco, "Courier New", monospace;
@@ -392,58 +426,77 @@
.dokuwiki div.preview {
margin: 0 -2em;
- padding: 2em;
+ padding: 0 2em;
+}
+.dokuwiki.hasSidebar div.preview {
+ border-right: __sidebar_width__ solid __background_alt__;
+}
+[dir=rtl] .dokuwiki.hasSidebar div.preview {
+ border-right-width: 0;
+ border-left: __sidebar_width__ solid __background_alt__;
+}
+.dokuwiki div.preview div.pad {
+ padding: 1.556em 0 2em;
}
/*____________ changes to _toc ____________*/
-.dokuwiki div.toc {
- margin: -2em -2em .5em 1.4em;
+#dw__toc {
+ margin: -1.556em -2em .5em 1.4em;
width: __sidebar_width__;
border-left: 1px solid __border__;
background: __background__;
color: inherit;
}
+[dir=rtl] #dw__toc {
+ margin: -1.556em 1.4em .5em -2em;
+ border-left-width: 0;
+ border-right: 1px solid __border__;
+}
-.dokuwiki div.tocheader {
+.dokuwiki h3.toggle {
padding: .5em 1em;
margin-bottom: 0;
font-size: .875em;
letter-spacing: .1em;
}
+#dokuwiki__aside h3.toggle {
+ display: none;
+}
-.dokuwiki .toc span.toc_open,
-.dokuwiki .toc span.toc_close {
+.dokuwiki .toggle strong {
background: transparent url(images/toc-arrows.png) 0 0;
width: 8px;
height: 5px;
margin: .4em 0 0;
}
-.dokuwiki .toc span.toc_open {
+.dokuwiki .toggle.closed strong {
background-position: 0 -5px;
}
-.dokuwiki .toc span.toc_open span,
-.dokuwiki .toc span.toc_close span {
+.dokuwiki .toggle strong span {
display: none;
}
-.dokuwiki #toc__inside {
+#dw__toc > div {
font-size: 0.875em;
padding: .5em 1em 1em;
}
-.dokuwiki #toc__inside ul {
+#dw__toc ul {
padding: 0 0 0 1.2em;
}
-.dokuwiki #toc__inside ul li {
+[dir=rtl] #dw__toc ul {
+ padding: 0 1.5em 0 0;
+}
+#dw__toc ul li {
list-style-image: url(images/toc-bullet.png);
}
-.dokuwiki #toc__inside ul li.clear {
+#dw__toc ul li.clear {
list-style: none;
}
-.dokuwiki #toc__inside ul li div.li {
+#dw__toc ul li div.li {
padding: .2em 0;
}
@@ -470,9 +523,18 @@
text-align: right;
clear: left;
}
+[dir=rtl] #dokuwiki__detail div.img_detail dl dt {
+ float: right;
+ text-align: left;
+ clear: right;
+}
#dokuwiki__detail div.img_detail dl dd {
margin-left: 9.5em;
}
+[dir=rtl] #dokuwiki__detail div.img_detail dl dd {
+ margin-left: 0;
+ margin-right: 9.5em;
+}
/*____________ JS popup ____________*/
@@ -496,6 +558,10 @@
.JSpopup ol {
padding-left: 0;
}
+[dir=rtl] .JSpopup ul,
+[dir=rtl] .JSpopup ol {
+ padding-right: 0;
+}
/* footer
@@ -518,6 +584,10 @@
font-size: 100%;
}
+[dir=rtl] #dokuwiki__footer .license img {
+ margin: 0 0 0 .5em;
+}
+
#dokuwiki__footer div.buttons a img {
opacity: 0.5;
}
diff --git a/lib/tpl/dokuwiki/css/mobile.css b/lib/tpl/dokuwiki/css/mobile.css
index e1052f437..6e07f23ec 100644
--- a/lib/tpl/dokuwiki/css/mobile.css
+++ b/lib/tpl/dokuwiki/css/mobile.css
@@ -5,40 +5,73 @@
* @author Anika Henke <anika@selfthinker.org>
*/
-/* up to 768px screen widths
+/* up to 979px screen widths
********************************************************************/
-@media only screen and (max-width: 768px), only screen and (max-device-width: 960px) {
+@media only screen and (max-width: 979px) {
/* structure */
#dokuwiki__aside {
width: 100%;
float: none;
}
-#dokuwiki__aside > .pad {
+
+#dokuwiki__aside > .pad,
+[dir=rtl] #dokuwiki__aside > .pad {
margin: 0 0 .5em;
+ /* style like .page */
+ background: __background__;
+ color: inherit;
+ border: 1px solid #eee;
+ box-shadow: 0 0 .5em #999;
+ border-radius: 2px;
+ padding: 1em;
+ margin-bottom: .5em;
+}
+
+#dokuwiki__aside h3.toggle {
+ font-size: 1em;
+}
+#dokuwiki__aside h3.toggle.closed {
+ margin-bottom: 0;
+ padding-bottom: 0;
+}
+#dokuwiki__aside h3.toggle.open {
+ border-bottom: 1px solid __border__;
}
-.hasSidebar #dokuwiki__content {
+.showSidebar #dokuwiki__content {
float: none;
margin-left: 0;
width: 100%;
}
-.hasSidebar #dokuwiki__content > .pad {
+.showSidebar #dokuwiki__content > .pad {
margin-left: 0;
}
+[dir=rtl] .showSidebar #dokuwiki__content,
+[dir=rtl] .showSidebar #dokuwiki__content > .pad {
+ margin-right: 0;
+}
+
/* toc */
-.dokuwiki div.toc {
+#dw__toc {
float: none;
margin: 0 0 1em 0;
width: auto;
border-left-width: 0;
border-bottom: 1px solid __border__;
}
-.dokuwiki div.tocheader {
- padding: 0 0 .5em;
+[dir=rtl] #dw__toc {
+ float: none;
+ margin: 0 0 1em 0;
+ border-right-width: 0;
+}
+
+.dokuwiki h3.toggle {
+ padding: 0 .5em .5em 0;
}
-.dokuwiki #toc__inside {
+#dw__toc > div,
+#dokuwiki__aside div.content {
padding: .2em 0 .5em;
}
@@ -46,12 +79,6 @@
.dokuwiki div.page {
padding: 1em;
}
-.dokuwiki .pageId span {
- border-width: 0;
- background-color: __background_site__;
- color: __text_alt__;
- box-shadow: 0 0 0;
-}
/* _edit */
.dokuwiki div.section_highlight {
@@ -65,10 +92,12 @@
}
/* _recent */
-.dokuwiki #dw__recent ul,
-.dokuwiki #page__revisions ul {
+.dokuwiki form.changes ul {
padding-left: 0;
}
+[dir=rtl] .dokuwiki form.changes ul {
+ padding-right: 0;
+}
} /* /@media */
@@ -76,7 +105,11 @@
/* up to 480px screen widths
********************************************************************/
-@media only screen and (max-width: 480px), only screen and (max-device-width: 960px) {
+@media only screen and (max-width: 480px) {
+
+body {
+ font-size: 100%;
+}
/*____________ structure ____________*/
@@ -90,6 +123,7 @@
padding: .5em 0;
}
+
/*____________ header ____________*/
#dokuwiki__header ul.a11y.skip {
@@ -103,10 +137,19 @@
padding-left: 0;
margin: 0;
}
+[dir=rtl] #dokuwiki__header ul.a11y.skip {
+ left: auto !important;
+ right: 0 !important;
+ float: left;
+ padding-right: 0;
+}
#dokuwiki__header ul.a11y.skip li {
margin-left: .35em;
display: inline;
}
+[dir=rtl] #dokuwiki__header ul.a11y.skip li {
+ margin: 0 .35em 0 0;
+}
#dokuwiki__header .headings,
#dokuwiki__header .tools {
@@ -115,9 +158,18 @@
width: auto;
margin-bottom: .5em;
}
+[dir=rtl] #dokuwiki__header .headings,
+[dir=rtl] #dokuwiki__header .tools {
+ float: none;
+ text-align: right;
+ width: auto;
+}
#dokuwiki__sitetools {
text-align: left;
}
+[dir=rtl] #dokuwiki__sitetools {
+ text-align: right;
+}
#dokuwiki__usertools,
#dokuwiki__sitetools ul,
#dokuwiki__sitetools h3,
@@ -133,6 +185,11 @@
margin: 0 .2em .2em 0;
width: 49%;
}
+[dir=rtl] #dokuwiki__sitetools form.search {
+ float: right;
+ margin: 0 0 .2em .2em;
+}
+
#dokuwiki__sitetools form.search input.edit {
width: 100% !important;
}
@@ -148,14 +205,26 @@
float: right;
width: 49%;
}
+[dir=rtl] #dokuwiki__header .mobileTools {
+ float: left;
+}
#dokuwiki__header .mobileTools select {
padding: .3em .1em;
width: 100% !important;
}
+/* force same height on search input and tools select */
+#dokuwiki__sitetools form.search input.edit,
+#dokuwiki__header .mobileTools select {
+ height: 2.1em;
+ line-height: 2.1em;
+ overflow: visible;
+}
+
/*____________ content ____________*/
+#dokuwiki__aside > .pad,
.dokuwiki div.page {
padding: .5em;
}
@@ -178,6 +247,9 @@
.dokuwiki label.block {
text-align: left;
}
+[dir=rtl] .dokuwiki label.block {
+ text-align: right;
+}
.dokuwiki label.block span {
display: block;
}
diff --git a/lib/tpl/dokuwiki/css/pagetools.css b/lib/tpl/dokuwiki/css/pagetools.css
index bfa22cb2e..a40d525b3 100644
--- a/lib/tpl/dokuwiki/css/pagetools.css
+++ b/lib/tpl/dokuwiki/css/pagetools.css
@@ -22,6 +22,10 @@
/* move the tools just outside of the site */
right: 40px;
}
+[dir=rtl] #dokuwiki__usertools {
+ right: auto;
+ left: 40px;
+}
#dokuwiki__pagetools {
@@ -31,6 +35,10 @@
top: 2em;
width: 40px;
}
+[dir=rtl] #dokuwiki__pagetools {
+ right: auto;
+ left: -40px;
+}
#dokuwiki__pagetools div.tools {
position: fixed;
@@ -46,6 +54,11 @@
/* add transparent border to prevent jumping when proper border is added on hover */
border: 1px solid transparent;
}
+[dir=rtl] #dokuwiki__pagetools ul {
+ right: auto;
+ left: 0;
+ text-align: left;
+}
#dokuwiki__pagetools ul li {
padding: 0;
@@ -66,6 +79,10 @@
border: 1px solid transparent;
white-space: nowrap;
}
+[dir=rtl] #dokuwiki__pagetools ul li a {
+ padding: 5px 5px 5px 40px;
+ background-position: left 0;
+}
/* hide labels accessibly when neither on hover nor on focus */
#dokuwiki__pagetools ul li a span {
@@ -82,6 +99,10 @@
border-radius: 2px;
box-shadow: 2px 2px 2px __text_alt__;
}
+[dir=rtl] #dokuwiki__pagetools:hover ul,
+[dir=rtl] #dokuwiki__pagetools ul li a:focus {
+ box-shadow: -2px 2px 2px __text_alt__;
+}
#dokuwiki__pagetools:hover ul li a span,
#dokuwiki__pagetools ul li a:focus span {
@@ -108,6 +129,14 @@
#dokuwiki__pagetools ul li a.edit:focus {
background-position: right -45px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.edit {
+ background-position: left 0;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.edit:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.edit:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.edit:focus {
+ background-position: left -45px;
+}
#dokuwiki__pagetools ul li a.create {
background-position: right -90px;
@@ -117,6 +146,14 @@
#dokuwiki__pagetools ul li a.create:focus {
background-position: right -135px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.create {
+ background-position: left -90px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.create:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.create:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.create:focus {
+ background-position: left -135px;
+}
#dokuwiki__pagetools ul li a.show {
background-position: right -270px;
@@ -126,6 +163,14 @@
#dokuwiki__pagetools ul li a.show:focus {
background-position: right -315px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.show {
+ background-position: left -270px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.show:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.show:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.show:focus {
+ background-position: left -315px;
+}
#dokuwiki__pagetools ul li a.source {
background-position: right -360px;
@@ -135,6 +180,14 @@
#dokuwiki__pagetools ul li a.source:focus {
background-position: right -405px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.source {
+ background-position: left -360px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.source:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.source:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.source:focus {
+ background-position: left -405px;
+}
#dokuwiki__pagetools ul li a.draft {
background-position: right -180px;
@@ -144,6 +197,14 @@
#dokuwiki__pagetools ul li a.draft:focus {
background-position: right -225px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.draft {
+ background-position: left -180px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.draft:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.draft:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.draft:focus {
+ background-position: left -225px;
+}
#dokuwiki__pagetools ul li a.revs {
background-position: right -540px;
@@ -154,6 +215,15 @@
.mode_revisions #dokuwiki__pagetools ul li a.revs {
background-position: right -585px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.revs {
+ background-position: left -540px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.revs:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.revs:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.revs:focus,
+.mode_revisions [dir=rtl] #dokuwiki__pagetools ul li a.revs {
+ background-position: left -585px;
+}
#dokuwiki__pagetools ul li a.backlink {
background-position: right -630px;
@@ -164,6 +234,15 @@
.mode_backlink #dokuwiki__pagetools ul li a.backlink {
background-position: right -675px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.backlink {
+ background-position: left -630px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.backlink:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.backlink:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.backlink:focus,
+.mode_backlink [dir=rtl] #dokuwiki__pagetools ul li a.backlink {
+ background-position: left -675px;
+}
#dokuwiki__pagetools ul li a.top {
background-position: right -810px;
@@ -173,6 +252,14 @@
#dokuwiki__pagetools ul li a.top:focus {
background-position: right -855px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.top {
+ background-position: left -810px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.top:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.top:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.top:focus {
+ background-position: left -855px;
+}
#dokuwiki__pagetools ul li a.revert {
background-position: right -450px;
@@ -183,6 +270,15 @@
.mode_revert #dokuwiki__pagetools ul li a.revert {
background-position: right -495px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.revert {
+ background-position: left -450px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.revert:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.revert:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.revert:focus,
+.mode_revert [dir=rtl] #dokuwiki__pagetools ul li a.revert {
+ background-position: left -495px;
+}
#dokuwiki__pagetools ul li a.subscribe {
background-position: right -720px;
@@ -193,6 +289,15 @@
.mode_subscribe #dokuwiki__pagetools ul li a.subscribe {
background-position: right -765px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.subscribe {
+ background-position: left -720px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.subscribe:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.subscribe:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.subscribe:focus,
+.mode_subscribe [dir=rtl] #dokuwiki__pagetools ul li a.subscribe {
+ background-position: left -765px;
+}
#dokuwiki__pagetools ul li a.mediaManager {
background-position: right -900px;
@@ -202,6 +307,14 @@
#dokuwiki__pagetools ul li a.mediaManager:focus {
background-position: right -945px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager {
+ background-position: left -900px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager:focus {
+ background-position: left -945px;
+}
#dokuwiki__pagetools ul li a.back {
background-position: right -990px;
@@ -211,3 +324,11 @@
#dokuwiki__pagetools ul li a.back:focus {
background-position: right -1035px;
}
+[dir=rtl] #dokuwiki__pagetools ul li a.back {
+ background-position: left -990px;
+}
+[dir=rtl] #dokuwiki__pagetools ul li a.back:hover,
+[dir=rtl] #dokuwiki__pagetools ul li a.back:active,
+[dir=rtl] #dokuwiki__pagetools ul li a.back:focus {
+ background-position: left -1035px;
+}
diff --git a/lib/tpl/dokuwiki/css/print.css b/lib/tpl/dokuwiki/css/print.css
index 58b8a5f0d..191d50c28 100644
--- a/lib/tpl/dokuwiki/css/print.css
+++ b/lib/tpl/dokuwiki/css/print.css
@@ -21,7 +21,8 @@ div.error,
#dokuwiki__header .tools,
#dokuwiki__aside,
.dokuwiki .breadcrumbs,
-.dokuwiki .toc,
+#dw__toc,
+h3.toggle,
.dokuwiki .secedit,
#dokuwiki__pagetools,
#dokuwiki__footer {
diff --git a/lib/tpl/dokuwiki/css/rtl.css b/lib/tpl/dokuwiki/css/rtl.css
deleted file mode 100644
index e0f81bb21..000000000
--- a/lib/tpl/dokuwiki/css/rtl.css
+++ /dev/null
@@ -1,593 +0,0 @@
-/**
- * This file provides layout and design corrections for right-to-left
- * languages.
- *
- * @author Anika Henke <anika@selfthinker.org>
- */
-
-/*____________ basic ____________*/
-
-[dir=rtl] caption,
-[dir=rtl] td,
-[dir=rtl] th {
- text-align: right;
-}
-
-[dir=rtl] ul,
-[dir=rtl] ol {
- padding: 0 1.5em 0 0;
-}
-[dir=rtl] li,
-[dir=rtl] dd {
- margin: 0 1.5em 0 0;
-}
-[dir=rtl] blockquote {
- border-width: 0 .25em 0 0;
-}
-
-[dir=rtl] h1,
-[dir=rtl] h2,
-[dir=rtl] h3,
-[dir=rtl] h4,
-[dir=rtl] h5,
-[dir=rtl] h6,
-[dir=rtl] caption,
-[dir=rtl] legend {
- clear: right;
-}
-
-[dir=rtl] .a11y {
- left: auto;
- right: -9000px;
-}
-
-
-/*____________ _imgdetail ____________*/
-
-[dir=rtl] #dokuwiki__detail div.content img {
- float: right;
- margin-right: 0;
- margin-left: 1.5em;
-}
-[dir=rtl] #dokuwiki__detail div.content div.img_detail {
- float: right
-}
-
-
-/*____________ _mediamanager ____________*/
-
-[dir=rtl] #mediamgr__aside {
- left: auto;
- right: 0;
- border-right-width: 0;
- border-left: 1px solid __border__;
-}
-[dir=rtl] #mediamgr__content {
- right: auto;
- left: 0;
-}
-
-[dir=rtl] #media__opts input {
- margin-right: 0;
- margin-left: .3em;
-}
-
-[dir=rtl] #media__tree ul {
- padding-left: 0;
- padding-right: .2em;
-}
-[dir=rtl] #media__tree ul li {
- clear: right;
- margin-right: 0;
-}
-[dir=rtl] #media__tree ul li img {
- float: right;
- padding: .5em 0 0 .3em;
-}
-[dir=rtl] #media__tree ul li li {
- margin-left: 0;
- margin-right: 1.5em;
-}
-
-[dir=rtl] #media__content a.mediafile {
- margin-right: 0;
- margin-left: 1.5em;
-}
-[dir=rtl] #media__content div.detail div.thumb {
- float: right;
- margin: 0 18px 0 .5em;
-}
-[dir=rtl] #media__content form.meta div.metafield {
- clear: right;
-}
-[dir=rtl] #media__content form.meta label {
- float: right;
- clear: right;
-}
-[dir=rtl] #media__content form.meta .edit {
- float: right;
-}
-[dir=rtl] #media__content form.meta div.buttons {
- clear: right;
- margin: .2em 25% 0 0;
-}
-
-
-/*____________ _links ____________*/
-
-/* 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 17px 0 0;
-}
-
-
-/*____________ _toc ____________*/
-
-[dir=rtl] .dokuwiki div.toc {
- float: left;
- margin: 0 1.4em 1.4em 0;
-}
-[dir=rtl] .dokuwiki .toc span.toc_open,
-[dir=rtl] .dokuwiki .toc span.toc_close {
- float: left;
-}
-[dir=rtl] .dokuwiki #toc__inside ul ul {
- padding-left: 0;
- padding-right: 1em;
-}
-
-[dir=rtl] .dokuwiki ul.idx {
- padding-right: 0;
-}
-[dir=rtl] .dokuwiki ul.idx li.closed {
- list-style-image: url(images/closed-rtl.png);
-}
-
-
-/*____________ _footnotes ____________*/
-
-
-/*____________ _search ____________*/
-
-[dir=rtl] .dokuwiki div.search_quickresult ul li {
- float: right;
-}
-[dir=rtl] .dokuwiki form.search div.ajax_qsearch {
- left: auto;
- right: -13.5em;
- text-align: right;
-}
-
-
-/*____________ _recent ____________*/
-
-[dir=rtl] .dokuwiki #dw__recent ul li,
-[dir=rtl] .dokuwiki #page__revisions ul li {
- margin-right: 0;
-}
-
-
-/*____________ _diff ____________*/
-
-
-/*____________ _edit ____________*/
-
-[dir=rtl] .dokuwiki div.toolbar #draft__status {
- float: left;
-}
-[dir=rtl] .dokuwiki #wiki__editbar #size__ctl {
- float: left;
-}
-[dir=rtl] .dokuwiki #wiki__editbar #size__ctl img {
- cursor: pointer;
-}
-[dir=rtl] .dokuwiki #wiki__editbar .editButtons {
- margin-right: 0;
- margin-left: 1em;
-}
-
-[dir=rtl] .dokuwiki .secedit {
- float: left;
-}
-
-
-/*____________ _modal ____________*/
-
-[dir=rtl] #link__wiz_close {
- float: left;
-}
-[dir=rtl] #link__wiz_result {
- text-align: right;
-}
-[dir=rtl] #link__wiz_result div.type_u,
-[dir=rtl] #link__wiz_result div.type_f,
-[dir=rtl] #link__wiz_result div.type_d {
- padding: 3px 22px 3px 3px;
- background-position: 257px 3px;
-}
-
-
-/*____________ _forms ____________*/
-
-[dir=rtl] .dokuwiki label.block {
- text-align: left;
-}
-[dir=rtl] .dokuwiki label.simple {
- text-align: right;
-}
-
-[dir=rtl] form#subscribe__form fieldset {
- text-align: right;
-}
-
-
-/*____________ _admin ____________*/
-
-[dir=rtl] .dokuwiki ul.admin_tasks {
- float: right;
-}
-[dir=rtl] .dokuwiki ul.admin_tasks li {
- padding-left: 0;
- padding-right: 35px;
- background-position: right 0;
-}
-
-[dir=rtl] .dokuwiki #admin__version {
- clear: right;
- float: left;
-}
-
-
-/*____________ includes ____________*/
-
-
-/*____________ structure ____________*/
-
-[dir=rtl] #dokuwiki__header .headings {
- float: right;
- text-align: right;
-}
-[dir=rtl] #dokuwiki__header .tools {
- float: left;
- text-align: left;
-}
-
-[dir=rtl] #dokuwiki__aside {
- float: right;
-}
-[dir=rtl] #dokuwiki__aside > .pad {
- margin: 0 0 0 1.5em;
-}
-
-[dir=rtl] .hasSidebar #dokuwiki__content {
- float: left;
- margin-left: 0;
- margin-right: -__sidebar_width__;
-}
-[dir=rtl] .hasSidebar #dokuwiki__content > .pad {
- margin-left: 0;
- margin-right: __sidebar_width__;
-}
-
-/*____________ design ____________*/
-
-[dir=rtl] #dokuwiki__header h1 img {
- float: right;
- margin-left: .5em;
- margin-right: 0;
-}
-
-[dir=rtl] #dokuwiki__sitetools form.search input.edit {
- padding: .35em .1em .35em 22px;
-}
-[dir=rtl] #dokuwiki__sitetools form.search input.button {
- background-position: 5px 0;
- margin-left: 0;
- margin-right: -20px;
-}
-
-[dir=rtl] #dokuwiki__usertools {
- text-align: left;
- left: 40px;
- right: auto;
-}
-
-[dir=rtl] #dokuwiki__sitetools {
- text-align: left;
-}
-
-[dir=rtl] #dokuwiki__aside ul, #dokuwiki__aside ol {
- padding-right: 0;
-}
-
-[dir=rtl] .dokuwiki .pageId {
- right: auto;
- left: -1em;
-}
-
-[dir=rtl] .dokuwiki .docInfo {
- text-align: left;
-}
-
-[dir=rtl] .dokuwiki div.toolbar button.toolbutton:first-child {
- border-top-left-radius: 0;
- border-bottom-left-radius: 0;
- border-top-right-radius: 4px;
- border-bottom-right-radius: 4px;
- border-left-width: 0;
- border-right-width: 1px;
-}
-[dir=rtl] .dokuwiki div.toolbar button.toolbutton:last-child {
- border-top-left-radius: 4px;
- border-bottom-left-radius: 4px;
- border-top-right-radius: 0;
- border-bottom-right-radius: 0;
- border-left-width: 1px;
-}
-
-[dir=rtl] .dokuwiki div.section_highlight {
- margin-right: -2em;
- border-right-width: 1em;
-}
-
-[dir=rtl] #dokuwiki__footer .license img {
- margin: 0 0 0 .5em;
-}
-
-[dir=rtl] .dokuwiki div.toc {
- margin: -2em 1.4em .5em -2em;
- border-left-width: 0;
- border-right: 1px solid __border__;
-}
-[dir=rtl] .dokuwiki #toc__inside ul {
- padding: 0 1.5em 0 0;
-}
-
-[dir=rtl] #dokuwiki__detail div.img_detail dl dt {
- float: right;
- text-align: left;
- clear: right;
-}
-[dir=rtl] #dokuwiki__detail div.img_detail dl dd {
- margin-left: 0;
- margin-right: 9.5em;
-}
-
-
-/*____________ pagetools ____________*/
-
-[dir=rtl] #dokuwiki__usertools {
- right: auto;
- left: 40px;
-}
-
-[dir=rtl] #dokuwiki__pagetools {
- right: auto;
- left: -40px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul {
- right: auto;
- left: 0;
- text-align: left;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a {
- padding: 5px 5px 5px 40px;
- background-position: left 0;
-}
-
-[dir=rtl] #dokuwiki__pagetools:hover ul,
-[dir=rtl] #dokuwiki__pagetools ul li a:focus {
- box-shadow: -2px 2px 2px __text_alt__;
-}
-
-/* all available icons in sprite */
-[dir=rtl] #dokuwiki__pagetools ul li a.edit {
- background-position: left 0;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.edit:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.edit:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.edit:focus {
- background-position: left -45px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.create {
- background-position: left -90px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.create:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.create:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.create:focus {
- background-position: left -135px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.show {
- background-position: left -270px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.show:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.show:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.show:focus {
- background-position: left -315px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.source {
- background-position: left -360px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.source:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.source:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.source:focus {
- background-position: left -405px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.draft {
- background-position: left -180px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.draft:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.draft:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.draft:focus {
- background-position: left -225px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.revs {
- background-position: left -540px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.revs:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.revs:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.revs:focus,
-.mode_revisions [dir=rtl] #dokuwiki__pagetools ul li a.revs {
- background-position: left -585px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.backlink {
- background-position: left -630px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.backlink:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.backlink:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.backlink:focus,
-.mode_backlink [dir=rtl] #dokuwiki__pagetools ul li a.backlink {
- background-position: left -675px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.top {
- background-position: left -810px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.top:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.top:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.top:focus {
- background-position: left -855px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.revert {
- background-position: left -450px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.revert:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.revert:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.revert:focus,
-.mode_revert [dir=rtl] #dokuwiki__pagetools ul li a.revert {
- background-position: left -495px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.subscribe {
- background-position: left -720px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.subscribe:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.subscribe:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.subscribe:focus,
-.mode_subscribe [dir=rtl] #dokuwiki__pagetools ul li a.subscribe {
- background-position: left -765px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager {
- background-position: left -900px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.mediaManager:focus {
- background-position: left -945px;
-}
-
-[dir=rtl] #dokuwiki__pagetools ul li a.back {
- background-position: left -990px;
-}
-[dir=rtl] #dokuwiki__pagetools ul li a.back:hover,
-[dir=rtl] #dokuwiki__pagetools ul li a.back:active,
-[dir=rtl] #dokuwiki__pagetools ul li a.back:focus {
- background-position: left -1035px;
-}
-
-
-/*____________ content ____________*/
-
-/* section indenting
-[dir=rtl] .dokuwiki .page h1 {margin-left: 0; margin-right: 0;}
-[dir=rtl] .dokuwiki .page h2 {margin-left: 0; margin-right: .666em;}
-[dir=rtl] .dokuwiki .page h3 {margin-left: 0; margin-right: 1.776em;}
-[dir=rtl] .dokuwiki .page h4 {margin-left: 0; margin-right: 3em;}
-[dir=rtl] .dokuwiki .page h5 {margin-left: 0; margin-right: 4.5712em;}
-[dir=rtl] .dokuwiki .page div.level1 {margin-left: 0; margin-right: 0;}
-[dir=rtl] .dokuwiki .page div.level2 {margin-left: 0; margin-right: 1em;}
-[dir=rtl] .dokuwiki .page div.level3 {margin-left: 0; margin-right: 2em;}
-[dir=rtl] .dokuwiki .page div.level4 {margin-left: 0; margin-right: 3em;}
-[dir=rtl] .dokuwiki .page div.level5 {margin-left: 0; margin-right: 4em;}
-*/
-
-[dir=rtl] .dokuwiki dl.code dt,
-[dir=rtl] .dokuwiki dl.file dt {
- margin-left: 0;
- margin-right: 1em;
-}
-
-[dir=rtl] .JSpopup ul,
-[dir=rtl] .JSpopup ol {
- padding-right: 0;
-}
-
-
-/*____________ mobile ____________*/
-
-@media only screen and (max-width: 768px), only screen and (max-device-width: 960px) {
-
-
-[dir=rtl] .hasSidebar #dokuwiki__content,
-[dir=rtl] .hasSidebar #dokuwiki__content > .pad {
- margin-right: 0;
-}
-
-[dir=rtl] .dokuwiki div.toc {
- float: none;
- margin: 0 0 1em 0;
- border-right-width: 0;
-}
-
-[dir=rtl] .dokuwiki #dw__recent ul,
-[dir=rtl] .dokuwiki #page__revisions ul {
- padding-right: 0;
-}
-
-
-} /* /@media */
-
-@media only screen and (max-width: 480px), only screen and (max-device-width: 480px) {
-
-
-[dir=rtl] #dokuwiki__header ul.a11y.skip {
- left: auto !important;
- right: 0 !important;
- float: left;
- padding-right: 0;
-}
-[dir=rtl] #dokuwiki__header ul.a11y.skip li {
- margin: 0 .35em 0 0;
-}
-
-[dir=rtl] #dokuwiki__header .headings,
-[dir=rtl] #dokuwiki__header .tools {
- float: none;
- text-align: right;
- width: auto;
-}
-[dir=rtl] #dokuwiki__sitetools {
- text-align: right;
-}
-
-[dir=rtl] #dokuwiki__sitetools form.search {
- float: right;
- margin: 0 0 .2em .2em;
-}
-
-[dir=rtl] #dokuwiki__header .mobileTools {
- float: left;
-}
-
-[dir=rtl] .dokuwiki label.block {
- text-align: right;
-}
-
-
-
-} /* /@media */
diff --git a/lib/tpl/dokuwiki/css/structure.css b/lib/tpl/dokuwiki/css/structure.css
index 9cca1aa3b..00642e90b 100644
--- a/lib/tpl/dokuwiki/css/structure.css
+++ b/lib/tpl/dokuwiki/css/structure.css
@@ -23,10 +23,18 @@ body {
#dokuwiki__header .headings {
float: left;
}
+ [dir=rtl] #dokuwiki__header .headings {
+ float: right;
+ text-align: right;
+ }
#dokuwiki__header .tools {
float: right;
text-align: right;
}
+ [dir=rtl] #dokuwiki__header .tools {
+ float: left;
+ text-align: left;
+ }
#dokuwiki__site .wrapper {
position: relative;
@@ -38,18 +46,33 @@ body {
position: relative;
display: block;
}
+ [dir=rtl] #dokuwiki__aside {
+ float: right;
+ }
#dokuwiki__aside > .pad {
margin: 0 1.5em 0 0;
}
+ [dir=rtl] #dokuwiki__aside > .pad {
+ margin: 0 0 0 1.5em;
+ }
- .hasSidebar #dokuwiki__content {
+ .showSidebar #dokuwiki__content {
float: right;
margin-left: -__sidebar_width__;
width: 100%;
}
- .hasSidebar #dokuwiki__content > .pad {
+ [dir=rtl] .showSidebar #dokuwiki__content {
+ float: left;
+ margin-left: 0;
+ margin-right: -__sidebar_width__;
+ }
+ .showSidebar #dokuwiki__content > .pad {
margin-left: __sidebar_width__;
}
+ [dir=rtl] .showSidebar #dokuwiki__content > .pad {
+ margin-left: 0;
+ margin-right: __sidebar_width__;
+ }
#dokuwiki__footer {
clear: both;
diff --git a/lib/tpl/dokuwiki/detail.php b/lib/tpl/dokuwiki/detail.php
index a3516a7ed..a8c5fef8a 100644
--- a/lib/tpl/dokuwiki/detail.php
+++ b/lib/tpl/dokuwiki/detail.php
@@ -10,18 +10,16 @@
// must be run from within DokuWiki
if (!defined('DOKU_INC')) die();
-$showSidebar = $conf['sidebar'] && page_exists($conf['sidebar']) && ($ACT=='show');
-?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $conf['lang']?>"
- lang="<?php echo $conf['lang']?>" dir="<?php echo $lang['direction'] ?>">
+?><!DOCTYPE html>
+<html lang="<?php echo $conf['lang']?>" dir="<?php echo $lang['direction'] ?>" class="no-js">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta charset="utf-8" />
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><![endif]-->
<title>
<?php echo hsc(tpl_img_getTag('IPTC.Headline',$IMG))?>
[<?php echo strip_tags($conf['title'])?>]
</title>
+ <script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script>
<?php tpl_metaheaders()?>
<meta name="viewport" content="width=device-width,initial-scale=1" />
<?php echo tpl_favicon(array('favicon', 'mobile')) ?>
@@ -31,7 +29,7 @@ $showSidebar = $conf['sidebar'] && page_exists($conf['sidebar']) && ($ACT=='show
<body>
<!--[if lte IE 7 ]><div id="IE7"><![endif]--><!--[if IE 8 ]><div id="IE8"><![endif]-->
<div id="dokuwiki__site"><div id="dokuwiki__top"
- class="dokuwiki site mode_<?php echo $ACT ?> <?php echo ($showSidebar) ? 'hasSidebar' : ''; ?>">
+ class="dokuwiki site mode_<?php echo $ACT ?>">
<?php include('tpl_header.php') ?>
diff --git a/lib/tpl/dokuwiki/images/apple-touch-icon.png b/lib/tpl/dokuwiki/images/apple-touch-icon.png
index 45fa4e7b0..fb5f108c0 100644
--- a/lib/tpl/dokuwiki/images/apple-touch-icon.png
+++ b/lib/tpl/dokuwiki/images/apple-touch-icon.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/bullet.png b/lib/tpl/dokuwiki/images/bullet.png
index 5da537443..5e557b334 100644
--- a/lib/tpl/dokuwiki/images/bullet.png
+++ b/lib/tpl/dokuwiki/images/bullet.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/button-dw.png b/lib/tpl/dokuwiki/images/button-dw.png
index 97272d968..8d6aea898 100644
--- a/lib/tpl/dokuwiki/images/button-dw.png
+++ b/lib/tpl/dokuwiki/images/button-dw.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/button-rss.png b/lib/tpl/dokuwiki/images/button-rss.png
index f2438043f..b7cddadec 100644
--- a/lib/tpl/dokuwiki/images/button-rss.png
+++ b/lib/tpl/dokuwiki/images/button-rss.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/closed-rtl.png b/lib/tpl/dokuwiki/images/closed-rtl.png
index 85ebd59e1..caa027e34 100644
--- a/lib/tpl/dokuwiki/images/closed-rtl.png
+++ b/lib/tpl/dokuwiki/images/closed-rtl.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/closed.png b/lib/tpl/dokuwiki/images/closed.png
index 3691ebc17..e3bd0f9e9 100644
--- a/lib/tpl/dokuwiki/images/closed.png
+++ b/lib/tpl/dokuwiki/images/closed.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/email.png b/lib/tpl/dokuwiki/images/email.png
index 4ba4aad2f..d1d4a5fd5 100644
--- a/lib/tpl/dokuwiki/images/email.png
+++ b/lib/tpl/dokuwiki/images/email.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/external-link.png b/lib/tpl/dokuwiki/images/external-link.png
index 60fc8716b..a4d5de17c 100644
--- a/lib/tpl/dokuwiki/images/external-link.png
+++ b/lib/tpl/dokuwiki/images/external-link.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/logo.png b/lib/tpl/dokuwiki/images/logo.png
index 8b794dd64..35640279c 100644
--- a/lib/tpl/dokuwiki/images/logo.png
+++ b/lib/tpl/dokuwiki/images/logo.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/open.png b/lib/tpl/dokuwiki/images/open.png
index 40ff129be..5f2d408c5 100644
--- a/lib/tpl/dokuwiki/images/open.png
+++ b/lib/tpl/dokuwiki/images/open.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/page-gradient.png b/lib/tpl/dokuwiki/images/page-gradient.png
new file mode 100644
index 000000000..8e16a2805
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/page-gradient.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/pagetools-sprite.png b/lib/tpl/dokuwiki/images/pagetools-sprite.png
index bbd7fd361..898f0f4a6 100644
--- a/lib/tpl/dokuwiki/images/pagetools-sprite.png
+++ b/lib/tpl/dokuwiki/images/pagetools-sprite.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/resizecol.png b/lib/tpl/dokuwiki/images/resizecol.png
index f0111507c..b5aeec004 100644
--- a/lib/tpl/dokuwiki/images/resizecol.png
+++ b/lib/tpl/dokuwiki/images/resizecol.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/search.png b/lib/tpl/dokuwiki/images/search.png
index 2adfc7357..1ab7866fb 100644
--- a/lib/tpl/dokuwiki/images/search.png
+++ b/lib/tpl/dokuwiki/images/search.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/sitetools.png b/lib/tpl/dokuwiki/images/sitetools.png
deleted file mode 100644
index 62a17a0c3..000000000
--- a/lib/tpl/dokuwiki/images/sitetools.png
+++ /dev/null
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/toc-arrows.png b/lib/tpl/dokuwiki/images/toc-arrows.png
index 9f441eb26..4a353e4f6 100644
--- a/lib/tpl/dokuwiki/images/toc-arrows.png
+++ b/lib/tpl/dokuwiki/images/toc-arrows.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/toc-bullet.png b/lib/tpl/dokuwiki/images/toc-bullet.png
index a6f0169c3..fc771b97e 100644
--- a/lib/tpl/dokuwiki/images/toc-bullet.png
+++ b/lib/tpl/dokuwiki/images/toc-bullet.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/unc.png b/lib/tpl/dokuwiki/images/unc.png
index 6dd3d365c..a552d6e6f 100644
--- a/lib/tpl/dokuwiki/images/unc.png
+++ b/lib/tpl/dokuwiki/images/unc.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/images/usertools.png b/lib/tpl/dokuwiki/images/usertools.png
new file mode 100644
index 000000000..e99b6596e
--- /dev/null
+++ b/lib/tpl/dokuwiki/images/usertools.png
Binary files differ
diff --git a/lib/tpl/dokuwiki/main.php b/lib/tpl/dokuwiki/main.php
index 57c94f174..2406a206b 100644
--- a/lib/tpl/dokuwiki/main.php
+++ b/lib/tpl/dokuwiki/main.php
@@ -10,15 +10,15 @@
if (!defined('DOKU_INC')) die(); /* must be run from within DokuWiki */
-$showSidebar = $conf['sidebar'] && page_exists($conf['sidebar']) && ($ACT=='show');
-?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $conf['lang'] ?>"
- lang="<?php echo $conf['lang'] ?>" dir="<?php echo $lang['direction'] ?>">
+$hasSidebar = page_findnearest($conf['sidebar']);
+$showSidebar = $hasSidebar && ($ACT=='show');
+?><!DOCTYPE html>
+<html lang="<?php echo $conf['lang'] ?>" dir="<?php echo $lang['direction'] ?>" class="no-js">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta charset="utf-8" />
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><![endif]-->
<title><?php tpl_pagetitle() ?> [<?php echo strip_tags($conf['title']) ?>]</title>
+ <script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script>
<?php tpl_metaheaders() ?>
<meta name="viewport" content="width=device-width,initial-scale=1" />
<?php echo tpl_favicon(array('favicon', 'mobile')) ?>
@@ -28,7 +28,8 @@ $showSidebar = $conf['sidebar'] && page_exists($conf['sidebar']) && ($ACT=='show
<body>
<!--[if lte IE 7 ]><div id="IE7"><![endif]--><!--[if IE 8 ]><div id="IE8"><![endif]-->
<div id="dokuwiki__site"><div id="dokuwiki__top"
- class="dokuwiki site mode_<?php echo $ACT ?> <?php echo ($showSidebar) ? 'hasSidebar' : ''; ?>">
+ class="dokuwiki site mode_<?php echo $ACT ?> <?php echo ($showSidebar) ? 'showSidebar' : '';
+ ?> <?php echo ($hasSidebar) ? 'hasSidebar' : ''; ?>">
<?php include('tpl_header.php') ?>
@@ -37,10 +38,13 @@ $showSidebar = $conf['sidebar'] && page_exists($conf['sidebar']) && ($ACT=='show
<?php if($showSidebar): ?>
<!-- ********** ASIDE ********** -->
<div id="dokuwiki__aside"><div class="pad include group">
- <?php tpl_flush() ?>
- <?php tpl_includeFile('sidebarheader.html') ?>
- <?php tpl_include_page($conf['sidebar']) ?>
- <?php tpl_includeFile('sidebarfooter.html') ?>
+ <h3 class="toggle"><?php echo $lang['sidebar'] ?></h3>
+ <div class="content">
+ <?php tpl_flush() ?>
+ <?php tpl_includeFile('sidebarheader.html') ?>
+ <?php tpl_sidebar() ?>
+ <?php tpl_includeFile('sidebarfooter.html') ?>
+ </div>
</div></div><!-- /aside -->
<?php endif; ?>
diff --git a/lib/tpl/dokuwiki/mediamanager.php b/lib/tpl/dokuwiki/mediamanager.php
index 1f3b9661b..23c9cee79 100644
--- a/lib/tpl/dokuwiki/mediamanager.php
+++ b/lib/tpl/dokuwiki/mediamanager.php
@@ -8,17 +8,16 @@
// must be run from within DokuWiki
if (!defined('DOKU_INC')) die();
-?><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
- "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
-<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="<?php echo $conf['lang']?>"
- lang="<?php echo $conf['lang']?>" dir="<?php echo $lang['direction'] ?>" class="popup">
+?><!DOCTYPE html>
+<html lang="<?php echo $conf['lang']?>" dir="<?php echo $lang['direction'] ?>" class="popup no-js">
<head>
- <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+ <meta charset="utf-8" />
<!--[if IE]><meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1" /><![endif]-->
<title>
<?php echo hsc($lang['mediaselect'])?>
[<?php echo strip_tags($conf['title'])?>]
</title>
+ <script>(function(H){H.className=H.className.replace(/\bno-js\b/,'js')})(document.documentElement)</script>
<?php tpl_metaheaders()?>
<meta name="viewport" content="width=device-width,initial-scale=1" />
<?php echo tpl_favicon(array('favicon', 'mobile')) ?>
diff --git a/lib/tpl/dokuwiki/script.js b/lib/tpl/dokuwiki/script.js
new file mode 100644
index 000000000..d858bda89
--- /dev/null
+++ b/lib/tpl/dokuwiki/script.js
@@ -0,0 +1,75 @@
+/**
+ * We handle several device classes based on browser width.
+ * see http://twitter.github.com/bootstrap/scaffolding.html#responsive
+ *
+ * - desktop: 980+
+ * - mobile: < 980
+ * - tablet 481 - 979 (ostensibly for tablets in portrait mode)
+ * - phone <= 480
+ */
+var device_class = ''; // not yet known
+var device_classes = 'desktop mobile tablet phone';
+
+function tpl_dokuwiki_mobile(){
+
+ // determine our device pattern
+ // TODO: consider moving into dokuwiki core
+ var w = document.body.clientWidth;
+ if (w > 979) {
+ if (device_class == 'desktop') return;
+ device_class = 'desktop';
+ } else if (w > 480) {
+ if (device_class.match(/tablet/)) return;
+ device_class = 'mobile tablet';
+ } else {
+ if (device_class.match(/phone/)) return;
+ device_class = 'mobile phone';
+ }
+
+ jQuery('html').removeClass(device_classes).addClass(device_class);
+
+ // handle some layout changes based on change in device
+ var $handle = jQuery('#dokuwiki__aside h3.toggle');
+ var $toc = jQuery('#dw__toc h3');
+
+ if (device_class == 'desktop') {
+ // reset for desktop mode
+ if($handle.length) {
+ $handle[0].setState(1);
+ $handle.hide();
+ }
+ if($toc.length) {
+ $toc[0].setState(1);
+ }
+ }
+ if (device_class.match(/mobile/)){
+ // toc and sidebar hiding
+ if($handle.length) {
+ $handle.show();
+ $handle[0].setState(-1);
+ }
+ if($toc.length) {
+ $toc[0].setState(-1);
+ }
+ }
+}
+
+jQuery(function(){
+ var resizeTimer;
+ dw_page.makeToggle('#dokuwiki__aside h3.toggle','#dokuwiki__aside div.content');
+
+ tpl_dokuwiki_mobile();
+ jQuery(window).bind('resize',
+ function(){
+ if (resizeTimer) clearTimeout(resizeTimer);
+ resizeTimer = setTimeout(tpl_dokuwiki_mobile,200);
+ }
+ );
+
+ // increase sidebar length to match content (desktop mode only)
+ var $sidebar = jQuery('.desktop #dokuwiki__aside');
+ if($sidebar.length) {
+ var $content = jQuery('#dokuwiki__content div.page');
+ $content.css('min-height', $sidebar.height());
+ }
+});
diff --git a/lib/tpl/dokuwiki/style.ini b/lib/tpl/dokuwiki/style.ini
index b8e55bcc8..45e68e3ed 100644
--- a/lib/tpl/dokuwiki/style.ini
+++ b/lib/tpl/dokuwiki/style.ini
@@ -29,10 +29,9 @@ css/design.css = screen
css/pagetools.css = screen
css/content.css = screen
css/includes.css = screen
-css/mobile.css = screen
-css/rtl.css = screen
-css/print.css = print
+css/mobile.css = all
+css/print.css = print
; This section is used to configure some placeholder values used in
@@ -68,6 +67,6 @@ __missing__ = "#d30"
; highlighting search snippets
__highlight__ = "#ff9"
-; sidebar width
+; site and sidebar widths
__site_width__ = "75em"
__sidebar_width__ = "16em"
diff --git a/lib/tpl/dokuwiki/tpl_header.php b/lib/tpl/dokuwiki/tpl_header.php
index 1d2517ee1..f2e720308 100644
--- a/lib/tpl/dokuwiki/tpl_header.php
+++ b/lib/tpl/dokuwiki/tpl_header.php
@@ -1,7 +1,6 @@
<!-- ********** HEADER ********** -->
<div id="dokuwiki__header"><div class="pad group">
- <?php html_msgarea() ?>
<?php tpl_includeFile('header.html') ?>
<div class="headings group">
@@ -77,5 +76,7 @@
</div>
<?php endif ?>
+ <?php html_msgarea() ?>
+
<hr class="a11y" />
</div></div><!-- /header -->
diff --git a/lib/tpl/index.php b/lib/tpl/index.php
index 0273e5678..4570f70f5 100644
--- a/lib/tpl/index.php
+++ b/lib/tpl/index.php
@@ -54,7 +54,7 @@ if ($ini) {
echo '<td>'.htmlspecialchars($val).'</td>';
echo '<td>';
if(preg_match('/^#[0-f]{3,6}$/i',$val)){
- echo '<div class="color" style="background-color:'.$val.';">&nbsp;</div>';
+ echo '<div class="color" style="background-color:'.$val.';">&#160;</div>';
}
echo '</td>';
echo '</tr>';