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:
commit
3da7921f08
|
@ -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
2
README
|
@ -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
|
||||
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,7 @@
|
|||
|
||||
class auth_nameencode_test extends DokuWikiTest {
|
||||
|
||||
function teardown() {
|
||||
function tearDown() {
|
||||
global $cache_authname;
|
||||
$cache_authname = array();
|
||||
}
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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');
|
||||
}
|
||||
|
||||
}
|
|
@ -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/';
|
||||
|
|
|
@ -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();
|
||||
}
|
||||
}
|
|
@ -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');
|
||||
}
|
||||
}
|
|
@ -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');
|
||||
}
|
||||
}
|
|
@ -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 :
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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());
|
||||
}
|
||||
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
}
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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 :
|
|
@ -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');
|
||||
}
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
}
|
|
@ -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.
|
@ -0,0 +1 @@
|
|||
testcontent1
|
|
@ -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) {
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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.
|
14
feed.php
14
feed.php
|
@ -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);
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
|
@ -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
|
||||
*
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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));
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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']) {
|
||||
|
|
16745
inc/SimplePie.php
16745
inc/SimplePie.php
File diff suppressed because one or more lines are too long
|
@ -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 {
|
||||
}
|
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -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 :
|
||||
|
|
35
inc/auth.php
35
inc/auth.php
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -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)
|
||||
*/
|
||||
|
||||
|
|
|
@ -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);
|
||||
|
|
|
@ -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] .= ' ';
|
||||
++$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 {
|
||||
|
|
36
inc/html.php
36
inc/html.php
|
@ -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​',$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') {
|
||||
|
|
230
inc/indexer.php
230
inc/indexer.php
|
@ -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);
|
||||
|
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
@ -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'] = 'صفحات غيرت في النطاق:';
|
||||
|
|
|
@ -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>
|
|
@ -15,7 +15,7 @@
|
|||
|
||||
لإلغاء إشعارات الصفحة,لُج الويكي في
|
||||
@DOKUWIKIURL@ ثم زُر
|
||||
@NEWPAGE@
|
||||
@SUBSCRIBE@
|
||||
وألغ الاشتراك من تغييرات الصفحة و/أو النطاق.
|
||||
|
||||
--
|
||||
|
|
|
@ -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)';
|
||||
|
|
|
@ -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 (всеки може да чете, само регистрирани пишат и качват)';
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
Нова версия: @NEWPAGE@
|
||||
|
||||
Ако желаете да прекратите уведомяването за страницата трябва да се впишете на адрес @DOKUWIKIURL@, да посетите
|
||||
@NEWPAGE@
|
||||
@SUBSCRIBE@
|
||||
и да прекратите абонамента за промени по страницата или именното пространство.
|
||||
|
||||
--
|
||||
|
|
|
@ -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)';
|
||||
|
|
|
@ -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ó';
|
||||
|
|
|
@ -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>
|
|
@ -0,0 +1,3 @@
|
|||
===== Establiu una nova contrasenya =====
|
||||
|
||||
Introdueixi una nova contrasenya pel seu compte a aquest wiki.
|
|
@ -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@
|
|
@ -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.
|
|
@ -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@
|
|
@ -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)';
|
||||
|
|
|
@ -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)';
|
||||
|
|
|
@ -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.
|
||||
|
||||
--
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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'] = 'Anfangseinstellung für 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>.';
|
||||
|
|
|
@ -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'.
|
||||
|
||||
--
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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'] = 'Anfangseinstellung für 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';
|
||||
|
|
|
@ -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'.
|
||||
|
||||
--
|
||||
|
|
|
@ -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'] = 'τα μεταδεδομένα επεξεργάστηκαν';
|
||||
|
|
|
@ -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>
|
|
@ -0,0 +1,3 @@
|
|||
====== Εισάγετε νέο κωδικό πρόσβασης ======
|
||||
|
||||
Παρακαλούμε, εισάγετε έναν νέο κωδικό πρόσβασης για τον λογαριασμό σας.
|
|
@ -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';
|
||||
|
|
|
@ -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.
|
||||
|
||||
--
|
||||
|
|
|
@ -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)';
|
||||
|
|
|
@ -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.
|
||||
|
||||
--
|
||||
|
|
|
@ -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)';
|
||||
|
|
|
@ -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)';
|
||||
|
|
|
@ -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)';
|
||||
|
|
|
@ -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'] = 'ویکی عمومی (همه میتوانند بخوانند، کاربران ثبت شده میتوانند بنویسند و فایل ارسال کنند)';
|
||||
|
|
|
@ -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ä)';
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -1 +1 @@
|
|||
===== Modules supplémentaires =====
|
||||
===== Extensions =====
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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.
|
||||
|
||||
|
|
|
@ -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]].
|
||||
|
||||
|
|
|
@ -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]].
|
||||
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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';
|
||||
|
|
|
@ -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.
|
||||
|
|
|
@ -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
Loading…
Reference in New Issue