diff options
83 files changed, 1012 insertions, 597 deletions
diff --git a/_test/cases/inc/DifferenceEngine.test.php b/_test/cases/inc/DifferenceEngine.test.php new file mode 100644 index 000000000..294f0e6e3 --- /dev/null +++ b/_test/cases/inc/DifferenceEngine.test.php @@ -0,0 +1,31 @@ +<?php +require_once DOKU_INC.'inc/DifferenceEngine.php'; + +class differenceengine_test extends UnitTestCase { + + function test_white_between_words(){ + // From FS#2161 + global $lang; + + $df = new Diff(explode("\n","example"), + explode("\n","example example2")); + + $idf = new InlineDiffFormatter(); + $tdf = new TableDiffFormatter(); + + $this->assertEqual($idf->format($df), '<tr><td colspan="4" class="diff-blockheader">@@ ' . $lang['line'] . + ' -1 +1 @@ <span class="diff-deletedline"><del>' . $lang['deleted'] . + '</del></span> <span class="diff-addedline">' . $lang['created'] . + '</span></td></tr> + +<tr><td colspan="4">example <span class="diff-addedline">example2</span></td></tr> +'); + $this->assertEqual($tdf->format($df), + '<tr><td class="diff-blockheader" colspan="2">' . $lang['line'] . ' 1:</td> + <td class="diff-blockheader" colspan="2">' . $lang['line'] . ' 1:</td> +</tr> +<tr><td>-</td><td class="diff-deletedline">example</td><td>+</td><td class="diff-addedline">example <strong>example2</strong></td></tr> +'); + } +} +//Setup VIM: ex: et ts=4 : diff --git a/_test/cases/inc/mail_isvalid.test.php b/_test/cases/inc/mail_isvalid.test.php index 4e047499f..d8c88765e 100644 --- a/_test/cases/inc/mail_isvalid.test.php +++ b/_test/cases/inc/mail_isvalid.test.php @@ -25,7 +25,8 @@ class mail_isvalid extends UnitTestCase { $tests[] = array('bu[g]s@php.net1',false); $tests[] = array('somebody@somewhere.museum',true); $tests[] = array('somebody@somewhere.travel',true); - + $tests[] = array('root@[2010:fb:fdac::311:2101]',true); + $tests[] = array('test@example', true); // we allow local addresses // tests from http://code.google.com/p/php-email-address-validation/ below @@ -62,7 +63,6 @@ class mail_isvalid extends UnitTestCase { $tests[] = array('test@.org', false); $tests[] = array('12345678901234567890123456789012345678901234567890123456789012345@example.com', false); // 64 characters is maximum length for local part. This is 65. $tests[] = array('test@123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012.com', false); // 255 characters is maximum length for domain. This is 256. - $tests[] = array('test@example', false); $tests[] = array('test@[123.123.123.123', false); $tests[] = array('test@123.123.123.123]', false); diff --git a/_test/cases/inc/parser/parser_links.test.php b/_test/cases/inc/parser/parser_links.test.php index 62e3b3b99..81186ef5e 100644 --- a/_test/cases/inc/parser/parser_links.test.php +++ b/_test/cases/inc/parser/parser_links.test.php @@ -38,6 +38,86 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser { $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); } + function testExternalIPv4() { + $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); + $this->P->parse("Foo http://123.123.3.21/foo Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externallink',array('http://123.123.3.21/foo', NULL)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testExternalIPv6() { + $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); + $this->P->parse("Foo http://[3ffe:2a00:100:7031::1]/foo Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externallink',array('http://[3ffe:2a00:100:7031::1]/foo', NULL)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + } + + function testExternalMulti(){ + $this->teardown(); + + $links = array( + 'http://www.google.com', + 'HTTP://WWW.GOOGLE.COM', + 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html', + 'http://[1080:0:0:0:8:800:200C:417A]/index.html', + 'http://[3ffe:2a00:100:7031::1]', + 'http://[1080::8:800:200C:417A]/foo', + 'http://[::192.9.5.5]/ipng', + 'http://[::FFFF:129.144.52.38]:80/index.html', + 'http://[2010:836B:4179::836B:4179]', + ); + $titles = array(false,null,'foo bar'); + foreach($links as $link){ + foreach($titles as $title){ + if($title === false){ + $source = $link; + $name = null; + }elseif($title === null){ + $source = "[[$link]]"; + $name = null; + }else{ + $source = "[[$link|$title]]"; + $name = $title; + } + $this->signal('failinfo',$source); + + $this->setup(); + $this->P->addMode('internallink',new Doku_Parser_Mode_InternalLink()); + $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); + $this->P->parse("Foo $source Bar"); + $calls = array ( + array('document_start',array()), + array('p_open',array()), + array('cdata',array("\n".'Foo ')), + array('externallink',array($link, $name)), + array('cdata',array(' Bar'."\n")), + array('p_close',array()), + array('document_end',array()), + ); + $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); + $this->teardown(); + } + } + + $this->setup(); + } + function testExternalLinkJavascript() { $this->P->addMode('externallink',new Doku_Parser_Mode_ExternalLink()); $this->P->parse("Foo javascript:alert('XSS'); Bar"); @@ -81,8 +161,6 @@ class TestOfDoku_Parser_Links extends TestOfDoku_Parser { $this->assertEqual(array_map('stripByteIndex',$this->H->calls),$calls); } function testEmail() { -/* $this->fail('The emaillink mode seems to cause php 5.0.5 to segfault'); - return; //FIXME: is this still true?*/ $this->P->addMode('emaillink',new Doku_Parser_Mode_Emaillink()); $this->P->parse("Foo <bugs@php.net> Bar"); $calls = array ( diff --git a/_test/cases/inc/parserutils_set_metadata_during_rendering.test.php b/_test/cases/inc/parserutils_set_metadata_during_rendering.test.php new file mode 100644 index 000000000..8319da298 --- /dev/null +++ b/_test/cases/inc/parserutils_set_metadata_during_rendering.test.php @@ -0,0 +1,93 @@ +<?php + +require_once DOKU_INC.'inc/init.php'; + +class parserutils_set_metadata_during_rendering_test extends UnitTestCase { + // the id used for this test case + private $id; + // if the test case is currently running + private $active = false; + // the original plugin controller + private $plugin_controller; + + // the actual test + function test_p_set_metadata_during_rendering() { + global $EVENT_HANDLER; + $this->id = 'test:p_set_metadata_during_rendering'; + $this->active = true; + + // write the wiki page so it exists and needs to be rendered + saveWikiText($this->id, 'Test '.time(), 'Test data setup'); + + $EVENT_HANDLER->register_hook('PARSER_METADATA_RENDER', 'BEFORE', $this, 'helper_set_metadata', array('test_before_set' => 'test')); + $EVENT_HANDLER->register_hook('PARSER_METADATA_RENDER', 'AFTER', $this, 'helper_set_metadata', array('test_after_set' => 'test')); + $EVENT_HANDLER->register_hook('PARSER_HANDLER_DONE', 'BEFORE', $this, 'helper_inject_test_instruction'); + + // Change the global plugin controller so this test can be a fake syntax plugin + global $plugin_controller; + $this->plugin_controller = $plugin_controller; + $plugin_controller = $this; + + // the actual rendering, all hooks should be executed here + $newMeta = p_get_metadata($this->id); + + // restore the plugin controller + $plugin_controller = $this->plugin_controller; + + // assert that all three calls to p_set_metadata have been successful + $this->assertEqual($newMeta['test_before_set'], 'test'); + $this->assertEqual($newMeta['test_after_set'], 'test'); + $this->assertEqual($newMeta['test_during_rendering'], 'test'); + + // clean up + $this->active = false; + + // make sure the saved metadata is the one that has been rendered + $this->assertEqual($newMeta, p_get_metadata($this->id)); + + saveWikiText($this->id, '', 'Test data remove'); + } + + // helper for the action plugin part of the test, tries executing p_set_metadata during rendering + function helper_set_metadata($event, $meta) { + if ($this->active) { + p_set_metadata($this->id, $meta, false, true); + $key = array_pop(array_keys($meta)); + $this->assertTrue(is_string($meta[$key])); // ensure we really have a key + // ensure that the metadata property hasn't been set previously + $this->assertNotEqual($meta[$key], p_get_metadata($this->id, $key)); + } + } + + // helper for injecting an instruction for this test case + function helper_inject_test_instruction($event) { + if ($this->active) + $event->data->calls[] = array('plugin', array('parserutils_test', array())); + } + + // fake syntax plugin rendering method that tries calling p_set_metadata during the actual rendering process + function render($format, &$renderer, $data) { + if ($this->active) { + $key = 'test_during_rendering'; + p_set_metadata($this->id, array($key => 'test'), false, true); + // ensure that the metadata property hasn't been set previously + $this->assertNotEqual($key, p_get_metadata($this->id, $key)); + } + } + + // wrapper function for the fake plugin controller + function getList($type='',$all=false){ + return $this->plugin_controller->getList(); + } + + // wrapper function for the fake plugin controller, return $this for the fake syntax of this test + function &load($type,$name,$new=false,$disabled=false){ + if ($name == 'parserutils_test') { + return $this; + } else { + return $this->plugin_controller->load($type, $name, $new, $disabled); + } + } +} + +// vim:ts=4:sw=4:et: diff --git a/conf/interwiki.conf b/conf/interwiki.conf index 702696792..b14bfef9f 100644 --- a/conf/interwiki.conf +++ b/conf/interwiki.conf @@ -15,7 +15,7 @@ wppl http://pl.wikipedia.org/wiki/{NAME} wpjp http://ja.wikipedia.org/wiki/{NAME} wpmeta http://meta.wikipedia.org/wiki/{NAME} doku http://www.dokuwiki.org/ -dokubug http://bugs.splitbrain.org/index.php?do=details&task_id= +dokubug http://bugs.dokuwiki.org/index.php?do=details&task_id= rfc http://www.cs.ccu.edu.tw/~chm91u/rfc2html.php?in= man http://man.cx/ amazon http://www.amazon.com/exec/obidos/ASIN/{URL}/splitbrain-20/ @@ -27,6 +27,7 @@ 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(); diff --git a/inc/DifferenceEngine.php b/inc/DifferenceEngine.php index 1e1d4c3a3..906a17b2d 100644 --- a/inc/DifferenceEngine.php +++ b/inc/DifferenceEngine.php @@ -943,7 +943,7 @@ class InlineWordLevelDiff extends MappedDiff { $orig = new _HWLDF_WordAccumulator; foreach ($this->edits as $edit) { if ($edit->type == 'copy') - $orig->addWords($edit->orig); + $orig->addWords($edit->closing); elseif ($edit->type == 'change'){ $orig->addWords($edit->orig, 'del'); $orig->addWords($edit->closing, 'add'); @@ -1087,6 +1087,7 @@ class TableDiffFormatter extends DiffFormatter { * */ class InlineDiffFormatter extends DiffFormatter { + var $colspan = 4; function InlineDiffFormatter() { $this->leading_context_lines = 2; @@ -1113,7 +1114,7 @@ class InlineDiffFormatter extends DiffFormatter { $xbeg .= "," . $xlen; if ($ylen != 1) $ybeg .= "," . $ylen; - $r = '<tr><td class="diff-blockheader">@@ '.$lang['line']." -$xbeg +$ybeg @@"; + $r = '<tr><td colspan="'.$this->colspan.'" class="diff-blockheader">@@ '.$lang['line']." -$xbeg +$ybeg @@"; $r .= ' <span class="diff-deletedline"><del>'.$lang['deleted'].'</del></span>'; $r .= ' <span class="diff-addedline">'.$lang['created'].'</span>'; $r .= "</td></tr>\n"; @@ -1132,19 +1133,19 @@ class InlineDiffFormatter extends DiffFormatter { function _added($lines) { foreach ($lines as $line) { - print('<tr><td class="diff-addedline">'. $line . "</td></tr>\n"); + print('<tr><td colspan="'.$this->colspan.'" class="diff-addedline">'. $line . "</td></tr>\n"); } } function _deleted($lines) { foreach ($lines as $line) { - print('<tr><td class="diff-deletedline"><del>' . $line . "</del></td></tr>\n"); + print('<tr><td colspan="'.$this->colspan.'" class="diff-deletedline"><del>' . $line . "</del></td></tr>\n"); } } function _context($lines) { foreach ($lines as $line) { - print('<tr><td class="diff-context">'.$line."</td></tr>\n"); + print('<tr><td colspan="'.$this->colspan.'" class="diff-context">'.$line."</td></tr>\n"); } } @@ -1153,7 +1154,7 @@ class InlineDiffFormatter extends DiffFormatter { $add = $diff->inline(); foreach ($add as $line) - print('<tr><td>'.$line."</td></tr>\n"); + print('<tr><td colspan="'.$this->colspan.'">'.$line."</td></tr>\n"); } } diff --git a/inc/EmailAddressValidator.php b/inc/EmailAddressValidator.php index 31b34cc58..bb4ef0ca9 100644 --- a/inc/EmailAddressValidator.php +++ b/inc/EmailAddressValidator.php @@ -5,7 +5,7 @@ * @author Dave Child <dave@addedbytes.com> * @link http://code.google.com/p/php-email-address-validation/ * @license http://www.opensource.org/licenses/bsd-license.php - * @version SVN r10 + Issue 15 fix + * @version SVN r10 + Issue 15 fix + Issue 12 fix */ class EmailAddressValidator { /** @@ -121,13 +121,30 @@ class EmailAddressValidator { if (!$this->check_text_length($strDomainPortion, 1, 255)) { return false; } + + // some IPv4/v6 regexps borrowed from Feyd + // see: http://forums.devnetwork.net/viewtopic.php?f=38&t=53479 + $dec_octet = '(?:25[0-5]|2[0-4]\d|1\d\d|[1-9]\d|[0-9])'; + $hex_digit = '[A-Fa-f0-9]'; + $h16 = "{$hex_digit}{1,4}"; + $IPv4Address = "$dec_octet\\.$dec_octet\\.$dec_octet\\.$dec_octet"; + $ls32 = "(?:$h16:$h16|$IPv4Address)"; + $IPv6Address = + "(?:(?:{$IPv4Address})|(?:". + "(?:$h16:){6}$ls32" . + "|::(?:$h16:){5}$ls32" . + "|(?:$h16)?::(?:$h16:){4}$ls32" . + "|(?:(?:$h16:){0,1}$h16)?::(?:$h16:){3}$ls32" . + "|(?:(?:$h16:){0,2}$h16)?::(?:$h16:){2}$ls32" . + "|(?:(?:$h16:){0,3}$h16)?::(?:$h16:){1}$ls32" . + "|(?:(?:$h16:){0,4}$h16)?::$ls32" . + "|(?:(?:$h16:){0,5}$h16)?::$h16" . + "|(?:(?:$h16:){0,6}$h16)?::" . + ")(?:\\/(?:12[0-8]|1[0-1][0-9]|[1-9][0-9]|[0-9]))?)"; + // Check if domain is IP, possibly enclosed in square brackets. - if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])' - .'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/' - ,$strDomainPortion) || - preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])' - .'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/' - ,$strDomainPortion)) { + if (preg_match("/^($IPv4Address|\[$IPv4Address\]|\[$IPv6Address\])$/", + $strDomainPortion)){ return true; } else { $arrDomainPortion = explode('.', $strDomainPortion); diff --git a/inc/HTTPClient.php b/inc/HTTPClient.php index 1cb16714d..372769b71 100644 --- a/inc/HTTPClient.php +++ b/inc/HTTPClient.php @@ -299,8 +299,6 @@ class HTTPClient { $this->error = "Could not connect to $server:$port\n$errstr ($errno)"; return false; } - //set non blocking - stream_set_blocking($socket,0); // keep alive? if ($this->keep_alive) { @@ -310,6 +308,9 @@ class HTTPClient { } } + //set blocking + stream_set_blocking($socket,1); + // build request $request = "$method $request_url HTTP/".$this->http.HTTP_NL; $request .= $this->_buildHeaders($headers); @@ -319,11 +320,28 @@ class HTTPClient { $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){ - $ret = fwrite($socket, substr($request,$written)); + // 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) continue; + + // write to stream + $ret = fwrite($socket, substr($request,$written,4096)); if($ret === false){ $this->status = -100; $this->error = 'Failed writing to socket'; @@ -333,6 +351,9 @@ class HTTPClient { $written += $ret; } + // continue non-blocking + stream_set_blocking($socket,0); + // read headers from socket $r_headers = ''; do{ diff --git a/inc/auth/ad.class.php b/inc/auth/ad.class.php index 5478d64b9..9ffd3e18b 100644 --- a/inc/auth/ad.class.php +++ b/inc/auth/ad.class.php @@ -24,6 +24,7 @@ * $conf['auth']['ad']['ad_password'] = 'pass'; * $conf['auth']['ad']['real_primarygroup'] = 1; * $conf['auth']['ad']['use_ssl'] = 1; + * $conf['auth']['ad']['use_tls'] = 1; * $conf['auth']['ad']['debug'] = 1; * * // get additional information to the userinfo array @@ -51,6 +52,7 @@ class auth_ad extends auth_basic { global $conf; $this->cnf = $conf['auth']['ad']; + // additional information fields if (isset($this->cnf['additional'])) { $this->cnf['additional'] = str_replace(' ', '', $this->cnf['additional']); @@ -60,7 +62,7 @@ class auth_ad extends auth_basic { // ldap extension is needed if (!function_exists('ldap_connect')) { if ($this->cnf['debug']) - msg("LDAP err: PHP LDAP extension not found.",-1); + msg("AD Auth: PHP LDAP extension not found.",-1); $this->success = false; return; } @@ -97,7 +99,12 @@ class auth_ad extends auth_basic { $this->opts['domain_controllers'] = array_map('trim',$this->opts['domain_controllers']); $this->opts['domain_controllers'] = array_filter($this->opts['domain_controllers']); - // we currently just handle authentication, so no capabilities are set + // we can change the password if SSL is set + if($this->opts['use_ssl'] || $this->opts['use_tls']){ + $this->cando['modPass'] = true; + } + $this->cando['modName'] = true; + $this->cando['modMail'] = true; } /** @@ -247,6 +254,49 @@ class auth_ad extends auth_basic { } /** + * Modify user data + * + * @param $user nick of the user to be changed + * @param $changes array of field/value pairs to be changed + * @return bool + */ + function modifyUser($user, $changes) { + $return = true; + + // password changing + if(isset($changes['pass'])){ + try { + $return = $this->adldap->user_password($user,$changes['pass']); + } catch (adLDAPException $e) { + if ($this->cnf['debug']) msg('AD Auth: '.$e->getMessage(), -1); + $return = false; + } + if(!$return) msg('AD Auth: failed to change the password. Maybe the password policy was not met?',-1); + } + + // changing user data + $adchanges = array(); + if(isset($changes['name'])){ + // get first and last name + $parts = explode(' ',$changes['name']); + $adchanges['surname'] = array_pop($parts); + $adchanges['firstname'] = join(' ',$parts); + $adchanges['display_name'] = $changes['name']; + } + if(isset($changes['mail'])){ + $adchanges['email'] = $changes['mail']; + } + try { + $return = $return & $this->adldap->user_modify($user,$adchanges); + } catch (adLDAPException $e) { + if ($this->cnf['debug']) msg('AD Auth: '.$e->getMessage(), -1); + $return = false; + } + + return $return; + } + + /** * Initialize the AdLDAP library and connect to the server */ function _init(){ @@ -261,7 +311,7 @@ class auth_ad extends auth_basic { return true; } catch (adLDAPException $e) { if ($this->cnf['debug']) { - msg($e->getMessage(), -1); + msg('AD Auth: '.$e->getMessage(), -1); } $this->success = false; $this->adldap = null; diff --git a/inc/common.php b/inc/common.php index b4866bccf..23d9c7155 100644 --- a/inc/common.php +++ b/inc/common.php @@ -639,7 +639,7 @@ function clientIP($single=false){ // decide which IP to use, trying to avoid local addresses $ip = array_reverse($ip); foreach($ip as $i){ - if(preg_match('/^(127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/',$i)){ + if(preg_match('/^(::1|[fF][eE]80:|127\.|10\.|192\.168\.|172\.((1[6-9])|(2[0-9])|(3[0-1]))\.)/',$i)){ continue; }else{ return $i; @@ -804,7 +804,7 @@ function rawWiki($id,$rev=''){ /** * Returns the pagetemplate contents for the ID's namespace * - * @triggers COMMON_PAGE_FROMTEMPLATE + * @triggers COMMON_PAGETPL_LOAD * @author Andreas Gohr <andi@splitbrain.org> */ function pageTemplate($id){ @@ -812,29 +812,50 @@ function pageTemplate($id){ if (is_array($id)) $id = $id[0]; - $path = dirname(wikiFN($id)); - $tpl = ''; - if(@file_exists($path.'/_template.txt')){ - $tpl = io_readFile($path.'/_template.txt'); - }else{ - // search upper namespaces for templates - $len = strlen(rtrim($conf['datadir'],'/')); - while (strlen($path) >= $len){ - if(@file_exists($path.'/__template.txt')){ - $tpl = io_readFile($path.'/__template.txt'); - break; + // prepare initial event data + $data = array( + 'id' => $id, // the id of the page to be created + 'tpl' => '', // the text used as template + 'tplfile' => '', // the file above text was/should be loaded from + 'doreplace' => true // should wildcard replacements be done on the text? + ); + + $evt = new Doku_Event('COMMON_PAGETPL_LOAD',$data); + if($evt->advise_before(true)){ + // the before event might have loaded the content already + if(empty($data['tpl'])){ + // if the before event did not set a template file, try to find one + if(empty($data['tplfile'])){ + $path = dirname(wikiFN($id)); + $tpl = ''; + if(@file_exists($path.'/_template.txt')){ + $data['tplfile'] = $path.'/_template.txt'; + }else{ + // search upper namespaces for templates + $len = strlen(rtrim($conf['datadir'],'/')); + while (strlen($path) >= $len){ + if(@file_exists($path.'/__template.txt')){ + $data['tplfile'] = $path.'/__template.txt'; + break; + } + $path = substr($path, 0, strrpos($path, '/')); + } + } } - $path = substr($path, 0, strrpos($path, '/')); + // load the content + $data['tpl'] = io_readFile($data['tpl']); } + if($data['doreplace']) parsePageTemplate(&$data); } - $data = compact('tpl', 'id'); - trigger_event('COMMON_PAGE_FROMTEMPLATE', $data, 'parsePageTemplate', true); + $evt->advise_after(); + unset($evt); + return $data['tpl']; } /** * Performs common page template replacements - * This is the default action for COMMON_PAGE_FROMTEMPLATE + * This works on data from COMMON_PAGETPL_LOAD * * @author Andreas Gohr <andi@splitbrain.org> */ diff --git a/inc/fulltext.php b/inc/fulltext.php index be3938cac..0f2414213 100644 --- a/inc/fulltext.php +++ b/inc/fulltext.php @@ -304,6 +304,7 @@ function ft_pagesorter($a, $b){ */ function ft_snippet($id,$highlight){ $text = rawWiki($id); + $text = str_replace("\xC2\xAD",'',$text); // remove soft-hyphens $evdata = array( 'id' => $id, 'text' => &$text, diff --git a/inc/html.php b/inc/html.php index bd87ee7a1..c91888494 100644 --- a/inc/html.php +++ b/inc/html.php @@ -318,7 +318,13 @@ function html_search(){ global $ID; global $lang; - print p_locale_xhtml('searchpage'); + $intro = p_locale_xhtml('searchpage'); + // allow use of placeholder in search intro + $intro = str_replace( + array('@QUERY@','@SEARCH@'), + array(hsc(rawurlencode($QUERY)),hsc($QUERY)), + $intro); + echo $intro; flush(); //show progressbar @@ -864,13 +870,18 @@ function html_backlinks(){ * show diff * * @author Andreas Gohr <andi@splitbrain.org> + * @param string $text - compare with this text with most current version + * @param bool $intr - display the intro text */ -function html_diff($text='',$intro=true){ +function html_diff($text='',$intro=true,$type=null){ global $ID; global $REV; global $lang; global $conf; + if(!$type) $type = $_REQUEST['difftype']; + if($type != 'inline') $type = 'sidebyside'; + // we're trying to be clever here, revisions to compare can be either // given as rev and rev2 parameters, with rev2 being optional. Or in an // array in rev2. @@ -987,17 +998,48 @@ function html_diff($text='',$intro=true){ $df = new Diff(explode("\n",htmlspecialchars($l_text)), explode("\n",htmlspecialchars($r_text))); - $tdf = new TableDiffFormatter(); + if($type == 'inline'){ + $tdf = new InlineDiffFormatter(); + } else { + $tdf = new TableDiffFormatter(); + } + + + if($intro) print p_locale_xhtml('diff'); if (!$text) { - $diffurl = wl($ID, array('do'=>'diff', 'rev2[0]'=>$l_rev, 'rev2[1]'=>$r_rev)); ptln('<p class="difflink">'); - ptln(' <a class="wikilink1" href="'.$diffurl.'">'.$lang['difflink'].'</a>'); + + $form = new Doku_Form(array('action'=>wl())); + $form->addHidden('id',$ID); + $form->addHidden('rev2[0]',$l_rev); + $form->addHidden('rev2[1]',$r_rev); + $form->addHidden('do','diff'); + $form->addElement(form_makeListboxField( + 'difftype', + array( + 'sidebyside' => $lang['diff_side'], + 'inline' => $lang['diff_inline']), + $type, + $lang['diff_type'], + '','', + array('class'=>'quickselect'))); + $form->addElement(form_makeButton('submit', 'diff','Go')); + $form->printForm(); + + + $diffurl = wl($ID, array( + 'do' => 'diff', + 'rev2[0]' => $l_rev, + 'rev2[1]' => $r_rev, + 'difftype' => $type, + )); + ptln('<br /><a class="wikilink1" href="'.$diffurl.'">'.$lang['difflink'].'</a>'); ptln('</p>'); } ?> - <table class="diff"> + <table class="diff diff_<?php echo $type?>"> <tr> <th colspan="2" <?php echo $l_minor?>> <?php echo $l_head?> @@ -1398,10 +1440,11 @@ function html_admin(){ } // data security check - echo '<a style="background: transparent url(data/security.png) left top no-repeat; - display: block; width:380px; height:73px; border:none; float:right" - target="_blank" - href="http://www.dokuwiki.org/security#web_access_security"></a>'; + // @todo: could be checked and only displayed if $conf['savedir'] is under the web root + echo '<a style="border:none; float:right;" target="_blank" + href="http://www.dokuwiki.org/security#web_access_security"> + <img src="data/security.png" alt="Your data directory seems to be protected properly." + onerror="this.parentNode.style.display=\'none\'" /></a>'; print p_locale_xhtml('admin'); diff --git a/inc/indexer.php b/inc/indexer.php index 9cf079261..526c8db05 100644 --- a/inc/indexer.php +++ b/inc/indexer.php @@ -221,7 +221,14 @@ function idx_getPageWords($page){ list($page,$body) = $data; - $body = strtr($body, "\r\n\t", ' '); + $body = strtr($body, + array( + "\r" => ' ', + "\n" => ' ', + "\t" => ' ', + "\xC2\xAD" => '', //soft-hyphen + ) + ); $tokens = explode(' ', $body); $tokens = array_count_values($tokens); // count the frequency of each token diff --git a/inc/lang/bg/admin.txt b/inc/lang/bg/admin.txt index 8d16f68aa..8958997ae 100644 --- a/inc/lang/bg/admin.txt +++ b/inc/lang/bg/admin.txt @@ -1,3 +1,3 @@ -====== Администрация ====== +====== Администриране ====== -Долу може да намерите списък с администраторски задачи в DokuWiki.
\ No newline at end of file +Долу ще намерите списъка с администраторски задачи в DokuWiki.
\ No newline at end of file diff --git a/inc/lang/bg/adminplugins.txt b/inc/lang/bg/adminplugins.txt index 2b0268ed4..df24b0538 100644 --- a/inc/lang/bg/adminplugins.txt +++ b/inc/lang/bg/adminplugins.txt @@ -1 +1 @@ -===== Допълнителни Plugins =====
\ No newline at end of file +===== Допълнителни приставки =====
\ No newline at end of file diff --git a/inc/lang/bg/backlinks.txt b/inc/lang/bg/backlinks.txt index 28801a8ee..70cb81dc3 100644 --- a/inc/lang/bg/backlinks.txt +++ b/inc/lang/bg/backlinks.txt @@ -1,3 +1,3 @@ -====== Задни връзки ====== +====== Обратни препратки ====== -Това е списък на страници, които изглежда препращат обратно към текущата страница. +Това е списък на страници, които препращат обратно към текущата страница. diff --git a/inc/lang/bg/conflict.txt b/inc/lang/bg/conflict.txt index 51ec4b706..8c62a3787 100644 --- a/inc/lang/bg/conflict.txt +++ b/inc/lang/bg/conflict.txt @@ -1,6 +1,6 @@ -====== По-нова версия съшествува ====== +====== Съществува по-нова версия ====== -По-нова версия на документа който сте редактирали съществува. Това се случва когато друг потребител е променил документа докато сте го редактирали. +Съществува по-нова версия на документа, който сте редактирали. Това се случва когато друг потребител е променил документа докато сте го редактирали. -Разгледайте внимателно разгледайте разликите показани долу, след това решете коя версия да запазите. Ако изберете ''Запис'', версия Ви ще бъде запазена. Изберете ''Отказ'', за да запазите текущата версия. +Разгледайте внимателно разликите, след това решете коя версия да бъде запазена. Ако натиснете ''Запис'', ще бъде запазена вашата версия. Натиснете ли ''Отказ'', ще бъде запазена текущата версия. diff --git a/inc/lang/bg/denied.txt b/inc/lang/bg/denied.txt index 7b1d5788e..91a576077 100644 --- a/inc/lang/bg/denied.txt +++ b/inc/lang/bg/denied.txt @@ -1,4 +1,4 @@ ====== Отказан достъп ====== -Нямате достатъчно права да продължите. Може би сте забравили да влезете? +Нямате достатъчно права да продължите. Може би сте забравили да се впишете? diff --git a/inc/lang/bg/diff.txt b/inc/lang/bg/diff.txt index 2bd8262c6..b1d49de92 100644 --- a/inc/lang/bg/diff.txt +++ b/inc/lang/bg/diff.txt @@ -1,4 +1,4 @@ ====== Разлики ====== -Тук са показани разликите между избраната версия на страницата и текущата. +Тук са показани разликите между избраната и текущата версия на страницата. diff --git a/inc/lang/bg/draft.txt b/inc/lang/bg/draft.txt index 1938e7d9c..6d269a72f 100644 --- a/inc/lang/bg/draft.txt +++ b/inc/lang/bg/draft.txt @@ -1,6 +1,6 @@ ====== Намерена чернова ====== -Последната редакционна сесия на тази страница не е завършена правилно. Dokuwiki автоматично запазва чернова по време на работа, която може сега да използвате, за да продължите редактирането си. Долу може да видите данните, които бяха запазени от последната сесия. +Последната редакционна сесия на страницата не е завършена правилно. Dokuwiki автоматично запазва чернова по време на редактирането, която може сега да ползвате, за да продължите работата си. Долу може да видите данните, които бяха запазени от последната сесия. -Моля решете, дали искате да //recover// последната си редакционна сесия, да //delete// автоматично запазената чернова или да //cancel// редакцията. +Моля решете, дали искате да //възстановите// последната си редакционна сесия, //изтриете// автоматично запазената чернова или //откажете// редакцията. diff --git a/inc/lang/bg/edit.txt b/inc/lang/bg/edit.txt index 90d376dbc..086d9978e 100644 --- a/inc/lang/bg/edit.txt +++ b/inc/lang/bg/edit.txt @@ -1,2 +1,2 @@ -Редактирайте страницата и натиснете ''Запис''. Погледнете [[wiki:syntax]] за Wiki синтаксис. Моля редактирайте страницата, само ако може да я **подобрите**. Ако искате да пробвате разни неща, научете се да правите първите си стъпки в [[playground:playground|пясъчника]]. +Редактирайте и натиснете ''Запис''. За информация относно ползвания синтаксис прочетете [[wiki:syntax]]. Моля, редактирайте само когато може да **подобрите** съдържанието. Ако ще пробвате разни неща, може да експериментирате в [[playground:playground|пясъчника]]. diff --git a/inc/lang/bg/editrev.txt b/inc/lang/bg/editrev.txt index 87e7b26a8..ba97f253a 100644 --- a/inc/lang/bg/editrev.txt +++ b/inc/lang/bg/editrev.txt @@ -1,2 +1,2 @@ -**Заредили сте стара версия на документа!** Ако я запазите, ще създадете нова редакция с текущите данни. +**Заредена е стара версия на документа!** Ако я запазите, ще създадете нова версия с текущите данни. ---- diff --git a/inc/lang/bg/index.txt b/inc/lang/bg/index.txt index 2ebf5128a..7dabac6af 100644 --- a/inc/lang/bg/index.txt +++ b/inc/lang/bg/index.txt @@ -1,4 +1,4 @@ ====== Индекс ====== -Това е списък на всички достъпни страници подредени по [[doku>namespaces|именни пространства]]. +Това е списък на всички налични страници подредени по [[doku>namespaces|именни пространства]]. diff --git a/inc/lang/bg/install.html b/inc/lang/bg/install.html index 0d7fd5232..392235ecd 100644 --- a/inc/lang/bg/install.html +++ b/inc/lang/bg/install.html @@ -1,25 +1,19 @@ -<p>Тази страница помага при първоначална инсталация и настройка на +<p>Страницата помага при първа инсталация и настройване на <a href="http://dokuwiki.org">Dokuwiki</a>. Повече информация -за този инсталатор е достъпна в неговата собствена +за инсталатора е достъпна в неговата собствена <a href="http://dokuwiki.org/installer">документация</a>.</p> -<p>Dokuwiki използва обикновени файлове за хранилище на уики страниците и друга -информация свързана с тези страници(примерно картинки, търсене, стари версии, т.н.). +<p>Dokuwiki ползва обикновени файлове за хранилище на страниците и друга +информация свързана с тях (примерно картинки, търсене, стари версии, и др.). За да използвате успешно DokuWiki -<strong>трябва</strong> да имате достъп за писане в директориите които съдържат тези -файлове. Този инсталатор няма възможности да настройва правата на директориите. -Това обикновено трябва да бъде направено директно от командният ред или ако -използвате хостинг - през FTP или контрол панела на хоста(примерно cPanel).</p> +<strong>трябва</strong> да имате право за писане в директориите, които съдържат тези +файлове. Инсталаторът не може да настройва правата на директориите. +Обикновено трябва да направите това директно от командният ред или ако +ползвате хостинг - през FTP или контролния панела на хоста (примерно cPanel).</p> -<p>Този инсталатор ще настрои вашата DokuWiki конфигурация за -<acronym title="access control list">ACL</acronym>, което на -свой ред ще позволи на администратора да влезе и да има достъп -до администраторското меню в DokuWiki за инсталиране на плъгини, контрол -на потребители, управление да достъп до уики страници и промяна на настройките -Това не е необходимо на DokuWiki да работи, но ще направи DokuWiki по-лесно за -администриране.</p> +<p>Инсталаторът ще настрои вашата DokuWiki конфигурация на +<acronym title="списъка за достъп">ACL</acronym>, което ще позволи на администратора да се впише и ползва администраторското меню в DokuWiki за инсталиране на приставки, контролира +на потребители, управлява достъпа до страниците и променя останалите настройки. Това не е необходимо за функционирането на DokuWiki, но направи администрирането на DokuWiki по-лесно.</p> -<p>Опитните потребители или потребителите със специални изисквания -към настройките може да използват тези връзки за детайли свързани с -<a href="http://dokuwiki.org/install">инструкции за инсталация</a> -и <a href="http://dokuwiki.org/config">настройка</a>.</p> +<p>Опитните потребители или потребителите със специални изисквания към настройките могат да ползват тези връзки за информация относно <a href="http://dokuwiki.org/install"> инсталацията</a> +и <a href="http://dokuwiki.org/config">настройките</a>.</p> diff --git a/inc/lang/bg/lang.php b/inc/lang/bg/lang.php index 053a7f1ba..d3e86c41d 100644 --- a/inc/lang/bg/lang.php +++ b/inc/lang/bg/lang.php @@ -5,6 +5,7 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Nikolay Vladimirov <nikolay@vladimiroff.com> * @author Viktor Usunov <usun0v@mail.bg> + * @author Kiril neohidra@gmail.com */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; @@ -14,8 +15,8 @@ $lang['singlequoteopening'] = '‘'; $lang['singlequoteclosing'] = '’'; $lang['apostrophe'] = '’'; $lang['btn_edit'] = 'Редактиране'; -$lang['btn_source'] = 'Показване на кода на страницата'; -$lang['btn_show'] = 'Показване на страница'; +$lang['btn_source'] = 'Преглед на кода'; +$lang['btn_show'] = 'Преглед на страницата'; $lang['btn_create'] = 'Създаване на страница'; $lang['btn_search'] = 'Търсене'; $lang['btn_save'] = 'Запис'; @@ -29,215 +30,217 @@ $lang['btn_upload'] = 'Качване'; $lang['btn_cancel'] = 'Отказ'; $lang['btn_index'] = 'Индекс'; $lang['btn_secedit'] = 'Редактиране'; -$lang['btn_login'] = 'Вход'; -$lang['btn_logout'] = 'Изход'; +$lang['btn_login'] = 'Вписване'; +$lang['btn_logout'] = 'Отписване'; $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_unsubscribe'] = 'Отписване от Промени'; -$lang['btn_subscribens'] = 'Абониране за Промени на именно пространство'; -$lang['btn_unsubscribens'] = 'Отписване от Промени на именно пространство'; -$lang['btn_profile'] = 'Актуализирай Профила'; +$lang['btn_profile'] = 'Профил'; $lang['btn_reset'] = 'Изчистване'; $lang['btn_resendpwd'] = 'Пращане на нова парола'; $lang['btn_draft'] = 'Редактиране на чернова'; $lang['btn_recover'] = 'Възстановяване на чернова'; $lang['btn_draftdel'] = 'Изтриване на чернова'; $lang['btn_revert'] = 'Възстановяване'; -$lang['loggedinas'] = 'Влезли сте като'; +$lang['loggedinas'] = 'Вписани сте като'; $lang['user'] = 'Потребител'; $lang['pass'] = 'Парола'; $lang['newpass'] = 'Нова парола'; $lang['oldpass'] = 'Потвърждение на текуща парола'; -$lang['passchk'] = 'oтново'; +$lang['passchk'] = 'още веднъж'; $lang['remember'] = 'Запомни ме'; $lang['fullname'] = 'Пълно име'; $lang['email'] = 'Електронна поща'; -$lang['register'] = 'Регистрация'; +$lang['register'] = 'Регистриране'; $lang['profile'] = 'Потребителски профил'; -$lang['badlogin'] = 'Потребителското име или паролата са грешни'; +$lang['badlogin'] = 'Грешно потребителско име или парола'; $lang['minoredit'] = 'Незначителни промени'; $lang['draftdate'] = 'Черновата бе автоматично записана на'; $lang['nosecedit'] = 'Страницата бе междувременно променена, презареждане на страницата поради неактуална информация.'; $lang['regmissing'] = 'Моля, попълнете всички полета.'; -$lang['reguexists'] = 'Потребител с такова име вече съществува.'; -$lang['regsuccess'] = 'Потребителят бе създаден и паролата бе пратена на електронната поща.'; +$lang['reguexists'] = 'Вече съществува потребител с избраното име.'; +$lang['regsuccess'] = 'Потребителят бе създаден и паролата бе пратена по електронната поща.'; $lang['regsuccess2'] = 'Потребителят бе създаден.'; -$lang['regmailfail'] = 'Изглежда, че има проблем с пращането на писмото с паролата. Моля, свържете се с администратора.'; +$lang['regmailfail'] = 'Изглежда, че има проблем с пращането на писмото с паролата. Моля, свържете се с администратора!'; $lang['regbadmail'] = 'Въведеният адрес изглежда невалиден - ако мислите, че това е грешка, свържете се с администратора.'; -$lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново'; +$lang['regbadpass'] = 'Двете въведени пароли не съвпадат, моля опитайте отново.'; $lang['regpwmail'] = 'Парола за DokuWiki'; -$lang['reghere'] = 'Нямате профил все още? Направете си!'; +$lang['reghere'] = 'Все още нямате профил? Направете си'; $lang['profna'] = 'Това Wiki не поддържа промяна на профила'; $lang['profnochange'] = 'Няма промени.'; -$lang['profnoempty'] = 'Невъведено име или електронна поща не са позволени.'; +$lang['profnoempty'] = 'Въвеждането на име и ел. поща. е задължително'; $lang['profchanged'] = 'Потребителският профил бе успешно обновен.'; -$lang['pwdforget'] = 'Забравили сте си паролата? Въведете нова.'; -$lang['resendna'] = 'Това Wiki не поддържа повторно пращане на парола'; +$lang['pwdforget'] = 'Забравили сте паролата си? Получете нова'; +$lang['resendna'] = 'Това Wiki не поддържа повторно пращане на паролата.'; $lang['resendpwd'] = 'Изпращане на нова парола за'; $lang['resendpwdmissing'] = 'Моля, попълнете всички полета.'; -$lang['resendpwdnouser'] = 'Потребителят не бе намерен в базата данни.'; -$lang['resendpwdbadauth'] = 'Този код за потвърждение е невалиден. Проверете дали сте използвали целият линк за потвърждение.'; -$lang['resendpwdconfirm'] = 'Адресът за потвърждение бе пратен по електронната поща.'; -$lang['resendpwdsuccess'] = 'Паролата ви бе изпратена на електронната поща.'; +$lang['resendpwdnouser'] = 'Потребителят не бе намерен в базата от данни.'; +$lang['resendpwdbadauth'] = 'Кодът за потвърждение е невалиден. Проверете дали сте използвали целият линк за потвърждение.'; +$lang['resendpwdconfirm'] = 'Линк за потвърждение бе пратен по електронната поща.'; +$lang['resendpwdsuccess'] = 'Паролата ви бе изпратена по електронната поща.'; $lang['license'] = 'Освен ако не е посочено друго, съдържанието на това Wiki е лицензирано под следния лиценз:'; -$lang['licenseok'] = 'Имайте предвид, че чрез редактирането на тази страница, Вие се съгласявате съдържанието й да бъде лицензирано под следния лиценз:'; +$lang['licenseok'] = 'Имайте предвид, че при редактиране на страницата, Вие се съгласявате да лицензирате промените (които сте направили) под следния лиценз:'; $lang['searchmedia'] = 'Търсене на файл: '; $lang['searchmedia_in'] = 'Търсене в %s'; -$lang['txt_upload'] = 'Изберете файл за качване '; -$lang['txt_filename'] = 'Качване като (по избор)'; -$lang['txt_overwrt'] = 'Запис върху съществуващ файл'; -$lang['lockedby'] = 'В момента е заключено от'; -$lang['lockexpire'] = 'Затварянето изтича в'; -$lang['willexpire'] = 'Затварянето на страницата за редактиране изтича след минута.\nЗа да избегнете противоречия, използвайте бутона, за да рестартирате броячът за затваряне.'; -$lang['js']['notsavedyet'] = "Незапазените промени ще бъдат загубени.\nИскате ли да продължите?"; +$lang['txt_upload'] = 'Изберете файл за качване'; +$lang['txt_filename'] = 'Качване като (незадължително)'; +$lang['txt_overwrt'] = 'Презапиши съществуващите файлове'; +$lang['lockedby'] = 'В момента е заключена от'; +$lang['lockexpire'] = 'Ще бъде отключена на'; +$lang['willexpire'] = 'Страницата ще бъде отключена за редактиране след минута.\nЗа да избегнете конфликт, ползвайте бутон "Преглед", за рестартиране на брояча за заключване.'; +$lang['js']['notsavedyet'] = 'Незаписаните промени ще бъдат загубени. Желаете ли да продължите?'; +$lang['js']['searchmedia'] = 'Търсене на файлове'; +$lang['js']['keepopen'] = 'Без затваряне на прозореца след избор'; +$lang['js']['hidedetails'] = 'Без подробности'; +$lang['js']['mediasize'] = 'Размер на изображението'; +$lang['js']['mediaclose'] = 'Затваряне'; +$lang['js']['mediainsert'] = 'Вмъкване'; +$lang['js']['mediasmall'] = 'Малка версия'; +$lang['js']['mediamedium'] = 'Средна версия'; +$lang['js']['medialarge'] = 'Голяма версия'; +$lang['js']['mediaoriginal'] = 'Оригинална версия'; +$lang['js']['nosmblinks'] = 'Връзките към Windows shares работят само под Internet Explorer. +Можете да копирате и поставите връзката.'; +$lang['js']['linkwiz'] = 'Съветник за препратки'; +$lang['js']['linkto'] = 'Препратка към: '; +$lang['js']['del_confirm'] = 'Да бъдат ли изтрити избраните елементи?'; +$lang['js']['mu_btn'] = 'Качване на няколко файла наведнъж'; $lang['rssfailed'] = 'Възникна грешка при вземането на този feed: '; -$lang['nothingfound'] = 'Нищо не бе намерено.'; +$lang['nothingfound'] = 'Не е открито нищо.'; $lang['mediaselect'] = 'Медийни файлове'; $lang['fileupload'] = 'Качване на медийни файлове'; $lang['uploadsucc'] = 'Качването бе успешно'; $lang['uploadfail'] = 'Качването бе неуспешно. Може би поради грешни права?'; $lang['uploadwrong'] = 'Качването бе отказано. Това файлово разширение е забранено!'; $lang['uploadexist'] = 'Файлът вече съществува. Нищо не бе направено.'; -$lang['uploadbadcontent'] = 'Каченото съдържание на съответства на файлово разширение %s .'; -$lang['uploadspam'] = 'Качването бе блокирано от спам списъка.'; -$lang['uploadxss'] = 'Качването бе блокирано, заради възможно обидно съдържание.'; +$lang['uploadbadcontent'] = 'Каченото съдържание не съответства на файлово разширение %s .'; +$lang['uploadspam'] = 'Качването бе блокирано от SPAM списъка.'; +$lang['uploadxss'] = 'Качването бе блокирано, заради възможно зловредно съдържание.'; $lang['uploadsize'] = 'Файльт за качване бе прекалено голям. (макс. %s)'; $lang['deletesucc'] = 'Файлът "%s" бе изтрит.'; -$lang['deletefail'] = '"%s" не бе изтрит, проверете правата'; +$lang['deletefail'] = '"%s" не може да бъде изтрит - проверете правата.'; $lang['mediainuse'] = 'Файлът "%s" не бе изтрит - все още се ползва.'; $lang['namespaces'] = 'Именни пространства'; -$lang['mediafiles'] = 'Достъпни файлове в'; -$lang['js']['searchmedia'] = 'Търси файлове'; -$lang['js']['keepopen'] = 'Задържане на прозореца отворен при избор'; -$lang['js']['hidedetails'] = 'Скрий детайлите'; -$lang['js']['nosmblinks'] = 'Връзките към Windows shares работят само под Internet Explorer. -Можете да копирате и поставите връзката.'; -$lang['js']['linkwiz'] = 'Линк съветник'; -$lang['js']['linkto'] = 'Линк към: '; -$lang['js']['del_confirm'] = 'Да бъдат ли изтрити избраните елементи?'; -$lang['js']['mu_btn'] = 'Качване на няколко файла наведнъж'; -$lang['mediausage'] = 'Използвайте следният синтакс, за да упоменете файла:'; +$lang['mediafiles'] = 'Налични файлове в'; +$lang['accessdenied'] = 'Нямате разрешение да преглеждате страницата.'; +$lang['mediausage'] = 'Ползвайте следния синтаксис, за да упоменете файла:'; $lang['mediaview'] = 'Преглед на оригиналния файл'; $lang['mediaroot'] = 'root'; -$lang['mediaupload'] = 'Качете файл в текущото именнопространство тук. За да създадете подименни пространства, добавете ги в началото на "Качи като" име на файл, разделени с двоеточие.'; +$lang['mediaupload'] = 'Качете файл в текущото именно пространство. За създаване на подимено пространство, добавите името му преди това на файла и да ги разделите с двоеточие в полето "Качване като"'; $lang['mediaextchange'] = 'Разширението на файла бе сменено от .%s на .%s!'; -$lang['reference'] = 'Референции за'; +$lang['reference'] = 'Връзки за'; $lang['ref_inuse'] = 'Файлът не може да бъде изтрит, защото все още се ползва от следните страници:'; -$lang['ref_hidden'] = 'Някои препратки са към страници, които нямате права да четете'; +$lang['ref_hidden'] = 'Някои връзки са към страници, които нямате права да четете'; $lang['hits'] = 'Съвпадения'; $lang['quickhits'] = 'Съвпадащи имена на страници'; $lang['toc'] = 'Съдържание'; -$lang['current'] = 'текущо'; +$lang['current'] = 'текуща'; $lang['yours'] = 'Вашата версия'; $lang['diff'] = 'Преглед на разликите с текущата версия'; -$lang['diff2'] = 'Показване на разликите между избрани преработки'; +$lang['diff2'] = 'Показване на разликите между избрани версии'; +$lang['difflink'] = 'Препратка към сравнението на версиите'; $lang['line'] = 'Ред'; $lang['breadcrumb'] = 'Следа'; $lang['youarehere'] = 'Намирате се в'; $lang['lastmod'] = 'Последна промяна'; $lang['by'] = 'от'; -$lang['deleted'] = 'изтриване'; -$lang['created'] = 'създаване'; +$lang['deleted'] = 'изтрита'; +$lang['created'] = 'създадена'; $lang['restored'] = 'възстановена предишна версия'; $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 Plugin</a> за изобразяване на съдържанието.'; $lang['download'] = 'Изтегляне на фрагмент'; -$lang['mail_newpage'] = 'добавена страница:'; -$lang['mail_changed'] = 'променена страница:'; -$lang['mail_new_user'] = 'нов потребител:'; +$lang['mail_newpage'] = 'добавена страница: '; +$lang['mail_changed'] = 'променена страница: '; +$lang['mail_subscribe_list'] = 'променени страници в именно пространство: '; +$lang['mail_new_user'] = 'нов потребител: '; $lang['mail_upload'] = 'качен файл: '; $lang['qb_bold'] = 'Удебелен текст'; $lang['qb_italic'] = 'Курсив текст'; $lang['qb_underl'] = 'Подчертан текст'; $lang['qb_code'] = 'Код'; $lang['qb_strike'] = 'Зачеркнат текст'; -$lang['qb_h1'] = 'Заглавие ниво 1'; -$lang['qb_h2'] = 'Заглавие ниво 2'; -$lang['qb_h3'] = 'Заглавие ниво 3'; -$lang['qb_h4'] = 'Заглавие ниво 4'; -$lang['qb_h5'] = 'Заглавие ниво 5'; +$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_hs'] = 'Изберете заглавие'; +$lang['qb_hplus'] = 'Надзаглавие'; $lang['qb_hminus'] = 'Подзаглавие'; -$lang['qb_hequal'] = 'Заглавие на същото ниво'; +$lang['qb_hequal'] = 'Заглавие от същото ниво'; $lang['qb_link'] = 'Вътрешна препратка'; $lang['qb_extlink'] = 'Външна препратка'; $lang['qb_hr'] = 'Хоризонтална линия'; -$lang['qb_ol'] = 'Подреден списък'; -$lang['qb_ul'] = 'Неподреден списък'; +$lang['qb_ol'] = 'Номериран списък'; +$lang['qb_ul'] = 'Неномериран списък'; $lang['qb_media'] = 'Добавяне на изображения и други файлове'; $lang['qb_sig'] = 'Вмъкване на подпис'; $lang['qb_smileys'] = 'Усмивчици'; $lang['qb_chars'] = 'Специални знаци'; -$lang['upperns'] = 'Към свьрзано именно пространство'; -$lang['admin_register'] = 'Добабяне на нов потребител'; +$lang['upperns'] = 'към майчиното именно пространство'; +$lang['admin_register'] = 'Добавяне на нов потребител'; $lang['metaedit'] = 'Редактиране на метаданни'; -$lang['metasaveerr'] = 'Запазването на метаданните бе неуспешно'; -$lang['metasaveok'] = 'Метаданните бяха запазени'; +$lang['metasaveerr'] = 'Метаданните не бяха запазени'; +$lang['metasaveok'] = 'Метаданните бяха запазени успешно'; $lang['img_backto'] = 'Назад към'; $lang['img_title'] = 'Заглавие'; $lang['img_caption'] = 'Надпис'; $lang['img_date'] = 'Дата'; -$lang['img_fname'] = 'Име на файл'; +$lang['img_fname'] = 'Име на файла'; $lang['img_fsize'] = 'Размер'; -$lang['img_artist'] = 'Заснет от'; +$lang['img_artist'] = 'Фотограф'; $lang['img_copyr'] = 'Авторско право'; $lang['img_format'] = 'Формат'; $lang['img_camera'] = 'Фотоапарат'; $lang['img_keywords'] = 'Ключови думи'; -$lang['subscribe_success'] = '%s бе добавен към абонамента за %s'; -$lang['subscribe_error'] = 'Имаше грешка при добавянето на абонамента на %s за %s'; -$lang['subscribe_noaddress'] = 'Няма адрес свързан с потребителя, не може да се абонирате'; -$lang['unsubscribe_success'] = 'Абонаментът %s бе премахнат от списъка за %s'; -$lang['unsubscribe_error'] = 'Имаше грешка при премахването на абонамента на %s от списъка %s'; -$lang['authmodfailed'] = 'Лоша настройка за удостоверяване на потребителя. Моля, уведомете администратора.'; -$lang['authtempfail'] = 'Удостоверяването на потребителите е временно недостъпно. Ако това продължи дълго, моля уведомете администратора.'; -$lang['i_chooselang'] = 'Избор на език'; +$lang['authmodfailed'] = 'Лоша настройки за удостоверяване. Моля, уведомете администратора на Wiki страницата.'; +$lang['authtempfail'] = 'Удостоверяването на потребители не е възможно за момента. Ако продължи дълго, моля уведомете администратора на Wiki страницата.'; +$lang['i_chooselang'] = 'Изберете вашия изик'; $lang['i_installer'] = 'Инсталатор на DokuWiki'; -$lang['i_wikiname'] = 'Име на Wiki'; -$lang['i_enableacl'] = 'Включване на списъци за достъп ACL (препоръчително)'; +$lang['i_wikiname'] = 'Име на Wiki-то'; +$lang['i_enableacl'] = 'Ползване на списък за достъп (ACL) [препоръчително]'; $lang['i_superuser'] = 'Супер потребител'; -$lang['i_problems'] = 'Инсталатора намери проблеми указани по-долу. Не може да продължите, докато не ги отстраните.'; -$lang['i_modified'] = 'Поради мерки за сигурност този скрипт ще работи само с нова и непроменена Dokuwiki инсталация. Трябва да разархивирате отново файловете от дръпнатия пакет или да се посъветвате с пълните <a href="http://dokuwiki.org/install">Инструкции за инсталация на Dokuwiki</a>.'; +$lang['i_problems'] = 'Открити са проблеми, които възпрепятстват инсталирането. Ще можете да продължите след като отстраните долуизброените проблеми.'; +$lang['i_modified'] = 'Поради мерки за сигурност скрипта ще работи само с нова и непроменена инсталация на Dokuwiki. Трябва да разархивирате отново файловете от сваления архив или да се посъветвате с <a href="http://dokuwiki.org/install">Инструкциите за инсталация на Dokuwiki</a>.'; $lang['i_funcna'] = 'PHP функцията <code>%s</code> не е достъпна. Може би е забранена от доставчика на хостинг.'; $lang['i_phpver'] = 'Вашата PHP версия <code>%s</code> е по-стара от необходимата <code>%s</code>. Обновете PHP инсталацията си.'; -$lang['i_permfail'] = '<code>%s</code> не е достъпна за писане от DokuWiki. Трябва да промените настройките за достъп до директорията!'; +$lang['i_permfail'] = '<code>%s</code> не е достъпна за писане от DokuWiki. Трябва да промените правата за достъп до директорията!'; $lang['i_confexists'] = '<code>%s</code> вече съществува'; -$lang['i_writeerr'] = '<code>%s</code> не можа да бъде създаден. Трябва да проверите правата на директорията/файла за достъп и да създадете файл ръчно.'; -$lang['i_badhash'] = 'неразпознат или променен dokuwiki.php (hash=<code>%s</code>)'; +$lang['i_writeerr'] = '<code>%s</code> не можа да бъде създаден. Трябва да проверите правата за достъп до директорията/файла и да създадете файла ръчно.'; +$lang['i_badhash'] = 'Файлът dokuwiki.php не може да бъде разпознат или е променен (hash=<code>%s</code>)'; $lang['i_badval'] = '<code>%s</code> - непозволена или празна стойност'; -$lang['i_success'] = 'Настройката приключи успешно. Може да създадете файлът install.php сега. Продължете към - <a href="doku.php">Ново Ви DokuWiki</a>.'; -$lang['i_failure'] = 'Имаше грешки при записа на файловете с настройки. Може да трябва да ги редактирате ръчно. Ползвайте <a href="doku.php">Ново Ви DokuWiki</a>.'; -$lang['i_policy'] = 'Първоначална политика за достъп ACL'; -$lang['i_pol0'] = 'Отворено Wiki (четене, писане, качване от всички)'; -$lang['i_pol1'] = 'Публично Wiki (четене от всички, писане и качване от регистрирани потребители)'; -$lang['i_pol2'] = 'Затворено Wiki (четене, писане, качване само от регистрирани потребители)'; +$lang['i_success'] = 'Настройването приключи успешно. Вече можете да изтриете файла install.php. Продължете към <a href="doku.php">Вашето ново DokuWiki</a>.'; +$lang['i_failure'] = 'Възникнаха грешки при записването на файловете с настройки. Вероятно ще се наложи да ги поправите ръчно, за да можете да ползвате <a href="doku.php">Вашето ново DokuWiki</a>.'; +$lang['i_policy'] = 'Първоначална политика за достъп'; +$lang['i_pol0'] = 'Отворено Wiki (всеки може да чете, пише и качва)'; +$lang['i_pol1'] = 'Публично Wiki (всеки може да чете, само регистрирани могат да пишат и качват)'; +$lang['i_pol2'] = 'Затворено Wiki (само регистрирани могат четат, пишат и качват)'; $lang['i_retry'] = 'Повторен опит'; -$lang['mu_intro'] = 'Тук можете да качите няколко файла наведнъж. Добавете ги към съответните полета и натиснете бутона за качване. +$lang['i_license'] = 'Моля, изберете лиценз под който желаете да публикувате съдържанието'; +$lang['mu_intro'] = 'От тук можете да качите няколко файла наведнъж. Натиснете бутон "Избиране", изберете файлове и натиснете "Качи". '; $lang['mu_gridname'] = 'Име на файл'; $lang['mu_gridsize'] = 'Големина'; $lang['mu_gridstat'] = 'Състояние'; $lang['mu_namespace'] = 'Именно пространство'; -$lang['mu_browse'] = 'Избери'; +$lang['mu_browse'] = 'Избиране'; $lang['mu_toobig'] = 'прекалено голям'; $lang['mu_ready'] = 'готов за качване'; -$lang['mu_done'] = 'приключен'; -$lang['mu_fail'] = 'неуспешен'; -$lang['mu_authfail'] = 'сесията изтече'; +$lang['mu_done'] = 'качен'; +$lang['mu_fail'] = 'неуспешно качване'; +$lang['mu_authfail'] = 'приключила сесия'; $lang['mu_progress'] = '@PCT@% качен'; $lang['mu_filetypes'] = 'Позволени файлови разширения'; -$lang['mu_info'] = 'качени файлове'; +$lang['mu_info'] = 'качени файла.'; $lang['mu_lasterr'] = 'Последна грешка:'; -$lang['recent_global'] = 'В момента преглеждате промените в <b>%s</b> именно пространство. Може да прегледате и <a href="%s">промените на цялото Wiki</a>.'; +$lang['recent_global'] = 'В момента преглеждате промените в именно пространство <b>%s</b>. Може да прегледате и <a href="%s">промените в цялото Wiki</a>.'; $lang['years'] = 'преди %d години'; $lang['months'] = 'преди %d месеци'; $lang['weeks'] = 'преди %d седмици'; @@ -245,3 +248,4 @@ $lang['days'] = 'преди %d дни'; $lang['hours'] = 'преди %d часа'; $lang['minutes'] = 'преди %d минути'; $lang['seconds'] = 'преди %d секунди'; +$lang['wordblock'] = 'Направените от вас промени не бяха съхранени, защото съдържат забранен текст (SPAM).'; diff --git a/inc/lang/bg/locked.txt b/inc/lang/bg/locked.txt index 0eecc6729..7cdfba786 100644 --- a/inc/lang/bg/locked.txt +++ b/inc/lang/bg/locked.txt @@ -1,3 +1,3 @@ -====== Страницата е затворена ====== +====== Страницата е заключена ====== -В момента страницата е затворена за редакция от друг потребител. Трябва да изчаката докато този потребител приключи или затварянето изтече. +В момента страницата е заключена за редактиране от друг потребител. Трябва да изчакате потребителя да приключи с редактирането на страницата или автоматичното отключване на страницата. diff --git a/inc/lang/bg/login.txt b/inc/lang/bg/login.txt index b525f08cf..9cc85ce32 100644 --- a/inc/lang/bg/login.txt +++ b/inc/lang/bg/login.txt @@ -1,3 +1,3 @@ -====== Вход ====== +====== Вписване ====== -В момента не сте влезли! Въведете данните си долу, за да го направите. Бисквитките (cookies) трябва да са включени. +Не сте се вписали! Въведете данните си долу, за да го направите. Бисквитките (cookies) трябва да са включени. diff --git a/inc/lang/bg/newpage.txt b/inc/lang/bg/newpage.txt index fcc1c6257..bf67b2266 100644 --- a/inc/lang/bg/newpage.txt +++ b/inc/lang/bg/newpage.txt @@ -1,4 +1,4 @@ ====== Несъществуваща тема ====== -Последвали сте връзка към тема, която все още не съществува. Ако правата Ви позволяват, може да я създадете като използвате бутона ''Създаване на страницата'' +Последвали сте препратка към тема, която все още не съществува. Ако правата Ви позволяват, може да я създадете чрез бутона ''Създаване на страница''. diff --git a/inc/lang/bg/norev.txt b/inc/lang/bg/norev.txt index 0262aef60..fb7aeef89 100644 --- a/inc/lang/bg/norev.txt +++ b/inc/lang/bg/norev.txt @@ -1,4 +1,4 @@ ====== Няма такава версия ====== -Избраната версия не съществува. Използвайте бутона ''Редакции'' за списък на стари версии на документа. +Избраната версия не съществува. Натиснете бутона ''История'' за отваряне на списъка със стари версии на документа. diff --git a/inc/lang/bg/password.txt b/inc/lang/bg/password.txt index be2f10c61..a3ee557e9 100644 --- a/inc/lang/bg/password.txt +++ b/inc/lang/bg/password.txt @@ -1,9 +1,9 @@ Здравейте @FULLNAME@! -Ето Вашите потребителски данни за @TITLE@ на @DOKUWIKIURL@ +Това са Вашите потребителски данни за @TITLE@ от @DOKUWIKIURL@ Потребител: @LOGIN@ Парола : @PASSWORD@ -- -Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file +Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@
\ No newline at end of file diff --git a/inc/lang/bg/preview.txt b/inc/lang/bg/preview.txt index 442f16de2..41fde7380 100644 --- a/inc/lang/bg/preview.txt +++ b/inc/lang/bg/preview.txt @@ -1,3 +1,3 @@ ====== Преглед ====== -Ето как ще изглежда текста. Той обаче все още **не е запазен** ! +Ето как ще изглежда страницата. Текста все още **не е запазен**!
\ No newline at end of file diff --git a/inc/lang/bg/pwconfirm.txt b/inc/lang/bg/pwconfirm.txt index 1cd64b151..beb56cca3 100644 --- a/inc/lang/bg/pwconfirm.txt +++ b/inc/lang/bg/pwconfirm.txt @@ -1,14 +1,13 @@ Здравейте @FULLNAME@! -Някой е поискал нова парола за потребителя @TITLE@ +Някой е поискал нова парола за потребител @TITLE@ на @DOKUWIKIURL@ Ако не сте поискали нова парола, товава просто игнорирайте това писмо. -За да потвърдите, че искането е наистина пратено от вас, моля използвайте -следния адрес. +За да потвърдите, че искането е наистина пратено от вас, моля ползвайте следния адрес. @CONFIRM@ -- -Това писмо е генерирано от DokuWiki на адрес @DOKUWIKIURL@ +Писмото е генерирано от DokuWiki на адрес @DOKUWIKIURL@ diff --git a/inc/lang/bg/read.txt b/inc/lang/bg/read.txt index 89e9a9d70..a3a15a07f 100644 --- a/inc/lang/bg/read.txt +++ b/inc/lang/bg/read.txt @@ -1,2 +1,2 @@ -Тази страница е позволена само за четене. Може да разгледате кода, но не и да го променята. Обърнете се съм администратора си, ако мислите, че това е грешно. +Тази страница е само за четене. Може да разглеждате кода, но не и да го променяте. Обърнете се съм администратора, ако смятате, че това не е редно. diff --git a/inc/lang/bg/register.txt b/inc/lang/bg/register.txt index 74a07cd90..b4076e89b 100644 --- a/inc/lang/bg/register.txt +++ b/inc/lang/bg/register.txt @@ -1,4 +1,4 @@ ====== Регистрирайте се като нов потребител ====== -Моля, попълнете всичката информация долу, за да създадете нов профил в това уики. Бъдете сигурни, че подавате **валиден адрес на електронна поща** - ако не се пита за парола тук, нова ще бъде пратена на този адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на сраница]] +Моля, попълнете всичките полета, за да бъде създаден нов профил. Уверете се, че въведения **адрес на ел. поща е правилен**. Ако няма поле за парола, ще ви бъде изпратена такава на въведения адрес. Потребителското име трябва да бъде валидно [[doku>pagename|име на страница]]. diff --git a/inc/lang/bg/resendpwd.txt b/inc/lang/bg/resendpwd.txt index 7b9b9a027..4823fbf00 100644 --- a/inc/lang/bg/resendpwd.txt +++ b/inc/lang/bg/resendpwd.txt @@ -1,3 +1,3 @@ ====== Пращане на нова парола ====== -Моля, въведете потребителското си име във формуляра долу, за да поискате нова парола за вашият профил в това Wiki. Връзка за потвърждение ще ви бъде пратена на регистрираният в това Wiki адрес на електронна поща. +Моля, въведете потребителското си име във формата по-долу, ако желаете да получите нова парола. Линк за потвърждение ще ви бъде пратен на адреса на ел. поща, с която сте се регистрирани. diff --git a/inc/lang/bg/revisions.txt b/inc/lang/bg/revisions.txt index 295f5f6cc..0e14662b7 100644 --- a/inc/lang/bg/revisions.txt +++ b/inc/lang/bg/revisions.txt @@ -1,4 +1,4 @@ -====== Стари редакции ====== +====== Стари версии====== -Това са стари редакции на този документ. За да възстановите стара версия, изберете я долу, натиснете ''Редактиране'' и я запазете. +Това са старите версии на документа. За да възстановите стара версия, изберете я долу, натиснете ''Редактиране'' и я запазете. diff --git a/inc/lang/bg/searchpage.txt b/inc/lang/bg/searchpage.txt index 03e019985..48d47515a 100644 --- a/inc/lang/bg/searchpage.txt +++ b/inc/lang/bg/searchpage.txt @@ -1,5 +1,5 @@ ====== Търсене ====== -Може да намерите резултатите на търсенето долу. Ако не сте намерили каквото сте търсили, може да създадете или редактирате страница кръстена по вашета заявка за търсене със съответният бутон +Резултата от търсенето ще намерите по-долу. Ако не намирате каквото сте търсили, може да създадете или редактирате страница, кръстена на вашата заявка, чрез съответния бутон. ===== Резултати ===== diff --git a/inc/lang/bg/showrev.txt b/inc/lang/bg/showrev.txt index c0b1709fe..a3848f8bb 100644 --- a/inc/lang/bg/showrev.txt +++ b/inc/lang/bg/showrev.txt @@ -1,2 +1,2 @@ -**Това е стара редакция на документа** +**Това е стара версия на документа!** ---- diff --git a/inc/lang/bg/stopwords.txt b/inc/lang/bg/stopwords.txt index 369f4d789..b1627bb9a 100644 --- a/inc/lang/bg/stopwords.txt +++ b/inc/lang/bg/stopwords.txt @@ -1,7 +1,7 @@ # Това е списък на думи за игнориране, с една дума на ред # Когато редактирате този файл, не забравяйте да използвате UNIX символ за нов ред -# Не е нужно да включвате думи по-кратки от 3 символа - те са игнорирани така или иначе -# Този списък се основава на думи намерени на http://www.ranks.nl/stopwords/ +# Не е нужно да включвате думи по-кратки от 3 символа - те биват игнорирани така или иначе +# Този списък се основава на думи от http://www.ranks.nl/stopwords/ about are and diff --git a/inc/lang/bg/updateprofile.txt b/inc/lang/bg/updateprofile.txt index 0a6f15297..6113f0d07 100644 --- a/inc/lang/bg/updateprofile.txt +++ b/inc/lang/bg/updateprofile.txt @@ -1,3 +1,3 @@ ====== Обновете профила си ====== -Трябва само да допълните полетата, които искате да промените. Не може да сменяте потребителското си име. +Трябва само да допълните полетата, които искате да промените. Потребителското не може да бъде променяно. diff --git a/inc/lang/bg/uploadmail.txt b/inc/lang/bg/uploadmail.txt index 74f0cdc3e..7373adcea 100644 --- a/inc/lang/bg/uploadmail.txt +++ b/inc/lang/bg/uploadmail.txt @@ -1,4 +1,4 @@ -Бе качен файл на вашето DokuWiki. Ето детайлите +Качен е файл на вашето DokuWiki. Ето детайлите Файл : @MEDIA@ Дата : @DATE@ diff --git a/inc/lang/en/lang.php b/inc/lang/en/lang.php index 9ccbe14e0..8abd4314c 100644 --- a/inc/lang/en/lang.php +++ b/inc/lang/en/lang.php @@ -164,6 +164,9 @@ $lang['yours'] = 'Your Version'; $lang['diff'] = 'Show differences to current revisions'; $lang['diff2'] = 'Show differences between selected revisions'; $lang['difflink'] = 'Link to this comparison view'; +$lang['diff_type'] = 'View differences:'; +$lang['diff_inline']= 'Inline'; +$lang['diff_side'] = 'Side by Side'; $lang['line'] = 'Line'; $lang['breadcrumb'] = 'Trace'; $lang['youarehere'] = 'You are here'; diff --git a/inc/lang/fr/lang.php b/inc/lang/fr/lang.php index 76e1271bd..17d35dfa9 100644 --- a/inc/lang/fr/lang.php +++ b/inc/lang/fr/lang.php @@ -21,6 +21,7 @@ * @author Philippe Bajoit <philippe.bajoit@gmail.com> * @author Florian Gaub <floriang@floriang.net> * @author Samuel Dorsaz samuel.dorsaz@novelion.net + * @author Johan Guilbaud <guilbaud.johan@gmail.com> */ $lang['encoding'] = 'utf-8'; $lang['direction'] = 'ltr'; diff --git a/inc/lang/pt/lang.php b/inc/lang/pt/lang.php index 4c0ec02d2..6b68c5fef 100644 --- a/inc/lang/pt/lang.php +++ b/inc/lang/pt/lang.php @@ -160,6 +160,8 @@ $lang['yours'] = 'A sua versão'; $lang['diff'] = 'mostrar diferenças com a versão actual'; $lang['diff2'] = 'mostrar diferenças entre versões escolhidas'; $lang['difflink'] = 'Ligação para esta vista de comparação'; +$lang['diff_type'] = 'Ver diferenças'; +$lang['diff_side'] = 'Lado a lado'; $lang['line'] = 'Linha'; $lang['breadcrumb'] = 'Está em'; $lang['youarehere'] = 'Está aqui'; diff --git a/inc/media.php b/inc/media.php index 69441352b..3c9340d51 100644 --- a/inc/media.php +++ b/inc/media.php @@ -141,7 +141,7 @@ function media_metaform($id,$auth){ } /** - * Conveinience function to check if a media file is still in use + * Convenience function to check if a media file is still in use * * @author Michael Klier <chi@chimeric.de> */ @@ -160,19 +160,26 @@ function media_inuse($id) { } } +define('DOKU_MEDIA_DELETED', 1); +define('DOKU_MEDIA_NOT_AUTH', 2); +define('DOKU_MEDIA_INUSE', 4); +define('DOKU_MEDIA_EMPTY_NS', 8); + /** * Handles media file deletions * * If configured, checks for media references before deletion * * @author Andreas Gohr <andi@splitbrain.org> - * @return mixed false on error, true on delete or array with refs + * @return int One of: 0, + DOKU_MEDIA_DELETED, + DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS, + DOKU_MEDIA_NOT_AUTH, + DOKU_MEDIA_INUSE */ function media_delete($id,$auth){ - if($auth < AUTH_DELETE) return false; - if(!checkSecurityToken()) return false; - global $conf; - global $lang; + if($auth < AUTH_DELETE) return DOKU_MEDIA_NOT_AUTH; + if(media_inuse($id)) return DOKU_MEDIA_INUSE; $file = mediaFN($id); @@ -196,38 +203,22 @@ function media_delete($id,$auth){ unset($evt); if($data['unl'] && $data['del']){ - // current namespace was removed. redirecting to root ns passing msg along - send_redirect(DOKU_URL.'lib/exe/mediamanager.php?msg1='. - rawurlencode(sprintf(noNS($id),$lang['deletesucc']))); + return DOKU_MEDIA_DELETED | DOKU_MEDIA_EMPTY_NS; } - return $data['unl']; + return $data['unl'] ? DOKU_MEDIA_DELETED : 0; } /** * Handles media file uploads * - * This generates an action event and delegates to _media_upload_action(). - * Action plugins are allowed to pre/postprocess the uploaded file. - * (The triggered event is preventable.) - * - * Event data: - * $data[0] fn_tmp: the temporary file name (read from $_FILES) - * $data[1] fn: the file name of the uploaded file - * $data[2] id: the future directory id of the uploaded file - * $data[3] imime: the mimetype of the uploaded file - * $data[4] overwrite: if an existing file is going to be overwritten - * - * @triggers MEDIA_UPLOAD_FINISH * @author Andreas Gohr <andi@splitbrain.org> * @author Michael Klier <chi@chimeric.de> * @return mixed false on error, id of the new file on success */ function media_upload($ns,$auth){ - if($auth < AUTH_UPLOAD) return false; if(!checkSecurityToken()) return false; global $lang; - global $conf; // get file and id $id = $_POST['id']; @@ -249,8 +240,50 @@ function media_upload($ns,$auth){ msg(sprintf($lang['mediaextchange'],$fext,$iext)); } + $res = media_save(array('name' => $file['tmp_name'], + 'mime' => $imime, + 'ext' => $iext), $ns.':'.$id, + $_REQUEST['ow'], $auth, 'move_uploaded_file'); + if (is_array($res)) { + msg($res[0], $res[1]); + return false; + } + return $res; +} + +/** + * This generates an action event and delegates to _media_upload_action(). + * Action plugins are allowed to pre/postprocess the uploaded file. + * (The triggered event is preventable.) + * + * Event data: + * $data[0] fn_tmp: the temporary file name (read from $_FILES) + * $data[1] fn: the file name of the uploaded file + * $data[2] id: the future directory id of the uploaded file + * $data[3] imime: the mimetype of the uploaded file + * $data[4] overwrite: if an existing file is going to be overwritten + * + * @triggers MEDIA_UPLOAD_FINISH + */ +function media_save($file, $id, $ow, $auth, $move) { + if($auth < AUTH_UPLOAD) { + return array("You don't have permissions to upload files.", -1); + } + + if (!isset($file['mime']) || !isset($file['ext'])) { + list($ext, $mime) = mimetype($id); + if (!isset($file['mime'])) { + $file['mime'] = $mime; + } + if (!isset($file['ext'])) { + $file['ext'] = $ext; + } + } + + global $lang; + // get filename - $id = cleanID($ns.':'.$id,false,true); + $id = cleanID($id,false,true); $fn = mediaFN($id); // get filetype regexp @@ -259,40 +292,35 @@ function media_upload($ns,$auth){ $regex = join('|',$types); // because a temp file was created already - if(preg_match('/\.('.$regex.')$/i',$fn)){ - //check for overwrite - $overwrite = @file_exists($fn); - if($overwrite && (!$_REQUEST['ow'] || $auth < AUTH_DELETE)){ - msg($lang['uploadexist'],0); - return false; - } - // check for valid content - $ok = media_contentcheck($file['tmp_name'],$imime); - if($ok == -1){ - msg(sprintf($lang['uploadbadcontent'],".$iext"),-1); - return false; - }elseif($ok == -2){ - msg($lang['uploadspam'],-1); - return false; - }elseif($ok == -3){ - msg($lang['uploadxss'],-1); - return false; - } + if(!preg_match('/\.('.$regex.')$/i',$fn)) { + return array($lang['uploadwrong'],-1); + } - // prepare event data - $data[0] = $file['tmp_name']; - $data[1] = $fn; - $data[2] = $id; - $data[3] = $imime; - $data[4] = $overwrite; + //check for overwrite + $overwrite = @file_exists($fn); + if($overwrite && (!$ow || $auth < AUTH_DELETE)) { + return array($lang['uploadexist'], 0); + } + // check for valid content + $ok = media_contentcheck($file['name'], $file['mime']); + if($ok == -1){ + return array(sprintf($lang['uploadbadcontent'],'.' . $file['ext']),-1); + }elseif($ok == -2){ + return array($lang['uploadspam'],-1); + }elseif($ok == -3){ + return array($lang['uploadxss'],-1); + } - // trigger event - return trigger_event('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true); + // prepare event data + $data[0] = $file['name']; + $data[1] = $fn; + $data[2] = $id; + $data[3] = $file['mime']; + $data[4] = $overwrite; + $data[5] = $move; - }else{ - msg($lang['uploadwrong'],-1); - } - return false; + // trigger event + return trigger_event('MEDIA_UPLOAD_FINISH', $data, '_media_upload_action', true); } /** @@ -301,8 +329,8 @@ function media_upload($ns,$auth){ */ function _media_upload_action($data) { // fixme do further sanity tests of given data? - if(is_array($data) && count($data)===5) { - return media_upload_finish($data[0], $data[1], $data[2], $data[3], $data[4]); + if(is_array($data) && count($data)===6) { + return media_upload_finish($data[0], $data[1], $data[2], $data[3], $data[4], $data[5]); } else { return false; //callback error } @@ -314,14 +342,14 @@ function _media_upload_action($data) { * @author Andreas Gohr <andi@splitbrain.org> * @author Michael Klier <chi@chimeric.de> */ -function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite) { +function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite, $move = 'move_uploaded_file') { global $conf; global $lang; // prepare directory io_createNamespace($id, 'media'); - if(move_uploaded_file($fn_tmp, $fn)) { + if($move($fn_tmp, $fn)) { // Set the correct permission here. // Always chmod media because they may be saved with different permissions than expected from the php umask. // (Should normally chmod to $conf['fperm'] only if $conf['fperm'] is set.) @@ -336,7 +364,7 @@ function media_upload_finish($fn_tmp, $fn, $id, $imime, $overwrite) { } return $id; }else{ - msg($lang['uploadfail'],-1); + return array($lang['uploadfail'],-1); } } diff --git a/inc/parser/handler.php b/inc/parser/handler.php index 4d0b56b44..85a353dca 100644 --- a/inc/parser/handler.php +++ b/inc/parser/handler.php @@ -720,6 +720,7 @@ class Doku_Handler_CallWriter { // function is required, but since this call writer is first/highest in // the chain it is not required to do anything function finalise() { + unset($this->Handler); } } @@ -764,6 +765,7 @@ class Doku_Handler_Nest { $this->process(); $this->CallWriter->finalise(); + unset($this->CallWriter); } function process() { @@ -817,6 +819,7 @@ class Doku_Handler_List { $this->process(); $this->CallWriter->finalise(); + unset($this->CallWriter); } //------------------------------------------------------------------------ @@ -1014,6 +1017,7 @@ class Doku_Handler_Preformatted { $this->process(); $this->CallWriter->finalise(); + unset($this->CallWriter); } function process() { @@ -1070,6 +1074,7 @@ class Doku_Handler_Quote { $this->process(); $this->CallWriter->finalise(); + unset($this->CallWriter); } function process() { @@ -1165,6 +1170,7 @@ class Doku_Handler_Table { $this->process(); $this->CallWriter->finalise(); + unset($this->CallWriter); } //------------------------------------------------------------------------ diff --git a/inc/parser/parser.php b/inc/parser/parser.php index b93760f3a..a7764ee9c 100644 --- a/inc/parser/parser.php +++ b/inc/parser/parser.php @@ -828,7 +828,7 @@ class Doku_Parser_Mode_internallink extends Doku_Parser_Mode { function connectTo($mode) { // Word boundaries? - $this->Lexer->addSpecialPattern("\[\[.+?\]\]",$mode,'internallink'); + $this->Lexer->addSpecialPattern("\[\[(?:(?:.*?\[.*?\])|.+?)\]\]",$mode,'internallink'); } function getSort() { @@ -870,7 +870,7 @@ class Doku_Parser_Mode_externallink extends Doku_Parser_Mode { if(count($this->patterns)) return; $ltrs = '\w'; - $gunk = '/\#~:.?+=&%@!\-'; + $gunk = '/\#~:.?+=&%@!\-\[\]'; $punc = '.:?\-;,'; $host = $ltrs.$punc; $any = $ltrs.$gunk.$punc; diff --git a/inc/parserutils.php b/inc/parserutils.php index 6e349e984..9b2d99328 100644 --- a/inc/parserutils.php +++ b/inc/parserutils.php @@ -258,7 +258,7 @@ function p_get_metadata($id, $key='', $render=true){ if ($meta == $old_meta || p_save_metadata($id, $meta)) { // store a timestamp in order to make sure that the cachefile is touched $cachefile->storeCache(time()); - } else { + } elseif ($meta != $old_meta) { msg('Unable to save metadata file. Hint: disk full; file permissions; safe_mode setting.',-1); } } @@ -291,18 +291,25 @@ function p_get_metadata($id, $key='', $render=true){ * @return boolean true on success * * @author Esther Brunner <esther@kaffeehaus.ch> + * @author Michael Hamann <michael@content-space.de> */ function p_set_metadata($id, $data, $render=false, $persistent=true){ if (!is_array($data)) return false; - global $ID; + global $ID, $METADATA_RENDERERS; - // cache the current page - $cache = ($ID == $id); - $orig = p_read_metadata($id, $cache); + // if there is currently a renderer change the data in the renderer instead + if (isset($METADATA_RENDERERS[$id])) { + $orig =& $METADATA_RENDERERS[$id]; + $meta = $orig; + } else { + // cache the current page + $cache = ($ID == $id); + $orig = p_read_metadata($id, $cache); - // render metadata first? - $meta = $render ? p_render_metadata($id, $orig) : $orig; + // render metadata first? + $meta = $render ? p_render_metadata($id, $orig) : $orig; + } // now add the passed metadata $protected = array('description', 'date', 'contributor'); @@ -339,7 +346,13 @@ function p_set_metadata($id, $data, $render=false, $persistent=true){ // save only if metadata changed if ($meta == $orig) return true; - return p_save_metadata($id, $meta); + if (isset($METADATA_RENDERERS[$id])) { + // set both keys individually as the renderer has references to the individual keys + $METADATA_RENDERERS[$id]['current'] = $meta['current']; + $METADATA_RENDERERS[$id]['persistent'] = $meta['persistent']; + } else { + return p_save_metadata($id, $meta); + } } /** @@ -413,7 +426,15 @@ function p_save_metadata($id, $meta) { */ function p_render_metadata($id, $orig){ // make sure the correct ID is in global ID - global $ID; + global $ID, $METADATA_RENDERERS; + + // avoid recursive rendering processes for the same id + if (isset($METADATA_RENDERERS[$id])) + return $orig; + + // store the original metadata in the global $METADATA_RENDERERS so p_set_metadata can use it + $METADATA_RENDERERS[$id] =& $orig; + $keep = $ID; $ID = $id; @@ -428,13 +449,14 @@ function p_render_metadata($id, $orig){ $instructions = p_cached_instructions(wikiFN($id),false,$id); if(is_null($instructions)){ $ID = $keep; + unset($METADATA_RENDERERS[$id]); return null; // something went wrong with the instructions } // set up the renderer $renderer = new Doku_Renderer_metadata(); - $renderer->meta = $orig['current']; - $renderer->persistent = $orig['persistent']; + $renderer->meta =& $orig['current']; + $renderer->persistent =& $orig['persistent']; // loop through the instructions foreach ($instructions as $instruction){ @@ -442,11 +464,13 @@ function p_render_metadata($id, $orig){ call_user_func_array(array(&$renderer, $instruction[0]), (array) $instruction[1]); } - $evt->result = array('current'=>$renderer->meta,'persistent'=>$renderer->persistent); + $evt->result = array('current'=>&$renderer->meta,'persistent'=>&$renderer->persistent); } $evt->advise_after(); + // clean up $ID = $keep; + unset($METADATA_RENDERERS[$id]); return $evt->result; } diff --git a/inc/subscription.php b/inc/subscription.php index 1b5476553..8e3a99a8f 100644 --- a/inc/subscription.php +++ b/inc/subscription.php @@ -50,18 +50,19 @@ function subscription_lock_filename ($id){ } function subscription_lock($id) { - // FIXME merge this with the indexer lock generation, abstract out global $conf; $lock = subscription_lock_filename($id); - while(!@mkdir($lock,$conf['dmode'])){ - usleep(50); - if(time()-@filemtime($lock) > 60*5){ - // looks like a stale lock - remove it - @rmdir($lock); - }else{ - return false; - } + + if (is_dir($lock) && time()-@filemtime($lock) > 60*5) { + // looks like a stale lock - remove it + @rmdir($lock); } + + // try creating the lock directory + if (!@mkdir($lock,$conf['dmode'])) { + return false; + } + if($conf['dperm']) chmod($lock, $conf['dperm']); return true; } diff --git a/inc/template.php b/inc/template.php index ad9a454b4..7ac3437fb 100644 --- a/inc/template.php +++ b/inc/template.php @@ -739,12 +739,6 @@ function tpl_youarehere($sep=' » '){ $parts = explode(':', $ID); $count = count($parts); - if($GLOBALS['ACT'] == 'search') - { - $parts = array($conf['start']); - $count = 1; - } - echo '<span class="bchead">'.$lang['youarehere'].': </span>'; // always print the startpage @@ -1164,7 +1158,7 @@ function tpl_actiondropdown($empty='',$button='>'){ if($REV) echo '<input type="hidden" name="rev" value="'.$REV.'" />'; echo '<input type="hidden" name="sectok" value="'.getSecurityToken().'" />'; - echo '<select name="do" id="action__selector" class="edit">'; + echo '<select name="do" class="edit quickselect">'; echo '<option value="">'.$empty.'</option>'; echo '<optgroup label=" — ">'; @@ -1204,7 +1198,7 @@ function tpl_actiondropdown($empty='',$button='>'){ echo '</optgroup>'; echo '</select>'; - echo '<input type="submit" value="'.$button.'" id="action__selectorbtn" />'; + echo '<input type="submit" value="'.$button.'" />'; echo '</form>'; } diff --git a/lib/exe/indexer.php b/lib/exe/indexer.php index eec8c968c..0042e92d2 100644 --- a/lib/exe/indexer.php +++ b/lib/exe/indexer.php @@ -149,14 +149,20 @@ function runIndexer(){ } // try to aquire a lock + $run = 0; $lock = $conf['lockdir'].'/_indexer.lock'; while(!@mkdir($lock,$conf['dmode'])){ usleep(50); - if(time()-@filemtime($lock) > 60*5){ + if(is_dir($lock) && time()-@filemtime($lock) > 60*5){ // looks like a stale lock - remove it - @rmdir($lock); - print "runIndexer(): stale lock removed".NL; - }else{ + if (!@rmdir($lock)) { + print "runIndexer(): removing the stale lock failed".NL; + return false; + } else { + print "runIndexer(): stale lock removed".NL; + } + }elseif($run++ == 1000){ + // we waited 5 seconds for that lock print "runIndexer(): indexer locked".NL; return false; } diff --git a/lib/exe/js.php b/lib/exe/js.php index 117021308..645ab3cc4 100644 --- a/lib/exe/js.php +++ b/lib/exe/js.php @@ -48,6 +48,7 @@ function js_out(){ DOKU_INC.'lib/scripts/textselection.js', DOKU_INC.'lib/scripts/toolbar.js', DOKU_INC.'lib/scripts/edit.js', + DOKU_INC.'lib/scripts/locktimer.js', DOKU_INC.'lib/scripts/linkwiz.js', DOKU_INC.'lib/scripts/media.js', DOKU_INC.'lib/scripts/subscriptions.js', diff --git a/lib/exe/mediamanager.php b/lib/exe/mediamanager.php index c79a25c08..6f2add2be 100644 --- a/lib/exe/mediamanager.php +++ b/lib/exe/mediamanager.php @@ -82,18 +82,24 @@ // handle deletion if($DEL) { - $INUSE = media_inuse($DEL); - if(!$INUSE) { - if(media_delete($DEL,$AUTH)) { - msg(sprintf($lang['deletesucc'],noNS($DEL)),1); - } else { - msg(sprintf($lang['deletefail'],noNS($DEL)),-1); + $res = 0; + if(checkSecurityToken()) { + $res = media_delete($DEL,$AUTH); + } + if ($res & DOKU_MEDIA_DELETED) { + $msg = sprintf($lang['deletesucc'], noNS($DEL)); + if ($res & DOKU_MEDIA_EMPTY_NS) { + // current namespace was removed. redirecting to root ns passing msg along + send_redirect(DOKU_URL.'lib/exe/mediamanager.php?msg1='. + rawurlencode($msg)); } - } else { + msg($msg,1); + } elseif ($res & DOKU_MEDIA_INUSE) { if(!$conf['refshow']) { - unset($INUSE); msg(sprintf($lang['mediainuse'],noNS($DEL)),0); } + } else { + msg(sprintf($lang['deletefail'],noNS($DEL)),-1); } } diff --git a/lib/exe/xmlrpc.php b/lib/exe/xmlrpc.php index d40e338b2..9749a2e16 100644 --- a/lib/exe/xmlrpc.php +++ b/lib/exe/xmlrpc.php @@ -605,64 +605,26 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer { */ function putAttachment($id, $file, $params) { $id = cleanID($id); - global $conf; - global $lang; - $auth = auth_quickaclcheck(getNS($id).':*'); - if($auth >= AUTH_UPLOAD) { - if(!isset($id)) { - return new IXR_ERROR(1, 'Filename not given.'); - } - $ftmp = $conf['tmpdir'] . '/' . md5($id.clientIP()); - - // save temporary file - @unlink($ftmp); - $buff = base64_decode($file); - io_saveFile($ftmp, $buff); + if(!isset($id)) { + return new IXR_ERROR(1, 'Filename not given.'); + } - // get filename - list($iext, $imime,$dl) = mimetype($id); - $id = cleanID($id); - $fn = mediaFN($id); - - // get filetype regexp - $types = array_keys(getMimeTypes()); - $types = array_map(create_function('$q','return preg_quote($q,"/");'),$types); - $regex = join('|',$types); - - // because a temp file was created already - if(preg_match('/\.('.$regex.')$/i',$fn)) { - //check for overwrite - $overwrite = @file_exists($fn); - if($overwrite && (!$params['ow'] || $auth < AUTH_DELETE)) { - return new IXR_ERROR(1, $lang['uploadexist'].'1'); - } - // check for valid content - $ok = media_contentcheck($ftmp, $imime); - if($ok == -1) { - return new IXR_ERROR(1, sprintf($lang['uploadexist'].'2', ".$iext")); - } elseif($ok == -2) { - return new IXR_ERROR(1, $lang['uploadspam']); - } elseif($ok == -3) { - return new IXR_ERROR(1, $lang['uploadxss']); - } + global $conf; - // prepare event data - $data[0] = $ftmp; - $data[1] = $fn; - $data[2] = $id; - $data[3] = $imime; - $data[4] = $overwrite; + $ftmp = $conf['tmpdir'] . '/' . md5($id.clientIP()); - // trigger event - return trigger_event('MEDIA_UPLOAD_FINISH', $data, array($this, '_media_upload_action'), true); + // save temporary file + @unlink($ftmp); + $buff = base64_decode($file); + io_saveFile($ftmp, $buff); - } else { - return new IXR_ERROR(1, $lang['uploadwrong']); - } + $res = media_save(array('name' => $ftmp), $id, $params['ow'], $auth, 'rename'); + if (is_array($res)) { + return new IXR_ERROR(-$res[1], $res[0]); } else { - return new IXR_ERROR(1, "You don't have permissions to upload files."); + return $res; } } @@ -674,55 +636,15 @@ class dokuwiki_xmlrpc_server extends IXR_IntrospectionServer { function deleteAttachment($id){ $id = cleanID($id); $auth = auth_quickaclcheck(getNS($id).':*'); - if($auth < AUTH_DELETE) return new IXR_ERROR(1, "You don't have permissions to delete files."); - global $conf; - global $lang; - - // check for references if needed - $mediareferences = array(); - if($conf['refcheck']){ - $mediareferences = ft_mediause($id,$conf['refshow']); - } - - if(!count($mediareferences)){ - $file = mediaFN($id); - if(@unlink($file)){ - addMediaLogEntry(time(), $id, DOKU_CHANGE_TYPE_DELETE); - io_sweepNS($id,'mediadir'); - return 0; - } - //something went wrong - return new IXR_ERROR(1, 'Could not delete file'); - } else { + $res = media_delete($id, $auth); + if ($res & DOKU_MEDIA_DELETED) { + return 0; + } elseif ($res & DOKU_MEDIA_NOT_AUTH) { + return new IXR_ERROR(1, "You don't have permissions to delete files."); + } elseif ($res & DOKU_MEDIA_INUSE) { return new IXR_ERROR(1, 'File is still referenced'); - } - } - - /** - * Moves the temporary file to its final destination. - * - * Michael Klier <chi@chimeric.de> - */ - function _media_upload_action($data) { - global $conf; - - if(is_array($data) && count($data)===5) { - io_createNamespace($data[2], 'media'); - if(rename($data[0], $data[1])) { - chmod($data[1], $conf['fmode']); - media_notify($data[2], $data[1], $data[3]); - // add a log entry to the media changelog - if ($data[4]) { - addMediaLogEntry(time(), $data[2], DOKU_CHANGE_TYPE_EDIT); - } else { - addMediaLogEntry(time(), $data[2], DOKU_CHANGE_TYPE_CREATE); - } - return $data[2]; - } else { - return new IXR_ERROR(1, 'Upload failed.'); - } } else { - return new IXR_ERROR(1, 'Upload failed.'); + return new IXR_ERROR(1, 'Could not delete file'); } } diff --git a/lib/plugins/acl/lang/bg/lang.php b/lib/plugins/acl/lang/bg/lang.php index 9facd4259..4efadfbba 100644 --- a/lib/plugins/acl/lang/bg/lang.php +++ b/lib/plugins/acl/lang/bg/lang.php @@ -5,6 +5,7 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Nikolay Vladimirov <nikolay@vladimiroff.com> * @author Viktor Usunov <usun0v@mail.bg> + * @author Kiril Velikov neohidra@gmail.com */ $lang['admin_acl'] = 'Управление на списъците за достъп'; $lang['acl_group'] = 'Група'; diff --git a/lib/plugins/acl/lang/fr/lang.php b/lib/plugins/acl/lang/fr/lang.php index 63e529aab..36323a51f 100644 --- a/lib/plugins/acl/lang/fr/lang.php +++ b/lib/plugins/acl/lang/fr/lang.php @@ -20,6 +20,7 @@ * @author Philippe Bajoit <philippe.bajoit@gmail.com> * @author Florian Gaub <floriang@floriang.net> * @author Samuel Dorsaz samuel.dorsaz@novelion.net + * @author Johan Guilbaud <guilbaud.johan@gmail.com> */ $lang['admin_acl'] = 'Gestion de la liste des contrôles d\'accès (ACL)'; $lang['acl_group'] = 'Groupe'; diff --git a/lib/plugins/config/lang/bg/intro.txt b/lib/plugins/config/lang/bg/intro.txt index 8723a77a4..fc455981e 100644 --- a/lib/plugins/config/lang/bg/intro.txt +++ b/lib/plugins/config/lang/bg/intro.txt @@ -1,7 +1,7 @@ ====== Управление на настройките ====== -Използвайте тази страница за да управлявате настройките на вашета Dokuwiki инсталация. За отделните настройки вижте [[doku>config]]. За повече подробности за тази приставка вижте [[doku>plugin:config]]. +От страница можете да управлявате настройките на вашето Dokuwiki. За отделните настройки вижте [[doku>config]]. За повече информация относно тази приставка вижте [[doku>plugin:config]]. -Настройките показани със светло червен фон за защитени и не могат да се променят с тази приставка. Настройките показани със син фон са стандартните стойности и настройките с бял фон са били настроени локално за тази конкретна инсталация. Както сините, така и белите настройки могат да се променят. +Настройките изобразени със светло червен фон за защитени и не могат да бъдат променяни с тази приставка. Настройките показани със син фон са стандартни стойности, а настройките с бял фон са били настроени локално за тази конкретна инсталация. Можете да променяте както сините, така и белите настройки. -Не забравяйте да натиснете бутона **ЗАПИС** преди да напуснете страницата, иначе промените ви ще бъдат загубени. +Не забравяйте да натиснете бутона **ЗАПИС** преди да напуснете страницата, в противен случай промените няма да бъдат приложени. diff --git a/lib/plugins/config/lang/bg/lang.php b/lib/plugins/config/lang/bg/lang.php index 855f0b2c2..8b32f182c 100644 --- a/lib/plugins/config/lang/bg/lang.php +++ b/lib/plugins/config/lang/bg/lang.php @@ -5,6 +5,7 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Nikolay Vladimirov <nikolay@vladimiroff.com> * @author Viktor Usunov <usun0v@mail.bg> + * @author Kiril Velikov neohidra@gmail.com */ $lang['menu'] = 'Настройки'; $lang['error'] = 'Невъзможно е обновяването на настройките, поради невалидна стойност, моля, прегледайте промените си и пробвайте отново. @@ -66,7 +67,7 @@ $lang['allowdebug'] = 'Пускане на debug <b>изключет $lang['usewordblock'] = 'Блокиране на спам базирано на списък от думи'; $lang['indexdelay'] = 'Забавяне преди индексиране(секунди)'; $lang['relnofollow'] = 'Използване на rel="nofollow" за външни връзки'; -$lang['mailguard'] = 'Промяна на адреса на електронната поща във форма непозволяваща пращането на спам'; +$lang['mailguard'] = 'Промяна на адресите на ел. поща (във форма непозволяваща пращането на SPAM)'; $lang['iexssprotect'] = 'Проверяване на качените файлове за възможно зловреден JavaScript и HTML код'; $lang['showuseras'] = 'Какво да се показва на дисплея за потребителя, който последно е променил тази страница'; $lang['useacl'] = 'Използване на списъци за достъп'; @@ -86,65 +87,66 @@ $lang['sneaky_index'] = 'По подразбиране DokuWiki ще п $lang['auth_security_timeout'] = 'Изчакване при вписване преди Timeout (в секунди)'; $lang['securecookie'] = 'Да се изпращат ли бисквитки, посочени чрез HTTPS, само чрез HTTPS от браузъра? Забранете тази опция, когато SSL се използва само за вписване в системата, а четенето е възможно и без SSL. '; -$lang['xmlrpc'] = 'Включи/изключи XML-RPC интерфейса'; +$lang['xmlrpc'] = 'Включване/Изключване на XML-RPC интерфейса.'; $lang['xmlrpcuser'] = 'Ограничаване на XML-RPC достъп до дадени тук и отделени със запетая групи или потребители. Оставете празни да даде достъп до всички.'; $lang['updatecheck'] = 'Проверка за нови версии и предупреждения за сигурност? Dokiwiki трябва да може да се свърже със splitbrain.org за тази функционалност.'; $lang['userewrite'] = 'Използване на валидни URL'; -$lang['useslash'] = 'Използване на наклонена черта за разделител на именнипространсвта в 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'] = 'Пращане на съобщения за промени на тази e-поща'; -$lang['registernotify'] = 'Пращане информация на нови потребители на тази е-поща'; -$lang['mailfrom'] = 'Адрес на е-поща, който да се използва за пращане на автоматичната поща'; -$lang['gzip_output'] = 'Използване gzip Кодиране на съдържанието(Content-Encoding) за xhtml'; +$lang['locktime'] = 'Максимална възраст на заключените файлове (сек)'; +$lang['fetchsize'] = 'Максимален размер (байтове), който fetch.php може да сваля'; +$lang['notify'] = 'Пращане на съобщения за промени на тази eл. поща'; +$lang['registernotify'] = 'Пращане информация за нови потребители на тази ел. поща'; +$lang['mailfrom'] = 'Ел. поща, която да се ползва за автоматично изпращане на ел. писма'; +$lang['gzip_output'] = 'Кодиране на съдържанието с gzip за xhtml'; $lang['gdlib'] = 'Версия на GD Lib'; $lang['im_convert'] = 'Път до инструмента за трансформация на ImageMagick'; $lang['jpg_quality'] = 'Kачество на JPG компресията (0-100)'; -$lang['subscribers'] = 'Поддръжка за абониране към страница'; -$lang['compress'] = 'Компактен CSS и javascript изход'; -$lang['hidepages'] = 'Скриване на съвпадащи имена на страници(regular expressions)'; +$lang['subscribers'] = 'Включване на поддръжката за абониране към страници'; +$lang['compress'] = 'Компактен CSS и javascript изглед'; +$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&task_id=852">Грешка 852</a> за повече информация.'; -$lang['xsendfile'] = 'Използване на Х-Sendfile header, за позволяване на уеб сървъра да дава статични файлове? Вашият уеб сървър трябва да поддържа това.'; +$lang['broken_iua'] = 'Отметнете, ако ignore_user_abort функцията не работи. Може да попречи на търсенето в страниците. Знае се, че комбинацията IIS+PHP/CGI е лоша. Вижте <a href="http://bugs.splitbrain.org/?do=details&task_id=852">Грешка 852</a> за повече информация.'; +$lang['xsendfile'] = 'Ползване на Х-Sendfile header, за да може уебсървъра да дава статични файлове? Вашият уебсървър трябва да го поддържа.'; $lang['renderer_xhtml'] = 'Показвай main (XHTML) код за wiki'; $lang['renderer__core'] = '%s (DokuWiki ядро)'; $lang['renderer__plugin'] = '%s (приставка)'; -$lang['rememberme'] = 'Остави постоянни бисквитки за вход (запомни ме)'; -$lang['rss_type'] = 'Вид на XML източника (feed)'; +$lang['rememberme'] = 'Ползване на постоянни бисквитки за вписване (запомни ме)'; +$lang['rss_type'] = 'Тип на XML feed'; $lang['rss_linkto'] = 'XML feed препраща към'; $lang['rss_content'] = 'Какво да се показва в XML feed елементите?'; $lang['rss_update'] = 'Интервал на обновяване XML източника (сек)'; $lang['recent_days'] = 'Колко последни промени да се пазят (дни)'; $lang['rss_show_summary'] = 'XML feed show summary in title'; $lang['target____wiki'] = 'Прозорец за вътрешни препратки'; -$lang['target____interwiki'] = 'Прозорец за вътрешни уики препратки'; +$lang['target____interwiki'] = 'Прозорец за вътреуики препратки'; $lang['target____extern'] = 'Прозорец за външни препратки'; -$lang['target____media'] = 'Прозорец за препратки към медия'; -$lang['target____windows'] = 'Прозорец за препратки към прозорци'; +$lang['target____media'] = 'Прозорец за медийни препратки'; +$lang['target____windows'] = 'Прозорец за Windows препратки'; $lang['proxy____host'] = 'Име на прокси сървър'; $lang['proxy____port'] = 'Порт на проксито'; $lang['proxy____user'] = 'Потребител за проксито'; $lang['proxy____pass'] = 'Парола за проксито'; -$lang['proxy____ssl'] = 'Използване на ssl за връзка към проксито'; -$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['proxy____ssl'] = 'Ползване на SSL за връзката с проксито'; +$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_'] = 'Нищо не е избрано'; $lang['typography_o_0'] = 'без'; $lang['typography_o_1'] = 'с изключение на единични кавички'; -$lang['typography_o_2'] = 'всякаква форма за кавичките (не винаги работи)'; +$lang['typography_o_2'] = 'включително единични кавички (не винаги работи)'; $lang['userewrite_o_0'] = 'без'; -$lang['userewrite_o_1'] = '.htaccess файл'; +$lang['userewrite_o_1'] = '.htaccess файлa'; $lang['userewrite_o_2'] = 'вътрешно от DokuWiki '; $lang['deaccent_o_0'] = 'изключено'; $lang['deaccent_o_1'] = 'премахване на акценти'; @@ -163,7 +165,7 @@ $lang['rss_content_o_htmldiff'] = 'Diff таблица в 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_rev'] = 'списък на версииte'; $lang['rss_linkto_o_current'] = 'текущата страница'; $lang['compression_o_0'] = 'без'; $lang['compression_o_gz'] = 'gzip'; @@ -174,9 +176,9 @@ $lang['xsendfile_o_2'] = 'Стандартен X-Sendfile header'; $lang['xsendfile_o_3'] = 'Специфичен Nginx X-Accel-Redirect header за пренасочване'; $lang['showuseras_o_loginname'] = 'Потребителско име'; $lang['showuseras_o_username'] = 'Пълно потребителско име'; -$lang['showuseras_o_email'] = 'Пълен адрес на електронната поща на потребителя'; -$lang['showuseras_o_email_link'] = 'Адрес на електронната поща на потребителя под формата на mailto: линк'; +$lang['showuseras_o_email'] = 'Адресите на ел, поща на потребителите (променени според настройките на mailguard)'; +$lang['showuseras_o_email_link'] = 'Адресите на ел. поща на потребителите под формата на mailto: връзка'; $lang['useheading_o_0'] = 'Никога'; $lang['useheading_o_navigation'] = 'Само за навигация'; -$lang['useheading_o_content'] = 'Само за Wiki съдържание'; +$lang['useheading_o_content'] = 'Само за съдържанието на Wiki-то'; $lang['useheading_o_1'] = 'Винаги'; diff --git a/lib/plugins/config/lang/el/lang.php b/lib/plugins/config/lang/el/lang.php index df9029506..ebd676886 100644 --- a/lib/plugins/config/lang/el/lang.php +++ b/lib/plugins/config/lang/el/lang.php @@ -108,6 +108,7 @@ $lang['fetchsize'] = 'Μέγιστο μέγεθος (σε bytes) ε $lang['notify'] = 'Αποστολή ενημέρωσης για αλλαγές σε αυτή την e-mail διεύθυνση'; $lang['registernotify'] = 'Αποστολή ενημερωτικών μηνυμάτων σε αυτή την e-mail διεύθυνση κατά την εγγραφή νέων χρηστών'; $lang['mailfrom'] = 'e-mail διεύθυνση αποστολέα για μηνύματα από την εφαρμογή'; +$lang['mailprefix'] = 'Πρόθεμα θέματος που να χρησιμοποιείται για τα αυτόματα μηνύματα ηλεκτρονικού ταχυδρομείου.'; $lang['gzip_output'] = 'Χρήση gzip Content-Encoding για την xhtml'; $lang['gdlib'] = 'Έκδοση βιβλιοθήκης GD'; $lang['im_convert'] = 'Διαδρομή προς το εργαλείο μετατροπής εικόνων του ImageMagick'; diff --git a/lib/plugins/config/lang/fr/lang.php b/lib/plugins/config/lang/fr/lang.php index 7f3e39845..99e140af5 100644 --- a/lib/plugins/config/lang/fr/lang.php +++ b/lib/plugins/config/lang/fr/lang.php @@ -15,6 +15,7 @@ * @author Philippe Bajoit <philippe.bajoit@gmail.com> * @author Florian Gaub <floriang@floriang.net> * @author Samuel Dorsaz samuel.dorsaz@novelion.net + * @author Johan Guilbaud <guilbaud.johan@gmail.com> */ $lang['menu'] = 'Paramètres de configuration'; $lang['error'] = 'Paramètres non modifiés en raison d\'une valeur non valide, vérifiez vos réglages et réessayez. <br />Les valeurs erronées sont entourées d\'une bordure rouge.'; @@ -111,6 +112,7 @@ $lang['fetchsize'] = 'Taille maximale (en octets) du fichier que fet $lang['notify'] = 'Notifier les modifications à cette adresse de courriel'; $lang['registernotify'] = 'Envoyer un courriel annonçant les nouveaux utilisateurs enregistrés à cette adresse'; $lang['mailfrom'] = 'Expéditeur des notifications par courriel du wiki'; +$lang['mailprefix'] = 'Préfixe à utiliser dans les objets des courriels automatiques'; $lang['gzip_output'] = 'Utiliser Content-Encoding gzip pour XHTML'; $lang['gdlib'] = 'Version de GD Lib'; $lang['im_convert'] = 'Chemin vers l\'outil de conversion d\'ImageMagick'; diff --git a/lib/plugins/config/lang/pt/lang.php b/lib/plugins/config/lang/pt/lang.php index 336de5b36..c0ada0a26 100644 --- a/lib/plugins/config/lang/pt/lang.php +++ b/lib/plugins/config/lang/pt/lang.php @@ -103,6 +103,7 @@ $lang['fetchsize'] = 'Tamanho máximo (bytes) que o fetch.php pode t $lang['notify'] = 'Enviar notificações de mudanças para este endereço de email'; $lang['registernotify'] = 'Enviar informações de utilizadores registados para este endereço de email'; $lang['mailfrom'] = 'Endereço de email a ser utilizado para mensagens automáticas'; +$lang['mailprefix'] = 'Prefixo de email a ser utilizado para mensagens automáticas'; $lang['gzip_output'] = 'Usar "Content-Encoding" do gzip para o código xhtml'; $lang['gdlib'] = 'Versão GD Lib'; $lang['im_convert'] = 'Caminho para a ferramenta "convert" do ImageMagick'; diff --git a/lib/plugins/plugin/classes/ap_download.class.php b/lib/plugins/plugin/classes/ap_download.class.php index beba0ab07..784095aaf 100644 --- a/lib/plugins/plugin/classes/ap_download.class.php +++ b/lib/plugins/plugin/classes/ap_download.class.php @@ -1,7 +1,7 @@ <?php class ap_download extends ap_manage { - var $overwrite = false; + var $overwrite = true; /** * Initiate the plugin download diff --git a/lib/plugins/plugin/classes/ap_manage.class.php b/lib/plugins/plugin/classes/ap_manage.class.php index 2982a3ebb..fb148f263 100644 --- a/lib/plugins/plugin/classes/ap_manage.class.php +++ b/lib/plugins/plugin/classes/ap_manage.class.php @@ -176,7 +176,7 @@ class ap_manage { function dir_delete($path) { if (!is_string($path) || $path == "") return false; - if (is_dir($path)) { + if (is_dir($path) && !is_link($path)) { if (!$dh = @opendir($path)) return false; while ($f = readdir($dh)) { diff --git a/lib/plugins/plugin/lang/bg/lang.php b/lib/plugins/plugin/lang/bg/lang.php index 99e7a2fe4..b4aaae5e4 100644 --- a/lib/plugins/plugin/lang/bg/lang.php +++ b/lib/plugins/plugin/lang/bg/lang.php @@ -5,6 +5,7 @@ * @license GPL 2 (http://www.gnu.org/licenses/gpl.html) * @author Nikolay Vladimirov <nikolay@vladimiroff.com> * @author Viktor Usunov <usun0v@mail.bg> + * @author Kiril Velikov neohidra@gmail.com */ $lang['menu'] = 'Управление на приставките'; $lang['download'] = 'Сваляне и инсталиране на нова приставка'; diff --git a/lib/plugins/plugin/lang/fr/lang.php b/lib/plugins/plugin/lang/fr/lang.php index 79080f5f3..5daf3b3ad 100644 --- a/lib/plugins/plugin/lang/fr/lang.php +++ b/lib/plugins/plugin/lang/fr/lang.php @@ -15,6 +15,7 @@ * @author Philippe Bajoit <philippe.bajoit@gmail.com> * @author Florian Gaub <floriang@floriang.net> * @author Samuel Dorsaz samuel.dorsaz@novelion.net + * @author Johan Guilbaud <guilbaud.johan@gmail.com> */ $lang['menu'] = 'Gestion des modules externes'; $lang['download'] = 'Télécharger et installer un nouveau module'; diff --git a/lib/plugins/popularity/lang/bg/intro.txt b/lib/plugins/popularity/lang/bg/intro.txt index 06c338585..aa437f32c 100644 --- a/lib/plugins/popularity/lang/bg/intro.txt +++ b/lib/plugins/popularity/lang/bg/intro.txt @@ -1,9 +1,9 @@ -====== Обратна връзка за популярност ====== +====== Обратна връзка ====== -Този инструмент събира данни за потребителите на Вашето Wiki и ви позволява да ги изпратите анонимно на DokuWiki. Това ни помага да разберем как DokuWiki се използва от потребителите си и да разработваме бъдещи решения, съответно реалното използване. +Инструментът събира данни за Вашето Wiki и ви позволява да ги изпратите на разработчиците DokuWiki. Данните ще им помогнат да разберат как DokuWiki се използва от потребителите и че статистиката е в подкрепа на поетата насока за развитие. -Моля изпозвайте тази опция, за да информирате разработчиците на този продукт. Вашите данни ще бъдат идентифицирани с анонимен номер. +Моля, ползвайте функцията, от време на време, когато уебстраницата ви се разраства, за да информирате разработчиците. Изпратените данни ще бъдат идентифицирани с анонимен номер. -Събраните данни съдържат информация за вашата версия на DokuWiki, броя и размера на вашите страници и файлове, инсталирани плъгини и информация за вашата PHP инсталация. +Събраните данни съдържат информация за версия на DokuWiki, броя и размера на вашите страници и файлове, инсталирани приставки и информация за вашата PHP инсталация. -Изходните данни са показано по-долу във вида, в който ще бъдат изпратени. Моля ползвайте сьответния бутон, за да изпратите тази информация.
\ No newline at end of file +Данните, които ще бъдат изпратени са изобразени по-долу. Моля, натиснете бутона "Изпращане на данните", за да изпратите информацията.
\ No newline at end of file diff --git a/lib/plugins/popularity/lang/bg/lang.php b/lib/plugins/popularity/lang/bg/lang.php index adf99a9f5..5c89c3509 100644 --- a/lib/plugins/popularity/lang/bg/lang.php +++ b/lib/plugins/popularity/lang/bg/lang.php @@ -3,6 +3,12 @@ * Bulgarian language file * * @author Viktor Usunov <usun0v@mail.bg> + * @author Kiril Velikov neohidra@gmail.com */ -$lang['name'] = 'Обратна връзка за популярност (може да отнеме известно време за зареждане)'; -$lang['submit'] = 'Прати данните'; +$lang['name'] = 'Обратна връзка (зареждането може да отнеме известно време)'; +$lang['submit'] = 'Изпращане на данните'; +$lang['autosubmit'] = 'Автоматично изпращане на данните веднъж в месеца'; +$lang['submissionFailed'] = 'Данните не могат да бъдат изпратени поради следната грешка"'; +$lang['submitDirectly'] = 'Можете да пратите данните ръчно като изпратите следния формуляр.'; +$lang['autosubmitError'] = 'Последното автоматично изпращане не бе осъществено, поради следната грешка:'; +$lang['lastSent'] = 'Данните бяха изпратени'; diff --git a/lib/plugins/popularity/lang/bg/submitted.txt b/lib/plugins/popularity/lang/bg/submitted.txt new file mode 100644 index 000000000..1e95f6ffd --- /dev/null +++ b/lib/plugins/popularity/lang/bg/submitted.txt @@ -0,0 +1,3 @@ +====== Обратна връзка ====== + +Данните бяха изпратени успешно.
\ No newline at end of file diff --git a/lib/plugins/popularity/lang/el/lang.php b/lib/plugins/popularity/lang/el/lang.php index 0d16bbf86..41704fa06 100644 --- a/lib/plugins/popularity/lang/el/lang.php +++ b/lib/plugins/popularity/lang/el/lang.php @@ -7,3 +7,8 @@ */ $lang['name'] = 'Αναφορά Δημοτικότητας (ίσως αργήσει λίγο να εμφανιστεί)'; $lang['submit'] = 'Αποστολή Δεδομένων'; +$lang['autosubmit'] = 'Να αποστέλονται τα δεδομένα αυτόματα μια φορά το μήνα.'; +$lang['submissionFailed'] = 'Τα δεδομένα δεν ήταν δυνατό να αποσταλλούν λόγω του παρακάτω σφάλματος:'; +$lang['submitDirectly'] = 'Μπορείτε να αποστείλλετε τα δεδομένα χειροκίνητα με την υποβολή της παρακάτω φόρμας.'; +$lang['autosubmitError'] = 'Η τελευταία αυτόματη υποβολή των δεδομένων απέτυχε με το παρακάτω μήνυμα σφάλματος:'; +$lang['lastSent'] = 'Τα δεδομένα έχουν σταλεί.'; diff --git a/lib/plugins/popularity/lang/el/submitted.txt b/lib/plugins/popularity/lang/el/submitted.txt new file mode 100644 index 000000000..8004f9997 --- /dev/null +++ b/lib/plugins/popularity/lang/el/submitted.txt @@ -0,0 +1,3 @@ +====== Αποτέλεσμα Υποβολής Δημοσιότητας ====== + +Τα δεδομένα στάλθηκαν επιτυχώς.
\ No newline at end of file diff --git a/lib/plugins/popularity/lang/fr/lang.php b/lib/plugins/popularity/lang/fr/lang.php index 1157d1fa6..9aaf3c7d2 100644 --- a/lib/plugins/popularity/lang/fr/lang.php +++ b/lib/plugins/popularity/lang/fr/lang.php @@ -12,6 +12,7 @@ * @author Philippe Bajoit <philippe.bajoit@gmail.com> * @author Florian Gaub <floriang@floriang.net> * @author Samuel Dorsaz samuel.dorsaz@novelion.net + * @author Johan Guilbaud <guilbaud.johan@gmail.com> */ $lang['name'] = 'Enquête de popularité (peut nécessiter un certain temps pour être chargée)'; $lang['submit'] = 'Envoyer les données'; diff --git a/lib/plugins/popularity/lang/pt/lang.php b/lib/plugins/popularity/lang/pt/lang.php index da92ee729..35fac0fc0 100644 --- a/lib/plugins/popularity/lang/pt/lang.php +++ b/lib/plugins/popularity/lang/pt/lang.php @@ -8,3 +8,7 @@ */ $lang['name'] = 'Retorno (feedback) de Popularidade (pode levar algum tempo a carregar)'; $lang['submit'] = 'Enviar Dados'; +$lang['autosubmit'] = 'Enviar dados automáticamente uma vez por mês'; +$lang['submissionFailed'] = 'Os dados não foram enviados devido ao seguinte erro:'; +$lang['submitDirectly'] = 'Pode enviar os dados manualmente, submetendo o seguinte formulário.'; +$lang['lastSent'] = 'Os dados foram enviados'; diff --git a/lib/plugins/popularity/lang/pt/submitted.txt b/lib/plugins/popularity/lang/pt/submitted.txt new file mode 100644 index 000000000..d2bb2b7ae --- /dev/null +++ b/lib/plugins/popularity/lang/pt/submitted.txt @@ -0,0 +1,3 @@ +====== Retorno de Popularidade ====== + +Os dados foram enviados com sucesso.
\ No newline at end of file diff --git a/lib/plugins/revert/lang/bg/lang.php b/lib/plugins/revert/lang/bg/lang.php index 6f0ff0672..05525c535 100644 --- a/lib/plugins/revert/lang/bg/lang.php +++ b/lib/plugins/revert/lang/bg/lang.php @@ -3,6 +3,7 @@ * bulgarian language file * @author Nikolay Vladimirov <nikolay@vladimiroff.com> * @author Viktor Usunov <usun0v@mail.bg> + * @author Kiril Velikov neohidra@gmail.com */ $lang['menu'] = 'Възстановяване'; $lang['filter'] = 'Търсене на спамната страници'; diff --git a/lib/plugins/revert/lang/fr/lang.php b/lib/plugins/revert/lang/fr/lang.php index d80ece209..d6dc3ee3d 100644 --- a/lib/plugins/revert/lang/fr/lang.php +++ b/lib/plugins/revert/lang/fr/lang.php @@ -13,6 +13,7 @@ * @author Philippe Bajoit <philippe.bajoit@gmail.com> * @author Florian Gaub <floriang@floriang.net> * @author Samuel Dorsaz samuel.dorsaz@novelion.net + * @author Johan Guilbaud <guilbaud.johan@gmail.com> */ $lang['menu'] = 'Gestionnaire de réversions'; $lang['filter'] = 'Trouver les pages spammées '; diff --git a/lib/plugins/usermanager/admin.php b/lib/plugins/usermanager/admin.php index df13f65e3..e40ee9b7e 100644 --- a/lib/plugins/usermanager/admin.php +++ b/lib/plugins/usermanager/admin.php @@ -562,16 +562,19 @@ class admin_plugin_usermanager extends DokuWiki_Admin_Plugin { * @return array(user, password, full name, email, array(groups)) */ function _retrieveUser($clean=true) { + global $auth; - $user[0] = ($clean) ? cleanID(preg_replace('/.*:/','',$_REQUEST['userid'])) : $_REQUEST['userid']; + $user[0] = ($clean) ? $auth->cleanUser($_REQUEST['userid']) : $_REQUEST['userid']; $user[1] = $_REQUEST['userpass']; $user[2] = $_REQUEST['username']; $user[3] = $_REQUEST['usermail']; - $user[4] = preg_split('/\s*,\s*/',$_REQUEST['usergroups'],-1,PREG_SPLIT_NO_EMPTY); + $user[4] = explode(',',$_REQUEST['usergroups']); - if (empty($user[4]) || (is_array($user[4]) && (count($user[4]) == 1) && (trim($user[4][0]) == ''))) { - $user[4] = null; - } + $user[4] = array_map('trim',$user[4]); + if($clean) $user[4] = array_map(array($auth,'cleanGroup'),$user[4]); + $user[4] = array_filter($user[4]); + $user[4] = array_unique($user[4]); + if(!count($user[4])) $user[4] = null; return $user; } diff --git a/lib/plugins/usermanager/lang/bg/lang.php b/lib/plugins/usermanager/lang/bg/lang.php index 58c8453f2..b229ce29e 100644 --- a/lib/plugins/usermanager/lang/bg/lang.php +++ b/lib/plugins/usermanager/lang/bg/lang.php @@ -4,6 +4,7 @@ * * @author Nikolay Vladimirov <nikolay@vladimiroff.com> * @author Viktor Usunov <usun0v@mail.bg> + * @author Kiril Velikov neohidra@gmail.com */ $lang['menu'] = 'Управление на потребителите'; $lang['noauth'] = '(идентифицирането на потребителите е недостъпно)'; @@ -33,15 +34,15 @@ $lang['delete_fail'] = '%d не бяха изтрити'; $lang['update_ok'] = 'Обновяването на потребителя бе успешно'; $lang['update_fail'] = 'Обновяването на потребителя бе неуспешно'; $lang['update_exists'] = 'Смяната на потребителското име бе невъзможна, оказаното потребителско име (%s) вече съществува (всякакви други промени ще бъдат приложени).'; -$lang['start'] = 'начало'; -$lang['prev'] = 'предишно'; -$lang['next'] = 'следващо'; -$lang['last'] = 'последно'; +$lang['start'] = 'първи'; +$lang['prev'] = 'назад'; +$lang['next'] = 'напред'; +$lang['last'] = 'последен'; $lang['edit_usermissing'] = 'Избраният потребител не бе намерен, оказаното потребителско име може да е изтрито или променено другаде.'; -$lang['user_notify'] = 'Осведомяване на потребителя'; -$lang['note_notify'] = 'Осведомителната e-поща се праща само, ако на потребителя е дадена нова парола.'; -$lang['note_group'] = 'Новите потребители ще бъдат добавяни към групата (%s) ако не бъде посочена друга.'; -$lang['note_pass'] = 'Паролата ще бъде генерирана автоматично, ако полето е оставено празно и функцията за уведомяване на потребителя е включена.'; +$lang['user_notify'] = 'Уведомяване на потребителя'; +$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/fr/lang.php b/lib/plugins/usermanager/lang/fr/lang.php index 92bc127ed..49baf9d51 100644 --- a/lib/plugins/usermanager/lang/fr/lang.php +++ b/lib/plugins/usermanager/lang/fr/lang.php @@ -14,6 +14,7 @@ * @author Philippe Bajoit <philippe.bajoit@gmail.com> * @author Florian Gaub <floriang@floriang.net> * @author Samuel Dorsaz samuel.dorsaz@novelion.net + * @author Johan Guilbaud <guilbaud.johan@gmail.com> */ $lang['menu'] = 'Gestion des utilisateurs'; $lang['noauth'] = '(authentification utilisateur non disponible)'; diff --git a/lib/scripts/edit.js b/lib/scripts/edit.js index 01262bcef..45c1fb111 100644 --- a/lib/scripts/edit.js +++ b/lib/scripts/edit.js @@ -268,6 +268,7 @@ var textChanged = false; */ function deleteDraft() { if (is_opera) return; + if (window.keepDraft) return; // remove a possibly saved draft using ajax var dwform = $('dw__editform'); @@ -318,8 +319,13 @@ addInitEvent(function (){ window.onunload = deleteDraft; // reset change memory var on submit - addEvent($('edbtn__save'), 'click', function(){ textChanged = false; }); - addEvent($('edbtn__preview'), 'click', function(){ textChanged = false; }); + addEvent($('edbtn__save'), 'click', function(){ + textChanged = false; + }); + addEvent($('edbtn__preview'), 'click', function(){ + textChanged = false; + window.keepDraft = true; // needed to keep draft on page unload + }); var summary = $('edit__summary'); addEvent(summary, 'change', summaryCheck); @@ -341,104 +347,3 @@ function summaryCheck(){ } } - -/** - * Class managing the timer to display a warning on a expiring lock - */ -function locktimer_class(){ - this.sack = null; - this.timeout = 0; - this.timerID = null; - this.lasttime = null; - this.msg = ''; - this.pageid = ''; -}; -var locktimer = new locktimer_class(); - locktimer.init = function(timeout,msg,draft){ - // init values - locktimer.timeout = timeout*1000; - locktimer.msg = msg; - locktimer.draft = draft; - locktimer.lasttime = new Date(); - - if(!$('dw__editform')) return; - locktimer.pageid = $('dw__editform').elements.id.value; - if(!locktimer.pageid) return; - - // init ajax component - locktimer.sack = new sack(DOKU_BASE + 'lib/exe/ajax.php'); - locktimer.sack.AjaxFailedAlert = ''; - locktimer.sack.encodeURIString = false; - locktimer.sack.onCompletion = locktimer.refreshed; - - // register refresh event - addEvent($('dw__editform'),'keypress',function(){locktimer.refresh();}); - // start timer - locktimer.reset(); - }; - - /** - * (Re)start the warning timer - */ - locktimer.reset = function(){ - locktimer.clear(); - locktimer.timerID = window.setTimeout("locktimer.warning()", locktimer.timeout); - }; - - /** - * Display the warning about the expiring lock - */ - locktimer.warning = function(){ - locktimer.clear(); - alert(locktimer.msg); - }; - - /** - * Remove the current warning timer - */ - locktimer.clear = function(){ - if(locktimer.timerID !== null){ - window.clearTimeout(locktimer.timerID); - locktimer.timerID = null; - } - }; - - /** - * Refresh the lock via AJAX - * - * Called on keypresses in the edit area - */ - locktimer.refresh = function(){ - var now = new Date(); - // refresh every minute only - if(now.getTime() - locktimer.lasttime.getTime() > 30*1000){ //FIXME decide on time - var params = 'call=lock&id='+encodeURIComponent(locktimer.pageid); - var dwform = $('dw__editform'); - if(locktimer.draft && dwform.elements.wikitext){ - params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value); - params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value); - params += '&suffix='+encodeURIComponent(dwform.elements.suffix.value); - if(dwform.elements.date){ - params += '&date='+encodeURIComponent(dwform.elements.date.value); - } - } - locktimer.sack.runAJAX(params); - locktimer.lasttime = now; - } - }; - - - /** - * Callback. Resets the warning timer - */ - locktimer.refreshed = function(){ - var data = this.response; - var error = data.charAt(0); - data = data.substring(1); - - $('draft__status').innerHTML=data; - if(error != '1') return; // locking failed - locktimer.reset(); - }; -// end of locktimer class functions - diff --git a/lib/scripts/locktimer.js b/lib/scripts/locktimer.js new file mode 100644 index 000000000..51d533056 --- /dev/null +++ b/lib/scripts/locktimer.js @@ -0,0 +1,99 @@ +/** + * Class managing the timer to display a warning on a expiring lock + */ +var locktimer = { + sack: null, + timeout: 0, + timerID: null, + lasttime: null, + msg: '', + pageid: '', + + init: function(timeout,msg,draft){ + // init values + locktimer.timeout = timeout*1000; + locktimer.msg = msg; + locktimer.draft = draft; + locktimer.lasttime = new Date(); + + if(!$('dw__editform')) return; + locktimer.pageid = $('dw__editform').elements.id.value; + if(!locktimer.pageid) return; + if($('wiki__text').readOnly) return; + + // init ajax component + locktimer.sack = new sack(DOKU_BASE + 'lib/exe/ajax.php'); + locktimer.sack.AjaxFailedAlert = ''; + locktimer.sack.encodeURIString = false; + locktimer.sack.onCompletion = locktimer.refreshed; + + // register refresh event + addEvent($('dw__editform'),'keypress',function(){locktimer.refresh();}); + // start timer + locktimer.reset(); + }, + + /** + * (Re)start the warning timer + */ + reset: function(){ + locktimer.clear(); + locktimer.timerID = window.setTimeout("locktimer.warning()", locktimer.timeout); + }, + + /** + * Display the warning about the expiring lock + */ + warning: function(){ + locktimer.clear(); + alert(locktimer.msg); + }, + + /** + * Remove the current warning timer + */ + clear: function(){ + if(locktimer.timerID !== null){ + window.clearTimeout(locktimer.timerID); + locktimer.timerID = null; + } + }, + + /** + * Refresh the lock via AJAX + * + * Called on keypresses in the edit area + */ + refresh: function(){ + var now = new Date(); + // refresh every minute only + if(now.getTime() - locktimer.lasttime.getTime() > 30*1000){ + var params = 'call=lock&id='+encodeURIComponent(locktimer.pageid); + var dwform = $('dw__editform'); + if(locktimer.draft && dwform.elements.wikitext){ + params += '&prefix='+encodeURIComponent(dwform.elements.prefix.value); + params += '&wikitext='+encodeURIComponent(dwform.elements.wikitext.value); + params += '&suffix='+encodeURIComponent(dwform.elements.suffix.value); + if(dwform.elements.date){ + params += '&date='+encodeURIComponent(dwform.elements.date.value); + } + } + locktimer.sack.runAJAX(params); + locktimer.lasttime = now; + } + }, + + /** + * Callback. Resets the warning timer + */ + refreshed: function(){ + var data = this.response; + var error = data.charAt(0); + data = data.substring(1); + + $('draft__status').innerHTML=data; + if(error != '1') return; // locking failed + locktimer.reset(); + }, +}; + diff --git a/lib/scripts/script.js b/lib/scripts/script.js index c79c9b683..b9b324f96 100644 --- a/lib/scripts/script.js +++ b/lib/scripts/script.js @@ -460,19 +460,29 @@ addInitEvent(function(){ }); /** - * Add the event handler to the actiondropdown + * Autosubmit quick select forms + * + * When a <select> tag has the class "quickselect", this script will + * automatically submit its parent form when the select value changes. + * It also hides the submit button of the form. * * @author Andreas Gohr <andi@splitbrain.org> */ addInitEvent(function(){ - var selector = $('action__selector'); - if(!selector) return; - - addEvent(selector,'change',function(e){ - this.form.submit(); - }); - - $('action__selectorbtn').style.display = 'none'; + var selects = getElementsByClass('quickselect',document,'select'); + for(var i=0; i<selects.length; i++){ + // auto submit on change + addEvent(selects[i],'change',function(e){ + this.form.submit(); + }); + // hide submit buttons + var btns = selects[i].form.getElementsByTagName('input'); + for(var j=0; j<btns.length; j++){ + if(btns[j].type == 'submit'){ + btns[j].style.display = 'none'; + } + } + } }); /** diff --git a/lib/tpl/default/design.css b/lib/tpl/default/design.css index 09a9ecf01..1fdf2bfac 100644 --- a/lib/tpl/default/design.css +++ b/lib/tpl/default/design.css @@ -85,8 +85,10 @@ div.dokuwiki fieldset { } div.dokuwiki textarea.edit { - font-family: monospace; - font-size: 14px; + font-family: monospace, serif; + /* second generic font fixes problem with font-size, see + http://meyerweb.com/eric/thoughts/2010/02/12/fixed-monospace-sizing/ */ + font-size: 100%; color: __text__; background-color: __background__; border: 1px solid __border__; @@ -464,9 +466,14 @@ div.dokuwiki blockquote { padding-left: 3px; } +div.dokuwiki pre, +div.dokuwiki code { + font-family: monospace, serif; + /* second generic font fixes problem with font-size, see + http://meyerweb.com/eric/thoughts/2010/02/12/fixed-monospace-sizing/ */ + font-size: 100%; +} div.dokuwiki pre { - font-family: monospace; - font-size: 120%; padding: 0.5em; border: 1px dashed __border__; color: __text__; @@ -519,11 +526,6 @@ div.dokuwiki dl.file dt { } -/* inline code words */ -div.dokuwiki code { - font-size: 120%; -} - /* inline tables */ div.dokuwiki table.inline { background-color: __background__; @@ -652,10 +654,12 @@ div.dokuwiki table.diff td { font-family: monospace; font-size: 100%; } -div.dokuwiki td.diff-addedline { +div.dokuwiki td.diff-addedline, +div.dokuwiki span.diff-addedline { background-color: #ddffdd; } -div.dokuwiki td.diff-deletedline { +div.dokuwiki td.diff-deletedline, +div.dokuwiki span.diff-deletedline { background-color: #ffffbb; } div.dokuwiki td.diff-context { |