Merge branch 'master' into future

* master: (162 commits)
  fixed revision JS for images
  upgraded SimplePie to 1.3.1 FS#2708
  removed obsolete browser plugin (migrate does it)
  adjust spacing to match standard 1.4em grid
  added comment on use of whitelist vs blacklist
  Updated idfilter() function for IIS
  use var and remove suggestions when needed Use variable for maximum number of suggestions for quicksearch. And hide suggestions when search field is emptied, or when no suggestion are found.
  added 'home' class to first link in hierarchical breadcrumbs
  reduced required max width to go into tablet mode
  re-added linear gradients for firefox
  added missing styling for disabled form elements (FS#2705)
  fixed acronyms in italics (FS#2684)
  improved print styles (includes fixes for FS#2645 and FS#2707)
  basic styles improvements
  Greek language update
  Use list in acl help text, for more structure
  Galician language update
  touch the config on save, even if no changes were made
  unwind the width narrowing commit
  put some whitespace between form submit button and fieldset bottom border
  ...

Conflicts:
	lib/plugins/config/admin.php
	lib/plugins/config/settings/config.class.php
This commit is contained in:
Andreas Gohr 2013-02-03 22:57:45 +01:00
commit 3da7921f08
300 changed files with 28632 additions and 20894 deletions

4
.gitignore vendored
View File

@ -16,6 +16,7 @@
*~
*.DS_Store
*.iml
.idea/
/data/attic/*
/data/cache/*
/data/index/*
@ -25,6 +26,9 @@
/data/media_attic/*
/data/meta/*
/data/pages/*
!/data/pages/wiki/dokuwiki.txt
!/data/pages/wiki/syntax.txt
!/data/pages/wiki/welcome.txt
/data/tmp/*
/lib/tpl/*
!/lib/tpl/default

2
README
View File

@ -4,7 +4,7 @@ at http://www.dokuwiki.org/
For Installation Instructions see
http://www.dokuwiki.org/install
DokuWiki - 2004-2012 (c) Andreas Gohr <andi@splitbrain.org>
DokuWiki - 2004-2013 (c) Andreas Gohr <andi@splitbrain.org>
and the DokuWiki Community
See COPYING and file headers for license info

View File

@ -30,6 +30,8 @@ abstract class DokuWikiTest extends PHPUnit_Framework_TestCase {
// remove any leftovers from the last run
if(is_dir(DOKU_TMP_DATA)){
// clear indexer data and cache
idx_get_indexer()->clear();
TestUtils::rdelete(DOKU_TMP_DATA);
}

View File

@ -10,6 +10,9 @@
<testsuite name="Plugin Tests">
<directory suffix=".test.php">../lib/plugins/*/_test</directory>
</testsuite>
<testsuite name="Template Tests">
<directory suffix=".test.php">../lib/tpl/*/_test</directory>
</testsuite>
</testsuites>
<filter>
@ -19,6 +22,7 @@
<directory suffix=".php">../_cs/</directory>
<directory suffix=".php">../_test/</directory>
<directory suffix=".php">../lib/plugins/*/_test/</directory>
<directory suffix=".php">../lib/tpl/*/_test/</directory>
</exclude>
</whitelist>
</filter>

View File

@ -2,22 +2,18 @@
class auth_acl_test extends DokuWikiTest {
var $oldConf;
var $oldAuthAcl;
function setup() {
global $conf;
function setUp() {
parent::setUp();
global $AUTH_ACL;
global $auth;
$this->oldConf = $conf;
$this->oldAuthAcl = $AUTH_ACL;
$auth = new DokuWiki_Auth_Plugin();
}
function teardown() {
global $conf;
function tearDown() {
global $AUTH_ACL;
$conf = $this->oldConf;
$AUTH_ACL = $this->oldAuthAcl;
}

View File

@ -0,0 +1,128 @@
<?php
class auth_acl_caseinsensitive_auth extends auth_basic {
function isCaseSensitive() {
return false;
}
}
class auth_acl_caseinsensitive_test extends DokuWikiTest {
protected $oldAuth;
protected $oldAuthAcl;
function setUp() {
parent::setUp();
global $auth;
global $AUTH_ACL;
$this->oldAuth = $auth;
$this->oldAuthAcl = $AUTH_ACL;
$auth = new auth_acl_caseinsensitive_auth();
}
function tearDown() {
global $conf;
global $AUTH_ACL;
global $auth;
$auth = $this->oldAuth;
$AUTH_ACL = $this->oldAuthAcl;
}
function test_multiadmin_restricted_ropage() {
global $conf;
global $AUTH_ACL;
$conf['superuser'] = 'John,doe,@Admin1,@admin2';
$conf['useacl'] = 1;
$AUTH_ACL = array(
'* @ALL 0',
'* @Group1 8',
'* @group2 8',
'namespace:page @Group1 1',
'namespace:page @group2 1',
);
// anonymous user
$this->assertEquals(auth_aclcheck('page', '', array()), AUTH_NONE);
$this->assertEquals(auth_aclcheck('namespace:page', '', array()), AUTH_NONE);
$this->assertEquals(auth_aclcheck('namespace:*', '', array()), AUTH_NONE);
// user with no matching group
$this->assertEquals(auth_aclcheck('page', 'jill', array('foo')), AUTH_NONE);
$this->assertEquals(auth_aclcheck('namespace:page', 'jill', array('foo')), AUTH_NONE);
$this->assertEquals(auth_aclcheck('namespace:*', 'jill', array('foo')), AUTH_NONE);
// user with matching group 1
$this->assertEquals(auth_aclcheck('page', 'jill', array('foo', 'group1')), AUTH_UPLOAD);
$this->assertEquals(auth_aclcheck('namespace:page', 'jill', array('foo', 'group1')), AUTH_READ);
$this->assertEquals(auth_aclcheck('namespace:*', 'jill', array('foo', 'group1')), AUTH_UPLOAD);
// user with matching group 2
$this->assertEquals(auth_aclcheck('page', 'jill', array('foo', 'Group2')), AUTH_UPLOAD);
$this->assertEquals(auth_aclcheck('namespace:page', 'jill', array('foo', 'Group2')), AUTH_READ);
$this->assertEquals(auth_aclcheck('namespace:*', 'jill', array('foo', 'Group2')), AUTH_UPLOAD);
// super user John
$this->assertEquals(auth_aclcheck('page', 'john', array('foo')), AUTH_ADMIN);
$this->assertEquals(auth_aclcheck('namespace:page', 'john', array('foo')), AUTH_ADMIN);
$this->assertEquals(auth_aclcheck('namespace:*', 'john', array('foo')), AUTH_ADMIN);
// super user doe
$this->assertEquals(auth_aclcheck('page', 'Doe', array('foo')), AUTH_ADMIN);
$this->assertEquals(auth_aclcheck('namespace:page', 'Doe', array('foo')), AUTH_ADMIN);
$this->assertEquals(auth_aclcheck('namespace:*', 'Doe', array('foo')), AUTH_ADMIN);
// user with matching admin group 1
$this->assertEquals(auth_aclcheck('page', 'jill', array('foo', 'admin1')), AUTH_ADMIN);
$this->assertEquals(auth_aclcheck('namespace:page', 'jill', array('foo', 'admin1')), AUTH_ADMIN);
$this->assertEquals(auth_aclcheck('namespace:*', 'jill', array('foo', 'admin1')), AUTH_ADMIN);
// user with matching admin group 2
$this->assertEquals(auth_aclcheck('page', 'jill', array('foo', 'Admin2')), AUTH_ADMIN);
$this->assertEquals(auth_aclcheck('namespace:page', 'jill', array('foo', 'Admin2')), AUTH_ADMIN);
$this->assertEquals(auth_aclcheck('namespace:*', 'jill', array('foo', 'Admin2')), AUTH_ADMIN);
}
/*
* Test aclcheck on @ALL group
*
* The default permission for @ALL group is AUTH_NONE. So we use an
* ACL entry which grants @ALL group an AUTH_READ permission to see
* whether ACL matching is properly done or not.
*/
function test_restricted_allread() {
global $conf;
global $AUTH_ACL;
$conf['superuser'] = 'john';
$conf['useacl'] = 1;
$AUTH_ACL = array(
'* @ALL 1',
'* @group1 8',
);
// anonymous user
$this->assertEquals(auth_aclcheck('page', '', array()), AUTH_READ);
$this->assertEquals(auth_aclcheck('namespace:page', '', array()), AUTH_READ);
$this->assertEquals(auth_aclcheck('namespace:*', '', array()), AUTH_READ);
// user with no matching group
$this->assertEquals(auth_aclcheck('page', 'jill', array('foo')), AUTH_READ);
$this->assertEquals(auth_aclcheck('namespace:page', 'jill', array('foo')), AUTH_READ);
$this->assertEquals(auth_aclcheck('namespace:*', 'jill', array('foo')), AUTH_READ);
// user with matching group
$this->assertEquals(auth_aclcheck('page', 'jill', array('foo', 'Group1')), AUTH_UPLOAD);
$this->assertEquals(auth_aclcheck('namespace:page', 'jill', array('foo', 'Group1')), AUTH_UPLOAD);
$this->assertEquals(auth_aclcheck('namespace:*', 'jill', array('foo', 'Group1')), AUTH_UPLOAD);
// super user
$this->assertEquals(auth_aclcheck('page', 'John', array('foo')), AUTH_ADMIN);
$this->assertEquals(auth_aclcheck('namespace:page', 'John', array('foo')), AUTH_ADMIN);
$this->assertEquals(auth_aclcheck('namespace:*', 'John', array('foo')), AUTH_ADMIN);
}
}

View File

@ -10,7 +10,8 @@ class auth_admin_test extends DokuWikiTest {
private $oldauth;
function setup() {
function setUp() {
parent::setUp();
global $auth;
$this->oldauth = $auth;
}
@ -27,9 +28,7 @@ class auth_admin_test extends DokuWikiTest {
function teardown() {
global $auth;
global $conf;
global $AUTH_ACL;
unset($conf);
unset($AUTH_ACL);
$auth = $this->oldauth;
}

View File

@ -2,7 +2,7 @@
class auth_nameencode_test extends DokuWikiTest {
function teardown() {
function tearDown() {
global $cache_authname;
$cache_authname = array();
}

View File

@ -16,6 +16,7 @@ class auth_password_test extends PHPUnit_Framework_TestCase {
'kmd5' => 'a579299436d7969791189acadd86fcb716',
'djangomd5' => 'md5$abcde$d0fdddeda8cd92725d2b54148ac09158',
'djangosha1' => 'sha1$abcde$c8e65a7f0acc9158843048a53dcc5a6bc4d17678',
'sha512' => '$6$abcdefgh12345678$J9.zOcgx0lotwZdcz0uulA3IVQMinZvFZVjA5vapRLVAAqtay23XD4xeeUxQ3B4JvDWYFBIxVWW1tOYlHX13k1'
);
@ -61,6 +62,11 @@ class auth_password_test extends PHPUnit_Framework_TestCase {
$this->assertTrue(auth_verifyPassword('test12345','$H$9IQRaTwmfeRo7ud9Fh4E2PdI0S3r.L0'));
}
function test_veryPassword_mediawiki(){
$this->assertTrue(auth_verifyPassword('password', ':B:838c83e1:e4ab7024509eef084cdabd03d8b2972c'));
}
/**
* pmd5 checking should throw an exception when a hash with a too high
* iteration count is passed

View File

@ -0,0 +1,20 @@
<?php
class httpclient_http_proxy_test extends DokuWikiTest {
protected $url = 'http://www.dokuwiki.org/README';
/**
* @group internet
*/
function test_simpleget(){
$http = new HTTPClient();
// proxy provided by Andrwe Lord Weber <dokuwiki@andrwe.org>
$http->proxy_host = 'proxy.andrwe.org';
$http->proxy_port = 8080;
$data = $http->get($this->url);
$this->assertFalse($data === false, 'HTTP response');
$this->assertTrue(strpos($data,'DokuWiki') !== false, 'response content');
}
}

View File

@ -1,4 +1,5 @@
<?php
require_once dirname(__FILE__).'/httpclient_http.test.php';
class httpclient_https_test extends httpclient_http_test {
protected $server = 'https://httpbin.org/';

View File

@ -0,0 +1,15 @@
<?php
require_once dirname(__FILE__).'/httpclient_http_proxy.test.php';
class httpclient_https_proxy_test extends httpclient_http_proxy_test {
protected $url = 'https://www.dokuwiki.org/README';
public function setUp(){
// skip tests when this PHP has no SSL support
$transports = stream_get_transports();
if(!in_array('ssl',$transports)){
$this->markTestSkipped('No SSL support available.');
}
parent::setUp();
}
}

View File

@ -0,0 +1,18 @@
<?php
/**
* Tests the pid functions of the indexer.
*
* @author Michael Hamann <michael@content-space.de>
*/
class indexer_pid_test extends DokuWikiTest {
function test_pid() {
$indexer = idx_get_indexer();
$syntaxPID = $indexer->getPID('wiki:syntax');
$this->assertEquals('wiki:syntax', $indexer->getPageFromPID($syntaxPID), 'getPageFromPID(getPID(\'wiki:syntax\')) != \'wiki:syntax\'');
$dokuwikiPID = $indexer->getPID('wiki:dokuwiki');
$this->assertEquals('wiki:syntax', $indexer->getPageFromPID($syntaxPID), 'getPageFromPID(getPID(\'wiki:syntax\')) != \'wiki:syntax\' after getting the PID for wiki:dokuwiki');
$this->assertEquals($syntaxPID, $indexer->getPID('wiki:syntax'), 'getPID(\'wiki:syntax\') didn\'t returned different PIDs when called twice');
$this->assertNotEquals($syntaxPID, $dokuwikiPID, 'Same PID returned for different pages');
$this->assertTrue(is_numeric($syntaxPID) && is_numeric($dokuwikiPID), 'PIDs are not numeric');
}
}

View File

@ -0,0 +1,83 @@
<?php
/**
* Test cases for the Doku_Indexer::renamePage and Doku_Indexer::renameMetaValue methods
*/
class indexer_rename_test extends DokuWikiTest {
/** @var Doku_Indexer $indexer */
private $indexer;
private $old_id = 'old_testid';
function setUp() {
parent::setUp();
$this->indexer = idx_get_indexer();
$this->indexer->clear();
saveWikiText($this->old_id, 'Old test content', 'Created old test page for indexer rename test');
idx_addPage($this->old_id);
}
function test_rename_to_new_page() {
$newid = 'new_id_1';
$oldpid = $this->indexer->getPID($this->old_id);
$this->assertTrue($this->indexer->renamePage($this->old_id, $newid), 'Renaming the page to a new id failed');
io_rename(wikiFN($this->old_id), wikiFN($newid));
$this->assertNotEquals($this->indexer->getPID($this->old_id), $oldpid, 'PID for the old page unchanged after rename.');
$this->assertEquals($this->indexer->getPID($newid), $oldpid, 'New page has not the old pid.');
$query = array('old');
$this->assertEquals(array('old' => array($newid => 1)), $this->indexer->lookup($query), '"Old" doesn\'t find the new page');
}
function test_rename_to_existing_page() {
$newid = 'existing_page';
saveWikiText($newid, 'Existing content', 'Created page for move_to_existing_page');
idx_addPage($newid);
$oldpid = $this->indexer->getPID($this->old_id);
$existingpid = $this->indexer->getPID($newid);
$this->assertTrue($this->indexer->renamePage($this->old_id, $newid), 'Renaming the page to an existing id failed');
$this->assertNotEquals($this->indexer->getPID($this->old_id), $oldpid, 'PID for old page unchanged after rename.');
$this->assertNotEquals($this->indexer->getPID($this->old_id), $existingpid, 'PID for old page is now PID of the existing page.');
$this->assertEquals($this->indexer->getPID($newid), $oldpid, 'New page has not the old pid.');
$query = array('existing');
$this->assertEquals(array('existing' => array()), $this->indexer->lookup($query), 'Existing page hasn\'t been deleted from the index.');
$query = array('old');
$this->assertEquals(array('old' => array($newid => 1)), $this->indexer->lookup($query), '"Old" doesn\'t find the new page');
}
function test_meta_rename_to_new_value() {
$this->indexer->addMetaKeys($this->old_id, array('mkey' => 'old_value'));
$this->assertTrue($this->indexer->renameMetaValue('mkey', 'old_value', 'new_value'), 'Meta value rename to new value failed.');
$query = 'old_value';
$this->assertEquals(array(), $this->indexer->lookupKey('mkey', $query), 'Page can still be found under old value.');
$query = 'new_value';
$this->assertEquals(array($this->old_id), $this->indexer->lookupKey('mkey', $query), 'Page can\'t be found under new value.');
}
function test_meta_rename_to_existing_value() {
$this->indexer->addMetaKeys($this->old_id, array('mkey' => array('old_value', 'new_value')));
saveWikiText('newvalue', 'Test page', '');
idx_addPage('newvalue');
$this->indexer->addMetaKeys('newvalue', array('mkey' => array('new_value')));
saveWikiText('oldvalue', 'Test page', '');
idx_addPage('oldvalue');
$this->indexer->addMetaKeys('oldvalue', array('mkey' => array('old_value')));
$this->assertTrue($this->indexer->renameMetaValue('mkey', 'old_value', 'new_value'), 'Meta value rename to existing value failed');
$query = 'old_value';
$this->assertEquals(array(), $this->indexer->lookupKey('mkey', $query), 'Page can still be found under old value.');
$query = 'new_value';
$result = $this->indexer->lookupKey('mkey', $query);
$this->assertContains($this->old_id, $result, 'Page with both values can\'t be found anymore');
$this->assertContains('newvalue', $result, 'Page with new value can\'t be found anymore');
$this->assertContains('oldvalue', $result, 'Page with only the old value can\'t be found anymore');
}
}

View File

@ -7,6 +7,14 @@ class TestMailer extends Mailer {
public function prop($name){
return $this->$name;
}
public function &propRef($name) {
return $this->$name;
}
public function prepareHeaders() {
return parent::prepareHeaders();
}
}
class mailer_test extends DokuWikiTest {
@ -90,5 +98,17 @@ class mailer_test extends DokuWikiTest {
}
}
/**
* @see https://forum.dokuwiki.org/post/35822
*/
function test_emptyBCCorCC() {
$mail = new TestMailer();
$headers = &$mail->propRef('headers');
$headers['Bcc'] = '';
$headers['Cc'] = '';
$header = $mail->prepareHeaders();
$this->assertEquals(0, preg_match('/(^|\n)Bcc: (\n|$)/', $header), 'Bcc found in headers.');
$this->assertEquals(0, preg_match('/(^|\n)Cc: (\n|$)/', $header), 'Bcc found in headers.');
}
}
//Setup VIM: ex: et ts=4 :

View File

@ -8,7 +8,8 @@ abstract class TestOfDoku_Parser extends PHPUnit_Framework_TestCase {
var $P;
var $H;
function setup() {
function setUp() {
parent::setUp();
$this->P = new Doku_Parser();
$this->H = new Doku_Handler();
$this->P->Handler = & $this->H;

View File

@ -3,8 +3,8 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Footnote extends TestOfDoku_Parser {
function setup() {
parent::setup();
function setUp() {
parent::setUp();
$this->P->addMode('footnote',new Doku_Parser_Mode_Footnote());
}

View File

@ -3,8 +3,8 @@ require_once 'parser.inc.php';
class TestOfDoku_Parser_Quotes extends TestOfDoku_Parser {
function setup() {
parent::setup();
function setUp() {
parent::setUp();
global $conf;
$conf['typography'] = 2;
}

View File

@ -112,12 +112,12 @@ class remote_plugin_testplugin extends DokuWiki_Remote_Plugin {
class remote_test extends DokuWikiTest {
var $originalConf;
var $userinfo;
var $remote;
function setUp() {
parent::setUp();
global $plugin_controller;
global $conf;
global $USERINFO;
@ -131,7 +131,6 @@ class remote_test extends DokuWikiTest {
$plugin_controller = $pluginManager;
$this->originalConf = $conf;
$conf['remote'] = 1;
$conf['remoteuser'] = '!!not set!!';
$conf['useacl'] = 0;
@ -143,9 +142,7 @@ class remote_test extends DokuWikiTest {
}
function tearDown() {
global $conf;
global $USERINFO;
$conf = $this->originalConf;
$USERINFO = $this->userinfo;
}

View File

@ -1,6 +1,7 @@
<?php
class search_test extends DokuWikiTest {
function strip_index_data($entry) {
$n_entry = array();
foreach(array('id', 'type', 'level', 'open') as $k) {
@ -9,6 +10,24 @@ class search_test extends DokuWikiTest {
return $n_entry;
}
function test_search_allpages(){
$data = array();
//depth is 0 hence we should recurse endlesly
search($data, dirname(__FILE__) . '/data', 'search_allpages', array('depth' => 0), 'ns1');
$this->assertEquals(3, count($data));
//depth is 1 and we start too deep to expect results
$data = array();
search($data, dirname(__FILE__) . '/data', 'search_allpages', array('depth' => 1), 'ns1/ns3');
$this->assertEquals(0, count($data));
//depth is 1 so I should get only pages from ns1
$data = array();
search($data, dirname(__FILE__) . '/data', 'search_allpages', array('depth' => 1), 'ns1');
$this->assertEquals(2, count($data));
}
function test_search_index(){
$data = array();
search($data, dirname(__FILE__) . '/data', 'search_index',

View File

@ -0,0 +1,246 @@
<?php
class subscription_test extends DokuWikiTest {
function test_regexp() {
// data to test against
$data = array(
"casper every\n",
"Andreas digest 1344689733",
"Cold%20Fusion every",
"zioth list 1344691369\n",
"nlights digest",
"rikblok\tdigest \t 1344716803",
);
// user, style, data, expected number of results
$tests = array(
array('Cold Fusion', null, null, 1),
array('casper', null, null, 1),
array('nope', null, null, 0),
array('lights', null, null, 0),
array(array('Cold Fusion', 'casper', 'nope'), null, null, 2),
array(null, 'list', null, 1),
array(null, 'every', null, 2),
array(null, 'digest', null, 3),
array(null, array('list', 'every'), null, 3),
array('casper', 'digest', null, 0),
array('casper', array('digest', 'every'), null, 1),
array('zioth', 'list', '1344691369', 1),
array('zioth', null, '1344691369', 1),
array('zioth', 'digest', '1344691369', 0),
);
$sub = new MockupSubscription();
$row = 0;
foreach($tests as $test) {
$re = $sub->buildregex($test[0], $test[1], $test[2]);
$this->assertFalse(empty($re), "test line $row");
$result = preg_grep($re, $data);
$this->assertEquals($test[3], count($result), "test line $row. $re got\n".print_r($result, true));
$row++;
}
}
function test_addremove() {
$sub = new MockupSubscription();
// no subscriptions
$this->assertArrayNotHasKey(
'wiki:dokuwiki',
$sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
);
// add page subscription
$sub->add('wiki:dokuwiki', 'testuser', 'every');
// one subscription
$this->assertArrayHasKey(
'wiki:dokuwiki',
$sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
);
// remove page subscription
$sub->remove('wiki:dokuwiki', 'testuser');
// no subscription
$this->assertArrayNotHasKey(
'wiki:dokuwiki',
$sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
);
// add namespace subscription
$sub->add('wiki:', 'testuser', 'every');
// one subscription
$this->assertArrayHasKey(
'wiki:',
$sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
);
// remove (non existing) page subscription
$sub->remove('wiki:dokuwiki', 'testuser');
// still one subscription
$this->assertArrayHasKey(
'wiki:',
$sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
);
// change namespace subscription
$sub->add('wiki:', 'testuser', 'digest', '1234567');
// still one subscription
$this->assertArrayHasKey(
'wiki:',
$sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
);
// check contents
$this->assertEquals(
array('wiki:' => array('testuser' => array('digest', '1234567'))),
$sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
);
// change subscription data
$sub->add('wiki:', 'testuser', 'digest', '7654321');
// still one subscription
$this->assertArrayHasKey(
'wiki:',
$sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
);
// check contents
$this->assertEquals(
array('wiki:' => array('testuser' => array('digest', '7654321'))),
$sub->subscribers('wiki:dokuwiki', null, array('every', 'list', 'digest'))
);
}
function test_bulkdigest() {
$sub = new MockupSubscription();
// let's start with nothing
$this->assertEquals(0, $sub->send_bulk('sub1:test'));
// create a subscription
$sub->add('sub1:', 'testuser', 'digest', '978328800'); // last mod 2001-01-01
// now create change
$_SERVER['REMOTE_USER'] = 'someguy';
saveWikiText('sub1:test', 'foo bar', 'a subscription change', false);
// should trigger a mail
$this->assertEquals(1, $sub->send_bulk('sub1:test'));
$this->assertEquals(array('arthur@example.com'), $sub->mails);
$sub->reset();
// now create more changes
$_SERVER['REMOTE_USER'] = 'someguy';
saveWikiText('sub1:sub2:test', 'foo bar', 'a subscription change', false);
saveWikiText('sub1:another_test', 'foo bar', 'a subscription change', false);
// should not trigger a mail, because the subscription time has not been reached, yet
$this->assertEquals(0, $sub->send_bulk('sub1:test'));
$this->assertEquals(array(), $sub->mails);
// reset the subscription time
$sub->add('sub1:', 'testuser', 'digest', '978328800'); // last mod 2001-01-01
// we now should get mails for three changes
$this->assertEquals(3, $sub->send_bulk('sub1:test'));
$this->assertEquals(array('arthur@example.com', 'arthur@example.com', 'arthur@example.com'), $sub->mails);
}
function test_bulklist() {
$sub = new MockupSubscription();
// let's start with nothing
$this->assertEquals(0, $sub->send_bulk('sub1:test'));
// create a subscription
$sub->add('sub1:', 'testuser', 'list', '978328800'); // last mod 2001-01-01
// now create change
$_SERVER['REMOTE_USER'] = 'someguy';
saveWikiText('sub1:test', 'foo bar', 'a subscription change', false);
// should trigger a mail
$this->assertEquals(1, $sub->send_bulk('sub1:test'));
$this->assertEquals(array('arthur@example.com'), $sub->mails);
$sub->reset();
// now create more changes
$_SERVER['REMOTE_USER'] = 'someguy';
saveWikiText('sub1:sub2:test', 'foo bar', 'a subscription change', false);
saveWikiText('sub1:another_test', 'foo bar', 'a subscription change', false);
// should not trigger a mail, because the subscription time has not been reached, yet
$this->assertEquals(0, $sub->send_bulk('sub1:test'));
$this->assertEquals(array(), $sub->mails);
// reset the subscription time
$sub->add('sub1:', 'testuser', 'list', '978328800'); // last mod 2001-01-01
// we now should get a single mail for all three changes
$this->assertEquals(1, $sub->send_bulk('sub1:test'));
$this->assertEquals(array('arthur@example.com'), $sub->mails);
}
/**
* Tests, if overwriting subscriptions works even when subscriptions for the same
* user exist for two nested namespaces, this is a test for the bug described in FS#2580
*/
function test_overwrite() {
$sub = new MockupSubscription();
$sub->add(':', 'admin', 'digest', '123456789');
$sub->add(':wiki:', 'admin', 'digest', '123456789');
$sub->add(':', 'admin', 'digest', '1234');
$sub->add(':wiki:', 'admin', 'digest', '1234');
$subscriptions = $sub->subscribers(':wiki:', 'admin');
$this->assertCount(1, $subscriptions[':'], 'More than one subscription saved for the root namespace even though the old one should have been overwritten.');
$this->assertCount(1, $subscriptions[':wiki:'], 'More than one subscription saved for the wiki namespace even though the old one should have been overwritten.');
$this->assertCount(2, $subscriptions, 'Didn\'t find the expected two subscriptions');
}
}
/**
* makes protected methods visible for testing
*/
class MockupSubscription extends Subscription {
public $mails; // we keep sent mails here
public function __construct() {
$this->reset();
}
/**
* resets the mail array
*/
public function reset() {
$this->mails = array();
}
public function isenabled() {
return true;
}
public function buildregex($user = null, $style = null, $data = null) {
return parent::buildregex($user, $style, $data);
}
protected function send($subscriber_mail, $subject, $id, $template, $trep, $hrep = null) {
$this->mails[] = $subscriber_mail;
return true;
}
}
//Setup VIM: ex: et ts=4 :

View File

@ -1,20 +0,0 @@
<?php
/**
* Tests the subscription set function
*/
class subscription_set_test extends DokuWikiTest {
/**
* Tests, if overwriting subscriptions works even when subscriptions for the same
* user exist for two nested namespaces, this is a test for the bug described in FS#2580
*/
function test_overwrite() {
subscription_set('admin', ':', 'digest', '123456789');
subscription_set('admin', ':wiki:', 'digest', '123456789');
subscription_set('admin', ':', 'digest', '1234', true);
subscription_set('admin', ':wiki:', 'digest', '1234', true);
$subscriptions = subscription_find(':wiki:', array('user' => 'admin'));
$this->assertCount(1, $subscriptions[':'], 'More than one subscription saved for the root namespace even though the old one should have been overwritten.');
$this->assertCount(1, $subscriptions[':wiki:'], 'More than one subscription saved for the wiki namespace even though the old one should have been overwritten.');
$this->assertCount(2, $subscriptions, 'Didn\'t find the expected two subscriptions');
}
}

View File

@ -0,0 +1,319 @@
<?php
class Tar_TestCase extends DokuWikiTest {
/**
* simple test that checks that the given filenames and contents can be grepped from
* the uncompressed tar stream
*
* No check for format correctness
*/
public function test_createdynamic() {
$tar = new Tar();
$dir = dirname(__FILE__).'/tar';
$tar->create();
$tar->AddFile("$dir/testdata1.txt");
$tar->AddFile("$dir/foobar/testdata2.txt", 'noway/testdata2.txt');
$tar->addData('another/testdata3.txt', 'testcontent3');
$data = $tar->getArchive();
$this->assertTrue(strpos($data, 'testcontent1') !== false, 'Content in TAR');
$this->assertTrue(strpos($data, 'testcontent2') !== false, 'Content in TAR');
$this->assertTrue(strpos($data, 'testcontent3') !== false, 'Content in TAR');
$this->assertTrue(strpos($data, "$dir/testdata1.txt") !== false, 'Path in TAR');
$this->assertTrue(strpos($data, 'noway/testdata2.txt') !== false, 'Path in TAR');
$this->assertTrue(strpos($data, 'another/testdata3.txt') !== false, 'Path in TAR');
$this->assertTrue(strpos($data, "$dir/foobar/testdata2.txt") === false, 'Path not in TAR');
$this->assertTrue(strpos($data, "foobar") === false, 'Path not in TAR');
}
/**
* simple test that checks that the given filenames and contents can be grepped from the
* uncompressed tar file
*
* No check for format correctness
*/
public function test_createfile() {
$tar = new Tar();
$dir = dirname(__FILE__).'/tar';
$tmp = tempnam(sys_get_temp_dir(), 'dwtartest');
$tar->create($tmp, Tar::COMPRESS_NONE);
$tar->AddFile("$dir/testdata1.txt");
$tar->AddFile("$dir/foobar/testdata2.txt", 'noway/testdata2.txt');
$tar->addData('another/testdata3.txt', 'testcontent3');
$tar->close();
$this->assertTrue(filesize($tmp) > 30); //arbitrary non-zero number
$data = file_get_contents($tmp);
$this->assertTrue(strpos($data, 'testcontent1') !== false, 'Content in TAR');
$this->assertTrue(strpos($data, 'testcontent2') !== false, 'Content in TAR');
$this->assertTrue(strpos($data, 'testcontent3') !== false, 'Content in TAR');
$this->assertTrue(strpos($data, "$dir/testdata1.txt") !== false, 'Path in TAR');
$this->assertTrue(strpos($data, 'noway/testdata2.txt') !== false, 'Path in TAR');
$this->assertTrue(strpos($data, 'another/testdata3.txt') !== false, 'Path in TAR');
$this->assertTrue(strpos($data, "$dir/foobar/testdata2.txt") === false, 'Path not in TAR');
$this->assertTrue(strpos($data, "foobar") === false, 'Path not in TAR');
@unlink($tmp);
}
/**
* List the contents of the prebuilt TAR files
*/
public function test_tarcontent() {
$dir = dirname(__FILE__).'/tar';
foreach(array('tar', 'tgz', 'tbz') as $ext) {
$tar = new Tar();
$file = "$dir/test.$ext";
$tar->open($file);
$content = $tar->contents();
$this->assertCount(4, $content, "Contents of $file");
$this->assertEquals('tar/testdata1.txt', $content[1]['filename'], "Contents of $file");
$this->assertEquals(13, $content[1]['size'], "Contents of $file");
$this->assertEquals('tar/foobar/testdata2.txt', $content[3]['filename'], "Contents of $file");
$this->assertEquals(13, $content[1]['size'], "Contents of $file");
}
}
/**
* Extract the prebuilt tar files
*/
public function test_tarextract() {
$dir = dirname(__FILE__).'/tar';
$out = sys_get_temp_dir().'/dwtartest'.md5(time());
foreach(array('tar', 'tgz', 'tbz') as $ext) {
$tar = new Tar();
$file = "$dir/test.$ext";
$tar->open($file);
$tar->extract($out);
clearstatcache();
$this->assertFileExists($out.'/tar/testdata1.txt', "Extracted $file");
$this->assertEquals(13, filesize($out.'/tar/testdata1.txt'), "Extracted $file");
$this->assertFileExists($out.'/tar/foobar/testdata2.txt', "Extracted $file");
$this->assertEquals(13, filesize($out.'/tar/foobar/testdata2.txt'), "Extracted $file");
TestUtils::rdelete($out);
}
}
/**
* Extract the prebuilt tar files with component stripping
*/
public function test_compstripextract() {
$dir = dirname(__FILE__).'/tar';
$out = sys_get_temp_dir().'/dwtartest'.md5(time());
foreach(array('tar', 'tgz', 'tbz') as $ext) {
$tar = new Tar();
$file = "$dir/test.$ext";
$tar->open($file);
$tar->extract($out, 1);
clearstatcache();
$this->assertFileExists($out.'/testdata1.txt', "Extracted $file");
$this->assertEquals(13, filesize($out.'/testdata1.txt'), "Extracted $file");
$this->assertFileExists($out.'/foobar/testdata2.txt', "Extracted $file");
$this->assertEquals(13, filesize($out.'/foobar/testdata2.txt'), "Extracted $file");
TestUtils::rdelete($out);
}
}
/**
* Extract the prebuilt tar files with prefix stripping
*/
public function test_prefixstripextract() {
$dir = dirname(__FILE__).'/tar';
$out = sys_get_temp_dir().'/dwtartest'.md5(time());
foreach(array('tar', 'tgz', 'tbz') as $ext) {
$tar = new Tar();
$file = "$dir/test.$ext";
$tar->open($file);
$tar->extract($out, 'tar/foobar/');
clearstatcache();
$this->assertFileExists($out.'/tar/testdata1.txt', "Extracted $file");
$this->assertEquals(13, filesize($out.'/tar/testdata1.txt'), "Extracted $file");
$this->assertFileExists($out.'/testdata2.txt', "Extracted $file");
$this->assertEquals(13, filesize($out.'/testdata2.txt'), "Extracted $file");
TestUtils::rdelete($out);
}
}
/**
* Extract the prebuilt tar files with include regex
*/
public function test_includeextract() {
$dir = dirname(__FILE__).'/tar';
$out = sys_get_temp_dir().'/dwtartest'.md5(time());
foreach(array('tar', 'tgz', 'tbz') as $ext) {
$tar = new Tar();
$file = "$dir/test.$ext";
$tar->open($file);
$tar->extract($out, '', '', '/\/foobar\//');
clearstatcache();
$this->assertFileNotExists($out.'/tar/testdata1.txt', "Extracted $file");
$this->assertFileExists($out.'/tar/foobar/testdata2.txt', "Extracted $file");
$this->assertEquals(13, filesize($out.'/tar/foobar/testdata2.txt'), "Extracted $file");
TestUtils::rdelete($out);
}
}
/**
* Extract the prebuilt tar files with exclude regex
*/
public function test_excludeextract() {
$dir = dirname(__FILE__).'/tar';
$out = sys_get_temp_dir().'/dwtartest'.md5(time());
foreach(array('tar', 'tgz', 'tbz') as $ext) {
$tar = new Tar();
$file = "$dir/test.$ext";
$tar->open($file);
$tar->extract($out, '', '/\/foobar\//');
clearstatcache();
$this->assertFileExists($out.'/tar/testdata1.txt', "Extracted $file");
$this->assertEquals(13, filesize($out.'/tar/testdata1.txt'), "Extracted $file");
$this->assertFileNotExists($out.'/tar/foobar/testdata2.txt', "Extracted $file");
TestUtils::rdelete($out);
}
}
/**
* Check the extension to compression guesser
*/
public function test_filetype() {
$tar = new Tar();
$this->assertEquals(Tar::COMPRESS_NONE, $tar->filetype('foo'));
$this->assertEquals(Tar::COMPRESS_GZIP, $tar->filetype('foo.tgz'));
$this->assertEquals(Tar::COMPRESS_GZIP, $tar->filetype('foo.tGZ'));
$this->assertEquals(Tar::COMPRESS_GZIP, $tar->filetype('foo.tar.GZ'));
$this->assertEquals(Tar::COMPRESS_GZIP, $tar->filetype('foo.tar.gz'));
$this->assertEquals(Tar::COMPRESS_BZIP, $tar->filetype('foo.tbz'));
$this->assertEquals(Tar::COMPRESS_BZIP, $tar->filetype('foo.tBZ'));
$this->assertEquals(Tar::COMPRESS_BZIP, $tar->filetype('foo.tar.BZ2'));
$this->assertEquals(Tar::COMPRESS_BZIP, $tar->filetype('foo.tar.bz2'));
}
public function test_longpathextract() {
$dir = dirname(__FILE__).'/tar';
$out = sys_get_temp_dir().'/dwtartest'.md5(time());
foreach(array('ustar', 'gnu') as $format) {
$tar = new Tar();
$tar->open("$dir/longpath-$format.tgz");
$tar->extract($out);
$this->assertFileExists($out.'/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/1234567890/test.txt');
TestUtils::rdelete($out);
}
}
public function test_createlongpathustar() {
$tar = new Tar();
$tmp = tempnam(sys_get_temp_dir(), 'dwtartest');
$path = '';
for($i=0; $i<11; $i++) $path .= '1234567890/';
$path = rtrim($path,'/');
$tar->create($tmp, Tar::COMPRESS_NONE);
$tar->addData("$path/test.txt", 'testcontent1');
$tar->close();
$this->assertTrue(filesize($tmp) > 30); //arbitrary non-zero number
$data = file_get_contents($tmp);
// We should find the path and filename separated, no longlink entry
$this->assertTrue(strpos($data, 'testcontent1') !== false, 'content in TAR');
$this->assertTrue(strpos($data, 'test.txt') !== false, 'filename in TAR');
$this->assertTrue(strpos($data, $path) !== false, 'path in TAR');
$this->assertFalse(strpos($data, "$path/test.txt") !== false, 'full filename in TAR');
$this->assertFalse(strpos($data, '@LongLink') !== false, '@LongLink in TAR');
@unlink($tmp);
}
public function test_createlongpathgnu() {
$tar = new Tar();
$tmp = tempnam(sys_get_temp_dir(), 'dwtartest');
$path = '';
for($i=0; $i<20; $i++) $path .= '1234567890/';
$path = rtrim($path,'/');
$tar->create($tmp, Tar::COMPRESS_NONE);
$tar->addData("$path/test.txt", 'testcontent1');
$tar->close();
$this->assertTrue(filesize($tmp) > 30); //arbitrary non-zero number
$data = file_get_contents($tmp);
// We should find the complete path/filename and a longlink entry
$this->assertTrue(strpos($data, 'testcontent1') !== false, 'content in TAR');
$this->assertTrue(strpos($data, 'test.txt') !== false, 'filename in TAR');
$this->assertTrue(strpos($data, $path) !== false, 'path in TAR');
$this->assertTrue(strpos($data, "$path/test.txt") !== false, 'full filename in TAR');
$this->assertTrue(strpos($data, '@LongLink') !== false, '@LongLink in TAR');
@unlink($tmp);
}
/**
* Extract a tarbomomb
*/
public function test_tarbomb() {
$dir = dirname(__FILE__).'/tar';
$out = sys_get_temp_dir().'/dwtartest'.md5(time());
$tar = new Tar();
$tar->open("$dir/tarbomb.tgz");
$tar->extract($out);
clearstatcache();
$this->assertFileExists($out.'/AAAAAAAAAAAAAAAAA/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB.txt');
TestUtils::rdelete($out);
}
}

View File

@ -0,0 +1 @@
testcontent2

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -0,0 +1 @@
testcontent1

View File

@ -5,11 +5,6 @@ if ('cli' != php_sapi_name()) die();
ini_set('memory_limit','128M');
if(!defined('DOKU_INC')) define('DOKU_INC',realpath(dirname(__FILE__).'/../').'/');
require_once(DOKU_INC.'inc/init.php');
require_once(DOKU_INC.'inc/common.php');
require_once(DOKU_INC.'inc/pageutils.php');
require_once(DOKU_INC.'inc/search.php');
require_once(DOKU_INC.'inc/indexer.php');
require_once(DOKU_INC.'inc/auth.php');
require_once(DOKU_INC.'inc/cliopts.php');
session_write_close();
@ -67,10 +62,6 @@ function _usage() {
function _update(){
global $conf;
global $INDEXER;
$INDEXER = idx_get_indexer();
$data = array();
_quietecho("Searching pages... ");
search($data,$conf['datadir'],'search_allpages',array('skipacl' => true));
@ -82,7 +73,6 @@ function _update(){
}
function _index($id){
global $INDEXER;
global $CLEAR;
global $QUIET;
@ -91,63 +81,13 @@ function _index($id){
_quietecho("done.\n");
}
/**
* lock the indexer system
*/
function _lock(){
global $conf;
$lock = $conf['lockdir'].'/_indexer.lock';
$said = false;
while(!@mkdir($lock, $conf['dmode'])){
if(time()-@filemtime($lock) > 60*5){
// looks like a stale lock - remove it
@rmdir($lock);
}else{
if($said){
_quietecho(".");
}else{
_quietecho("Waiting for lockfile (max. 5 min)");
$said = true;
}
sleep(15);
}
}
if($conf['dperm']) chmod($lock, $conf['dperm']);
if($said) _quietecho("\n");
}
/**
* unlock the indexer sytem
*/
function _unlock(){
global $conf;
$lock = $conf['lockdir'].'/_indexer.lock';
@rmdir($lock);
}
/**
* Clear all index files
*/
function _clearindex(){
global $conf;
_lock();
_quietecho("Clearing index... ");
io_saveFile($conf['indexdir'].'/page.idx','');
io_saveFile($conf['indexdir'].'/title.idx','');
io_saveFile($conf['indexdir'].'/pageword.idx','');
io_saveFile($conf['indexdir'].'/metadata.idx','');
$dir = @opendir($conf['indexdir']);
if($dir!==false){
while(($f = readdir($dir)) !== false){
if(substr($f,-4)=='.idx' &&
(substr($f,0,1)=='i' || substr($f,0,1)=='w'
|| substr($f,-6)=='_w.idx' || substr($f,-6)=='_i.idx' || substr($f,-6)=='_p.idx'))
@unlink($conf['indexdir']."/$f");
}
}
@unlink($conf['indexdir'].'/lengths.idx');
idx_get_indexer()->clear();
_quietecho("done.\n");
_unlock();
}
function _quietecho($msg) {

View File

@ -4,140 +4,58 @@ ACL Access Control List
AFAICS As far as I can see
AFAIK As far as I know
AFAIR As far as I remember
AJAX Asynchronous JavaScript and XML
AIM AOL (America Online) Instant Messenger
AOL America Online
API Application Programming Interface
ASAP As soon as possible
ASCII American Standard Code for Information Interchange
ASP Active Server Pages
BTW By the way
CGI Common Gateway Interface
CMS Content Management System
CSS Cascading Style Sheets
CVS Concurrent Versions System
DBA Database Administrator
DHCP Dynamic Host Configuration Protocol
DHTML Dynamic HyperText Markup Language
DMCA Digital Millenium Copyright Act
DNS Domain Name System
DOM Document Object Model
DTD Document Type Definition
EOF End of file
EOL End of line
EOM End of message
EOT End of text
ESMTP Extended Simple Mail Transfer Protocol
FAQ Frequently Asked Questions
FDL GNU Free Documentation License
FTP File Transfer Protocol
FOSS Free & Open-Source Software
FLOSS Free/Libre and Open Source Software
FUD Fear, Uncertainty, and Doubt
GB Gigabyte
GHz Gigahertz
GIF Graphics Interchange Format
GPL GNU General Public License
GUI Graphical User Interface
HTML HyperText Markup Language
HTTP Hyper Text Transfer Protocol
IANAL I am not a lawyer (but)
ICANN Internet Corporation for Assigned Names and Numbers
ICQ I seek you (Instant Messenger)
IE5 Internet Explorer 5
IE6 Internet Explorer 6
IE Internet Explorer
IIRC If I remember correctly
IIS Internet Information Services
IMAP Internet Message Access Protocol
IMHO In my humble opinion
IMO In my opinion
IOW In other words
IRC Internet Relay Chat
IRL In real life
ISO International Organization for Standardization
ISP Internet Service Provider
JDK Java Development Kit
JPEG Joint Photographics Experts Group
JPG Joint Photographics Experts Group
JS JavaScript
KISS Keep it simple stupid
LAN Local Area Network
LDAP Lightweight Directory Access Protocol
LGPL GNU Lesser General Public License
LOL Laughing out loud
MathML Mathematical Markup Language
MB Megabyte
MHz Megahertz
MIME Multipurpose Internet Mail Extension
MIT Massachusetts Institute of Technology
MML Mathematical Markup Language
MP3 Moving Picture Experts Group Layer 3
MPEG Moving Picture Experts Group
MSDN Microsoft Developer Network
MS Microsoft
MSIE Microsoft Internet Explorer
NIS Network Information Service
NS4.7 Netscape 4.7
NS4 Netscape 4
NS6 Netscape 6
NS7 Netscape 7
OMG Oh my God
OPML Outline Processor Markup Language
OS Operating System
OSS Open Source Software
OTOH On the other hand
P2P Peer to Peer
PDA Personal Digital Assistant
PDF Portable Document Format
PHP Hypertext Preprocessor
PICS Platform for Internet Content Selection
PIN Personal Identification Number
PITA Pain in the Ass
PNG Portable Network Graphics
POP3 Post Office Protocol 3
POP Post Office Protocol
QoS Quality of Service
RAID Redundant Array of Inexpensive Disks
RDF Resource Description Framework
RFC Request for Comments
ROTFL Rolling on the floor laughing
RPC Remote Procedure Call
RSS Rich Site Summary
RTFM Read The Fine Manual
RTF Rich Text File
SCSI Small Computer System Interface
SDK Software Development Kit
SGML Standard General Markup Language
SMIL Synchronized Multimedia Integration Language
SMTP Simple Mail Transfer Protocol
SOAP Simple Object Access Protocol
spec specification
SQL Structured Query Language
SSH Secure Shell
SSI Server Side Includes
SSL Secure Sockets Layer
SVG Scalable Vector Graphics
TIA Thanks in advance
TIFF Tagged Image File Format
TLD Top Level Domain
TL;DR Too long; didn't read
TOC Table of Contents
URI Uniform Resource Identifier
URL Uniform Resource Locator
URN Uniform Resource Name
VBA Visual Basic for Applications
VB Visual Basic
W3C World Wide Web Consortium
WAN Wide Area Network
WAP Wireless Access Protocol
WML Wireless Markup Language
WTF? What the f***
WWW World Wide Web
WYSIWYG What You See Is What You Get
XHTML Extensible HyperText Markup Language
XML Extensible Markup Language
XSD XML (Extensible Markup Language) Schema Definition
XSL Extensible Stylesheet Language
XSLT Extensible Stylesheet Language Transformations
XUL XML User Interface Language
YMMV Your mileage may vary

View File

@ -0,0 +1,30 @@
====== Welcome to your new DokuWiki ======
Congratulations, your wiki is now up and running. Here are a few more tips to get you started.
Enjoy your work with DokuWiki,\\
-- the developers
===== Create your first pages =====
Your wiki needs to have a start page. As long as it doesn't exist, this link will be red: [[:start]].
Go on, follow that link and create the page. If you need help with using the syntax you can always refer to the [[wiki:syntax|syntax page]].
You might also want to use a sidebar. To create it, just edit the [[:sidebar]] page. Everything in that page will be shown in a margin column on the side. Read our [[doku>faq:sidebar|FAQ on sidebars]] to learn more.
Please be aware that not all templates support sidebars.
===== Customize your Wiki =====
Once you're comfortable with creating and editing pages you might want to have a look at the [[this>doku.php?do=admin&page=config|configuration settings]] (be sure to login as superuser first).
You may also want to see what [[doku>plugins|plugins]] and [[doku>templates|templates]] are available at DokuWiki.org to extend the functionality and looks of your DokuWiki installation.
===== Join the Community =====
DokuWiki is an Open Source project that thrives through user contributions. A good way to stay informed on what's going on and to get useful tips in using DokuWiki is subscribing to the [[doku>newsletter]].
The [[http://forum.dokuwiki.org|DokuWiki User Forum]] is an excellent way to get in contact with other DokuWiki users and is just one of the many ways to get [[doku>faq:support|support]].
Of course we'd be more than happy to have you [[doku>teams:getting_involved|getting involved]] with DokuWiki.

View File

@ -209,12 +209,14 @@ function rss_buildItems(&$rss, &$data, $opt) {
// add date
if($ditem['date']) {
$date = $ditem['date'];
} elseif ($ditem['media']) {
$date = @filemtime(mediaFN($id));
} elseif (@file_exists(wikiFN($id))) {
$date = @filemtime(wikiFN($id));
} elseif($meta['date']['modified']) {
$date = $meta['date']['modified'];
} else if ($ditem['media']) {
$date = @filemtime(mediaFN($id));
} else {
$date = @filemtime(wikiFN($id));
$date = 0;
}
if($date) $item->date = date('r', $date);
@ -350,7 +352,11 @@ function rss_buildItems(&$rss, &$data, $opt) {
$content = '';
}
} else {
$content = p_wiki_xhtml($id, $date, false);
if (@filemtime(wikiFN($id)) === $date) {
$content = p_wiki_xhtml($id, '', false);
} else {
$content = p_wiki_xhtml($id, $date, false);
}
// no TOC in feeds
$content = preg_replace('/(<!-- TOC START -->).*(<!-- TOC END -->)/s', '', $content);

View File

@ -15,8 +15,8 @@ class FeedParser extends SimplePie {
/**
* Constructor. Set some defaults
*/
function FeedParser(){
$this->SimplePie();
function __construct(){
parent::__construct();
$this->enable_cache(false);
$this->set_file_class('FeedParser_File');
}
@ -47,8 +47,8 @@ class FeedParser_File extends SimplePie_File {
*
* We ignore all given parameters - they are set in DokuHTTPClient
*/
function FeedParser_File($url, $timeout=10, $redirects=5,
$headers=null, $useragent=null, $force_fsockopen=false) {
function __construct($url, $timeout=10, $redirects=5,
$headers=null, $useragent=null, $force_fsockopen=false) {
$this->http = new DokuHTTPClient();
$this->success = $this->http->sendRequest($url);

View File

@ -254,11 +254,7 @@ class HTTPClient {
if(!empty($uri['port'])) $headers['Host'].= ':'.$uri['port'];
$headers['User-Agent'] = $this->agent;
$headers['Referer'] = $this->referer;
if ($this->keep_alive) {
$headers['Connection'] = 'Keep-Alive';
} else {
$headers['Connection'] = 'Close';
}
if($method == 'POST'){
if(is_array($data)){
if($headers['Content-Type'] == 'multipart/form-data'){
@ -299,6 +295,14 @@ class HTTPClient {
return false;
}
// try establish a CONNECT tunnel for SSL
if($this->_ssltunnel($socket, $request_url)){
// no keep alive for tunnels
$this->keep_alive = false;
// tunnel is authed already
if(isset($headers['Proxy-Authentication'])) unset($headers['Proxy-Authentication']);
}
// keep alive?
if ($this->keep_alive) {
self::$connections[$connectionId] = $socket;
@ -307,6 +311,15 @@ class HTTPClient {
}
}
if ($this->keep_alive && !$this->proxy_host) {
// RFC 2068, section 19.7.1: A client MUST NOT send the Keep-Alive
// connection token to a proxy server. We still do keep the connection the
// proxy alive (well except for CONNECT tunnels)
$headers['Connection'] = 'Keep-Alive';
} else {
$headers['Connection'] = 'Close';
}
try {
//set non-blocking
stream_set_blocking($socket, false);
@ -484,6 +497,49 @@ class HTTPClient {
return true;
}
/**
* Tries to establish a CONNECT tunnel via Proxy
*
* Protocol, Servername and Port will be stripped from the request URL when a successful CONNECT happened
*
* @param ressource &$socket
* @param string &$requesturl
* @return bool true if a tunnel was established
*/
function _ssltunnel(&$socket, &$requesturl){
if(!$this->proxy_host) return false;
$requestinfo = parse_url($requesturl);
if($requestinfo['scheme'] != 'https') return false;
if(!$requestinfo['port']) $requestinfo['port'] = 443;
// build request
$request = "CONNECT {$requestinfo['host']}:{$requestinfo['port']} HTTP/1.0".HTTP_NL;
$request .= "Host: {$requestinfo['host']}".HTTP_NL;
if($this->proxy_user) {
'Proxy-Authorization Basic '.base64_encode($this->proxy_user.':'.$this->proxy_pass).HTTP_NL;
}
$request .= HTTP_NL;
$this->_debug('SSL Tunnel CONNECT',$request);
$this->_sendData($socket, $request, 'SSL Tunnel CONNECT');
// read headers from socket
$r_headers = '';
do{
$r_line = $this->_readLine($socket, 'headers');
$r_headers .= $r_line;
}while($r_line != "\r\n" && $r_line != "\n");
$this->_debug('SSL Tunnel Response',$r_headers);
if(preg_match('/^HTTP\/1\.0 200/i',$r_headers)){
if (stream_socket_enable_crypto($socket, true, STREAM_CRYPTO_METHOD_SSLv3_CLIENT)) {
$requesturl = $requestinfo['path'];
return true;
}
}
return false;
}
/**
* Safely write data to a socket
*

View File

@ -555,6 +555,7 @@ class Mailer {
protected function prepareHeaders() {
$headers = '';
foreach($this->headers as $key => $val) {
if ($val === '') continue;
$headers .= "$key: $val".MAILHEADER_EOL;
}
return $headers;

View File

@ -4,7 +4,7 @@
*
* This class implements various mechanisms used to hash passwords
*
* @author Andreas Gohr <andi@splitbrain.org>
* @author Andreas Gohr <andi@splitbrain.org>
* @license LGPL2
*/
class PassHash {
@ -58,6 +58,12 @@ class PassHash {
} elseif(substr($hash, 0, 6) == '{SMD5}') {
$method = 'lsmd5';
$salt = substr(base64_decode(substr($hash, 6)), 16);
} elseif(preg_match('/^:B:(.+?):.{32}$/', $hash, $m)) {
$method = 'mediawiki';
$salt = $m[1];
} elseif(preg_match('/^\$6\$(.+?)\$/', $hash, $m)) {
$method = 'sha512';
$salt = $m[1];
} elseif($len == 32) {
$method = 'md5';
} elseif($len == 40) {
@ -101,14 +107,18 @@ class PassHash {
* Initialize the passed variable with a salt if needed.
*
* If $salt is not null, the value is kept, but the lenght restriction is
* applied.
* applied (unless, $cut is false).
*
* @param string &$salt The salt, pass null if you want one generated
* @param int $len The length of the salt
* @param int $len The length of the salt
* @param bool $cut Apply length restriction to existing salt?
*/
public function init_salt(&$salt, $len = 32) {
if(is_null($salt)) $salt = $this->gen_salt($len);
if(strlen($salt) > $len) $salt = substr($salt, 0, $len);
public function init_salt(&$salt, $len = 32, $cut = true) {
if(is_null($salt)) {
$salt = $this->gen_salt($len);
$cut = true; // for new hashes we alway apply length restriction
}
if(strlen($salt) > $len && $cut) $salt = substr($salt, 0, $len);
}
// Password hashing methods follow below
@ -263,7 +273,7 @@ class PassHash {
*
* This method was used by old MySQL systems
*
* @link http://www.php.net/mysql
* @link http://www.php.net/mysql
* @author <soren at byu dot edu>
* @param string $clear The clear text to hash
* @return string Hashed password
@ -327,9 +337,9 @@ class PassHash {
* an exception.
*
* @link http://www.openwall.com/phpass/
* @param string $clear The clear text to hash
* @param string $salt The salt to use, null for random
* @param string $magic The hash identifier (P or H)
* @param string $clear The clear text to hash
* @param string $salt The salt to use, null for random
* @param string $magic The hash identifier (P or H)
* @param int $compute The iteration count for new passwords
* @throws Exception
* @return string Hashed password
@ -430,8 +440,8 @@ class PassHash {
* will break. When no salt is given, the iteration count can be set
* through the $compute variable.
*
* @param string $clear The clear text to hash
* @param string $salt The salt to use, null for random
* @param string $clear The clear text to hash
* @param string $salt The salt to use, null for random
* @param int $compute The iteration count (between 4 and 31)
* @throws Exception
* @return string Hashed password
@ -450,4 +460,38 @@ class PassHash {
return crypt($clear, $salt);
}
/**
* Password hashing method SHA512
*
* This is only supported on PHP 5.3.2 or higher and will throw an exception if
* the needed crypt support is not available
*
* @param string $clear The clear text to hash
* @param string $salt The salt to use, null for random
* @return string Hashed password
* @throws Exception
*/
public function hash_sha512($clear, $salt = null) {
if(!defined('CRYPT_SHA512') || CRYPT_SHA512 != 1) {
throw new Exception('This PHP installation has no SHA512 support');
}
$this->init_salt($salt, 8, false);
return crypt($clear, '$6$'.$salt.'$');
}
/**
* Password hashing method 'mediawiki'
*
* Uses salted MD5, this is referred to as Method B in MediaWiki docs. Unsalted md5
* method 'A' is not supported.
*
* @link http://www.mediawiki.org/wiki/Manual_talk:User_table#user_password_column
* @param string $clear The clear text to hash
* @param string $salt The salt to use, null for random
* @return string Hashed password
*/
public function hash_mediawiki($clear, $salt = null) {
$this->init_salt($salt, 8, false);
return ':B:'.$salt.':'.md5($salt.'-'.md5($clear));
}
}

View File

@ -3,7 +3,7 @@
/**
* Increased whenever the API is changed
*/
define('DOKU_API_VERSION', 7);
define('DOKU_API_VERSION', 8);
class RemoteAPICore {
@ -48,7 +48,7 @@ class RemoteAPICore {
'public' => '1'
), 'dokuwiki.appendPage' => array(
'args' => array('string', 'string', 'array'),
'return' => 'int',
'return' => 'bool',
'doc' => 'Append text to a wiki page.'
), 'wiki.getPage' => array(
'args' => array('string'),
@ -102,7 +102,7 @@ class RemoteAPICore {
'name' => 'pageVersions'
), 'wiki.putPage' => array(
'args' => array('string', 'string', 'array'),
'return' => 'int',
'return' => 'bool',
'doc' => 'Saves a wiki page.'
), 'wiki.listLinks' => array(
'args' => array('string'),
@ -344,6 +344,8 @@ class RemoteAPICore {
for($i=0; $i<$len; $i++) {
unset($data[$i]['meta']);
$data[$i]['perms'] = $data[$i]['perm'];
unset($data[$i]['perm']);
$data[$i]['lastModified'] = $this->api->toDate($data[$i]['mtime']);
}
return $data;
@ -440,7 +442,7 @@ class RemoteAPICore {
// run the indexer if page wasn't indexed yet
idx_addPage($id);
return 0;
return true;
}
/**
@ -654,7 +656,9 @@ class RemoteAPICore {
if(count($revisions)>0 && $first==0) {
array_unshift($revisions, ''); // include current revision
array_pop($revisions); // remove extra log entry
if ( count($revisions) > $conf['recent'] ){
array_pop($revisions); // remove extra log entry
}
}
if(count($revisions) > $conf['recent']) {

File diff suppressed because one or more lines are too long

634
inc/Tar.class.php Normal file
View File

@ -0,0 +1,634 @@
<?php
/**
* This class allows the extraction of existing and the creation of new Unix TAR archives.
* To keep things simple, the modification of existing archives is not supported. It handles
* uncompressed, gzip and bzip2 compressed tar files.
*
* Long pathnames (>100 chars) are supported in POSIX ustar and GNU longlink formats.
*
* To list the contents of an existing TAR archive, open() it and use contents() on it:
*
* $tar = new Tar();
* $tar->open('myfile.tgz');
* $toc = $tar->contents();
* print_r($toc);
*
* To extract the contents of an existing TAR archive, open() it and use extract() on it:
*
* $tar = new Tar();
* $tar->open('myfile.tgz');
* $tar->extract('/tmp');
*
* To create a new TAR archive directly on the filesystem (low memory requirements), create() it,
* add*() files and close() it:
*
* $tar = new Tar();
* $tar->create('myfile.tgz');
* $tar->addFile(...);
* $tar->addData(...);
* ...
* $tar->close();
*
* To create a TAR archive directly in memory, create() it, add*() files and then either save()
* or getData() it:
*
* $tar = new Tar();
* $tar->create();
* $tar->addFile(...);
* $tar->addData(...);
* ...
* $tar->save('myfile.tgz'); // compresses and saves it
* echo $tar->getArchive(Tar::COMPRESS_GZIP); // compresses and returns it
*
* @author Andreas Gohr <andi@splitbrain.org>
* @author Bouchon <tarlib@bouchon.org> (Maxg)
* @license GPL 2
*/
class Tar {
const COMPRESS_AUTO = 0;
const COMPRESS_NONE = 1;
const COMPRESS_GZIP = 2;
const COMPRESS_BZIP = 3;
protected $file = '';
protected $comptype = Tar::COMPRESS_AUTO;
protected $fh;
protected $memory = '';
protected $closed = true;
protected $writeaccess = false;
/**
* Open an existing TAR file for reading
*
* @param string $file
* @param int $comptype
* @throws TarIOException
*/
public function open($file, $comptype = Tar::COMPRESS_AUTO) {
// determine compression
if($comptype == Tar::COMPRESS_AUTO) $comptype = $this->filetype($file);
$this->compressioncheck($comptype);
$this->comptype = $comptype;
$this->file = $file;
if($this->comptype === Tar::COMPRESS_GZIP) {
$this->fh = @gzopen($this->file, 'rb');
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
$this->fh = @bzopen($this->file, 'r');
} else {
$this->fh = @fopen($this->file, 'rb');
}
if(!$this->fh) throw new TarIOException('Could not open file for reading: '.$this->file);
$this->closed = false;
}
/**
* Read the contents of a TAR archive
*
* This function lists the files stored in the archive, and returns an indexed array of associative
* arrays containing for each file the following information:
*
* checksum Tar Checksum of the file
* filename The full name of the stored file (up to 100 c.)
* mode UNIX permissions in DECIMAL, not octal
* uid The Owner ID
* gid The Group ID
* size Uncompressed filesize
* mtime Timestamp of last modification
* typeflag Empty for files, set for folders
* link Is it a symlink?
* uname Owner name
* gname Group name
*
* The archive is closed afer reading the contents, because rewinding is not possible in bzip2 streams.
* Reopen the file with open() again if you want to do additional operations
*/
public function contents() {
if($this->closed || !$this->file) throw new TarIOException('Can not read from a closed archive');
$result = array();
while($read = $this->readbytes(512)) {
$header = $this->parseHeader($read);
if(!is_array($header)) continue;
$this->skipbytes(ceil($header['size'] / 512) * 512, 1);
$result[] = $header;
}
$this->close();
return $result;
}
/**
* Extract an existing TAR archive
*
* The $strip parameter allows you to strip a certain number of path components from the filenames
* found in the tar file, similar to the --strip-components feature of GNU tar. This is triggered when
* an integer is passed as $strip.
* Alternatively a fixed string prefix may be passed in $strip. If the filename matches this prefix,
* the prefix will be stripped. It is recommended to give prefixes with a trailing slash.
*
* By default this will extract all files found in the archive. You can restrict the output using the $include
* and $exclude parameter. Both expect a full regular expression (including delimiters and modifiers). If
* $include is set only files that match this expression will be extracted. Files that match the $exclude
* expression will never be extracted. Both parameters can be used in combination. Expressions are matched against
* stripped filenames as described above.
*
* The archive is closed afer reading the contents, because rewinding is not possible in bzip2 streams.
* Reopen the file with open() again if you want to do additional operations
*
* @param string $outdir the target directory for extracting
* @param int|string $strip either the number of path components or a fixed prefix to strip
* @param string $exclude a regular expression of files to exclude
* @param string $include a regular expression of files to include
* @throws TarIOException
* @return array
*/
function extract($outdir, $strip = '', $exclude = '', $include = '') {
if($this->closed || !$this->file) throw new TarIOException('Can not read from a closed archive');
$outdir = rtrim($outdir, '/');
io_mkdir_p($outdir);
$striplen = strlen($strip);
$extracted = array();
while($dat = $this->readbytes(512)) {
// read the file header
$header = $this->parseHeader($dat);
if(!is_array($header)) continue;
if(!$header['filename']) continue;
// strip prefix
$filename = $this->cleanPath($header['filename']);
if(is_int($strip)) {
// if $strip is an integer we strip this many path components
$parts = explode('/', $filename);
if(!$header['typeflag']) {
$base = array_pop($parts); // keep filename itself
} else {
$base = '';
}
$filename = join('/', array_slice($parts, $strip));
if($base) $filename .= "/$base";
} else {
// ifstrip is a string, we strip a prefix here
if(substr($filename, 0, $striplen) == $strip) $filename = substr($filename, $striplen);
}
// check if this should be extracted
$extract = true;
if(!$filename) {
$extract = false;
} else {
if($include) {
if(preg_match($include, $filename)) {
$extract = true;
} else {
$extract = false;
}
}
if($exclude && preg_match($exclude, $filename)) {
$extract = false;
}
}
// Now do the extraction (or not)
if($extract) {
$extracted[] = $header;
$output = "$outdir/$filename";
$directory = ($header['typeflag']) ? $output : dirname($output);
io_mkdir_p($directory);
// is this a file?
if(!$header['typeflag']) {
$fp = fopen($output, "wb");
if(!$fp) throw new TarIOException('Could not open file for writing: '.$output);
$size = floor($header['size'] / 512);
for($i = 0; $i < $size; $i++) {
fwrite($fp, $this->readbytes(512), 512);
}
if(($header['size'] % 512) != 0) fwrite($fp, $this->readbytes(512), $header['size'] % 512);
fclose($fp);
touch($output, $header['mtime']);
chmod($output, $header['perm']);
} else {
$this->skipbytes(ceil($header['size'] / 512) * 512); // the size is usually 0 for directories
}
} else {
$this->skipbytes(ceil($header['size'] / 512) * 512);
}
}
$this->close();
return $extracted;
}
/**
* Create a new TAR file
*
* If $file is empty, the tar file will be created in memory
*
* @param string $file
* @param int $comptype
* @param int $complevel
* @throws TarIOException
* @throws TarIllegalCompressionException
*/
public function create($file = '', $comptype = Tar::COMPRESS_AUTO, $complevel = 9) {
// determine compression
if($comptype == Tar::COMPRESS_AUTO) $comptype = $this->filetype($file);
$this->compressioncheck($comptype);
$this->comptype = $comptype;
$this->file = $file;
$this->memory = '';
$this->fh = 0;
if($this->file) {
if($this->comptype === Tar::COMPRESS_GZIP) {
$this->fh = @gzopen($this->file, 'wb'.$complevel);
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
$this->fh = @bzopen($this->file, 'w');
} else {
$this->fh = @fopen($this->file, 'wb');
}
if(!$this->fh) throw new TarIOException('Could not open file for writing: '.$this->file);
}
$this->writeaccess = false;
$this->closed = false;
}
/**
* Add a file to the current TAR archive using an existing file in the filesystem
*
* @todo handle directory adding
* @param string $file the original file
* @param string $name the name to use for the file in the archive
* @throws TarIOException
*/
public function addFile($file, $name = '') {
if($this->closed) throw new TarIOException('Archive has been closed, files can no longer be added');
if(!$name) $name = $file;
$name = $this->cleanPath($name);
$fp = fopen($file, 'rb');
if(!$fp) throw new TarIOException('Could not open file for reading: '.$file);
// create file header and copy all stat info from the original file
clearstatcache(false, $file);
$stat = stat($file);
$this->writeFileHeader(
$name,
$stat[4],
$stat[5],
fileperms($file),
filesize($file),
filemtime($file)
);
while(!feof($fp)) {
$packed = pack("a512", fread($fp, 512));
$this->writebytes($packed);
}
fclose($fp);
}
/**
* Add a file to the current TAR archive using the given $data as content
*
* @param string $name
* @param string $data
* @param int $uid
* @param int $gid
* @param int $perm
* @param int $mtime
* @throws TarIOException
*/
public function addData($name, $data, $uid = 0, $gid = 0, $perm = 0666, $mtime = 0) {
if($this->closed) throw new TarIOException('Archive has been closed, files can no longer be added');
$name = $this->cleanPath($name);
$len = strlen($data);
$this->writeFileHeader(
$name,
$uid,
$gid,
$perm,
$len,
($mtime) ? $mtime : time()
);
for($s = 0; $s < $len; $s += 512) {
$this->writebytes(pack("a512", substr($data, $s, 512)));
}
}
/**
* Add the closing footer to the archive if in write mode, close all file handles
*
* After a call to this function no more data can be added to the archive, for
* read access no reading is allowed anymore
*
* "Physically, an archive consists of a series of file entries terminated by an end-of-archive entry, which
* consists of two 512 blocks of zero bytes"
*
* @link http://www.gnu.org/software/tar/manual/html_chapter/tar_8.html#SEC134
*/
public function close() {
if($this->closed) return; // we did this already
// write footer
if($this->writeaccess) {
$this->writebytes(pack("a512", ""));
$this->writebytes(pack("a512", ""));
}
// close file handles
if($this->file) {
if($this->comptype === Tar::COMPRESS_GZIP) {
gzclose($this->fh);
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
bzclose($this->fh);
} else {
fclose($this->fh);
}
$this->file = '';
$this->fh = 0;
}
$this->closed = true;
}
/**
* Returns the created in-memory archive data
*
* This implicitly calls close() on the Archive
*/
public function getArchive($comptype = Tar::COMPRESS_AUTO, $complevel = 9) {
$this->close();
if($comptype === Tar::COMPRESS_AUTO) $comptype = $this->comptype;
$this->compressioncheck($comptype);
if($comptype === Tar::COMPRESS_GZIP) return gzcompress($this->memory, $complevel);
if($comptype === Tar::COMPRESS_BZIP) return bzcompress($this->memory);
return $this->memory;
}
/**
* Save the created in-memory archive data
*
* Note: It more memory effective to specify the filename in the create() function and
* let the library work on the new file directly.
*
* @param $file
* @param int $comptype
* @param int $complevel
* @throws TarIOException
*/
public function save($file, $comptype = Tar::COMPRESS_AUTO, $complevel = 9) {
if($comptype === Tar::COMPRESS_AUTO) $comptype = $this->filetype($file);
if(!file_put_contents($file, $this->getArchive($comptype, $complevel))) {
throw new TarIOException('Could not write to file: '.$file);
}
}
/**
* Read from the open file pointer
*
* @param int $length bytes to read
* @return string
*/
protected function readbytes($length) {
if($this->comptype === Tar::COMPRESS_GZIP) {
return @gzread($this->fh, $length);
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
return @bzread($this->fh, $length);
} else {
return @fread($this->fh, $length);
}
}
/**
* Write to the open filepointer or memory
*
* @param string $data
* @throws TarIOException
* @return int number of bytes written
*/
protected function writebytes($data) {
if(!$this->file) {
$this->memory .= $data;
$written = strlen($data);
} elseif($this->comptype === Tar::COMPRESS_GZIP) {
$written = @gzwrite($this->fh, $data);
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
$written = @bzwrite($this->fh, $data);
} else {
$written = @fwrite($this->fh, $data);
}
if($written === false) throw new TarIOException('Failed to write to archive stream');
return $written;
}
/**
* Skip forward in the open file pointer
*
* This is basically a wrapper around seek() (and a workaround for bzip2)
*
* @param int $bytes seek to this position
*/
function skipbytes($bytes) {
if($this->comptype === Tar::COMPRESS_GZIP) {
@gzseek($this->fh, $bytes, SEEK_CUR);
} elseif($this->comptype === Tar::COMPRESS_BZIP) {
// there is no seek in bzip2, we simply read on
@bzread($this->fh, $bytes);
} else {
@fseek($this->fh, $bytes, SEEK_CUR);
}
}
/**
* Write a file header
*
* @param string $name
* @param int $uid
* @param int $gid
* @param int $perm
* @param int $size
* @param int $mtime
* @param string $typeflag Set to '5' for directories
*/
protected function writeFileHeader($name, $uid, $gid, $perm, $size, $mtime, $typeflag = '') {
// handle filename length restrictions
$prefix = '';
$namelen = strlen($name);
if($namelen > 100) {
$file = basename($name);
$dir = dirname($name);
if(strlen($file) > 100 || strlen($dir) > 155) {
// we're still too large, let's use GNU longlink
$this->writeFileHeader('././@LongLink', 0, 0, 0, $namelen, 0, 'L');
for($s = 0; $s < $namelen; $s += 512) {
$this->writebytes(pack("a512", substr($name, $s, 512)));
}
$name = substr($name, 0, 100); // cut off name
} else {
// we're fine when splitting, use POSIX ustar
$prefix = $dir;
$name = $file;
}
}
// values are needed in octal
$uid = sprintf("%6s ", decoct($uid));
$gid = sprintf("%6s ", decoct($gid));
$perm = sprintf("%6s ", decoct($perm));
$size = sprintf("%11s ", decoct($size));
$mtime = sprintf("%11s", decoct($mtime));
$data_first = pack("a100a8a8a8a12A12", $name, $perm, $uid, $gid, $size, $mtime);
$data_last = pack("a1a100a6a2a32a32a8a8a155a12", $typeflag, '', 'ustar', '', '', '', '', '', $prefix, "");
for($i = 0, $chks = 0; $i < 148; $i++)
$chks += ord($data_first[$i]);
for($i = 156, $chks += 256, $j = 0; $i < 512; $i++, $j++)
$chks += ord($data_last[$j]);
$this->writebytes($data_first);
$chks = pack("a8", sprintf("%6s ", decoct($chks)));
$this->writebytes($chks.$data_last);
}
/**
* Decode the given tar file header
*
* @param string $block a 512 byte block containign the header data
* @return array|bool
*/
protected function parseHeader($block) {
if(!$block || strlen($block) != 512) return false;
for($i = 0, $chks = 0; $i < 148; $i++)
$chks += ord($block[$i]);
for($i = 156, $chks += 256; $i < 512; $i++)
$chks += ord($block[$i]);
$header = @unpack("a100filename/a8perm/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor/a155prefix", $block);
if(!$header) return false;
$return['checksum'] = OctDec(trim($header['checksum']));
if($return['checksum'] != $chks) return false;
$return['filename'] = trim($header['filename']);
$return['perm'] = OctDec(trim($header['perm']));
$return['uid'] = OctDec(trim($header['uid']));
$return['gid'] = OctDec(trim($header['gid']));
$return['size'] = OctDec(trim($header['size']));
$return['mtime'] = OctDec(trim($header['mtime']));
$return['typeflag'] = $header['typeflag'];
$return['link'] = trim($header['link']);
$return['uname'] = trim($header['uname']);
$return['gname'] = trim($header['gname']);
// Handle ustar Posix compliant path prefixes
if(trim($header['prefix'])) $return['filename'] = trim($header['prefix']).'/'.$return['filename'];
// Handle Long-Link entries from GNU Tar
if($return['typeflag'] == 'L') {
// following data block(s) is the filename
$filename = trim($this->readbytes(ceil($header['size'] / 512) * 512));
// next block is the real header
$block = $this->readbytes(512);
$return = $this->parseHeader($block);
// overwrite the filename
$return['filename'] = $filename;
}
return $return;
}
/**
* Cleans up a path and removes relative parts
*
* @param string $p_dir
* @return string
*/
protected function cleanPath($p_dir) {
$r = '';
if($p_dir) {
$subf = explode("/", $p_dir);
for($i = count($subf) - 1; $i >= 0; $i--) {
if($subf[$i] == ".") {
# do nothing
} elseif($subf[$i] == "..") {
$i--;
} elseif(!$subf[$i] && $i != count($subf) - 1 && $i) {
# do nothing
} else {
$r = $subf[$i].($i != (count($subf) - 1) ? "/".$r : "");
}
}
}
return $r;
}
/**
* Checks if the given compression type is available and throws an exception if not
*
* @param $comptype
* @throws TarIllegalCompressionException
*/
protected function compressioncheck($comptype) {
if($comptype === Tar::COMPRESS_GZIP && !function_exists('gzopen')) {
throw new TarIllegalCompressionException('No gzip support available');
}
if($comptype === Tar::COMPRESS_BZIP && !function_exists('bzopen')) {
throw new TarIllegalCompressionException('No bzip2 support available');
}
}
/**
* Guesses the wanted compression from the given filename extension
*
* You don't need to call this yourself. It's used when you pass Tar::COMPRESS_AUTO somewhere
*
* @param string $file
* @return int
*/
public function filetype($file) {
$file = strtolower($file);
if(substr($file, -3) == '.gz' || substr($file, -4) == '.tgz') {
$comptype = Tar::COMPRESS_GZIP;
} elseif(substr($file, -4) == '.bz2' || substr($file, -4) == '.tbz') {
$comptype = Tar::COMPRESS_BZIP;
} else {
$comptype = Tar::COMPRESS_NONE;
}
return $comptype;
}
}
class TarIOException extends Exception {
}
class TarIllegalCompressionException extends Exception {
}

View File

@ -1,71 +1,14 @@
<?php
/**
* TAR format class - Creates TAR archives
*
* This class is part or the MaxgComp suite and originally named
* MaxgTar class.
*
* Modified for Dokuwiki
*
* @license LGPL-2.1
* @link http://docs.maxg.info
* @author Bouchon <tarlib@bouchon.org> (Maxg)
* @author Christopher Smith <chris@jalakai.co.uk>
*/
/**
* Those constants represent the compression method to use.
* COMPRESS_GZIP is used for the GZIP compression; COMPRESS_BZIP for
* BZIP2 and COMPRESS_NONE for no compression.
* This is a compatibility wrapper around the new Tar class
*
* On the other hand, COMPRESS_AUTO is a bit harder. It will first check
* if the zlib extensions are loaded.
* If it is, GZIP will be used. Else it will check if the bz2 extensions
* are loaded. If it is, BZIP2 will be used. Else no compression will be
* performed.
* Use of this library is strongly discouraged. Only basic extraction is wrapped,
* everything else will fail.
*
* You can then use getCompression() to know the compression chosen.
*
* If you selected a compression which can't be used (i.e extension not
* present), it will be just disabled, and won't produce any error !
* As a consequence, getCompression() will return COMPRESS_NONE
*
* ARCHIVE_DYNAMIC can be passed as the first argument of the constructor, to
* create an archive in memory instead of a file. See also: MaxgTar(),
* getDynamicArchive() and writeArchive()
*
* ARCHIVE_RENAMECOMP is a flag that can be multiplied by the compression method
* (i.e COMPRESS_AUTO * ARCHIVE_RENAMECOMP). This will add the correct extension
* to the archive name, which is useful with COMPRESS_AUTO, ie .bz2 if you gave
* COMPRESS_BZIP. See also getCompression(TRUE) which does exactly the
* same
*
* COMPRESS_DETECT does exactly the opposite and try to detect the
* compression to use to read the archive depending on its extension. (i.e if
* the archive ends with .tar.gz TarLib will try to decompress it with
* GZIP). See also setCompression()
*
* FULL_ARCHIVE is a -1 constant that means "the complete archive" when
* extracting. This is explained in Extract()
* @deprecated 2012-11-06
*/
#define('COMPRESS_GZIP',1);
#define('COMPRESS_BZIP',2);
#define('COMPRESS_AUTO',3);
#define('COMPRESS_NONE',0);
#define('TARLIB_VERSION','1.2');
#define('FULL_ARCHIVE',-1);
#define('ARCHIVE_DYNAMIC',0);
#define('ARCHIVE_RENAMECOMP',5);
#define('COMPRESS_DETECT',-1);
class TarLib {
var $_comptype;
var $_compzlevel;
var $_fp;
var $_memdat;
var $_nomf;
var $_result;
var $_initerror;
const COMPRESS_GZIP = 1;
const COMPRESS_BZIP = 2;
@ -77,845 +20,68 @@ class TarLib {
const ARCHIVE_RENAMECOMP = 5;
const COMPRESS_DETECT = -1;
/**
* constructor, initialize the class
*
* The constructor initialize the variables and prepare the class for the
* archive, and return the object created. Note that you can use multiple
* instances of the MaxgTar class, if you call this function another time and
* store the object in an other variable.
*
* In fact, MaxgTar accepts the following arguments (all are optional) :
*
* filename can be either a file name (absolute or relative). In this
* case, it can be used both for reading and writing. You can also open
* remote archive if you add a protocole name at the beginning of the file
* (ie https://host.dom/archive.tar.gz), but for reading only and if the
* directive allow_url_fopen is enabled in PHP.INI (this can be checked with
* TarInfo()). If you pass a file that doesn't exist, the script
* will try to create it. If the archive already exists and contains files,
* you can use Add() to append files.But by default this parameter
* is ARCHIVE_DYNAMIC (write only) so the archive is created in memory and
* can be sent to a file [writeArchive()] or to the client
* [sendClient()]
*
* compression_type should be a constant that represents a type of
* compression, or its integer value. The different values are described in
* the constants.
*
* compression_level is an integer between 1 and 9 (by default) an
* represent the GZIP or BZIP compression level. 1 produce fast compression,
* and 9 produce smaller files. See the RFC 1952 for more infos.
*/
function __construct($p_filen = TarLib::ARCHIVE_DYNAMIC, $p_comptype = TarLib::COMPRESS_AUTO, $p_complevel = 9) {
$this->_initerror = 0;
$this->_nomf = $p_filen;
$flag = 0;
if($p_comptype && $p_comptype % 5 == 0) {
$p_comptype /= TarLib::ARCHIVE_RENAMECOMP;
$flag = 1;
}
private $file = '';
private $tar;
if($p_complevel > 0 && $p_complevel <= 9) $this->_compzlevel = $p_complevel;
else $this->_compzlevel = 9;
public $_result = true;
if($p_comptype == TarLib::COMPRESS_DETECT) {
if(strtolower(substr($p_filen, -3)) == '.gz') $p_comptype = TarLib::COMPRESS_GZIP;
elseif(strtolower(substr($p_filen, -4)) == '.bz2') $p_comptype = TarLib::COMPRESS_BZIP;
else $p_comptype = TarLib::COMPRESS_NONE;
}
switch($p_comptype) {
case TarLib::COMPRESS_GZIP:
if(!extension_loaded('zlib')) $this->_initerror = -1;
$this->_comptype = TarLib::COMPRESS_GZIP;
break;
case TarLib::COMPRESS_BZIP:
if(!extension_loaded('bz2')) $this->_initerror = -2;
$this->_comptype = TarLib::COMPRESS_BZIP;
break;
function __construct($file, $comptype = TarLib::COMPRESS_AUTO, $complevel = 9) {
if(!$file) $this->error('__construct', '$file');
$this->file = $file;
switch($comptype) {
case TarLib::COMPRESS_AUTO:
if(extension_loaded('zlib'))
$this->_comptype = TarLib::COMPRESS_GZIP;
elseif(extension_loaded('bz2'))
$this->_comptype = TarLib::COMPRESS_BZIP;
else
$this->_comptype = TarLib::COMPRESS_NONE;
case TarLib::COMPRESS_DETECT:
$comptype = Tar::COMPRESS_AUTO;
break;
case TarLib::COMPRESS_GZIP:
$comptype = Tar::COMPRESS_GZIP;
break;
case TarLib::COMPRESS_BZIP:
$comptype = Tar::COMPRESS_BZIP;
break;
default:
$this->_comptype = TarLib::COMPRESS_NONE;
$comptype = Tar::COMPRESS_NONE;
}
if($this->_initerror < 0) $this->_comptype = TarLib::COMPRESS_NONE;
$this->complevel = $complevel;
if($flag) $this->_nomf .= '.'.$this->getCompression(1);
$this->_result = true;
}
/**
* Recycle a TAR object.
*
* This function does exactly the same as TarLib (constructor), except it
* returns a status code.
*/
function setArchive($p_name = '', $p_comp = TarLib::COMPRESS_AUTO, $p_level = 9) {
$this->_CompTar();
$this->__construct($p_name, $p_comp, $p_level);
return $this->_result;
}
/**
* Get the compression used to generate the archive
*
* This is a very useful function when you're using dynamical archives.
* Besides, if you let the script chose which compression to use, you'll have
* a problem when you'll want to send it to the client if you don't know
* which compression was used.
*
* There are two ways to call this function : if you call it without argument
* or with FALSE, it will return the compression constants, explained on the
* MaxgTar Constants. If you call it with GetExtension on TRUE it will
* return the extension without starting dot (ie "tar" or "tar.bz2" or
* "tar.gz")
*
* NOTE: This can be done with the flag ARCHIVE_RENAMECOMP, see the
* MaxgTar Constants
*/
function getCompression($ext = false) {
$exts = Array('tar', 'tar.gz', 'tar.bz2');
if($ext) return $exts[$this->_comptype];
return $this->_comptype;
}
/**
* Change the compression mode.
*
* This function will change the compression methode to read or write
* the archive. See the MaxgTar Constants to see which constants you can use.
* It may look strange, but it returns the GZIP compression level.
*/
function setCompression($p_comp = TarLib::COMPRESS_AUTO) {
$this->setArchive($this->_nomf, $p_comp, $this->_compzlevel);
return $this->_compzlevel;
}
/**
* Returns the compressed dynamic archive.
*
* When you're working with dynamic archives, use this function to grab
* the final compressed archive in a string ready to be put in a SQL table or
* in a file.
*/
function getDynamicArchive() {
return $this->_encode($this->_memdat);
}
/**
* Write a dynamical archive into a file
*
* This function attempts to write a dynamicaly-genrated archive into
* TargetFile on the webserver. It returns a TarErrorStr() status
* code.
*
* To know the extension to add to the file if you're using AUTO_DETECT
* compression, you can use getCompression().
*/
function writeArchive($p_archive) {
if(!$this->_memdat) return -7;
$fp = @fopen($p_archive, 'wb');
if(!$fp) return -6;
fwrite($fp, $this->_memdat);
fclose($fp);
return true;
}
/**
* Send a TAR archive to the client browser.
*
* This function will send an archive to the client, and return a status
* code, but can behave differently depending on the arguments you give. All
* arguments are optional.
*
* ClientName is used to specify the archive name to give to the browser. If
* you don't give one, it will send the constructor filename or return an
* error code in case of dynamical archive.
*
* FileName is optional and used to send a specific archive. Leave it blank
* to send dynamical archives or the current working archive.
*
* If SendHeaders is enabled (by default), the library will send the HTTP
* headers itself before it sends the contents. This headers are :
* Content-Type, Content-Disposition, Content-Length and Accept-Range.
*
* Please note that this function DOES NOT stops the script so don't forget
* to exit() to avoid your script sending other data and corrupt the archive.
* Another note : for AUTO_DETECT dynamical archives you can know the
* extension to add to the name with getCompression()
*/
function sendClient($name = '', $archive = '', $headers = true) {
if(!$name && !$this->_nomf) return -9;
if(!$archive && !$this->_memdat) return -10;
if(!$name) $name = utf8_basename($this->_nomf);
if($archive) {
if(!file_exists($archive)) return -11;
try {
$this->tar = new Tar();
$this->tar->open($file, $comptype);
} catch(Exception $e) {
$this->_result = false;
}
$decoded = $this->getDynamicArchive();
if($headers) {
header('Content-Type: application/x-gtar');
header('Content-Disposition: attachment; filename='.utf8_basename($name));
header('Accept-Ranges: bytes');
header('Content-Length: '.($archive ? filesize($archive) : strlen($decoded)));
}
if($archive) {
$fp = @fopen($archive, 'rb');
if(!$fp) return -4;
while(!feof($fp)) echo fread($fp, 2048);
} else {
echo $decoded;
}
return true;
}
/**
* Extract part or totality of the archive.
*
* This function can extract files from an archive, and returns then a
* status codes that can be converted with TarErrorStr() into a
* human readable message.
*
* Only the first argument is required, What and it can be either the
* constant FULL_ARCHIVE or an indexed array containing each file you want to
* extract.
*
* To contains the target folder to extract the archive. It is optional and
* the default value is '.' which means the current folder. If the target
* folder doesn't exist, the script attempts to create it and give it
* permissions 0777 by default.
*
* RemovePath is very usefull when you want to extract files from a subfoler
* in the archive to a root folder. For instance, if you have a file in the
* archive called some/sub/folder/test.txt and you want to extract it to the
* script folder, you can call Extract with To = '.' and RemovePath =
* 'some/sub/folder/'
*
* FileMode is optional and its default value is 0755. It is in fact the UNIX
* permission in octal mode (prefixed with a 0) that will be given on each
* extracted file.
*/
function Extract($p_what = TarLib::FULL_ARCHIVE, $p_to = '.', $p_remdir = '', $p_mode = 0755) {
if(!$this->_OpenRead()) return -4;
// if(!@is_dir($p_to)) if(!@mkdir($p_to, 0777)) return -8; --CS
if(!@is_dir($p_to)) if(!$this->_dirApp($p_to)) return -8; //--CS (route through correct dir fn)
if($p_what != TarLib::FULL_ARCHIVE) {
$this->error('Extract', 'Ep_what');
return 0;
}
$ok = $this->_extractList($p_to, $p_what, $p_remdir, $p_mode);
$this->_CompTar();
return $ok;
try {
$this->tar->extract($p_to, $p_remdir);
} catch(Exception $e) {
return 0;
}
return 1;
}
/**
* Create a new package with the given files
*
* This function will attempt to create a new archive with global headers
* then add the given files into. If the archive is a real file, the
* contents are written directly into the file. If it is a dynamic archive,
* contents are only stored in memory. This function should not be used to
* add files to an existing archive, you should use Add() instead.
*
* The FileList actually supports three different modes:
*
* - You can pass a string containing filenames separated by pipes '|'.
* In this case thes file are read from the filesystem and the root folder
* is the folder running script located. NOT RECOMMENDED
*
* - You can also give an indexed array containing the filenames. The
* behaviour for the content reading is the same as above.
*
* - You can pass an array of arrays. For each file use an array where the
* first element contains the filename and the second contains the file
* contents. You can even add empty folders to the package if the filename
* has a leading '/'. Once again, have a look at the exemples to understand
* better.
*
* Note you can also give arrays with both dynamic contents and static files.
*
* The optional parameter RemovePath can be used to delete a part of the tree
* of the filename you're adding, for instance if you're adding in the root
* of a package a file that is stored somewhere in the server tree.
*
* On the contrary the parameter AddPath can be used to add a prefix folder
* to the file you store. Note also that the RemovePath is applied before the
* AddPath is added, so it HAS a sense to use both parameters together.
*/
function Create($p_filelist, $p_add = '', $p_rem = '') {
if(!$fl = $this->_fetchFilelist($p_filelist)) return -5;
if(!$this->_OpenWrite()) return -6;
function error($func, $param = '') {
$error = 'TarLib is deprecated and should no longer be used.';
$ok = $this->_addFileList($fl, $p_add, $p_rem);
if($ok) {
$this->_writeFooter();
if($param) {
$error .= "In this compatibility wrapper, the function '$func' does not accept your value for".
"the parameter '$param' anymore.";
} else {
$this->_CompTar();
@unlink($this->_nomf);
$error .= "The function '$func' no longer exists in this compatibility wrapper.";
}
return $ok;
msg($error, -1);
}
/**
* Add files to an existing package.
*
* This function does exactly the same as Create() exept it
* will append the given files at the end of the archive.
*
* Note: This is only supported for dynamic in memory files and uncompressed
* tar files
*
* This function returns a status code, you can use TarErrorStr() on
* it to get the human-readable description of the error.
*/
function Add($p_filelist, $p_add = '', $p_rem = '') {
if($this->_nomf !== TarLib::ARCHIVE_DYNAMIC &&
$this->_comptype !== TarLib::COMPRESS_NONE
) {
return -12;
}
if(($this->_nomf !== TarLib::ARCHIVE_DYNAMIC && !$this->_fp) ||
($this->_nomf === TarLib::ARCHIVE_DYNAMIC && !$this->_memdat)
) {
return $this->Create($p_filelist, $p_add, $p_rem);
}
if(!$fl = $this->_fetchFilelist($p_filelist)) return -5;
return $this->_append($fl, $p_add, $p_rem);
function __call($name, $arguments) {
$this->error($name);
}
/**
* Read the contents of a TAR archive
*
* This function attempts to get the list of the files stored in the
* archive, and return either an error code or an indexed array of
* associative array containing for each file the following information :
*
* checksum Tar Checksum of the file
* filename The full name of the stored file (up to 100 c.)
* mode UNIX permissions in DECIMAL, not octal
* uid The Owner ID
* gid The Group ID
* size Uncompressed filesize
* mtime Timestamp of last modification
* typeflag Empty for files, set for folders
* link For the links, did you guess it ?
* uname Owner name
* gname Group name
*/
function ListContents() {
if(!$this->_nomf) return -3;
if(!$this->_OpenRead()) return -4;
$result = Array();
while($dat = $this->_read(512)) {
$dat = $this->_readHeader($dat);
if(!is_array($dat)) continue;
$this->_seek(ceil($dat['size'] / 512) * 512, 1);
$result[] = $dat;
}
return $result;
}
/**
* Convert a status code into a human readable message
*
* Some MaxgTar functions like Create(), Add() ... return numerical
* status code. You can pass them to this function to grab their english
* equivalent.
*/
function TarErrorStr($i) {
$ecodes = Array(
1 => true,
0 => "Undocumented error",
-1 => "Can't use COMPRESS_GZIP compression : ZLIB extensions are not loaded !",
-2 => "Can't use COMPRESS_BZIP compression : BZ2 extensions are not loaded !",
-3 => "You must set a archive file to read the contents !",
-4 => "Can't open the archive file for read !",
-5 => "Invalide file list !",
-6 => "Can't open the archive in write mode !",
-7 => "There is no ARCHIVE_DYNAMIC to write !",
-8 => "Can't create the directory to extract files !",
-9 => "Please pass a archive name to send if you made created an ARCHIVE_DYNAMIC !",
-10 => "You didn't pass an archive filename and there is no stored ARCHIVE_DYNAMIC !",
-11 => "Given archive doesn't exist !",
-12 => "Appending not supported for compressed files"
);
return isset($ecodes[$i]) ? $ecodes[$i] : $ecodes[0];
}
/**
* Seek in the data stream
*
* @todo probably broken for bzip tars
* @param int $p_flen seek to this position
* @param bool $tell seek from current position?
*/
function _seek($p_flen, $tell = false) {
if($this->_nomf === TarLib::ARCHIVE_DYNAMIC)
$this->_memdat = substr($this->_memdat, 0, ($tell ? strlen($this->_memdat) : 0) + $p_flen);
elseif($this->_comptype == TarLib::COMPRESS_GZIP)
@gzseek($this->_fp, ($tell ? @gztell($this->_fp) : 0) + $p_flen);
elseif($this->_comptype == TarLib::COMPRESS_BZIP)
@fseek($this->_fp, ($tell ? @ftell($this->_fp) : 0) + $p_flen);
else
@fseek($this->_fp, ($tell ? @ftell($this->_fp) : 0) + $p_flen);
}
/**
* Open the archive for reading
*
* @return bool true if succesfull
*/
function _OpenRead() {
if($this->_comptype == TarLib::COMPRESS_GZIP)
$this->_fp = @gzopen($this->_nomf, 'rb');
elseif($this->_comptype == TarLib::COMPRESS_BZIP)
$this->_fp = @bzopen($this->_nomf, 'rb');
else
$this->_fp = @fopen($this->_nomf, 'rb');
return ($this->_fp ? true : false);
}
/**
* Open the archive for writing
*
* @param string $add filemode
* @return bool true on success
*/
function _OpenWrite($add = 'w') {
if($this->_nomf === TarLib::ARCHIVE_DYNAMIC) return true;
if($this->_comptype == TarLib::COMPRESS_GZIP)
$this->_fp = @gzopen($this->_nomf, $add.'b'.$this->_compzlevel);
elseif($this->_comptype == TarLib::COMPRESS_BZIP)
$this->_fp = @bzopen($this->_nomf, $add.'b');
else
$this->_fp = @fopen($this->_nomf, $add.'b');
return ($this->_fp ? true : false);
}
/**
* Closes the open file pointer
*/
function _CompTar() {
if($this->_nomf === TarLib::ARCHIVE_DYNAMIC || !$this->_fp) return;
if($this->_comptype == TarLib::COMPRESS_GZIP) @gzclose($this->_fp);
elseif($this->_comptype == TarLib::COMPRESS_BZIP) @bzclose($this->_fp);
else @fclose($this->_fp);
}
/**
* Read from the open file pointer
*
* @param int $p_len bytes to read
* @return string
*/
function _read($p_len) {
if($this->_comptype == TarLib::COMPRESS_GZIP)
return @gzread($this->_fp, $p_len);
elseif($this->_comptype == TarLib::COMPRESS_BZIP)
return @bzread($this->_fp, $p_len);
else
return @fread($this->_fp, $p_len);
}
/**
* Write to the open filepointer or memory
*
* @param string $p_data
* @return int
*/
function _write($p_data) {
if($this->_nomf === TarLib::ARCHIVE_DYNAMIC) {
$this->_memdat .= $p_data;
return strlen($p_data);
} elseif($this->_comptype == TarLib::COMPRESS_GZIP) {
return @gzwrite($this->_fp, $p_data);
} elseif($this->_comptype == TarLib::COMPRESS_BZIP) {
return @bzwrite($this->_fp, $p_data);
} else {
return @fwrite($this->_fp, $p_data);
}
}
/**
* Compress given data according to the set compression method
*
* @param $p_dat
* @return string
*/
function _encode($p_dat) {
if($this->_comptype == TarLib::COMPRESS_GZIP)
return gzencode($p_dat, $this->_compzlevel);
elseif($this->_comptype == TarLib::COMPRESS_BZIP)
return bzcompress($p_dat, $this->_compzlevel);
else return $p_dat;
}
/**
* Decode the given tar file header
*
* @param $p_dat
* @return array|bool
*/
function _readHeader($p_dat) {
if(!$p_dat || strlen($p_dat) != 512) return false;
for($i = 0, $chks = 0; $i < 148; $i++)
$chks += ord($p_dat[$i]);
for($i = 156, $chks += 256; $i < 512; $i++)
$chks += ord($p_dat[$i]);
$headers = @unpack("a100filename/a8mode/a8uid/a8gid/a12size/a12mtime/a8checksum/a1typeflag/a100link/a6magic/a2version/a32uname/a32gname/a8devmajor/a8devminor", $p_dat);
if(!$headers) return false;
$return['checksum'] = OctDec(trim($headers['checksum']));
if($return['checksum'] != $chks) return false;
$return['filename'] = trim($headers['filename']);
$return['mode'] = OctDec(trim($headers['mode']));
$return['uid'] = OctDec(trim($headers['uid']));
$return['gid'] = OctDec(trim($headers['gid']));
$return['size'] = OctDec(trim($headers['size']));
$return['mtime'] = OctDec(trim($headers['mtime']));
$return['typeflag'] = $headers['typeflag'];
$return['link'] = trim($headers['link']);
$return['uname'] = trim($headers['uname']);
$return['gname'] = trim($headers['gname']);
return $return;
}
/**
* Builds a normalized file list
*
* @todo remove string support, use saner format
*
* @param $p_filelist
* @return array|bool
*/
function _fetchFilelist($p_filelist) {
if(!$p_filelist || (is_array($p_filelist) && !@count($p_filelist))) return false;
if(is_string($p_filelist)) {
$p_filelist = explode('|', $p_filelist);
if(!is_array($p_filelist)) $p_filelist = Array($p_filelist);
}
return $p_filelist;
}
/**
* Adds files given as file list
*
* @param array $p_fl
* @param string $p_addir
* @param string $p_remdir
* @return bool
*/
function _addFileList($p_fl, $p_addir, $p_remdir) {
foreach($p_fl as $file) {
if(($file == $this->_nomf && $this->_nomf !== TarLib::ARCHIVE_DYNAMIC) || !$file || (!is_array($file) && !file_exists($file)))
continue;
if(!$this->_addFile($file, $p_addir, $p_remdir))
continue;
if(@is_dir($file)) {
$d = @opendir($file);
if(!$d) continue;
readdir($d);
readdir($d);
while($f = readdir($d)) {
if($file != ".") $tmplist[0] = "$file/$f";
else $tmplist[0] = $d;
$this->_addFileList($tmplist, $p_addir, $p_remdir);
}
closedir($d);
unset($tmplist, $f);
}
}
return true;
}
/**
* Adds a single file
*
* @param array|string $p_fn
* @param string $p_addir
* @param string $p_remdir
* @return bool
*/
function _addFile($p_fn, $p_addir = '', $p_remdir = '') {
$data = false;
if(is_array($p_fn)) list($p_fn, $data) = $p_fn;
$sname = $p_fn;
if($p_remdir) {
if(substr($p_remdir, -1) != '/') $p_remdir .= "/";
if(substr($sname, 0, strlen($p_remdir)) == $p_remdir)
$sname = substr($sname, strlen($p_remdir));
}
if($p_addir) $sname = $p_addir.(substr($p_addir, -1) == '/' ? '' : "/").$sname;
// FIXME ustar should support up 256 chars
if(strlen($sname) > 99) return false;
if(@is_dir($p_fn)) {
if(!$this->_writeFileHeader($p_fn, $sname)) return false;
} else {
if(!$data) {
$fp = fopen($p_fn, 'rb');
if(!$fp) return false;
}
if(!$this->_writeFileHeader($p_fn, $sname, ($data ? strlen($data) : false))) return false;
if(!$data) {
while(!feof($fp)) {
$packed = pack("a512", fread($fp, 512));
$this->_write($packed);
}
fclose($fp);
} else {
$len = strlen($data);
for($s = 0; $s < $len; $s += 512) {
$this->_write(pack("a512", substr($data, $s, 512)));
}
}
}
return true;
}
/**
* Write the header for a file in the TAR archive
*
* @param string $p_file
* @param string $p_sname
* @param bool $p_data
* @return bool
*/
function _writeFileHeader($p_file, $p_sname, $p_data = false) {
if(!$p_data) {
if(!$p_sname) $p_sname = $p_file;
$p_sname = $this->_pathTrans($p_sname);
$h_info = stat($p_file);
$h[0] = sprintf("%6s ", DecOct($h_info[4]));
$h[] = sprintf("%6s ", DecOct($h_info[5]));
$h[] = sprintf("%6s ", DecOct(fileperms($p_file)));
clearstatcache();
$h[] = sprintf("%11s ", DecOct(filesize($p_file)));
$h[] = sprintf("%11s", DecOct(filemtime($p_file)));
$dir = @is_dir($p_file) ? '5' : '';
} else {
$dir = '';
$p_data = sprintf("%11s ", DecOct($p_data));
$time = sprintf("%11s ", DecOct(time()));
$h = Array(" 0 ", " 0 ", " 40777 ", $p_data, $time);
}
$data_first = pack("a100a8a8a8a12A12", $p_sname, $h[2], $h[0], $h[1], $h[3], $h[4]);
$data_last = pack("a1a100a6a2a32a32a8a8a155a12", $dir, '', '', '', '', '', '', '', '', "");
for($i = 0, $chks = 0; $i < 148; $i++)
$chks += ord($data_first[$i]);
for($i = 156, $chks += 256, $j = 0; $i < 512; $i++, $j++)
$chks += ord($data_last[$j]);
$this->_write($data_first);
$chks = pack("a8", sprintf("%6s ", DecOct($chks)));
$this->_write($chks.$data_last);
return true;
}
/**
* Append the given files to the already open archive
*
* @param array $p_filelist
* @param string $p_addir
* @param string $p_remdir
* @return bool|int
*/
function _append($p_filelist, $p_addir = "", $p_remdir = "") {
if(!$this->_fp) if(!$this->_OpenWrite('a')) return -6;
if($this->_nomf === TarLib::ARCHIVE_DYNAMIC) {
$this->_memdat = substr($this->_memdat, 0, -512 * 2); // remove footer
} else {
clearstatcache();
$s = filesize($this->_nomf);
$this->_seek($s - (512 * 2)); // remove footer
}
$ok = $this->_addFileList($p_filelist, $p_addir, $p_remdir);
$this->_writeFooter();
return $ok;
}
/**
* Cleans up a path and removes relative parts
*
* @param string $p_dir
* @return string
*/
function _pathTrans($p_dir) {
$r = '';
if($p_dir) {
$subf = explode("/", $p_dir);
for($i = count($subf) - 1; $i >= 0; $i--) {
if($subf[$i] == ".") {
# do nothing
} elseif($subf[$i] == "..") {
$i--;
} elseif(!$subf[$i] && $i != count($subf) - 1 && $i) {
# do nothing
} else {
$r = $subf[$i].($i != (count($subf) - 1) ? "/".$r : "");
}
}
}
return $r;
}
/**
* Add the closing footer to the archive
*
* Physically, an archive consists of a series of file entries terminated by an end-of-archive entry, which
* consists of two 512 blocks of zero bytes
*
* @link http://www.gnu.org/software/tar/manual/html_chapter/tar_8.html#SEC134
*/
function _writeFooter() {
$this->_write(pack("a512", ""));
$this->_write(pack("a512", ""));
}
/**
* @param $p_to
* @param $p_files
* @param $p_remdir
* @param int $p_mode
* @return array|bool|int|string
*/
function _extractList($p_to, $p_files, $p_remdir, $p_mode = 0755) {
if(!$p_to || ($p_to[0] != "/" && substr($p_to, 0, 3) != "../" && substr($p_to, 1, 3) != ":\\" && substr($p_to, 1, 2) != ":/")) /*" // <- PHP Coder bug */
$p_to = "./$p_to";
if($p_remdir && substr($p_remdir, -1) != '/') $p_remdir .= '/';
$p_remdirs = strlen($p_remdir);
while($dat = $this->_read(512)) {
$headers = $this->_readHeader($dat);
if(!$headers['filename']) continue;
if($p_files == -1 || $p_files[0] == -1) {
$extract = true;
} else {
$extract = false;
foreach($p_files as $f) {
if(substr($f, -1) == "/") {
if((strlen($headers['filename']) > strlen($f)) && (substr($headers['filename'], 0, strlen($f)) == $f)) {
$extract = true;
break;
}
} elseif($f == $headers['filename']) {
$extract = true;
break;
}
}
}
if($extract) {
$det[] = $headers;
if($p_remdir && substr($headers['filename'], 0, $p_remdirs) == $p_remdir)
$headers['filename'] = substr($headers['filename'], $p_remdirs);
if($headers['filename'].'/' == $p_remdir && $headers['typeflag'] == '5') continue;
if($p_to != "./" && $p_to != "/") {
while($p_to{-1} == "/") $p_to = substr($p_to, 0, -1);
if($headers['filename']{0} == "/")
$headers['filename'] = $p_to.$headers['filename'];
else
$headers['filename'] = $p_to."/".$headers['filename'];
}
$ok = $this->_dirApp($headers['typeflag'] == "5" ? $headers['filename'] : dirname($headers['filename']));
if($ok < 0) return $ok;
if(!$headers['typeflag']) {
if(!$fp = @fopen($headers['filename'], "wb")) return -6;
$n = floor($headers['size'] / 512);
for($i = 0; $i < $n; $i++) {
fwrite($fp, $this->_read(512), 512);
}
if(($headers['size'] % 512) != 0) fwrite($fp, $this->_read(512), $headers['size'] % 512);
fclose($fp);
touch($headers['filename'], $headers['mtime']);
chmod($headers['filename'], $p_mode);
} else {
$this->_seek(ceil($headers['size'] / 512) * 512, 1);
}
} else $this->_seek(ceil($headers['size'] / 512) * 512, 1);
}
return $det;
}
/**
* Create a directory hierarchy in filesystem
*
* @param string $d
* @return bool
*/
function _dirApp($d) {
// map to dokuwiki function (its more robust)
return io_mkdir_p($d);
}
}
}

View File

@ -711,21 +711,28 @@ function act_subscription($act){
$target = $params['target'];
$style = $params['style'];
$data = $params['data'];
$action = $params['action'];
// Perform action.
if (!subscription_set($_SERVER['REMOTE_USER'], $target, $style, $data)) {
$sub = new Subscription();
if($action == 'unsubscribe'){
$ok = $sub->remove($target, $_SERVER['REMOTE_USER'], $style);
}else{
$ok = $sub->add($target, $_SERVER['REMOTE_USER'], $style);
}
if($ok) {
msg(sprintf($lang["subscr_{$action}_success"], hsc($INFO['userinfo']['name']),
prettyprint_id($target)), 1);
act_redirect($ID, $act);
} else {
throw new Exception(sprintf($lang["subscr_{$action}_error"],
hsc($INFO['userinfo']['name']),
prettyprint_id($target)));
}
msg(sprintf($lang["subscr_{$action}_success"], hsc($INFO['userinfo']['name']),
prettyprint_id($target)), 1);
act_redirect($ID, $act);
// Assure that we have valid data if act_redirect somehow fails.
$INFO['subscribed'] = get_info_subscribed();
$INFO['subscribed'] = $sub->user_subscription();
return 'show';
}
@ -777,8 +784,7 @@ function subscription_handle_post(&$params) {
$style = null;
}
$data = in_array($style, array('list', 'digest')) ? time() : null;
$params = compact('target', 'style', 'data', 'action');
$params = compact('target', 'style', 'action');
}
//Setup VIM: ex: et ts=2 :

View File

@ -536,9 +536,10 @@ function auth_aclcheck($id, $user, $groups) {
return AUTH_ADMIN;
}
$ci = '';
if(!$auth->isCaseSensitive()) $ci = 'ui';
if(!$auth->isCaseSensitive()) {
$user = utf8_strtolower($user);
$groups = array_map('utf8_strtolower', $groups);
}
$user = $auth->cleanUser($user);
$groups = array_map(array($auth, 'cleanGroup'), (array) $groups);
$user = auth_nameencode($user);
@ -562,11 +563,14 @@ function auth_aclcheck($id, $user, $groups) {
}
//check exact match first
$matches = preg_grep('/^'.preg_quote($id, '/').'\s+(\S+)\s+/'.$ci, $AUTH_ACL);
$matches = preg_grep('/^'.preg_quote($id, '/').'\s+(\S+)\s+/u', $AUTH_ACL);
if(count($matches)) {
foreach($matches as $match) {
$match = preg_replace('/#.*$/', '', $match); //ignore comments
$acl = preg_split('/\s+/', $match);
if(!$auth->isCaseSensitive() && $acl[1] !== '@ALL') {
$acl[1] = utf8_strtolower($acl[1]);
}
if(!in_array($acl[1], $groups)) {
continue;
}
@ -577,7 +581,7 @@ function auth_aclcheck($id, $user, $groups) {
}
if($perm > -1) {
//we had a match - return it
return $perm;
return (int) $perm;
}
}
@ -589,11 +593,14 @@ function auth_aclcheck($id, $user, $groups) {
}
do {
$matches = preg_grep('/^'.preg_quote($path, '/').'\s+(\S+)\s+/'.$ci, $AUTH_ACL);
$matches = preg_grep('/^'.preg_quote($path, '/').'\s+(\S+)\s+/u', $AUTH_ACL);
if(count($matches)) {
foreach($matches as $match) {
$match = preg_replace('/#.*$/', '', $match); //ignore comments
$acl = preg_split('/\s+/', $match);
if(!$auth->isCaseSensitive() && $acl[1] !== '@ALL') {
$acl[1] = utf8_strtolower($acl[1]);
}
if(!in_array($acl[1], $groups)) {
continue;
}
@ -604,7 +611,7 @@ function auth_aclcheck($id, $user, $groups) {
}
//we had a match - return it
if($perm != -1) {
return $perm;
return (int) $perm;
}
}
//get next higher namespace
@ -774,23 +781,19 @@ function register() {
return false;
}
// create substitutions for use in notification email
$substitutions = array(
'NEWUSER' => $login,
'NEWNAME' => $fullname,
'NEWEMAIL' => $email,
);
// send notification about the new user
$subscription = new Subscription();
$subscription->send_register($login, $fullname, $email);
// are we done?
if(!$conf['autopasswd']) {
msg($lang['regsuccess2'], 1);
notify('', 'register', '', $login, false, $substitutions);
return true;
}
// autogenerated password? then send him the password
// autogenerated password? then send password to user
if(auth_sendPassword($login, $pass)) {
msg($lang['regsuccess'], 1);
notify('', 'register', '', $login, false, $substitutions);
return true;
} else {
msg($lang['regmailfail'], -1);

View File

@ -258,6 +258,7 @@ function getRecentsSince($from,$to=null,$ns='',$flags=0){
} else {
$lines = @file($conf['changelog']);
}
if(!$lines) return $recent;
// we start searching at the end of the list
$lines = array_reverse($lines);

View File

@ -107,9 +107,11 @@ function pageinfo() {
$info['isadmin'] = false;
$info['ismanager'] = false;
if(isset($_SERVER['REMOTE_USER'])) {
$sub = new Subscription();
$info['userinfo'] = $USERINFO;
$info['perm'] = auth_quickaclcheck($ID);
$info['subscribed'] = get_info_subscribed();
$info['subscribed'] = $sub->user_subscription();
$info['client'] = $_SERVER['REMOTE_USER'];
if($info['perm'] == AUTH_ADMIN) {
@ -309,7 +311,11 @@ function breadcrumbs() {
*
* This is run on a ID before it is outputted somewhere
* currently used to replace the colon with something else
* on Windows systems and to have proper URL encoding
* on Windows (non-IIS) systems and to have proper URL encoding
*
* See discussions at https://github.com/splitbrain/dokuwiki/pull/84 and
* https://github.com/splitbrain/dokuwiki/pull/173 why we use a whitelist of
* unaffected servers instead of blacklisting affected servers here.
*
* Urlencoding is ommitted when the second parameter is false
*
@ -320,7 +326,8 @@ function idfilter($id, $ue = true) {
if($conf['useslash'] && $conf['userewrite']) {
$id = strtr($id, ':', '/');
} elseif(strtoupper(substr(PHP_OS, 0, 3)) === 'WIN' &&
$conf['userewrite']
$conf['userewrite'] &&
strpos($_SERVER['SERVER_SOFTWARE'], 'Microsoft-IIS') === false
) {
$id = strtr($id, ':', ';');
}
@ -1103,90 +1110,31 @@ function saveOldRevision($id) {
* @author Andreas Gohr <andi@splitbrain.org>
*/
function notify($id, $who, $rev = '', $summary = '', $minor = false, $replace = array()) {
global $lang;
global $conf;
global $INFO;
global $DIFF_INLINESTYLES;
// decide if there is something to do, eg. whom to mail
if($who == 'admin') {
if(empty($conf['notify'])) return false; //notify enabled?
$text = rawLocale('mailtext');
$to = $conf['notify'];
$bcc = '';
$tpl = 'mailtext';
$to = $conf['notify'];
} elseif($who == 'subscribers') {
if(!$conf['subscribers']) return false; //subscribers enabled?
if(!actionOK('subscribe')) return false; //subscribers enabled?
if($conf['useacl'] && $_SERVER['REMOTE_USER'] && $minor) return false; //skip minors
$data = array('id' => $id, 'addresslist' => '', 'self' => false);
trigger_event(
'COMMON_NOTIFY_ADDRESSLIST', $data,
'subscription_addresslist'
array(new Subscription(), 'notifyaddresses')
);
$bcc = $data['addresslist'];
if(empty($bcc)) return false;
$to = '';
$text = rawLocale('subscr_single');
} elseif($who == 'register') {
if(empty($conf['registernotify'])) return false;
$text = rawLocale('registermail');
$to = $conf['registernotify'];
$bcc = '';
$to = $data['addresslist'];
if(empty($to)) return false;
$tpl = 'subscr_single';
} else {
return false; //just to be safe
}
// prepare replacements (keys not set in hrep will be taken from trep)
$trep = array(
'NEWPAGE' => wl($id, '', true, '&'),
'PAGE' => $id,
'SUMMARY' => $summary
);
$trep = array_merge($trep, $replace);
$hrep = array();
// prepare content
if($who == 'register') {
$subject = $lang['mail_new_user'].' '.$summary;
} elseif($rev) {
$subject = $lang['mail_changed'].' '.$id;
$trep['OLDPAGE'] = wl($id, "rev=$rev", true, '&');
$old_content = rawWiki($id, $rev);
$new_content = rawWiki($id);
$df = new Diff(explode("\n", $old_content),
explode("\n", $new_content));
$dformat = new UnifiedDiffFormatter();
$tdiff = $dformat->format($df);
$DIFF_INLINESTYLES = true;
$hdf = new Diff(explode("\n", hsc($old_content)),
explode("\n", hsc($new_content)));
$dformat = new InlineDiffFormatter();
$hdiff = $dformat->format($hdf);
$hdiff = '<table>'.$hdiff.'</table>';
$DIFF_INLINESTYLES = false;
} else {
$subject = $lang['mail_newpage'].' '.$id;
$trep['OLDPAGE'] = '---';
$tdiff = rawWiki($id);
$hdiff = nl2br(hsc($tdiff));
}
$trep['DIFF'] = $tdiff;
$hrep['DIFF'] = $hdiff;
// send mail
$mail = new Mailer();
$mail->to($to);
$mail->bcc($bcc);
$mail->subject($subject);
$mail->setBody($text, $trep, $hrep);
if($who == 'subscribers') {
$mail->setHeader(
'List-Unsubscribe',
'<'.wl($id, array('do'=> 'subscribe'), true, '&').'>',
false
);
}
return $mail->send();
$subscription = new Subscription();
return $subscription->send_diff($to, $tpl, $id, $rev, $summary);
}
/**

View File

@ -18,7 +18,7 @@
* @author Michael Klier <chi@chimeric.de>
* @author Christopher Smith <chris@jalakai.co.uk>
* @author virtual host part of farm_confpath() based on conf_path() from Drupal.org's /includes/bootstrap.inc
* (see http://cvs.drupal.org/viewvc/drupal/drupal/includes/bootstrap.inc?view=markup)
* (see https://github.com/drupal/drupal/blob/7.x/includes/bootstrap.inc#L537)
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
*/

View File

@ -394,10 +394,17 @@ function ft_snippet_re_preprocess($term) {
return $term;
}
// unicode word boundaries
// see http://stackoverflow.com/a/2449017/172068
$BL = '(?<!\pL)';
$BR = '(?!\pL)';
if (UTF8_PROPERTYSUPPORT) {
// unicode word boundaries
// see http://stackoverflow.com/a/2449017/172068
$BL = '(?<!\pL)';
$BR = '(?!\pL)';
} else {
// not as correct as above, but at least won't break
$BL = '\b';
$BR = '\b';
}
if(substr($term,0,2) == '\\*'){
$term = substr($term,2);

View File

@ -41,7 +41,7 @@
//
/** The version of this GeSHi file */
define('GESHI_VERSION', '1.0.8.10');
define('GESHI_VERSION', '1.0.8.11');
// Define the root directory for the GeSHi code tree
if (!defined('GESHI_ROOT')) {
@ -604,6 +604,17 @@ class GeSHi {
$this->set_language_path($path);
}
/**
* Returns the version of GeSHi
*
* @return string
* @since 1 0.8.11
*/
function get_version()
{
return GESHI_VERSION;
}
/**
* Returns an error message associated with the last GeSHi operation,
* or false if no error has occured
@ -808,7 +819,7 @@ class GeSHi {
}
// match the langname
if (!preg_match('/\'LANG_NAME\'\s*=>\s*\'((?:[^\']|\\\')+)\'/', $data, $matches)) {
if (!preg_match('/\'LANG_NAME\'\s*=>\s*\'((?:[^\']|\\\')+?)\'/', $data, $matches)) {
$this->error = sprintf('Geshi::get_lang_fullname(%s): Regex can not detect language', $language);
return false;
}
@ -1437,6 +1448,8 @@ class GeSHi {
* @todo static?
*/
function get_language_name_from_extension( $extension, $lookup = array() ) {
$extension = strtolower($extension);
if ( !is_array($lookup) || empty($lookup)) {
$lookup = array(
'6502acme' => array( 'a', 's', 'asm', 'inc' ),
@ -1470,6 +1483,7 @@ class GeSHi {
'gnuplot' => array('plt'),
'groovy' => array('groovy'),
'haskell' => array('hs'),
'haxe' => array('hx'),
'html4strict' => array('html', 'htm'),
'ini' => array('ini', 'desktop'),
'java' => array('java'),
@ -1504,6 +1518,7 @@ class GeSHi {
'smalltalk' => array('st'),
'smarty' => array(),
'tcl' => array('tcl'),
'text' => array('txt'),
'vb' => array('bas'),
'vbnet' => array(),
'visualfoxpro' => array(),
@ -1518,7 +1533,8 @@ class GeSHi {
return $lang;
}
}
return '';
return 'text';
}
/**
@ -1555,6 +1571,9 @@ class GeSHi {
* @since 1.0.0
*/
function add_keyword($key, $word) {
if (!is_array($this->language_data['KEYWORDS'][$key])) {
$this->language_data['KEYWORDS'][$key] = array();
}
if (!in_array($word, $this->language_data['KEYWORDS'][$key])) {
$this->language_data['KEYWORDS'][$key][] = $word;
@ -1816,7 +1835,7 @@ class GeSHi {
//Decide on which style to use
if ($style === null) { //Check if we should use default style
unset($this->highlight_extra_lines_styles[$lines]);
} else if ($style === false) { //Check if to remove this line
} elseif ($style === false) { //Check if to remove this line
unset($this->highlight_extra_lines[$lines]);
unset($this->highlight_extra_lines_styles[$lines]);
} else {
@ -1988,7 +2007,7 @@ class GeSHi {
$this->language_data['SYMBOL_DATA'][$symbols] = 0;
if (isset($symbols[1])) { // multiple chars
$symbol_preg_multi[] = preg_quote($symbols, '/');
} else if ($symbols == '-') {
} elseif ($symbols == '-') {
// don't trigger range out of order error
$symbol_preg_single[] = '\-';
} else { // single char
@ -2392,7 +2411,7 @@ class GeSHi {
foreach ($this->language_data['QUOTEMARKS'] as $quotemark) {
if (!isset($is_string_starter[$quotemark[0]])) {
$is_string_starter[$quotemark[0]] = (string)$quotemark;
} else if (is_string($is_string_starter[$quotemark[0]])) {
} elseif (is_string($is_string_starter[$quotemark[0]])) {
$is_string_starter[$quotemark[0]] = array(
$is_string_starter[$quotemark[0]],
$quotemark);
@ -2478,7 +2497,7 @@ class GeSHi {
continue;
}
$match_i = $comment_regexp_cache_per_key[$comment_key]['pos'];
} else if (
} elseif (
//This is to allow use of the offset parameter in preg_match and stay as compatible with older PHP versions as possible
(GESHI_PHP_PRE_433 && preg_match($regexp, substr($part, $i), $match, PREG_OFFSET_CAPTURE)) ||
(!GESHI_PHP_PRE_433 && preg_match($regexp, $part, $match, PREG_OFFSET_CAPTURE, $i))
@ -2586,7 +2605,7 @@ class GeSHi {
continue;
}
$match_i = $escape_regexp_cache_per_key[$escape_key]['pos'];
} else if (
} elseif (
//This is to allow use of the offset parameter in preg_match and stay as compatible with older PHP versions as possible
(GESHI_PHP_PRE_433 && preg_match($regexp, substr($part, $start), $match, PREG_OFFSET_CAPTURE)) ||
(!GESHI_PHP_PRE_433 && preg_match($regexp, $part, $match, PREG_OFFSET_CAPTURE, $start))
@ -2656,13 +2675,13 @@ class GeSHi {
// don't put a newline around newlines
$string .= "</span>\n";
$start = $es_pos + 2;
} else if (ord($es_char) >= 128) {
} elseif (ord($es_char) >= 128) {
//This is an non-ASCII char (UTF8 or single byte)
//This code tries to work around SF#2037598 ...
if(function_exists('mb_substr')) {
$es_char_m = mb_substr(substr($part, $es_pos+1, 16), 0, 1, $this->encoding);
$string .= $es_char_m . '</span>';
} else if (!GESHI_PHP_PRE_433 && 'utf-8' == $this->encoding) {
} elseif (!GESHI_PHP_PRE_433 && 'utf-8' == $this->encoding) {
if(preg_match("/[\xC2-\xDF][\x80-\xBF]".
"|\xE0[\xA0-\xBF][\x80-\xBF]".
"|[\xE1-\xEC\xEE\xEF][\x80-\xBF]{2}".
@ -2684,7 +2703,7 @@ class GeSHi {
$string .= $this->hsc($es_char) . '</span>';
$start = $es_pos + 2;
}
} else if ($next_escape_regexp_pos < $length &&
} elseif ($next_escape_regexp_pos < $length &&
$next_escape_regexp_pos < $close_pos) {
$es_pos = $next_escape_regexp_pos;
//Add the stuff not in the string yet ...
@ -2728,7 +2747,7 @@ class GeSHi {
$string = '';
$i = $start - 1;
continue;
} else if ($this->lexic_permissions['STRINGS'] && $hq && $hq[0] == $char &&
} elseif ($this->lexic_permissions['STRINGS'] && $hq && $hq[0] == $char &&
substr($part, $i, $hq_strlen) == $hq && ($i != $next_comment_regexp_pos)) {
// The start of a hard quoted string
if (!$this->use_classes) {
@ -2886,7 +2905,7 @@ class GeSHi {
continue;
}
$match_i = $comment_multi_cache_per_key[$open];
} else if (($match_i = stripos($part, $open, $i)) !== false) {
} elseif (($match_i = stripos($part, $open, $i)) !== false) {
$comment_multi_cache_per_key[$open] = $match_i;
} else {
$comment_multi_cache_per_key[$open] = false;
@ -2983,7 +3002,7 @@ class GeSHi {
continue;
}
$match_i = $comment_single_cache_per_key[$comment_key];
} else if (
} elseif (
// case sensitive comments
($this->language_data['CASE_SENSITIVE'][GESHI_COMMENTS] &&
($match_i = stripos($part, $comment_mark, $i)) !== false) ||
@ -3140,10 +3159,10 @@ class GeSHi {
$IN_TAG = false;
}
$lines[$key] .= $char;
} else if ('<' == $char) {
} elseif ('<' == $char) {
$IN_TAG = true;
$lines[$key] .= '<';
} else if ('&' == $char) {
} elseif ('&' == $char) {
$substr = substr($line, $i + 3, 5);
$posi = strpos($substr, ';');
if (false === $posi) {
@ -3152,7 +3171,7 @@ class GeSHi {
$pos -= $posi+2;
}
$lines[$key] .= $char;
} else if ("\t" == $char) {
} elseif ("\t" == $char) {
$str = '';
// OPTIMISE - move $strs out. Make an array:
// $tabs = array(
@ -3173,7 +3192,7 @@ class GeSHi {
$lines[$key] .= substr($line, $i + 1);
break;
}
} else if (0 == $pos && ' ' == $char) {
} elseif (0 == $pos && ' ' == $char) {
$lines[$key] .= '&nbsp;';
++$pos;
} else {
@ -3231,6 +3250,7 @@ class GeSHi {
function handle_keyword_replace($match) {
$k = $this->_kw_replace_group;
$keyword = $match[0];
$keyword_match = $match[1];
$before = '';
$after = '';
@ -3248,12 +3268,12 @@ class GeSHi {
if (!$this->language_data['CASE_SENSITIVE'][$k] &&
strpos($this->language_data['URLS'][$k], '{FNAME}') !== false) {
foreach ($this->language_data['KEYWORDS'][$k] as $word) {
if (strcasecmp($word, $keyword) == 0) {
if (strcasecmp($word, $keyword_match) == 0) {
break;
}
}
} else {
$word = $keyword;
$word = $keyword_match;
}
$before = '<|UR1|"' .
@ -3367,7 +3387,7 @@ class GeSHi {
foreach (array_keys($this->language_data['KEYWORDS']) as $k) {
if (!isset($this->lexic_permissions['KEYWORDS'][$k]) ||
$this->lexic_permissions['KEYWORDS'][$k]) {
$this->lexic_permissions['KEYWORDS'][$k]) {
$case_sensitive = $this->language_data['CASE_SENSITIVE'][$k];
$modifiers = $case_sensitive ? '' : 'i';
@ -3991,7 +4011,7 @@ class GeSHi {
$parsed_code .= $this->line_numbers_start + $i;
if ($close) {
$parsed_code .= str_repeat('</span>', $close);
} else if ($i != $n) {
} elseif ($i != $n) {
$parsed_code .= "\n";
}
}
@ -4123,10 +4143,10 @@ class GeSHi {
if ($this->line_numbers != GESHI_NO_LINE_NUMBERS) {
if ($this->header_type == GESHI_HEADER_PRE) {
return "<pre$attributes>$header<ol$ol_attributes>";
} else if ($this->header_type == GESHI_HEADER_DIV ||
} elseif ($this->header_type == GESHI_HEADER_DIV ||
$this->header_type == GESHI_HEADER_PRE_VALID) {
return "<div$attributes>$header<ol$ol_attributes>";
} else if ($this->header_type == GESHI_HEADER_PRE_TABLE) {
} elseif ($this->header_type == GESHI_HEADER_PRE_TABLE) {
return "<table$attributes>$header<tbody><tr class=\"li1\">";
}
} else {

View File

@ -859,7 +859,7 @@ function html_list_index($item){
$base = ':'.$item['id'];
$base = substr($base,strrpos($base,':')+1);
if($item['type']=='d'){
$ret .= '<a href="'.wl($ID,'idx='.rawurlencode($item['id'])).'" class="idx_dir"><strong>';
$ret .= '<a href="'.wl($ID,'idx='.rawurlencode($item['id'])).'" title="' . $item['id'] . '" class="idx_dir"><strong>';
$ret .= $base;
$ret .= '</strong></a>';
}else{
@ -1154,8 +1154,7 @@ function html_diff($text='',$intro=true,$type=null){
list($l_head, $r_head, $l_minor, $r_minor) = html_diff_head($l_rev, $r_rev);
}
$df = new Diff(explode("\n",htmlspecialchars($l_text)),
explode("\n",htmlspecialchars($r_text)));
$df = new Diff(explode("\n",hsc($l_text)),explode("\n",hsc($r_text)));
if($type == 'inline'){
$tdf = new InlineDiffFormatter();
@ -1205,12 +1204,38 @@ function html_diff($text='',$intro=true,$type=null){
<?php echo $r_head?>
</th>
</tr>
<?php echo $tdf->format($df)?>
<?php echo html_insert_softbreaks($tdf->format($df)); ?>
</table>
</div>
<?php
}
function html_insert_softbreaks($diffhtml) {
// search the diff html string for both:
// - html tags, so these can be ignored
// - long strings of characters without breaking characters
return preg_replace_callback('/<[^>]*>|[^<> ]{12,}/','html_softbreak_callback',$diffhtml);
}
function html_softbreak_callback($match){
// if match is an html tag, return it intact
if ($match[0]{0} == '<') return $match[0];
// its a long string without a breaking character,
// make certain characters into breaking characters by inserting a
// breaking character (zero length space, U+200B / #8203) in front them.
$regex = <<< REGEX
(?(?= # start a conditional expression with a positive look ahead ...
&\#?\\w{1,6};) # ... for html entities - we don't want to split them (ok to catch some invalid combinations)
&\#?\\w{1,6}; # yes pattern - a quicker match for the html entity, since we know we have one
|
[?/,&\#;:]+ # no pattern - any other group of 'special' characters to insert a breaking character after
) # end conditional expression
REGEX;
return preg_replace('<'.$regex.'>xu','\0&#8203;',$match[0]);
}
/**
* show warning on conflict detection
*
@ -1390,8 +1415,7 @@ function html_edit(){
$data = array('form' => $form,
'wr' => $wr,
'media_manager' => true,
'target' => ($INPUT->has('target') && $wr &&
$RANGE !== '') ? $INPUT->str('target') : 'section',
'target' => ($INPUT->has('target') && $wr) ? $INPUT->str('target') : 'section',
'intro_locale' => $include);
if ($data['target'] !== 'section') {

View File

@ -102,6 +102,10 @@ function wordlen($w){
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
class Doku_Indexer {
/**
* @var array $pidCache Cache for getPID()
*/
protected $pidCache = array();
/**
* Adds the contents of a page to the fulltext index
@ -120,7 +124,7 @@ class Doku_Indexer {
return "locked";
// load known documents
$pid = $this->addIndexKey('page', '', $page);
$pid = $this->getPIDNoLock($page);
if ($pid === false) {
$this->unlock();
return false;
@ -256,7 +260,7 @@ class Doku_Indexer {
return "locked";
// load known documents
$pid = $this->addIndexKey('page', '', $page);
$pid = $this->getPIDNoLock($page);
if ($pid === false) {
$this->unlock();
return false;
@ -334,6 +338,109 @@ class Doku_Indexer {
return true;
}
/**
* Rename a page in the search index without changing the indexed content. This function doesn't check if the
* old or new name exists in the filesystem. It returns an error if the old page isn't in the page list of the
* indexer and it deletes all previously indexed content of the new page.
*
* @param string $oldpage The old page name
* @param string $newpage The new page name
* @return string|bool If the page was successfully renamed, can be a message in the case of an error
*/
public function renamePage($oldpage, $newpage) {
if (!$this->lock()) return 'locked';
$pages = $this->getPages();
$id = array_search($oldpage, $pages);
if ($id === false) {
$this->unlock();
return 'page is not in index';
}
$new_id = array_search($newpage, $pages);
if ($new_id !== false) {
// make sure the page is not in the index anymore
if ($this->deletePageNoLock($newpage) !== true) {
return false;
}
$pages[$new_id] = 'deleted:'.time().rand(0, 9999);
}
$pages[$id] = $newpage;
// update index
if (!$this->saveIndex('page', '', $pages)) {
$this->unlock();
return false;
}
// reset the pid cache
$this->pidCache = array();
$this->unlock();
return true;
}
/**
* Renames a meta value in the index. This doesn't change the meta value in the pages, it assumes that all pages
* will be updated.
*
* @param string $key The metadata key of which a value shall be changed
* @param string $oldvalue The old value that shall be renamed
* @param string $newvalue The new value to which the old value shall be renamed, can exist (then values will be merged)
* @return bool|string If renaming the value has been successful, false or error message on error.
*/
public function renameMetaValue($key, $oldvalue, $newvalue) {
if (!$this->lock()) return 'locked';
// change the relation references index
$metavalues = $this->getIndex($key, '_w');
$oldid = array_search($oldvalue, $metavalues);
if ($oldid !== false) {
$newid = array_search($newvalue, $metavalues);
if ($newid !== false) {
// free memory
unset ($metavalues);
// okay, now we have two entries for the same value. we need to merge them.
$indexline = $this->getIndexKey($key, '_i', $oldid);
if ($indexline != '') {
$newindexline = $this->getIndexKey($key, '_i', $newid);
$pagekeys = $this->getIndex($key, '_p');
$parts = explode(':', $indexline);
foreach ($parts as $part) {
list($id, $count) = explode('*', $part);
$newindexline = $this->updateTuple($newindexline, $id, $count);
$keyline = explode(':', $pagekeys[$id]);
// remove old meta value
$keyline = array_diff($keyline, array($oldid));
// add new meta value when not already present
if (!in_array($newid, $keyline)) {
array_push($keyline, $newid);
}
$pagekeys[$id] = implode(':', $keyline);
}
$this->saveIndex($key, '_p', $pagekeys);
unset($pagekeys);
$this->saveIndexKey($key, '_i', $oldid, '');
$this->saveIndexKey($key, '_i', $newid, $newindexline);
}
} else {
$metavalues[$oldid] = $newvalue;
if (!$this->saveIndex($key, '_w', $metavalues)) {
$this->unlock();
return false;
}
}
}
$this->unlock();
return true;
}
/**
* Remove a page from the index
*
@ -347,10 +454,26 @@ class Doku_Indexer {
if (!$this->lock())
return "locked";
$result = $this->deletePageNoLock($page);
$this->unlock();
return $result;
}
/**
* Remove a page from the index without locking the index, only use this function if the index is already locked
*
* Erases entries in all known indexes.
*
* @param string $page a page name
* @return boolean the function completed successfully
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
protected function deletePageNoLock($page) {
// load known documents
$pid = $this->addIndexKey('page', '', $page);
$pid = $this->getPIDNoLock($page);
if ($pid === false) {
$this->unlock();
return false;
}
@ -376,7 +499,6 @@ class Doku_Indexer {
}
// Save the reverse index
if (!$this->saveIndexKey('pageword', '', $pid, "")) {
$this->unlock();
return false;
}
@ -393,6 +515,37 @@ class Doku_Indexer {
$this->saveIndexKey($metaname.'_p', '', $pid, '');
}
return true;
}
/**
* Clear the whole index
*
* @return bool If the index has been cleared successfully
*/
public function clear() {
global $conf;
if (!$this->lock()) return false;
@unlink($conf['indexdir'].'/page.idx');
@unlink($conf['indexdir'].'/title.idx');
@unlink($conf['indexdir'].'/pageword.idx');
@unlink($conf['indexdir'].'/metadata.idx');
$dir = @opendir($conf['indexdir']);
if($dir!==false){
while(($f = readdir($dir)) !== false){
if(substr($f,-4)=='.idx' &&
(substr($f,0,1)=='i' || substr($f,0,1)=='w'
|| substr($f,-6)=='_w.idx' || substr($f,-6)=='_i.idx' || substr($f,-6)=='_p.idx'))
@unlink($conf['indexdir']."/$f");
}
}
@unlink($conf['indexdir'].'/lengths.idx');
// clear the pid cache
$this->pidCache = array();
$this->unlock();
return true;
}
@ -453,6 +606,58 @@ class Doku_Indexer {
return array_values($wordlist);
}
/**
* Get the numeric PID of a page
*
* @param string $page The page to get the PID for
* @return bool|int The page id on success, false on error
*/
public function getPID($page) {
// return PID without locking when it is in the cache
if (isset($this->pidCache[$page])) return $this->pidCache[$page];
if (!$this->lock())
return false;
// load known documents
$pid = $this->getPIDNoLock($page);
if ($pid === false) {
$this->unlock();
return false;
}
$this->unlock();
return $pid;
}
/**
* Get the numeric PID of a page without locking the index.
* Only use this function when the index is already locked.
*
* @param string $page The page to get the PID for
* @return bool|int The page id on success, false on error
*/
protected function getPIDNoLock($page) {
// avoid expensive addIndexKey operation for the most recently requested pages by using a cache
if (isset($this->pidCache[$page])) return $this->pidCache[$page];
$pid = $this->addIndexKey('page', '', $page);
// limit cache to 10 entries by discarding the oldest element as in DokuWiki usually only the most recently
// added item will be requested again
if (count($this->pidCache) > 10) array_shift($this->pidCache);
$this->pidCache[$page] = $pid;
return $pid;
}
/**
* Get the page id of a numeric PID
*
* @param int $pid The PID to get the page id for
* @return string The page id
*/
public function getPageFromPID($pid) {
return $this->getIndexKey('page', '', $pid);
}
/**
* Find pages in the fulltext index containing the words,
*
@ -946,7 +1151,7 @@ class Doku_Indexer {
* @param string $idx name of the index
* @param string $suffix subpart identifier
* @param string $value line to find in the index
* @return int line number of the value in the index
* @return int|bool line number of the value in the index or false if writing the index failed
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
protected function addIndexKey($idx, $suffix, $value) {
@ -1140,8 +1345,8 @@ class Doku_Indexer {
* @author Tom N Harris <tnharris@whoopdedo.org>
*/
function idx_get_indexer() {
static $Indexer = null;
if (is_null($Indexer)) {
static $Indexer;
if (!isset($Indexer)) {
$Indexer = new Doku_Indexer();
}
return $Indexer;
@ -1223,6 +1428,12 @@ function idx_addPage($page, $verbose=false, $force=false) {
return $result;
}
$Indexer = idx_get_indexer();
$pid = $Indexer->getPID($page);
if ($pid === false) {
if ($verbose) print("Indexer: getting the PID failed for $page".DOKU_LF);
return false;
}
$body = '';
$metadata = array();
$metadata['title'] = p_get_metadata($page, 'title', METADATA_RENDER_UNLIMITED);
@ -1230,14 +1441,13 @@ function idx_addPage($page, $verbose=false, $force=false) {
$metadata['relation_references'] = array_keys($references);
else
$metadata['relation_references'] = array();
$data = compact('page', 'body', 'metadata');
$data = compact('page', 'body', 'metadata', 'pid');
$evt = new Doku_Event('INDEXER_PAGE_ADD', $data);
if ($evt->advise_before()) $data['body'] = $data['body'] . " " . rawWiki($page);
$evt->advise_after();
unset($evt);
extract($data);
$Indexer = idx_get_indexer();
$result = $Indexer->addPageWords($page, $body);
if ($result === "locked") {
if ($verbose) print("Indexer: locked".DOKU_LF);

View File

@ -77,7 +77,8 @@ function getVersionData(){
if($date) $version['date'] = $date;
}
}else{
$version['date'] = 'unknown';
global $updateVersion;
$version['date'] = 'update version '.$updateVersion;
$version['type'] = 'snapshot?';
}
return $version;
@ -176,10 +177,10 @@ function check(){
msg('mb_string extension not available - PHP only replacements will be used',0);
}
if (!preg_match("/^.$/u", "ñ")) {
if (!UTF8_PREGSUPPORT) {
msg('PHP is missing UTF-8 support in Perl-Compatible Regular Expressions (PCRE)', -1);
}
if (!preg_match("/^\pL$/u", "ñ")) {
if (!UTF8_PROPERTYSUPPORT) {
msg('PHP is missing Unicode properties support in Perl-Compatible Regular Expressions (PCRE)', -1);
}

View File

@ -92,6 +92,7 @@ $lang['searchmedia_in'] = 'ابحث في %s';
$lang['txt_upload'] = 'اختر ملفاً للرفع';
$lang['txt_filename'] = 'رفع كـ (اختياري)';
$lang['txt_overwrt'] = 'اكتب على ملف موجود';
$lang['maxuploadsize'] = 'الحجم الاقصى %s للملف';
$lang['lockedby'] = 'مقفلة حاليا لـ';
$lang['lockexpire'] = 'ينتهي القفل في';
$lang['js']['willexpire'] = 'سينتهي قفل تحرير هذه الصفحه خلال دقيقة.\nلتجنب التعارض استخدم زر المعاينة لتصفير مؤقت القفل.';
@ -190,6 +191,7 @@ $lang['user_tools'] = 'أدوات المستخدم';
$lang['site_tools'] = 'أدوات الموقع';
$lang['page_tools'] = 'أدوات الصفحة';
$lang['skip_to_content'] = 'تجاوز إلى المحتوى';
$lang['sidebar'] = 'العمود الجانبي';
$lang['mail_newpage'] = 'إضافة صفحة:';
$lang['mail_changed'] = 'تعديل صفحة:';
$lang['mail_subscribe_list'] = 'صفحات غيرت في النطاق:';

13
inc/lang/ar/mailwrap.html Normal file
View File

@ -0,0 +1,13 @@
<html>
<head>
<title>@TITLE@</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
@HTMLBODY@
<br /><hr />
<small>تم انشاء هذا البريد الالكتروني بواسطة DokuWiki في @DOKUWIKIURL@.</small>
</body>
</html>

View File

@ -15,7 +15,7 @@
لإلغاء إشعارات الصفحة,لُج الويكي في
@DOKUWIKIURL@ ثم زُر
@NEWPAGE@
@SUBSCRIBE@
وألغ الاشتراك من تغييرات الصفحة و/أو النطاق.
--

View File

@ -208,8 +208,8 @@ $lang['i_writeerr'] = '<code>%s</code> yaradıla bilmədi. Faylın/qo
$lang['i_badhash'] = 'dokuwiki.php tanıla bilmir və ya dəyişdirilmişdir (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - səhv ya boş qiymətdir';
$lang['i_success'] = 'Konfiqurasiya uğurla başa çatdı. İndi siz install.php faylını silə bilərsiniz.
<a href="doku.php">Yeni DokuWiki-nizə</a> xoş gəlmişsiniz!';
$lang['i_failure'] = 'Konfiqurasiya fayllarına məlumat yazan zaman səhvlər tapıldı. Yəgin ki, <a href="doku.php">yeni DokuWiki-nizi</a> istifadə etmədən öncə, Siz o xətaları əl ilə düzəltməli olacaqsınız.';
<a href="doku.php?id=wiki:welcome">Yeni DokuWiki-nizə</a> xoş gəlmişsiniz!';
$lang['i_failure'] = 'Konfiqurasiya fayllarına məlumat yazan zaman səhvlər tapıldı. Yəgin ki, <a href="doku.php?id=wiki:welcome">yeni DokuWiki-nizi</a> istifadə etmədən öncə, Siz o xətaları əl ilə düzəltməli olacaqsınız.';
$lang['i_policy'] = 'İlkin giriş haqları siyasəti';
$lang['i_pol0'] = 'Tam açıq wiki (oxumaq, yazmaq, fayl yükləmək hamıya olar)';
$lang['i_pol1'] = 'Acıq wiki (oxumaq hamıya olar, yazmaq və fayl yükləmək ancaq üzv olan istifadəçilərə olar)';

View File

@ -298,10 +298,10 @@ $lang['i_confexists'] = '<code>%s</code> вече съществува'
$lang['i_writeerr'] = '<code>%s</code> не можа да бъде създаден. Трябва да проверите правата за достъп до директорията/файла и да създадете файла ръчно.';
$lang['i_badhash'] = 'Файлът dokuwiki.php не може да бъде разпознат или е променен (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - непозволена или празна стойност';
$lang['i_success'] = 'Настройването приключи успешно. Вече можете да изтриете файла install.php. Продължете към <a href="doku.php">Вашето ново DokuWiki</a>.';
$lang['i_success'] = 'Настройването приключи успешно. Вече можете да изтриете файла install.php. Продължете към <a href="doku.php?id=wiki:welcome">Вашето ново DokuWiki</a>.';
$lang['i_failure'] = 'Възникнаха грешки при записването на файловете с настройки. Вероятно ще се наложи да ги поправите ръчно,
за да можете да ползвате <a href="doku.php">Вашето ново DokuWiki</a>.';
$lang['i_failure'] = 'Възникнаха грешки при записването на файловете с настройки. Вероятно ще се наложи да ги поправите ръчно,
за да можете да ползвате <a href="doku.php?id=wiki:welcome">Вашето ново DokuWiki</a>.';
$lang['i_policy'] = 'Първоначална политика за достъп';
$lang['i_pol0'] = 'Отворено Wiki (всеки може да чете, пише и качва)';
$lang['i_pol1'] = 'Публично Wiki (всеки може да чете, само регистрирани пишат и качват)';

View File

@ -14,7 +14,7 @@
Нова версия: @NEWPAGE@
Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите
@NEWPAGE@
@SUBSCRIBE@
и да прекратите абонамента за промени по страницата или именното пространство.
--

View File

@ -211,9 +211,9 @@ $lang['i_writeerr'] = 'No es pot crear <code>%s</code>. Haurà de com
$lang['i_badhash'] = 'dokuwiki.php substituït o modificat (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - valor illegal o buit';
$lang['i_success'] = 'La configuració ha finalisat correctament. Ya pot borrar l\'archiu install.php. Passe al
<a href="doku.php">nou DokuWiki</a>.';
<a href="doku.php?id=wiki:welcome">nou DokuWiki</a>.';
$lang['i_failure'] = 'Han aparegut alguns erros escrivint els archius de configuració. Deurà arreglar-los manualment abans de que
puga utilisar el <a href="doku.php">nou DokuWiki</a>.';
puga utilisar el <a href="doku.php?id=wiki:welcome">nou DokuWiki</a>.';
$lang['i_policy'] = 'Política inicial ACL';
$lang['i_pol0'] = 'Wiki obert (llegir, escriure i enviar tots)';
$lang['i_pol1'] = 'Wiki públic (llegir tots, escriure i enviar només usuaris registrats)';

View File

@ -5,6 +5,7 @@
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Carles Bellver <carles.bellver@cent.uji.es>
* @author Carles Bellver <carles.bellver@gmail.com>
* @author daniel@6temes.cat
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@ -27,7 +28,7 @@ $lang['btn_revs'] = 'Revisions anteriors';
$lang['btn_recent'] = 'Canvis recents';
$lang['btn_upload'] = 'Penja';
$lang['btn_cancel'] = 'Cancel·la';
$lang['btn_index'] = 'Índex';
$lang['btn_index'] = 'Mapa del lloc';
$lang['btn_secedit'] = 'Edita';
$lang['btn_login'] = 'Entra';
$lang['btn_logout'] = 'Surt';
@ -38,14 +39,15 @@ $lang['btn_back'] = 'Enrere';
$lang['btn_backlink'] = 'Què hi enllaça';
$lang['btn_backtomedia'] = 'Torna a la selecció de fitxers';
$lang['btn_subscribe'] = 'Subscripció a canvis d\'aquesta pàgina';
$lang['btn_unsubscribe'] = 'Cancel·la subscripció a pàgina';
$lang['btn_profile'] = 'Actualització del perfil';
$lang['btn_reset'] = 'Reinicia';
$lang['btn_resendpwd'] = 'Estableix una nova contrasenya';
$lang['btn_draft'] = 'Edita esborrany';
$lang['btn_recover'] = 'Recupera esborrany';
$lang['btn_draftdel'] = 'Suprimeix esborrany';
$lang['btn_revert'] = 'Restaura';
$lang['btn_register'] = 'Registra\'m';
$lang['btn_apply'] = 'Aplica';
$lang['loggedinas'] = 'Heu entrat com';
$lang['user'] = 'Nom d\'usuari';
$lang['pass'] = 'Contrasenya';
@ -75,6 +77,7 @@ $lang['profnoempty'] = 'No es pot deixar en blanc el nom o l\'adreça
$lang['profchanged'] = 'El perfil d\'usuari s\'ha actualitzat correctament.';
$lang['pwdforget'] = 'Heu oblidat la contrasenya? Podeu obtenir-ne una de nova.';
$lang['resendna'] = 'Aquest wiki no permet tornar a enviar la contrasenya.';
$lang['resendpwd'] = 'Estableix una nova contrasenya per';
$lang['resendpwdmissing'] = 'Heu d\'emplenar tots els camps.';
$lang['resendpwdnouser'] = 'No s\'ha pogut trobar aquest usuari a la base de dades.';
$lang['resendpwdbadauth'] = 'Aquest codi d\'autenticació no és vàlid. Assegureu-vos d\'utilitzar l\'enllaç de confirmació complet.';
@ -87,10 +90,52 @@ $lang['searchmedia_in'] = 'Cerca en: %s';
$lang['txt_upload'] = 'Trieu el fitxer que voleu penjar';
$lang['txt_filename'] = 'Introduïu el nom wiki (opcional)';
$lang['txt_overwrt'] = 'Sobreescriu el fitxer actual';
$lang['maxuploadsize'] = 'Puja com a màxim %s per arxiu.';
$lang['lockedby'] = 'Actualment blocat per:';
$lang['lockexpire'] = 'Venciment del blocatge:';
$lang['js']['willexpire'] = 'El blocatge per a editar aquesta pàgina venç d\'aquí a un minut.\nUtilitzeu la visualització prèvia per reiniciar el rellotge i evitar conflictes.';
$lang['js']['notsavedyet'] = "Heu fet canvis que es perdran si no els deseu.\nVoleu continuar?";
$lang['js']['willexpire'] = 'El blocatge per a editar aquesta pàgina venç d\'aquí a un minut.\nUtilitzeu la visualització prèvia per reiniciar el rellotge i evitar conflictes.';
$lang['js']['notsavedyet'] = 'Heu fet canvis que es perdran si no els deseu.
Voleu continuar?';
$lang['js']['searchmedia'] = 'Cerca fitxers';
$lang['js']['keepopen'] = 'Manté la finestra oberta';
$lang['js']['hidedetails'] = 'Oculta detalls';
$lang['js']['mediatitle'] = 'Propietats de l\'enllaç';
$lang['js']['mediadisplay'] = 'Tipus d\'enllaç';
$lang['js']['mediaalign'] = 'Alineació';
$lang['js']['mediasize'] = 'Mida de la imatge';
$lang['js']['mediatarget'] = 'Destí de l\'enllaç';
$lang['js']['mediaclose'] = 'Tanca';
$lang['js']['mediainsert'] = 'Inserta';
$lang['js']['mediadisplayimg'] = 'Mostra la imatge';
$lang['js']['mediadisplaylnk'] = 'Mostra només l\'enllaç';
$lang['js']['mediasmall'] = 'Versió petita';
$lang['js']['mediamedium'] = 'Versió mitjana';
$lang['js']['medialarge'] = 'Versió gran';
$lang['js']['mediaoriginal'] = 'Versió original';
$lang['js']['medialnk'] = 'Enllaç a la pàgina de detalls';
$lang['js']['mediadirect'] = 'Enllaç directe a l\'original';
$lang['js']['medianolnk'] = 'No hi ha enllaç';
$lang['js']['medianolink'] = 'No enllacis la imatge';
$lang['js']['medialeft'] = 'Alinea la imatge a l\'esquerra.';
$lang['js']['mediaright'] = 'Alinea la imatge a la dreta.';
$lang['js']['mediacenter'] = 'Alinea la imatge al mig.';
$lang['js']['medianoalign'] = 'No facis servir alineació.';
$lang['js']['nosmblinks'] = 'Els enllaços amb recursos compartits de Windows només funcionen amb el Microsoft Internet Explorer.
Si voleu podeu copiar i enganxar l\'enllaç.';
$lang['js']['linkwiz'] = 'Auxiliar d\'enllaços';
$lang['js']['linkto'] = 'Enllaça a:';
$lang['js']['del_confirm'] = 'Suprimiu aquesta entrada?';
$lang['js']['restore_confirm'] = 'Vols realment restaurar aquesta versió?';
$lang['js']['media_diff'] = 'Veure les diferències:';
$lang['js']['media_diff_both'] = 'Un al costat de l\'altre';
$lang['js']['media_diff_opacity'] = 'Resalta';
$lang['js']['media_diff_portions'] = 'Llisca';
$lang['js']['media_select'] = 'Escull els arxius';
$lang['js']['media_upload_btn'] = 'Pujar';
$lang['js']['media_done_btn'] = 'Fet';
$lang['js']['media_drop'] = 'Arrossega aquí els arxius a pujar';
$lang['js']['media_cancel'] = 'esborra';
$lang['js']['media_overwrt'] = 'Sobreescriu els arxius existents';
$lang['rssfailed'] = 'S\'ha produït un error en recollir aquesta alimentació: ';
$lang['nothingfound'] = 'No s\'ha trobat res.';
$lang['mediaselect'] = 'Selecció de fitxers';
@ -108,14 +153,7 @@ $lang['deletefail'] = 'No s\'ha pogut suprimir el fitxer "%s". Compro
$lang['mediainuse'] = 'No s\'ha pogut suprimir el fitxer "%s". Encara s\'està utilitzant.';
$lang['namespaces'] = 'Espais';
$lang['mediafiles'] = 'Fitxers disponibles en';
$lang['js']['searchmedia'] = 'Cerca fitxers';
$lang['js']['keepopen'] = 'Manté la finestra oberta';
$lang['js']['hidedetails'] = 'Oculta detalls';
$lang['js']['nosmblinks'] = 'Els enllaços amb recursos compartits de Windows només funcionen amb el Microsoft Internet Explorer.
Si voleu podeu copiar i enganxar l\'enllaç.';
$lang['js']['linkwiz'] = 'Auxiliar d\'enllaços';
$lang['js']['linkto'] = 'Enllaça a:';
$lang['js']['del_confirm'] = 'Suprimiu aquesta entrada?';
$lang['accessdenied'] = 'No teniu permís per a veure aquesta pàgina.';
$lang['mediausage'] = 'Utilitzeu la sintaxi següent per referir-vos a aquest enllaç:';
$lang['mediaview'] = 'Mostra el fitxer original';
$lang['mediaroot'] = 'arrel';
@ -131,6 +169,10 @@ $lang['current'] = 'actual';
$lang['yours'] = 'La vostra versió';
$lang['diff'] = 'Mostra diferències amb la versió actual';
$lang['diff2'] = 'Mostra diferències entre les revisions seleccionades';
$lang['difflink'] = 'Enllaç a la visualització de la comparació';
$lang['diff_type'] = 'Veieu les diferències:';
$lang['diff_inline'] = 'En línia';
$lang['diff_side'] = 'Un al costat de l\'altre';
$lang['line'] = 'Línia';
$lang['breadcrumb'] = 'Camí';
$lang['youarehere'] = 'Sou aquí';
@ -143,10 +185,20 @@ $lang['external_edit'] = 'edició externa';
$lang['summary'] = 'Resum d\'edició';
$lang['noflash'] = 'Per a visualitzar aquest contingut necessiteu el <a href="http://www.adobe.com/products/flashplayer/">connector d\'Adobe Flash</a>.';
$lang['download'] = 'Baixa el fragment';
$lang['tools'] = 'Eines';
$lang['user_tools'] = 'Eines de l\'usuari';
$lang['site_tools'] = 'Eines del lloc';
$lang['page_tools'] = 'Eines de la pàgina';
$lang['skip_to_content'] = 'salta al contingut';
$lang['sidebar'] = 'Barra lateral';
$lang['mail_newpage'] = 'pàgina afegida:';
$lang['mail_changed'] = 'pàgina modificada:';
$lang['mail_new_user'] = 'nou usuari:';
$lang['mail_upload'] = 'fitxer penjat:';
$lang['changes_type'] = 'Veure els canvis de';
$lang['pages_changes'] = 'Pàgines';
$lang['media_changes'] = 'Arxius gràfics';
$lang['both_changes'] = 'Pàgines i arxius gràfics';
$lang['qb_bold'] = 'Negreta';
$lang['qb_italic'] = 'Cursiva';
$lang['qb_underl'] = 'Subratllat';
@ -187,13 +239,27 @@ $lang['img_copyr'] = 'Copyright';
$lang['img_format'] = 'Format';
$lang['img_camera'] = 'Càmera';
$lang['img_keywords'] = 'Paraules clau';
$lang['subscribe_success'] = 'S\'ha afegit %s a la llista de subscripcions de %s';
$lang['subscribe_error'] = 'S\'ha produït un error en afegir %s a la llista de subscripcions de %s';
$lang['subscribe_noaddress'] = 'No hi ha cap adreça de correu associada al vostre nom d\'usuari. No se us ha pogut afegir a la llista de subscripcions.';
$lang['unsubscribe_success'] = '%s ha estat suprimit de la llista de subscripcions de %s';
$lang['unsubscribe_error'] = 'S\'ha produït un error en suprimir %s de la llista de subscripcions de %s';
$lang['img_width'] = 'Ample';
$lang['img_height'] = 'Alçada';
$lang['subscr_subscribe_success'] = 'S\'ha afegit %s a la llista de subscripcions per %s';
$lang['subscr_subscribe_error'] = 'Hi ha hagut un error a l\'afegir %s a la llista per %s';
$lang['subscr_subscribe_noaddress'] = 'No hi ha cap adreça associada pel vostre nom d\'usuari, no podeu ser afegit a la llista de subscripcions';
$lang['subscr_unsubscribe_success'] = 'S\'ha esborrat %s de la llista de subscripcions per %s';
$lang['subscr_unsubscribe_error'] = 'Hi ha hagut un error a l\'esborrar %s de la llista de subscripcions per %s';
$lang['subscr_already_subscribed'] = '%s ja està subscrit a %s';
$lang['subscr_not_subscribed'] = '%s no està subscrit a %s';
$lang['subscr_m_not_subscribed'] = 'En aquests moments no esteu subscrit a l\'actual pàgina o espai';
$lang['subscr_m_new_header'] = 'Afegeix subcripció';
$lang['subscr_m_current_header'] = 'Subscripcions actuals';
$lang['subscr_m_unsubscribe'] = 'Donar-se de baixa';
$lang['subscr_m_subscribe'] = 'Donar-se d\'alta';
$lang['subscr_m_receive'] = 'Rebre';
$lang['subscr_style_every'] = 'Envia\'m un correu electrònic per a cada canvi';
$lang['subscr_style_digest'] = 'Envia\'m un correu electrònic amb un resum dels canvis per a cada pàgina (cada %.2f dies)';
$lang['subscr_style_list'] = 'llistat de pàgines canviades des de l\'últim correu electrònic (cada %.2f dies)';
$lang['authmodfailed'] = 'La configuració de l\'autenticació d\'usuaris és errònia. Informeu els administradors del wiki.';
$lang['authtempfail'] = 'L\'autenticació d\'usuaris no està disponible temporalment. Si aquesta situació persisteix, si us plau informeu els administradors del wiki.';
$lang['authpwdexpire'] = 'La vostra contrasenya caducarà en %d dies, l\'hauríeu de canviar aviat.';
$lang['i_chooselang'] = 'Trieu l\'idioma';
$lang['i_installer'] = 'Instal·lador de DokuWiki';
$lang['i_wikiname'] = 'Nom del wiki';
@ -215,6 +281,7 @@ $lang['i_pol0'] = 'Wiki obert (tothom pot llegir, escriure i penj
$lang['i_pol1'] = 'Wiki públic (tothom pot llegir, els usuaris registrats poden escriure i penjar fitxers)';
$lang['i_pol2'] = 'Wiki tancat (només els usuaris registrats poden llegir, escriure i penjar fitxers)';
$lang['i_retry'] = 'Reintenta';
$lang['i_license'] = 'Escolliu el tipus de llicència que voleu fer servir per al vostre contingut:';
$lang['recent_global'] = 'Esteu veient els canvis recents de l\'espai <strong>%s</strong>. També podeu veure els <a href="%s">canvis recents de tot el wiki</a>.';
$lang['years'] = 'fa %d anys';
$lang['months'] = 'fa %d mesos';
@ -223,3 +290,27 @@ $lang['days'] = 'fa %d dies';
$lang['hours'] = 'fa %d hores';
$lang['minutes'] = 'fa %d minuts';
$lang['seconds'] = 'fa %d segons';
$lang['wordblock'] = 'El vostre canvi no s\'ha guardat perquè conté text blocat (spam)';
$lang['media_uploadtab'] = 'Puja';
$lang['media_searchtab'] = 'Busca';
$lang['media_file'] = 'Fitxer';
$lang['media_viewtab'] = 'Mostra';
$lang['media_edittab'] = 'Edita';
$lang['media_historytab'] = 'Històric';
$lang['media_list_thumbs'] = 'Miniatura';
$lang['media_list_rows'] = 'Files';
$lang['media_sort_name'] = 'Nom';
$lang['media_sort_date'] = 'Data';
$lang['media_namespaces'] = 'Escolliu l\'espai';
$lang['media_files'] = 'Arxius a %s';
$lang['media_upload'] = 'Puja a %s';
$lang['media_search'] = 'Busca a %s';
$lang['media_view'] = '%s';
$lang['media_viewold'] = '%s a %s';
$lang['media_edit'] = 'Edita %s';
$lang['media_history'] = 'Històric de %s';
$lang['media_meta_edited'] = 'metadata editada';
$lang['media_perm_read'] = 'No teniu permisos suficients per a llegir arxius.';
$lang['media_perm_upload'] = 'No teniu permisos suficients per a pujar arxius';
$lang['media_update'] = 'Puja la nova versió';
$lang['media_restore'] = 'Restaura aquesta versió';

13
inc/lang/ca/mailwrap.html Normal file
View File

@ -0,0 +1,13 @@
<html>
<head>
<title>@TITLE@</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
@HTMLBODY@
<br /><hr />
<small>Aquest correu electrònic ha estat generat per DokuWiki a @DOKUWIKIURL@.</small>
</body>
</html>

3
inc/lang/ca/resetpwd.txt Normal file
View File

@ -0,0 +1,3 @@
===== Establiu una nova contrasenya =====
Introdueixi una nova contrasenya pel seu compte a aquest wiki.

View File

@ -0,0 +1,21 @@
Hola!
La pàgina @PAGE@ al wiki @TITLE@ ha canviat.
A continuació podeu veure els canvis:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
Versió anterior: @OLDPAGE@
Nova versió: @NEWPAGE@
Si voleu cancel·lar les notificacions per a la pàgina, accediu al wiki a
@DOKUWIKIURL@, visiteu
@SUBSCRIBE@
i doneu-vos de baixa dels canvis de la pàgina o de l'espai.
--
Aquest mail ha estat generat per DokuWiki a
@DOKUWIKIURL@

View File

@ -0,0 +1,3 @@
===== Gestió de les Subscripcions =====
Aquesta pàgina podeu gestiona les vostres subscripcions per a les pàgines i els espais actuals.

View File

@ -0,0 +1,21 @@
Hola!
Alguna(es) pàgina(es) de l'espai @PAGE@ al wiki @TITLE@ han canviat.
A continuació podeu veure els canvis:
--------------------------------------------------------
@DIFF@
--------------------------------------------------------
Versió anterior: @OLDPAGE@
Nova versió: @NEWPAGE@
Si voleu cancel·lar les notificacions per a la pàgina, accediu al wiki a
@DOKUWIKIURL@, visiteu
@SUBSCRIBE@
i doneu-vos de baixa dels canvis de la pàgina o de l'espai.
--
Aquest mail ha estat generat per DokuWiki a
@DOKUWIKIURL@

View File

@ -12,6 +12,7 @@
* @author Vojta Beran <xmamut@email.cz>
* @author zbynek.krivka@seznam.cz
* @author Bohumir Zamecnik <bohumir.zamecnik@gmail.com>
* @author Jakub A. Těšínský (j@kub.cz)
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@ -197,6 +198,7 @@ $lang['user_tools'] = 'Uživatelské nástroje';
$lang['site_tools'] = 'Nástroje pro tento web';
$lang['page_tools'] = 'Nástroje pro stránku';
$lang['skip_to_content'] = 'jít k obsahu';
$lang['sidebar'] = 'Postranní lišta';
$lang['mail_newpage'] = 'nová stránka:';
$lang['mail_changed'] = 'změna stránky:';
$lang['mail_subscribe_list'] = 'stránky změněné ve jmenném prostoru:';
@ -282,8 +284,8 @@ $lang['i_confexists'] = '<code>%s</code> již existuje';
$lang['i_writeerr'] = 'Nelze vytvořit <code>%s</code>. Budete muset zkontrolovat práva k souborům či adresářům a vytvořit tento soubor ručně.';
$lang['i_badhash'] = 'soubor dokuwiki.php (hash=<code>%s</code>) nebyl rozpoznán nebo byl upraven';
$lang['i_badval'] = '<code>%s</code> - neplatná nebo prázdná hodnota';
$lang['i_success'] = 'Konfigurace byla úspěšně dokončena. Nyní můžete smazat soubor install.php. Pokračujte do <a href="doku.php">své nové DokuWiki</a>.';
$lang['i_failure'] = 'Vyskytly se nějaké chyby při zápisu do konfiguračních souborů. Budete je nejspíš muset upravit ručně před použitím <a href="doku.php">své nové DokuWiki</a>.';
$lang['i_success'] = 'Konfigurace byla úspěšně dokončena. Nyní můžete smazat soubor install.php. Pokračujte do <a href="doku.php?id=wiki:welcome">své nové DokuWiki</a>.';
$lang['i_failure'] = 'Vyskytly se nějaké chyby při zápisu do konfiguračních souborů. Budete je nejspíš muset upravit ručně před použitím <a href="doku.php?id=wiki:welcome">své nové DokuWiki</a>.';
$lang['i_policy'] = 'Úvodní politika ACL';
$lang['i_pol0'] = 'Otevřená wiki (čtení, zápis a upload pro všechny)';
$lang['i_pol1'] = 'Veřejná wiki (čtení pro všechny, zápis a upload pro registrované uživatele)';

View File

@ -285,8 +285,8 @@ $lang['i_confexists'] = '<code>%s</code> eksisterer allerede';
$lang['i_writeerr'] = 'Kunne ikke oprette <code>%s</code>. Du bliver nød til at tjekke mappe/fil- tilladelserne og oprette filen manuelt.';
$lang['i_badhash'] = 'uigenkendelig eller modificeret dokuwiki.php (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - ulovlig eller tom værdi';
$lang['i_success'] = 'Konfigurationen fulførtedes med success. Du kan nu slette install.php filen. Fortsætte til <a href="doku.php">din nye DokuWiki</a>.';
$lang['i_failure'] = 'Nogle fejl forekom mens konfigurations filerne skulle skrives. Du er mulighvis nød til at fixe dem manuelt før du kan bruge <a href="doku.php">din nye DokuWiki</a>.';
$lang['i_success'] = 'Konfigurationen fulførtedes med success. Du kan nu slette install.php filen. Fortsætte til <a href="doku.php?id=wiki:welcome">din nye DokuWiki</a>.';
$lang['i_failure'] = 'Nogle fejl forekom mens konfigurations filerne skulle skrives. Du er mulighvis nød til at fixe dem manuelt før du kan bruge <a href="doku.php?id=wiki:welcome">din nye DokuWiki</a>.';
$lang['i_policy'] = 'Begyndende ACL politik';
$lang['i_pol0'] = 'Åben Wiki (alle kan læse, skrive og uploade)';
$lang['i_pol1'] = 'Offentlig Wiki (alle kan læse, kun registrerede brugere kan skrive og overføre)';

View File

@ -15,7 +15,7 @@ Ny Revision: @NEWPAGE@
For at slå side notifikationer fra, skal du logge ind på
@DOKUWIKIURL@ og besøge
@NEWPAGE@
@SUBSCRIBE@
og slå abonnoment for side / navnerum ændringer fra.
--

View File

@ -1,10 +1,10 @@
<p>Diese Seite hilft dir bei der Erst-Installation und Konfiguration von
<a href="http://dokuwiki.org">Dokuwiki</a>. Zusätzliche Informationen zu
<p>Diese Seite hilft dir bei der Erstinstallation und Konfiguration von
<a href="http://dokuwiki.org">DokuWiki</a>. Zusätzliche Informationen zu
diesem Installationsskript findest du auf der entsprechenden
<a href="http://dokuwiki.org/installer">Hilfe-Seite</a> (en).</p>
<p>DokuWiki verwendet normale Dateien für das Speichern von Wikiseiten und
anderen Informationen (Bilder, Suchindizes, alte Versionen, usw.).
anderen Informationen (Bilder, Suchindizes, alte Versionen usw.).
Um DokuWiki betreiben zu können, <strong>muss</strong> Schreibzugriff auf die
Verzeichnisse bestehen, in denen DokuWiki diese Dateien ablegt. Dieses
Installationsprogramm kann diese Rechte nicht für dich setzen. Du musst dies
@ -14,7 +14,7 @@ hostest, über FTP oder ein entsprechendes Werkzeug (z.B. cPanel) durchführen.<
<p>Dieses Skript hilft dir beim ersten Einrichten des Zugangsschutzes
(<abbr title="access control list">ACL</abbr>) von DokuWiki, welcher eine
Administratoranmeldung und damit Zugang zum Administrationsmenü ermöglicht.
Dort kannst du dann weitere Tätigkeiten wie das Installieren von Plugins, das
Dort kannst du dann weitere Tätigkeiten wie das Installieren von Plugins, dass
Verwalten von Nutzern und das Ändern von Konfigurationseinstellungen durchführen.
Das Nutzen der Zugangskontrolle ist nicht zwingend erforderlich, es erleichtert aber
die Administration von DokuWiki.</p>

View File

@ -1,6 +1,6 @@
<?php
/**
* german language file
* german informal language file
*
* @license GPL 2 (http://www.gnu.org/licenses/gpl.html)
* @author Andreas Gohr <andi@splitbrain.org>
@ -67,7 +67,7 @@ $lang['user'] = 'Benutzername';
$lang['pass'] = 'Passwort';
$lang['newpass'] = 'Neues Passwort';
$lang['oldpass'] = 'Bestätigen (Altes Passwort)';
$lang['passchk'] = 'und nochmal';
$lang['passchk'] = 'Passwort erneut eingeben';
$lang['remember'] = 'Angemeldet bleiben';
$lang['fullname'] = 'Voller Name';
$lang['email'] = 'E-Mail';
@ -83,7 +83,7 @@ $lang['regsuccess2'] = 'Der neue Nutzer wurde angelegt.';
$lang['regmailfail'] = 'Offenbar ist ein Fehler beim Versenden der Passwortmail aufgetreten. Bitte wende dich an den Wiki-Admin.';
$lang['regbadmail'] = 'Die angegebene Mail-Adresse scheint ungültig zu sein. Falls dies ein Fehler ist, wende dich bitte an den Wiki-Admin.';
$lang['regbadpass'] = 'Die beiden eingegeben Passwörter stimmen nicht überein. Bitte versuche es noch einmal.';
$lang['regpwmail'] = 'Ihr DokuWiki Passwort';
$lang['regpwmail'] = 'Ihr DokuWiki-Passwort';
$lang['reghere'] = 'Du hast noch keinen Zugang? Hier registrieren';
$lang['profna'] = 'Änderung des Benutzerprofils in diesem Wiki nicht möglich.';
$lang['profnochange'] = 'Keine Änderungen, nichts zu tun.';
@ -92,9 +92,9 @@ $lang['profchanged'] = 'Benutzerprofil erfolgreich geändert.';
$lang['pwdforget'] = 'Passwort vergessen? Fordere ein neues an';
$lang['resendna'] = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
$lang['resendpwd'] = 'Neues Passwort setzen für';
$lang['resendpwdmissing'] = 'Es tut mir Leid, aber du musst alle Felder ausfüllen.';
$lang['resendpwdnouser'] = 'Es tut mir Leid, aber der Benutzer existiert nicht in unserer Datenbank.';
$lang['resendpwdbadauth'] = 'Es tut mir Leid, aber dieser Authentifizierungscode ist ungültig. Stelle sicher, dass du den kompletten Bestätigungslink verwendet haben.';
$lang['resendpwdmissing'] = 'Es tut mir leid, aber du musst alle Felder ausfüllen.';
$lang['resendpwdnouser'] = 'Es tut mir leid, aber der Benutzer existiert nicht in unserer Datenbank.';
$lang['resendpwdbadauth'] = 'Es tut mir leid, aber dieser Authentifizierungscode ist ungültig. Stelle sicher, dass du den kompletten Bestätigungslink verwendet haben.';
$lang['resendpwdconfirm'] = 'Ein Bestätigungslink wurde per E-Mail versandt.';
$lang['resendpwdsuccess'] = 'Dein neues Passwort wurde per E-Mail versandt.';
$lang['license'] = 'Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:';
@ -137,7 +137,7 @@ $lang['js']['nosmblinks'] = 'Das Verlinken von Windows-Freigaben funktionie
$lang['js']['linkwiz'] = 'Link-Assistent';
$lang['js']['linkto'] = 'Link zu:';
$lang['js']['del_confirm'] = 'Die ausgewählten Dateien wirklich löschen?';
$lang['js']['restore_confirm'] = 'Wirkliich diese Version wieder herstellen?';
$lang['js']['restore_confirm'] = 'Wirklich diese Version wiederherstellen?';
$lang['js']['media_diff'] = 'Unterschiede anzeigen:';
$lang['js']['media_diff_both'] = 'Seite für Seite';
$lang['js']['media_diff_opacity'] = 'Überblenden';
@ -161,7 +161,7 @@ $lang['uploadspam'] = 'Hochladen verweigert: Treffer auf der Spamlist
$lang['uploadxss'] = 'Hochladen verweigert: Daten scheinen Schadcode zu enthalten.';
$lang['uploadsize'] = 'Die hochgeladene Datei war zu groß. (max. %s)';
$lang['deletesucc'] = 'Die Datei "%s" wurde gelöscht.';
$lang['deletefail'] = '"%s" konnte nicht gelöscht werden. Keine Berechtigung?.';
$lang['deletefail'] = '"%s" konnte nicht gelöscht werden. Keine Berechtigung?.';
$lang['mediainuse'] = 'Die Datei "%s" wurde nicht gelöscht. Sie wird noch verwendet.';
$lang['namespaces'] = 'Namensräume';
$lang['mediafiles'] = 'Vorhandene Dateien in';
@ -181,7 +181,7 @@ $lang['current'] = 'aktuell';
$lang['yours'] = 'Deine Version';
$lang['diff'] = 'Zeige Unterschiede zu aktueller Version';
$lang['diff2'] = 'Zeige Unterschiede der ausgewählten Versionen';
$lang['difflink'] = 'Link zu der Versionshistorie';
$lang['difflink'] = 'Link zu der Vergleichsansicht';
$lang['diff_type'] = 'Unterschiede anzeigen:';
$lang['diff_inline'] = 'Inline';
$lang['diff_side'] = 'Side by Side';
@ -196,15 +196,16 @@ $lang['restored'] = 'alte Version wiederhergestellt (%s)';
$lang['external_edit'] = 'Externe Bearbeitung';
$lang['summary'] = 'Zusammenfassung';
$lang['noflash'] = 'Das <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> wird benötigt, um diesen Inhalt anzuzeigen.';
$lang['download'] = 'Download-Teil';
$lang['download'] = 'Schnipsel herunterladen';
$lang['tools'] = 'Werkzeuge';
$lang['user_tools'] = 'Benutzer-Werkzeuge';
$lang['site_tools'] = 'Webseiten-Werkzeuge';
$lang['page_tools'] = 'Seiten-Werkzeuge';
$lang['skip_to_content'] = 'zum Inhalt springen';
$lang['sidebar'] = 'Seitenleiste';
$lang['mail_newpage'] = 'Neue Seite:';
$lang['mail_changed'] = 'Seite geändert:';
$lang['mail_subscribe_list'] = 'Seite hat sich im Namespace geändert:';
$lang['mail_subscribe_list'] = 'Geänderte Seiten im Namensraum:';
$lang['mail_new_user'] = 'Neuer Benutzer:';
$lang['mail_upload'] = 'Datei hochgeladen:';
$lang['changes_type'] = 'Änderungen anzeigen von';
@ -272,14 +273,14 @@ $lang['subscr_style_digest'] = 'E-Mail mit zusammengefasster Übersicht der Se
$lang['subscr_style_list'] = 'Auflistung aller geänderten Seiten seit der letzten E-Mail (alle %.2f Tage)';
$lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wende dich an den Admin.';
$lang['authtempfail'] = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wende dich an den Admin.';
$lang['authpwdexpire'] = 'Dein Passwort läuft in %d Tag(en) ab, du solltest es es bald ändern.';
$lang['authpwdexpire'] = 'Dein Passwort läuft in %d Tag(en) ab. Du solltest es es frühzeitig ändern.';
$lang['i_chooselang'] = 'Wähle deine Sprache';
$lang['i_installer'] = 'DokuWiki-Installation';
$lang['i_wikiname'] = 'Wiki-Name';
$lang['i_enableacl'] = 'Zugangskontrolle (ACL) aktivieren (empfohlen)';
$lang['i_superuser'] = 'Benutzername des Administrators';
$lang['i_problems'] = 'Das Installationsprogramm hat unten aufgeführte Probleme festgestellt, die zunächst behoben werden müssen, bevor du mit der Installation fortfahren kannst.';
$lang['i_modified'] = 'Aus Sicherheitsgründen arbeitet dieses Script nur mit einer neuen, unmodifizierten DokuWiki-Installation. Du solltest entweder alle Dateien noch einmal frisch installieren oder die <a href="http://dokuwiki.org/install">Dokuwiki-Installationsanleitung</a> konsultieren.';
$lang['i_modified'] = 'Aus Sicherheitsgründen arbeitet dieses Skript nur mit einer neuen bzw. nicht modifizierten DokuWiki-Installation. Du solltest entweder alle Dateien noch einmal frisch installieren oder die <a href="http://dokuwiki.org/install">Dokuwiki-Installationsanleitung</a> konsultieren.';
$lang['i_funcna'] = 'Die PHP-Funktion <code>%s</code> ist nicht verfügbar. Unter Umständen wurde sie von deinem Hoster deaktiviert?';
$lang['i_phpver'] = 'Deine PHP-Version <code>%s</code> ist niedriger als die benötigte Version <code>%s</code>. Bitte aktualisiere deine PHP-Installation.';
$lang['i_permfail'] = '<code>%s</code> ist nicht durch DokuWiki beschreibbar. Du musst die Berechtigungen dieses Ordners ändern!';
@ -287,12 +288,12 @@ $lang['i_confexists'] = '<code>%s</code> existiert bereits';
$lang['i_writeerr'] = '<code>%s</code> konnte nicht erzeugt werden. Du solltest die Verzeichnis-/Datei-Rechte überprüfen und die Datei manuell anlegen.';
$lang['i_badhash'] = 'Unbekannte oder modifizierte dokuwiki.php (Hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - unerlaubter oder leerer Wert';
$lang['i_success'] = 'Die Konfiguration wurde erfolgreich abgeschlossen. Du kannst jetzt die install.php löschen. Dein <a href="doku.php">neues DokuWiki</a> ist jetzt für dich bereit.';
$lang['i_failure'] = 'Es sind Fehler beim Schreiben der Konfigurationsdateien aufgetreten. Du musst diese vermutlich von Hand beheben, bevor du dein <a href="doku.php">neues DokuWiki</a> nutzen kannst.';
$lang['i_policy'] = 'Anfangseinstellungr Zugangskontrolle (ACL)';
$lang['i_pol0'] = 'Offenes Wiki (lesen, schreiben, hochladen für alle)';
$lang['i_pol1'] = 'Öffentliches Wiki (lesen für alle, schreiben und hochladen für registrierte Nutzer)';
$lang['i_pol2'] = 'Geschlossenes Wiki (lesen, schreiben, hochladen nur für registrierte Nutzer)';
$lang['i_success'] = 'Die Konfiguration wurde erfolgreich abgeschlossen. Du kannst jetzt die install.php löschen. Dein <a href="doku.php?id=wiki:welcome">neues DokuWiki</a> ist jetzt für dich bereit.';
$lang['i_failure'] = 'Es sind Fehler beim Schreiben der Konfigurationsdateien aufgetreten. Du musst diese von Hand beheben, bevor du dein <a href="doku.php?id=wiki:welcome">neues DokuWiki</a> nutzen kannst.';
$lang['i_policy'] = 'Anfangseinstellungen der Zugangskontrolle (ACL)';
$lang['i_pol0'] = 'Offenes Wiki (lesen, schreiben und hochladen für alle Nutzer)';
$lang['i_pol1'] = 'Öffentliches Wiki (Lesen für alle, Schreiben und Hochladen nur für registrierte Nutzer)';
$lang['i_pol2'] = 'Geschlossenes Wiki (Lesen, Schreiben und Hochladen nur für registrierte Nutzer)';
$lang['i_retry'] = 'Wiederholen';
$lang['i_license'] = 'Bitte wähle die Lizenz aus unter der die Wiki-Inhalte veröffentlicht werden sollen:';
$lang['recent_global'] = 'Im Moment siehst du die Änderungen im Namensraum <b>%s</b>. Du kannst auch <a href="%s">die Änderungen im gesamten Wiki sehen</a>.';

View File

@ -15,7 +15,7 @@ Neue Revision: @NEWPAGE@
Um das Abonnement für diese Seite aufzulösen, melde dich im Wiki an
@DOKUWIKIURL@, besuche dann
@NEWPAGE@
@SUBSCRIBE@
und klicke auf den Link 'Aboverwaltung'.
--

View File

@ -1,10 +1,10 @@
<p>Diese Seite hilft Ihnen bei der Erst-Installation und Konfiguration von
<a href="http://dokuwiki.org">Dokuwiki</a>. Zusätzliche Informationen zu
<p>Diese Seite hilft Ihnen bei der Erstinstallation und Konfiguration von
<a href="http://dokuwiki.org">DokuWiki</a>. Zusätzliche Informationen zu
diesem Installationsskript finden Sie auf der entsprechenden
<a href="http://dokuwiki.org/installer">Hilfe Seite</a> (en).</p>
<p>DokuWiki verwendet normale Dateien für das Speichern von Wikiseiten und
anderen Informationen (Bilder, Suchindizes, alte Versionen, usw.).
anderen Informationen (Bilder, Suchindizes, alte Versionen usw.).
Um DokuWiki betreiben zu können, <strong>muss</strong> Schreibzugriff auf die
Verzeichnisse bestehen, in denen DokuWiki diese Dateien ablegt. Dieses
Installationsprogramm kann diese Rechte nicht für Sie setzen. Sie müssen dies
@ -14,7 +14,7 @@ hosten, über FTP oder ein entsprechendes Werkzeug (z.B. cPanel) durchführen.</
<p>Dieses Skript hilft Ihnen beim ersten Einrichten des Zugangsschutzes
(<abbr title="access control list">ACL</abbr>) von DokuWiki, welcher eine
Administratoranmeldung und damit Zugang zum Administrationsmenu ermöglicht.
Dort können Sie dann weitere Tätigkeiten wie das Installieren von Plugins, das
Dort können Sie dann weitere Tätigkeiten wie das Installieren von Plugins, dass
Verwalten von Nutzern und das Ändern von Konfigurationseinstellungen durchführen.
Das Nutzen der Zugangskontrolle ist nicht zwingend erforderlich, es erleichtert aber
die Administration von DokuWiki.</p>

View File

@ -69,7 +69,7 @@ $lang['user'] = 'Benutzername';
$lang['pass'] = 'Passwort';
$lang['newpass'] = 'Neues Passwort';
$lang['oldpass'] = 'Bestätigen (Altes Passwort)';
$lang['passchk'] = 'und nochmal';
$lang['passchk'] = 'Passwort erneut eingeben';
$lang['remember'] = 'Angemeldet bleiben';
$lang['fullname'] = 'Voller Name';
$lang['email'] = 'E-Mail';
@ -85,7 +85,7 @@ $lang['regsuccess2'] = 'Der neue Nutzer wurde angelegt.';
$lang['regmailfail'] = 'Offenbar ist ein Fehler beim Versenden der Passwort-E-Mail aufgetreten. Bitte wenden Sie sich an den Wiki-Admin.';
$lang['regbadmail'] = 'Die angegebene E-Mail-Adresse scheint ungültig zu sein. Falls dies ein Fehler ist, wenden Sie sich bitte an den Wiki-Admin.';
$lang['regbadpass'] = 'Die beiden eingegeben Passwörter stimmen nicht überein. Bitte versuchen Sie es noch einmal.';
$lang['regpwmail'] = 'Ihr DokuWiki Passwort';
$lang['regpwmail'] = 'Ihr DokuWiki-Passwort';
$lang['reghere'] = 'Sie haben noch keinen Zugang? Hier registrieren';
$lang['profna'] = 'Änderung des Benutzerprofils in diesem Wiki nicht möglich.';
$lang['profnochange'] = 'Keine Änderungen, nichts zu tun.';
@ -94,9 +94,9 @@ $lang['profchanged'] = 'Benutzerprofil erfolgreich geändert.';
$lang['pwdforget'] = 'Passwort vergessen? Fordere ein neues an';
$lang['resendna'] = 'Passwörter versenden ist in diesem Wiki nicht möglich.';
$lang['resendpwd'] = 'Neues Passwort setzen für';
$lang['resendpwdmissing'] = 'Es tut mir Leid, aber Sie müssen alle Felder ausfüllen.';
$lang['resendpwdnouser'] = 'Es tut mir Leid, aber der Benutzer existiert nicht in unserer Datenbank.';
$lang['resendpwdbadauth'] = 'Es tut mir Leid, aber dieser Authentifizierungscode ist ungültig. Stellen Sie sicher, dass Sie den kompletten Bestätigungslink verwendet haben.';
$lang['resendpwdmissing'] = 'Es tut mir leid, aber Sie müssen alle Felder ausfüllen.';
$lang['resendpwdnouser'] = 'Es tut mir leid, aber der Benutzer existiert nicht in unserer Datenbank.';
$lang['resendpwdbadauth'] = 'Es tut mir leid, aber dieser Authentifizierungscode ist ungültig. Stellen Sie sicher, dass Sie den kompletten Bestätigungslink verwendet haben.';
$lang['resendpwdconfirm'] = 'Ein Bestätigungslink wurde per E-Mail versandt.';
$lang['resendpwdsuccess'] = 'Ihr neues Passwort wurde per E-Mail versandt.';
$lang['license'] = 'Falls nicht anders bezeichnet, ist der Inhalt dieses Wikis unter der folgenden Lizenz veröffentlicht:';
@ -139,7 +139,7 @@ $lang['js']['nosmblinks'] = 'Das Verlinken von Windows-Freigaben funktionie
$lang['js']['linkwiz'] = 'Link-Assistent';
$lang['js']['linkto'] = 'Link nach:';
$lang['js']['del_confirm'] = 'Eintrag wirklich löschen?';
$lang['js']['restore_confirm'] = 'Really restore this version?';
$lang['js']['restore_confirm'] = 'Wirklich diese Version wiederherstellen?';
$lang['js']['media_diff'] = 'Unterschiede anzeigen:';
$lang['js']['media_diff_both'] = 'Side by Side';
$lang['js']['media_diff_opacity'] = 'Überblenden';
@ -204,6 +204,7 @@ $lang['user_tools'] = 'Benutzer-Werkzeuge';
$lang['site_tools'] = 'Webseiten-Werkzeuge';
$lang['page_tools'] = 'Seiten-Werkzeuge';
$lang['skip_to_content'] = 'zum Inhalt springen';
$lang['sidebar'] = 'Seitenleiste';
$lang['mail_newpage'] = 'Neue Seite:';
$lang['mail_changed'] = 'Seite geändert:';
$lang['mail_subscribe_list'] = 'Geänderte Seiten im Namensraum:';
@ -272,16 +273,16 @@ $lang['subscr_m_receive'] = 'Benachrichtigung';
$lang['subscr_style_every'] = 'E-Mail bei jeder Bearbeitung';
$lang['subscr_style_digest'] = 'Zusammenfassung der Änderungen für jede veränderte Seite (Alle %.2f Tage)';
$lang['subscr_style_list'] = 'Liste der geänderten Seiten (Alle %.2f Tage)';
$lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wenden Sie sich an den Systembetreuer.';
$lang['authtempfail'] = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wenden Sie sich an den Systembetreuer.';
$lang['authpwdexpire'] = 'Ihr Passwort läuft in %d Tag(en) ab, Sie sollten es bald ändern.';
$lang['authmodfailed'] = 'Benutzerüberprüfung nicht möglich. Bitte wenden Sie sich an den Admin.';
$lang['authtempfail'] = 'Benutzerüberprüfung momentan nicht möglich. Falls das Problem andauert, wenden Sie sich an den Admin.';
$lang['authpwdexpire'] = 'Ihr Passwort läuft in %d Tag(en) ab. Sie sollten es frühzeitig ändern.';
$lang['i_chooselang'] = 'Wählen Sie Ihre Sprache';
$lang['i_installer'] = 'DokuWiki Installation';
$lang['i_wikiname'] = 'Wiki-Name';
$lang['i_enableacl'] = 'Zugangskontrolle (ACL) aktivieren (empfohlen)';
$lang['i_superuser'] = 'Administrator Benutzername';
$lang['i_superuser'] = 'Benutzername des Administrators';
$lang['i_problems'] = 'Das Installationsprogramm hat unten aufgeführte Probleme festgestellt, die zunächst behoben werden müssen bevor Sie mit der Installation fortfahren können.';
$lang['i_modified'] = 'Aus Sicherheitsgründen arbeitet dieses Script nur mit einer neuen, unmodifizierten DokuWiki Installation. Sie sollten entweder alle Dateien noch einmal frisch installieren oder die <a href="http://dokuwiki.org/install">Dokuwiki-Installationsanleitung</a> konsultieren.';
$lang['i_modified'] = 'Aus Sicherheitsgründen arbeitet dieses Skript nur mit einer neuen bzw. nicht modifizierten DokuWiki Installation. Sie sollten entweder alle Dateien noch einmal frisch installieren oder die <a href="http://dokuwiki.org/install">Dokuwiki-Installationsanleitung</a> konsultieren.';
$lang['i_funcna'] = 'Die PHP-Funktion <code>%s</code> ist nicht verfügbar. Unter Umständen wurde sie von Ihrem Hoster deaktiviert?';
$lang['i_phpver'] = 'Ihre PHP-Version <code>%s</code> ist niedriger als die benötigte Version <code>%s</code>. Bitte aktualisieren Sie Ihre PHP-Installation.';
$lang['i_permfail'] = '<code>%s</code> ist nicht durch DokuWiki beschreibbar. Sie müssen die Berechtigungen dieses Ordners ändern!';
@ -289,12 +290,12 @@ $lang['i_confexists'] = '<code>%s</code> existiert bereits';
$lang['i_writeerr'] = '<code>%s</code> konnte nicht erzeugt werden. Sie sollten die Verzeichnis-/Datei-Rechte überprüfen und die Datei manuell anlegen.';
$lang['i_badhash'] = 'Unbekannte oder modifizierte dokuwiki.php (Hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - unerlaubter oder leerer Wert';
$lang['i_success'] = 'Die Konfiguration wurde erfolgreich abgeschlossen. Sie können jetzt die install.php löschen. Ihr <a href="doku.php">neues DokuWiki</a> ist jetzt für Sie bereit.';
$lang['i_failure'] = 'Es sind Fehler beim Schreiben der Konfigurationsdateien aufgetreten. Sie müssen diese vermutlich von Hand beheben, bevor Sie Ihr <a href="doku.php">neues DokuWiki</a> nutzen können.';
$lang['i_policy'] = 'Anfangseinstellungr Zugangskontrolle (ACL)';
$lang['i_pol0'] = 'Offenes Wiki (lesen, schreiben, hochladen für alle)';
$lang['i_pol1'] = 'Öffentliches Wiki (lesen für alle, schreiben und hochladen für registrierte Nutzer)';
$lang['i_pol2'] = 'Geschlossenes Wiki (lesen, schreiben, hochladen nur für registrierte Nutzer)';
$lang['i_success'] = 'Die Konfiguration wurde erfolgreich abgeschlossen. Sie können jetzt die install.php löschen. Ihr <a href="doku.php?id=wiki:welcome">neues DokuWiki</a> ist jetzt für Sie bereit.';
$lang['i_failure'] = 'Es sind Fehler beim Schreiben der Konfigurationsdateien aufgetreten. Sie müssen diese von Hand beheben, bevor Sie Ihr <a href="doku.php?id=wiki:welcome">neues DokuWiki</a> nutzen können.';
$lang['i_policy'] = 'Anfangseinstellungen der Zugangskontrolle (ACL)';
$lang['i_pol0'] = 'Offenes Wiki (lesen, schreiben und hochladen für alle Nutzer)';
$lang['i_pol1'] = 'Öffentliches Wiki (Lesen für alle, Schreiben und Hochladen nur für registrierte Nutzer)';
$lang['i_pol2'] = 'Geschlossenes Wiki (Lesen, Schreiben und Hochladen nur für registrierte Nutzer)';
$lang['i_retry'] = 'Wiederholen';
$lang['i_license'] = 'Bitte wählen Sie die Lizenz, unter die Sie Ihre Inhalte stellen möchten:';
$lang['recent_global'] = 'Im Moment sehen Sie die Änderungen im Namensraum <b>%s</b>. Sie können auch <a href="%s">die Änderungen im gesamten Wiki sehen</a>.';
@ -318,8 +319,8 @@ $lang['media_sort_name'] = 'nach Name';
$lang['media_sort_date'] = 'nach Datum';
$lang['media_namespaces'] = 'Namensraum wählen';
$lang['media_files'] = 'Dateien in %s';
$lang['media_upload'] = 'In den <strong>%s</strong> Namespace hochladen.';
$lang['media_search'] = 'Im Namespace <strong>%s</strong> suchen.';
$lang['media_upload'] = 'In den <strong>%s</strong> Namensraum hochladen.';
$lang['media_search'] = 'Im Namensraum <strong>%s</strong> suchen.';
$lang['media_view'] = '%s';
$lang['media_viewold'] = '%s in %s';
$lang['media_edit'] = '%s bearbeiten';

View File

@ -15,7 +15,7 @@ Neue Revision: @NEWPAGE@
Um das Abonnement für diese Seite aufzulösen, melden Sie sich im Wiki an
@DOKUWIKIURL@, besuchen dann
@NEWPAGE@
@SUBSCRIBE@
und klicken auf die Taste 'Aboverwaltung'.
--

View File

@ -8,6 +8,7 @@
* @author Konstantinos Koryllos <koryllos@gmail.com>
* @author George Petsagourakis <petsagouris@gmail.com>
* @author Petros Vidalis <pvidalis@gmail.com>
* @author Vasileios Karavasilis vasileioskaravasilis@gmail.com
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@ -43,6 +44,7 @@ $lang['btn_backtomedia'] = 'Επιστροφή στην επιλογή α
$lang['btn_subscribe'] = 'Εγγραφή σε λήψη ενημερώσεων σελίδας';
$lang['btn_profile'] = 'Επεξεργασία προφίλ';
$lang['btn_reset'] = 'Ακύρωση';
$lang['btn_resendpwd'] = 'Εισαγωγή νέου κωδικού';
$lang['btn_draft'] = 'Επεξεργασία αυτόματα αποθηκευμένης σελίδας';
$lang['btn_recover'] = 'Επαναφορά αυτόματα αποθηκευμένης σελίδας';
$lang['btn_draftdel'] = 'Διαγραφή αυτόματα αποθηκευμένης σελίδας';
@ -79,6 +81,7 @@ $lang['profnoempty'] = 'Δεν επιτρέπεται κενό όνο
$lang['profchanged'] = 'Το προφίλ χρήστη τροποποιήθηκε επιτυχώς.';
$lang['pwdforget'] = 'Ξεχάσατε το κωδικό σας; Αποκτήστε νέο.';
$lang['resendna'] = 'Αυτό το wiki δεν υποστηρίζει την εκ\' νέου αποστολή κωδικών.';
$lang['resendpwd'] = 'Εισαγωγή νέου ωδικού για';
$lang['resendpwdmissing'] = 'Πρέπει να συμπληρώσετε όλα τα πεδία.';
$lang['resendpwdnouser'] = 'Αυτός ο χρήστης δεν υπάρχει στα αρχεία μας.';
$lang['resendpwdbadauth'] = 'Αυτός ο κωδικός ενεργοποίησης δεν είναι έγκυρος.';
@ -91,6 +94,7 @@ $lang['searchmedia_in'] = 'Αναζήτηση σε %s';
$lang['txt_upload'] = 'Επιλέξτε αρχείο για φόρτωση';
$lang['txt_filename'] = 'Επιλέξτε νέο όνομα αρχείου (προαιρετικό)';
$lang['txt_overwrt'] = 'Αντικατάσταση υπάρχοντος αρχείου';
$lang['maxuploadsize'] = 'Μέγιστο μέγεθος αρχείου: %s.';
$lang['lockedby'] = 'Προσωρινά κλειδωμένο από';
$lang['lockexpire'] = 'Το κλείδωμα λήγει στις';
$lang['js']['willexpire'] = 'Το κλείδωμά σας για την επεξεργασία αυτής της σελίδας θα λήξει σε ένα λεπτό.\n Για να το ανανεώσετε χρησιμοποιήστε την Προεπισκόπηση.';
@ -185,6 +189,12 @@ $lang['external_edit'] = 'εξωτερική τροποποίηση';
$lang['summary'] = 'Επεξεργασία σύνοψης';
$lang['noflash'] = 'Το <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash Plugin</a> απαιτείται για την προβολή αυτού του στοιχείου.';
$lang['download'] = 'Λήψη Κώδικα';
$lang['tools'] = 'Εργαλεία';
$lang['user_tools'] = 'Εργαλεία Χρήστη';
$lang['site_tools'] = 'Εργαλεία ιστότοπου';
$lang['page_tools'] = 'Εργαλεία ιστοσελίδας';
$lang['skip_to_content'] = 'παράληψη περιεχομένων';
$lang['sidebar'] = 'Sidebar';
$lang['mail_newpage'] = 'σελίδα προστέθηκε:';
$lang['mail_changed'] = 'σελίδα τροποποιήθηκε:';
$lang['mail_subscribe_list'] = 'σελίδες που άλλαξαν στον φάκελο:';
@ -255,6 +265,7 @@ $lang['subscr_style_digest'] = 'συνοπτικό email αλλαγών της
$lang['subscr_style_list'] = 'λίστα σελίδων με αλλαγές μετά από το τελευταίο email (κάθε %.2f μέρες)';
$lang['authmodfailed'] = 'Κακή ρύθμιση λίστας χρηστών. Παρακαλούμε ενημερώστε τον διαχειριστή του wiki.';
$lang['authtempfail'] = 'Η συνδεση χρηστών είναι απενεργοποιημένη αυτή την στιγμή. Αν αυτό διαρκέσει για πολύ, παρακαλούμε ενημερώστε τον διαχειριστή του wiki.';
$lang['authpwdexpire'] = 'Ο κωδικός πρόσβασης θα λήξει σε %s ημέρες. Προτείνουμε να τον αλλάξετε σύντομα.';
$lang['i_chooselang'] = 'Επιλογή γλώσσας';
$lang['i_installer'] = 'Οδηγός εγκατάστασης DokuWiki';
$lang['i_wikiname'] = 'Ονομασία wiki';
@ -289,16 +300,20 @@ $lang['seconds'] = 'πριν %d δευτερόλεπτα';
$lang['wordblock'] = 'Η αλλαγή σας δεν αποθηκεύτηκε γιατί περιείχε spam.';
$lang['media_uploadtab'] = 'Φόρτωση';
$lang['media_searchtab'] = 'Αναζήτηση';
$lang['media_file'] = 'Αρχείο';
$lang['media_viewtab'] = 'Εμφάνιση';
$lang['media_edittab'] = 'Επεξεργασία';
$lang['media_historytab'] = 'Ιστορικό';
$lang['media_thumbsview'] = 'Προεπισκόπιση';
$lang['media_listview'] = 'Λίστα';
$lang['media_sort'] = 'Ταξινόμιση';
$lang['media_list_thumbs'] = 'Μικρογραφίες';
$lang['media_list_rows'] = 'Γραμμές';
$lang['media_sort_name'] = 'ανά όνομα';
$lang['media_sort_date'] = 'ανά ημερομηνία';
$lang['media_namespaces'] = 'Επιλογή namespace';
$lang['media_files'] = 'Αρχεία στο %s φάκελο';
$lang['media_upload'] = 'Φόρτωση στο <strong>%s</strong> φάκελο.';
$lang['media_search'] = 'Αναζήτηση στο <strong>%s</strong> φάκελο.';
$lang['media_view'] = '%s';
$lang['media_viewold'] = '%s στα %s';
$lang['media_edit'] = 'Επεξεργασία';
$lang['media_history'] = 'Αυτές είναι οι παλαιότερες αναθεωρήσεις του αρχείου.';
$lang['media_meta_edited'] = 'τα μεταδεδομένα επεξεργάστηκαν';

13
inc/lang/el/mailwrap.html Normal file
View File

@ -0,0 +1,13 @@
<html>
<head>
<title>@TITLE@</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
</head>
<body>
@HTMLBODY@
<br /><hr />
<small>Το email έχει δημιουργηθεί από το DokuWiki στις @DOKUWIKIURL@.</small>
</body>
</html>

3
inc/lang/el/resetpwd.txt Normal file
View File

@ -0,0 +1,3 @@
====== Εισάγετε νέο κωδικό πρόσβασης ======
Παρακαλούμε, εισάγετε έναν νέο κωδικό πρόσβασης για τον λογαριασμό σας.

View File

@ -302,15 +302,18 @@ $lang['i_writeerr'] = 'Unable to create <code>%s</code>. You will nee
$lang['i_badhash'] = 'unrecognised or modified dokuwiki.php (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - illegal or empty value';
$lang['i_success'] = 'The configuration was finished successfully. You may delete the install.php file now. Continue to
<a href="doku.php">your new DokuWiki</a>.';
<a href="doku.php?id=wiki:welcome">your new DokuWiki</a>.';
$lang['i_failure'] = 'Some errors occurred while writing the configuration files. You may need to fix them manually before
you can use <a href="doku.php">your new DokuWiki</a>.';
you can use <a href="doku.php?id=wiki:welcome">your new DokuWiki</a>.';
$lang['i_policy'] = 'Initial ACL policy';
$lang['i_pol0'] = 'Open Wiki (read, write, upload for everyone)';
$lang['i_pol1'] = 'Public Wiki (read for everyone, write and upload for registered users)';
$lang['i_pol2'] = 'Closed Wiki (read, write, upload for registered users only)';
$lang['i_retry'] = 'Retry';
$lang['i_license'] = 'Please choose the license you want to put your content under:';
$lang['i_license_none'] = 'Do not show any license information';
$lang['i_pop_field'] = 'Please, help us to improve the DokuWiki experience:';
$lang['i_pop_label'] = 'Once a month, send anonymous usage data to the DokuWiki developers';
$lang['recent_global'] = 'You\'re currently watching the changes inside the <b>%s</b> namespace. You can also <a href="%s">view the recent changes of the whole wiki</a>.';
$lang['years'] = '%d years ago';

View File

@ -15,7 +15,7 @@ New Revision: @NEWPAGE@
To cancel the page notifications, log into the wiki at
@DOKUWIKIURL@ then visit
@NEWPAGE@
@SUBSCRIBE@
and unsubscribe page and/or namespace changes.
--

View File

@ -281,8 +281,8 @@ $lang['i_confexists'] = '<code>%s</code> jam ekzistas';
$lang['i_writeerr'] = 'Ne eblas krei "<code>%s</code>". Vi bezonas kontroli la permesojn de la dosier(uj)oj kaj mem krej la dosieron.';
$lang['i_badhash'] = 'dokuwiki.php ne estas rekonebla aŭ ĝi estas modifita (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - malvalida aŭ malplena valoro';
$lang['i_success'] = 'La agordado sukcese kompletiĝis. Vi povas forigi la dosieron nun. Pluiru al <a href="doku.php">via nova DokuWiki</a>.';
$lang['i_failure'] = 'Kelkaj eraroj okazis dum la konservo de la agordaj dosieroj. Vi devas senpere korekti ilin antaŭ ol vi povos uzi <a href="doku.php">vian novan DokuWiki-on</a>. ';
$lang['i_success'] = 'La agordado sukcese kompletiĝis. Vi povas forigi la dosieron nun. Pluiru al <a href="doku.php?id=wiki:welcome">via nova DokuWiki</a>.';
$lang['i_failure'] = 'Kelkaj eraroj okazis dum la konservo de la agordaj dosieroj. Vi devas senpere korekti ilin antaŭ ol vi povos uzi <a href="doku.php?id=wiki:welcome">vian novan DokuWiki-on</a>. ';
$lang['i_policy'] = 'Komenca ACL-a agordo';
$lang['i_pol0'] = 'Malferma Vikio (legi, skribi, alŝuti povas ĉiuj)';
$lang['i_pol1'] = 'Publika Vikio (legi povas ĉiuj, skribi kaj alŝuti povas registritaj uzantoj)';

View File

@ -15,7 +15,7 @@ Nova versio: @NEWPAGE@
Por nuligi la paĝinformojn, ensalutu la vikion ĉe
@DOKUWIKIURL@, poste iru al
@NEWPAGE@
@SUBSCRIBE@
kaj malabonu la paĝajn kaj/aŭ nomspacajn ŝanĝojn.
--

View File

@ -299,8 +299,8 @@ $lang['i_confexists'] = '<code>%s</code> ya existe';
$lang['i_writeerr'] = 'Imposible crear <code>%s</code>. Se necesita que usted controle los permisos del fichero/directorio y que cree el fichero manualmente.';
$lang['i_badhash'] = 'dokuwiki.php no reconocido o modificado (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - valor ilegal o vacío';
$lang['i_success'] = 'La configuración ha concluido correctamente. Ahora puede eliminar el archivo install.php. Visite <a href="doku.php">su nuevo DokuWiki</a>.';
$lang['i_failure'] = 'Han ocurrido algunos errores durante la escritura de los ficheros de configuración. Puede ser que necesite corregirlos manualmente antes de poder usar <a href="doku.php">su nuevo DokuWiki</a>.';
$lang['i_success'] = 'La configuración ha concluido correctamente. Ahora puede eliminar el archivo install.php. Visite <a href="doku.php?id=wiki:welcome">su nuevo DokuWiki</a>.';
$lang['i_failure'] = 'Han ocurrido algunos errores durante la escritura de los ficheros de configuración. Puede ser que necesite corregirlos manualmente antes de poder usar <a href="doku.php?id=wiki:welcome">su nuevo DokuWiki</a>.';
$lang['i_policy'] = 'Política de ACL inicial';
$lang['i_pol0'] = 'Wiki abierto (leer, escribir y subir archivos para todos)';
$lang['i_pol1'] = 'Wiki público (leer para todos, escribir y subir archivos para usuarios registrados únicamente)';

View File

@ -223,8 +223,8 @@ $lang['i_permfail'] = 'Dokuwiki ei saa kirjutada faili <code>%s</code
$lang['i_confexists'] = '<code>%s</code> on juba olemas';
$lang['i_writeerr'] = 'Faili <code>%s</code> ei lubata tekitada. Kontrolli kataloogi ja faili õigusi.';
$lang['i_badval'] = '<code>%s</code> - lubamatu või tühi väärtus';
$lang['i_success'] = 'Seadistamine on õnnelikult lõpule viidud. Sa võid nüüd kustutada faili install.php. Alusta oma <a href="doku.php">uue DokuWiki</a> täitmist.';
$lang['i_failure'] = 'Konfiguratsiooni faili kirjutamisel esines vigu. Võimalik, et pead need käsitsi parandama enne <a href="doku.php">uue DokuWiki</a> täitma asumist.';
$lang['i_success'] = 'Seadistamine on õnnelikult lõpule viidud. Sa võid nüüd kustutada faili install.php. Alusta oma <a href="doku.php?id=wiki:welcome">uue DokuWiki</a> täitmist.';
$lang['i_failure'] = 'Konfiguratsiooni faili kirjutamisel esines vigu. Võimalik, et pead need käsitsi parandama enne <a href="doku.php?id=wiki:welcome">uue DokuWiki</a> täitma asumist.';
$lang['i_policy'] = 'Wiki õiguste algne poliitika';
$lang['i_pol0'] = 'Avatud (lugemine, kirjutamine ja üleslaadimine kõigile lubatud)';
$lang['i_pol1'] = 'Avalikuks lugemiseks (lugeda saavad kõik, kirjutada ja üles laadida vaid registreeritud kasutajad)';

View File

@ -274,8 +274,8 @@ $lang['i_confexists'] = '<code>%s</code> lehendik existitzen da';
$lang['i_writeerr'] = 'Ezin da <code>%s</code> sortu. Direktorioaren/fitxategiaren baimenak egiaztatu eta sortu fitxategia eskuz.';
$lang['i_badhash'] = 'aldatutakoa edo ezezaguna den dokuwiki.php (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - balioa arauen aurka edo hutsa';
$lang['i_success'] = 'Konfigurazioa arrakastaz amaitu da. Orain, install.php fitxategia ezabatu dezakezu. Jarraitu ezazu <a href="doku.php">zure DokuWiki berrian</a>.';
$lang['i_failure'] = 'Akats batzuk gertatu dira konfigurazio fitxategiak idazterakoan. Hauek eskuz konpondu beharra izan dezakezu <a href="doku.php">zure DokuWiki berria</a> erabili ahal izan aurretik.';
$lang['i_success'] = 'Konfigurazioa arrakastaz amaitu da. Orain, install.php fitxategia ezabatu dezakezu. Jarraitu ezazu <a href="doku.php?id=wiki:welcome">zure DokuWiki berrian</a>.';
$lang['i_failure'] = 'Akats batzuk gertatu dira konfigurazio fitxategiak idazterakoan. Hauek eskuz konpondu beharra izan dezakezu <a href="doku.php?id=wiki:welcome">zure DokuWiki berria</a> erabili ahal izan aurretik.';
$lang['i_policy'] = 'Hasierako ACL politika';
$lang['i_pol0'] = 'Wiki Irekia (irakurri, idatzi, fitxategiak igo edonorentzat)';
$lang['i_pol1'] = 'Wiki Publikoa (irakurri edonorentzat, idatzi eta fitxategiak igo erregistratutako erabiltzaileentzat)';

View File

@ -285,8 +285,8 @@ $lang['i_confexists'] = '<code>%s</code> پیش‌تر موجود اس
$lang['i_writeerr'] = 'توانایی ایجاد <code>%s</code> نیست. شما باید دسترسی‌های شاخه یا فایل را بررسی کنید و فایل را به طور دستی ایجاد کنید.';
$lang['i_badhash'] = 'فایل dokuwiki.php غیرقابل تشخیص بوده یا تغییر کرده است (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - غیرقانونی و یا مقادیر تهی';
$lang['i_success'] = 'تنظیمات با موفقیت به پایان رسید. بهتر است فایل install.php رو حذف کنید. برای ادامه <a href="doku.php">این‌جا</a> کلیک کنید.';
$lang['i_failure'] = 'مشکلاتی در زمان نوشتن فایل تنظیمات پیش آمده است. شما باید این مشکلات را پیش از استفاده از <a href="doku.php">DokuWiki</a> برطرف کنید.';
$lang['i_success'] = 'تنظیمات با موفقیت به پایان رسید. بهتر است فایل install.php رو حذف کنید. برای ادامه <a href="doku.php?id=wiki:welcome">این‌جا</a> کلیک کنید.';
$lang['i_failure'] = 'مشکلاتی در زمان نوشتن فایل تنظیمات پیش آمده است. شما باید این مشکلات را پیش از استفاده از <a href="doku.php?id=wiki:welcome">DokuWiki</a> برطرف کنید.';
$lang['i_policy'] = 'کنترل دسترسی‌های اولیه';
$lang['i_pol0'] = 'ویکی باز (همه می‌توانند بخوانند، بنویسند و فایل ارسال کنند)';
$lang['i_pol1'] = 'ویکی عمومی (همه می‌توانند بخوانند، کاربران ثبت شده می‌توانند بنویسند و فایل ارسال کنند)';

View File

@ -279,8 +279,8 @@ $lang['i_confexists'] = '<code>%s</code> on jo olemassa';
$lang['i_writeerr'] = '<code>%s</code>n luonti epäonnistui. Tarkista hakemiston/tiedoston oikeudet ja luo tiedosto käsin.';
$lang['i_badhash'] = 'tunnistamaton tai muokattu dokuwiki.php (tarkistussumma=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - väärä tai tyhjä arvo';
$lang['i_success'] = 'Kokoonpano tehty onnistuneesti. Voit poistaa install.php tiedoston. Jatka <a href="doku.php">uuteen DokuWikiisi</a>.';
$lang['i_failure'] = 'Joitain virheitä tapahtui kirjoitettaessa vaadittavia tiedostoja. Sinun pitää korjata ne käsin ennen kuin voit käyttää <a href="doku.php">uutta DokuWikiäsi</a>.';
$lang['i_success'] = 'Kokoonpano tehty onnistuneesti. Voit poistaa install.php tiedoston. Jatka <a href="doku.php?id=wiki:welcome">uuteen DokuWikiisi</a>.';
$lang['i_failure'] = 'Joitain virheitä tapahtui kirjoitettaessa vaadittavia tiedostoja. Sinun pitää korjata ne käsin ennen kuin voit käyttää <a href="doku.php?id=wiki:welcome">uutta DokuWikiäsi</a>.';
$lang['i_policy'] = 'Käyttöoikeuksien oletusmenettelytapa';
$lang['i_pol0'] = 'Avoin Wiki (luku, kirjoitus, tiedostojen lähetys on sallittu kaikille)';
$lang['i_pol1'] = 'Julkinen Wiki (luku kaikilla, kirjoitus ja tiedostojen lähetys rekisteröidyillä käyttäjillä)';

View File

@ -1,4 +1,3 @@
====== Administration ======
Ci-dessous, vous trouverez une liste des tâches administratives disponibles dans DokuWiki.
Ci-dessous, vous trouverez une liste des tâches d'administration disponibles dans DokuWiki.

View File

@ -1 +1 @@
===== Modules supplémentaires =====
===== Extensions =====

View File

@ -1,4 +1,4 @@
====== Pages pointant sur la page en cours ======
Ceci est la liste des pages qui pointent sur la page en cours.
Ceci est la liste des pages qui semblent pointer sur la page actuelle.

View File

@ -1,6 +1,6 @@
====== Une version plus récente existe déjà ======
====== Une version plus récente existe ======
Une version plus récente du document que vous avez modifié existe déjà. Cela se produit lorsqu'un autre utilisateur enregistre le document pendant que vous le modifiez.
Une version plus récente du document que vous avez modifié existe. Cela se produit lorsqu'un autre utilisateur enregistre une nouvelle version du document alors que vous le modifiez.
Examinez attentivement les différences ci-dessous et décidez quelle version conserver. Si vous choisissez « Enregistrer », votre version sera enregistrée. Cliquez sur « Annuler » pour conserver la version actuelle.

View File

@ -1,4 +1,4 @@
====== Différences ======
Cette page vous donne les différences entre la révision choisie et la version actuelle de la page.
Cette page vous affiche les différences entre la révision choisie et la version actuelle de la page.

View File

@ -1,6 +1,6 @@
====== Un fichier brouillon a été trouvé ======
La dernière modification de cette page ne s'est pas terminée proprement. Dokuwiki a enregistré automatiquement un brouillon de votre travail que vous pouvez utiliser pour votre modification. Ci-dessous figurent les données enregistrées lors de votre dernière session.
La dernière modification de cette page ne s'est pas terminée correctement. DokuWiki a enregistré automatiquement un brouillon de votre travail que vous pouvez utiliser pour votre modification. Ci-dessous figurent les données enregistrées lors de votre dernière session.
À vous de décider si vous souhaitez //récupérer// votre session de modification passée, //supprimer// le brouillon enregistré automatiquement ou //annuler// le processus d'édition.
À vous de décider si vous souhaitez //récupérer// votre session de modification précédente, //supprimer// le brouillon enregistré automatiquement ou //annuler// le processus d'édition.

View File

@ -1,2 +1,2 @@
Modifiez cette page et cliquez sur « Enregistrer ». Voyez le [[:wiki:syntax|guide de la mise en page]] pour une aide à propos du formatage. Veuillez ne modifier cette page que si vous pouvez l'**améliorer**. Si vous souhaitez faire des tests, faites vos premiers pas dans le [[:playground:playground|bac à sable]].
Modifiez cette page et cliquez sur « Enregistrer ». Voyez le [[:wiki:syntax|guide de mise en page]] pour une aide à propos du formatage. Veuillez ne modifier cette page que si vous pouvez l'**améliorer**. Si vous souhaitez faire des tests, faites vos premiers pas dans le [[:playground:playground|bac à sable]].

View File

@ -1,4 +1,4 @@
====== Index ======
====== Plan du site ======
Voici un index de toutes les pages disponibles, triées par [[doku>fr:namespaces|catégorie]].
Voici un plan du site de toutes les pages disponibles, triées par [[doku>fr:namespaces|catégories]].

View File

@ -1,13 +1,13 @@
<p>Cette page vous assiste dans la première installation et la
<p>Cette page vous assiste dans l'installation et la
configuration de <a href="http://dokuwiki.org">DokuWiki</a>.
Pour plus d'information sur cet installeur, reportez-vous à sa
Pour plus d'informations sur cet installateur, reportez-vous à sa
<a href="http://dokuwiki.org/installer">page de
documentation</a>.</p>
<p>DokuWiki utilise des fichiers textes ordinaires pour stocker les pages du
wiki et les autres informations associées à ces pages
(tel que images, index de recherche, anciennes révisions, etc.). Pour fonctionner correctement, DokuWiki <strong>doit</strong> avoir accès en écriture aux différents répertoires qui contiennent ces fichiers. L'installeur n'est pas capable de modifier les permissions sur les répertoires. Ceci doit être effectué directement sur la ligne de commande de votre shell, ou, si vous êtes hébergé, <em>via</em> FTP ou votre panneau de contrôle (tel que cPanel).</p>
(par exemple, les images, les index de recherche, les anciennes révisions, ...). Pour fonctionner correctement, DokuWiki <strong>doit</strong> avoir accès en écriture aux différents répertoires qui contiennent ces fichiers. Cet installateur n'est pas capable de modifier les autorisations sur les répertoires. Cette opération doit-être effectué directement depuis votre ligne de commande shell, ou, si vous êtes hébergé, <em>via</em> FTP ou votre panneau de contrôle (par exemple cPanel, Plesk, ...).</p>
<p>Cet installeur va paramétrer votre configuration de DokuWiki pour des <abbr title="Access Control List - Liste de contrôle d'accès">ACL</abbr>, qui permettront l'accès à un identifiant administrateur et l'accès au menu d'administration de DokuWiki pour l'ajout de modules externes (greffons), la gestion d'utilisateurs, la gestion de l'accès aux pages du wiki et les modifications des paramètres de configuration. Il n'est pas nécessaire au fonctionnement de DokuWiki, néanmoins il facilite l'administration de DokuWiki.</p>
<p>Cet installateur va paramétrer votre configuration de DokuWiki pour des contrôle d'accès (ACL), qui permettront l'accès à un identifiant administrateur et l'accès au menu d'administration de DokuWiki pour l'ajout d'extensions, la gestion d'utilisateurs, la gestion de l'accès aux pages du wiki et les modifications des paramètres de configuration. Les contrôle d'accès ne sont pas nécessaires au fonctionnement de DokuWiki, néanmoins elles facilitent l'administration de DokuWiki.</p>
<p>Les utilisateurs expérimentés ou ceux nécessitant des paramétrages particuliers devraient se reporter aux liens suivants pour les détails concernant les <a href="http://dokuwiki.org/install">instructions d'installation</a> et les <a href="http://dokuwiki.org/config">paramètres de configuration</a>.</p>
<p>Les utilisateurs expérimentés ou les utilisateurs possédants des besoins de configurations spécifiques devraient se reporter aux liens suivants pour les détails concernant les <a href="http://dokuwiki.org/install">instructions d'installation</a> et les <a href="http://dokuwiki.org/config">paramètres de configuration</a>.</p>

View File

@ -25,6 +25,7 @@
* @author skimpax@gmail.com
* @author Yannick Aure <yannick.aure@gmail.com>
* @author Olivier DUVAL <zorky00@gmail.com>
* @author Anael Mobilia <contrib@anael.eu>
*/
$lang['encoding'] = 'utf-8';
$lang['direction'] = 'ltr';
@ -73,17 +74,17 @@ $lang['user'] = 'Utilisateur';
$lang['pass'] = 'Mot de passe';
$lang['newpass'] = 'Nouveau mot de passe';
$lang['oldpass'] = 'Mot de passe actuel';
$lang['passchk'] = 'Répéter nouveau mot de passe';
$lang['passchk'] = 'Répétez le mot de passe';
$lang['remember'] = 'Mémoriser';
$lang['fullname'] = 'Nom';
$lang['email'] = 'Adresse de courriel';
$lang['profile'] = 'Profil utilisateur';
$lang['badlogin'] = 'L\'utilisateur ou le mot de passe est incorrect.';
$lang['minoredit'] = 'Modification mineure';
$lang['draftdate'] = 'Brouillon auto-enregistré le';
$lang['draftdate'] = 'Brouillon enregistré de manière automatique le';
$lang['nosecedit'] = 'La page a changé entre temps, les informations de la section sont obsolètes ; la page complète a été chargée à la place.';
$lang['regmissing'] = 'Désolé, vous devez remplir tous les champs.';
$lang['reguexists'] = 'Désolé, ce nom d\'utilisateur est déjà pris.';
$lang['reguexists'] = 'Désolé, ce nom d\'utilisateur est déjà utilisé.';
$lang['regsuccess'] = 'L\'utilisateur a été créé. Le mot de passe a été expédié par courriel.';
$lang['regsuccess2'] = 'L\'utilisateur a été créé.';
$lang['regmailfail'] = 'Il semble y avoir un problème à l\'envoi du courriel. Contactez l\'administrateur.';
@ -92,94 +93,94 @@ $lang['regbadpass'] = 'Les deux mots de passe fournis sont différent
$lang['regpwmail'] = 'Votre mot de passe DokuWiki';
$lang['reghere'] = 'Vous n\'avez pas encore de compte ? Enregistrez-vous ici ';
$lang['profna'] = 'Ce wiki ne permet pas de modifier les profils';
$lang['profnochange'] = 'Pas de changement, rien à faire.';
$lang['profnochange'] = 'Pas de modification, rien à faire.';
$lang['profnoempty'] = 'Un nom ou une adresse de courriel vide n\'est pas permis.';
$lang['profchanged'] = 'Mise à jour du profil réussie.';
$lang['pwdforget'] = 'Mot de passe oublié ? Faites-vous envoyer votre mot de passe ';
$lang['pwdforget'] = 'Mot de passe oublié ? Obtenez-en un nouveau';
$lang['resendna'] = 'Ce wiki ne permet pas le renvoi de mot de passe.';
$lang['resendpwd'] = 'Définir un nouveau mot de passe pour';
$lang['resendpwdmissing'] = 'Désolé, vous devez remplir tous les champs.';
$lang['resendpwdnouser'] = 'Désolé, cet utilisateur est introuvable dans notre base.';
$lang['resendpwdbadauth'] = 'Désolé, ce code d\'authentification est invalide. Assurez-vous d\'avoir utilisé le lien de confirmation.';
$lang['resendpwdconfirm'] = 'Un lien de confirmation vous a été envoyé par courriel.';
$lang['resendpwdnouser'] = 'Désolé, cet utilisateur n\'existe pas dans notre base de données.';
$lang['resendpwdbadauth'] = 'Désolé, ce code d\'authentification est invalide. Assurez-vous d\'avoir utilisé le lien de confirmation intégral.';
$lang['resendpwdconfirm'] = 'Un lien de confirmation vous a été expédié par courriel.';
$lang['resendpwdsuccess'] = 'Votre nouveau mot de passe vous a été expédié par courriel.';
$lang['license'] = 'Sauf mention contraire, le contenu de ce wiki est placé sous la licence suivante :';
$lang['license'] = 'Sauf mention contraire, le contenu de ce wiki est placé sous les termes de la licence suivante :';
$lang['licenseok'] = 'Note : En modifiant cette page, vous acceptez que le contenu soit placé sous les termes de la licence suivante :';
$lang['searchmedia'] = 'Chercher le nom de fichier :';
$lang['searchmedia_in'] = 'Chercher dans %s';
$lang['txt_upload'] = 'Sélectionnez un fichier à envoyer ';
$lang['txt_filename'] = 'Donnez un « wikiname » (optionnel) ';
$lang['txt_overwrt'] = 'Écraser le fichier cible';
$lang['maxuploadsize'] = 'Téléverser max. %s par fichier';
$lang['txt_filename'] = 'Envoyer en tant que (optionnel) ';
$lang['txt_overwrt'] = 'Écraser le fichier cible (s\'il existe)';
$lang['maxuploadsize'] = 'Taille d\'envoi maximale : %s par fichier';
$lang['lockedby'] = 'Actuellement bloqué par';
$lang['lockexpire'] = 'Le blocage expire à';
$lang['js']['willexpire'] = 'Votre verrouillage pour la modification de cette page expire dans une minute.\nPour éviter les conflits, utilisez le bouton « Aperçu » pour réinitialiser le minuteur.';
$lang['js']['willexpire'] = 'Votre blocage pour la modification de cette page expire dans une minute.\nPour éviter les conflits, utilisez le bouton « Aperçu » pour réinitialiser le minuteur.';
$lang['js']['notsavedyet'] = 'Les modifications non enregistrées seront perdues. Voulez-vous vraiment continuer ?';
$lang['js']['searchmedia'] = 'Chercher des fichiers';
$lang['js']['keepopen'] = 'Gardez cette fenêtre toujours ouverte';
$lang['js']['hidedetails'] = 'Masquer détails';
$lang['js']['keepopen'] = 'Toujours conserver cette fenêtre ouverte';
$lang['js']['hidedetails'] = 'Masquer les détails';
$lang['js']['mediatitle'] = 'Paramètres de lien';
$lang['js']['mediadisplay'] = 'Type de lien';
$lang['js']['mediaalign'] = 'Alignement';
$lang['js']['mediasize'] = 'Taille d\'image';
$lang['js']['mediasize'] = 'Taille de l\'image';
$lang['js']['mediatarget'] = 'Cible du lien';
$lang['js']['mediaclose'] = 'Fermer';
$lang['js']['mediainsert'] = 'Insérer';
$lang['js']['mediadisplayimg'] = 'Afficher l\'image.';
$lang['js']['mediadisplaylnk'] = 'N\'afficher que le lien.';
$lang['js']['mediasmall'] = 'Petite taille';
$lang['js']['mediamedium'] = 'taille moyenne';
$lang['js']['mediamedium'] = 'Taille moyenne';
$lang['js']['medialarge'] = 'Grande taille';
$lang['js']['mediaoriginal'] = 'taille d\'origine';
$lang['js']['mediaoriginal'] = 'Taille originelle';
$lang['js']['medialnk'] = 'Lien vers la page de détail';
$lang['js']['mediadirect'] = 'Lien direct vers l\'original';
$lang['js']['medianolnk'] = 'Aucun lien';
$lang['js']['medianolink'] = 'Ne pas lier l\'image';
$lang['js']['medialeft'] = 'Aligner l\'image sur la gauche.';
$lang['js']['mediaright'] = 'Aligner l\'image sur la droite.';
$lang['js']['mediacenter'] = 'Centrer l\'image';
$lang['js']['medialeft'] = 'Aligner l\'image à gauche.';
$lang['js']['mediaright'] = 'Aligner l\'image à droite.';
$lang['js']['mediacenter'] = 'Centrer l\'image.';
$lang['js']['medianoalign'] = 'Ne pas aligner.';
$lang['js']['nosmblinks'] = 'Les liens vers les partages Windows ne fonctionnent qu\'avec Microsoft Internet Explorer.\nVous pouvez toujours copier puis coller le lien.';
$lang['js']['linkwiz'] = 'Assistant Lien';
$lang['js']['linkto'] = 'Lien vers :';
$lang['js']['del_confirm'] = 'Effacer cette entrée ?';
$lang['js']['restore_confirm'] = 'Voulez vous vraiment restaurer cette version ?';
$lang['js']['media_diff'] = 'Voir les différences:';
$lang['js']['del_confirm'] = 'Voulez-vous vraiment effacer ce(s) élément(s) ?';
$lang['js']['restore_confirm'] = 'Voulez-vous vraiment restaurer cette version ?';
$lang['js']['media_diff'] = 'Voir les différences :';
$lang['js']['media_diff_both'] = 'Côte à côte';
$lang['js']['media_diff_opacity'] = 'Calque';
$lang['js']['media_diff_portions'] = 'Curseur';
$lang['js']['media_select'] = 'Sélection de fichiers…';
$lang['js']['media_upload_btn'] = 'Télécharger';
$lang['js']['media_upload_btn'] = 'Envoyer';
$lang['js']['media_done_btn'] = 'Terminé';
$lang['js']['media_drop'] = 'Déposez des fichiers ici pour les télécharger';
$lang['js']['media_drop'] = 'Déposez des fichiers ici pour les envoyer';
$lang['js']['media_cancel'] = 'supprimer';
$lang['js']['media_overwrt'] = 'Écraser les fichiers existants';
$lang['rssfailed'] = 'Une erreur s\'est produite en récupérant ce flux : ';
$lang['nothingfound'] = 'Pas de réponse.';
$lang['mediaselect'] = 'Sélection de fichier';
$lang['mediaselect'] = 'Sélection de fichiers';
$lang['fileupload'] = 'Envoi de fichier';
$lang['uploadsucc'] = 'Téléversement réussi';
$lang['uploadfail'] = 'Le téléversement n\'a pas réussi. Les permissions sont-elles correctes ?';
$lang['uploadwrong'] = 'Téléversement refusé. Cette extension de fichier est interdite !';
$lang['uploadexist'] = 'Le fichier existe. Téléversement avorté.';
$lang['uploadbadcontent'] = 'Le contenu envoyé ne correspond pas à l\'extension du fichier %s.';
$lang['uploadspam'] = 'Le téléversement a été bloqué par la liste noire antispam.';
$lang['uploadxss'] = 'Le téléversement a été bloqué car son contenu est peut-être malveillant.';
$lang['uploadsize'] = 'Le fichier téléversé était trop gros. (max. %s)';
$lang['uploadsucc'] = 'Envoi réussi';
$lang['uploadfail'] = 'L\'envoi a échoué. Les autorisations sont-elles correctes ?';
$lang['uploadwrong'] = 'Envoi refusé. Cette extension de fichier est interdite !';
$lang['uploadexist'] = 'Le fichier existe déjà. L\'envoi a été annulé.';
$lang['uploadbadcontent'] = 'Le contenu envoyé ne correspond pas à l\'extension du fichier (%s).';
$lang['uploadspam'] = 'L\'envoi a été bloqué par la liste noire de l\'anti-spam.';
$lang['uploadxss'] = 'L\'envoi a été bloqué car son contenu est peut-être malveillant.';
$lang['uploadsize'] = 'Le fichier envoyé était trop gros. (max. : %s)';
$lang['deletesucc'] = 'Le fichier « %s » a été effacé.';
$lang['deletefail'] = 'Le fichier « %s » n\'a pu être effacé, vérifier les permissions.';
$lang['mediainuse'] = 'Le fichier « %s » n\'a pas été effacé, il est en cours d\'utilisation.';
$lang['deletefail'] = 'Le fichier « %s » n\'a pas pu être effacé. Vérifiez les autorisations.';
$lang['mediainuse'] = 'Le fichier « %s » n\'a pas été effacé : il est en toujours utilisé.';
$lang['namespaces'] = 'Catégories';
$lang['mediafiles'] = 'Fichiers disponibles dans';
$lang['accessdenied'] = 'Vous n\'êtes pas autorisé à voir cette page.';
$lang['mediausage'] = 'Utilisez la syntaxe suivante pour faire référence à ce fichier :';
$lang['mediaview'] = 'Afficher le fichier original';
$lang['mediaroot'] = 'racine';
$lang['mediaupload'] = 'Téléverser un fichier dans la catégorie actuelle. Pour créer des sous-catégories, préfixez le nom du fichier par le nom de la sous-catégorie séparée par un double-point.';
$lang['mediaextchange'] = 'Extension du fichier changée de .%s en .%s !';
$lang['mediaupload'] = 'Envoyez un fichier dans la catégorie actuelle. Pour créer des sous-catégories, préfixez en le nom du fichier séparées par un double-point, après avoir choisis le(s) fichier(s). Le(s) fichier(s) peuvent également être envoyé(s) par glisser-déposer (drag & drop)';
$lang['mediaextchange'] = 'Extension du fichier modifiée de .%s en .%s !';
$lang['reference'] = 'Références pour';
$lang['ref_inuse'] = 'Le fichier ne peut être effacé car il est utilisé par les pages suivantes :';
$lang['ref_hidden'] = 'Des références existent dans des pages que vous n\'avez pas la permission de lire';
$lang['ref_inuse'] = 'Le fichier ne peut être effacé car il est toujours utilisé par les pages suivantes :';
$lang['ref_hidden'] = 'Des références sont présentes dans des pages que vous ne pouvez pas voir (autorisations insuffisantes)';
$lang['hits'] = 'Occurrences trouvées';
$lang['quickhits'] = 'Pages trouvées ';
$lang['toc'] = 'Table des matières';
@ -187,7 +188,7 @@ $lang['current'] = 'Version actuelle';
$lang['yours'] = 'Votre version';
$lang['diff'] = 'Différences avec la version actuelle';
$lang['diff2'] = 'Différences entre les versions sélectionnées';
$lang['difflink'] = 'Lien vers cette vue';
$lang['difflink'] = 'Lien vers cette vue comparative';
$lang['diff_type'] = 'Voir les différences :';
$lang['diff_inline'] = 'Sur une seule ligne';
$lang['diff_side'] = 'Côte à côte';
@ -196,18 +197,19 @@ $lang['breadcrumb'] = 'Piste';
$lang['youarehere'] = 'Vous êtes ici';
$lang['lastmod'] = 'Dernière modification';
$lang['by'] = 'par';
$lang['deleted'] = 'effacée';
$lang['deleted'] = 'supprimée';
$lang['created'] = 'créée';
$lang['restored'] = 'ancienne révision restaurée';
$lang['restored'] = 'ancienne révision (%s) restaurée';
$lang['external_edit'] = 'modification externe';
$lang['summary'] = 'Résumé';
$lang['noflash'] = 'Le greffon <a href="http://www.adobe.com/products/flashplayer/">Adobe Flash</a> est nécessaire pour afficher ce contenu.';
$lang['noflash'] = 'L\'<a href="http://www.adobe.com/products/flashplayer/">extension Adobe Flash</a> est nécessaire pour afficher ce contenu.';
$lang['download'] = 'Télécharger un extrait';
$lang['tools'] = 'Outils';
$lang['user_tools'] = 'Outils d\'utilisateurs';
$lang['site_tools'] = 'Outils du Site';
$lang['page_tools'] = 'Outils de la Page';
$lang['user_tools'] = 'Outils pour utilisateurs';
$lang['site_tools'] = 'Outils du site';
$lang['page_tools'] = 'Outils de la page';
$lang['skip_to_content'] = 'Aller au contenu';
$lang['sidebar'] = 'Panneau latéral';
$lang['mail_newpage'] = 'page ajoutée :';
$lang['mail_changed'] = 'page modifiée :';
$lang['mail_subscribe_list'] = 'pages modifiées dans la catégorie :';
@ -215,13 +217,13 @@ $lang['mail_new_user'] = 'nouvel utilisateur :';
$lang['mail_upload'] = 'fichier envoyé :';
$lang['changes_type'] = 'Voir les changements';
$lang['pages_changes'] = 'Pages';
$lang['media_changes'] = 'Fichier multimédias';
$lang['media_changes'] = 'Fichiers multimédias';
$lang['both_changes'] = 'Pages et fichiers multimédias';
$lang['qb_bold'] = 'Emphase forte (gras)';
$lang['qb_italic'] = 'Emphase (italique)';
$lang['qb_underl'] = 'Souligné';
$lang['qb_bold'] = 'Gras';
$lang['qb_italic'] = 'Italique';
$lang['qb_underl'] = 'Soulignage';
$lang['qb_code'] = 'Code « machine à écrire »';
$lang['qb_strike'] = 'Texte barré';
$lang['qb_strike'] = 'Barré';
$lang['qb_h1'] = 'Titre de niveau 1';
$lang['qb_h2'] = 'Titre de niveau 2';
$lang['qb_h3'] = 'Titre de niveau 3';
@ -237,14 +239,14 @@ $lang['qb_extlink'] = 'Lien externe';
$lang['qb_hr'] = 'Ligne horizontale';
$lang['qb_ol'] = 'Liste numérotée';
$lang['qb_ul'] = 'Liste à puce';
$lang['qb_media'] = 'Ajouter des images ou d\'autres fichiers';
$lang['qb_media'] = 'Ajouter des images ou autres fichiers';
$lang['qb_sig'] = 'Insérer une signature';
$lang['qb_smileys'] = 'Émoticones';
$lang['qb_chars'] = 'Caractères spéciaux';
$lang['upperns'] = 'Aller à la catégorie parente';
$lang['admin_register'] = 'Ajouter un nouvel utilisateur';
$lang['metaedit'] = 'Modifier les métadonnées';
$lang['metasaveerr'] = 'Erreur lors de l\'écriture des métadonnées';
$lang['metasaveerr'] = 'Erreur lors de l\'enregistrement des métadonnées';
$lang['metasaveok'] = 'Métadonnées enregistrées';
$lang['img_backto'] = 'Retour à';
$lang['img_title'] = 'Titre';
@ -252,7 +254,7 @@ $lang['img_caption'] = 'Légende';
$lang['img_date'] = 'Date';
$lang['img_fname'] = 'Nom de fichier';
$lang['img_fsize'] = 'Taille';
$lang['img_artist'] = 'Auteur';
$lang['img_artist'] = 'Photographe';
$lang['img_copyr'] = 'Copyright';
$lang['img_format'] = 'Format';
$lang['img_camera'] = 'Appareil photo';
@ -261,47 +263,47 @@ $lang['img_width'] = 'Largeur';
$lang['img_height'] = 'Hauteur';
$lang['img_manager'] = 'Voir dans le gestionnaire de médias';
$lang['subscr_subscribe_success'] = '%s a été ajouté à la liste de souscription de %s';
$lang['subscr_subscribe_error'] = 'Erreur en ajoutant %s à la liste de souscription de %s';
$lang['subscr_subscribe_error'] = 'Erreur à l\'ajout de %s à la liste de souscription de %s';
$lang['subscr_subscribe_noaddress'] = 'Il n\'y a pas d\'adresse associée à votre identifiant, vous ne pouvez pas être ajouté à la liste de souscription';
$lang['subscr_unsubscribe_success'] = '%s a été retiré de la liste de souscription de %s';
$lang['subscr_unsubscribe_error'] = 'Erreur en retirant %s de la liste de souscription de %s';
$lang['subscr_unsubscribe_success'] = '%s a été supprimé de la liste de souscription de %s';
$lang['subscr_unsubscribe_error'] = 'Erreur au retrait de %s de la liste de souscription de %s';
$lang['subscr_already_subscribed'] = '%s est déjà souscrit à %s';
$lang['subscr_not_subscribed'] = '%s n\'est pas souscrit à %s';
$lang['subscr_m_not_subscribed'] = 'Vous n\'avez pas souscrit pour l\'instant à la page actuelle ou la catégorie';
$lang['subscr_m_not_subscribed'] = 'Vous n\'avez pas souscrit pour l\'instant à la page actuelle ou à la catégorie';
$lang['subscr_m_new_header'] = 'Ajouter une souscription';
$lang['subscr_m_current_header'] = 'Souscriptions actives';
$lang['subscr_m_unsubscribe'] = 'Annuler la souscription';
$lang['subscr_m_subscribe'] = 'Souscrire';
$lang['subscr_m_receive'] = 'Recevoir';
$lang['subscr_style_every'] = 'Envoyer un courriel à chaque modification';
$lang['subscr_style_every'] = 'Recevoir un courriel à chaque modification';
$lang['subscr_style_digest'] = 'Courriel, tous les %.2f jours, résumant les modifications de chaque page';
$lang['subscr_style_list'] = 'Liste des pages modifiées depuis le dernier courriel (tous les %.2f jours)';
$lang['authmodfailed'] = 'Mauvais paramétrage de l\'authentification. Merci d\'informer l\'administrateur du Wiki.';
$lang['authtempfail'] = 'L\'authentification est temporairement indisponible. Si cela perdure, merci d\'informer l\'administrateur du Wiki.';
$lang['authmodfailed'] = 'Mauvais paramétrage de l\'authentification. Merci d\'en informer l\'administrateur du wiki.';
$lang['authtempfail'] = 'L\'authentification est temporairement indisponible. Si cela perdure, merci d\'en informer l\'administrateur du wiki.';
$lang['authpwdexpire'] = 'Votre mot de passe expirera dans %d jours, vous devriez le changer bientôt.';
$lang['i_chooselang'] = 'Choisissez votre langue';
$lang['i_installer'] = 'Installeur DokuWiki';
$lang['i_installer'] = 'Installateur DokuWiki';
$lang['i_wikiname'] = 'Nom du wiki';
$lang['i_enableacl'] = 'Activer les ACL (recommandé)';
$lang['i_enableacl'] = 'Activer le contrôle d\'accès (recommandé)';
$lang['i_superuser'] = 'Super-utilisateur';
$lang['i_problems'] = 'L\'installeur a détecté les problèmes indiqués ci-dessous. Vous ne pouvez poursuivre tant qu\'ils n\'auront pas été corrigés.';
$lang['i_modified'] = 'Pour des raisons de sécurité ce script ne fonctionne qu\'avec une installation neuve et non modifiée de DokuWiki. Vous devriez ré-extraire les fichiers depuis le paquet téléchargé ou consulter les <a href="http://dokuwiki.org/install">instructions d\'installation de DokuWiki</a>';
$lang['i_funcna'] = 'La fonction PHP <code>%s</code> n\'est pas disponible. Peut-être que votre hébergeur l\'a désactivée ?';
$lang['i_problems'] = 'L\'installateur a détecté les problèmes indiqués ci-dessous. Vous ne pouvez pas poursuivre l\'installation tant qu\'ils n\'auront pas été corrigés.';
$lang['i_modified'] = 'Pour des raisons de sécurité, ce script ne fonctionne qu\'avec une installation neuve et non modifiée de DokuWiki. Vous devriez ré-extraire les fichiers depuis le paquet téléchargé ou consulter les <a href="http://dokuwiki.org/install">instructions d\'installation de DokuWiki</a>';
$lang['i_funcna'] = 'La fonction PHP <code>%s</code> n\'est pas disponible. Peut-être que votre hébergeur web l\'a désactivée ?';
$lang['i_phpver'] = 'Votre version de PHP (%s) est antérieure à la version requise (%s). Vous devez mettre à jour votre installation de PHP.';
$lang['i_permfail'] = '<code>%s</code> n\'est pas accessible en écriture pour DokuWiki. Vous devez corriger les permissions de ce répertoire !';
$lang['i_permfail'] = '<code>%s</code> n\'est pas accessible en écriture pour DokuWiki. Vous devez corriger les autorisations de ce répertoire !';
$lang['i_confexists'] = '<code>%s</code> existe déjà';
$lang['i_writeerr'] = 'Impossible de créer <code>%s</code>. Vous devez vérifier les permissions des répertoires/fichiers et créer le fichier manuellement.';
$lang['i_writeerr'] = 'Impossible de créer <code>%s</code>. Vous devez vérifier les autorisations des répertoires/fichiers et créer le fichier manuellement.';
$lang['i_badhash'] = 'dokuwiki.php non reconnu ou modifié (hash=<code>%s</code>)';
$lang['i_badval'] = '<code>%s</code> - valeur interdite ou vide';
$lang['i_success'] = 'L\'installation s\'est terminée avec succès. Vous pouvez maintenant supprimer le fichier « install.php ». Continuer avec <a href="doku.php">votre nouveau DokuWiki</a>.';
$lang['i_success'] = 'L\'installation s\'est terminée avec succès. Vous pouvez maintenant supprimer le fichier « install.php ». Continuer avec <a href="doku.php?id=wiki:welcome">votre nouveau DokuWiki</a>.';
$lang['i_failure'] = 'Des erreurs sont survenues lors de l\'écriture des fichiers de configuration. Il vous faudra les corriger manuellement avant de pouvoir utiliser <a href="doku.php">votre nouveau DokuWiki</a>.';
$lang['i_policy'] = 'Politique d\'ACL initiale';
$lang['i_policy'] = 'Politique de contrôle d\'accès initiale';
$lang['i_pol0'] = 'Wiki ouvert (lecture, écriture, envoi de fichiers pour tout le monde)';
$lang['i_pol1'] = 'Wiki public (lecture pour tout le monde, écriture et envoi de fichiers pour les utilisateurs enregistrés)';
$lang['i_pol2'] = 'Wiki fermé (lecture, écriture, envoi de fichiers pour les utilisateurs enregistrés uniquement)';
$lang['i_retry'] = 'Réessayer';
$lang['i_license'] = 'Veuillez choisir la licence sous laquelle placer votre contenu :';
$lang['recent_global'] = 'Vous êtes actuellement en train de regarder les modifications au sein de la catégorie <strong>%s</strong>. Vous pouvez aussi <a href="%s">voir les récentes modifications sur tout le wiki</a>.';
$lang['i_license'] = 'Veuillez choisir la licence sous laquelle vous souhaitez placer votre contenu :';
$lang['recent_global'] = 'Vous êtes actuellement en train de regarder les modifications au sein de la catégorie <strong>%s</strong>. Vous pouvez également <a href="%s">afficher les derniers changements sur l\'ensemble du wiki</a>.';
$lang['years'] = 'il y a %d ans';
$lang['months'] = 'il y a %d mois';
$lang['weeks'] = 'il y a %d semaines';
@ -309,27 +311,27 @@ $lang['days'] = 'il y a %d jours';
$lang['hours'] = 'il y a %d heures';
$lang['minutes'] = 'il y a %d minutes';
$lang['seconds'] = 'il y a %d secondes';
$lang['wordblock'] = 'Vos modifications n\'ont pas été sauvegardées parce qu\'elles contiennent des textes non autorisé (spam).';
$lang['media_uploadtab'] = 'Télécharger';
$lang['wordblock'] = 'Vos modifications n\'ont pas été enregistrées car elles contiennent du texte non autorisé (spam).';
$lang['media_uploadtab'] = 'Envoyer';
$lang['media_searchtab'] = 'Rechercher';
$lang['media_file'] = 'Fichier';
$lang['media_viewtab'] = 'Voir';
$lang['media_edittab'] = 'Éditer';
$lang['media_historytab'] = 'Historique';
$lang['media_list_thumbs'] = 'Aperçus';
$lang['media_list_thumbs'] = 'Miniatures';
$lang['media_list_rows'] = 'Lignes';
$lang['media_sort_name'] = 'Tri par nom';
$lang['media_sort_date'] = 'Tri par date';
$lang['media_namespaces'] = 'Choisissez un espace de nom';
$lang['media_files'] = 'Fichiers de %s';
$lang['media_upload'] = 'Télécharger dans %s.';
$lang['media_search'] = 'Chercher dans %s.';
$lang['media_sort_name'] = 'Nom';
$lang['media_sort_date'] = 'Date';
$lang['media_namespaces'] = 'Choisissez une catégorie';
$lang['media_files'] = 'Fichiers dans %s';
$lang['media_upload'] = 'Envoyer vers %s.';
$lang['media_search'] = 'Rechercher dans %s.';
$lang['media_view'] = '%s';
$lang['media_viewold'] = '%s dans %s';
$lang['media_edit'] = 'Éditer %s';
$lang['media_history'] = 'Historique de %s';
$lang['media_meta_edited'] = 'métadonnées éditées';
$lang['media_perm_read'] = 'Désolé, vous n\'avez pas les droits pour lire les fichiers.';
$lang['media_perm_upload'] = 'Désolé, vous n\'avez pas les droits pour télécharger des fichiers.';
$lang['media_update'] = 'Télécharger une nouvelle version';
$lang['media_perm_read'] = 'Désolé, vous n\'avez pas l\'autorisation de voir les fichiers.';
$lang['media_perm_upload'] = 'Désolé, vous n\'avez pas l\'autorisation d\'envoyer des fichiers.';
$lang['media_update'] = 'Envoyer une nouvelle version';
$lang['media_restore'] = 'Restaurer cette version';

View File

@ -1,3 +1,3 @@
====== Page bloquée ======
Cette page est actuellement bloquée pour modification par un autre utilisateur. Vous devez attendre que l'autre utilisateur ait terminé ou que le blocage de la page expire.
Cette page est actuellement bloquée pour modification par un autre utilisateur. Vous devez attendre que cet utilisateur ait terminé ou que le blocage de la page expire.

View File

@ -14,5 +14,5 @@ Utilisateur : @USER@
--
Ce courriel a été généré par DokuWiki
Ce courriel a été généré par DokuWiki depuis
@DOKUWIKIURL@

Some files were not shown because too many files have changed in this diff Show More